@ornexus/neocortex 3.9.15 → 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/agent/refresh-stubs.d.ts +34 -0
- package/packages/client/dist/agent/refresh-stubs.d.ts.map +1 -0
- package/packages/client/dist/agent/refresh-stubs.js +152 -0
- package/packages/client/dist/agent/refresh-stubs.js.map +1 -0
- package/packages/client/dist/agent/update-agent-yaml.d.ts +27 -0
- package/packages/client/dist/agent/update-agent-yaml.d.ts.map +1 -0
- package/packages/client/dist/agent/update-agent-yaml.js +103 -0
- package/packages/client/dist/agent/update-agent-yaml.js.map +1 -0
- package/packages/client/dist/commands/activate.d.ts.map +1 -1
- package/packages/client/dist/commands/activate.js +8 -2
- package/packages/client/dist/commands/activate.js.map +1 -1
- 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",
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
* Find the monorepo / npm package root by walking up from this file's location.
|
|
15
|
+
* Looks for a package.json with name '@ornexus/neocortex' (monorepo root) or
|
|
16
|
+
* '@neocortex/client' (client package root that contains targets-stubs after build).
|
|
17
|
+
*
|
|
18
|
+
* Returns null if not found within 10 levels.
|
|
19
|
+
*/
|
|
20
|
+
export declare function findPackageRoot(): string | null;
|
|
21
|
+
/**
|
|
22
|
+
* Refresh installed stubs if CLI version differs from installed version.
|
|
23
|
+
*
|
|
24
|
+
* For each stub target:
|
|
25
|
+
* 1. Read .version from install dir
|
|
26
|
+
* 2. Compare with cliVersion
|
|
27
|
+
* 3. If different (or .version missing): re-copy all stub files + write .version
|
|
28
|
+
* 4. If same: skip (no-op)
|
|
29
|
+
*
|
|
30
|
+
* Never throws -- stub refresh is non-critical.
|
|
31
|
+
* Returns the number of targets that were refreshed.
|
|
32
|
+
*/
|
|
33
|
+
export declare function refreshStubs(cliVersion: string): number;
|
|
34
|
+
//# sourceMappingURL=refresh-stubs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-stubs.d.ts","sourceRoot":"","sources":["../../src/agent/refresh-stubs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgDH;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAe/C;AAoBD;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA4DvD"}
|
|
@@ -0,0 +1,152 @@
|
|
|
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 - Stub Refresh Module
|
|
15
|
+
*
|
|
16
|
+
* Detects version mismatch between installed stubs and CLI version.
|
|
17
|
+
* Re-copies full stub files from the package when outdated.
|
|
18
|
+
*
|
|
19
|
+
* Called by activate.ts BEFORE updateAgentDescription() to ensure
|
|
20
|
+
* the stub file has all current sections (Banner, Plugin Guard, etc.)
|
|
21
|
+
* before the regex patcher runs.
|
|
22
|
+
*
|
|
23
|
+
* Never throws -- stub refresh is non-critical.
|
|
24
|
+
*
|
|
25
|
+
* Story 55.1
|
|
26
|
+
*/
|
|
27
|
+
import { readFileSync, writeFileSync, copyFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
28
|
+
import { join, dirname } from 'node:path';
|
|
29
|
+
import { homedir } from 'node:os';
|
|
30
|
+
import { fileURLToPath } from 'node:url';
|
|
31
|
+
const STUB_TARGETS = [
|
|
32
|
+
{
|
|
33
|
+
destDir: join(homedir(), '.claude', 'agents', 'neocortex'),
|
|
34
|
+
sourceDir: 'claude-code',
|
|
35
|
+
files: ['neocortex.md', 'neocortex.agent.yaml'],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
destDir: join(homedir(), '.gemini', 'agents'),
|
|
39
|
+
sourceDir: 'gemini-cli',
|
|
40
|
+
files: ['agent.md'],
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
// -- Package Root Resolution --------------------------------------------------
|
|
44
|
+
/**
|
|
45
|
+
* Find the monorepo / npm package root by walking up from this file's location.
|
|
46
|
+
* Looks for a package.json with name '@ornexus/neocortex' (monorepo root) or
|
|
47
|
+
* '@neocortex/client' (client package root that contains targets-stubs after build).
|
|
48
|
+
*
|
|
49
|
+
* Returns null if not found within 10 levels.
|
|
50
|
+
*/
|
|
51
|
+
export function findPackageRoot() {
|
|
52
|
+
try {
|
|
53
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
54
|
+
let dir = dirname(thisFile);
|
|
55
|
+
for (let i = 0; i < 10; i++) {
|
|
56
|
+
try {
|
|
57
|
+
const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8'));
|
|
58
|
+
if (pkg.name === '@ornexus/neocortex') {
|
|
59
|
+
return dir;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch { /* no package.json at this level */ }
|
|
63
|
+
dir = dirname(dir);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch { /* fallback */ }
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
// -- Version Comparison -------------------------------------------------------
|
|
70
|
+
/**
|
|
71
|
+
* Read the installed version from .version file in the dest directory.
|
|
72
|
+
* Returns null if file doesn't exist or is unreadable.
|
|
73
|
+
*/
|
|
74
|
+
function readInstalledVersion(destDir) {
|
|
75
|
+
try {
|
|
76
|
+
const versionFile = join(destDir, '.version');
|
|
77
|
+
if (existsSync(versionFile)) {
|
|
78
|
+
return readFileSync(versionFile, 'utf-8').trim() || null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch { /* unreadable */ }
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
// -- Public API ---------------------------------------------------------------
|
|
85
|
+
/**
|
|
86
|
+
* Refresh installed stubs if CLI version differs from installed version.
|
|
87
|
+
*
|
|
88
|
+
* For each stub target:
|
|
89
|
+
* 1. Read .version from install dir
|
|
90
|
+
* 2. Compare with cliVersion
|
|
91
|
+
* 3. If different (or .version missing): re-copy all stub files + write .version
|
|
92
|
+
* 4. If same: skip (no-op)
|
|
93
|
+
*
|
|
94
|
+
* Never throws -- stub refresh is non-critical.
|
|
95
|
+
* Returns the number of targets that were refreshed.
|
|
96
|
+
*/
|
|
97
|
+
export function refreshStubs(cliVersion) {
|
|
98
|
+
try {
|
|
99
|
+
const packageRoot = findPackageRoot();
|
|
100
|
+
if (!packageRoot) {
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
// targets-stubs/ is at the package root level
|
|
104
|
+
const stubsRoot = join(packageRoot, 'targets-stubs');
|
|
105
|
+
if (!existsSync(stubsRoot)) {
|
|
106
|
+
return 0;
|
|
107
|
+
}
|
|
108
|
+
let refreshed = 0;
|
|
109
|
+
for (const target of STUB_TARGETS) {
|
|
110
|
+
try {
|
|
111
|
+
// Only refresh if the dest dir exists (user has this platform installed)
|
|
112
|
+
if (!existsSync(target.destDir)) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const installedVersion = readInstalledVersion(target.destDir);
|
|
116
|
+
if (installedVersion === cliVersion) {
|
|
117
|
+
continue; // Already up to date
|
|
118
|
+
}
|
|
119
|
+
// Source directory for this target
|
|
120
|
+
const sourceDir = join(stubsRoot, target.sourceDir);
|
|
121
|
+
if (!existsSync(sourceDir)) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
// Copy each file
|
|
125
|
+
let copiedAny = false;
|
|
126
|
+
for (const file of target.files) {
|
|
127
|
+
const src = join(sourceDir, file);
|
|
128
|
+
const dest = join(target.destDir, file);
|
|
129
|
+
if (existsSync(src)) {
|
|
130
|
+
mkdirSync(target.destDir, { recursive: true });
|
|
131
|
+
copyFileSync(src, dest);
|
|
132
|
+
copiedAny = true;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Write .version file
|
|
136
|
+
if (copiedAny) {
|
|
137
|
+
writeFileSync(join(target.destDir, '.version'), cliVersion + '\n', 'utf-8');
|
|
138
|
+
refreshed++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Non-critical -- continue with next target
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return refreshed;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// Non-critical -- entire function is best-effort
|
|
149
|
+
return 0;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=refresh-stubs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-stubs.js","sourceRoot":"","sources":["../../src/agent/refresh-stubs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
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
|
+
* Update agent.yaml files across all known locations.
|
|
15
|
+
* Returns count of files updated.
|
|
16
|
+
*
|
|
17
|
+
* Never throws.
|
|
18
|
+
*/
|
|
19
|
+
export declare function updateAgentYaml(version: string, tier?: string): number;
|
|
20
|
+
/**
|
|
21
|
+
* Update agent.yaml at a specific file path (used for testing).
|
|
22
|
+
* Returns true if the file was modified.
|
|
23
|
+
*
|
|
24
|
+
* Never throws.
|
|
25
|
+
*/
|
|
26
|
+
export declare function updateAgentYamlAt(filePath: string, version: string, tier?: string): boolean;
|
|
27
|
+
//# sourceMappingURL=update-agent-yaml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-agent-yaml.d.ts","sourceRoot":"","sources":["../../src/agent/update-agent-yaml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgFH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAYtE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAE3F"}
|
|
@@ -0,0 +1,103 @@
|
|
|
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 - Agent YAML Updater
|
|
15
|
+
*
|
|
16
|
+
* Patches neocortex.agent.yaml with current version and tier-based title.
|
|
17
|
+
*
|
|
18
|
+
* Patches TWO fields:
|
|
19
|
+
* 1. version: 'X.X.X'
|
|
20
|
+
* 2. title: 'Development Orchestrator (Tier)'
|
|
21
|
+
*
|
|
22
|
+
* Called after:
|
|
23
|
+
* - refreshStubs() (ensures YAML exists with current structure)
|
|
24
|
+
* - updateAgentDescription() (ensures consistency across all surfaces)
|
|
25
|
+
*
|
|
26
|
+
* Never throws -- YAML update is non-critical.
|
|
27
|
+
*
|
|
28
|
+
* Story 55.2
|
|
29
|
+
*/
|
|
30
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
31
|
+
import { join } from 'node:path';
|
|
32
|
+
import { homedir } from 'node:os';
|
|
33
|
+
// -- Constants ----------------------------------------------------------------
|
|
34
|
+
const TIER_LABELS = {
|
|
35
|
+
free: 'Free',
|
|
36
|
+
pro: 'Pro',
|
|
37
|
+
enterprise: 'Enterprise',
|
|
38
|
+
};
|
|
39
|
+
// Regex patterns for YAML fields (simple key: 'value' format)
|
|
40
|
+
const VERSION_PATTERN = /^(\s*version:\s*)'[^']*'/m;
|
|
41
|
+
const TITLE_PATTERN = /^(\s*title:\s*)'[^']*'/m;
|
|
42
|
+
const HOME_YAML_FILES = [
|
|
43
|
+
join(homedir(), '.claude', 'agents', 'neocortex', 'neocortex.agent.yaml'),
|
|
44
|
+
];
|
|
45
|
+
// -- Internal -----------------------------------------------------------------
|
|
46
|
+
/**
|
|
47
|
+
* Patch a single agent.yaml file with version and tier.
|
|
48
|
+
* Returns true if file was modified.
|
|
49
|
+
*/
|
|
50
|
+
function patchYamlFile(filePath, version, tier) {
|
|
51
|
+
try {
|
|
52
|
+
if (!existsSync(filePath)) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
let content = readFileSync(filePath, 'utf-8');
|
|
56
|
+
const original = content;
|
|
57
|
+
const label = TIER_LABELS[tier.toLowerCase()] ?? 'Free';
|
|
58
|
+
// Patch version
|
|
59
|
+
if (VERSION_PATTERN.test(content)) {
|
|
60
|
+
content = content.replace(VERSION_PATTERN, `$1'${version}'`);
|
|
61
|
+
}
|
|
62
|
+
// Patch title
|
|
63
|
+
if (TITLE_PATTERN.test(content)) {
|
|
64
|
+
content = content.replace(TITLE_PATTERN, `$1'Development Orchestrator (${label})'`);
|
|
65
|
+
}
|
|
66
|
+
if (content === original) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
writeFileSync(filePath, content, 'utf-8');
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// -- Public API ---------------------------------------------------------------
|
|
77
|
+
/**
|
|
78
|
+
* Update agent.yaml files across all known locations.
|
|
79
|
+
* Returns count of files updated.
|
|
80
|
+
*
|
|
81
|
+
* Never throws.
|
|
82
|
+
*/
|
|
83
|
+
export function updateAgentYaml(version, tier) {
|
|
84
|
+
const resolvedTier = tier ?? 'free';
|
|
85
|
+
let updated = 0;
|
|
86
|
+
// Home-level files
|
|
87
|
+
for (const filePath of HOME_YAML_FILES) {
|
|
88
|
+
if (patchYamlFile(filePath, version, resolvedTier)) {
|
|
89
|
+
updated++;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return updated;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Update agent.yaml at a specific file path (used for testing).
|
|
96
|
+
* Returns true if the file was modified.
|
|
97
|
+
*
|
|
98
|
+
* Never throws.
|
|
99
|
+
*/
|
|
100
|
+
export function updateAgentYamlAt(filePath, version, tier) {
|
|
101
|
+
return patchYamlFile(filePath, version, tier ?? 'free');
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=update-agent-yaml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-agent-yaml.js","sourceRoot":"","sources":["../../src/agent/update-agent-yaml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,gFAAgF;AAEhF,MAAM,WAAW,GAA2B;IAC1C,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,UAAU,EAAE,YAAY;CACzB,CAAC;AAEF,8DAA8D;AAC9D,MAAM,eAAe,GAAG,2BAA2B,CAAC;AACpD,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAEhD,MAAM,eAAe,GAAG;IACtB,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,CAAC;CAC1E,CAAC;AAEF,gFAAgF;AAEhF;;;GAGG;AACH,SAAS,aAAa,CAAC,QAAgB,EAAE,OAAe,EAAE,IAAY;IACpE,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC;QAEzB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,MAAM,CAAC;QAExD,gBAAgB;QAChB,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,OAAO,GAAG,CAAC,CAAC;QAC/D,CAAC;QAED,cAAc;QACd,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,gCAAgC,KAAK,IAAI,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,IAAa;IAC5D,MAAM,YAAY,GAAG,IAAI,IAAI,MAAM,CAAC;IACpC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,mBAAmB;IACnB,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;QACvC,IAAI,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,OAAe,EAAE,IAAa;IAChF,OAAO,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activate.d.ts","sourceRoot":"","sources":["../../src/commands/activate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"activate.d.ts","sourceRoot":"","sources":["../../src/commands/activate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsDH,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8BAA8B;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAaD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAmBxF;AA8BD;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA0HhF"}
|
|
@@ -27,6 +27,8 @@ import { LicenseClient } from '../license/license-client.js';
|
|
|
27
27
|
import { EncryptedCache } from '../cache/encrypted-cache.js';
|
|
28
28
|
import { getMachineFingerprint } from '../machine/fingerprint.js';
|
|
29
29
|
import { updateAgentDescription } from '../agent/update-description.js';
|
|
30
|
+
import { refreshStubs } from '../agent/refresh-stubs.js';
|
|
31
|
+
import { updateAgentYaml } from '../agent/update-agent-yaml.js';
|
|
30
32
|
// ── Version Resolution ────────────────────────────────────────────────────
|
|
31
33
|
function getInstalledVersion() {
|
|
32
34
|
try {
|
|
@@ -194,10 +196,14 @@ export async function activate(options) {
|
|
|
194
196
|
message: `Failed to save config to ${CONFIG_FILE}: ${err instanceof Error ? err.message : String(err)}`,
|
|
195
197
|
};
|
|
196
198
|
}
|
|
197
|
-
// 5.
|
|
199
|
+
// 5. Refresh stubs if version mismatch detected (Story 55.1)
|
|
198
200
|
const cliVersion = getInstalledVersion();
|
|
201
|
+
refreshStubs(cliVersion);
|
|
202
|
+
// 6. Update agent description with activated tier and version
|
|
199
203
|
updateAgentDescription(cliVersion, tier);
|
|
200
|
-
//
|
|
204
|
+
// 7. Update agent YAML with version and tier (Story 55.2)
|
|
205
|
+
updateAgentYaml(cliVersion, tier);
|
|
206
|
+
// 8. Return success
|
|
201
207
|
return {
|
|
202
208
|
success: true,
|
|
203
209
|
message: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activate.js","sourceRoot":"","sources":["../../src/commands/activate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"activate.js","sourceRoot":"","sources":["../../src/commands/activate.ts"],"names":[],"mappings":"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"}
|
|
@@ -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) │
|