agcel 1.0.5 → 2.0.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/README.md +40 -47
- package/dist/cli/commands/create.d.ts +4 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +68 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +98 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +3 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.helpers.d.ts +15 -0
- package/dist/cli/commands/install.helpers.d.ts.map +1 -0
- package/dist/cli/commands/install.helpers.js +47 -0
- package/dist/cli/commands/install.helpers.js.map +1 -0
- package/dist/cli/commands/install.helpers.test.d.ts +2 -0
- package/dist/cli/commands/install.helpers.test.d.ts.map +1 -0
- package/dist/cli/commands/install.helpers.test.js +18 -0
- package/dist/cli/commands/install.helpers.test.js.map +1 -0
- package/dist/cli/commands/install.js +74 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/pulse.d.ts +4 -0
- package/dist/cli/commands/pulse.d.ts.map +1 -0
- package/dist/cli/commands/pulse.js +48 -0
- package/dist/cli/commands/pulse.js.map +1 -0
- package/dist/cli/commands/pulse.test.d.ts +2 -0
- package/dist/cli/commands/pulse.test.d.ts.map +1 -0
- package/dist/cli/commands/pulse.test.js +19 -0
- package/dist/cli/commands/pulse.test.js.map +1 -0
- package/dist/cli/commands/suggest.d.ts +3 -0
- package/dist/cli/commands/suggest.d.ts.map +1 -0
- package/dist/cli/commands/suggest.js +32 -0
- package/dist/cli/commands/suggest.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +20 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/research-hints.d.ts +5 -0
- package/dist/cli/research-hints.d.ts.map +1 -0
- package/dist/cli/research-hints.js +109 -0
- package/dist/cli/research-hints.js.map +1 -0
- package/dist/cli/research-hints.test.d.ts +2 -0
- package/dist/cli/research-hints.test.d.ts.map +1 -0
- package/dist/cli/research-hints.test.js +50 -0
- package/dist/cli/research-hints.test.js.map +1 -0
- package/dist/core/agcel-config.d.ts +27 -0
- package/dist/core/agcel-config.d.ts.map +1 -0
- package/dist/core/agcel-config.js +4 -0
- package/dist/core/agcel-config.js.map +1 -0
- package/dist/core/build-rag-engine.d.ts +12 -0
- package/dist/core/build-rag-engine.d.ts.map +1 -0
- package/dist/core/build-rag-engine.js +24 -0
- package/dist/core/build-rag-engine.js.map +1 -0
- package/dist/core/build-rag-engine.test.d.ts +2 -0
- package/dist/core/build-rag-engine.test.d.ts.map +1 -0
- package/dist/core/build-rag-engine.test.js +34 -0
- package/dist/core/build-rag-engine.test.js.map +1 -0
- package/dist/core/chroma-rag.d.ts +20 -0
- package/dist/core/chroma-rag.d.ts.map +1 -0
- package/dist/core/chroma-rag.js +108 -0
- package/dist/core/chroma-rag.js.map +1 -0
- package/dist/core/context-hygiene.d.ts +12 -0
- package/dist/core/context-hygiene.d.ts.map +1 -0
- package/dist/core/context-hygiene.js +43 -0
- package/dist/core/context-hygiene.js.map +1 -0
- package/dist/core/context-hygiene.test.d.ts +2 -0
- package/dist/core/context-hygiene.test.d.ts.map +1 -0
- package/dist/core/context-hygiene.test.js +18 -0
- package/dist/core/context-hygiene.test.js.map +1 -0
- package/dist/core/context.d.ts +44 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +114 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/conversation-routing.d.ts +10 -0
- package/dist/core/conversation-routing.d.ts.map +1 -0
- package/dist/core/conversation-routing.js +27 -0
- package/dist/core/conversation-routing.js.map +1 -0
- package/dist/core/conversation-routing.test.d.ts +2 -0
- package/dist/core/conversation-routing.test.d.ts.map +1 -0
- package/dist/core/conversation-routing.test.js +29 -0
- package/dist/core/conversation-routing.test.js.map +1 -0
- package/dist/core/guardrails.d.ts +26 -0
- package/dist/core/guardrails.d.ts.map +1 -0
- package/dist/core/guardrails.js +76 -0
- package/dist/core/guardrails.js.map +1 -0
- package/dist/core/guardrails.test.d.ts +2 -0
- package/dist/core/guardrails.test.d.ts.map +1 -0
- package/dist/core/guardrails.test.js +35 -0
- package/dist/core/guardrails.test.js.map +1 -0
- package/dist/core/intent.d.ts +22 -0
- package/dist/core/intent.d.ts.map +1 -0
- package/dist/core/intent.js +79 -0
- package/dist/core/intent.js.map +1 -0
- package/dist/core/intent.test.d.ts +2 -0
- package/dist/core/intent.test.d.ts.map +1 -0
- package/dist/core/intent.test.js +43 -0
- package/dist/core/intent.test.js.map +1 -0
- package/dist/core/local-rag.d.ts +17 -0
- package/dist/core/local-rag.d.ts.map +1 -0
- package/dist/core/local-rag.js +74 -0
- package/dist/core/local-rag.js.map +1 -0
- package/dist/core/local-rag.test.d.ts +2 -0
- package/dist/core/local-rag.test.d.ts.map +1 -0
- package/dist/core/local-rag.test.js +47 -0
- package/dist/core/local-rag.test.js.map +1 -0
- package/dist/core/orchestrator.d.ts +47 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +138 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/orchestrator.test.d.ts +2 -0
- package/dist/core/orchestrator.test.d.ts.map +1 -0
- package/dist/core/orchestrator.test.js +118 -0
- package/dist/core/orchestrator.test.js.map +1 -0
- package/dist/core/pulse.d.ts +13 -0
- package/dist/core/pulse.d.ts.map +1 -0
- package/dist/core/pulse.js +29 -0
- package/dist/core/pulse.js.map +1 -0
- package/dist/core/pulse.test.d.ts +2 -0
- package/dist/core/pulse.test.d.ts.map +1 -0
- package/dist/core/pulse.test.js +18 -0
- package/dist/core/pulse.test.js.map +1 -0
- package/dist/core/rag-metadata.d.ts +5 -0
- package/dist/core/rag-metadata.d.ts.map +1 -0
- package/dist/core/rag-metadata.js +13 -0
- package/dist/core/rag-metadata.js.map +1 -0
- package/dist/core/rag-metadata.test.d.ts +2 -0
- package/dist/core/rag-metadata.test.d.ts.map +1 -0
- package/dist/core/rag-metadata.test.js +12 -0
- package/dist/core/rag-metadata.test.js.map +1 -0
- package/dist/core/rag-types.d.ts +18 -0
- package/dist/core/rag-types.d.ts.map +1 -0
- package/dist/core/rag-types.js +2 -0
- package/dist/core/rag-types.js.map +1 -0
- package/dist/core/read-agcel-config.d.ts +3 -0
- package/dist/core/read-agcel-config.d.ts.map +1 -0
- package/dist/core/read-agcel-config.js +13 -0
- package/dist/core/read-agcel-config.js.map +1 -0
- package/dist/core/registry.d.ts +9 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +75 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/registry.test.d.ts +2 -0
- package/dist/core/registry.test.d.ts.map +1 -0
- package/dist/core/registry.test.js +128 -0
- package/dist/core/registry.test.js.map +1 -0
- package/dist/core/schema.d.ts +51 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +31 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/summarizer.d.ts +23 -0
- package/dist/core/summarizer.d.ts.map +1 -0
- package/dist/core/summarizer.js +66 -0
- package/dist/core/summarizer.js.map +1 -0
- package/dist/core/text-similarity.d.ts +7 -0
- package/dist/core/text-similarity.d.ts.map +1 -0
- package/dist/core/text-similarity.js +35 -0
- package/dist/core/text-similarity.js.map +1 -0
- package/dist/core/text-similarity.test.d.ts +2 -0
- package/dist/core/text-similarity.test.d.ts.map +1 -0
- package/dist/core/text-similarity.test.js +11 -0
- package/dist/core/text-similarity.test.js.map +1 -0
- package/dist/docs-site.test.d.ts +2 -0
- package/dist/docs-site.test.d.ts.map +1 -0
- package/dist/docs-site.test.js +19 -0
- package/dist/docs-site.test.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -39
- package/dist/index.js.map +1 -0
- package/dist/providers/adapter.d.ts +23 -0
- package/dist/providers/adapter.d.ts.map +1 -0
- package/dist/providers/adapter.js +9 -0
- package/dist/providers/adapter.js.map +1 -0
- package/dist/providers/chatgpt.d.ts +13 -0
- package/dist/providers/chatgpt.d.ts.map +1 -0
- package/dist/providers/chatgpt.js +33 -0
- package/dist/providers/chatgpt.js.map +1 -0
- package/dist/providers/chatgpt.test.d.ts +2 -0
- package/dist/providers/chatgpt.test.d.ts.map +1 -0
- package/dist/providers/chatgpt.test.js +23 -0
- package/dist/providers/chatgpt.test.js.map +1 -0
- package/dist/providers/claude.d.ts +13 -0
- package/dist/providers/claude.d.ts.map +1 -0
- package/dist/providers/claude.js +48 -0
- package/dist/providers/claude.js.map +1 -0
- package/dist/providers/cursor.d.ts +14 -0
- package/dist/providers/cursor.d.ts.map +1 -0
- package/dist/providers/cursor.js +47 -0
- package/dist/providers/cursor.js.map +1 -0
- package/dist/providers/gemini.d.ts +13 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +42 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +18 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +288 -154
- package/dist/server/index.js.map +1 -0
- package/package.json +62 -52
- package/.agent/workflows/api-gen.md +0 -63
- package/.agent/workflows/architect.md +0 -44
- package/.agent/workflows/brainstorm.md +0 -227
- package/.agent/workflows/build.md +0 -38
- package/.agent/workflows/changelog.md +0 -55
- package/.agent/workflows/checkpoint.md +0 -142
- package/.agent/workflows/commit.md +0 -227
- package/.agent/workflows/debug.md +0 -61
- package/.agent/workflows/deploy.md +0 -80
- package/.agent/workflows/doc.md +0 -251
- package/.agent/workflows/execute-plan.md +0 -229
- package/.agent/workflows/feature.md +0 -259
- package/.agent/workflows/fix.md +0 -327
- package/.agent/workflows/help.md +0 -67
- package/.agent/workflows/index.md +0 -152
- package/.agent/workflows/load.md +0 -116
- package/.agent/workflows/mode.md +0 -174
- package/.agent/workflows/optimize.md +0 -57
- package/.agent/workflows/plan.md +0 -341
- package/.agent/workflows/pr.md +0 -78
- package/.agent/workflows/product-plan.md +0 -36
- package/.agent/workflows/production-deploy.md +0 -39
- package/.agent/workflows/refactor.md +0 -67
- package/.agent/workflows/research.md +0 -120
- package/.agent/workflows/review.md +0 -348
- package/.agent/workflows/security-scan.md +0 -60
- package/.agent/workflows/ship.md +0 -225
- package/.agent/workflows/spawn.md +0 -181
- package/.agent/workflows/status.md +0 -63
- package/.agent/workflows/tdd.md +0 -143
- package/.agent/workflows/test.md +0 -344
- package/.agent/workflows/verify.md +0 -35
- package/LICENSE +0 -21
- package/dist/commands/init.js +0 -122
- package/dist/commands/list.js +0 -43
- package/dist/commands/uninstall.js +0 -70
- package/dist/utils/index.js +0 -28
- package/skills/api-security-best-practices/SKILL.md +0 -291
- package/skills/api-security-best-practices/references/examples.md +0 -617
- package/skills/architecture/SKILL.md +0 -59
- package/skills/architecture/context-discovery.md +0 -43
- package/skills/architecture/examples.md +0 -94
- package/skills/architecture/pattern-selection.md +0 -68
- package/skills/architecture/patterns-reference.md +0 -50
- package/skills/architecture/trade-off-analysis.md +0 -77
- package/skills/aws-serverless/SKILL.md +0 -327
- package/skills/brainstorming/SKILL.md +0 -234
- package/skills/c4-context/SKILL.md +0 -154
- package/skills/ci-cd-engineer/SKILL.md +0 -50
- package/skills/code-auditing/SKILL.md +0 -55
- package/skills/copywriting/SKILL.md +0 -248
- package/skills/database-engineer/SKILL.md +0 -47
- package/skills/doc-coauthoring/SKILL.md +0 -379
- package/skills/docker-expert/SKILL.md +0 -412
- package/skills/langgraph/SKILL.md +0 -291
- package/skills/postgresql/SKILL.md +0 -73
- package/skills/pricing-strategy/SKILL.md +0 -360
- package/skills/product-manager/SKILL.md +0 -57
- package/skills/prompt-engineer/README.md +0 -659
- package/skills/prompt-engineer/SKILL.md +0 -256
- package/skills/python-patterns/SKILL.md +0 -445
- package/skills/qa-engineer/SKILL.md +0 -42
- package/skills/rag-engineer/SKILL.md +0 -94
- package/skills/react-patterns/SKILL.md +0 -202
- package/skills/secure-refactoring/SKILL.md +0 -54
- package/skills/security-documentation/SKILL.md +0 -53
- package/skills/senior-architect/SKILL.md +0 -213
- package/skills/senior-architect/references/architecture_patterns.md +0 -103
- package/skills/senior-architect/references/system_design_workflows.md +0 -103
- package/skills/senior-architect/references/tech_decision_guide.md +0 -103
- package/skills/senior-architect/scripts/architecture_diagram_generator.py +0 -114
- package/skills/senior-architect/scripts/dependency_analyzer.py +0 -114
- package/skills/senior-architect/scripts/project_architect.py +0 -114
- package/skills/seo-audit/SKILL.md +0 -491
- package/skills/sql-injection-testing/SKILL.md +0 -452
- package/skills/test-driven-development/SKILL.md +0 -375
- package/skills/test-driven-development/testing-anti-patterns.md +0 -299
- package/skills/test-fixing/SKILL.md +0 -123
- package/skills/testing-patterns/SKILL.md +0 -263
- package/skills/typescript-expert/SKILL.md +0 -202
- package/skills/typescript-expert/references/advanced-topics.md +0 -252
- package/skills/typescript-expert/references/tsconfig-strict.json +0 -92
- package/skills/typescript-expert/references/typescript-cheatsheet.md +0 -383
- package/skills/typescript-expert/references/utility-types.ts +0 -335
- package/skills/typescript-expert/scripts/ts_diagnostic.py +0 -203
- package/skills/ui-ux-designer/SKILL.md +0 -46
- package/skills/vercel-deployment/SKILL.md +0 -83
- package/skills/vulnerability-scanner/SKILL.md +0 -280
- package/skills/vulnerability-scanner/checklists.md +0 -121
- package/skills/vulnerability-scanner/scripts/security_scan.py +0 -458
- package/skills/writing-plans/SKILL.md +0 -120
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { Registry } from '../../core/registry.js';
|
|
3
|
+
import { IntentEngine } from '../../core/intent.js';
|
|
4
|
+
export const suggestCommand = new Command('suggest')
|
|
5
|
+
.description('Rank registry agents for a task and print next steps when confidence is low')
|
|
6
|
+
.argument('<query...>', 'Natural-language task description')
|
|
7
|
+
.action(async (parts) => {
|
|
8
|
+
const query = parts.join(' ').trim();
|
|
9
|
+
if (!query) {
|
|
10
|
+
console.error('Provide a non-empty query.');
|
|
11
|
+
process.exitCode = 1;
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const registry = new Registry();
|
|
15
|
+
const agents = await registry.loadAgents();
|
|
16
|
+
const engine = new IntentEngine();
|
|
17
|
+
const result = engine.detectIntent(query, agents, {
|
|
18
|
+
latestUserTurn: query
|
|
19
|
+
});
|
|
20
|
+
console.log(`Query: ${query}`);
|
|
21
|
+
console.log(`Confidence: ${(result.confidence * 100).toFixed(0)}%`);
|
|
22
|
+
if (result.bestAgent) {
|
|
23
|
+
console.log(`Suggested agent: ${result.bestAgent.name}`);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.log('Suggested agent: (none above threshold)');
|
|
27
|
+
}
|
|
28
|
+
if (result.suggestion) {
|
|
29
|
+
console.log(`\n${result.suggestion}`);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=suggest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../../src/cli/commands/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CACV,6EAA6E,CAC9E;KACA,QAAQ,CAAC,YAAY,EAAE,mCAAmC,CAAC;KAC3D,MAAM,CAAC,KAAK,EAAE,KAAe,EAAE,EAAE;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE;QAChD,cAAc,EAAE,KAAK;KACtB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACxC,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { initCommand } from './commands/init.js';
|
|
4
|
+
import { installCommand } from './commands/install.js';
|
|
5
|
+
import { createAgentCommand, createSkillCommand } from './commands/create.js';
|
|
6
|
+
import { pulseCommand } from './commands/pulse.js';
|
|
7
|
+
import { suggestCommand } from './commands/suggest.js';
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program
|
|
10
|
+
.name('agcel')
|
|
11
|
+
.description('Agentic Context Engineering Library - CLI Tool')
|
|
12
|
+
.version('1.0.0');
|
|
13
|
+
program.addCommand(initCommand);
|
|
14
|
+
program.addCommand(installCommand);
|
|
15
|
+
program.addCommand(createAgentCommand);
|
|
16
|
+
program.addCommand(createSkillCommand);
|
|
17
|
+
program.addCommand(suggestCommand);
|
|
18
|
+
program.addCommand(pulseCommand);
|
|
19
|
+
program.parse();
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-hints.d.ts","sourceRoot":"","sources":["../../src/cli/research-hints.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4FH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAepE"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Curated pointers for interactive agent/skill creation (offline-friendly).
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULT_RESEARCH_URLS = [
|
|
5
|
+
'https://martinfowler.com/bliki/TwoHardThings.html',
|
|
6
|
+
'https://en.wikipedia.org/wiki/Single_responsibility_principle'
|
|
7
|
+
];
|
|
8
|
+
const SKILL_RESEARCH = {
|
|
9
|
+
python: [
|
|
10
|
+
'https://peps.python.org/pep-0008/',
|
|
11
|
+
'https://docs.python.org/3/library/typing.html',
|
|
12
|
+
'https://docs.pytest.org/en/stable/',
|
|
13
|
+
'https://packaging.python.org/en/latest/tutorials/packaging-projects/'
|
|
14
|
+
],
|
|
15
|
+
java: [
|
|
16
|
+
'https://docs.oracle.com/en/java/javase/21/docs/api/index.html',
|
|
17
|
+
'https://junit.org/junit5/docs/current/user-guide/'
|
|
18
|
+
],
|
|
19
|
+
'nodejs-typescript': [
|
|
20
|
+
'https://nodejs.org/en/docs/guides/',
|
|
21
|
+
'https://www.typescriptlang.org/docs/',
|
|
22
|
+
'https://vitest.dev/guide/'
|
|
23
|
+
],
|
|
24
|
+
testing: [
|
|
25
|
+
'https://docs.pytest.org/en/stable/',
|
|
26
|
+
'https://vitest.dev/guide/'
|
|
27
|
+
],
|
|
28
|
+
debugging: [
|
|
29
|
+
'https://developer.mozilla.org/en-US/docs/Tools/Debugger',
|
|
30
|
+
'https://12factor.net/logs'
|
|
31
|
+
],
|
|
32
|
+
'react-skill': [
|
|
33
|
+
'https://react.dev/',
|
|
34
|
+
'https://www.typescriptlang.org/docs/',
|
|
35
|
+
'https://react.dev/learn/typescript'
|
|
36
|
+
],
|
|
37
|
+
flutter: [
|
|
38
|
+
'https://docs.flutter.dev/',
|
|
39
|
+
'https://dart.dev/language',
|
|
40
|
+
'https://docs.flutter.dev/testing/overview'
|
|
41
|
+
],
|
|
42
|
+
'product-discovery': [
|
|
43
|
+
'https://www.svpg.com/empowered-product-teams/',
|
|
44
|
+
'https://www.interaction-design.org/literature/topics/user-research'
|
|
45
|
+
],
|
|
46
|
+
'requirements-clarity': [
|
|
47
|
+
'https://www.agilealliance.org/glossary/invest/',
|
|
48
|
+
'https://www.mountaingoatsoftware.com/agile/user-stories'
|
|
49
|
+
],
|
|
50
|
+
'backlog-roadmap': [
|
|
51
|
+
'https://www.scrum.org/resources/blog/product-backlog-ordering-techniques',
|
|
52
|
+
'https://www.productplan.com/learn/what-is-a-product-roadmap/'
|
|
53
|
+
],
|
|
54
|
+
'ux-product-design': [
|
|
55
|
+
'https://www.nngroup.com/articles/ten-usability-heuristics/',
|
|
56
|
+
'https://www.interaction-design.org/literature/topics/ux-design'
|
|
57
|
+
],
|
|
58
|
+
'design-systems': [
|
|
59
|
+
'https://designsystemsrepo.com/design-systems-releases',
|
|
60
|
+
'https://www.w3.org/WAI/ARIA/apg/'
|
|
61
|
+
],
|
|
62
|
+
'accessibility-design': [
|
|
63
|
+
'https://www.w3.org/WAI/WCAG22/quickref/',
|
|
64
|
+
'https://webaim.org/resources/designers/'
|
|
65
|
+
],
|
|
66
|
+
'web-ui-patterns': [
|
|
67
|
+
'https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Responsive_Design',
|
|
68
|
+
'https://web.dev/articles/responsive-web-design-basics'
|
|
69
|
+
],
|
|
70
|
+
'mobile-platform-design': [
|
|
71
|
+
'https://developer.apple.com/design/human-interface-guidelines/',
|
|
72
|
+
'https://m3.material.io/'
|
|
73
|
+
],
|
|
74
|
+
'api-security': [
|
|
75
|
+
'https://owasp.org/API-Security/editions/2023/en/0x00-header/',
|
|
76
|
+
'https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html'
|
|
77
|
+
],
|
|
78
|
+
observability: [
|
|
79
|
+
'https://opentelemetry.io/docs/',
|
|
80
|
+
'https://sre.google/sre-book/monitoring-distributed-systems/'
|
|
81
|
+
],
|
|
82
|
+
'technical-writing': [
|
|
83
|
+
'https://developers.google.com/tech-writing',
|
|
84
|
+
'https://www.writethedocs.org/guide/'
|
|
85
|
+
],
|
|
86
|
+
'system-architecture': [
|
|
87
|
+
'https://c4model.com/',
|
|
88
|
+
'https://adr.github.io/',
|
|
89
|
+
'https://12factor.net/'
|
|
90
|
+
]
|
|
91
|
+
};
|
|
92
|
+
export function formatResearchForSkills(skillNames) {
|
|
93
|
+
const lines = [
|
|
94
|
+
'Best-practice references (open in a browser while you refine the skill):'
|
|
95
|
+
];
|
|
96
|
+
const seen = new Set();
|
|
97
|
+
for (const raw of skillNames) {
|
|
98
|
+
const key = raw.trim().toLowerCase();
|
|
99
|
+
const urls = SKILL_RESEARCH[key] ?? DEFAULT_RESEARCH_URLS;
|
|
100
|
+
for (const u of urls) {
|
|
101
|
+
if (seen.has(u))
|
|
102
|
+
continue;
|
|
103
|
+
seen.add(u);
|
|
104
|
+
lines.push(` - ${u}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return lines.join('\n');
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=research-hints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-hints.js","sourceRoot":"","sources":["../../src/cli/research-hints.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,qBAAqB,GAAG;IAC5B,mDAAmD;IACnD,+DAA+D;CAChE,CAAC;AAEF,MAAM,cAAc,GAA6B;IAC/C,MAAM,EAAE;QACN,mCAAmC;QACnC,+CAA+C;QAC/C,oCAAoC;QACpC,sEAAsE;KACvE;IACD,IAAI,EAAE;QACJ,+DAA+D;QAC/D,mDAAmD;KACpD;IACD,mBAAmB,EAAE;QACnB,oCAAoC;QACpC,sCAAsC;QACtC,2BAA2B;KAC5B;IACD,OAAO,EAAE;QACP,oCAAoC;QACpC,2BAA2B;KAC5B;IACD,SAAS,EAAE;QACT,yDAAyD;QACzD,2BAA2B;KAC5B;IACD,aAAa,EAAE;QACb,oBAAoB;QACpB,sCAAsC;QACtC,oCAAoC;KACrC;IACD,OAAO,EAAE;QACP,2BAA2B;QAC3B,2BAA2B;QAC3B,2CAA2C;KAC5C;IACD,mBAAmB,EAAE;QACnB,+CAA+C;QAC/C,oEAAoE;KACrE;IACD,sBAAsB,EAAE;QACtB,gDAAgD;QAChD,yDAAyD;KAC1D;IACD,iBAAiB,EAAE;QACjB,0EAA0E;QAC1E,8DAA8D;KAC/D;IACD,mBAAmB,EAAE;QACnB,4DAA4D;QAC5D,gEAAgE;KACjE;IACD,gBAAgB,EAAE;QAChB,uDAAuD;QACvD,kCAAkC;KACnC;IACD,sBAAsB,EAAE;QACtB,yCAAyC;QACzC,yCAAyC;KAC1C;IACD,iBAAiB,EAAE;QACjB,iFAAiF;QACjF,uDAAuD;KACxD;IACD,wBAAwB,EAAE;QACxB,gEAAgE;QAChE,yBAAyB;KAC1B;IACD,cAAc,EAAE;QACd,8DAA8D;QAC9D,+EAA+E;KAChF;IACD,aAAa,EAAE;QACb,gCAAgC;QAChC,6DAA6D;KAC9D;IACD,mBAAmB,EAAE;QACnB,4CAA4C;QAC5C,qCAAqC;KACtC;IACD,qBAAqB,EAAE;QACrB,sBAAsB;QACtB,wBAAwB;QACxB,uBAAuB;KACxB;CACF,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,UAAoB;IAC1D,MAAM,KAAK,GAAa;QACtB,0EAA0E;KAC3E,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,qBAAqB,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,SAAS;YAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-hints.test.d.ts","sourceRoot":"","sources":["../../src/cli/research-hints.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { formatResearchForSkills } from './research-hints.js';
|
|
3
|
+
describe('formatResearchForSkills', () => {
|
|
4
|
+
it('Given python skill when formatting then PEP 8 and packaging links are included', () => {
|
|
5
|
+
const out = formatResearchForSkills(['python']);
|
|
6
|
+
expect(out).toContain('pep-0008');
|
|
7
|
+
expect(out).toContain('packaging.python.org');
|
|
8
|
+
});
|
|
9
|
+
it('Given product-discovery skill when formatting then curated PM link is included', () => {
|
|
10
|
+
const out = formatResearchForSkills(['product-discovery']);
|
|
11
|
+
expect(out).toContain('svpg.com');
|
|
12
|
+
});
|
|
13
|
+
it('Given accessibility-design skill when formatting then WCAG quick reference is included', () => {
|
|
14
|
+
const out = formatResearchForSkills(['accessibility-design']);
|
|
15
|
+
expect(out).toContain('WCAG22');
|
|
16
|
+
});
|
|
17
|
+
it('Given react-skill when formatting then React docs link is included', () => {
|
|
18
|
+
const out = formatResearchForSkills(['react-skill']);
|
|
19
|
+
expect(out).toContain('react.dev');
|
|
20
|
+
});
|
|
21
|
+
it('Given flutter skill when formatting then Flutter docs link is included', () => {
|
|
22
|
+
const out = formatResearchForSkills(['flutter']);
|
|
23
|
+
expect(out).toContain('docs.flutter.dev');
|
|
24
|
+
});
|
|
25
|
+
it('Given java skill when formatting then JUnit guide link is included', () => {
|
|
26
|
+
const out = formatResearchForSkills(['java']);
|
|
27
|
+
expect(out).toContain('junit.org');
|
|
28
|
+
});
|
|
29
|
+
it('Given nodejs-typescript skill when formatting then Node docs link is included', () => {
|
|
30
|
+
const out = formatResearchForSkills(['nodejs-typescript']);
|
|
31
|
+
expect(out).toContain('nodejs.org');
|
|
32
|
+
});
|
|
33
|
+
it('Given api-security skill when formatting then OWASP API Security link is included', () => {
|
|
34
|
+
const out = formatResearchForSkills(['api-security']);
|
|
35
|
+
expect(out).toContain('owasp.org/API-Security');
|
|
36
|
+
});
|
|
37
|
+
it('Given observability skill when formatting then OpenTelemetry docs link is included', () => {
|
|
38
|
+
const out = formatResearchForSkills(['observability']);
|
|
39
|
+
expect(out).toContain('opentelemetry.io');
|
|
40
|
+
});
|
|
41
|
+
it('Given technical-writing skill when formatting then Google tech writing link is included', () => {
|
|
42
|
+
const out = formatResearchForSkills(['technical-writing']);
|
|
43
|
+
expect(out).toContain('developers.google.com/tech-writing');
|
|
44
|
+
});
|
|
45
|
+
it('Given system-architecture skill when formatting then C4 model link is included', () => {
|
|
46
|
+
const out = formatResearchForSkills(['system-architecture']);
|
|
47
|
+
expect(out).toContain('c4model.com');
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=research-hints.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-hints.test.js","sourceRoot":"","sources":["../../src/cli/research-hints.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;QAChG,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yFAAyF,EAAE,GAAG,EAAE;QACjG,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shape of `.agcel/config.json` relevant to context and RAG.
|
|
3
|
+
*/
|
|
4
|
+
export type RagBackend = 'local' | 'chroma';
|
|
5
|
+
export interface ChromaConnectionConfig {
|
|
6
|
+
host?: string;
|
|
7
|
+
port?: number;
|
|
8
|
+
ssl?: boolean;
|
|
9
|
+
collectionName?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface AgcelConfig {
|
|
12
|
+
ragEnabled?: boolean;
|
|
13
|
+
/** When omitted and RAG is on, defaults to `local`. */
|
|
14
|
+
ragBackend?: RagBackend;
|
|
15
|
+
chroma?: ChromaConnectionConfig;
|
|
16
|
+
/** When set, RAG queries only return documents whose metadata matches all key/value pairs. */
|
|
17
|
+
ragQueryMetadataFilter?: Record<string, string>;
|
|
18
|
+
/**
|
|
19
|
+
* When true, `route_query` with `draft_output` sets `guardrails_blocked` if error-severity
|
|
20
|
+
* guardrails fail (host should not treat the draft as shippable).
|
|
21
|
+
*/
|
|
22
|
+
strictGuardrailsOnRouteQuery?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare const DEFAULT_CHROMA_HOST = "localhost";
|
|
25
|
+
export declare const DEFAULT_CHROMA_PORT = 8000;
|
|
26
|
+
export declare const DEFAULT_CHROMA_COLLECTION = "agcel";
|
|
27
|
+
//# sourceMappingURL=agcel-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agcel-config.d.ts","sourceRoot":"","sources":["../../src/core/agcel-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5C,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uDAAuD;IACvD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,8FAA8F;IAC9F,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD;;;OAGG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,yBAAyB,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agcel-config.js","sourceRoot":"","sources":["../../src/core/agcel-config.ts"],"names":[],"mappings":"AA0BA,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAC/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACxC,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AgcelConfig } from './agcel-config.js';
|
|
2
|
+
import type { IRagEngine } from './rag-types.js';
|
|
3
|
+
export type RagEngineMode = 'chroma' | 'local';
|
|
4
|
+
export interface BuildRagEngineResult {
|
|
5
|
+
engine: IRagEngine;
|
|
6
|
+
mode: RagEngineMode;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Builds the active RAG engine from config. Chroma failures fall back to local JSON index.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildRagEngine(basePath: string, config: AgcelConfig): Promise<BuildRagEngineResult>;
|
|
12
|
+
//# sourceMappingURL=build-rag-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-rag-engine.d.ts","sourceRoot":"","sources":["../../src/core/build-rag-engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAiBzG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { ChromaRagEngine } from './chroma-rag.js';
|
|
3
|
+
import { LocalRagEngine } from './local-rag.js';
|
|
4
|
+
/**
|
|
5
|
+
* Builds the active RAG engine from config. Chroma failures fall back to local JSON index.
|
|
6
|
+
*/
|
|
7
|
+
export async function buildRagEngine(basePath, config) {
|
|
8
|
+
const localPath = path.join(basePath, '.agcel', 'rag');
|
|
9
|
+
const localEngine = new LocalRagEngine(localPath);
|
|
10
|
+
if (config.ragBackend === 'chroma') {
|
|
11
|
+
try {
|
|
12
|
+
const chromaEngine = new ChromaRagEngine(config.chroma);
|
|
13
|
+
await chromaEngine.initialize();
|
|
14
|
+
return { engine: chromaEngine, mode: 'chroma' };
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
await localEngine.initialize();
|
|
18
|
+
return { engine: localEngine, mode: 'local' };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
await localEngine.initialize();
|
|
22
|
+
return { engine: localEngine, mode: 'local' };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=build-rag-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-rag-engine.js","sourceRoot":"","sources":["../../src/core/build-rag-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAUhD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,MAAmB;IACxE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;YAChC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IAED,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-rag-engine.test.d.ts","sourceRoot":"","sources":["../../src/core/build-rag-engine.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { buildRagEngine } from './build-rag-engine.js';
|
|
6
|
+
describe('buildRagEngine', () => {
|
|
7
|
+
let tmpDir;
|
|
8
|
+
afterEach(async () => {
|
|
9
|
+
if (tmpDir) {
|
|
10
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
it('Given chroma backend and no server on port when building then falls back to local engine', async () => {
|
|
14
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'agcel-build-rag-'));
|
|
15
|
+
await fs.mkdir(path.join(tmpDir, '.agcel', 'rag'), { recursive: true });
|
|
16
|
+
const { engine, mode } = await buildRagEngine(tmpDir, {
|
|
17
|
+
ragBackend: 'chroma',
|
|
18
|
+
chroma: { host: '127.0.0.1', port: 59987 }
|
|
19
|
+
});
|
|
20
|
+
expect(mode).toBe('local');
|
|
21
|
+
await engine.addDocument('doc1', 'hello world');
|
|
22
|
+
const results = await engine.query('hello', 1);
|
|
23
|
+
expect(results[0]?.content).toBe('hello world');
|
|
24
|
+
});
|
|
25
|
+
it('Given local backend when building then uses local engine', async () => {
|
|
26
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'agcel-build-rag-'));
|
|
27
|
+
const { engine, mode } = await buildRagEngine(tmpDir, { ragBackend: 'local' });
|
|
28
|
+
expect(mode).toBe('local');
|
|
29
|
+
await engine.addDocument('a', 'typescript modules');
|
|
30
|
+
const results = await engine.query('typescript', 1);
|
|
31
|
+
expect(results[0]?.id).toBe('a');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=build-rag-engine.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-rag-engine.test.js","sourceRoot":"","sources":["../../src/core/build-rag-engine.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,MAAc,CAAC;IAEnB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;QACxG,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACtE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAExE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE;YACpD,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE;SAC3C,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAEtE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QAE/E,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { IRagEngine, RagSearchResult } from './rag-types.js';
|
|
2
|
+
import { type ChromaConnectionConfig } from './agcel-config.js';
|
|
3
|
+
/**
|
|
4
|
+
* ChromaDB-backed RAG over a running Chroma server (`chroma run` or Docker).
|
|
5
|
+
* Uses the official JS client and default local embeddings for documents and queries.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ChromaRagEngine implements IRagEngine {
|
|
8
|
+
private collection;
|
|
9
|
+
private readonly client;
|
|
10
|
+
private readonly collectionName;
|
|
11
|
+
private readonly embeddingFunction;
|
|
12
|
+
constructor(chroma?: ChromaConnectionConfig);
|
|
13
|
+
initialize(): Promise<void>;
|
|
14
|
+
private requireCollection;
|
|
15
|
+
addDocument(id: string, content: string, metadata?: Record<string, string>): Promise<void>;
|
|
16
|
+
query(queryText: string, topK?: number, metadataFilter?: Record<string, string>): Promise<RagSearchResult[]>;
|
|
17
|
+
removeDocument(id: string): Promise<void>;
|
|
18
|
+
getDocumentCount(): Promise<number>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=chroma-rag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chroma-rag.d.ts","sourceRoot":"","sources":["../../src/core/chroma-rag.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AA2B3B;;;GAGG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAChD,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2B;gBAEjD,MAAM,CAAC,EAAE,sBAAsB;IASrC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC,OAAO,CAAC,iBAAiB;IAOnB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9F,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,MAAU,EAChB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC;IAuCvB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;CAG1C"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { ChromaClient } from 'chromadb';
|
|
2
|
+
import { DefaultEmbeddingFunction } from '@chroma-core/default-embed';
|
|
3
|
+
import { DEFAULT_CHROMA_COLLECTION, DEFAULT_CHROMA_HOST, DEFAULT_CHROMA_PORT } from './agcel-config.js';
|
|
4
|
+
import { recencyScoreMultiplier } from './rag-metadata.js';
|
|
5
|
+
function distanceToScore(distance) {
|
|
6
|
+
if (distance == null || Number.isNaN(distance))
|
|
7
|
+
return 0;
|
|
8
|
+
return 1 / (1 + distance);
|
|
9
|
+
}
|
|
10
|
+
function toChromaMetadata(meta) {
|
|
11
|
+
const out = {};
|
|
12
|
+
for (const [k, v] of Object.entries(meta)) {
|
|
13
|
+
out[k] = v;
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
function chromaWhereFromFilter(filter) {
|
|
18
|
+
const entries = Object.entries(filter);
|
|
19
|
+
if (entries.length === 1) {
|
|
20
|
+
const [k, v] = entries[0];
|
|
21
|
+
return { [k]: v };
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
$and: entries.map(([k, v]) => ({ [k]: v }))
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* ChromaDB-backed RAG over a running Chroma server (`chroma run` or Docker).
|
|
29
|
+
* Uses the official JS client and default local embeddings for documents and queries.
|
|
30
|
+
*/
|
|
31
|
+
export class ChromaRagEngine {
|
|
32
|
+
collection;
|
|
33
|
+
client;
|
|
34
|
+
collectionName;
|
|
35
|
+
embeddingFunction;
|
|
36
|
+
constructor(chroma) {
|
|
37
|
+
const host = chroma?.host ?? DEFAULT_CHROMA_HOST;
|
|
38
|
+
const port = chroma?.port ?? DEFAULT_CHROMA_PORT;
|
|
39
|
+
const ssl = chroma?.ssl ?? false;
|
|
40
|
+
this.collectionName = chroma?.collectionName ?? DEFAULT_CHROMA_COLLECTION;
|
|
41
|
+
this.client = new ChromaClient({ host, port, ssl });
|
|
42
|
+
this.embeddingFunction = new DefaultEmbeddingFunction();
|
|
43
|
+
}
|
|
44
|
+
async initialize() {
|
|
45
|
+
await this.client.heartbeat();
|
|
46
|
+
this.collection = await this.client.getOrCreateCollection({
|
|
47
|
+
name: this.collectionName,
|
|
48
|
+
embeddingFunction: this.embeddingFunction
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
requireCollection() {
|
|
52
|
+
if (!this.collection) {
|
|
53
|
+
throw new Error('ChromaRagEngine not initialized; call initialize() first');
|
|
54
|
+
}
|
|
55
|
+
return this.collection;
|
|
56
|
+
}
|
|
57
|
+
async addDocument(id, content, metadata = {}) {
|
|
58
|
+
const col = this.requireCollection();
|
|
59
|
+
const metadatas = Object.keys(metadata).length > 0 ? [toChromaMetadata(metadata)] : undefined;
|
|
60
|
+
await col.upsert({
|
|
61
|
+
ids: [id],
|
|
62
|
+
documents: [content],
|
|
63
|
+
...(metadatas ? { metadatas } : {})
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async query(queryText, topK = 5, metadataFilter) {
|
|
67
|
+
const col = this.requireCollection();
|
|
68
|
+
const hasFilter = metadataFilter && Object.keys(metadataFilter).length > 0;
|
|
69
|
+
const raw = await col.query({
|
|
70
|
+
queryTexts: [queryText],
|
|
71
|
+
nResults: topK,
|
|
72
|
+
include: ['documents', 'distances', 'metadatas'],
|
|
73
|
+
...(hasFilter ? { where: chromaWhereFromFilter(metadataFilter) } : {})
|
|
74
|
+
});
|
|
75
|
+
const ids = raw.ids[0] ?? [];
|
|
76
|
+
const docs = raw.documents[0] ?? [];
|
|
77
|
+
const dists = raw.distances[0] ?? [];
|
|
78
|
+
const metas = raw.metadatas?.[0] ?? [];
|
|
79
|
+
const out = [];
|
|
80
|
+
for (let i = 0; i < ids.length; i++) {
|
|
81
|
+
const id = ids[i];
|
|
82
|
+
const content = docs[i];
|
|
83
|
+
if (id == null || content == null)
|
|
84
|
+
continue;
|
|
85
|
+
const metaRaw = metas[i];
|
|
86
|
+
const meta = metaRaw
|
|
87
|
+
? Object.fromEntries(Object.entries(metaRaw).map(([k, v]) => [k, String(v)]))
|
|
88
|
+
: undefined;
|
|
89
|
+
let score = distanceToScore(dists[i] ?? null);
|
|
90
|
+
score *= recencyScoreMultiplier(meta?.updatedAt);
|
|
91
|
+
out.push({
|
|
92
|
+
id,
|
|
93
|
+
content,
|
|
94
|
+
score,
|
|
95
|
+
...(meta ? { metadata: meta } : {})
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
async removeDocument(id) {
|
|
101
|
+
const col = this.requireCollection();
|
|
102
|
+
await col.delete({ ids: [id] });
|
|
103
|
+
}
|
|
104
|
+
async getDocumentCount() {
|
|
105
|
+
return this.requireCollection().count();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=chroma-rag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chroma-rag.js","sourceRoot":"","sources":["../../src/core/chroma-rag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EAEpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,SAAS,eAAe,CAAC,QAAmC;IAC1D,IAAI,QAAQ,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,gBAAgB,CAAC,IAA4B;IACpD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,MAA8B;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAqB,CAAC;QAC9C,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAW,CAAC;IAC7B,CAAC;IACD,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAY,CAAA,CAAC;KAC5C,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,eAAe;IAClB,UAAU,CAAyB;IAC1B,MAAM,CAAe;IACrB,cAAc,CAAS;IACvB,iBAAiB,CAA2B;IAE7D,YAAY,MAA+B;QACzC,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,mBAAmB,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,mBAAmB,CAAC;QACjD,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,KAAK,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,yBAAyB,CAAC;QAC1E,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,iBAAiB,GAAG,IAAI,wBAAwB,EAAE,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;YACxD,IAAI,EAAE,IAAI,CAAC,cAAc;YACzB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;SAC1C,CAAC,CAAC;IACL,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU,EAAE,OAAe,EAAE,WAAmC,EAAE;QAClF,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9F,MAAM,GAAG,CAAC,MAAM,CAAC;YACf,GAAG,EAAE,CAAC,EAAE,CAAC;YACT,SAAS,EAAE,CAAC,OAAO,CAAC;YACpB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CACT,SAAiB,EACjB,OAAe,CAAC,EAChB,cAAuC;QAEvC,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAE3E,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC;YAC1B,UAAU,EAAE,CAAC,SAAS,CAAC;YACvB,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;YAChD,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,qBAAqB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC,CAAC;QAElB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEvC,MAAM,GAAG,GAAsB,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,EAAE,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI;gBAAE,SAAS;YAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAuC,CAAC;YAC/D,MAAM,IAAI,GAAG,OAAO;gBAClB,CAAC,CAAC,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CACxD;gBACH,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;YAC9C,KAAK,IAAI,sBAAsB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACjD,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE;gBACF,OAAO;gBACP,KAAK;gBACL,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrC,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,CAAC;IAC1C,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Removes near-duplicate blocks from retrieved context to save tokens.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Dedup RAG chunks separated by `\n\n---\n\n`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function deduplicateRetrievalBlocks(text: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Fallback dedup for MEMORY.md style text (paragraph-level).
|
|
10
|
+
*/
|
|
11
|
+
export declare function deduplicateLines(text: string): string;
|
|
12
|
+
//# sourceMappingURL=context-hygiene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-hygiene.d.ts","sourceRoot":"","sources":["../../src/core/context-hygiene.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAe/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWrD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Removes near-duplicate blocks from retrieved context to save tokens.
|
|
3
|
+
*/
|
|
4
|
+
function normalizeForDedup(s) {
|
|
5
|
+
return s.replace(/\s+/g, ' ').trim().toLowerCase();
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Dedup RAG chunks separated by `\n\n---\n\n`.
|
|
9
|
+
*/
|
|
10
|
+
export function deduplicateRetrievalBlocks(text) {
|
|
11
|
+
const sep = '\n\n---\n\n';
|
|
12
|
+
if (!text.includes(sep)) {
|
|
13
|
+
return deduplicateLines(text);
|
|
14
|
+
}
|
|
15
|
+
const blocks = text.split(sep).map((b) => b.trim()).filter(Boolean);
|
|
16
|
+
const seen = new Set();
|
|
17
|
+
const out = [];
|
|
18
|
+
for (const b of blocks) {
|
|
19
|
+
const key = normalizeForDedup(b).slice(0, 800);
|
|
20
|
+
if (key.length === 0 || seen.has(key))
|
|
21
|
+
continue;
|
|
22
|
+
seen.add(key);
|
|
23
|
+
out.push(b);
|
|
24
|
+
}
|
|
25
|
+
return out.join(sep);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Fallback dedup for MEMORY.md style text (paragraph-level).
|
|
29
|
+
*/
|
|
30
|
+
export function deduplicateLines(text) {
|
|
31
|
+
const paras = text.split(/\n\n+/).map((p) => p.trim()).filter(Boolean);
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const out = [];
|
|
34
|
+
for (const p of paras) {
|
|
35
|
+
const key = normalizeForDedup(p).slice(0, 800);
|
|
36
|
+
if (key.length === 0 || seen.has(key))
|
|
37
|
+
continue;
|
|
38
|
+
seen.add(key);
|
|
39
|
+
out.push(p);
|
|
40
|
+
}
|
|
41
|
+
return out.join('\n\n');
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=context-hygiene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-hygiene.js","sourceRoot":"","sources":["../../src/core/context-hygiene.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,SAAS,iBAAiB,CAAC,CAAS;IAClC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,MAAM,GAAG,GAAG,aAAa,CAAC;IAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAChD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAChD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-hygiene.test.d.ts","sourceRoot":"","sources":["../../src/core/context-hygiene.test.ts"],"names":[],"mappings":""}
|