@ornexus/neocortex 3.8.0
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/LICENSE +56 -0
- package/README.md +661 -0
- package/install.js +453 -0
- package/install.ps1 +1478 -0
- package/install.sh +1409 -0
- package/package.json +93 -0
- package/packages/client/dist/adapters/adapter-registry.d.ts +62 -0
- package/packages/client/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/packages/client/dist/adapters/adapter-registry.js +107 -0
- package/packages/client/dist/adapters/adapter-registry.js.map +1 -0
- package/packages/client/dist/adapters/antigravity-adapter.d.ts +19 -0
- package/packages/client/dist/adapters/antigravity-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/antigravity-adapter.js +78 -0
- package/packages/client/dist/adapters/antigravity-adapter.js.map +1 -0
- package/packages/client/dist/adapters/claude-code-adapter.d.ts +20 -0
- package/packages/client/dist/adapters/claude-code-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/claude-code-adapter.js +80 -0
- package/packages/client/dist/adapters/claude-code-adapter.js.map +1 -0
- package/packages/client/dist/adapters/codex-adapter.d.ts +20 -0
- package/packages/client/dist/adapters/codex-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/codex-adapter.js +81 -0
- package/packages/client/dist/adapters/codex-adapter.js.map +1 -0
- package/packages/client/dist/adapters/cursor-adapter.d.ts +20 -0
- package/packages/client/dist/adapters/cursor-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/cursor-adapter.js +116 -0
- package/packages/client/dist/adapters/cursor-adapter.js.map +1 -0
- package/packages/client/dist/adapters/gemini-adapter.d.ts +19 -0
- package/packages/client/dist/adapters/gemini-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/gemini-adapter.js +72 -0
- package/packages/client/dist/adapters/gemini-adapter.js.map +1 -0
- package/packages/client/dist/adapters/index.d.ts +20 -0
- package/packages/client/dist/adapters/index.d.ts.map +1 -0
- package/packages/client/dist/adapters/index.js +22 -0
- package/packages/client/dist/adapters/index.js.map +1 -0
- package/packages/client/dist/adapters/platform-detector.d.ts +47 -0
- package/packages/client/dist/adapters/platform-detector.d.ts.map +1 -0
- package/packages/client/dist/adapters/platform-detector.js +107 -0
- package/packages/client/dist/adapters/platform-detector.js.map +1 -0
- package/packages/client/dist/adapters/target-adapter.d.ts +71 -0
- package/packages/client/dist/adapters/target-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/target-adapter.js +13 -0
- package/packages/client/dist/adapters/target-adapter.js.map +1 -0
- package/packages/client/dist/adapters/vscode-adapter.d.ts +20 -0
- package/packages/client/dist/adapters/vscode-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/vscode-adapter.js +73 -0
- package/packages/client/dist/adapters/vscode-adapter.js.map +1 -0
- package/packages/client/dist/cache/crypto-utils.d.ts +31 -0
- package/packages/client/dist/cache/crypto-utils.d.ts.map +1 -0
- package/packages/client/dist/cache/crypto-utils.js +77 -0
- package/packages/client/dist/cache/crypto-utils.js.map +1 -0
- package/packages/client/dist/cache/encrypted-cache.d.ts +31 -0
- package/packages/client/dist/cache/encrypted-cache.d.ts.map +1 -0
- package/packages/client/dist/cache/encrypted-cache.js +92 -0
- package/packages/client/dist/cache/encrypted-cache.js.map +1 -0
- package/packages/client/dist/cache/index.d.ts +14 -0
- package/packages/client/dist/cache/index.d.ts.map +1 -0
- package/packages/client/dist/cache/index.js +14 -0
- package/packages/client/dist/cache/index.js.map +1 -0
- package/packages/client/dist/cli.d.ts +15 -0
- package/packages/client/dist/cli.d.ts.map +1 -0
- package/packages/client/dist/cli.js +182 -0
- package/packages/client/dist/cli.js.map +1 -0
- package/packages/client/dist/commands/activate.d.ts +48 -0
- package/packages/client/dist/commands/activate.d.ts.map +1 -0
- package/packages/client/dist/commands/activate.js +186 -0
- package/packages/client/dist/commands/activate.js.map +1 -0
- package/packages/client/dist/commands/cache-status.d.ts +40 -0
- package/packages/client/dist/commands/cache-status.d.ts.map +1 -0
- package/packages/client/dist/commands/cache-status.js +113 -0
- package/packages/client/dist/commands/cache-status.js.map +1 -0
- package/packages/client/dist/commands/invoke.d.ts +71 -0
- package/packages/client/dist/commands/invoke.d.ts.map +1 -0
- package/packages/client/dist/commands/invoke.js +345 -0
- package/packages/client/dist/commands/invoke.js.map +1 -0
- package/packages/client/dist/config/resolver-selection.d.ts +41 -0
- package/packages/client/dist/config/resolver-selection.d.ts.map +1 -0
- package/packages/client/dist/config/resolver-selection.js +278 -0
- package/packages/client/dist/config/resolver-selection.js.map +1 -0
- package/packages/client/dist/context/context-collector.d.ts +29 -0
- package/packages/client/dist/context/context-collector.d.ts.map +1 -0
- package/packages/client/dist/context/context-collector.js +223 -0
- package/packages/client/dist/context/context-collector.js.map +1 -0
- package/packages/client/dist/context/context-sanitizer.d.ts +29 -0
- package/packages/client/dist/context/context-sanitizer.d.ts.map +1 -0
- package/packages/client/dist/context/context-sanitizer.js +146 -0
- package/packages/client/dist/context/context-sanitizer.js.map +1 -0
- package/packages/client/dist/index.d.ts +55 -0
- package/packages/client/dist/index.d.ts.map +1 -0
- package/packages/client/dist/index.js +37 -0
- package/packages/client/dist/index.js.map +1 -0
- package/packages/client/dist/license/index.d.ts +6 -0
- package/packages/client/dist/license/index.d.ts.map +1 -0
- package/packages/client/dist/license/index.js +6 -0
- package/packages/client/dist/license/index.js.map +1 -0
- package/packages/client/dist/license/license-client.d.ts +53 -0
- package/packages/client/dist/license/license-client.d.ts.map +1 -0
- package/packages/client/dist/license/license-client.js +164 -0
- package/packages/client/dist/license/license-client.js.map +1 -0
- package/packages/client/dist/machine/fingerprint.d.ts +24 -0
- package/packages/client/dist/machine/fingerprint.d.ts.map +1 -0
- package/packages/client/dist/machine/fingerprint.js +61 -0
- package/packages/client/dist/machine/fingerprint.js.map +1 -0
- package/packages/client/dist/machine/index.d.ts +6 -0
- package/packages/client/dist/machine/index.d.ts.map +1 -0
- package/packages/client/dist/machine/index.js +6 -0
- package/packages/client/dist/machine/index.js.map +1 -0
- package/packages/client/dist/resilience/circuit-breaker.d.ts +71 -0
- package/packages/client/dist/resilience/circuit-breaker.d.ts.map +1 -0
- package/packages/client/dist/resilience/circuit-breaker.js +171 -0
- package/packages/client/dist/resilience/circuit-breaker.js.map +1 -0
- package/packages/client/dist/resilience/degradation-manager.d.ts +68 -0
- package/packages/client/dist/resilience/degradation-manager.d.ts.map +1 -0
- package/packages/client/dist/resilience/degradation-manager.js +165 -0
- package/packages/client/dist/resilience/degradation-manager.js.map +1 -0
- package/packages/client/dist/resilience/freshness-indicator.d.ts +60 -0
- package/packages/client/dist/resilience/freshness-indicator.d.ts.map +1 -0
- package/packages/client/dist/resilience/freshness-indicator.js +101 -0
- package/packages/client/dist/resilience/freshness-indicator.js.map +1 -0
- package/packages/client/dist/resilience/index.d.ts +9 -0
- package/packages/client/dist/resilience/index.d.ts.map +1 -0
- package/packages/client/dist/resilience/index.js +9 -0
- package/packages/client/dist/resilience/index.js.map +1 -0
- package/packages/client/dist/resilience/recovery-detector.d.ts +60 -0
- package/packages/client/dist/resilience/recovery-detector.d.ts.map +1 -0
- package/packages/client/dist/resilience/recovery-detector.js +75 -0
- package/packages/client/dist/resilience/recovery-detector.js.map +1 -0
- package/packages/client/dist/resolvers/asset-resolver.d.ts +80 -0
- package/packages/client/dist/resolvers/asset-resolver.d.ts.map +1 -0
- package/packages/client/dist/resolvers/asset-resolver.js +14 -0
- package/packages/client/dist/resolvers/asset-resolver.js.map +1 -0
- package/packages/client/dist/resolvers/local-resolver.d.ts +27 -0
- package/packages/client/dist/resolvers/local-resolver.d.ts.map +1 -0
- package/packages/client/dist/resolvers/local-resolver.js +219 -0
- package/packages/client/dist/resolvers/local-resolver.js.map +1 -0
- package/packages/client/dist/resolvers/remote-resolver.d.ts +63 -0
- package/packages/client/dist/resolvers/remote-resolver.d.ts.map +1 -0
- package/packages/client/dist/resolvers/remote-resolver.js +207 -0
- package/packages/client/dist/resolvers/remote-resolver.js.map +1 -0
- package/packages/client/dist/telemetry/index.d.ts +6 -0
- package/packages/client/dist/telemetry/index.d.ts.map +1 -0
- package/packages/client/dist/telemetry/index.js +6 -0
- package/packages/client/dist/telemetry/index.js.map +1 -0
- package/packages/client/dist/telemetry/offline-queue.d.ts +58 -0
- package/packages/client/dist/telemetry/offline-queue.d.ts.map +1 -0
- package/packages/client/dist/telemetry/offline-queue.js +132 -0
- package/packages/client/dist/telemetry/offline-queue.js.map +1 -0
- package/packages/client/dist/types/index.d.ts +141 -0
- package/packages/client/dist/types/index.d.ts.map +1 -0
- package/packages/client/dist/types/index.js +39 -0
- package/packages/client/dist/types/index.js.map +1 -0
- package/targets-stubs/antigravity/README.md +20 -0
- package/targets-stubs/claude-code/README.md +20 -0
- package/targets-stubs/codex/README.md +20 -0
- package/targets-stubs/cursor/README.md +20 -0
- package/targets-stubs/gemini-cli/README.md +20 -0
- package/targets-stubs/vscode/README.md +20 -0
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
/** On-disk envelope format. expiresAt is inside the encrypted data payload. */
|
|
14
|
+
export interface EncryptedEnvelope {
|
|
15
|
+
/** Base64-encoded initialization vector (12 bytes) */
|
|
16
|
+
iv: string;
|
|
17
|
+
/** Base64-encoded PBKDF2 salt */
|
|
18
|
+
salt: string;
|
|
19
|
+
/** Base64-encoded GCM auth tag */
|
|
20
|
+
tag: string;
|
|
21
|
+
/** Base64-encoded encrypted data (contains plaintext + expiresAt) */
|
|
22
|
+
data: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function deriveKey(passphrase: string, salt: Buffer): Buffer;
|
|
25
|
+
export declare function encrypt(plaintext: string, passphrase: string, ttlMs?: number): string;
|
|
26
|
+
export interface DecryptResult {
|
|
27
|
+
plaintext: string;
|
|
28
|
+
expired: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare function decrypt(envelopeJson: string, passphrase: string): DecryptResult;
|
|
31
|
+
//# sourceMappingURL=crypto-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto-utils.d.ts","sourceRoot":"","sources":["../../src/cache/crypto-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA6BH,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;CACd;AAUD,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAElE;AAID,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBrF;AAID,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAyB/E"}
|
|
@@ -0,0 +1,77 @@
|
|
|
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 - Crypto Utilities
|
|
15
|
+
*
|
|
16
|
+
* AES-256-GCM encryption/decryption with PBKDF2 key derivation.
|
|
17
|
+
* Used by EncryptedCache to protect cached assets at rest.
|
|
18
|
+
*
|
|
19
|
+
* Security design:
|
|
20
|
+
* - IV: 12 bytes (NIST SP 800-38D recommended for GCM)
|
|
21
|
+
* - Salt: 32 bytes random per entry
|
|
22
|
+
* - Key: PBKDF2 with 100k iterations, SHA-512
|
|
23
|
+
* - expiresAt is inside the encrypted payload (authenticated by GCM tag)
|
|
24
|
+
*/
|
|
25
|
+
import { randomBytes, pbkdf2Sync, createCipheriv, createDecipheriv } from 'node:crypto';
|
|
26
|
+
// ── Constants ────────────────────────────────────────────────────────────
|
|
27
|
+
const ALGORITHM = 'aes-256-gcm';
|
|
28
|
+
const IV_LENGTH = 12; // NIST SP 800-38D recommended for AES-GCM
|
|
29
|
+
const SALT_LENGTH = 32;
|
|
30
|
+
const KEY_LENGTH = 32;
|
|
31
|
+
const AUTH_TAG_LENGTH = 16;
|
|
32
|
+
const PBKDF2_ITERATIONS = 100_000;
|
|
33
|
+
const PBKDF2_DIGEST = 'sha512';
|
|
34
|
+
// ── Key Derivation ───────────────────────────────────────────────────────
|
|
35
|
+
export function deriveKey(passphrase, salt) {
|
|
36
|
+
return pbkdf2Sync(passphrase, salt, PBKDF2_ITERATIONS, KEY_LENGTH, PBKDF2_DIGEST);
|
|
37
|
+
}
|
|
38
|
+
// ── Encrypt ──────────────────────────────────────────────────────────────
|
|
39
|
+
export function encrypt(plaintext, passphrase, ttlMs) {
|
|
40
|
+
const iv = randomBytes(IV_LENGTH);
|
|
41
|
+
const salt = randomBytes(SALT_LENGTH);
|
|
42
|
+
const key = deriveKey(passphrase, salt);
|
|
43
|
+
const expiresAt = ttlMs != null ? Date.now() + ttlMs : null;
|
|
44
|
+
const payload = { plaintext, expiresAt };
|
|
45
|
+
const payloadJson = JSON.stringify(payload);
|
|
46
|
+
const cipher = createCipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });
|
|
47
|
+
const encrypted = Buffer.concat([cipher.update(payloadJson, 'utf8'), cipher.final()]);
|
|
48
|
+
const tag = cipher.getAuthTag();
|
|
49
|
+
const envelope = {
|
|
50
|
+
iv: iv.toString('base64'),
|
|
51
|
+
salt: salt.toString('base64'),
|
|
52
|
+
tag: tag.toString('base64'),
|
|
53
|
+
data: encrypted.toString('base64'),
|
|
54
|
+
};
|
|
55
|
+
return JSON.stringify(envelope);
|
|
56
|
+
}
|
|
57
|
+
export function decrypt(envelopeJson, passphrase) {
|
|
58
|
+
const raw = JSON.parse(envelopeJson);
|
|
59
|
+
if (!raw.iv || !raw.salt || !raw.tag || !raw.data) {
|
|
60
|
+
throw new Error('Invalid cache envelope: missing required fields');
|
|
61
|
+
}
|
|
62
|
+
const iv = Buffer.from(raw.iv, 'base64');
|
|
63
|
+
const salt = Buffer.from(raw.salt, 'base64');
|
|
64
|
+
const tag = Buffer.from(raw.tag, 'base64');
|
|
65
|
+
const data = Buffer.from(raw.data, 'base64');
|
|
66
|
+
const key = deriveKey(passphrase, salt);
|
|
67
|
+
const decipher = createDecipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });
|
|
68
|
+
decipher.setAuthTag(tag);
|
|
69
|
+
const decrypted = Buffer.concat([decipher.update(data), decipher.final()]);
|
|
70
|
+
const payload = JSON.parse(decrypted.toString('utf8'));
|
|
71
|
+
const expired = payload.expiresAt != null && Date.now() > payload.expiresAt;
|
|
72
|
+
return {
|
|
73
|
+
plaintext: payload.plaintext,
|
|
74
|
+
expired,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=crypto-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto-utils.js","sourceRoot":"","sources":["../../src/cache/crypto-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
import type { CacheProvider } from '../types/index.js';
|
|
14
|
+
export interface EncryptedCacheOptions {
|
|
15
|
+
/** Directory where encrypted cache files are stored */
|
|
16
|
+
cacheDir: string;
|
|
17
|
+
/** Passphrase for encryption (typically the license key) */
|
|
18
|
+
passphrase: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class EncryptedCache implements CacheProvider {
|
|
21
|
+
private readonly cacheDir;
|
|
22
|
+
private readonly passphrase;
|
|
23
|
+
private initPromise;
|
|
24
|
+
constructor(options: EncryptedCacheOptions);
|
|
25
|
+
get(key: string): Promise<string | null>;
|
|
26
|
+
set(key: string, value: string, ttlMs?: number): Promise<void>;
|
|
27
|
+
clear(): Promise<void>;
|
|
28
|
+
private keyToPath;
|
|
29
|
+
private ensureDir;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=encrypted-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypted-cache.d.ts","sourceRoot":"","sources":["../../src/cache/encrypted-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgBH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AASvD,MAAM,WAAW,qBAAqB;IACpC,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,WAAW,CAA8B;gBAErC,OAAO,EAAE,qBAAqB;IAKpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkBxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,SAAS;CASlB"}
|
|
@@ -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 - EncryptedCache
|
|
15
|
+
*
|
|
16
|
+
* Filesystem-backed encrypted cache implementing the CacheProvider interface.
|
|
17
|
+
* Stores assets as AES-256-GCM encrypted files with PBKDF2 key derivation.
|
|
18
|
+
* Cache keys are hashed with SHA-256 to produce safe filenames.
|
|
19
|
+
*
|
|
20
|
+
* All public methods are designed to never throw - cache failures are
|
|
21
|
+
* silently handled since caching is a non-critical optimization.
|
|
22
|
+
*/
|
|
23
|
+
import { mkdir, writeFile, readFile, rm, readdir } from 'node:fs/promises';
|
|
24
|
+
import { join } from 'node:path';
|
|
25
|
+
import { createHash } from 'node:crypto';
|
|
26
|
+
import { encrypt, decrypt } from './crypto-utils.js';
|
|
27
|
+
// ── Constants ────────────────────────────────────────────────────────────
|
|
28
|
+
const CACHE_FILE_EXTENSION = '.enc';
|
|
29
|
+
// ── EncryptedCache Implementation ────────────────────────────────────────
|
|
30
|
+
export class EncryptedCache {
|
|
31
|
+
cacheDir;
|
|
32
|
+
passphrase;
|
|
33
|
+
initPromise = null;
|
|
34
|
+
constructor(options) {
|
|
35
|
+
this.cacheDir = options.cacheDir;
|
|
36
|
+
this.passphrase = options.passphrase;
|
|
37
|
+
}
|
|
38
|
+
async get(key) {
|
|
39
|
+
try {
|
|
40
|
+
const filePath = this.keyToPath(key);
|
|
41
|
+
const raw = await readFile(filePath, 'utf8');
|
|
42
|
+
const result = decrypt(raw, this.passphrase);
|
|
43
|
+
if (result.expired) {
|
|
44
|
+
// Clean up expired entry (fire-and-forget)
|
|
45
|
+
rm(filePath, { force: true }).catch(() => { });
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return result.plaintext;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async set(key, value, ttlMs) {
|
|
55
|
+
try {
|
|
56
|
+
await this.ensureDir();
|
|
57
|
+
const filePath = this.keyToPath(key);
|
|
58
|
+
const encrypted = encrypt(value, this.passphrase, ttlMs);
|
|
59
|
+
await writeFile(filePath, encrypted, 'utf8');
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Cache write failures are non-critical
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async clear() {
|
|
66
|
+
try {
|
|
67
|
+
const entries = await readdir(this.cacheDir).catch(() => []);
|
|
68
|
+
const removals = entries
|
|
69
|
+
.filter((entry) => entry.endsWith(CACHE_FILE_EXTENSION))
|
|
70
|
+
.map((entry) => rm(join(this.cacheDir, entry), { force: true }).catch(() => { }));
|
|
71
|
+
await Promise.all(removals);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Clear failures are non-critical
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// ── Private Methods ─────────────────────────────────────────────────
|
|
78
|
+
keyToPath(key) {
|
|
79
|
+
const hash = createHash('sha256').update(key).digest('hex');
|
|
80
|
+
return join(this.cacheDir, `${hash}${CACHE_FILE_EXTENSION}`);
|
|
81
|
+
}
|
|
82
|
+
ensureDir() {
|
|
83
|
+
if (!this.initPromise) {
|
|
84
|
+
this.initPromise = mkdir(this.cacheDir, { recursive: true }).then(() => undefined).catch((err) => {
|
|
85
|
+
this.initPromise = null; // allow retry on next call
|
|
86
|
+
throw err;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return this.initPromise;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=encrypted-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypted-cache.js","sourceRoot":"","sources":["../../src/cache/encrypted-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
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
|
+
export { EncryptedCache, type EncryptedCacheOptions } from './encrypted-cache.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
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
|
+
export { EncryptedCache } from './encrypted-cache.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAA8B,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @license FSL-1.1
|
|
4
|
+
* Copyright (c) 2026 OrNexus AI
|
|
5
|
+
*
|
|
6
|
+
* This file is part of Neocortex CLI, licensed under the
|
|
7
|
+
* Functional Source License, Version 1.1 (FSL-1.1).
|
|
8
|
+
*
|
|
9
|
+
* Change Date: February 20, 2029
|
|
10
|
+
* Change License: MIT
|
|
11
|
+
*
|
|
12
|
+
* See the LICENSE file in the project root for full license text.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @license FSL-1.1
|
|
4
|
+
* Copyright (c) 2026 OrNexus AI
|
|
5
|
+
*
|
|
6
|
+
* This file is part of Neocortex CLI, licensed under the
|
|
7
|
+
* Functional Source License, Version 1.1 (FSL-1.1).
|
|
8
|
+
*
|
|
9
|
+
* Change Date: February 20, 2029
|
|
10
|
+
* Change License: MIT
|
|
11
|
+
*
|
|
12
|
+
* See the LICENSE file in the project root for full license text.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* @neocortex/client - CLI Entry Point
|
|
16
|
+
*
|
|
17
|
+
* Routes subcommands to their respective handlers:
|
|
18
|
+
* neocortex-client invoke --args "..."
|
|
19
|
+
* neocortex-client activate NX-PRO-xxx
|
|
20
|
+
* neocortex-client cache-status
|
|
21
|
+
* neocortex-client --help
|
|
22
|
+
* neocortex-client --version
|
|
23
|
+
*
|
|
24
|
+
* Story 46.2 - AC1-AC7
|
|
25
|
+
*/
|
|
26
|
+
import { readFileSync } from 'node:fs';
|
|
27
|
+
import { fileURLToPath } from 'node:url';
|
|
28
|
+
import { dirname, join } from 'node:path';
|
|
29
|
+
// ── Version Resolution ─────────────────────────────────────────────────────
|
|
30
|
+
function getVersion() {
|
|
31
|
+
try {
|
|
32
|
+
// Walk up from dist/cli.js to find the root package.json
|
|
33
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
34
|
+
let dir = dirname(thisFile);
|
|
35
|
+
// Try up to 5 levels
|
|
36
|
+
for (let i = 0; i < 5; i++) {
|
|
37
|
+
try {
|
|
38
|
+
const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8'));
|
|
39
|
+
if (pkg.name === '@ornexus/neocortex' || pkg.name === '@neocortex/client') {
|
|
40
|
+
return pkg.version ?? '0.0.0';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// no package.json at this level
|
|
45
|
+
}
|
|
46
|
+
dir = dirname(dir);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// fallback
|
|
51
|
+
}
|
|
52
|
+
return '0.0.0';
|
|
53
|
+
}
|
|
54
|
+
// ── Help Text ──────────────────────────────────────────────────────────────
|
|
55
|
+
const HELP_TEXT = `
|
|
56
|
+
neocortex-client - Neocortex Client CLI
|
|
57
|
+
|
|
58
|
+
Usage:
|
|
59
|
+
neocortex-client <command> [options]
|
|
60
|
+
|
|
61
|
+
Commands:
|
|
62
|
+
invoke Send orchestration request to server
|
|
63
|
+
activate Activate license key
|
|
64
|
+
cache-status Show cache and circuit breaker status
|
|
65
|
+
|
|
66
|
+
Options:
|
|
67
|
+
--help, -h Show this help message
|
|
68
|
+
--version, -v Show version number
|
|
69
|
+
|
|
70
|
+
Invoke Options:
|
|
71
|
+
--args <string> Raw args to send (e.g., "*yolo @docs/stories/1.1.story.md")
|
|
72
|
+
--project-root <path> Project root directory (default: cwd)
|
|
73
|
+
--format <type> Output format: json | plain (default: plain)
|
|
74
|
+
--server-url <url> Server URL override
|
|
75
|
+
|
|
76
|
+
Activate Options:
|
|
77
|
+
<license-key> License key (e.g., NX-PRO-ABC-123)
|
|
78
|
+
--server-url <url> Server URL override
|
|
79
|
+
--non-interactive Skip interactive prompts
|
|
80
|
+
|
|
81
|
+
Examples:
|
|
82
|
+
neocortex-client invoke --args "*status"
|
|
83
|
+
neocortex-client invoke --args "*yolo @docs/stories/1.1.story.md" --format json
|
|
84
|
+
neocortex-client activate NX-PRO-ABC-123
|
|
85
|
+
neocortex-client cache-status
|
|
86
|
+
`.trim();
|
|
87
|
+
// ── Main ───────────────────────────────────────────────────────────────────
|
|
88
|
+
async function main() {
|
|
89
|
+
const args = process.argv.slice(2);
|
|
90
|
+
const command = args[0];
|
|
91
|
+
if (!command || command === '--help' || command === '-h') {
|
|
92
|
+
console.log(HELP_TEXT);
|
|
93
|
+
process.exit(0);
|
|
94
|
+
}
|
|
95
|
+
if (command === '--version' || command === '-v') {
|
|
96
|
+
console.log(getVersion());
|
|
97
|
+
process.exit(0);
|
|
98
|
+
}
|
|
99
|
+
const subArgs = args.slice(1);
|
|
100
|
+
switch (command) {
|
|
101
|
+
case 'invoke': {
|
|
102
|
+
const { invokeCliHandler } = await import('./commands/invoke.js');
|
|
103
|
+
const exitCode = await invokeCliHandler(subArgs);
|
|
104
|
+
process.exit(exitCode);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
case 'activate': {
|
|
108
|
+
const { activate } = await import('./commands/activate.js');
|
|
109
|
+
// Parse activate args
|
|
110
|
+
let licenseKey;
|
|
111
|
+
let serverUrl;
|
|
112
|
+
let nonInteractive = false;
|
|
113
|
+
for (let i = 0; i < subArgs.length; i++) {
|
|
114
|
+
const arg = subArgs[i];
|
|
115
|
+
if (arg === '--server-url') {
|
|
116
|
+
serverUrl = subArgs[++i];
|
|
117
|
+
}
|
|
118
|
+
else if (arg === '--non-interactive') {
|
|
119
|
+
nonInteractive = true;
|
|
120
|
+
}
|
|
121
|
+
else if (arg === '--help' || arg === '-h') {
|
|
122
|
+
console.log(HELP_TEXT);
|
|
123
|
+
process.exit(0);
|
|
124
|
+
}
|
|
125
|
+
else if (!arg.startsWith('-')) {
|
|
126
|
+
licenseKey = arg;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (!licenseKey) {
|
|
130
|
+
console.error('Error: License key is required.');
|
|
131
|
+
console.error('Usage: neocortex-client activate <license-key>');
|
|
132
|
+
console.error('Example: neocortex-client activate NX-PRO-ABC-123');
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
const result = await activate({
|
|
137
|
+
licenseKey,
|
|
138
|
+
serverUrl,
|
|
139
|
+
nonInteractive,
|
|
140
|
+
});
|
|
141
|
+
if (result.success) {
|
|
142
|
+
console.log(result.message);
|
|
143
|
+
if (result.tier) {
|
|
144
|
+
console.log(`Tier: ${result.tier}`);
|
|
145
|
+
}
|
|
146
|
+
if (result.configPath) {
|
|
147
|
+
console.log(`Config: ${result.configPath}`);
|
|
148
|
+
}
|
|
149
|
+
process.exit(0);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
console.error(result.message);
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
158
|
+
console.error(`Activation failed: ${message}`);
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
case 'cache-status': {
|
|
164
|
+
// cache-status requires initialized circuit breaker and telemetry queue.
|
|
165
|
+
// For CLI use, we provide a simplified status report.
|
|
166
|
+
console.log('Cache status requires an active client session.');
|
|
167
|
+
console.log('Use this command within a running Neocortex client context.');
|
|
168
|
+
process.exit(0);
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
default: {
|
|
172
|
+
console.error(`Unknown command: ${command}`);
|
|
173
|
+
console.error('Run "neocortex-client --help" for usage information.');
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
main().catch((err) => {
|
|
179
|
+
console.error(`Fatal error: ${err instanceof Error ? err.message : String(err)}`);
|
|
180
|
+
process.exit(1);
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
+
export interface ActivateOptions {
|
|
14
|
+
/** License key to activate (e.g., NX-PRO-ABC-123) */
|
|
15
|
+
readonly licenseKey?: string;
|
|
16
|
+
/** Server URL override (default: production server) */
|
|
17
|
+
readonly serverUrl?: string;
|
|
18
|
+
/** Skip interactive prompt */
|
|
19
|
+
readonly nonInteractive?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface ActivateResult {
|
|
22
|
+
readonly success: boolean;
|
|
23
|
+
readonly message: string;
|
|
24
|
+
readonly tier?: string;
|
|
25
|
+
readonly serverUrl?: string;
|
|
26
|
+
readonly configPath?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate license key format.
|
|
30
|
+
* Format: NX-{TIER}-{random}-{random}
|
|
31
|
+
* Tiers: FREE, PRO, ENT
|
|
32
|
+
*/
|
|
33
|
+
export declare function validateLicenseKeyFormat(key: string): {
|
|
34
|
+
valid: boolean;
|
|
35
|
+
error?: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Activate a Neocortex license.
|
|
39
|
+
*
|
|
40
|
+
* Flow:
|
|
41
|
+
* 1. Validate license key format
|
|
42
|
+
* 2. Call IP Protection Server to activate
|
|
43
|
+
* 3. Cache JWT token via LicenseClient
|
|
44
|
+
* 4. Create/update ~/.neocortex/config.json
|
|
45
|
+
* 5. Return result with feedback
|
|
46
|
+
*/
|
|
47
|
+
export declare function activate(options: ActivateOptions): Promise<ActivateResult>;
|
|
48
|
+
//# sourceMappingURL=activate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activate.d.ts","sourceRoot":"","sources":["../../src/commands/activate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA8BH,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;AAYD;;;;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,CAuGhF"}
|