@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,219 @@
|
|
|
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 - LocalResolver
|
|
15
|
+
*
|
|
16
|
+
* Resolves pipeline assets from the local filesystem.
|
|
17
|
+
* Used in development mode when core/ directory is available locally.
|
|
18
|
+
* Replicates the current CLI behavior of reading .md files directly.
|
|
19
|
+
*/
|
|
20
|
+
import { readFile, access } from 'node:fs/promises';
|
|
21
|
+
import { join, resolve } from 'node:path';
|
|
22
|
+
import { ResolverMode, } from '../types/index.js';
|
|
23
|
+
// ── Frontmatter Parser ───────────────────────────────────────────────────
|
|
24
|
+
const FRONTMATTER_REGEX = /^---\n([\s\S]*?)\n---/;
|
|
25
|
+
/**
|
|
26
|
+
* Parse YAML-like frontmatter from markdown content.
|
|
27
|
+
* Simple key-value parser sufficient for step/skill frontmatter.
|
|
28
|
+
*/
|
|
29
|
+
function parseFrontmatter(content) {
|
|
30
|
+
const match = content.match(FRONTMATTER_REGEX);
|
|
31
|
+
if (!match) {
|
|
32
|
+
return { frontmatter: {}, body: content };
|
|
33
|
+
}
|
|
34
|
+
const frontmatter = {};
|
|
35
|
+
const lines = match[1].split('\n');
|
|
36
|
+
for (const line of lines) {
|
|
37
|
+
const colonIndex = line.indexOf(':');
|
|
38
|
+
if (colonIndex === -1)
|
|
39
|
+
continue;
|
|
40
|
+
const key = line.slice(0, colonIndex).trim().replace(/^['"]|['"]$/g, '');
|
|
41
|
+
let value = line.slice(colonIndex + 1).trim();
|
|
42
|
+
// Remove surrounding quotes
|
|
43
|
+
if (typeof value === 'string') {
|
|
44
|
+
value = value.replace(/^['"]|['"]$/g, '');
|
|
45
|
+
}
|
|
46
|
+
// Parse booleans
|
|
47
|
+
if (value === 'true')
|
|
48
|
+
value = true;
|
|
49
|
+
else if (value === 'false')
|
|
50
|
+
value = false;
|
|
51
|
+
frontmatter[key] = value;
|
|
52
|
+
}
|
|
53
|
+
const body = content.slice(match[0].length).trimStart();
|
|
54
|
+
return { frontmatter, body };
|
|
55
|
+
}
|
|
56
|
+
// ── Step ID to File Path Mapping ─────────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* Map step ID to file path within core/steps/.
|
|
59
|
+
*
|
|
60
|
+
* Step IDs follow the pattern: step-{category}-{order}-{name}
|
|
61
|
+
* File paths: core/steps/steps-{category}/{id}.md
|
|
62
|
+
*/
|
|
63
|
+
function stepIdToPath(stepId) {
|
|
64
|
+
// Extract category from step ID: step-c-01-setup-branch -> c
|
|
65
|
+
// step-r-fix-blocked -> r, step-u-init -> u, step-p-01-idea-diagnose -> p, step-e-01-epic-init -> e
|
|
66
|
+
const parts = stepId.split('-');
|
|
67
|
+
if (parts.length < 3) {
|
|
68
|
+
throw new Error(`Invalid step ID format: ${stepId}`);
|
|
69
|
+
}
|
|
70
|
+
const category = parts[1]; // c, r, u, p, e
|
|
71
|
+
const categoryMap = {
|
|
72
|
+
c: 'steps-c',
|
|
73
|
+
r: 'steps-r',
|
|
74
|
+
u: 'steps-u',
|
|
75
|
+
p: 'steps-p',
|
|
76
|
+
e: 'steps-e',
|
|
77
|
+
};
|
|
78
|
+
const dir = categoryMap[category];
|
|
79
|
+
if (!dir) {
|
|
80
|
+
throw new Error(`Unknown step category '${category}' in step ID: ${stepId}`);
|
|
81
|
+
}
|
|
82
|
+
return `core/steps/${dir}/${stepId}.md`;
|
|
83
|
+
}
|
|
84
|
+
// ── LocalResolver Implementation ─────────────────────────────────────────
|
|
85
|
+
export class LocalResolver {
|
|
86
|
+
mode = ResolverMode.LOCAL;
|
|
87
|
+
projectRoot;
|
|
88
|
+
constructor(options) {
|
|
89
|
+
this.projectRoot = resolve(options.projectRoot);
|
|
90
|
+
}
|
|
91
|
+
async resolveStep(stepId, _context) {
|
|
92
|
+
const relativePath = stepIdToPath(stepId);
|
|
93
|
+
const fullPath = join(this.projectRoot, relativePath);
|
|
94
|
+
const raw = await readFile(fullPath, 'utf-8');
|
|
95
|
+
const { frontmatter, body } = parseFrontmatter(raw);
|
|
96
|
+
return {
|
|
97
|
+
id: stepId,
|
|
98
|
+
content: body,
|
|
99
|
+
frontmatter,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
async resolveSkill(skillId, _context) {
|
|
103
|
+
// Skills are organized in: core/skills/{category}/{skillId}.md
|
|
104
|
+
// or: core/skills/step-skills/{step}/{skillId}.md
|
|
105
|
+
// Try multiple paths to find the skill
|
|
106
|
+
const searchPaths = [
|
|
107
|
+
`core/skills/${skillId}.md`,
|
|
108
|
+
`core/skills/step-skills/${skillId}.md`,
|
|
109
|
+
];
|
|
110
|
+
// Also try with nested path: "diagnose/prompt-enricher" -> core/skills/step-skills/diagnose/prompt-enricher.md
|
|
111
|
+
if (skillId.includes('/')) {
|
|
112
|
+
searchPaths.unshift(`core/skills/step-skills/${skillId}.md`);
|
|
113
|
+
searchPaths.unshift(`core/skills/${skillId}.md`);
|
|
114
|
+
}
|
|
115
|
+
let raw = null;
|
|
116
|
+
let resolvedPath = '';
|
|
117
|
+
for (const searchPath of searchPaths) {
|
|
118
|
+
const fullPath = join(this.projectRoot, searchPath);
|
|
119
|
+
try {
|
|
120
|
+
raw = await readFile(fullPath, 'utf-8');
|
|
121
|
+
resolvedPath = searchPath;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Try next path
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (raw === null) {
|
|
129
|
+
throw new Error(`Skill '${skillId}' not found. Searched: ${searchPaths.join(', ')}`);
|
|
130
|
+
}
|
|
131
|
+
const { frontmatter, body } = parseFrontmatter(raw);
|
|
132
|
+
return {
|
|
133
|
+
id: skillId,
|
|
134
|
+
content: body,
|
|
135
|
+
metadata: { ...frontmatter, resolvedPath },
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
async resolveStandard(standardId) {
|
|
139
|
+
const fullPath = join(this.projectRoot, 'core', 'standards', standardId);
|
|
140
|
+
let content;
|
|
141
|
+
try {
|
|
142
|
+
content = await readFile(fullPath, 'utf-8');
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Try with .md extension if not present
|
|
146
|
+
if (!standardId.endsWith('.md')) {
|
|
147
|
+
content = await readFile(`${fullPath}.md`, 'utf-8');
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
throw new Error(`Standard '${standardId}' not found at ${fullPath}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
id: standardId,
|
|
155
|
+
content,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
async resolveRegistry() {
|
|
159
|
+
const fullPath = join(this.projectRoot, 'core', 'data', 'step-registry.json');
|
|
160
|
+
const raw = await readFile(fullPath, 'utf-8');
|
|
161
|
+
return JSON.parse(raw);
|
|
162
|
+
}
|
|
163
|
+
async assemblePrompt(stepId, context) {
|
|
164
|
+
// Resolve the step content
|
|
165
|
+
const step = await this.resolveStep(stepId, context);
|
|
166
|
+
// Build variables map from context
|
|
167
|
+
const variables = {
|
|
168
|
+
'{story_id}': context.storyId,
|
|
169
|
+
'{story_title}': context.storyTitle,
|
|
170
|
+
'{step_id}': stepId,
|
|
171
|
+
'{step_name}': step.frontmatter['name'] || stepId,
|
|
172
|
+
'{current_status}': context.currentStatus,
|
|
173
|
+
'{epic_id}': context.epicId,
|
|
174
|
+
'{branch_name}': context.branchName,
|
|
175
|
+
'{platform_target}': context.platformTarget,
|
|
176
|
+
};
|
|
177
|
+
// Substitute variables in step content
|
|
178
|
+
let prompt = step.content;
|
|
179
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
180
|
+
prompt = prompt.replaceAll(key, value);
|
|
181
|
+
}
|
|
182
|
+
// Resolve skills referenced in step frontmatter
|
|
183
|
+
const includedSkills = [];
|
|
184
|
+
const skillsRef = step.frontmatter['skills'];
|
|
185
|
+
if (skillsRef && typeof skillsRef === 'string') {
|
|
186
|
+
const skillIds = skillsRef.split(',').map((s) => s.trim());
|
|
187
|
+
for (const sid of skillIds) {
|
|
188
|
+
try {
|
|
189
|
+
const skill = await this.resolveSkill(sid, context);
|
|
190
|
+
prompt += `\n\n---\n\n# Skill: ${sid}\n\n${skill.content}`;
|
|
191
|
+
includedSkills.push(sid);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Skill not found - skip
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
prompt,
|
|
200
|
+
variables,
|
|
201
|
+
includedSkills,
|
|
202
|
+
includedStandards: [],
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
async isAvailable() {
|
|
206
|
+
try {
|
|
207
|
+
const corePath = join(this.projectRoot, 'core');
|
|
208
|
+
await access(corePath);
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
async dispose() {
|
|
216
|
+
// LocalResolver holds no resources to release
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=local-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-resolver.js","sourceRoot":"","sources":["../../src/resolvers/local-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
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 - RemoteResolver
|
|
15
|
+
*
|
|
16
|
+
* Resolves pipeline assets from the IP Protection Server via HTTP API.
|
|
17
|
+
* Used in production mode when core/ directory is not available locally.
|
|
18
|
+
* Supports retry with exponential backoff, timeouts, and cache fallback.
|
|
19
|
+
*/
|
|
20
|
+
import type { AssetResolver } from './asset-resolver.js';
|
|
21
|
+
import { ResolverMode, type AssembledPrompt, type PipelineContext, type RemoteResolverOptions, type SkillContent, type StandardContent, type StepContent, type StepRegistry } from '../types/index.js';
|
|
22
|
+
export declare class RemoteResolverError extends Error {
|
|
23
|
+
readonly statusCode?: number | undefined;
|
|
24
|
+
readonly endpoint?: string | undefined;
|
|
25
|
+
constructor(message: string, statusCode?: number | undefined, endpoint?: string | undefined);
|
|
26
|
+
}
|
|
27
|
+
export declare class RemoteResolver implements AssetResolver {
|
|
28
|
+
readonly mode = ResolverMode.REMOTE;
|
|
29
|
+
private readonly serverUrl;
|
|
30
|
+
private readonly licenseKey;
|
|
31
|
+
private readonly timeout;
|
|
32
|
+
private readonly retryCount;
|
|
33
|
+
private readonly cache;
|
|
34
|
+
private readonly licenseClient;
|
|
35
|
+
constructor(options: RemoteResolverOptions);
|
|
36
|
+
resolveStep(stepId: string, _context: PipelineContext): Promise<StepContent>;
|
|
37
|
+
resolveSkill(skillId: string, _context: PipelineContext): Promise<SkillContent>;
|
|
38
|
+
resolveStandard(standardId: string): Promise<StandardContent>;
|
|
39
|
+
resolveRegistry(): Promise<StepRegistry>;
|
|
40
|
+
assemblePrompt(stepId: string, context: PipelineContext): Promise<AssembledPrompt>;
|
|
41
|
+
isAvailable(): Promise<boolean>;
|
|
42
|
+
dispose(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Build authorization headers for API requests.
|
|
45
|
+
* When a LicenseClient is available, uses JWT token from it.
|
|
46
|
+
* Falls back to raw licenseKey if no LicenseClient or token unavailable.
|
|
47
|
+
*/
|
|
48
|
+
private buildHeaders;
|
|
49
|
+
/**
|
|
50
|
+
* Execute HTTP request with retry and exponential backoff.
|
|
51
|
+
*/
|
|
52
|
+
private fetchWithRetry;
|
|
53
|
+
/**
|
|
54
|
+
* Fetch with cache fallback: try HTTP first, fall back to cache on failure.
|
|
55
|
+
* On successful HTTP response, update the cache.
|
|
56
|
+
*/
|
|
57
|
+
private fetchWithCacheFallback;
|
|
58
|
+
/**
|
|
59
|
+
* Sleep for the specified duration.
|
|
60
|
+
*/
|
|
61
|
+
private sleep;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=remote-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-resolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/remote-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,YAAY,EAEZ,KAAK,eAAe,EAEpB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAY3B,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,UAAU,CAAC,EAAE,MAAM;aACnB,QAAQ,CAAC,EAAE,MAAM;gBAFjC,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,QAAQ,CAAC,EAAE,MAAM,YAAA;CAKpC;AAaD,qBAAa,cAAe,YAAW,aAAa;IAClD,QAAQ,CAAC,IAAI,uBAAuB;IAEpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuB;gBAEzC,OAAO,EAAE,qBAAqB;IASpC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ5E,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ/E,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQ7D,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC;IAQxC,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,eAAe,CAAC;IAYrB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAkB/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B;;;;OAIG;YACW,YAAY;IAiB1B;;OAEG;YACW,cAAc;IAwE5B;;;OAGG;YACW,sBAAsB;IA4BpC;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,207 @@
|
|
|
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 { ResolverMode, NoOpCache, } from '../types/index.js';
|
|
14
|
+
// ── Constants ────────────────────────────────────────────────────────────
|
|
15
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
16
|
+
const DEFAULT_RETRY_COUNT = 3;
|
|
17
|
+
const BACKOFF_BASE_MS = 1_000;
|
|
18
|
+
const BACKOFF_MAX_MS = 10_000;
|
|
19
|
+
// ── Error Types ──────────────────────────────────────────────────────────
|
|
20
|
+
export class RemoteResolverError extends Error {
|
|
21
|
+
statusCode;
|
|
22
|
+
endpoint;
|
|
23
|
+
constructor(message, statusCode, endpoint) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.statusCode = statusCode;
|
|
26
|
+
this.endpoint = endpoint;
|
|
27
|
+
this.name = 'RemoteResolverError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// ── RemoteResolver Implementation ───────────────────────────────────────
|
|
31
|
+
export class RemoteResolver {
|
|
32
|
+
mode = ResolverMode.REMOTE;
|
|
33
|
+
serverUrl;
|
|
34
|
+
licenseKey;
|
|
35
|
+
timeout;
|
|
36
|
+
retryCount;
|
|
37
|
+
cache;
|
|
38
|
+
licenseClient;
|
|
39
|
+
constructor(options) {
|
|
40
|
+
this.serverUrl = options.serverUrl.replace(/\/+$/, '');
|
|
41
|
+
this.licenseKey = options.licenseKey;
|
|
42
|
+
this.timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
43
|
+
this.retryCount = options.retryCount ?? DEFAULT_RETRY_COUNT;
|
|
44
|
+
this.cache = options.cacheProvider ?? new NoOpCache();
|
|
45
|
+
this.licenseClient = options.licenseClient ?? null;
|
|
46
|
+
}
|
|
47
|
+
async resolveStep(stepId, _context) {
|
|
48
|
+
const cacheKey = `step:${stepId}`;
|
|
49
|
+
return this.fetchWithCacheFallback(cacheKey, {
|
|
50
|
+
method: 'GET',
|
|
51
|
+
path: `/api/v1/steps/${encodeURIComponent(stepId)}`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async resolveSkill(skillId, _context) {
|
|
55
|
+
const cacheKey = `skill:${skillId}`;
|
|
56
|
+
return this.fetchWithCacheFallback(cacheKey, {
|
|
57
|
+
method: 'GET',
|
|
58
|
+
path: `/api/v1/skills/${encodeURIComponent(skillId)}`,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async resolveStandard(standardId) {
|
|
62
|
+
const cacheKey = `standard:${standardId}`;
|
|
63
|
+
return this.fetchWithCacheFallback(cacheKey, {
|
|
64
|
+
method: 'GET',
|
|
65
|
+
path: `/api/v1/standards/${encodeURIComponent(standardId)}`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async resolveRegistry() {
|
|
69
|
+
const cacheKey = 'registry';
|
|
70
|
+
return this.fetchWithCacheFallback(cacheKey, {
|
|
71
|
+
method: 'GET',
|
|
72
|
+
path: '/api/v1/registry',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async assemblePrompt(stepId, context) {
|
|
76
|
+
// assemblePrompt is not cached because it depends on dynamic context
|
|
77
|
+
return this.fetchWithRetry({
|
|
78
|
+
method: 'POST',
|
|
79
|
+
path: '/api/v1/prompts/assemble',
|
|
80
|
+
body: {
|
|
81
|
+
stepId,
|
|
82
|
+
context,
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async isAvailable() {
|
|
87
|
+
try {
|
|
88
|
+
const controller = new AbortController();
|
|
89
|
+
const timeoutId = setTimeout(() => controller.abort(), 5_000);
|
|
90
|
+
const response = await fetch(`${this.serverUrl}/api/v1/health`, {
|
|
91
|
+
method: 'GET',
|
|
92
|
+
headers: await this.buildHeaders(),
|
|
93
|
+
signal: controller.signal,
|
|
94
|
+
});
|
|
95
|
+
clearTimeout(timeoutId);
|
|
96
|
+
return response.ok;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async dispose() {
|
|
103
|
+
await this.cache.clear();
|
|
104
|
+
}
|
|
105
|
+
// ── Private Methods ─────────────────────────────────────────────────
|
|
106
|
+
/**
|
|
107
|
+
* Build authorization headers for API requests.
|
|
108
|
+
* When a LicenseClient is available, uses JWT token from it.
|
|
109
|
+
* Falls back to raw licenseKey if no LicenseClient or token unavailable.
|
|
110
|
+
*/
|
|
111
|
+
async buildHeaders() {
|
|
112
|
+
let authToken = this.licenseKey;
|
|
113
|
+
if (this.licenseClient) {
|
|
114
|
+
const jwt = await this.licenseClient.getToken();
|
|
115
|
+
if (jwt) {
|
|
116
|
+
authToken = jwt;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
'Content-Type': 'application/json',
|
|
121
|
+
'Authorization': `Bearer ${authToken}`,
|
|
122
|
+
'X-Client-Version': '0.1.0',
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Execute HTTP request with retry and exponential backoff.
|
|
127
|
+
*/
|
|
128
|
+
async fetchWithRetry(options) {
|
|
129
|
+
let lastError;
|
|
130
|
+
for (let attempt = 0; attempt <= this.retryCount; attempt++) {
|
|
131
|
+
try {
|
|
132
|
+
const controller = new AbortController();
|
|
133
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
134
|
+
const url = `${this.serverUrl}${options.path}`;
|
|
135
|
+
const fetchOptions = {
|
|
136
|
+
method: options.method,
|
|
137
|
+
headers: await this.buildHeaders(),
|
|
138
|
+
signal: controller.signal,
|
|
139
|
+
};
|
|
140
|
+
if (options.body) {
|
|
141
|
+
fetchOptions.body = JSON.stringify(options.body);
|
|
142
|
+
}
|
|
143
|
+
const response = await fetch(url, fetchOptions);
|
|
144
|
+
clearTimeout(timeoutId);
|
|
145
|
+
if (!response.ok) {
|
|
146
|
+
const errorBody = await response.text().catch(() => 'Unknown error');
|
|
147
|
+
// Don't retry on 4xx client errors (except 429 rate limit)
|
|
148
|
+
if (response.status >= 400 && response.status < 500 && response.status !== 429) {
|
|
149
|
+
throw new RemoteResolverError(`API error: ${response.status} ${response.statusText} - ${errorBody}`, response.status, options.path);
|
|
150
|
+
}
|
|
151
|
+
// Retry on 5xx server errors and 429 rate limit
|
|
152
|
+
throw new RemoteResolverError(`Server error: ${response.status} ${response.statusText}`, response.status, options.path);
|
|
153
|
+
}
|
|
154
|
+
return (await response.json());
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
158
|
+
// Don't retry on non-retryable errors
|
|
159
|
+
if (error instanceof RemoteResolverError && error.statusCode && error.statusCode >= 400 && error.statusCode < 500 && error.statusCode !== 429) {
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
162
|
+
// Apply backoff before next retry (except on last attempt)
|
|
163
|
+
if (attempt < this.retryCount) {
|
|
164
|
+
const backoff = Math.min(BACKOFF_BASE_MS * Math.pow(2, attempt), BACKOFF_MAX_MS);
|
|
165
|
+
// Add jitter (0-25% of backoff)
|
|
166
|
+
const jitter = Math.random() * backoff * 0.25;
|
|
167
|
+
await this.sleep(backoff + jitter);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
throw lastError ?? new RemoteResolverError('All retry attempts failed', undefined, options.path);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Fetch with cache fallback: try HTTP first, fall back to cache on failure.
|
|
175
|
+
* On successful HTTP response, update the cache.
|
|
176
|
+
*/
|
|
177
|
+
async fetchWithCacheFallback(cacheKey, options) {
|
|
178
|
+
try {
|
|
179
|
+
const result = await this.fetchWithRetry(options);
|
|
180
|
+
// Update cache with fresh data (fire-and-forget)
|
|
181
|
+
this.cache.set(cacheKey, JSON.stringify(result)).catch(() => {
|
|
182
|
+
// Cache write failures are non-critical
|
|
183
|
+
});
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
// Try cache fallback
|
|
188
|
+
const cached = await this.cache.get(cacheKey);
|
|
189
|
+
if (cached !== null) {
|
|
190
|
+
try {
|
|
191
|
+
return JSON.parse(cached);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Invalid cache data, rethrow original error
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Sleep for the specified duration.
|
|
202
|
+
*/
|
|
203
|
+
sleep(ms) {
|
|
204
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=remote-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-resolver.js","sourceRoot":"","sources":["../../src/resolvers/remote-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAA4E,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
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 TelemetryEvent {
|
|
14
|
+
type: string;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
data: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface QueueConfig {
|
|
19
|
+
/** Path to queue file. Default: ~/.neocortex/.telemetry-queue */
|
|
20
|
+
queueFilePath: string;
|
|
21
|
+
/** Maximum number of events in queue. Default: 1000 */
|
|
22
|
+
maxEvents: number;
|
|
23
|
+
/** Maximum queue file size in bytes. Default: 5_242_880 (5MB) */
|
|
24
|
+
maxSizeBytes: number;
|
|
25
|
+
}
|
|
26
|
+
export interface QueueStats {
|
|
27
|
+
count: number;
|
|
28
|
+
sizeBytes: number;
|
|
29
|
+
}
|
|
30
|
+
export interface FlushResult {
|
|
31
|
+
sent: number;
|
|
32
|
+
failed: number;
|
|
33
|
+
}
|
|
34
|
+
export declare class OfflineTelemetryQueue {
|
|
35
|
+
private readonly config;
|
|
36
|
+
constructor(config?: Partial<QueueConfig>);
|
|
37
|
+
/**
|
|
38
|
+
* Add a telemetry event to the queue.
|
|
39
|
+
* Evicts oldest events if limits are reached.
|
|
40
|
+
*/
|
|
41
|
+
enqueue(event: TelemetryEvent): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Flush all queued events using the provided send function.
|
|
44
|
+
* Returns count of sent and failed events.
|
|
45
|
+
*/
|
|
46
|
+
flush(sendFn: (events: TelemetryEvent[]) => Promise<boolean>): Promise<FlushResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Get queue statistics.
|
|
49
|
+
*/
|
|
50
|
+
getStats(): Promise<QueueStats>;
|
|
51
|
+
/**
|
|
52
|
+
* Clear all queued events.
|
|
53
|
+
*/
|
|
54
|
+
clear(): Promise<void>;
|
|
55
|
+
private loadQueue;
|
|
56
|
+
private saveQueue;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=offline-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline-queue.d.ts","sourceRoot":"","sources":["../../src/telemetry/offline-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAmBH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAYD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAEzB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;IAIzC;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBnD;;;OAGG;IACG,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAqBzF;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAarC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAUd,SAAS;YAWT,SAAS;CAUxB"}
|