@slope-dev/slope 1.13.2 → 1.15.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/dist/cli/commands/context.d.ts +2 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +190 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/distill.d.ts.map +1 -1
- package/dist/cli/commands/distill.js +13 -4
- package/dist/cli/commands/distill.js.map +1 -1
- package/dist/cli/commands/enrich.d.ts +2 -0
- package/dist/cli/commands/enrich.d.ts.map +1 -0
- package/dist/cli/commands/enrich.js +140 -0
- package/dist/cli/commands/enrich.js.map +1 -0
- package/dist/cli/commands/index-cmd.d.ts +2 -0
- package/dist/cli/commands/index-cmd.d.ts.map +1 -0
- package/dist/cli/commands/index-cmd.js +296 -0
- package/dist/cli/commands/index-cmd.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +17 -182
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/initiative.d.ts +2 -0
- package/dist/cli/commands/initiative.d.ts.map +1 -0
- package/dist/cli/commands/initiative.js +207 -0
- package/dist/cli/commands/initiative.js.map +1 -0
- package/dist/cli/commands/prep.d.ts +2 -0
- package/dist/cli/commands/prep.d.ts.map +1 -0
- package/dist/cli/commands/prep.js +94 -0
- package/dist/cli/commands/prep.js.map +1 -0
- package/dist/cli/commands/roadmap.d.ts.map +1 -1
- package/dist/cli/commands/roadmap.js +83 -44
- package/dist/cli/commands/roadmap.js.map +1 -1
- package/dist/cli/commands/store.js +76 -10
- package/dist/cli/commands/store.js.map +1 -1
- package/dist/cli/guards/stop-check.d.ts +1 -1
- package/dist/cli/guards/stop-check.d.ts.map +1 -1
- package/dist/cli/guards/stop-check.js +14 -2
- package/dist/cli/guards/stop-check.js.map +1 -1
- package/dist/cli/index.js +40 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/interactive-init.d.ts +19 -0
- package/dist/cli/interactive-init.d.ts.map +1 -0
- package/dist/cli/interactive-init.js +132 -0
- package/dist/cli/interactive-init.js.map +1 -0
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +6 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/core/config.d.ts +6 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/context.d.ts +20 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +59 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/embedding-client.d.ts +11 -0
- package/dist/core/embedding-client.d.ts.map +1 -0
- package/dist/core/embedding-client.js +92 -0
- package/dist/core/embedding-client.js.map +1 -0
- package/dist/core/embedding-store.d.ts +44 -0
- package/dist/core/embedding-store.d.ts.map +1 -0
- package/dist/core/embedding-store.js +7 -0
- package/dist/core/embedding-store.js.map +1 -0
- package/dist/core/embedding.d.ts +32 -0
- package/dist/core/embedding.d.ts.map +1 -0
- package/dist/core/embedding.js +114 -0
- package/dist/core/embedding.js.map +1 -0
- package/dist/core/enrich.d.ts +76 -0
- package/dist/core/enrich.d.ts.map +1 -0
- package/dist/core/enrich.js +115 -0
- package/dist/core/enrich.js.map +1 -0
- package/dist/core/index.d.ts +22 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +20 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/initiative.d.ts +72 -0
- package/dist/core/initiative.d.ts.map +1 -0
- package/dist/core/initiative.js +421 -0
- package/dist/core/initiative.js.map +1 -0
- package/dist/core/interview-engine.d.ts +34 -0
- package/dist/core/interview-engine.d.ts.map +1 -0
- package/dist/core/interview-engine.js +195 -0
- package/dist/core/interview-engine.js.map +1 -0
- package/dist/core/interview-steps.d.ts +27 -0
- package/dist/core/interview-steps.d.ts.map +1 -0
- package/dist/core/interview-steps.js +157 -0
- package/dist/core/interview-steps.js.map +1 -0
- package/dist/core/interview.d.ts +20 -0
- package/dist/core/interview.d.ts.map +1 -1
- package/dist/core/interview.js +61 -34
- package/dist/core/interview.js.map +1 -1
- package/dist/core/metaphor-preview.d.ts +34 -0
- package/dist/core/metaphor-preview.d.ts.map +1 -0
- package/dist/core/metaphor-preview.js +94 -0
- package/dist/core/metaphor-preview.js.map +1 -0
- package/dist/core/prep.d.ts +88 -0
- package/dist/core/prep.d.ts.map +1 -0
- package/dist/core/prep.js +302 -0
- package/dist/core/prep.js.map +1 -0
- package/dist/core/roles.d.ts +3 -0
- package/dist/core/roles.d.ts.map +1 -1
- package/dist/core/roles.js +36 -0
- package/dist/core/roles.js.map +1 -1
- package/dist/core/store.d.ts +1 -1
- package/dist/core/store.d.ts.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +55 -7
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/registry.d.ts +1 -1
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +15 -0
- package/dist/mcp/registry.js.map +1 -1
- package/dist/mcp/sandbox.d.ts.map +1 -1
- package/dist/mcp/sandbox.js +12 -1
- package/dist/mcp/sandbox.js.map +1 -1
- package/dist/store/index.d.ts +26 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +193 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store-pg/index.d.ts.map +1 -1
- package/dist/store-pg/index.js +25 -0
- package/dist/store-pg/index.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// SLOPE — Rich Interactive Init (powered by @clack/prompts)
|
|
2
|
+
// Renders interview steps as select menus, text inputs, and confirm dialogs.
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import { buildInterviewContext } from '../core/interview-engine.js';
|
|
5
|
+
import { generateInterviewSteps } from '../core/interview-steps.js';
|
|
6
|
+
import { initFromAnswers } from '../core/interview.js';
|
|
7
|
+
import { formatPreviewText } from '../core/metaphor-preview.js';
|
|
8
|
+
// Ensure built-in metaphors are registered
|
|
9
|
+
import '../core/metaphors/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Render a single interview step using the appropriate @clack/prompts widget.
|
|
12
|
+
*/
|
|
13
|
+
export async function renderStep(step, _answers) {
|
|
14
|
+
switch (step.type) {
|
|
15
|
+
case 'text':
|
|
16
|
+
return p.text({
|
|
17
|
+
message: step.question,
|
|
18
|
+
placeholder: step.description,
|
|
19
|
+
defaultValue: typeof step.default === 'string' ? step.default : undefined,
|
|
20
|
+
validate: step.validate
|
|
21
|
+
? (v) => step.validate(v) ?? undefined
|
|
22
|
+
: undefined,
|
|
23
|
+
});
|
|
24
|
+
case 'select':
|
|
25
|
+
return p.select({
|
|
26
|
+
message: step.question,
|
|
27
|
+
options: (step.options ?? []).map((o) => ({
|
|
28
|
+
value: o.value,
|
|
29
|
+
label: o.hint ? `${o.label} ${o.hint}` : o.label,
|
|
30
|
+
hint: o.description,
|
|
31
|
+
})),
|
|
32
|
+
initialValue: typeof step.default === 'string' ? step.default : undefined,
|
|
33
|
+
});
|
|
34
|
+
case 'multiselect':
|
|
35
|
+
return p.multiselect({
|
|
36
|
+
message: step.question,
|
|
37
|
+
options: (step.options ?? []).map((o) => ({
|
|
38
|
+
value: o.value,
|
|
39
|
+
label: o.hint ? `${o.label} ${o.hint}` : o.label,
|
|
40
|
+
hint: o.description,
|
|
41
|
+
})),
|
|
42
|
+
initialValues: Array.isArray(step.default) ? step.default : [],
|
|
43
|
+
required: false,
|
|
44
|
+
});
|
|
45
|
+
case 'confirm':
|
|
46
|
+
return p.confirm({
|
|
47
|
+
message: step.question,
|
|
48
|
+
initialValue: typeof step.default === 'boolean' ? step.default : false,
|
|
49
|
+
});
|
|
50
|
+
default:
|
|
51
|
+
return p.text({ message: step.question });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Build a summary string from collected answers and context.
|
|
56
|
+
*/
|
|
57
|
+
export function buildSummary(answers, _ctx) {
|
|
58
|
+
const lines = [];
|
|
59
|
+
lines.push(`Project: ${answers['project-name'] ?? '(not set)'}`);
|
|
60
|
+
lines.push(`Metaphor: ${answers['metaphor'] ?? 'golf'}`);
|
|
61
|
+
const repoUrl = String(answers['repo-url'] ?? '').trim();
|
|
62
|
+
if (repoUrl)
|
|
63
|
+
lines.push(`Repo: ${repoUrl}`);
|
|
64
|
+
lines.push(`Sprint: ${answers['sprint-number'] ?? '1'}`);
|
|
65
|
+
const platformsRaw = answers['platforms'];
|
|
66
|
+
const platforms = Array.isArray(platformsRaw) ? platformsRaw : undefined;
|
|
67
|
+
if (platforms && platforms.length > 0) {
|
|
68
|
+
lines.push(`Platforms: ${platforms.join(', ')}`);
|
|
69
|
+
}
|
|
70
|
+
const team = String(answers['team-members'] ?? '').trim();
|
|
71
|
+
if (team)
|
|
72
|
+
lines.push(`Team: ${team}`);
|
|
73
|
+
const vision = String(answers['vision'] ?? '').trim();
|
|
74
|
+
if (vision)
|
|
75
|
+
lines.push(`Vision: ${vision}`);
|
|
76
|
+
return lines.join('\n');
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Run the full interactive init flow using @clack/prompts.
|
|
80
|
+
*/
|
|
81
|
+
export async function runInteractiveCli(cwd) {
|
|
82
|
+
p.intro('slope init');
|
|
83
|
+
// 1. Lightweight detection with spinner
|
|
84
|
+
const s = p.spinner();
|
|
85
|
+
s.start('Detecting project info...');
|
|
86
|
+
const ctx = buildInterviewContext(cwd);
|
|
87
|
+
s.stop('Project detected');
|
|
88
|
+
// 2. Walk through interview steps
|
|
89
|
+
const steps = generateInterviewSteps(ctx);
|
|
90
|
+
const answers = {};
|
|
91
|
+
for (const step of steps) {
|
|
92
|
+
if (step.condition && !step.condition(answers))
|
|
93
|
+
continue;
|
|
94
|
+
const value = await renderStep(step, answers);
|
|
95
|
+
if (p.isCancel(value)) {
|
|
96
|
+
p.cancel('Init cancelled.');
|
|
97
|
+
process.exit(0);
|
|
98
|
+
}
|
|
99
|
+
answers[step.id] = value;
|
|
100
|
+
// Show metaphor preview after selection
|
|
101
|
+
if (step.id === 'metaphor' && value !== 'custom') {
|
|
102
|
+
const opt = step.options?.find((o) => o.value === value);
|
|
103
|
+
const preview = opt?.preview;
|
|
104
|
+
if (preview) {
|
|
105
|
+
p.note(formatPreviewText(preview), `${preview.name} Preview`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// 3. Summary + confirm
|
|
110
|
+
p.note(buildSummary(answers, ctx), 'Init Summary');
|
|
111
|
+
const confirmed = await p.confirm({ message: 'Create project?' });
|
|
112
|
+
if (!confirmed || p.isCancel(confirmed)) {
|
|
113
|
+
p.cancel('Init cancelled.');
|
|
114
|
+
process.exit(0);
|
|
115
|
+
}
|
|
116
|
+
// 4. Run init with spinner
|
|
117
|
+
s.start('Initializing project...');
|
|
118
|
+
const platformsVal = answers.platforms;
|
|
119
|
+
const result = await initFromAnswers(cwd, answers, Array.isArray(platformsVal) ? platformsVal : undefined);
|
|
120
|
+
s.stop('Project initialized');
|
|
121
|
+
if (!result.success) {
|
|
122
|
+
p.log.error('Initialization failed:');
|
|
123
|
+
for (const e of result.errors) {
|
|
124
|
+
p.log.error(` ${e.field}: ${e.message}`);
|
|
125
|
+
}
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
// 5. Print what was created
|
|
129
|
+
p.note(result.filesCreated.map((f) => ` ${f}`).join('\n'), 'Files created');
|
|
130
|
+
p.outro('Done! Run `slope briefing` to get started.');
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=interactive-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive-init.js","sourceRoot":"","sources":["../../src/cli/interactive-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/cli/registry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,QAAQ,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;CACzE;AAED,qGAAqG;AACrG,eAAO,MAAM,oBAAoB,2BAA4B,CAAC;AAE9D,eAAO,MAAM,oBAAoB,EAAE,SAAS,cAAc,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/cli/registry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,QAAQ,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;CACzE;AAED,qGAAqG;AACrG,eAAO,MAAM,oBAAoB,2BAA4B,CAAC;AAE9D,eAAO,MAAM,oBAAoB,EAAE,SAAS,cAAc,EAgDzD,CAAC"}
|
package/dist/cli/registry.js
CHANGED
|
@@ -38,5 +38,11 @@ export const CLI_COMMAND_REGISTRY = [
|
|
|
38
38
|
// ── Planning ───────────────────────────────────────────────────
|
|
39
39
|
{ cmd: 'roadmap', desc: 'Strategic planning and roadmap tools', category: 'planning' },
|
|
40
40
|
{ cmd: 'vision', desc: 'Display project vision document', category: 'planning' },
|
|
41
|
+
{ cmd: 'initiative', desc: 'Multi-sprint initiative orchestration', category: 'planning' },
|
|
42
|
+
// ── Indexing ──────────────────────────────────────────────────────
|
|
43
|
+
{ cmd: 'index-cmd', desc: 'Semantic embedding index management', category: 'tooling' },
|
|
44
|
+
{ cmd: 'context', desc: 'Semantic context search for agents', category: 'tooling' },
|
|
45
|
+
{ cmd: 'prep', desc: 'Generate execution plan for a ticket', category: 'tooling' },
|
|
46
|
+
{ cmd: 'enrich', desc: 'Batch-enrich backlog with file context', category: 'tooling' },
|
|
41
47
|
];
|
|
42
48
|
//# sourceMappingURL=registry.js.map
|
package/dist/cli/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/cli/registry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/cli/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/core/config.d.ts
CHANGED
|
@@ -51,6 +51,12 @@ export interface SlopeConfig {
|
|
|
51
51
|
connectionString: string;
|
|
52
52
|
projectId?: string;
|
|
53
53
|
};
|
|
54
|
+
embedding?: {
|
|
55
|
+
endpoint: string;
|
|
56
|
+
model: string;
|
|
57
|
+
dimensions: number;
|
|
58
|
+
apiKey?: string;
|
|
59
|
+
};
|
|
54
60
|
}
|
|
55
61
|
export declare function loadConfig(cwd?: string): SlopeConfig;
|
|
56
62
|
export declare function createConfig(cwd?: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;KACpC,CAAC;IACF,aAAa,CAAC,EAAE;QACd,UAAU,CAAC,EAAE,gBAAgB,CAAC;KAC/B,CAAC;IACF,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,SAAS,CAAC,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QACT,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAqBD,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,WAAW,CAWnE;AAED,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAQhE;AAED,gIAAgI;AAChI,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAMnF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAEhH"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;KACpC,CAAC;IACF,aAAa,CAAC,EAAE;QACd,UAAU,CAAC,EAAE,gBAAgB,CAAC;KAC/B,CAAC;IACF,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,SAAS,CAAC,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QACT,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,CAAC,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAqBD,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,WAAW,CAWnE;AAED,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAQhE;AAED,gIAAgI;AAChI,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAMnF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAEhH"}
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA+DjC,MAAM,cAAc,GAAgB;IAClC,YAAY,EAAE,aAAa;IAC3B,gBAAgB,EAAE,eAAe;IACjC,SAAS,EAAE,CAAC;IACZ,gBAAgB,EAAE,2BAA2B;IAC7C,YAAY,EAAE,sBAAsB;IACpC,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,oBAAoB;IAChC,WAAW,EAAE,2BAA2B;IACxC,SAAS,EAAE,mBAAmB;IAC9B,UAAU,EAAE,oBAAoB;IAChC,eAAe,EAAE,0BAA0B;IAC3C,eAAe,EAAE,oBAAoB;IACrC,QAAQ,EAAE,MAAM;CACjB,CAAC;AAEF,MAAM,UAAU,GAAG,QAAQ,CAAC;AAC5B,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,MAAM,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QACzD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,GAAG,EAAE,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1C,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1E,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,gIAAgI;AAChI,MAAM,UAAU,UAAU,CAAC,MAAmB,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IACzE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1C,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAClE,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAmB,EAAE,YAAoB,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IACtG,OAAO,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ContextQuery {
|
|
2
|
+
text: string;
|
|
3
|
+
topK?: number;
|
|
4
|
+
minScore?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ContextResult {
|
|
7
|
+
filePath: string;
|
|
8
|
+
chunkIndex: number;
|
|
9
|
+
snippet: string;
|
|
10
|
+
score: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Deduplicate results by file — keep the best-scoring chunk per file.
|
|
14
|
+
*/
|
|
15
|
+
export declare function deduplicateByFile(results: ContextResult[]): ContextResult[];
|
|
16
|
+
/**
|
|
17
|
+
* Format context results for agent injection.
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatContextForAgent(results: ContextResult[], format: 'paths' | 'snippets' | 'full', cwd?: string): string;
|
|
20
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAS3E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,aAAa,EAAE,EACxB,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,EACrC,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAyCR"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// SLOPE — Semantic Context Retrieval
|
|
2
|
+
// Query the embedding index and format results for agent consumption.
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
/**
|
|
5
|
+
* Deduplicate results by file — keep the best-scoring chunk per file.
|
|
6
|
+
*/
|
|
7
|
+
export function deduplicateByFile(results) {
|
|
8
|
+
const best = new Map();
|
|
9
|
+
for (const r of results) {
|
|
10
|
+
const existing = best.get(r.filePath);
|
|
11
|
+
if (!existing || r.score > existing.score) {
|
|
12
|
+
best.set(r.filePath, r);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return [...best.values()].sort((a, b) => b.score - a.score);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Format context results for agent injection.
|
|
19
|
+
*/
|
|
20
|
+
export function formatContextForAgent(results, format, cwd) {
|
|
21
|
+
if (results.length === 0)
|
|
22
|
+
return '';
|
|
23
|
+
const lines = [];
|
|
24
|
+
switch (format) {
|
|
25
|
+
case 'paths':
|
|
26
|
+
for (const r of results) {
|
|
27
|
+
lines.push(r.filePath);
|
|
28
|
+
}
|
|
29
|
+
break;
|
|
30
|
+
case 'snippets':
|
|
31
|
+
for (const r of results) {
|
|
32
|
+
lines.push(`## ${r.filePath} (score: ${r.score.toFixed(3)})`);
|
|
33
|
+
lines.push('```');
|
|
34
|
+
lines.push(r.snippet);
|
|
35
|
+
lines.push('```');
|
|
36
|
+
lines.push('');
|
|
37
|
+
}
|
|
38
|
+
break;
|
|
39
|
+
case 'full': {
|
|
40
|
+
const basePath = cwd ?? process.cwd();
|
|
41
|
+
for (const r of results) {
|
|
42
|
+
lines.push(`## ${r.filePath}`);
|
|
43
|
+
lines.push('```');
|
|
44
|
+
try {
|
|
45
|
+
const content = readFileSync(`${basePath}/${r.filePath}`, 'utf8');
|
|
46
|
+
lines.push(content);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
lines.push(`[Error reading file: ${r.filePath}]`);
|
|
50
|
+
}
|
|
51
|
+
lines.push('```');
|
|
52
|
+
lines.push('');
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return lines.join('\n');
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,sEAAsE;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAevC;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAwB;IACxD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAwB,EACxB,MAAqC,EACrC,GAAY;IAEZ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;YACD,MAAM;QAER,KAAK,UAAU;YACb,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC9D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YACD,MAAM;QAER,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,QAAQ,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACtC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;oBAClE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;oBACP,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACpD,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { EmbeddingConfig, CodeChunk, EmbeddingResult } from './embedding.js';
|
|
2
|
+
/**
|
|
3
|
+
* Embed an array of texts using an OpenAI-compatible embedding endpoint.
|
|
4
|
+
*/
|
|
5
|
+
export declare function embed(texts: string[], config: EmbeddingConfig): Promise<Float32Array[]>;
|
|
6
|
+
/**
|
|
7
|
+
* Embed code chunks in batches, returning full EmbeddingResults.
|
|
8
|
+
* Truncates oversized chunks and retries failed batches individually.
|
|
9
|
+
*/
|
|
10
|
+
export declare function embedBatch(chunks: CodeChunk[], config: EmbeddingConfig, batchSize?: number): Promise<EmbeddingResult[]>;
|
|
11
|
+
//# sourceMappingURL=embedding-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-client.d.ts","sourceRoot":"","sources":["../../src/core/embedding-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAclF;;GAEG;AACH,wBAAsB,KAAK,CACzB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAqCzB;AAOD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EAAE,EACnB,MAAM,EAAE,eAAe,EACvB,SAAS,SAAK,GACb,OAAO,CAAC,eAAe,EAAE,CAAC,CAsC5B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// SLOPE — HTTP Client for OpenAI-Compatible Embedding Endpoints
|
|
2
|
+
/**
|
|
3
|
+
* Resolve apiKey — supports `env:VAR_NAME` syntax for environment variable resolution.
|
|
4
|
+
*/
|
|
5
|
+
function resolveApiKey(key) {
|
|
6
|
+
if (!key)
|
|
7
|
+
return undefined;
|
|
8
|
+
if (key.startsWith('env:')) {
|
|
9
|
+
const envVar = key.slice(4);
|
|
10
|
+
return process.env[envVar] || undefined;
|
|
11
|
+
}
|
|
12
|
+
return key;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Embed an array of texts using an OpenAI-compatible embedding endpoint.
|
|
16
|
+
*/
|
|
17
|
+
export async function embed(texts, config) {
|
|
18
|
+
if (texts.length === 0)
|
|
19
|
+
return [];
|
|
20
|
+
const apiKey = resolveApiKey(config.apiKey);
|
|
21
|
+
const headers = {
|
|
22
|
+
'Content-Type': 'application/json',
|
|
23
|
+
};
|
|
24
|
+
if (apiKey) {
|
|
25
|
+
headers['Authorization'] = `Bearer ${apiKey}`;
|
|
26
|
+
}
|
|
27
|
+
const response = await fetch(config.endpoint, {
|
|
28
|
+
method: 'POST',
|
|
29
|
+
headers,
|
|
30
|
+
body: JSON.stringify({
|
|
31
|
+
model: config.model,
|
|
32
|
+
input: texts,
|
|
33
|
+
}),
|
|
34
|
+
signal: AbortSignal.timeout(60_000), // 60s timeout per batch
|
|
35
|
+
});
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
const body = await response.text().catch(() => '');
|
|
38
|
+
throw new Error(`Embedding request failed (${response.status}): ${body}`);
|
|
39
|
+
}
|
|
40
|
+
const json = await response.json();
|
|
41
|
+
if (!json.data || !Array.isArray(json.data)) {
|
|
42
|
+
throw new Error('Unexpected embedding response shape: missing data array');
|
|
43
|
+
}
|
|
44
|
+
// Sort by index to maintain input order
|
|
45
|
+
const sorted = json.data.sort((a, b) => a.index - b.index);
|
|
46
|
+
return sorted.map(d => new Float32Array(d.embedding));
|
|
47
|
+
}
|
|
48
|
+
// Safety net: truncate chunks that exceed embedding model context.
|
|
49
|
+
// nomic-embed-text has 8192 token context; dense content can tokenize
|
|
50
|
+
// at ~2 chars/token, so 8000 chars is a safe per-chunk ceiling.
|
|
51
|
+
const MAX_EMBED_CHARS = 8000;
|
|
52
|
+
/**
|
|
53
|
+
* Embed code chunks in batches, returning full EmbeddingResults.
|
|
54
|
+
* Truncates oversized chunks and retries failed batches individually.
|
|
55
|
+
*/
|
|
56
|
+
export async function embedBatch(chunks, config, batchSize = 32) {
|
|
57
|
+
const results = [];
|
|
58
|
+
for (let i = 0; i < chunks.length; i += batchSize) {
|
|
59
|
+
const batch = chunks.slice(i, i + batchSize);
|
|
60
|
+
const texts = batch.map(c => c.content.length > MAX_EMBED_CHARS ? c.content.slice(0, MAX_EMBED_CHARS) : c.content);
|
|
61
|
+
try {
|
|
62
|
+
const vectors = await embed(texts, config);
|
|
63
|
+
for (let j = 0; j < batch.length; j++) {
|
|
64
|
+
results.push({
|
|
65
|
+
filePath: batch[j].filePath,
|
|
66
|
+
chunkIndex: batch[j].chunkIndex,
|
|
67
|
+
chunkText: batch[j].content,
|
|
68
|
+
vector: vectors[j],
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Batch failed — retry each chunk individually, skip failures
|
|
74
|
+
for (let j = 0; j < batch.length; j++) {
|
|
75
|
+
try {
|
|
76
|
+
const [vector] = await embed([texts[j]], config);
|
|
77
|
+
results.push({
|
|
78
|
+
filePath: batch[j].filePath,
|
|
79
|
+
chunkIndex: batch[j].chunkIndex,
|
|
80
|
+
chunkText: batch[j].content,
|
|
81
|
+
vector,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Skip this chunk — content exceeds model context
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return results;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=embedding-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-client.js","sourceRoot":"","sources":["../../src/core/embedding-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface EmbeddingEntry {
|
|
2
|
+
filePath: string;
|
|
3
|
+
chunkIndex: number;
|
|
4
|
+
chunkText: string;
|
|
5
|
+
gitSha: string;
|
|
6
|
+
model: string;
|
|
7
|
+
vector: Float32Array;
|
|
8
|
+
}
|
|
9
|
+
export interface EmbeddingSearchResult {
|
|
10
|
+
id: number;
|
|
11
|
+
filePath: string;
|
|
12
|
+
chunkIndex: number;
|
|
13
|
+
chunkText: string;
|
|
14
|
+
score: number;
|
|
15
|
+
}
|
|
16
|
+
export interface EmbeddingStats {
|
|
17
|
+
fileCount: number;
|
|
18
|
+
chunkCount: number;
|
|
19
|
+
model: string | null;
|
|
20
|
+
dimensions: number | null;
|
|
21
|
+
lastIndexedAt: string | null;
|
|
22
|
+
lastIndexedSha: string | null;
|
|
23
|
+
}
|
|
24
|
+
export interface IndexMeta {
|
|
25
|
+
sha: string;
|
|
26
|
+
model: string;
|
|
27
|
+
dimensions: number;
|
|
28
|
+
}
|
|
29
|
+
export interface EmbeddingStore {
|
|
30
|
+
saveEmbeddings(entries: EmbeddingEntry[]): Promise<void>;
|
|
31
|
+
searchEmbeddings(queryVector: Float32Array, limit?: number): Promise<EmbeddingSearchResult[]>;
|
|
32
|
+
getIndexedFiles(): Promise<Array<{
|
|
33
|
+
filePath: string;
|
|
34
|
+
gitSha: string;
|
|
35
|
+
model: string;
|
|
36
|
+
}>>;
|
|
37
|
+
deleteEmbeddingsByFile(filePath: string): Promise<void>;
|
|
38
|
+
getEmbeddingStats(): Promise<EmbeddingStats>;
|
|
39
|
+
setIndexMeta(sha: string, model: string, dimensions: number): Promise<void>;
|
|
40
|
+
getIndexMeta(): Promise<IndexMeta | null>;
|
|
41
|
+
}
|
|
42
|
+
/** Runtime type guard — check if a store supports embedding operations. */
|
|
43
|
+
export declare function hasEmbeddingSupport(store: unknown): store is EmbeddingStore;
|
|
44
|
+
//# sourceMappingURL=embedding-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-store.d.ts","sourceRoot":"","sources":["../../src/core/embedding-store.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD,gBAAgB,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAE9F,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACvF,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7C,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,YAAY,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CAC3C;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAE3E"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// SLOPE — EmbeddingStore Interface
|
|
2
|
+
// Separate from SlopeStore — uses type guard for runtime detection.
|
|
3
|
+
/** Runtime type guard — check if a store supports embedding operations. */
|
|
4
|
+
export function hasEmbeddingSupport(store) {
|
|
5
|
+
return store !== null && typeof store === 'object' && 'searchEmbeddings' in store;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=embedding-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-store.js","sourceRoot":"","sources":["../../src/core/embedding-store.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,oEAAoE;AA+CpE,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,kBAAkB,IAAK,KAAgB,CAAC;AAChG,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface EmbeddingConfig {
|
|
2
|
+
endpoint: string;
|
|
3
|
+
model: string;
|
|
4
|
+
dimensions: number;
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CodeChunk {
|
|
8
|
+
filePath: string;
|
|
9
|
+
chunkIndex: number;
|
|
10
|
+
content: string;
|
|
11
|
+
}
|
|
12
|
+
export interface EmbeddingResult {
|
|
13
|
+
filePath: string;
|
|
14
|
+
chunkIndex: number;
|
|
15
|
+
chunkText: string;
|
|
16
|
+
vector: Float32Array;
|
|
17
|
+
}
|
|
18
|
+
export declare const MAX_CHUNK_FILE_SIZE: number;
|
|
19
|
+
export declare const SKIP_EXTENSIONS: Set<string>;
|
|
20
|
+
/** Filenames to skip regardless of extension (lock files, generated output). */
|
|
21
|
+
export declare const SKIP_FILENAMES: Set<string>;
|
|
22
|
+
export declare const SKIP_DIRS: Set<string>;
|
|
23
|
+
/**
|
|
24
|
+
* Chunk a file into embeddable code segments.
|
|
25
|
+
* Strategy: split by top-level declarations for TS/JS, fixed-size for others.
|
|
26
|
+
*/
|
|
27
|
+
export declare function chunkFile(filePath: string, content: string, maxLines?: number): CodeChunk[];
|
|
28
|
+
/**
|
|
29
|
+
* Check if a file path should be skipped for embedding.
|
|
30
|
+
*/
|
|
31
|
+
export declare function shouldSkipFile(filePath: string): boolean;
|
|
32
|
+
//# sourceMappingURL=embedding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/core/embedding.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,eAAO,MAAM,mBAAmB,QAAa,CAAC;AAE9C,eAAO,MAAM,eAAe,aAI1B,CAAC;AAEH,gFAAgF;AAChF,eAAO,MAAM,cAAc,aAEzB,CAAC;AAEH,eAAO,MAAM,SAAS,aAEpB,CAAC;AAKH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAoB,GAAG,SAAS,EAAE,CAmBtG;AAqED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAcxD"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// SLOPE — Embedding Types & Chunking Logic (pure — no HTTP calls)
|
|
2
|
+
export const MAX_CHUNK_FILE_SIZE = 100 * 1024; // 100KB — skip larger files
|
|
3
|
+
export const SKIP_EXTENSIONS = new Set([
|
|
4
|
+
'.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.woff', '.woff2', '.ttf',
|
|
5
|
+
'.eot', '.mp3', '.mp4', '.zip', '.tar', '.gz', '.bin', '.exe', '.dll',
|
|
6
|
+
'.so', '.dylib', '.lock', '.map',
|
|
7
|
+
]);
|
|
8
|
+
/** Filenames to skip regardless of extension (lock files, generated output). */
|
|
9
|
+
export const SKIP_FILENAMES = new Set([
|
|
10
|
+
'pnpm-lock.yaml', 'package-lock.json', 'yarn.lock', 'bun.lockb',
|
|
11
|
+
]);
|
|
12
|
+
export const SKIP_DIRS = new Set([
|
|
13
|
+
'node_modules', 'dist', '.git', '.slope', 'coverage', 'slope-loop',
|
|
14
|
+
]);
|
|
15
|
+
const DEFAULT_MAX_LINES = 200;
|
|
16
|
+
const DEFAULT_OVERLAP_LINES = 20;
|
|
17
|
+
/**
|
|
18
|
+
* Chunk a file into embeddable code segments.
|
|
19
|
+
* Strategy: split by top-level declarations for TS/JS, fixed-size for others.
|
|
20
|
+
*/
|
|
21
|
+
export function chunkFile(filePath, content, maxLines = DEFAULT_MAX_LINES) {
|
|
22
|
+
if (content.length > MAX_CHUNK_FILE_SIZE)
|
|
23
|
+
return [];
|
|
24
|
+
if (content.trim().length === 0)
|
|
25
|
+
return [];
|
|
26
|
+
const lines = content.split('\n');
|
|
27
|
+
// Small files: single chunk
|
|
28
|
+
if (lines.length <= maxLines) {
|
|
29
|
+
return [{ filePath, chunkIndex: 0, content }];
|
|
30
|
+
}
|
|
31
|
+
const isTS = filePath.endsWith('.ts') || filePath.endsWith('.tsx') ||
|
|
32
|
+
filePath.endsWith('.js') || filePath.endsWith('.jsx');
|
|
33
|
+
if (isTS) {
|
|
34
|
+
return chunkByDeclarations(filePath, content, lines, maxLines);
|
|
35
|
+
}
|
|
36
|
+
return chunkByLines(filePath, lines, maxLines, DEFAULT_OVERLAP_LINES);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Split TS/JS files by top-level declarations (export, function, class, const, interface, type).
|
|
40
|
+
*/
|
|
41
|
+
function chunkByDeclarations(filePath, _content, lines, maxLines) {
|
|
42
|
+
const declarationPattern = /^(export\s+)?(default\s+)?(async\s+)?(function|class|const|let|var|interface|type|enum|abstract)\s/;
|
|
43
|
+
const breakpoints = [0];
|
|
44
|
+
for (let i = 1; i < lines.length; i++) {
|
|
45
|
+
const line = lines[i];
|
|
46
|
+
if (declarationPattern.test(line) && i - breakpoints[breakpoints.length - 1] >= 10) {
|
|
47
|
+
breakpoints.push(i);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Merge breakpoints into chunks respecting maxLines
|
|
51
|
+
const chunks = [];
|
|
52
|
+
let chunkStart = 0;
|
|
53
|
+
let chunkIndex = 0;
|
|
54
|
+
for (let b = 1; b < breakpoints.length; b++) {
|
|
55
|
+
if (breakpoints[b] - chunkStart > maxLines) {
|
|
56
|
+
const chunkContent = lines.slice(chunkStart, breakpoints[b]).join('\n');
|
|
57
|
+
chunks.push({ filePath, chunkIndex, content: chunkContent });
|
|
58
|
+
chunkIndex++;
|
|
59
|
+
chunkStart = breakpoints[b];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Final chunk
|
|
63
|
+
const remaining = lines.slice(chunkStart).join('\n');
|
|
64
|
+
if (remaining.trim().length > 0) {
|
|
65
|
+
chunks.push({ filePath, chunkIndex, content: remaining });
|
|
66
|
+
}
|
|
67
|
+
return chunks;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Fixed-size line-based chunking with overlap for non-TS files.
|
|
71
|
+
*/
|
|
72
|
+
function chunkByLines(filePath, lines, maxLines, overlap) {
|
|
73
|
+
const chunks = [];
|
|
74
|
+
let start = 0;
|
|
75
|
+
let chunkIndex = 0;
|
|
76
|
+
while (start < lines.length) {
|
|
77
|
+
const end = Math.min(start + maxLines, lines.length);
|
|
78
|
+
const chunkContent = lines.slice(start, end).join('\n');
|
|
79
|
+
if (chunkContent.trim().length > 0) {
|
|
80
|
+
chunks.push({ filePath, chunkIndex, content: chunkContent });
|
|
81
|
+
chunkIndex++;
|
|
82
|
+
}
|
|
83
|
+
start = end - overlap;
|
|
84
|
+
if (start >= lines.length - overlap)
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
// Ensure final lines are included
|
|
88
|
+
if (start < lines.length) {
|
|
89
|
+
const chunkContent = lines.slice(start).join('\n');
|
|
90
|
+
if (chunkContent.trim().length > 0 && (chunks.length === 0 || chunks[chunks.length - 1].content !== chunkContent)) {
|
|
91
|
+
chunks.push({ filePath, chunkIndex, content: chunkContent });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return chunks;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check if a file path should be skipped for embedding.
|
|
98
|
+
*/
|
|
99
|
+
export function shouldSkipFile(filePath) {
|
|
100
|
+
const ext = filePath.slice(filePath.lastIndexOf('.'));
|
|
101
|
+
if (SKIP_EXTENSIONS.has(ext))
|
|
102
|
+
return true;
|
|
103
|
+
const parts = filePath.split('/');
|
|
104
|
+
for (const part of parts) {
|
|
105
|
+
if (SKIP_DIRS.has(part))
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
// Check filename (lock files with non-.lock extensions)
|
|
109
|
+
const filename = parts[parts.length - 1];
|
|
110
|
+
if (SKIP_FILENAMES.has(filename))
|
|
111
|
+
return true;
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=embedding.js.map
|