@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,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* Cursor Adapter - Formats prompts as .cursorrules content.
|
|
6
|
+
*
|
|
7
|
+
* Cursor reads system instructions from .cursorrules files.
|
|
8
|
+
* This adapter produces concise, directive-style rules optimized
|
|
9
|
+
* for Cursor's instruction format.
|
|
10
|
+
*
|
|
11
|
+
* Story 42.8
|
|
12
|
+
*/
|
|
13
|
+
// ── Constants ───────────────────────────────────────────────────────────────
|
|
14
|
+
const TARGET_ID = 'cursor';
|
|
15
|
+
const MAX_CONTEXT_LENGTH = 100_000;
|
|
16
|
+
const CAPABILITIES = {
|
|
17
|
+
supportsMarkdown: true,
|
|
18
|
+
supportsMultiFile: false,
|
|
19
|
+
supportsMultiTurn: true,
|
|
20
|
+
supportsTools: true,
|
|
21
|
+
maxContextLength: MAX_CONTEXT_LENGTH,
|
|
22
|
+
};
|
|
23
|
+
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Convert verbose markdown prose to concise directive-style rules.
|
|
26
|
+
* Strips excessive headers, converts paragraphs to bullet points.
|
|
27
|
+
*/
|
|
28
|
+
function condenseToCursorFormat(content) {
|
|
29
|
+
const lines = content.split('\n');
|
|
30
|
+
const result = [];
|
|
31
|
+
for (const line of lines) {
|
|
32
|
+
const trimmed = line.trim();
|
|
33
|
+
// Skip empty lines in sequences (collapse to single)
|
|
34
|
+
if (trimmed === '') {
|
|
35
|
+
if (result.length > 0 && result[result.length - 1] !== '') {
|
|
36
|
+
result.push('');
|
|
37
|
+
}
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
// Keep headers but reduce depth (### becomes ##)
|
|
41
|
+
if (trimmed.startsWith('#')) {
|
|
42
|
+
result.push(trimmed);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// Keep bullet points, code blocks, and directives
|
|
46
|
+
if (trimmed.startsWith('-') ||
|
|
47
|
+
trimmed.startsWith('*') ||
|
|
48
|
+
trimmed.startsWith('```') ||
|
|
49
|
+
trimmed.startsWith('>')) {
|
|
50
|
+
result.push(trimmed);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Inside code blocks, preserve as-is
|
|
54
|
+
if (result.length > 0 && isInsideCodeBlock(result)) {
|
|
55
|
+
result.push(line);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Convert standalone paragraphs to bullet points
|
|
59
|
+
if (trimmed.length > 0) {
|
|
60
|
+
result.push(`- ${trimmed}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return result.join('\n').trim();
|
|
64
|
+
}
|
|
65
|
+
function isInsideCodeBlock(lines) {
|
|
66
|
+
let openCount = 0;
|
|
67
|
+
for (const line of lines) {
|
|
68
|
+
if (line.trim().startsWith('```')) {
|
|
69
|
+
openCount++;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return openCount % 2 !== 0;
|
|
73
|
+
}
|
|
74
|
+
// ── Implementation ──────────────────────────────────────────────────────────
|
|
75
|
+
export class CursorAdapter {
|
|
76
|
+
formatPrompt(assembledPrompt, platformInstructions, config) {
|
|
77
|
+
const sections = [];
|
|
78
|
+
// Condense prompt for Cursor's concise format
|
|
79
|
+
const condensed = config.verbose === true
|
|
80
|
+
? assembledPrompt
|
|
81
|
+
: condenseToCursorFormat(assembledPrompt);
|
|
82
|
+
sections.push(condensed);
|
|
83
|
+
// Add tool hints if available
|
|
84
|
+
if (platformInstructions.tools && platformInstructions.tools.length > 0) {
|
|
85
|
+
sections.push('');
|
|
86
|
+
sections.push('## Tools');
|
|
87
|
+
for (const tool of platformInstructions.tools) {
|
|
88
|
+
sections.push(`- ${tool}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Add context files as references
|
|
92
|
+
if (platformInstructions.contextFiles && platformInstructions.contextFiles.length > 0) {
|
|
93
|
+
sections.push('');
|
|
94
|
+
sections.push('## Context');
|
|
95
|
+
for (const file of platformInstructions.contextFiles) {
|
|
96
|
+
sections.push(`- @${file}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
let result = sections.join('\n');
|
|
100
|
+
const maxLength = config.maxPromptLength ?? MAX_CONTEXT_LENGTH;
|
|
101
|
+
if (result.length > maxLength) {
|
|
102
|
+
result = result.slice(0, maxLength);
|
|
103
|
+
}
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
getTargetId() {
|
|
107
|
+
return TARGET_ID;
|
|
108
|
+
}
|
|
109
|
+
getCapabilities() {
|
|
110
|
+
return CAPABILITIES;
|
|
111
|
+
}
|
|
112
|
+
getInjectionMethod() {
|
|
113
|
+
return 'file';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=cursor-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-adapter.js","sourceRoot":"","sources":["../../src/adapters/cursor-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,+EAA+E;AAE/E,MAAM,SAAS,GAAG,QAAQ,CAAC;AAC3B,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC,MAAM,YAAY,GAAuB;IACvC,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,KAAK;IACxB,iBAAiB,EAAE,IAAI;IACvB,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,kBAAkB;CACrC,CAAC;AAEF,+EAA+E;AAE/E;;;GAGG;AACH,SAAS,sBAAsB,CAAC,OAAe;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,qDAAqD;QACrD,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;YACD,SAAS;QACX,CAAC;QAED,iDAAiD;QACjD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QAED,kDAAkD;QAClD,IACE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YACvB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YACvB,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;YACzB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EACvB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QAED,qCAAqC;QACrC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,iDAAiD;QACjD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAe;IACxC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,+EAA+E;AAE/E,MAAM,OAAO,aAAa;IACxB,YAAY,CACV,eAAuB,EACvB,oBAA0C,EAC1C,MAAoB;QAEpB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,8CAA8C;QAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,KAAK,IAAI;YACvC,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC;QAE5C,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEzB,8BAA8B;QAC9B,IAAI,oBAAoB,CAAC,KAAK,IAAI,oBAAoB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,KAAK,EAAE,CAAC;gBAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,IAAI,oBAAoB,CAAC,YAAY,IAAI,oBAAoB,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5B,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,YAAY,EAAE,CAAC;gBACrD,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjC,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,IAAI,kBAAkB,CAAC;QAC/D,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC9B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,WAAW;QACT,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe;QACb,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,kBAAkB;QAChB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* Gemini CLI Adapter - Formats prompts as GEMINI.md system instructions.
|
|
6
|
+
*
|
|
7
|
+
* Gemini CLI reads system instructions from GEMINI.md files
|
|
8
|
+
* with @import directives for referenced standards and skills.
|
|
9
|
+
*
|
|
10
|
+
* Story 42.8
|
|
11
|
+
*/
|
|
12
|
+
import type { InjectionMethod, PlatformInstructions, TargetAdapter, TargetCapabilities, TargetConfig } from './target-adapter.js';
|
|
13
|
+
export declare class GeminiAdapter implements TargetAdapter {
|
|
14
|
+
formatPrompt(assembledPrompt: string, platformInstructions: PlatformInstructions, config: TargetConfig): string;
|
|
15
|
+
getTargetId(): string;
|
|
16
|
+
getCapabilities(): TargetCapabilities;
|
|
17
|
+
getInjectionMethod(): InjectionMethod;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=gemini-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/gemini-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAiB7B,qBAAa,aAAc,YAAW,aAAa;IACjD,YAAY,CACV,eAAe,EAAE,MAAM,EACvB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,YAAY,GACnB,MAAM;IA8CT,WAAW,IAAI,MAAM;IAIrB,eAAe,IAAI,kBAAkB;IAIrC,kBAAkB,IAAI,eAAe;CAGtC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* Gemini CLI Adapter - Formats prompts as GEMINI.md system instructions.
|
|
6
|
+
*
|
|
7
|
+
* Gemini CLI reads system instructions from GEMINI.md files
|
|
8
|
+
* with @import directives for referenced standards and skills.
|
|
9
|
+
*
|
|
10
|
+
* Story 42.8
|
|
11
|
+
*/
|
|
12
|
+
// ── Constants ───────────────────────────────────────────────────────────────
|
|
13
|
+
const TARGET_ID = 'gemini-cli';
|
|
14
|
+
const MAX_CONTEXT_LENGTH = 1_000_000;
|
|
15
|
+
const CAPABILITIES = {
|
|
16
|
+
supportsMarkdown: true,
|
|
17
|
+
supportsMultiFile: true,
|
|
18
|
+
supportsMultiTurn: true,
|
|
19
|
+
supportsTools: true,
|
|
20
|
+
maxContextLength: MAX_CONTEXT_LENGTH,
|
|
21
|
+
};
|
|
22
|
+
// ── Implementation ──────────────────────────────────────────────────────────
|
|
23
|
+
export class GeminiAdapter {
|
|
24
|
+
formatPrompt(assembledPrompt, platformInstructions, config) {
|
|
25
|
+
const sections = [];
|
|
26
|
+
// Main prompt content
|
|
27
|
+
sections.push(assembledPrompt);
|
|
28
|
+
// Add @import directives for context files (Gemini-native feature)
|
|
29
|
+
if (platformInstructions.contextFiles && platformInstructions.contextFiles.length > 0) {
|
|
30
|
+
sections.push('');
|
|
31
|
+
sections.push('## Standards');
|
|
32
|
+
sections.push('');
|
|
33
|
+
for (const file of platformInstructions.contextFiles) {
|
|
34
|
+
sections.push(`@import ${file}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Tool definitions
|
|
38
|
+
if (platformInstructions.tools && platformInstructions.tools.length > 0) {
|
|
39
|
+
sections.push('');
|
|
40
|
+
sections.push('## Available Tools');
|
|
41
|
+
sections.push('');
|
|
42
|
+
for (const tool of platformInstructions.tools) {
|
|
43
|
+
sections.push(`- ${tool}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// MCP configuration (Gemini supports MCP servers)
|
|
47
|
+
if (platformInstructions.mcpConfig && Object.keys(platformInstructions.mcpConfig).length > 0) {
|
|
48
|
+
sections.push('');
|
|
49
|
+
sections.push('## MCP Servers');
|
|
50
|
+
sections.push('');
|
|
51
|
+
sections.push('```json');
|
|
52
|
+
sections.push(JSON.stringify(platformInstructions.mcpConfig, null, 2));
|
|
53
|
+
sections.push('```');
|
|
54
|
+
}
|
|
55
|
+
let result = sections.join('\n');
|
|
56
|
+
const maxLength = config.maxPromptLength ?? MAX_CONTEXT_LENGTH;
|
|
57
|
+
if (result.length > maxLength) {
|
|
58
|
+
result = result.slice(0, maxLength);
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
getTargetId() {
|
|
63
|
+
return TARGET_ID;
|
|
64
|
+
}
|
|
65
|
+
getCapabilities() {
|
|
66
|
+
return CAPABILITIES;
|
|
67
|
+
}
|
|
68
|
+
getInjectionMethod() {
|
|
69
|
+
return 'file';
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=gemini-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-adapter.js","sourceRoot":"","sources":["../../src/adapters/gemini-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,+EAA+E;AAE/E,MAAM,SAAS,GAAG,YAAY,CAAC;AAC/B,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAErC,MAAM,YAAY,GAAuB;IACvC,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,IAAI;IACvB,iBAAiB,EAAE,IAAI;IACvB,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,kBAAkB;CACrC,CAAC;AAEF,+EAA+E;AAE/E,MAAM,OAAO,aAAa;IACxB,YAAY,CACV,eAAuB,EACvB,oBAA0C,EAC1C,MAAoB;QAEpB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,sBAAsB;QACtB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAE/B,mEAAmE;QACnE,IAAI,oBAAoB,CAAC,YAAY,IAAI,oBAAoB,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,YAAY,EAAE,CAAC;gBACrD,QAAQ,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,oBAAoB,CAAC,KAAK,IAAI,oBAAoB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,KAAK,EAAE,CAAC;gBAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,kDAAkD;QAClD,IAAI,oBAAoB,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7F,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACvE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QAED,IAAI,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjC,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,IAAI,kBAAkB,CAAC;QAC/D,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC9B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,WAAW;QACT,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe;QACb,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,kBAAkB;QAChB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* @neocortex/client - Target Adapters
|
|
6
|
+
*
|
|
7
|
+
* Platform-specific prompt formatting for 6 supported targets.
|
|
8
|
+
*
|
|
9
|
+
* Story 42.8
|
|
10
|
+
*/
|
|
11
|
+
export type { InjectionMethod, PlatformInstructions, TargetAdapter, TargetCapabilities, TargetConfig, } from './target-adapter.js';
|
|
12
|
+
export { ClaudeCodeAdapter } from './claude-code-adapter.js';
|
|
13
|
+
export { CursorAdapter } from './cursor-adapter.js';
|
|
14
|
+
export { VSCodeAdapter } from './vscode-adapter.js';
|
|
15
|
+
export { GeminiAdapter } from './gemini-adapter.js';
|
|
16
|
+
export { CodexAdapter } from './codex-adapter.js';
|
|
17
|
+
export { AntigravityAdapter } from './antigravity-adapter.js';
|
|
18
|
+
export { detectPlatform, isValidTargetId, type DetectionContext, type DetectionResult, type FileExistsCheck, type TargetId, } from './platform-detector.js';
|
|
19
|
+
export { AdapterRegistry, createDefaultRegistry, UnknownTargetError, } from './adapter-registry.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,YAAY,GACb,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAI9D,OAAO,EACL,cAAc,EACd,eAAe,EACf,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,QAAQ,GACd,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* @neocortex/client - Target Adapters
|
|
6
|
+
*
|
|
7
|
+
* Platform-specific prompt formatting for 6 supported targets.
|
|
8
|
+
*
|
|
9
|
+
* Story 42.8
|
|
10
|
+
*/
|
|
11
|
+
// ── Adapter Implementations ─────────────────────────────────────────────────
|
|
12
|
+
export { ClaudeCodeAdapter } from './claude-code-adapter.js';
|
|
13
|
+
export { CursorAdapter } from './cursor-adapter.js';
|
|
14
|
+
export { VSCodeAdapter } from './vscode-adapter.js';
|
|
15
|
+
export { GeminiAdapter } from './gemini-adapter.js';
|
|
16
|
+
export { CodexAdapter } from './codex-adapter.js';
|
|
17
|
+
export { AntigravityAdapter } from './antigravity-adapter.js';
|
|
18
|
+
// ── Platform Detection ──────────────────────────────────────────────────────
|
|
19
|
+
export { detectPlatform, isValidTargetId, } from './platform-detector.js';
|
|
20
|
+
// ── Registry ────────────────────────────────────────────────────────────────
|
|
21
|
+
export { AdapterRegistry, createDefaultRegistry, UnknownTargetError, } from './adapter-registry.js';
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,+EAA+E;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,+EAA+E;AAE/E,OAAO,EACL,cAAc,EACd,eAAe,GAKhB,MAAM,wBAAwB,CAAC;AAEhC,+EAA+E;AAE/E,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* Platform Detector - Auto-detects the current platform target.
|
|
6
|
+
*
|
|
7
|
+
* Uses a priority-ordered detection chain to identify which AI coding
|
|
8
|
+
* platform the CLI is running within, based on filesystem markers
|
|
9
|
+
* and environment variables.
|
|
10
|
+
*
|
|
11
|
+
* Detection priority:
|
|
12
|
+
* 1. --target flag (explicit override)
|
|
13
|
+
* 2. .cursorrules file -> Cursor
|
|
14
|
+
* 3. CLAUDE.md file -> Claude Code
|
|
15
|
+
* 4. .vscode/ directory -> VS Code
|
|
16
|
+
* 5. GEMINI_CLI env var -> Gemini CLI
|
|
17
|
+
* 6. CODEX_ env var prefix -> Codex
|
|
18
|
+
* 7. Default fallback -> Claude Code
|
|
19
|
+
*
|
|
20
|
+
* Story 42.8
|
|
21
|
+
*/
|
|
22
|
+
/** Supported platform target identifiers */
|
|
23
|
+
export type TargetId = 'claude-code' | 'cursor' | 'vscode' | 'gemini-cli' | 'codex' | 'antigravity';
|
|
24
|
+
/** Context provided to the platform detector */
|
|
25
|
+
export interface DetectionContext {
|
|
26
|
+
readonly cwd: string;
|
|
27
|
+
readonly env: Readonly<Record<string, string | undefined>>;
|
|
28
|
+
readonly targetFlag?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Result of platform detection */
|
|
31
|
+
export interface DetectionResult {
|
|
32
|
+
readonly targetId: TargetId;
|
|
33
|
+
readonly confidence: number;
|
|
34
|
+
readonly reason: string;
|
|
35
|
+
}
|
|
36
|
+
/** Check if a string is a valid TargetId */
|
|
37
|
+
export declare function isValidTargetId(value: string): value is TargetId;
|
|
38
|
+
export type FileExistsCheck = (path: string) => boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Detect the current platform target based on the execution context.
|
|
41
|
+
*
|
|
42
|
+
* @param context - Detection context with cwd, env, and optional target flag
|
|
43
|
+
* @param fileExists - Injectable filesystem check (for testing)
|
|
44
|
+
* @returns Detection result with target ID, confidence, and reason
|
|
45
|
+
*/
|
|
46
|
+
export declare function detectPlatform(context: DetectionContext, fileExists?: FileExistsCheck): DetectionResult;
|
|
47
|
+
//# sourceMappingURL=platform-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-detector.d.ts","sourceRoot":"","sources":["../../src/adapters/platform-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,4CAA4C;AAC5C,MAAM,MAAM,QAAQ,GAChB,aAAa,GACb,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,OAAO,GACP,aAAa,CAAC;AAElB,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAaD,4CAA4C;AAC5C,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAEhE;AAID,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;AAMxD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,EACzB,UAAU,GAAE,eAAmC,GAC9C,eAAe,CAkEjB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* Platform Detector - Auto-detects the current platform target.
|
|
6
|
+
*
|
|
7
|
+
* Uses a priority-ordered detection chain to identify which AI coding
|
|
8
|
+
* platform the CLI is running within, based on filesystem markers
|
|
9
|
+
* and environment variables.
|
|
10
|
+
*
|
|
11
|
+
* Detection priority:
|
|
12
|
+
* 1. --target flag (explicit override)
|
|
13
|
+
* 2. .cursorrules file -> Cursor
|
|
14
|
+
* 3. CLAUDE.md file -> Claude Code
|
|
15
|
+
* 4. .vscode/ directory -> VS Code
|
|
16
|
+
* 5. GEMINI_CLI env var -> Gemini CLI
|
|
17
|
+
* 6. CODEX_ env var prefix -> Codex
|
|
18
|
+
* 7. Default fallback -> Claude Code
|
|
19
|
+
*
|
|
20
|
+
* Story 42.8
|
|
21
|
+
*/
|
|
22
|
+
import { existsSync } from 'node:fs';
|
|
23
|
+
import { join } from 'node:path';
|
|
24
|
+
// ── Valid Target IDs ────────────────────────────────────────────────────────
|
|
25
|
+
const VALID_TARGETS = new Set([
|
|
26
|
+
'claude-code',
|
|
27
|
+
'cursor',
|
|
28
|
+
'vscode',
|
|
29
|
+
'gemini-cli',
|
|
30
|
+
'codex',
|
|
31
|
+
'antigravity',
|
|
32
|
+
]);
|
|
33
|
+
/** Check if a string is a valid TargetId */
|
|
34
|
+
export function isValidTargetId(value) {
|
|
35
|
+
return VALID_TARGETS.has(value);
|
|
36
|
+
}
|
|
37
|
+
const defaultFileExists = (path) => existsSync(path);
|
|
38
|
+
// ── Detection Function ──────────────────────────────────────────────────────
|
|
39
|
+
/**
|
|
40
|
+
* Detect the current platform target based on the execution context.
|
|
41
|
+
*
|
|
42
|
+
* @param context - Detection context with cwd, env, and optional target flag
|
|
43
|
+
* @param fileExists - Injectable filesystem check (for testing)
|
|
44
|
+
* @returns Detection result with target ID, confidence, and reason
|
|
45
|
+
*/
|
|
46
|
+
export function detectPlatform(context, fileExists = defaultFileExists) {
|
|
47
|
+
// 1. Explicit --target flag (highest priority)
|
|
48
|
+
if (context.targetFlag) {
|
|
49
|
+
const normalized = context.targetFlag.toLowerCase().trim();
|
|
50
|
+
if (isValidTargetId(normalized)) {
|
|
51
|
+
return {
|
|
52
|
+
targetId: normalized,
|
|
53
|
+
confidence: 1.0,
|
|
54
|
+
reason: `Explicit --target=${normalized} flag`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// Invalid target flag falls through to auto-detection
|
|
58
|
+
}
|
|
59
|
+
// 2. .cursorrules file -> Cursor
|
|
60
|
+
if (fileExists(join(context.cwd, '.cursorrules'))) {
|
|
61
|
+
return {
|
|
62
|
+
targetId: 'cursor',
|
|
63
|
+
confidence: 0.95,
|
|
64
|
+
reason: 'Found .cursorrules file in project root',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// 3. CLAUDE.md file -> Claude Code
|
|
68
|
+
if (fileExists(join(context.cwd, 'CLAUDE.md'))) {
|
|
69
|
+
return {
|
|
70
|
+
targetId: 'claude-code',
|
|
71
|
+
confidence: 0.9,
|
|
72
|
+
reason: 'Found CLAUDE.md file in project root',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// 4. .vscode/ directory -> VS Code
|
|
76
|
+
if (fileExists(join(context.cwd, '.vscode'))) {
|
|
77
|
+
return {
|
|
78
|
+
targetId: 'vscode',
|
|
79
|
+
confidence: 0.7,
|
|
80
|
+
reason: 'Found .vscode/ directory in project root',
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// 5. GEMINI_CLI env var -> Gemini CLI
|
|
84
|
+
if (context.env['GEMINI_CLI'] !== undefined) {
|
|
85
|
+
return {
|
|
86
|
+
targetId: 'gemini-cli',
|
|
87
|
+
confidence: 0.9,
|
|
88
|
+
reason: 'GEMINI_CLI environment variable is set',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// 6. Any env var with CODEX_ prefix -> Codex
|
|
92
|
+
const hasCodexEnv = Object.keys(context.env).some((key) => key.startsWith('CODEX_'));
|
|
93
|
+
if (hasCodexEnv) {
|
|
94
|
+
return {
|
|
95
|
+
targetId: 'codex',
|
|
96
|
+
confidence: 0.85,
|
|
97
|
+
reason: 'Found environment variable with CODEX_ prefix',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// 7. Default fallback -> Claude Code
|
|
101
|
+
return {
|
|
102
|
+
targetId: 'claude-code',
|
|
103
|
+
confidence: 0.5,
|
|
104
|
+
reason: 'Default fallback (no platform markers detected)',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=platform-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-detector.js","sourceRoot":"","sources":["../../src/adapters/platform-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA2BjC,+EAA+E;AAE/E,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAW;IAC3D,aAAa;IACb,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,aAAa;CACd,CAAC,CAAC;AAEH,4CAA4C;AAC5C,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAMD,MAAM,iBAAiB,GAAoB,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAE9E,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAyB,EACzB,aAA8B,iBAAiB;IAE/C,+CAA+C;IAC/C,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAC3D,IAAI,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,QAAQ,EAAE,UAAU;gBACpB,UAAU,EAAE,GAAG;gBACf,MAAM,EAAE,qBAAqB,UAAU,OAAO;aAC/C,CAAC;QACJ,CAAC;QACD,sDAAsD;IACxD,CAAC;IAED,iCAAiC;IACjC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,yCAAyC;SAClD,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO;YACL,QAAQ,EAAE,aAAa;YACvB,UAAU,EAAE,GAAG;YACf,MAAM,EAAE,sCAAsC;SAC/C,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QAC7C,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,GAAG;YACf,MAAM,EAAE,0CAA0C;SACnD,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO;YACL,QAAQ,EAAE,YAAY;YACtB,UAAU,EAAE,GAAG;YACf,MAAM,EAAE,wCAAwC;SACjD,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrF,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,QAAQ,EAAE,OAAO;YACjB,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,+CAA+C;SACxD,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,OAAO;QACL,QAAQ,EAAE,aAAa;QACvB,UAAU,EAAE,GAAG;QACf,MAAM,EAAE,iDAAiD;KAC1D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* TargetAdapter Interface - Core abstraction for platform-specific prompt formatting.
|
|
6
|
+
*
|
|
7
|
+
* Each platform target (Claude Code, Cursor, VS Code, Gemini CLI, Codex, Antigravity)
|
|
8
|
+
* implements this interface to transform assembled prompts into platform-native format.
|
|
9
|
+
*
|
|
10
|
+
* Story 42.8
|
|
11
|
+
*/
|
|
12
|
+
/** How the formatted prompt is injected into the platform */
|
|
13
|
+
export type InjectionMethod = 'file' | 'api' | 'stdin';
|
|
14
|
+
/** Platform-specific instructions to inject alongside the prompt */
|
|
15
|
+
export interface PlatformInstructions {
|
|
16
|
+
readonly tools?: readonly string[];
|
|
17
|
+
readonly mcpConfig?: Readonly<Record<string, unknown>>;
|
|
18
|
+
readonly contextFiles?: readonly string[];
|
|
19
|
+
readonly maxTokens?: number;
|
|
20
|
+
}
|
|
21
|
+
/** Configuration specific to a target platform */
|
|
22
|
+
export interface TargetConfig {
|
|
23
|
+
readonly maxPromptLength?: number;
|
|
24
|
+
readonly preserveMarkdown?: boolean;
|
|
25
|
+
readonly verbose?: boolean;
|
|
26
|
+
readonly customHeaders?: Readonly<Record<string, string>>;
|
|
27
|
+
}
|
|
28
|
+
/** Capabilities reported by a target adapter */
|
|
29
|
+
export interface TargetCapabilities {
|
|
30
|
+
readonly supportsMarkdown: boolean;
|
|
31
|
+
readonly supportsMultiFile: boolean;
|
|
32
|
+
readonly supportsMultiTurn: boolean;
|
|
33
|
+
readonly supportsTools: boolean;
|
|
34
|
+
readonly maxContextLength: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Core interface for all platform target adapters.
|
|
38
|
+
*
|
|
39
|
+
* Each adapter transforms an assembled prompt (from the Prompt Assembly Engine)
|
|
40
|
+
* into the native format expected by its target platform.
|
|
41
|
+
*/
|
|
42
|
+
export interface TargetAdapter {
|
|
43
|
+
/**
|
|
44
|
+
* Format an assembled prompt for the target platform.
|
|
45
|
+
*
|
|
46
|
+
* @param assembledPrompt - The raw assembled prompt from the server
|
|
47
|
+
* @param platformInstructions - Platform-specific instructions (tools, MCP, etc.)
|
|
48
|
+
* @param config - Target configuration overrides
|
|
49
|
+
* @returns Formatted prompt string ready for platform injection
|
|
50
|
+
*/
|
|
51
|
+
formatPrompt(assembledPrompt: string, platformInstructions: PlatformInstructions, config: TargetConfig): string;
|
|
52
|
+
/**
|
|
53
|
+
* Get the unique identifier for this target platform.
|
|
54
|
+
*
|
|
55
|
+
* @returns Target ID (e.g., "claude-code", "cursor")
|
|
56
|
+
*/
|
|
57
|
+
getTargetId(): string;
|
|
58
|
+
/**
|
|
59
|
+
* Get the capabilities of this target platform.
|
|
60
|
+
*
|
|
61
|
+
* @returns Capabilities object describing what the platform supports
|
|
62
|
+
*/
|
|
63
|
+
getCapabilities(): TargetCapabilities;
|
|
64
|
+
/**
|
|
65
|
+
* Get the method used to inject prompts into the platform.
|
|
66
|
+
*
|
|
67
|
+
* @returns Injection method: "file", "api", or "stdin"
|
|
68
|
+
*/
|
|
69
|
+
getInjectionMethod(): InjectionMethod;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=target-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/target-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,6DAA6D;AAC7D,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;AAIvD,oEAAoE;AACpE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC3D;AAID,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAID;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;OAOG;IACH,YAAY,CACV,eAAe,EAAE,MAAM,EACvB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,YAAY,GACnB,MAAM,CAAC;IAEV;;;;OAIG;IACH,WAAW,IAAI,MAAM,CAAC;IAEtB;;;;OAIG;IACH,eAAe,IAAI,kBAAkB,CAAC;IAEtC;;;;OAIG;IACH,kBAAkB,IAAI,eAAe,CAAC;CACvC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* TargetAdapter Interface - Core abstraction for platform-specific prompt formatting.
|
|
6
|
+
*
|
|
7
|
+
* Each platform target (Claude Code, Cursor, VS Code, Gemini CLI, Codex, Antigravity)
|
|
8
|
+
* implements this interface to transform assembled prompts into platform-native format.
|
|
9
|
+
*
|
|
10
|
+
* Story 42.8
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=target-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target-adapter.js","sourceRoot":"","sources":["../../src/adapters/target-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* VS Code Adapter - Formats prompts for VS Code extension chat participant API.
|
|
6
|
+
*
|
|
7
|
+
* VS Code uses extensions and the chat API for AI interactions.
|
|
8
|
+
* This adapter formats prompts as system messages with structured
|
|
9
|
+
* instruction blocks suitable for the chat participant API.
|
|
10
|
+
*
|
|
11
|
+
* Story 42.8
|
|
12
|
+
*/
|
|
13
|
+
import type { InjectionMethod, PlatformInstructions, TargetAdapter, TargetCapabilities, TargetConfig } from './target-adapter.js';
|
|
14
|
+
export declare class VSCodeAdapter implements TargetAdapter {
|
|
15
|
+
formatPrompt(assembledPrompt: string, platformInstructions: PlatformInstructions, config: TargetConfig): string;
|
|
16
|
+
getTargetId(): string;
|
|
17
|
+
getCapabilities(): TargetCapabilities;
|
|
18
|
+
getInjectionMethod(): InjectionMethod;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=vscode-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vscode-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/vscode-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAiB7B,qBAAa,aAAc,YAAW,aAAa;IACjD,YAAY,CACV,eAAe,EAAE,MAAM,EACvB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,YAAY,GACnB,MAAM;IA8CT,WAAW,IAAI,MAAM;IAIrB,eAAe,IAAI,kBAAkB;IAIrC,kBAAkB,IAAI,eAAe;CAGtC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* VS Code Adapter - Formats prompts for VS Code extension chat participant API.
|
|
6
|
+
*
|
|
7
|
+
* VS Code uses extensions and the chat API for AI interactions.
|
|
8
|
+
* This adapter formats prompts as system messages with structured
|
|
9
|
+
* instruction blocks suitable for the chat participant API.
|
|
10
|
+
*
|
|
11
|
+
* Story 42.8
|
|
12
|
+
*/
|
|
13
|
+
// ── Constants ───────────────────────────────────────────────────────────────
|
|
14
|
+
const TARGET_ID = 'vscode';
|
|
15
|
+
const MAX_CONTEXT_LENGTH = 128_000;
|
|
16
|
+
const CAPABILITIES = {
|
|
17
|
+
supportsMarkdown: true,
|
|
18
|
+
supportsMultiFile: true,
|
|
19
|
+
supportsMultiTurn: true,
|
|
20
|
+
supportsTools: true,
|
|
21
|
+
maxContextLength: MAX_CONTEXT_LENGTH,
|
|
22
|
+
};
|
|
23
|
+
// ── Implementation ──────────────────────────────────────────────────────────
|
|
24
|
+
export class VSCodeAdapter {
|
|
25
|
+
formatPrompt(assembledPrompt, platformInstructions, config) {
|
|
26
|
+
const sections = [];
|
|
27
|
+
// System instruction block for VS Code chat
|
|
28
|
+
sections.push('<system-instructions>');
|
|
29
|
+
sections.push(assembledPrompt);
|
|
30
|
+
sections.push('</system-instructions>');
|
|
31
|
+
// Tool definitions block
|
|
32
|
+
if (platformInstructions.tools && platformInstructions.tools.length > 0) {
|
|
33
|
+
sections.push('');
|
|
34
|
+
sections.push('<available-tools>');
|
|
35
|
+
for (const tool of platformInstructions.tools) {
|
|
36
|
+
sections.push(`- ${tool}`);
|
|
37
|
+
}
|
|
38
|
+
sections.push('</available-tools>');
|
|
39
|
+
}
|
|
40
|
+
// MCP configuration block
|
|
41
|
+
if (platformInstructions.mcpConfig && Object.keys(platformInstructions.mcpConfig).length > 0) {
|
|
42
|
+
sections.push('');
|
|
43
|
+
sections.push('<mcp-config>');
|
|
44
|
+
sections.push(JSON.stringify(platformInstructions.mcpConfig, null, 2));
|
|
45
|
+
sections.push('</mcp-config>');
|
|
46
|
+
}
|
|
47
|
+
// Context files as instruction references
|
|
48
|
+
if (platformInstructions.contextFiles && platformInstructions.contextFiles.length > 0) {
|
|
49
|
+
sections.push('');
|
|
50
|
+
sections.push('<context-files>');
|
|
51
|
+
for (const file of platformInstructions.contextFiles) {
|
|
52
|
+
sections.push(file);
|
|
53
|
+
}
|
|
54
|
+
sections.push('</context-files>');
|
|
55
|
+
}
|
|
56
|
+
let result = sections.join('\n');
|
|
57
|
+
const maxLength = config.maxPromptLength ?? MAX_CONTEXT_LENGTH;
|
|
58
|
+
if (result.length > maxLength) {
|
|
59
|
+
result = result.slice(0, maxLength);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
getTargetId() {
|
|
64
|
+
return TARGET_ID;
|
|
65
|
+
}
|
|
66
|
+
getCapabilities() {
|
|
67
|
+
return CAPABILITIES;
|
|
68
|
+
}
|
|
69
|
+
getInjectionMethod() {
|
|
70
|
+
return 'api';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=vscode-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vscode-adapter.js","sourceRoot":"","sources":["../../src/adapters/vscode-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,+EAA+E;AAE/E,MAAM,SAAS,GAAG,QAAQ,CAAC;AAC3B,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC,MAAM,YAAY,GAAuB;IACvC,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,IAAI;IACvB,iBAAiB,EAAE,IAAI;IACvB,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,kBAAkB;CACrC,CAAC;AAEF,+EAA+E;AAE/E,MAAM,OAAO,aAAa;IACxB,YAAY,CACV,eAAuB,EACvB,oBAA0C,EAC1C,MAAoB;QAEpB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,4CAA4C;QAC5C,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAExC,yBAAyB;QACzB,IAAI,oBAAoB,CAAC,KAAK,IAAI,oBAAoB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,KAAK,EAAE,CAAC;gBAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACtC,CAAC;QAED,0BAA0B;QAC1B,IAAI,oBAAoB,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7F,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACvE,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACjC,CAAC;QAED,0CAA0C;QAC1C,IAAI,oBAAoB,CAAC,YAAY,IAAI,oBAAoB,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,YAAY,EAAE,CAAC;gBACrD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjC,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,IAAI,kBAAkB,CAAC;QAC/D,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC9B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,WAAW;QACT,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe;QACb,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,kBAAkB;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|