@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 CHANGED
@@ -15,7 +15,7 @@ param(
15
15
  [string]$ServerUrl = "https://api.neocortex.ornexus.com"
16
16
  )
17
17
 
18
- $VERSION = "3.9.16"
18
+ $VERSION = "3.9.19"
19
19
 
20
20
  # =============================================================================
21
21
  # CONFIGURACOES
package/install.sh CHANGED
@@ -4,7 +4,7 @@
4
4
  # Development Orchestrator
5
5
 
6
6
  # Versao do instalador
7
- VERSION="3.9.16"
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
- # Validate targets
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.16",
4
- "description": "Neocortex v3.9.16 - Orquestrador de Desenvolvimento de Epics & Stories para Claude Code",
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,6 @@
1
+ /**
2
+ * @license FSL-1.1
3
+ * Copyright (c) 2026 OrNexus AI
4
+ */
5
+ export { TierAwareClient, type TierAwareClientOptions, type PreFlightResult, type QuotaSnapshot, type SubscriptionTier, } from './tier-aware-client.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ /**
2
+ * @license FSL-1.1
3
+ * Copyright (c) 2026 OrNexus AI
4
+ */
5
+ export { TierAwareClient, } from './tier-aware-client.js';
6
+ //# sourceMappingURL=index.js.map
@@ -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,4 +1,4 @@
1
- # 🧠 Neocortex v3.9.16 (Free) | OrNexus Team
1
+ # 🧠 Neocortex v3.9.19 (Free) | OrNexus Team
2
2
 
3
3
  This project uses Neocortex, a Development Orchestrator (Free).
4
4
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex
3
- description: "🧠 Neocortex v3.9.16 (Free) | OrNexus Team"
3
+ description: "🧠 Neocortex v3.9.19 (Free) | OrNexus Team"
4
4
  ---
5
5
 
6
6
  # Neocortex - Thin Client Interface
@@ -4,7 +4,7 @@ agent:
4
4
  name: 'Neocortex'
5
5
  title: 'Development Orchestrator (Free)'
6
6
  icon: '>'
7
- version: '3.9.16'
7
+ version: '3.9.19'
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 v3.9.16 (Free) | OrNexus Team"
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.16
59
+ │ ### ######## v3.9.19
60
60
  │ ######### ##### │
61
61
  │ ## ############## Development Orchestrator │
62
62
  │ ## ### ###### ## OrNexus Team (Free) │
@@ -1,4 +1,4 @@
1
- # 🧠 Neocortex v3.9.16 (Free) | OrNexus Team
1
+ # 🧠 Neocortex v3.9.19 (Free) | OrNexus Team
2
2
 
3
3
  You are a Development Orchestrator (Free). All orchestration logic is delivered by the remote Neocortex server.
4
4
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex
3
- description: "🧠 Neocortex v3.9.16 (Free) | OrNexus Team"
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.16
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.16 (Free) | OrNexus Team"
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.16
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.16 (Free) | OrNexus Team"
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.16
29
+ │ ### ######## v3.9.19
30
30
  │ ######### ##### │
31
31
  │ ## ############## Development Orchestrator │
32
32
  │ ## ### ###### ## OrNexus Team (Free) │