modular-studio 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +261 -0
- package/dist/assets/graphPopulator-C6jg83nL.js +1 -0
- package/dist/assets/index-CXhIX28x.js +634 -0
- package/dist/assets/index-CeNF0r-K.css +1 -0
- package/dist/assets/jszip.min-BlpRodxc.js +2 -0
- package/dist/index.html +16 -0
- package/dist/vite.svg +1 -0
- package/dist-server/bin/modular-mcp.d.ts +8 -0
- package/dist-server/bin/modular-mcp.d.ts.map +1 -0
- package/dist-server/bin/modular-mcp.js +158 -0
- package/dist-server/bin/modular-mcp.js.map +1 -0
- package/dist-server/bin/modular-studio.d.ts +3 -0
- package/dist-server/bin/modular-studio.d.ts.map +1 -0
- package/dist-server/bin/modular-studio.js +63 -0
- package/dist-server/bin/modular-studio.js.map +1 -0
- package/dist-server/server/config.d.ts +4 -0
- package/dist-server/server/config.d.ts.map +1 -0
- package/dist-server/server/config.js +33 -0
- package/dist-server/server/config.js.map +1 -0
- package/dist-server/server/data/mcp-clients.json +5 -0
- package/dist-server/server/index.d.ts +3 -0
- package/dist-server/server/index.d.ts.map +1 -0
- package/dist-server/server/index.js +174 -0
- package/dist-server/server/index.js.map +1 -0
- package/dist-server/server/mcp/manager.d.ts +47 -0
- package/dist-server/server/mcp/manager.d.ts.map +1 -0
- package/dist-server/server/mcp/manager.js +203 -0
- package/dist-server/server/mcp/manager.js.map +1 -0
- package/dist-server/server/mcp/modular-server.d.ts +55 -0
- package/dist-server/server/mcp/modular-server.d.ts.map +1 -0
- package/dist-server/server/mcp/modular-server.js +492 -0
- package/dist-server/server/mcp/modular-server.js.map +1 -0
- package/dist-server/server/mcp/transport.d.ts +29 -0
- package/dist-server/server/mcp/transport.d.ts.map +1 -0
- package/dist-server/server/mcp/transport.js +61 -0
- package/dist-server/server/mcp/transport.js.map +1 -0
- package/dist-server/server/routes/agent-sdk.d.ts +3 -0
- package/dist-server/server/routes/agent-sdk.d.ts.map +1 -0
- package/dist-server/server/routes/agent-sdk.js +99 -0
- package/dist-server/server/routes/agent-sdk.js.map +1 -0
- package/dist-server/server/routes/agents.d.ts +10 -0
- package/dist-server/server/routes/agents.d.ts.map +1 -0
- package/dist-server/server/routes/agents.js +61 -0
- package/dist-server/server/routes/agents.js.map +1 -0
- package/dist-server/server/routes/auth-codex.d.ts +3 -0
- package/dist-server/server/routes/auth-codex.d.ts.map +1 -0
- package/dist-server/server/routes/auth-codex.js +51 -0
- package/dist-server/server/routes/auth-codex.js.map +1 -0
- package/dist-server/server/routes/capabilities.d.ts +3 -0
- package/dist-server/server/routes/capabilities.d.ts.map +1 -0
- package/dist-server/server/routes/capabilities.js +32 -0
- package/dist-server/server/routes/capabilities.js.map +1 -0
- package/dist-server/server/routes/claude-config.d.ts +3 -0
- package/dist-server/server/routes/claude-config.d.ts.map +1 -0
- package/dist-server/server/routes/claude-config.js +146 -0
- package/dist-server/server/routes/claude-config.js.map +1 -0
- package/dist-server/server/routes/connectors.d.ts +12 -0
- package/dist-server/server/routes/connectors.d.ts.map +1 -0
- package/dist-server/server/routes/connectors.js +325 -0
- package/dist-server/server/routes/connectors.js.map +1 -0
- package/dist-server/server/routes/embeddings.d.ts +6 -0
- package/dist-server/server/routes/embeddings.d.ts.map +1 -0
- package/dist-server/server/routes/embeddings.js +130 -0
- package/dist-server/server/routes/embeddings.js.map +1 -0
- package/dist-server/server/routes/health.d.ts +9 -0
- package/dist-server/server/routes/health.d.ts.map +1 -0
- package/dist-server/server/routes/health.js +284 -0
- package/dist-server/server/routes/health.js.map +1 -0
- package/dist-server/server/routes/knowledge.d.ts +3 -0
- package/dist-server/server/routes/knowledge.d.ts.map +1 -0
- package/dist-server/server/routes/knowledge.js +534 -0
- package/dist-server/server/routes/knowledge.js.map +1 -0
- package/dist-server/server/routes/llm.d.ts +3 -0
- package/dist-server/server/routes/llm.d.ts.map +1 -0
- package/dist-server/server/routes/llm.js +200 -0
- package/dist-server/server/routes/llm.js.map +1 -0
- package/dist-server/server/routes/mcp-oauth.d.ts +12 -0
- package/dist-server/server/routes/mcp-oauth.d.ts.map +1 -0
- package/dist-server/server/routes/mcp-oauth.js +137 -0
- package/dist-server/server/routes/mcp-oauth.js.map +1 -0
- package/dist-server/server/routes/mcp.d.ts +3 -0
- package/dist-server/server/routes/mcp.d.ts.map +1 -0
- package/dist-server/server/routes/mcp.js +177 -0
- package/dist-server/server/routes/mcp.js.map +1 -0
- package/dist-server/server/routes/pipeline.d.ts +45 -0
- package/dist-server/server/routes/pipeline.d.ts.map +1 -0
- package/dist-server/server/routes/pipeline.js +483 -0
- package/dist-server/server/routes/pipeline.js.map +1 -0
- package/dist-server/server/routes/providers.d.ts +3 -0
- package/dist-server/server/routes/providers.d.ts.map +1 -0
- package/dist-server/server/routes/providers.js +204 -0
- package/dist-server/server/routes/providers.js.map +1 -0
- package/dist-server/server/routes/qualification.d.ts +3 -0
- package/dist-server/server/routes/qualification.d.ts.map +1 -0
- package/dist-server/server/routes/qualification.js +105 -0
- package/dist-server/server/routes/qualification.js.map +1 -0
- package/dist-server/server/routes/repo-index.d.ts +4 -0
- package/dist-server/server/routes/repo-index.d.ts.map +1 -0
- package/dist-server/server/routes/repo-index.js +318 -0
- package/dist-server/server/routes/repo-index.js.map +1 -0
- package/dist-server/server/routes/runtime.d.ts +3 -0
- package/dist-server/server/routes/runtime.d.ts.map +1 -0
- package/dist-server/server/routes/runtime.js +122 -0
- package/dist-server/server/routes/runtime.js.map +1 -0
- package/dist-server/server/routes/skills-search.d.ts +3 -0
- package/dist-server/server/routes/skills-search.d.ts.map +1 -0
- package/dist-server/server/routes/skills-search.js +198 -0
- package/dist-server/server/routes/skills-search.js.map +1 -0
- package/dist-server/server/routes/worktrees.d.ts +3 -0
- package/dist-server/server/routes/worktrees.d.ts.map +1 -0
- package/dist-server/server/routes/worktrees.js +70 -0
- package/dist-server/server/routes/worktrees.js.map +1 -0
- package/dist-server/server/services/__tests__/embeddingService.test.d.ts +5 -0
- package/dist-server/server/services/__tests__/embeddingService.test.d.ts.map +1 -0
- package/dist-server/server/services/__tests__/embeddingService.test.js +233 -0
- package/dist-server/server/services/__tests__/embeddingService.test.js.map +1 -0
- package/dist-server/server/services/agentRunner.d.ts +46 -0
- package/dist-server/server/services/agentRunner.d.ts.map +1 -0
- package/dist-server/server/services/agentRunner.js +295 -0
- package/dist-server/server/services/agentRunner.js.map +1 -0
- package/dist-server/server/services/agentStore.d.ts +40 -0
- package/dist-server/server/services/agentStore.d.ts.map +1 -0
- package/dist-server/server/services/agentStore.js +62 -0
- package/dist-server/server/services/agentStore.js.map +1 -0
- package/dist-server/server/services/contentStore.d.ts +32 -0
- package/dist-server/server/services/contentStore.d.ts.map +1 -0
- package/dist-server/server/services/contentStore.js +68 -0
- package/dist-server/server/services/contentStore.js.map +1 -0
- package/dist-server/server/services/embeddingService.d.ts +53 -0
- package/dist-server/server/services/embeddingService.d.ts.map +1 -0
- package/dist-server/server/services/embeddingService.js +199 -0
- package/dist-server/server/services/embeddingService.js.map +1 -0
- package/dist-server/server/services/factExtractor.d.ts +14 -0
- package/dist-server/server/services/factExtractor.d.ts.map +1 -0
- package/dist-server/server/services/factExtractor.js +126 -0
- package/dist-server/server/services/factExtractor.js.map +1 -0
- package/dist-server/server/services/githubIndexer.d.ts +59 -0
- package/dist-server/server/services/githubIndexer.d.ts.map +1 -0
- package/dist-server/server/services/githubIndexer.js +183 -0
- package/dist-server/server/services/githubIndexer.js.map +1 -0
- package/dist-server/server/services/mcpOAuth.d.ts +32 -0
- package/dist-server/server/services/mcpOAuth.d.ts.map +1 -0
- package/dist-server/server/services/mcpOAuth.js +264 -0
- package/dist-server/server/services/mcpOAuth.js.map +1 -0
- package/dist-server/server/services/memoryScorer.d.ts +19 -0
- package/dist-server/server/services/memoryScorer.d.ts.map +1 -0
- package/dist-server/server/services/memoryScorer.js +147 -0
- package/dist-server/server/services/memoryScorer.js.map +1 -0
- package/dist-server/server/services/repoIndexer.d.ts +91 -0
- package/dist-server/server/services/repoIndexer.d.ts.map +1 -0
- package/dist-server/server/services/repoIndexer.js +512 -0
- package/dist-server/server/services/repoIndexer.js.map +1 -0
- package/dist-server/server/services/teamRunner.d.ts +39 -0
- package/dist-server/server/services/teamRunner.d.ts.map +1 -0
- package/dist-server/server/services/teamRunner.js +76 -0
- package/dist-server/server/services/teamRunner.js.map +1 -0
- package/dist-server/server/services/worktreeManager.d.ts +27 -0
- package/dist-server/server/services/worktreeManager.d.ts.map +1 -0
- package/dist-server/server/services/worktreeManager.js +107 -0
- package/dist-server/server/services/worktreeManager.js.map +1 -0
- package/dist-server/server/types.d.ts +30 -0
- package/dist-server/server/types.d.ts.map +1 -0
- package/dist-server/server/types.js +2 -0
- package/dist-server/server/types.js.map +1 -0
- package/dist-server/server/utils/pathSecurity.d.ts +34 -0
- package/dist-server/server/utils/pathSecurity.d.ts.map +1 -0
- package/dist-server/server/utils/pathSecurity.js +78 -0
- package/dist-server/server/utils/pathSecurity.js.map +1 -0
- package/dist-server/src/services/budgetAllocator.d.ts +37 -0
- package/dist-server/src/services/budgetAllocator.d.ts.map +1 -0
- package/dist-server/src/services/budgetAllocator.js +120 -0
- package/dist-server/src/services/budgetAllocator.js.map +1 -0
- package/dist-server/src/services/contradictionDetector.d.ts +18 -0
- package/dist-server/src/services/contradictionDetector.d.ts.map +1 -0
- package/dist-server/src/services/contradictionDetector.js +111 -0
- package/dist-server/src/services/contradictionDetector.js.map +1 -0
- package/dist-server/src/services/treeIndexer.d.ts +91 -0
- package/dist-server/src/services/treeIndexer.d.ts.map +1 -0
- package/dist-server/src/services/treeIndexer.js +289 -0
- package/dist-server/src/services/treeIndexer.js.map +1 -0
- package/dist-server/src/store/knowledgeBase.d.ts +130 -0
- package/dist-server/src/store/knowledgeBase.d.ts.map +1 -0
- package/dist-server/src/store/knowledgeBase.js +299 -0
- package/dist-server/src/store/knowledgeBase.js.map +1 -0
- package/dist-server/tsconfig.server.tsbuildinfo +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
const TYPE_PRIORITY = {
|
|
2
|
+
'ground-truth': 0, 'guideline': 1, 'framework': 2, 'evidence': 3, 'signal': 4, 'hypothesis': 5,
|
|
3
|
+
};
|
|
4
|
+
const STOPWORDS = new Set(['The', 'This', 'That', 'These', 'Those', 'With', 'From', 'Into', 'About', 'After', 'Before', 'Between', 'Under', 'Over', 'Through', 'During', 'Against', 'Without', 'Within', 'Along', 'Around', 'Among', 'Beyond', 'Behind', 'Above', 'Below', 'Across', 'Inside', 'Outside', 'Upon', 'Near', 'South', 'North', 'East', 'West', 'New', 'Old', 'First', 'Last', 'Next', 'Each', 'Every', 'Both', 'Such', 'Other', 'Another', 'United', 'States', 'National']);
|
|
5
|
+
/**
|
|
6
|
+
* Extracts entities from content using capitalized multi-word phrases
|
|
7
|
+
* Filters out stopwords from entity parts
|
|
8
|
+
*/
|
|
9
|
+
function extractEntities(content) {
|
|
10
|
+
const entityRegex = /\b[A-Z][a-z]+(?:\s+[A-Z][a-z]+)+\b/g;
|
|
11
|
+
const entities = new Set();
|
|
12
|
+
let match;
|
|
13
|
+
while ((match = entityRegex.exec(content)) !== null) {
|
|
14
|
+
const entity = match[0];
|
|
15
|
+
// Filter out entities that contain only stopwords
|
|
16
|
+
const words = entity.split(/\s+/);
|
|
17
|
+
const nonStopWords = words.filter(word => !STOPWORDS.has(word));
|
|
18
|
+
if (nonStopWords.length >= 2) {
|
|
19
|
+
// Normalize the entity (remove extra spaces, maintain case for first letter of each word)
|
|
20
|
+
const normalizedEntity = nonStopWords.join(' ');
|
|
21
|
+
entities.add(normalizedEntity);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return entities;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolves contradictions between sources by prioritizing higher-authority sources
|
|
28
|
+
* For same entities appearing in multiple sources with different types
|
|
29
|
+
*/
|
|
30
|
+
export function resolveContradictions(sources) {
|
|
31
|
+
if (sources.length === 0) {
|
|
32
|
+
return { sources: [], annotations: [], contradictionsFound: 0 };
|
|
33
|
+
}
|
|
34
|
+
// Extract entities from each source
|
|
35
|
+
const sourceEntities = sources.map(source => ({
|
|
36
|
+
source,
|
|
37
|
+
entities: extractEntities(source.content)
|
|
38
|
+
}));
|
|
39
|
+
// Find all entities and track which sources contain them
|
|
40
|
+
const entityToSources = new Map();
|
|
41
|
+
for (const { source, entities } of sourceEntities) {
|
|
42
|
+
for (const entity of entities) {
|
|
43
|
+
if (!entityToSources.has(entity)) {
|
|
44
|
+
entityToSources.set(entity, []);
|
|
45
|
+
}
|
|
46
|
+
entityToSources.get(entity).push({ source, entities });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const keptSources = new Set();
|
|
50
|
+
const annotations = [];
|
|
51
|
+
let contradictionsFound = 0;
|
|
52
|
+
// Process each entity that appears in multiple sources
|
|
53
|
+
for (const [entity, entitySources] of entityToSources.entries()) {
|
|
54
|
+
if (entitySources.length < 2) {
|
|
55
|
+
// Entity appears in only one source - no contradiction
|
|
56
|
+
keptSources.add(entitySources[0].source);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
// Group sources by type for this entity
|
|
60
|
+
const sourcesByType = new Map();
|
|
61
|
+
for (const entitySource of entitySources) {
|
|
62
|
+
const type = entitySource.source.type;
|
|
63
|
+
if (!sourcesByType.has(type)) {
|
|
64
|
+
sourcesByType.set(type, []);
|
|
65
|
+
}
|
|
66
|
+
sourcesByType.get(type).push(entitySource);
|
|
67
|
+
}
|
|
68
|
+
if (sourcesByType.size === 1) {
|
|
69
|
+
// All sources have same type - pick largest
|
|
70
|
+
const sameTypeSources = Array.from(sourcesByType.values())[0];
|
|
71
|
+
const largest = sameTypeSources.reduce((max, current) => current.source.content.length > max.source.content.length ? current : max);
|
|
72
|
+
keptSources.add(largest.source);
|
|
73
|
+
// Add dropped sources as annotation if multiple sources of same type
|
|
74
|
+
if (sameTypeSources.length > 1) {
|
|
75
|
+
const droppedNames = sameTypeSources
|
|
76
|
+
.filter(s => s.source !== largest.source)
|
|
77
|
+
.map(s => s.source.name);
|
|
78
|
+
if (droppedNames.length > 0) {
|
|
79
|
+
annotations.push(`Dropped duplicate ${largest.source.type} sources for "${entity}": ${droppedNames.join(', ')}`);
|
|
80
|
+
contradictionsFound++;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Multiple types - pick highest priority (lowest number)
|
|
86
|
+
const typeEntries = Array.from(sourcesByType.entries());
|
|
87
|
+
typeEntries.sort((a, b) => TYPE_PRIORITY[a[0]] - TYPE_PRIORITY[b[0]]);
|
|
88
|
+
const [winningType, winningSources] = typeEntries[0];
|
|
89
|
+
// Pick largest source from winning type
|
|
90
|
+
const winner = winningSources.reduce((max, current) => current.source.content.length > max.source.content.length ? current : max);
|
|
91
|
+
keptSources.add(winner.source);
|
|
92
|
+
// Add annotation about dropped sources
|
|
93
|
+
const droppedTypes = typeEntries.slice(1).map(([type, sources]) => `${type} (${sources.map(s => s.source.name).join(', ')})`);
|
|
94
|
+
annotations.push(`Kept ${winningType} source "${winner.source.name}" for "${entity}"; dropped ${droppedTypes.join(', ')}`);
|
|
95
|
+
contradictionsFound++;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Add any sources that don't contain any entities
|
|
99
|
+
for (const source of sources) {
|
|
100
|
+
const hasEntities = sourceEntities.find(se => se.source === source)?.entities.size > 0;
|
|
101
|
+
if (!hasEntities) {
|
|
102
|
+
keptSources.add(source);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
sources: Array.from(keptSources),
|
|
107
|
+
annotations,
|
|
108
|
+
contradictionsFound
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=contradictionDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contradictionDetector.js","sourceRoot":"","sources":["../../../src/services/contradictionDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree Indexer — Source-Agnostic Document Indexing
|
|
3
|
+
*
|
|
4
|
+
* Converts ANY structured content into a PageIndex-compatible tree.
|
|
5
|
+
* The tree is the universal intermediate representation for the
|
|
6
|
+
* context engineering pipeline:
|
|
7
|
+
*
|
|
8
|
+
* Source (any) → Connector (normalize) → TreeIndex → DepthFilter → Context Assembly
|
|
9
|
+
*
|
|
10
|
+
* Connectors:
|
|
11
|
+
* - markdown: heading-based hierarchy (built-in)
|
|
12
|
+
* - structured: pre-structured data (API responses, CRM records, meeting notes)
|
|
13
|
+
* - flat: unstructured text (wraps in single root node)
|
|
14
|
+
*
|
|
15
|
+
* Future connectors (external):
|
|
16
|
+
* - Notion pages (block hierarchy)
|
|
17
|
+
* - HubSpot records (field groups)
|
|
18
|
+
* - Slack threads (chronological)
|
|
19
|
+
* - Granola transcripts (timestamped sections)
|
|
20
|
+
* - PDF via PageIndex API
|
|
21
|
+
*/
|
|
22
|
+
export interface TreeNode {
|
|
23
|
+
nodeId: string;
|
|
24
|
+
title: string;
|
|
25
|
+
depth: number;
|
|
26
|
+
text: string;
|
|
27
|
+
tokens: number;
|
|
28
|
+
totalTokens: number;
|
|
29
|
+
children: TreeNode[];
|
|
30
|
+
meta?: {
|
|
31
|
+
lineStart?: number;
|
|
32
|
+
lineEnd?: number;
|
|
33
|
+
firstSentence: string;
|
|
34
|
+
firstParagraph: string;
|
|
35
|
+
sourceType?: string;
|
|
36
|
+
sourceId?: string;
|
|
37
|
+
timestamp?: number;
|
|
38
|
+
fieldGroup?: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export interface TreeIndex {
|
|
42
|
+
source: string;
|
|
43
|
+
sourceType: string;
|
|
44
|
+
root: TreeNode;
|
|
45
|
+
totalTokens: number;
|
|
46
|
+
nodeCount: number;
|
|
47
|
+
created: number;
|
|
48
|
+
}
|
|
49
|
+
/** Rough token estimate: ~4 chars per token for English text */
|
|
50
|
+
/**
|
|
51
|
+
* Estimate token count from text.
|
|
52
|
+
* Uses word-boundary split (~1.3 tokens per word for English)
|
|
53
|
+
* with adjustment for code blocks (~0.4 tokens per char).
|
|
54
|
+
*/
|
|
55
|
+
export declare function estimateTokens(text: string): number;
|
|
56
|
+
/**
|
|
57
|
+
* Parse markdown into a tree of heading-based nodes.
|
|
58
|
+
* Most common connector — works for any .md, README, docs, AGENTS.md, etc.
|
|
59
|
+
*/
|
|
60
|
+
export declare function indexMarkdown(source: string, markdown: string): TreeIndex;
|
|
61
|
+
export interface StructuredField {
|
|
62
|
+
key: string;
|
|
63
|
+
label: string;
|
|
64
|
+
value: string;
|
|
65
|
+
group?: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Index structured data (CRM records, API responses, etc.) into a tree.
|
|
69
|
+
* Groups fields by their `group` property, creating a 2-level tree.
|
|
70
|
+
*
|
|
71
|
+
* Works for: HubSpot deals/contacts, Notion databases, any key-value data.
|
|
72
|
+
*/
|
|
73
|
+
export declare function indexStructured(source: string, fields: StructuredField[], sourceType?: string): TreeIndex;
|
|
74
|
+
export interface ChronoEntry {
|
|
75
|
+
timestamp: number;
|
|
76
|
+
speaker?: string;
|
|
77
|
+
text: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Index chronological data (chat threads, meeting transcripts) into a tree.
|
|
81
|
+
* Groups entries into time-based segments.
|
|
82
|
+
*
|
|
83
|
+
* Works for: Slack threads, Granola transcripts, chat logs.
|
|
84
|
+
*/
|
|
85
|
+
export declare function indexChronological(source: string, entries: ChronoEntry[], sourceType?: string, segmentMinutes?: number): TreeIndex;
|
|
86
|
+
/**
|
|
87
|
+
* Wrap unstructured text in a single root node.
|
|
88
|
+
* Fallback for any source without inherent structure.
|
|
89
|
+
*/
|
|
90
|
+
export declare function indexFlat(source: string, text: string, sourceType?: string): TreeIndex;
|
|
91
|
+
//# sourceMappingURL=treeIndexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"treeIndexer.d.ts","sourceRoot":"","sources":["../../../src/services/treeIndexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE;QACL,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,gEAAgE;AAChE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQnD;AA+BD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAiFzE;AAID,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,UAAU,SAAe,GAAG,SAAS,CAmD/G;AAID,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EAAE,EACtB,UAAU,SAAkB,EAC5B,cAAc,SAAK,GAClB,SAAS,CAiEX;AAID;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,SAAS,GAAG,SAAS,CAwBtF"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree Indexer — Source-Agnostic Document Indexing
|
|
3
|
+
*
|
|
4
|
+
* Converts ANY structured content into a PageIndex-compatible tree.
|
|
5
|
+
* The tree is the universal intermediate representation for the
|
|
6
|
+
* context engineering pipeline:
|
|
7
|
+
*
|
|
8
|
+
* Source (any) → Connector (normalize) → TreeIndex → DepthFilter → Context Assembly
|
|
9
|
+
*
|
|
10
|
+
* Connectors:
|
|
11
|
+
* - markdown: heading-based hierarchy (built-in)
|
|
12
|
+
* - structured: pre-structured data (API responses, CRM records, meeting notes)
|
|
13
|
+
* - flat: unstructured text (wraps in single root node)
|
|
14
|
+
*
|
|
15
|
+
* Future connectors (external):
|
|
16
|
+
* - Notion pages (block hierarchy)
|
|
17
|
+
* - HubSpot records (field groups)
|
|
18
|
+
* - Slack threads (chronological)
|
|
19
|
+
* - Granola transcripts (timestamped sections)
|
|
20
|
+
* - PDF via PageIndex API
|
|
21
|
+
*/
|
|
22
|
+
/** Rough token estimate: ~4 chars per token for English text */
|
|
23
|
+
/**
|
|
24
|
+
* Estimate token count from text.
|
|
25
|
+
* Uses word-boundary split (~1.3 tokens per word for English)
|
|
26
|
+
* with adjustment for code blocks (~0.4 tokens per char).
|
|
27
|
+
*/
|
|
28
|
+
export function estimateTokens(text) {
|
|
29
|
+
if (!text)
|
|
30
|
+
return 0;
|
|
31
|
+
// Code blocks are denser (more tokens per char)
|
|
32
|
+
const codeBlockMatch = text.match(/```[\s\S]*?```/g);
|
|
33
|
+
const codeChars = codeBlockMatch ? codeBlockMatch.reduce((s, b) => s + b.length, 0) : 0;
|
|
34
|
+
const proseChars = text.length - codeChars;
|
|
35
|
+
// Prose: ~4 chars/token. Code: ~2.5 chars/token.
|
|
36
|
+
return Math.ceil(proseChars / 4 + codeChars / 2.5);
|
|
37
|
+
}
|
|
38
|
+
function extractFirstSentence(text) {
|
|
39
|
+
const match = text.match(/^[^\n]*?[.!?](?:\s|$)/);
|
|
40
|
+
return match ? match[0].trim() : text.split('\n')[0].slice(0, 200);
|
|
41
|
+
}
|
|
42
|
+
function extractFirstParagraph(text) {
|
|
43
|
+
const para = text.split(/\n\s*\n/)[0];
|
|
44
|
+
return para ? para.trim().slice(0, 1000) : '';
|
|
45
|
+
}
|
|
46
|
+
function genNodeId(depth, index) {
|
|
47
|
+
return `n${depth}-${index}`;
|
|
48
|
+
}
|
|
49
|
+
function computeTotals(node) {
|
|
50
|
+
let total = node.tokens;
|
|
51
|
+
for (const child of node.children)
|
|
52
|
+
total += computeTotals(child);
|
|
53
|
+
node.totalTokens = total;
|
|
54
|
+
return total;
|
|
55
|
+
}
|
|
56
|
+
function countNodes(node) {
|
|
57
|
+
let c = 1;
|
|
58
|
+
for (const child of node.children)
|
|
59
|
+
c += countNodes(child);
|
|
60
|
+
return c;
|
|
61
|
+
}
|
|
62
|
+
// ── Markdown Connector ──
|
|
63
|
+
/**
|
|
64
|
+
* Parse markdown into a tree of heading-based nodes.
|
|
65
|
+
* Most common connector — works for any .md, README, docs, AGENTS.md, etc.
|
|
66
|
+
*/
|
|
67
|
+
export function indexMarkdown(source, markdown) {
|
|
68
|
+
const lines = markdown.split('\n');
|
|
69
|
+
let nodeCounter = 0;
|
|
70
|
+
const root = {
|
|
71
|
+
nodeId: genNodeId(0, nodeCounter++),
|
|
72
|
+
title: source,
|
|
73
|
+
depth: 0,
|
|
74
|
+
text: '',
|
|
75
|
+
tokens: 0,
|
|
76
|
+
totalTokens: 0,
|
|
77
|
+
children: [],
|
|
78
|
+
};
|
|
79
|
+
const stack = [root];
|
|
80
|
+
let currentText = [];
|
|
81
|
+
let currentLineStart = 0;
|
|
82
|
+
function flushText(lineEnd) {
|
|
83
|
+
const text = currentText.join('\n').trim();
|
|
84
|
+
const current = stack[stack.length - 1];
|
|
85
|
+
current.text = text;
|
|
86
|
+
current.tokens = estimateTokens(text);
|
|
87
|
+
if (current.meta) {
|
|
88
|
+
current.meta.lineEnd = lineEnd;
|
|
89
|
+
current.meta.firstSentence = extractFirstSentence(text);
|
|
90
|
+
current.meta.firstParagraph = extractFirstParagraph(text);
|
|
91
|
+
}
|
|
92
|
+
else if (text) {
|
|
93
|
+
current.meta = {
|
|
94
|
+
lineStart: currentLineStart,
|
|
95
|
+
lineEnd,
|
|
96
|
+
firstSentence: extractFirstSentence(text),
|
|
97
|
+
firstParagraph: extractFirstParagraph(text),
|
|
98
|
+
sourceType: 'markdown',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
currentText = [];
|
|
102
|
+
}
|
|
103
|
+
const headingRegex = /^(#{1,6})\s+(.+)$/;
|
|
104
|
+
for (let i = 0; i < lines.length; i++) {
|
|
105
|
+
const line = lines[i];
|
|
106
|
+
const match = headingRegex.exec(line);
|
|
107
|
+
if (match) {
|
|
108
|
+
flushText(i - 1);
|
|
109
|
+
const level = match[1].length;
|
|
110
|
+
const title = match[2].trim();
|
|
111
|
+
const node = {
|
|
112
|
+
nodeId: genNodeId(level, nodeCounter++),
|
|
113
|
+
title,
|
|
114
|
+
depth: level,
|
|
115
|
+
text: '',
|
|
116
|
+
tokens: 0,
|
|
117
|
+
totalTokens: 0,
|
|
118
|
+
children: [],
|
|
119
|
+
meta: { lineStart: i, lineEnd: i, firstSentence: '', firstParagraph: '', sourceType: 'markdown' },
|
|
120
|
+
};
|
|
121
|
+
while (stack.length > 1 && stack[stack.length - 1].depth >= level)
|
|
122
|
+
stack.pop();
|
|
123
|
+
stack[stack.length - 1].children.push(node);
|
|
124
|
+
stack.push(node);
|
|
125
|
+
currentLineStart = i + 1;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
currentText.push(line);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
flushText(lines.length - 1);
|
|
132
|
+
computeTotals(root);
|
|
133
|
+
return {
|
|
134
|
+
source,
|
|
135
|
+
sourceType: 'markdown',
|
|
136
|
+
root,
|
|
137
|
+
totalTokens: root.totalTokens,
|
|
138
|
+
nodeCount: countNodes(root),
|
|
139
|
+
created: Date.now(),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Index structured data (CRM records, API responses, etc.) into a tree.
|
|
144
|
+
* Groups fields by their `group` property, creating a 2-level tree.
|
|
145
|
+
*
|
|
146
|
+
* Works for: HubSpot deals/contacts, Notion databases, any key-value data.
|
|
147
|
+
*/
|
|
148
|
+
export function indexStructured(source, fields, sourceType = 'structured') {
|
|
149
|
+
let nodeCounter = 0;
|
|
150
|
+
const root = {
|
|
151
|
+
nodeId: genNodeId(0, nodeCounter++),
|
|
152
|
+
title: source,
|
|
153
|
+
depth: 0,
|
|
154
|
+
text: '',
|
|
155
|
+
tokens: 0,
|
|
156
|
+
totalTokens: 0,
|
|
157
|
+
children: [],
|
|
158
|
+
};
|
|
159
|
+
// Group fields
|
|
160
|
+
const groups = new Map();
|
|
161
|
+
for (const f of fields) {
|
|
162
|
+
const g = f.group || 'default';
|
|
163
|
+
if (!groups.has(g))
|
|
164
|
+
groups.set(g, []);
|
|
165
|
+
groups.get(g).push(f);
|
|
166
|
+
}
|
|
167
|
+
for (const [groupName, groupFields] of groups) {
|
|
168
|
+
const text = groupFields.map(f => `${f.label}: ${f.value}`).join('\n');
|
|
169
|
+
const groupNode = {
|
|
170
|
+
nodeId: genNodeId(1, nodeCounter++),
|
|
171
|
+
title: groupName === 'default' ? source : groupName,
|
|
172
|
+
depth: 1,
|
|
173
|
+
text,
|
|
174
|
+
tokens: estimateTokens(text),
|
|
175
|
+
totalTokens: 0,
|
|
176
|
+
children: [],
|
|
177
|
+
meta: {
|
|
178
|
+
firstSentence: groupFields[0] ? `${groupFields[0].label}: ${groupFields[0].value}` : '',
|
|
179
|
+
firstParagraph: text.slice(0, 1000),
|
|
180
|
+
sourceType,
|
|
181
|
+
fieldGroup: groupName,
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
root.children.push(groupNode);
|
|
185
|
+
}
|
|
186
|
+
computeTotals(root);
|
|
187
|
+
return {
|
|
188
|
+
source,
|
|
189
|
+
sourceType,
|
|
190
|
+
root,
|
|
191
|
+
totalTokens: root.totalTokens,
|
|
192
|
+
nodeCount: countNodes(root),
|
|
193
|
+
created: Date.now(),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Index chronological data (chat threads, meeting transcripts) into a tree.
|
|
198
|
+
* Groups entries into time-based segments.
|
|
199
|
+
*
|
|
200
|
+
* Works for: Slack threads, Granola transcripts, chat logs.
|
|
201
|
+
*/
|
|
202
|
+
export function indexChronological(source, entries, sourceType = 'chronological', segmentMinutes = 10) {
|
|
203
|
+
let nodeCounter = 0;
|
|
204
|
+
const root = {
|
|
205
|
+
nodeId: genNodeId(0, nodeCounter++),
|
|
206
|
+
title: source,
|
|
207
|
+
depth: 0,
|
|
208
|
+
text: '',
|
|
209
|
+
tokens: 0,
|
|
210
|
+
totalTokens: 0,
|
|
211
|
+
children: [],
|
|
212
|
+
};
|
|
213
|
+
if (entries.length === 0) {
|
|
214
|
+
computeTotals(root);
|
|
215
|
+
return { source, sourceType, root, totalTokens: 0, nodeCount: 1, created: Date.now() };
|
|
216
|
+
}
|
|
217
|
+
// Segment by time gaps
|
|
218
|
+
const segmentMs = segmentMinutes * 60 * 1000;
|
|
219
|
+
let currentSegment = [entries[0]];
|
|
220
|
+
const segments = [];
|
|
221
|
+
for (let i = 1; i < entries.length; i++) {
|
|
222
|
+
if (entries[i].timestamp - entries[i - 1].timestamp > segmentMs) {
|
|
223
|
+
segments.push(currentSegment);
|
|
224
|
+
currentSegment = [];
|
|
225
|
+
}
|
|
226
|
+
currentSegment.push(entries[i]);
|
|
227
|
+
}
|
|
228
|
+
segments.push(currentSegment);
|
|
229
|
+
for (const seg of segments) {
|
|
230
|
+
const start = new Date(seg[0].timestamp);
|
|
231
|
+
const title = `${start.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;
|
|
232
|
+
const text = seg.map(e => e.speaker ? `${e.speaker}: ${e.text}` : e.text).join('\n');
|
|
233
|
+
const segNode = {
|
|
234
|
+
nodeId: genNodeId(1, nodeCounter++),
|
|
235
|
+
title,
|
|
236
|
+
depth: 1,
|
|
237
|
+
text,
|
|
238
|
+
tokens: estimateTokens(text),
|
|
239
|
+
totalTokens: 0,
|
|
240
|
+
children: [],
|
|
241
|
+
meta: {
|
|
242
|
+
firstSentence: seg[0].text.slice(0, 200),
|
|
243
|
+
firstParagraph: text.slice(0, 1000),
|
|
244
|
+
sourceType,
|
|
245
|
+
timestamp: seg[0].timestamp,
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
root.children.push(segNode);
|
|
249
|
+
}
|
|
250
|
+
computeTotals(root);
|
|
251
|
+
return {
|
|
252
|
+
source,
|
|
253
|
+
sourceType,
|
|
254
|
+
root,
|
|
255
|
+
totalTokens: root.totalTokens,
|
|
256
|
+
nodeCount: countNodes(root),
|
|
257
|
+
created: Date.now(),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
// ── Flat Text Connector ──
|
|
261
|
+
/**
|
|
262
|
+
* Wrap unstructured text in a single root node.
|
|
263
|
+
* Fallback for any source without inherent structure.
|
|
264
|
+
*/
|
|
265
|
+
export function indexFlat(source, text, sourceType = 'flat') {
|
|
266
|
+
const root = {
|
|
267
|
+
nodeId: 'n0-0',
|
|
268
|
+
title: source,
|
|
269
|
+
depth: 0,
|
|
270
|
+
text: text.trim(),
|
|
271
|
+
tokens: estimateTokens(text),
|
|
272
|
+
totalTokens: estimateTokens(text),
|
|
273
|
+
children: [],
|
|
274
|
+
meta: {
|
|
275
|
+
firstSentence: extractFirstSentence(text),
|
|
276
|
+
firstParagraph: extractFirstParagraph(text),
|
|
277
|
+
sourceType,
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
return {
|
|
281
|
+
source,
|
|
282
|
+
sourceType,
|
|
283
|
+
root,
|
|
284
|
+
totalTokens: root.totalTokens,
|
|
285
|
+
nodeCount: 1,
|
|
286
|
+
created: Date.now(),
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=treeIndexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"treeIndexer.js","sourceRoot":"","sources":["../../../src/services/treeIndexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
export type Category = 'knowledge' | 'discovery' | 'intel' | 'agents';
|
|
2
|
+
export declare const CATEGORY_COLORS: Record<Category, string>;
|
|
3
|
+
export type KnowledgeType = 'ground-truth' | 'signal' | 'evidence' | 'framework' | 'hypothesis' | 'guideline';
|
|
4
|
+
export declare const KNOWLEDGE_TYPES: Record<KnowledgeType, {
|
|
5
|
+
label: string;
|
|
6
|
+
color: string;
|
|
7
|
+
icon: string;
|
|
8
|
+
instruction: string;
|
|
9
|
+
}>;
|
|
10
|
+
export interface ClassificationResult {
|
|
11
|
+
knowledgeType: KnowledgeType;
|
|
12
|
+
depth: number;
|
|
13
|
+
confidence: 'high' | 'medium' | 'low';
|
|
14
|
+
reason: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Classify a knowledge source by path + content.
|
|
18
|
+
* Path rules take precedence (explicit folder structure = intentional).
|
|
19
|
+
* Content rules are scored by pattern match count × weight.
|
|
20
|
+
*/
|
|
21
|
+
export declare function classifyKnowledgeType(path: string, content?: string): KnowledgeType;
|
|
22
|
+
export declare function classifyKnowledge(path: string, content?: string): ClassificationResult;
|
|
23
|
+
export declare function suggestDepth(content: string, type: KnowledgeType): number;
|
|
24
|
+
export type OutputFormat = 'markdown' | 'html-slides' | 'email' | 'code' | 'csv' | 'json' | 'diagram' | 'slack';
|
|
25
|
+
export declare const OUTPUT_FORMATS: {
|
|
26
|
+
id: OutputFormat;
|
|
27
|
+
label: string;
|
|
28
|
+
icon: string;
|
|
29
|
+
ext: string;
|
|
30
|
+
}[];
|
|
31
|
+
export declare function detectOutputFormat(prompt: string): OutputFormat;
|
|
32
|
+
export interface KnowledgeSource {
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
path: string;
|
|
36
|
+
category: Category;
|
|
37
|
+
tokenEstimate: number;
|
|
38
|
+
children?: KnowledgeSource[];
|
|
39
|
+
}
|
|
40
|
+
export type DepthLevel = 'Full' | 'Detail' | 'Summary' | 'Headlines' | 'Mention';
|
|
41
|
+
export declare const DEPTH_LEVELS: {
|
|
42
|
+
label: DepthLevel;
|
|
43
|
+
pct: number;
|
|
44
|
+
}[];
|
|
45
|
+
export interface ChannelConfig {
|
|
46
|
+
sourceId: string;
|
|
47
|
+
name: string;
|
|
48
|
+
path: string;
|
|
49
|
+
category: Category;
|
|
50
|
+
knowledgeType: KnowledgeType;
|
|
51
|
+
enabled: boolean;
|
|
52
|
+
depth: number;
|
|
53
|
+
baseTokens: number;
|
|
54
|
+
content?: string;
|
|
55
|
+
repoMeta?: {
|
|
56
|
+
name: string;
|
|
57
|
+
stack: string[];
|
|
58
|
+
totalFiles: number;
|
|
59
|
+
baseUrl?: string;
|
|
60
|
+
features: string[];
|
|
61
|
+
};
|
|
62
|
+
contentSourceId?: string;
|
|
63
|
+
}
|
|
64
|
+
export type PlanningMode = 'single-shot' | 'chain-of-thought' | 'react';
|
|
65
|
+
export interface AgentConfig {
|
|
66
|
+
model: string;
|
|
67
|
+
temperature: number;
|
|
68
|
+
systemPrompt: string;
|
|
69
|
+
planningMode: PlanningMode;
|
|
70
|
+
maxTokens: number;
|
|
71
|
+
}
|
|
72
|
+
export declare const DEFAULT_AGENT_CONFIG: AgentConfig;
|
|
73
|
+
export interface Preset {
|
|
74
|
+
id: string;
|
|
75
|
+
name: string;
|
|
76
|
+
channels: Omit<ChannelConfig, 'enabled'>[];
|
|
77
|
+
agentConfig?: Partial<AgentConfig>;
|
|
78
|
+
}
|
|
79
|
+
export type McpCategory = 'communication' | 'development' | 'data' | 'productivity';
|
|
80
|
+
export interface McpServer {
|
|
81
|
+
id: string;
|
|
82
|
+
name: string;
|
|
83
|
+
icon: string;
|
|
84
|
+
connected: boolean;
|
|
85
|
+
enabled: boolean;
|
|
86
|
+
added: boolean;
|
|
87
|
+
capabilities: string[];
|
|
88
|
+
category: McpCategory;
|
|
89
|
+
description: string;
|
|
90
|
+
}
|
|
91
|
+
export type SkillCategory = 'content' | 'analysis' | 'development' | 'domain';
|
|
92
|
+
export interface Skill {
|
|
93
|
+
id: string;
|
|
94
|
+
name: string;
|
|
95
|
+
icon: string;
|
|
96
|
+
enabled: boolean;
|
|
97
|
+
added: boolean;
|
|
98
|
+
description: string;
|
|
99
|
+
category: SkillCategory;
|
|
100
|
+
skillUrl?: string;
|
|
101
|
+
installedFrom?: 'local' | 'skills.sh' | 'registry';
|
|
102
|
+
installs?: string;
|
|
103
|
+
}
|
|
104
|
+
export interface AgentDef {
|
|
105
|
+
id: string;
|
|
106
|
+
name: string;
|
|
107
|
+
initials: string;
|
|
108
|
+
model: string;
|
|
109
|
+
description: string;
|
|
110
|
+
linkedSkills?: string[];
|
|
111
|
+
}
|
|
112
|
+
export type ConnectorService = 'notion' | 'hubspot' | 'slack' | 'granola' | 'github' | 'google-drive' | 'custom';
|
|
113
|
+
export type ConnectorDirection = 'read' | 'write' | 'both';
|
|
114
|
+
export type ConnectorStatus = 'connected' | 'configured' | 'available';
|
|
115
|
+
export type ConnectorAuthMethod = 'oauth' | 'api-key' | 'none';
|
|
116
|
+
export interface Connector {
|
|
117
|
+
id: string;
|
|
118
|
+
service: ConnectorService;
|
|
119
|
+
name: string;
|
|
120
|
+
mcpServerId: string;
|
|
121
|
+
direction: ConnectorDirection;
|
|
122
|
+
enabled: boolean;
|
|
123
|
+
config: Record<string, string>;
|
|
124
|
+
status: ConnectorStatus;
|
|
125
|
+
authMethod: ConnectorAuthMethod;
|
|
126
|
+
url?: string;
|
|
127
|
+
hint?: string;
|
|
128
|
+
}
|
|
129
|
+
export declare const PRESETS: Preset[];
|
|
130
|
+
//# sourceMappingURL=knowledgeBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledgeBase.d.ts","sourceRoot":"","sources":["../../../src/store/knowledgeBase.ts"],"names":[],"mappings":"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"}
|