@ornexus/neocortex 3.9.16 → 3.9.19
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.
- package/install.ps1 +1 -1
- package/install.sh +77 -2
- package/package.json +2 -2
- package/packages/client/dist/index.d.ts +1 -0
- package/packages/client/dist/index.d.ts.map +1 -1
- package/packages/client/dist/index.js +2 -0
- package/packages/client/dist/index.js.map +1 -1
- package/packages/client/dist/tier/index.d.ts +6 -0
- package/packages/client/dist/tier/index.d.ts.map +1 -0
- package/packages/client/dist/tier/index.js +6 -0
- package/packages/client/dist/tier/index.js.map +1 -0
- package/packages/client/dist/tier/tier-aware-client.d.ts +92 -0
- package/packages/client/dist/tier/tier-aware-client.d.ts.map +1 -0
- package/packages/client/dist/tier/tier-aware-client.js +244 -0
- package/packages/client/dist/tier/tier-aware-client.js.map +1 -0
- package/targets-stubs/antigravity/gemini.md +1 -1
- package/targets-stubs/antigravity/skill/SKILL.md +1 -1
- package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex.md +2 -2
- package/targets-stubs/codex/agents.md +1 -1
- package/targets-stubs/cursor/agent.md +2 -2
- package/targets-stubs/gemini-cli/agent.md +2 -2
- package/targets-stubs/vscode/agent.md +2 -2
package/install.ps1
CHANGED
package/install.sh
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# Development Orchestrator
|
|
5
5
|
|
|
6
6
|
# Versao do instalador
|
|
7
|
-
VERSION="3.9.
|
|
7
|
+
VERSION="3.9.19"
|
|
8
8
|
|
|
9
9
|
# Flags
|
|
10
10
|
MIGRATION_DETECTED=false
|
|
@@ -1271,6 +1271,49 @@ show_migration_info() {
|
|
|
1271
1271
|
fi
|
|
1272
1272
|
}
|
|
1273
1273
|
|
|
1274
|
+
# =============================================================================
|
|
1275
|
+
# TIER-BASED PLATFORM GATING (Story 57.4)
|
|
1276
|
+
# =============================================================================
|
|
1277
|
+
|
|
1278
|
+
# Read tier from config.json (defaults to "free" if not found)
|
|
1279
|
+
get_tier_from_config() {
|
|
1280
|
+
local config_file="$HOME/.neocortex/config.json"
|
|
1281
|
+
if [ -f "$config_file" ]; then
|
|
1282
|
+
local tier
|
|
1283
|
+
tier=$(cat "$config_file" 2>/dev/null | grep -o '"tier"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"\([^"]*\)"$/\1/')
|
|
1284
|
+
[ -n "$tier" ] && echo "$tier" || echo "free"
|
|
1285
|
+
else
|
|
1286
|
+
echo "free"
|
|
1287
|
+
fi
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
# Check if a platform is allowed for the current tier
|
|
1291
|
+
# Returns 0 if allowed, 1 if blocked
|
|
1292
|
+
check_platform_tier() {
|
|
1293
|
+
local platform=$1
|
|
1294
|
+
local tier=$2
|
|
1295
|
+
case "$platform" in
|
|
1296
|
+
claude-code) return 0 ;; # Always allowed
|
|
1297
|
+
cursor|gemini-cli|codex)
|
|
1298
|
+
if [ "$tier" = "free" ]; then
|
|
1299
|
+
warn "$platform requer plano Pro. Plataforma disponivel: Claude Code."
|
|
1300
|
+
info "Upgrade: ${CYAN}https://neocortex.dev/pricing${NC}"
|
|
1301
|
+
return 1
|
|
1302
|
+
fi
|
|
1303
|
+
return 0
|
|
1304
|
+
;;
|
|
1305
|
+
vscode|antigravity)
|
|
1306
|
+
if [ "$tier" != "enterprise" ]; then
|
|
1307
|
+
warn "$platform requer plano Enterprise."
|
|
1308
|
+
info "Upgrade: ${CYAN}https://neocortex.dev/pricing${NC}"
|
|
1309
|
+
return 1
|
|
1310
|
+
fi
|
|
1311
|
+
return 0
|
|
1312
|
+
;;
|
|
1313
|
+
esac
|
|
1314
|
+
return 0 # Unknown platforms pass through
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1274
1317
|
# =============================================================================
|
|
1275
1318
|
# MAIN
|
|
1276
1319
|
# =============================================================================
|
|
@@ -1289,8 +1332,14 @@ main() {
|
|
|
1289
1332
|
|
|
1290
1333
|
debug "Targets: $SELECTED_TARGETS"
|
|
1291
1334
|
|
|
1292
|
-
#
|
|
1335
|
+
# Read user tier for platform gating
|
|
1336
|
+
local user_tier
|
|
1337
|
+
user_tier=$(get_tier_from_config)
|
|
1338
|
+
debug "User tier: $user_tier"
|
|
1339
|
+
|
|
1340
|
+
# Validate targets (name check + tier check)
|
|
1293
1341
|
local invalid_targets=""
|
|
1342
|
+
local blocked_targets=""
|
|
1294
1343
|
for target in $(echo "$SELECTED_TARGETS" | tr ',' ' '); do
|
|
1295
1344
|
echo "$VALID_TARGETS" | grep -wq "$target" || invalid_targets="$invalid_targets $target"
|
|
1296
1345
|
done
|
|
@@ -1301,6 +1350,32 @@ main() {
|
|
|
1301
1350
|
exit 1
|
|
1302
1351
|
fi
|
|
1303
1352
|
|
|
1353
|
+
# Filter out tier-blocked platforms
|
|
1354
|
+
local allowed_targets=""
|
|
1355
|
+
for target in $(echo "$SELECTED_TARGETS" | tr ',' ' '); do
|
|
1356
|
+
if check_platform_tier "$target" "$user_tier"; then
|
|
1357
|
+
if [ -z "$allowed_targets" ]; then
|
|
1358
|
+
allowed_targets="$target"
|
|
1359
|
+
else
|
|
1360
|
+
allowed_targets="$allowed_targets,$target"
|
|
1361
|
+
fi
|
|
1362
|
+
else
|
|
1363
|
+
blocked_targets="$blocked_targets $target"
|
|
1364
|
+
fi
|
|
1365
|
+
done
|
|
1366
|
+
|
|
1367
|
+
if [ -n "$blocked_targets" ]; then
|
|
1368
|
+
info "Plataforma(s) bloqueada(s) por tier:$blocked_targets"
|
|
1369
|
+
fi
|
|
1370
|
+
|
|
1371
|
+
# Use only allowed targets
|
|
1372
|
+
if [ -n "$allowed_targets" ]; then
|
|
1373
|
+
SELECTED_TARGETS="$allowed_targets"
|
|
1374
|
+
else
|
|
1375
|
+
SELECTED_TARGETS="claude-code"
|
|
1376
|
+
info "Usando plataforma padrao: claude-code"
|
|
1377
|
+
fi
|
|
1378
|
+
|
|
1304
1379
|
# Count targets for step total
|
|
1305
1380
|
local target_count=$(echo "$SELECTED_TARGETS" | tr ',' ' ' | wc -w | tr -d ' ')
|
|
1306
1381
|
if echo "$SELECTED_TARGETS" | grep -q "claude-code"; then
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ornexus/neocortex",
|
|
3
|
-
"version": "3.9.
|
|
4
|
-
"description": "Neocortex v3.9.
|
|
3
|
+
"version": "3.9.19",
|
|
4
|
+
"description": "Neocortex v3.9.19 - Orquestrador de Desenvolvimento de Epics & Stories para Claude Code",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|
|
7
7
|
"claude-code",
|
|
@@ -52,4 +52,5 @@ export { ClientCircuitBreaker, type CircuitState, type CircuitBreakerConfig, typ
|
|
|
52
52
|
export { OfflineTelemetryQueue, type TelemetryEvent, type QueueConfig, type QueueStats, type FlushResult, } from './telemetry/index.js';
|
|
53
53
|
export { getCacheStatus, formatCacheStatus, type CacheStatusInfo, type CacheStatusOptions, } from './commands/cache-status.js';
|
|
54
54
|
export { invoke, invokeCliHandler, collectStateSnapshot, type InvokeOptions, type InvokeResult, } from './commands/invoke.js';
|
|
55
|
+
export { TierAwareClient, type TierAwareClientOptions, type PreFlightResult, type QuotaSnapshot, } from './tier/index.js';
|
|
55
56
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,YAAY,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,YAAY,EACZ,eAAe,EACf,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAI3D,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAInE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAIrF,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAI9E,OAAO,EACL,cAAc,EACd,cAAc,EACd,KAAK,uBAAuB,GAC7B,MAAM,gCAAgC,CAAC;AAIxC,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,gCAAgC,CAAC;AAIxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAI3D,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAI9E,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EACL,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,kBAAkB,EAClB,KAAK,aAAa,EAClB,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EACL,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,YAAY,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,YAAY,EACZ,eAAe,EACf,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAI3D,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAInE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAIrF,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAI9E,OAAO,EACL,cAAc,EACd,cAAc,EACd,KAAK,uBAAuB,GAC7B,MAAM,gCAAgC,CAAC;AAIxC,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,gCAAgC,CAAC;AAIxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAI3D,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAI9E,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EACL,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,kBAAkB,EAClB,KAAK,aAAa,EAClB,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EACL,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC"}
|
|
@@ -34,4 +34,6 @@ export { OfflineTelemetryQueue, } from './telemetry/index.js';
|
|
|
34
34
|
export { getCacheStatus, formatCacheStatus, } from './commands/cache-status.js';
|
|
35
35
|
// ── Invoke Command (Story 45.2) ────────────────────────────────────────
|
|
36
36
|
export { invoke, invokeCliHandler, collectStateSnapshot, } from './commands/invoke.js';
|
|
37
|
+
// ── Tier Awareness (Epic 60) ─────────────────────────────────────────
|
|
38
|
+
export { TierAwareClient, } from './tier/index.js';
|
|
37
39
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA8CH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAM3D,2EAA2E;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErF,0EAA0E;AAE1E,OAAO,EAAE,cAAc,EAA8B,MAAM,kBAAkB,CAAC;AAE9E,2EAA2E;AAE3E,OAAO,EACL,cAAc,EACd,cAAc,GAEf,MAAM,gCAAgC,CAAC;AAExC,2EAA2E;AAE3E,OAAO,EACL,cAAc,GAEf,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,gCAAgC,CAAC;AAExC,4EAA4E;AAE5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,4EAA4E;AAE5E,OAAO,EAAE,aAAa,EAA6B,MAAM,oBAAoB,CAAC;AAgB9E,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,4EAA4E;AAE5E,OAAO,EACL,oBAAoB,EAIpB,kBAAkB,EAClB,gBAAgB,EAGhB,kBAAkB,EAElB,gBAAgB,GAGjB,MAAM,uBAAuB,CAAC;AAE/B,2EAA2E;AAE3E,OAAO,EACL,qBAAqB,GAKtB,MAAM,sBAAsB,CAAC;AAE9B,2EAA2E;AAE3E,OAAO,EACL,cAAc,EACd,iBAAiB,GAGlB,MAAM,4BAA4B,CAAC;AAEpC,0EAA0E;AAE1E,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,oBAAoB,GAGrB,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA8CH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAM3D,2EAA2E;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErF,0EAA0E;AAE1E,OAAO,EAAE,cAAc,EAA8B,MAAM,kBAAkB,CAAC;AAE9E,2EAA2E;AAE3E,OAAO,EACL,cAAc,EACd,cAAc,GAEf,MAAM,gCAAgC,CAAC;AAExC,2EAA2E;AAE3E,OAAO,EACL,cAAc,GAEf,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,gCAAgC,CAAC;AAExC,4EAA4E;AAE5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,4EAA4E;AAE5E,OAAO,EAAE,aAAa,EAA6B,MAAM,oBAAoB,CAAC;AAgB9E,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,4EAA4E;AAE5E,OAAO,EACL,oBAAoB,EAIpB,kBAAkB,EAClB,gBAAgB,EAGhB,kBAAkB,EAElB,gBAAgB,GAGjB,MAAM,uBAAuB,CAAC;AAE/B,2EAA2E;AAE3E,OAAO,EACL,qBAAqB,GAKtB,MAAM,sBAAsB,CAAC;AAE9B,2EAA2E;AAE3E,OAAO,EACL,cAAc,EACd,iBAAiB,GAGlB,MAAM,4BAA4B,CAAC;AAEpC,0EAA0E;AAE1E,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,oBAAoB,GAGrB,MAAM,sBAAsB,CAAC;AAE9B,wEAAwE;AAExE,OAAO,EACL,eAAe,GAIhB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tier/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tier/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,eAAe,GAKhB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
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
|
+
* @neocortex/client - TierAwareClient
|
|
15
|
+
*
|
|
16
|
+
* Client-side tier awareness: JWT tier extraction, cached tier,
|
|
17
|
+
* pre-flight trigger checks, quota caching from response metadata,
|
|
18
|
+
* and offline enforcement via cached quota data.
|
|
19
|
+
*
|
|
20
|
+
* Follows the same "NEVER throws" pattern as LicenseClient.
|
|
21
|
+
* Fail-open: if anything fails, default to 'free' tier / allow operation.
|
|
22
|
+
* No stdout output (preserve pipe compatibility) -- stderr only.
|
|
23
|
+
*
|
|
24
|
+
* Epic 60
|
|
25
|
+
*/
|
|
26
|
+
import type { CacheProvider } from '../types/index.js';
|
|
27
|
+
import type { LicenseClient } from '../license/license-client.js';
|
|
28
|
+
/** Subscription tier (inlined to avoid import path issues) */
|
|
29
|
+
export type SubscriptionTier = 'free' | 'pro' | 'enterprise';
|
|
30
|
+
/** Result of a pre-flight trigger check */
|
|
31
|
+
export interface PreFlightResult {
|
|
32
|
+
readonly allowed: boolean;
|
|
33
|
+
readonly message?: string;
|
|
34
|
+
}
|
|
35
|
+
/** Cached quota data from server response metadata */
|
|
36
|
+
export interface QuotaSnapshot {
|
|
37
|
+
readonly stepsRemaining: number;
|
|
38
|
+
readonly invocationsRemaining: number;
|
|
39
|
+
readonly stepsLimit: number;
|
|
40
|
+
readonly invocationsLimit: number;
|
|
41
|
+
readonly cachedAt: number;
|
|
42
|
+
}
|
|
43
|
+
export interface TierAwareClientOptions {
|
|
44
|
+
readonly cacheProvider: CacheProvider;
|
|
45
|
+
readonly licenseClient: LicenseClient;
|
|
46
|
+
}
|
|
47
|
+
export declare class TierAwareClient {
|
|
48
|
+
private readonly cache;
|
|
49
|
+
private readonly licenseClient;
|
|
50
|
+
private cachedTier;
|
|
51
|
+
constructor(options: TierAwareClientOptions);
|
|
52
|
+
/**
|
|
53
|
+
* Get the current tier. Checks in-memory, then cache, then JWT token.
|
|
54
|
+
* NEVER throws - returns 'free' on failure (fail-open).
|
|
55
|
+
*/
|
|
56
|
+
getCachedTier(): Promise<SubscriptionTier>;
|
|
57
|
+
/**
|
|
58
|
+
* Update cached tier (called when server returns tier info).
|
|
59
|
+
*/
|
|
60
|
+
updateTier(tier: SubscriptionTier): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Check if a trigger is allowed for the current tier WITHOUT calling the server.
|
|
63
|
+
* Returns immediately (in-memory lookup).
|
|
64
|
+
* NEVER throws - returns { allowed: true } on failure (fail-open).
|
|
65
|
+
*/
|
|
66
|
+
preFlightCheck(trigger: string, tier?: SubscriptionTier): Promise<PreFlightResult>;
|
|
67
|
+
/**
|
|
68
|
+
* Update cached quota from server response metadata.
|
|
69
|
+
* Called after each successful invoke.
|
|
70
|
+
*/
|
|
71
|
+
updateQuotaFromResponse(metadata: Record<string, unknown>): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Get cached quota for today.
|
|
74
|
+
* NEVER throws - returns null if cache empty or expired.
|
|
75
|
+
*/
|
|
76
|
+
getCachedQuota(): Promise<QuotaSnapshot | null>;
|
|
77
|
+
/**
|
|
78
|
+
* Check quota in offline mode using cached data.
|
|
79
|
+
* NEVER throws - returns { allowed: true } on failure (fail-open).
|
|
80
|
+
*
|
|
81
|
+
* @param isOffline - Whether the circuit breaker is in L2+ degradation
|
|
82
|
+
*/
|
|
83
|
+
offlineQuotaCheck(isOffline?: boolean): Promise<PreFlightResult>;
|
|
84
|
+
/**
|
|
85
|
+
* Extract tier from JWT payload via base64url decode.
|
|
86
|
+
* No cryptographic verification - client-side is UX only.
|
|
87
|
+
*/
|
|
88
|
+
private extractTierFromJwt;
|
|
89
|
+
private buildUpgradeMessage;
|
|
90
|
+
private getQuotaCacheKey;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=tier-aware-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier-aware-client.d.ts","sourceRoot":"","sources":["../../src/tier/tier-aware-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAIlE,8DAA8D;AAC9D,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;AAE7D,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAoDD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;CACvC;AAID,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,UAAU,CAAiC;gBAEvC,OAAO,EAAE,sBAAsB;IAO3C;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA4BhD;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvD;;;;OAIG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAmBxF;;;OAGG;IACG,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB/E;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAmBrD;;;;;OAKG;IACG,iBAAiB,CAAC,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAkC7E;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,gBAAgB;CAKzB"}
|
|
@@ -0,0 +1,244 @@
|
|
|
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
|
+
// ── Constants ────────────────────────────────────────────────────────────
|
|
14
|
+
const TIER_CACHE_KEY = 'neocortex:tier';
|
|
15
|
+
const QUOTA_CACHE_KEY_PREFIX = 'neocortex:quota:';
|
|
16
|
+
const QUOTA_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
17
|
+
const TIER_CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
18
|
+
const VALID_TIERS = new Set(['free', 'pro', 'enterprise']);
|
|
19
|
+
const DEFAULT_TIER = 'free';
|
|
20
|
+
// ── Trigger Gates (inlined from shared tier-config to avoid import issues) ─
|
|
21
|
+
const TRIGGER_GATES = {
|
|
22
|
+
'status': 'free',
|
|
23
|
+
'init': 'free',
|
|
24
|
+
'create-epic': 'free',
|
|
25
|
+
'idea-diagnose': 'free',
|
|
26
|
+
'idea-research': 'free',
|
|
27
|
+
'generate-epic': 'free',
|
|
28
|
+
'exec': 'pro',
|
|
29
|
+
'yolo': 'pro',
|
|
30
|
+
'epic': 'pro',
|
|
31
|
+
'setup-branch': 'free',
|
|
32
|
+
'diagnose': 'free',
|
|
33
|
+
'research': 'free',
|
|
34
|
+
'write-spec': 'free',
|
|
35
|
+
'create-tasks': 'free',
|
|
36
|
+
'implement': 'free',
|
|
37
|
+
'update-memory': 'free',
|
|
38
|
+
'commit': 'free',
|
|
39
|
+
'sync': 'free',
|
|
40
|
+
'create-pr': 'free',
|
|
41
|
+
'review': 'pro',
|
|
42
|
+
'merge': 'free',
|
|
43
|
+
'fix-blocked': 'free',
|
|
44
|
+
'finalize-epic': 'free',
|
|
45
|
+
'cleanup': 'free',
|
|
46
|
+
'resolve-conflicts': 'free',
|
|
47
|
+
'audit': 'free',
|
|
48
|
+
'menu': 'free',
|
|
49
|
+
'plans': 'free',
|
|
50
|
+
};
|
|
51
|
+
const TIER_HIERARCHY = {
|
|
52
|
+
free: 0,
|
|
53
|
+
pro: 1,
|
|
54
|
+
enterprise: 2,
|
|
55
|
+
};
|
|
56
|
+
// ── TierAwareClient ──────────────────────────────────────────────────────
|
|
57
|
+
export class TierAwareClient {
|
|
58
|
+
cache;
|
|
59
|
+
licenseClient;
|
|
60
|
+
cachedTier = null;
|
|
61
|
+
constructor(options) {
|
|
62
|
+
this.cache = options.cacheProvider;
|
|
63
|
+
this.licenseClient = options.licenseClient;
|
|
64
|
+
}
|
|
65
|
+
// ── Story 60.1: Tier Extraction from JWT + Cache ────────────────────
|
|
66
|
+
/**
|
|
67
|
+
* Get the current tier. Checks in-memory, then cache, then JWT token.
|
|
68
|
+
* NEVER throws - returns 'free' on failure (fail-open).
|
|
69
|
+
*/
|
|
70
|
+
async getCachedTier() {
|
|
71
|
+
try {
|
|
72
|
+
// 1. In-memory
|
|
73
|
+
if (this.cachedTier)
|
|
74
|
+
return this.cachedTier;
|
|
75
|
+
// 2. EncryptedCache
|
|
76
|
+
const cached = await this.cache.get(TIER_CACHE_KEY);
|
|
77
|
+
if (cached && VALID_TIERS.has(cached)) {
|
|
78
|
+
this.cachedTier = cached;
|
|
79
|
+
return this.cachedTier;
|
|
80
|
+
}
|
|
81
|
+
// 3. Extract from JWT
|
|
82
|
+
const token = await this.licenseClient.getToken();
|
|
83
|
+
if (token) {
|
|
84
|
+
const tier = this.extractTierFromJwt(token);
|
|
85
|
+
this.cachedTier = tier;
|
|
86
|
+
// Persist to cache (fire-and-forget)
|
|
87
|
+
this.cache.set(TIER_CACHE_KEY, tier, TIER_CACHE_TTL_MS).catch(() => { });
|
|
88
|
+
return tier;
|
|
89
|
+
}
|
|
90
|
+
return DEFAULT_TIER;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return DEFAULT_TIER;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Update cached tier (called when server returns tier info).
|
|
98
|
+
*/
|
|
99
|
+
async updateTier(tier) {
|
|
100
|
+
try {
|
|
101
|
+
if (!VALID_TIERS.has(tier))
|
|
102
|
+
return;
|
|
103
|
+
this.cachedTier = tier;
|
|
104
|
+
await this.cache.set(TIER_CACHE_KEY, tier, TIER_CACHE_TTL_MS).catch(() => { });
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Non-critical
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ── Story 60.2: Pre-flight Trigger Check ────────────────────────────
|
|
111
|
+
/**
|
|
112
|
+
* Check if a trigger is allowed for the current tier WITHOUT calling the server.
|
|
113
|
+
* Returns immediately (in-memory lookup).
|
|
114
|
+
* NEVER throws - returns { allowed: true } on failure (fail-open).
|
|
115
|
+
*/
|
|
116
|
+
async preFlightCheck(trigger, tier) {
|
|
117
|
+
try {
|
|
118
|
+
const userTier = tier ?? await this.getCachedTier();
|
|
119
|
+
const requiredTier = TRIGGER_GATES[trigger] ?? 'free';
|
|
120
|
+
if (TIER_HIERARCHY[userTier] >= TIER_HIERARCHY[requiredTier]) {
|
|
121
|
+
return { allowed: true };
|
|
122
|
+
}
|
|
123
|
+
const message = this.buildUpgradeMessage(trigger, userTier, requiredTier);
|
|
124
|
+
return { allowed: false, message };
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Fail-open: allow on error
|
|
128
|
+
return { allowed: true };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// ── Story 60.3: Quota Cache from Response ───────────────────────────
|
|
132
|
+
/**
|
|
133
|
+
* Update cached quota from server response metadata.
|
|
134
|
+
* Called after each successful invoke.
|
|
135
|
+
*/
|
|
136
|
+
async updateQuotaFromResponse(metadata) {
|
|
137
|
+
try {
|
|
138
|
+
const quotaRemaining = metadata.quotaRemaining;
|
|
139
|
+
if (!quotaRemaining)
|
|
140
|
+
return;
|
|
141
|
+
const snapshot = {
|
|
142
|
+
stepsRemaining: quotaRemaining.stepsRemaining ?? 0,
|
|
143
|
+
invocationsRemaining: quotaRemaining.invocationsRemaining ?? 0,
|
|
144
|
+
stepsLimit: quotaRemaining.stepsLimit ?? 0,
|
|
145
|
+
invocationsLimit: quotaRemaining.invocationsLimit ?? 0,
|
|
146
|
+
cachedAt: Date.now(),
|
|
147
|
+
};
|
|
148
|
+
const dateKey = this.getQuotaCacheKey();
|
|
149
|
+
await this.cache.set(dateKey, JSON.stringify(snapshot), QUOTA_TTL_MS).catch(() => { });
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// Non-critical
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get cached quota for today.
|
|
157
|
+
* NEVER throws - returns null if cache empty or expired.
|
|
158
|
+
*/
|
|
159
|
+
async getCachedQuota() {
|
|
160
|
+
try {
|
|
161
|
+
const dateKey = this.getQuotaCacheKey();
|
|
162
|
+
const raw = await this.cache.get(dateKey);
|
|
163
|
+
if (!raw)
|
|
164
|
+
return null;
|
|
165
|
+
const snapshot = JSON.parse(raw);
|
|
166
|
+
// Validate TTL (EncryptedCache already handles this, but double-check)
|
|
167
|
+
if (Date.now() - snapshot.cachedAt > QUOTA_TTL_MS)
|
|
168
|
+
return null;
|
|
169
|
+
return snapshot;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// ── Story 60.4: Offline Enforcement ─────────────────────────────────
|
|
176
|
+
/**
|
|
177
|
+
* Check quota in offline mode using cached data.
|
|
178
|
+
* NEVER throws - returns { allowed: true } on failure (fail-open).
|
|
179
|
+
*
|
|
180
|
+
* @param isOffline - Whether the circuit breaker is in L2+ degradation
|
|
181
|
+
*/
|
|
182
|
+
async offlineQuotaCheck(isOffline = false) {
|
|
183
|
+
try {
|
|
184
|
+
if (!isOffline)
|
|
185
|
+
return { allowed: true };
|
|
186
|
+
const quota = await this.getCachedQuota();
|
|
187
|
+
// Fail-open: if no cached quota, allow
|
|
188
|
+
if (!quota)
|
|
189
|
+
return { allowed: true };
|
|
190
|
+
// Check steps
|
|
191
|
+
if (quota.stepsRemaining <= 0 && quota.stepsLimit > 0) {
|
|
192
|
+
return {
|
|
193
|
+
allowed: false,
|
|
194
|
+
message: `Daily step limit reached (${quota.stepsLimit}/${quota.stepsLimit}). Resets at 00:00 UTC.`,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
// Check invocations
|
|
198
|
+
if (quota.invocationsRemaining <= 0 && quota.invocationsLimit > 0) {
|
|
199
|
+
return {
|
|
200
|
+
allowed: false,
|
|
201
|
+
message: `Daily invocation limit reached (${quota.invocationsLimit}/${quota.invocationsLimit}). Resets at 00:00 UTC.`,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
return { allowed: true };
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// Fail-open
|
|
208
|
+
return { allowed: true };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// ── Private Helpers ─────────────────────────────────────────────────
|
|
212
|
+
/**
|
|
213
|
+
* Extract tier from JWT payload via base64url decode.
|
|
214
|
+
* No cryptographic verification - client-side is UX only.
|
|
215
|
+
*/
|
|
216
|
+
extractTierFromJwt(token) {
|
|
217
|
+
try {
|
|
218
|
+
const parts = token.split('.');
|
|
219
|
+
if (parts.length !== 3)
|
|
220
|
+
return DEFAULT_TIER;
|
|
221
|
+
// Decode base64url payload
|
|
222
|
+
const payload = parts[1];
|
|
223
|
+
const decoded = Buffer.from(payload, 'base64url').toString('utf8');
|
|
224
|
+
const claims = JSON.parse(decoded);
|
|
225
|
+
const tier = claims.tier;
|
|
226
|
+
if (tier && VALID_TIERS.has(tier)) {
|
|
227
|
+
return tier;
|
|
228
|
+
}
|
|
229
|
+
return DEFAULT_TIER;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return DEFAULT_TIER;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
buildUpgradeMessage(trigger, currentTier, requiredTier) {
|
|
236
|
+
return `The *${trigger} command requires ${requiredTier.toUpperCase()} plan. Your current plan: ${currentTier.toUpperCase()}. Upgrade: neocortex.dev/pricing`;
|
|
237
|
+
}
|
|
238
|
+
getQuotaCacheKey() {
|
|
239
|
+
const now = new Date();
|
|
240
|
+
const dateStr = now.toISOString().slice(0, 10); // YYYY-MM-DD UTC
|
|
241
|
+
return `${QUOTA_CACHE_KEY_PREFIX}${dateStr}`;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=tier-aware-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier-aware-client.js","sourceRoot":"","sources":["../../src/tier/tier-aware-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: neocortex
|
|
3
|
-
description: "🧠 Neocortex v3.9.
|
|
3
|
+
description: "🧠 Neocortex v3.9.19 (Free) | OrNexus Team"
|
|
4
4
|
model: opus
|
|
5
5
|
color: blue
|
|
6
6
|
tools:
|
|
@@ -56,7 +56,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
|
|
|
56
56
|
┌────────────────────────────────────────────────────────────┐
|
|
57
57
|
│ │
|
|
58
58
|
│ ####### N E O C O R T E X │
|
|
59
|
-
│ ### ######## v3.9.
|
|
59
|
+
│ ### ######## v3.9.19 │
|
|
60
60
|
│ ######### ##### │
|
|
61
61
|
│ ## ############## Development Orchestrator │
|
|
62
62
|
│ ## ### ###### ## OrNexus Team (Free) │
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: neocortex
|
|
3
|
-
description: "🧠 Neocortex v3.9.
|
|
3
|
+
description: "🧠 Neocortex v3.9.19 (Free) | OrNexus Team"
|
|
4
4
|
model: fast
|
|
5
5
|
readonly: false
|
|
6
6
|
is_background: false
|
|
@@ -18,7 +18,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
|
|
|
18
18
|
┌────────────────────────────────────────────────────────────┐
|
|
19
19
|
│ │
|
|
20
20
|
│ ####### N E O C O R T E X │
|
|
21
|
-
│ ### ######## v3.9.
|
|
21
|
+
│ ### ######## v3.9.19 │
|
|
22
22
|
│ ######### ##### │
|
|
23
23
|
│ ## ############## Development Orchestrator │
|
|
24
24
|
│ ## ### ###### ## OrNexus Team (Free) │
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: neocortex
|
|
3
|
-
description: "🧠 Neocortex v3.9.
|
|
3
|
+
description: "🧠 Neocortex v3.9.19 (Free) | OrNexus Team"
|
|
4
4
|
kind: local
|
|
5
5
|
tools:
|
|
6
6
|
- read_file
|
|
@@ -25,7 +25,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
|
|
|
25
25
|
┌────────────────────────────────────────────────────────────┐
|
|
26
26
|
│ │
|
|
27
27
|
│ ####### N E O C O R T E X │
|
|
28
|
-
│ ### ######## v3.9.
|
|
28
|
+
│ ### ######## v3.9.19 │
|
|
29
29
|
│ ######### ##### │
|
|
30
30
|
│ ## ############## Development Orchestrator │
|
|
31
31
|
│ ## ### ###### ## OrNexus Team (Free) │
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "neocortex"
|
|
3
|
-
description: "🧠 Neocortex v3.9.
|
|
3
|
+
description: "🧠 Neocortex v3.9.19 (Free) | OrNexus Team"
|
|
4
4
|
tools:
|
|
5
5
|
- readFile
|
|
6
6
|
- editFiles
|
|
@@ -26,7 +26,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
|
|
|
26
26
|
┌────────────────────────────────────────────────────────────┐
|
|
27
27
|
│ │
|
|
28
28
|
│ ####### N E O C O R T E X │
|
|
29
|
-
│ ### ######## v3.9.
|
|
29
|
+
│ ### ######## v3.9.19 │
|
|
30
30
|
│ ######### ##### │
|
|
31
31
|
│ ## ############## Development Orchestrator │
|
|
32
32
|
│ ## ### ###### ## OrNexus Team (Free) │
|