stellavault 0.4.4 → 0.5.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 +52 -16
- package/SECURITY.md +50 -0
- package/dist/stellavault.js +8968 -0
- package/package.json +70 -33
- package/.env.example +0 -12
- package/CHANGELOG.md +0 -106
- package/CLAUDE.md +0 -42
- package/CONTRIBUTING.md +0 -65
- package/index.html +0 -509
- package/packages/cli/bin/ekh.js +0 -2
- package/packages/cli/bin/stellavault.js +0 -2
- package/packages/cli/dist/commands/adr-cmd.d.ts +0 -7
- package/packages/cli/dist/commands/adr-cmd.js +0 -45
- package/packages/cli/dist/commands/ask-cmd.d.ts +0 -5
- package/packages/cli/dist/commands/ask-cmd.js +0 -36
- package/packages/cli/dist/commands/autopilot-cmd.d.ts +0 -4
- package/packages/cli/dist/commands/autopilot-cmd.js +0 -76
- package/packages/cli/dist/commands/brief-cmd.d.ts +0 -2
- package/packages/cli/dist/commands/brief-cmd.js +0 -82
- package/packages/cli/dist/commands/capture-cmd.d.ts +0 -7
- package/packages/cli/dist/commands/capture-cmd.js +0 -31
- package/packages/cli/dist/commands/card-cmd.d.ts +0 -4
- package/packages/cli/dist/commands/card-cmd.js +0 -26
- package/packages/cli/dist/commands/clip-cmd.d.ts +0 -4
- package/packages/cli/dist/commands/clip-cmd.js +0 -151
- package/packages/cli/dist/commands/cloud-cmd.d.ts +0 -4
- package/packages/cli/dist/commands/cloud-cmd.js +0 -64
- package/packages/cli/dist/commands/compile-cmd.d.ts +0 -6
- package/packages/cli/dist/commands/compile-cmd.js +0 -30
- package/packages/cli/dist/commands/contradictions-cmd.d.ts +0 -2
- package/packages/cli/dist/commands/contradictions-cmd.js +0 -34
- package/packages/cli/dist/commands/decay-cmd.d.ts +0 -2
- package/packages/cli/dist/commands/decay-cmd.js +0 -48
- package/packages/cli/dist/commands/digest-cmd.d.ts +0 -5
- package/packages/cli/dist/commands/digest-cmd.js +0 -136
- package/packages/cli/dist/commands/draft-cmd.d.ts +0 -6
- package/packages/cli/dist/commands/draft-cmd.js +0 -110
- package/packages/cli/dist/commands/duplicates-cmd.d.ts +0 -4
- package/packages/cli/dist/commands/duplicates-cmd.js +0 -30
- package/packages/cli/dist/commands/federate-cmd.d.ts +0 -5
- package/packages/cli/dist/commands/federate-cmd.js +0 -247
- package/packages/cli/dist/commands/fleeting-cmd.d.ts +0 -4
- package/packages/cli/dist/commands/fleeting-cmd.js +0 -45
- package/packages/cli/dist/commands/flush-cmd.d.ts +0 -2
- package/packages/cli/dist/commands/flush-cmd.js +0 -58
- package/packages/cli/dist/commands/gaps-cmd.d.ts +0 -2
- package/packages/cli/dist/commands/gaps-cmd.js +0 -33
- package/packages/cli/dist/commands/graph-cmd.d.ts +0 -2
- package/packages/cli/dist/commands/graph-cmd.js +0 -89
- package/packages/cli/dist/commands/index-cmd.d.ts +0 -2
- package/packages/cli/dist/commands/index-cmd.js +0 -57
- package/packages/cli/dist/commands/ingest-cmd.d.ts +0 -9
- package/packages/cli/dist/commands/ingest-cmd.js +0 -195
- package/packages/cli/dist/commands/init-cmd.d.ts +0 -2
- package/packages/cli/dist/commands/init-cmd.js +0 -161
- package/packages/cli/dist/commands/learn-cmd.d.ts +0 -2
- package/packages/cli/dist/commands/learn-cmd.js +0 -48
- package/packages/cli/dist/commands/lint-cmd.d.ts +0 -2
- package/packages/cli/dist/commands/lint-cmd.js +0 -61
- package/packages/cli/dist/commands/pack-cmd.d.ts +0 -15
- package/packages/cli/dist/commands/pack-cmd.js +0 -93
- package/packages/cli/dist/commands/review-cmd.d.ts +0 -4
- package/packages/cli/dist/commands/review-cmd.js +0 -107
- package/packages/cli/dist/commands/search-cmd.d.ts +0 -4
- package/packages/cli/dist/commands/search-cmd.js +0 -38
- package/packages/cli/dist/commands/serve-cmd.d.ts +0 -2
- package/packages/cli/dist/commands/serve-cmd.js +0 -14
- package/packages/cli/dist/commands/session-cmd.d.ts +0 -7
- package/packages/cli/dist/commands/session-cmd.js +0 -95
- package/packages/cli/dist/commands/status-cmd.d.ts +0 -2
- package/packages/cli/dist/commands/status-cmd.js +0 -33
- package/packages/cli/dist/commands/sync-cmd.d.ts +0 -5
- package/packages/cli/dist/commands/sync-cmd.js +0 -62
- package/packages/cli/dist/commands/vault-cmd.d.ts +0 -10
- package/packages/cli/dist/commands/vault-cmd.js +0 -54
- package/packages/cli/dist/index.d.ts +0 -2
- package/packages/cli/dist/index.js +0 -233
- package/packages/cli/package.json +0 -24
- package/packages/core/dist/api/dashboard.d.ts +0 -3
- package/packages/core/dist/api/dashboard.js +0 -135
- package/packages/core/dist/api/graph-data.d.ts +0 -11
- package/packages/core/dist/api/graph-data.js +0 -255
- package/packages/core/dist/api/pwa.d.ts +0 -3
- package/packages/core/dist/api/pwa.js +0 -77
- package/packages/core/dist/api/server.d.ts +0 -16
- package/packages/core/dist/api/server.js +0 -1122
- package/packages/core/dist/capture/voice.d.ts +0 -24
- package/packages/core/dist/capture/voice.js +0 -135
- package/packages/core/dist/cloud/index.d.ts +0 -3
- package/packages/core/dist/cloud/index.js +0 -2
- package/packages/core/dist/cloud/sync.d.ts +0 -29
- package/packages/core/dist/cloud/sync.js +0 -137
- package/packages/core/dist/config.d.ts +0 -35
- package/packages/core/dist/config.js +0 -63
- package/packages/core/dist/federation/credits.d.ts +0 -26
- package/packages/core/dist/federation/credits.js +0 -56
- package/packages/core/dist/federation/identity.d.ts +0 -14
- package/packages/core/dist/federation/identity.js +0 -74
- package/packages/core/dist/federation/index.d.ts +0 -7
- package/packages/core/dist/federation/index.js +0 -5
- package/packages/core/dist/federation/node.d.ts +0 -31
- package/packages/core/dist/federation/node.js +0 -216
- package/packages/core/dist/federation/privacy.d.ts +0 -8
- package/packages/core/dist/federation/privacy.js +0 -40
- package/packages/core/dist/federation/reputation.d.ts +0 -37
- package/packages/core/dist/federation/reputation.js +0 -139
- package/packages/core/dist/federation/search.d.ts +0 -19
- package/packages/core/dist/federation/search.js +0 -101
- package/packages/core/dist/federation/sharing.d.ts +0 -72
- package/packages/core/dist/federation/sharing.js +0 -246
- package/packages/core/dist/federation/trust.d.ts +0 -15
- package/packages/core/dist/federation/trust.js +0 -60
- package/packages/core/dist/federation/types.d.ts +0 -40
- package/packages/core/dist/federation/types.js +0 -3
- package/packages/core/dist/i18n/index.d.ts +0 -6
- package/packages/core/dist/i18n/index.js +0 -81
- package/packages/core/dist/i18n/note-strings.d.ts +0 -5
- package/packages/core/dist/i18n/note-strings.js +0 -94
- package/packages/core/dist/index.d.ts +0 -123
- package/packages/core/dist/index.js +0 -74
- package/packages/core/dist/indexer/chunker.d.ts +0 -14
- package/packages/core/dist/indexer/chunker.js +0 -148
- package/packages/core/dist/indexer/embedder.d.ts +0 -8
- package/packages/core/dist/indexer/embedder.js +0 -3
- package/packages/core/dist/indexer/index.d.ts +0 -28
- package/packages/core/dist/indexer/index.js +0 -74
- package/packages/core/dist/indexer/local-embedder.d.ts +0 -3
- package/packages/core/dist/indexer/local-embedder.js +0 -29
- package/packages/core/dist/indexer/scanner.d.ts +0 -11
- package/packages/core/dist/indexer/scanner.js +0 -148
- package/packages/core/dist/indexer/watcher.d.ts +0 -19
- package/packages/core/dist/indexer/watcher.js +0 -49
- package/packages/core/dist/intelligence/ask-engine.d.ts +0 -24
- package/packages/core/dist/intelligence/ask-engine.js +0 -142
- package/packages/core/dist/intelligence/auto-linker.d.ts +0 -19
- package/packages/core/dist/intelligence/auto-linker.js +0 -126
- package/packages/core/dist/intelligence/code-linker.d.ts +0 -20
- package/packages/core/dist/intelligence/code-linker.js +0 -88
- package/packages/core/dist/intelligence/contradiction-detector.d.ts +0 -20
- package/packages/core/dist/intelligence/contradiction-detector.js +0 -115
- package/packages/core/dist/intelligence/decay-engine.d.ts +0 -27
- package/packages/core/dist/intelligence/decay-engine.js +0 -190
- package/packages/core/dist/intelligence/draft-generator.d.ts +0 -25
- package/packages/core/dist/intelligence/draft-generator.js +0 -277
- package/packages/core/dist/intelligence/duplicate-detector.d.ts +0 -20
- package/packages/core/dist/intelligence/duplicate-detector.js +0 -55
- package/packages/core/dist/intelligence/file-extractors.d.ts +0 -13
- package/packages/core/dist/intelligence/file-extractors.js +0 -155
- package/packages/core/dist/intelligence/fsrs.d.ts +0 -43
- package/packages/core/dist/intelligence/fsrs.js +0 -70
- package/packages/core/dist/intelligence/gap-detector.d.ts +0 -25
- package/packages/core/dist/intelligence/gap-detector.js +0 -78
- package/packages/core/dist/intelligence/ingest-pipeline.d.ts +0 -32
- package/packages/core/dist/intelligence/ingest-pipeline.js +0 -245
- package/packages/core/dist/intelligence/knowledge-lint.d.ts +0 -27
- package/packages/core/dist/intelligence/knowledge-lint.js +0 -132
- package/packages/core/dist/intelligence/learning-path.d.ts +0 -31
- package/packages/core/dist/intelligence/learning-path.js +0 -53
- package/packages/core/dist/intelligence/notifications.d.ts +0 -31
- package/packages/core/dist/intelligence/notifications.js +0 -65
- package/packages/core/dist/intelligence/predictive-gaps.d.ts +0 -14
- package/packages/core/dist/intelligence/predictive-gaps.js +0 -74
- package/packages/core/dist/intelligence/semantic-versioning.d.ts +0 -37
- package/packages/core/dist/intelligence/semantic-versioning.js +0 -68
- package/packages/core/dist/intelligence/types.d.ts +0 -28
- package/packages/core/dist/intelligence/types.js +0 -3
- package/packages/core/dist/intelligence/wiki-compiler.d.ts +0 -30
- package/packages/core/dist/intelligence/wiki-compiler.js +0 -222
- package/packages/core/dist/intelligence/youtube-extractor.d.ts +0 -29
- package/packages/core/dist/intelligence/youtube-extractor.js +0 -321
- package/packages/core/dist/intelligence/zettelkasten.d.ts +0 -59
- package/packages/core/dist/intelligence/zettelkasten.js +0 -234
- package/packages/core/dist/mcp/custom-tools.d.ts +0 -29
- package/packages/core/dist/mcp/custom-tools.js +0 -70
- package/packages/core/dist/mcp/index.d.ts +0 -2
- package/packages/core/dist/mcp/index.js +0 -2
- package/packages/core/dist/mcp/server.d.ts +0 -51
- package/packages/core/dist/mcp/server.js +0 -174
- package/packages/core/dist/mcp/tools/agentic-graph.d.ts +0 -93
- package/packages/core/dist/mcp/tools/agentic-graph.js +0 -116
- package/packages/core/dist/mcp/tools/ask.d.ts +0 -29
- package/packages/core/dist/mcp/tools/ask.js +0 -43
- package/packages/core/dist/mcp/tools/brief.d.ts +0 -31
- package/packages/core/dist/mcp/tools/brief.js +0 -39
- package/packages/core/dist/mcp/tools/decay.d.ts +0 -33
- package/packages/core/dist/mcp/tools/decay.js +0 -32
- package/packages/core/dist/mcp/tools/decision-journal.d.ts +0 -78
- package/packages/core/dist/mcp/tools/decision-journal.js +0 -79
- package/packages/core/dist/mcp/tools/detect-gaps.d.ts +0 -24
- package/packages/core/dist/mcp/tools/detect-gaps.js +0 -47
- package/packages/core/dist/mcp/tools/export.d.ts +0 -29
- package/packages/core/dist/mcp/tools/export.js +0 -60
- package/packages/core/dist/mcp/tools/federated-search.d.ts +0 -29
- package/packages/core/dist/mcp/tools/federated-search.js +0 -36
- package/packages/core/dist/mcp/tools/generate-claude-md.d.ts +0 -35
- package/packages/core/dist/mcp/tools/generate-claude-md.js +0 -107
- package/packages/core/dist/mcp/tools/generate-draft.d.ts +0 -34
- package/packages/core/dist/mcp/tools/generate-draft.js +0 -120
- package/packages/core/dist/mcp/tools/get-document.d.ts +0 -35
- package/packages/core/dist/mcp/tools/get-document.js +0 -25
- package/packages/core/dist/mcp/tools/get-evolution.d.ts +0 -28
- package/packages/core/dist/mcp/tools/get-evolution.js +0 -70
- package/packages/core/dist/mcp/tools/get-related.d.ts +0 -32
- package/packages/core/dist/mcp/tools/get-related.js +0 -33
- package/packages/core/dist/mcp/tools/learning-path.d.ts +0 -23
- package/packages/core/dist/mcp/tools/learning-path.js +0 -45
- package/packages/core/dist/mcp/tools/link-code.d.ts +0 -34
- package/packages/core/dist/mcp/tools/link-code.js +0 -44
- package/packages/core/dist/mcp/tools/list-topics.d.ts +0 -15
- package/packages/core/dist/mcp/tools/list-topics.js +0 -18
- package/packages/core/dist/mcp/tools/search.d.ts +0 -39
- package/packages/core/dist/mcp/tools/search.js +0 -29
- package/packages/core/dist/mcp/tools/snapshot.d.ts +0 -47
- package/packages/core/dist/mcp/tools/snapshot.js +0 -84
- package/packages/core/dist/multi-vault/index.d.ts +0 -26
- package/packages/core/dist/multi-vault/index.js +0 -80
- package/packages/core/dist/pack/creator.d.ts +0 -21
- package/packages/core/dist/pack/creator.js +0 -105
- package/packages/core/dist/pack/exporter.d.ts +0 -4
- package/packages/core/dist/pack/exporter.js +0 -18
- package/packages/core/dist/pack/importer.d.ts +0 -10
- package/packages/core/dist/pack/importer.js +0 -55
- package/packages/core/dist/pack/index.d.ts +0 -6
- package/packages/core/dist/pack/index.js +0 -5
- package/packages/core/dist/pack/marketplace.d.ts +0 -14
- package/packages/core/dist/pack/marketplace.js +0 -90
- package/packages/core/dist/pack/pii-masker.d.ts +0 -7
- package/packages/core/dist/pack/pii-masker.js +0 -29
- package/packages/core/dist/pack/types.d.ts +0 -36
- package/packages/core/dist/pack/types.js +0 -3
- package/packages/core/dist/plugins/index.d.ts +0 -35
- package/packages/core/dist/plugins/index.js +0 -57
- package/packages/core/dist/plugins/webhooks.d.ts +0 -30
- package/packages/core/dist/plugins/webhooks.js +0 -79
- package/packages/core/dist/search/adaptive.d.ts +0 -16
- package/packages/core/dist/search/adaptive.js +0 -67
- package/packages/core/dist/search/bm25.d.ts +0 -4
- package/packages/core/dist/search/bm25.js +0 -10
- package/packages/core/dist/search/index.d.ts +0 -15
- package/packages/core/dist/search/index.js +0 -64
- package/packages/core/dist/search/rrf.d.ts +0 -7
- package/packages/core/dist/search/rrf.js +0 -21
- package/packages/core/dist/search/semantic.d.ts +0 -5
- package/packages/core/dist/search/semantic.js +0 -6
- package/packages/core/dist/store/index.d.ts +0 -3
- package/packages/core/dist/store/index.js +0 -2
- package/packages/core/dist/store/sqlite-vec.d.ts +0 -6
- package/packages/core/dist/store/sqlite-vec.js +0 -251
- package/packages/core/dist/store/types.d.ts +0 -20
- package/packages/core/dist/store/types.js +0 -3
- package/packages/core/dist/team/index.d.ts +0 -25
- package/packages/core/dist/team/index.js +0 -97
- package/packages/core/dist/types/chunk.d.ts +0 -23
- package/packages/core/dist/types/chunk.js +0 -3
- package/packages/core/dist/types/document.d.ts +0 -23
- package/packages/core/dist/types/document.js +0 -3
- package/packages/core/dist/types/graph.d.ts +0 -39
- package/packages/core/dist/types/graph.js +0 -3
- package/packages/core/dist/types/index.d.ts +0 -5
- package/packages/core/dist/types/index.js +0 -2
- package/packages/core/dist/types/search.d.ts +0 -39
- package/packages/core/dist/types/search.js +0 -3
- package/packages/core/dist/utils/retry.d.ts +0 -25
- package/packages/core/dist/utils/retry.js +0 -59
- package/packages/core/package.json +0 -67
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { Chunk, ScoredChunk, Document, TopicInfo, StoreStats } from '../types/index.js';
|
|
2
|
-
export interface VectorStore {
|
|
3
|
-
initialize(): Promise<void>;
|
|
4
|
-
upsertDocument(doc: Document): Promise<void>;
|
|
5
|
-
upsertChunks(chunks: Chunk[]): Promise<void>;
|
|
6
|
-
deleteByDocumentId(documentId: string): Promise<void>;
|
|
7
|
-
searchSemantic(embedding: number[], limit: number): Promise<ScoredChunk[]>;
|
|
8
|
-
searchKeyword(query: string, limit: number): Promise<ScoredChunk[]>;
|
|
9
|
-
getDocument(documentId: string): Promise<Document | null>;
|
|
10
|
-
getChunk(chunkId: string): Promise<Chunk | null>;
|
|
11
|
-
getAllDocuments(): Promise<Document[]>;
|
|
12
|
-
getTopics(): Promise<TopicInfo[]>;
|
|
13
|
-
getStats(): Promise<StoreStats>;
|
|
14
|
-
/** 각 문서의 첫 청크 임베딩 반환 (graph용) */
|
|
15
|
-
getDocumentEmbeddings(): Promise<Map<string, number[]>>;
|
|
16
|
-
close(): Promise<void>;
|
|
17
|
-
/** 내부 DB 인스턴스 접근 (Intelligence Layer용) */
|
|
18
|
-
getDb(): unknown;
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export type TeamRole = 'admin' | 'editor' | 'viewer';
|
|
2
|
-
export interface TeamMember {
|
|
3
|
-
token: string;
|
|
4
|
-
tokenHash: string;
|
|
5
|
-
displayName: string;
|
|
6
|
-
role: TeamRole;
|
|
7
|
-
createdAt: string;
|
|
8
|
-
lastAccess?: string;
|
|
9
|
-
}
|
|
10
|
-
export interface TeamConfig {
|
|
11
|
-
teamName: string;
|
|
12
|
-
members: TeamMember[];
|
|
13
|
-
}
|
|
14
|
-
export declare function loadTeamConfig(): TeamConfig;
|
|
15
|
-
export declare function generateToken(): string;
|
|
16
|
-
export declare function inviteMember(displayName: string, role?: TeamRole): {
|
|
17
|
-
token: string;
|
|
18
|
-
member: TeamMember;
|
|
19
|
-
};
|
|
20
|
-
export declare function authenticateMember(token: string): TeamMember | null;
|
|
21
|
-
export declare function hasPermission(member: TeamMember, action: 'read' | 'write' | 'admin'): boolean;
|
|
22
|
-
export declare function listMembers(): TeamMember[];
|
|
23
|
-
export declare function removeMember(displayName: string): boolean;
|
|
24
|
-
export declare function createAuthMiddleware(): (req: any, res: any, next: any) => any;
|
|
25
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
// Team Vault (F-A06) — Bearer 토큰 인증 + RBAC
|
|
2
|
-
// MCP Streamable HTTP에 인증 레이어 추가
|
|
3
|
-
import { randomBytes, createHash } from 'node:crypto';
|
|
4
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
5
|
-
import { join } from 'node:path';
|
|
6
|
-
import { homedir } from 'node:os';
|
|
7
|
-
const TEAM_DIR = join(homedir(), '.stellavault', 'team');
|
|
8
|
-
const TEAM_FILE = join(TEAM_DIR, 'team.json');
|
|
9
|
-
export function loadTeamConfig() {
|
|
10
|
-
if (existsSync(TEAM_FILE)) {
|
|
11
|
-
return JSON.parse(readFileSync(TEAM_FILE, 'utf-8'));
|
|
12
|
-
}
|
|
13
|
-
return { teamName: 'My Team', members: [] };
|
|
14
|
-
}
|
|
15
|
-
function saveTeamConfig(config) {
|
|
16
|
-
mkdirSync(TEAM_DIR, { recursive: true });
|
|
17
|
-
writeFileSync(TEAM_FILE, JSON.stringify(config, null, 2), 'utf-8');
|
|
18
|
-
}
|
|
19
|
-
// 토큰 생성
|
|
20
|
-
export function generateToken() {
|
|
21
|
-
return `sv_${randomBytes(24).toString('hex')}`;
|
|
22
|
-
}
|
|
23
|
-
function hashToken(token) {
|
|
24
|
-
return createHash('sha256').update(token).digest('hex');
|
|
25
|
-
}
|
|
26
|
-
// 멤버 초대 → 토큰 반환
|
|
27
|
-
export function inviteMember(displayName, role = 'viewer') {
|
|
28
|
-
const config = loadTeamConfig();
|
|
29
|
-
const token = generateToken();
|
|
30
|
-
const member = {
|
|
31
|
-
token: '', // 클리어 토큰은 저장 안 함
|
|
32
|
-
tokenHash: hashToken(token),
|
|
33
|
-
displayName,
|
|
34
|
-
role,
|
|
35
|
-
createdAt: new Date().toISOString(),
|
|
36
|
-
};
|
|
37
|
-
config.members.push(member);
|
|
38
|
-
saveTeamConfig(config);
|
|
39
|
-
return { token, member }; // 토큰은 이때만 보여줌
|
|
40
|
-
}
|
|
41
|
-
// 토큰으로 멤버 인증
|
|
42
|
-
export function authenticateMember(token) {
|
|
43
|
-
const config = loadTeamConfig();
|
|
44
|
-
const hash = hashToken(token);
|
|
45
|
-
const member = config.members.find(m => m.tokenHash === hash);
|
|
46
|
-
if (member) {
|
|
47
|
-
member.lastAccess = new Date().toISOString();
|
|
48
|
-
saveTeamConfig(config);
|
|
49
|
-
}
|
|
50
|
-
return member ?? null;
|
|
51
|
-
}
|
|
52
|
-
// RBAC 권한 확인
|
|
53
|
-
export function hasPermission(member, action) {
|
|
54
|
-
switch (action) {
|
|
55
|
-
case 'read': return true; // 모든 역할 읽기 가능
|
|
56
|
-
case 'write': return member.role === 'admin' || member.role === 'editor';
|
|
57
|
-
case 'admin': return member.role === 'admin';
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// 멤버 목록
|
|
61
|
-
export function listMembers() {
|
|
62
|
-
return loadTeamConfig().members;
|
|
63
|
-
}
|
|
64
|
-
// 멤버 제거
|
|
65
|
-
export function removeMember(displayName) {
|
|
66
|
-
const config = loadTeamConfig();
|
|
67
|
-
const before = config.members.length;
|
|
68
|
-
config.members = config.members.filter(m => m.displayName !== displayName);
|
|
69
|
-
if (config.members.length < before) {
|
|
70
|
-
saveTeamConfig(config);
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
return false;
|
|
74
|
-
}
|
|
75
|
-
// Express 미들웨어: Bearer 토큰 인증
|
|
76
|
-
export function createAuthMiddleware() {
|
|
77
|
-
return (req, res, next) => {
|
|
78
|
-
const authHeader = req.headers.authorization;
|
|
79
|
-
if (!authHeader?.startsWith('Bearer ')) {
|
|
80
|
-
// HIGH-01: localhost는 editor 권한만 (admin은 토큰 필수)
|
|
81
|
-
const ip = req.ip || req.connection?.remoteAddress;
|
|
82
|
-
if (ip === '127.0.0.1' || ip === '::1' || ip === '::ffff:127.0.0.1') {
|
|
83
|
-
req.teamMember = { displayName: 'local', role: 'editor' };
|
|
84
|
-
return next();
|
|
85
|
-
}
|
|
86
|
-
return res.status(401).json({ error: 'Bearer token required' });
|
|
87
|
-
}
|
|
88
|
-
const token = authHeader.slice(7);
|
|
89
|
-
const member = authenticateMember(token);
|
|
90
|
-
if (!member) {
|
|
91
|
-
return res.status(403).json({ error: 'Invalid token' });
|
|
92
|
-
}
|
|
93
|
-
req.teamMember = member;
|
|
94
|
-
next();
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export interface Chunk {
|
|
2
|
-
/** document.id + "#" + chunkIndex */
|
|
3
|
-
id: string;
|
|
4
|
-
/** 소속 문서 ID */
|
|
5
|
-
documentId: string;
|
|
6
|
-
/** 청크 텍스트 */
|
|
7
|
-
content: string;
|
|
8
|
-
/** 소속 heading (## 제목) */
|
|
9
|
-
heading: string;
|
|
10
|
-
/** 원문 시작 줄 번호 */
|
|
11
|
-
startLine: number;
|
|
12
|
-
/** 원문 끝 줄 번호 */
|
|
13
|
-
endLine: number;
|
|
14
|
-
/** 토큰 수 */
|
|
15
|
-
tokenCount: number;
|
|
16
|
-
/** 768차원 벡터 (로딩 시 선택적) */
|
|
17
|
-
embedding?: number[];
|
|
18
|
-
}
|
|
19
|
-
export interface ScoredChunk {
|
|
20
|
-
chunkId: string;
|
|
21
|
-
score: number;
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=chunk.d.ts.map
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export interface Document {
|
|
2
|
-
/** SHA-256 hash of file path */
|
|
3
|
-
id: string;
|
|
4
|
-
/** vault 기준 상대 경로 */
|
|
5
|
-
filePath: string;
|
|
6
|
-
/** frontmatter title 또는 첫 heading */
|
|
7
|
-
title: string;
|
|
8
|
-
/** 전체 마크다운 텍스트 */
|
|
9
|
-
content: string;
|
|
10
|
-
/** YAML frontmatter */
|
|
11
|
-
frontmatter: Record<string, unknown>;
|
|
12
|
-
/** #태그 목록 */
|
|
13
|
-
tags: string[];
|
|
14
|
-
/** ISO 8601 */
|
|
15
|
-
lastModified: string;
|
|
16
|
-
/** SHA-256 of content (증분 인덱싱용) */
|
|
17
|
-
contentHash: string;
|
|
18
|
-
/** 출처: local | notion | clip | bridge | pack */
|
|
19
|
-
source?: string;
|
|
20
|
-
/** 노트 유형: note | clip | sync | bridge | decision | snapshot */
|
|
21
|
-
type?: string;
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=document.d.ts.map
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
export interface GraphNode {
|
|
2
|
-
id: string;
|
|
3
|
-
label: string;
|
|
4
|
-
filePath: string;
|
|
5
|
-
tags: string[];
|
|
6
|
-
clusterId: number;
|
|
7
|
-
position?: [number, number, number];
|
|
8
|
-
size: number;
|
|
9
|
-
source?: string;
|
|
10
|
-
type?: string;
|
|
11
|
-
lastModified?: string;
|
|
12
|
-
}
|
|
13
|
-
export interface GraphEdge {
|
|
14
|
-
source: string;
|
|
15
|
-
target: string;
|
|
16
|
-
weight: number;
|
|
17
|
-
}
|
|
18
|
-
export interface Cluster {
|
|
19
|
-
id: number;
|
|
20
|
-
label: string;
|
|
21
|
-
color: string;
|
|
22
|
-
nodeCount: number;
|
|
23
|
-
}
|
|
24
|
-
export interface GraphData {
|
|
25
|
-
nodes: GraphNode[];
|
|
26
|
-
edges: GraphEdge[];
|
|
27
|
-
clusters: Cluster[];
|
|
28
|
-
stats: {
|
|
29
|
-
nodeCount: number;
|
|
30
|
-
edgeCount: number;
|
|
31
|
-
clusterCount: number;
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
export interface GraphResponse {
|
|
35
|
-
data: GraphData;
|
|
36
|
-
generatedAt: string;
|
|
37
|
-
cacheKey: string;
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
export type { Document } from './document.js';
|
|
2
|
-
export type { Chunk, ScoredChunk } from './chunk.js';
|
|
3
|
-
export type { SearchResult, SearchOptions, TopicInfo, StoreStats, } from './search.js';
|
|
4
|
-
export type { GraphNode, GraphEdge, Cluster, GraphData, GraphResponse, } from './graph.js';
|
|
5
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { Chunk } from './chunk.js';
|
|
2
|
-
import type { Document } from './document.js';
|
|
3
|
-
export interface SearchResult {
|
|
4
|
-
chunk: Chunk;
|
|
5
|
-
document: Document;
|
|
6
|
-
/** RRF 통합 점수 (0~1) */
|
|
7
|
-
score: number;
|
|
8
|
-
/** 매칭 부분 하이라이트 */
|
|
9
|
-
highlights: string[];
|
|
10
|
-
}
|
|
11
|
-
export interface SearchOptions {
|
|
12
|
-
query: string;
|
|
13
|
-
/** default: 10 */
|
|
14
|
-
limit?: number;
|
|
15
|
-
/** minimum score, default: 0.1 */
|
|
16
|
-
threshold?: number;
|
|
17
|
-
/** 태그 필터 */
|
|
18
|
-
tags?: string[];
|
|
19
|
-
/** 날짜 범위 필터 */
|
|
20
|
-
dateRange?: {
|
|
21
|
-
from?: string;
|
|
22
|
-
to?: string;
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
export interface TopicInfo {
|
|
26
|
-
topic: string;
|
|
27
|
-
count: number;
|
|
28
|
-
recentDocuments: Array<{
|
|
29
|
-
id: string;
|
|
30
|
-
title: string;
|
|
31
|
-
}>;
|
|
32
|
-
}
|
|
33
|
-
export interface StoreStats {
|
|
34
|
-
documentCount: number;
|
|
35
|
-
chunkCount: number;
|
|
36
|
-
dbSizeBytes: number;
|
|
37
|
-
lastIndexed: string | null;
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export interface RetryOptions {
|
|
2
|
-
maxRetries?: number;
|
|
3
|
-
baseDelayMs?: number;
|
|
4
|
-
maxDelayMs?: number;
|
|
5
|
-
onRetry?: (error: Error, attempt: number, maxRetries: number) => void;
|
|
6
|
-
}
|
|
7
|
-
export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
8
|
-
export declare class StellavaultError extends Error {
|
|
9
|
-
readonly code: string;
|
|
10
|
-
readonly suggestion?: string | undefined;
|
|
11
|
-
readonly cause?: Error | undefined;
|
|
12
|
-
constructor(message: string, code: string, suggestion?: string | undefined, cause?: Error | undefined);
|
|
13
|
-
format(): string;
|
|
14
|
-
}
|
|
15
|
-
export declare function wrapError(err: unknown, code: string, suggestion?: string): StellavaultError;
|
|
16
|
-
export declare const errors: {
|
|
17
|
-
vaultNotFound: (path: string) => StellavaultError;
|
|
18
|
-
dbInitFailed: (err: unknown) => StellavaultError;
|
|
19
|
-
embedderFailed: (err: unknown) => StellavaultError;
|
|
20
|
-
indexingFailed: (file: string, err: unknown) => StellavaultError;
|
|
21
|
-
searchFailed: (err: unknown) => StellavaultError;
|
|
22
|
-
configInvalid: (field: string) => StellavaultError;
|
|
23
|
-
apiServerFailed: (port: number, err: unknown) => StellavaultError;
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
// Error Recovery System (F-A02) — retry with exponential backoff + meaningful messages
|
|
2
|
-
const DEFAULT_OPTIONS = {
|
|
3
|
-
maxRetries: 3,
|
|
4
|
-
baseDelayMs: 500,
|
|
5
|
-
maxDelayMs: 10000,
|
|
6
|
-
};
|
|
7
|
-
export async function withRetry(fn, options = {}) {
|
|
8
|
-
const { maxRetries, baseDelayMs, maxDelayMs } = { ...DEFAULT_OPTIONS, ...options };
|
|
9
|
-
let lastError;
|
|
10
|
-
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
11
|
-
try {
|
|
12
|
-
return await fn();
|
|
13
|
-
}
|
|
14
|
-
catch (err) {
|
|
15
|
-
lastError = err instanceof Error ? err : new Error(String(err));
|
|
16
|
-
if (attempt >= maxRetries)
|
|
17
|
-
break;
|
|
18
|
-
const delay = Math.min(baseDelayMs * Math.pow(2, attempt), maxDelayMs);
|
|
19
|
-
options.onRetry?.(lastError, attempt + 1, maxRetries);
|
|
20
|
-
await new Promise((r) => setTimeout(r, delay));
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
throw lastError;
|
|
24
|
-
}
|
|
25
|
-
export class StellavaultError extends Error {
|
|
26
|
-
code;
|
|
27
|
-
suggestion;
|
|
28
|
-
cause;
|
|
29
|
-
constructor(message, code, suggestion, cause) {
|
|
30
|
-
super(message);
|
|
31
|
-
this.code = code;
|
|
32
|
-
this.suggestion = suggestion;
|
|
33
|
-
this.cause = cause;
|
|
34
|
-
this.name = 'StellavaultError';
|
|
35
|
-
}
|
|
36
|
-
format() {
|
|
37
|
-
const lines = [`Error [${this.code}]: ${this.message}`];
|
|
38
|
-
if (this.suggestion)
|
|
39
|
-
lines.push(` Fix: ${this.suggestion}`);
|
|
40
|
-
if (this.cause)
|
|
41
|
-
lines.push(` Cause: ${this.cause.message}`);
|
|
42
|
-
return lines.join('\n');
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
export function wrapError(err, code, suggestion) {
|
|
46
|
-
const cause = err instanceof Error ? err : new Error(String(err));
|
|
47
|
-
return new StellavaultError(cause.message, code, suggestion, cause);
|
|
48
|
-
}
|
|
49
|
-
// Common error factories
|
|
50
|
-
export const errors = {
|
|
51
|
-
vaultNotFound: (path) => new StellavaultError(`Vault not found: ${path}`, 'VAULT_NOT_FOUND', 'Check the path exists and contains .md files'),
|
|
52
|
-
dbInitFailed: (err) => wrapError(err, 'DB_INIT_FAILED', 'Delete ~/.stellavault/index.db and re-index'),
|
|
53
|
-
embedderFailed: (err) => wrapError(err, 'EMBEDDER_FAILED', 'Check disk space and try again. The model downloads on first run (~80MB)'),
|
|
54
|
-
indexingFailed: (file, err) => wrapError(err, 'INDEX_FAILED', `Skipping "${file}". Re-run indexing to retry failed files`),
|
|
55
|
-
searchFailed: (err) => wrapError(err, 'SEARCH_FAILED', 'Re-index your vault: stellavault index <path>'),
|
|
56
|
-
configInvalid: (field) => new StellavaultError(`Invalid config: ${field}`, 'CONFIG_INVALID', 'Check ~/.stellavault.json format'),
|
|
57
|
-
apiServerFailed: (port, err) => wrapError(err, 'API_SERVER_FAILED', `Port ${port} may be in use. Try: stellavault graph --port ${port + 1}`),
|
|
58
|
-
};
|
|
59
|
-
//# sourceMappingURL=retry.js.map
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@stellavault/core",
|
|
3
|
-
"version": "0.4.0",
|
|
4
|
-
"description": "Stellavault core engine — indexer, hybrid search, vector store, MCP server",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/index.js",
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": {
|
|
10
|
-
"import": "./dist/index.js",
|
|
11
|
-
"types": "./dist/index.d.ts"
|
|
12
|
-
},
|
|
13
|
-
"./intelligence/youtube-extractor": {
|
|
14
|
-
"import": "./dist/intelligence/youtube-extractor.js",
|
|
15
|
-
"types": "./dist/intelligence/youtube-extractor.d.ts"
|
|
16
|
-
},
|
|
17
|
-
"./intelligence/file-extractors": {
|
|
18
|
-
"import": "./dist/intelligence/file-extractors.js",
|
|
19
|
-
"types": "./dist/intelligence/file-extractors.d.ts"
|
|
20
|
-
},
|
|
21
|
-
"./intelligence/draft-generator": {
|
|
22
|
-
"import": "./dist/intelligence/draft-generator.js",
|
|
23
|
-
"types": "./dist/intelligence/draft-generator.d.ts"
|
|
24
|
-
},
|
|
25
|
-
"./intelligence/wiki-compiler": {
|
|
26
|
-
"import": "./dist/intelligence/wiki-compiler.js",
|
|
27
|
-
"types": "./dist/intelligence/wiki-compiler.d.ts"
|
|
28
|
-
},
|
|
29
|
-
"./intelligence/knowledge-lint": {
|
|
30
|
-
"import": "./dist/intelligence/knowledge-lint.js",
|
|
31
|
-
"types": "./dist/intelligence/knowledge-lint.d.ts"
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
"scripts": {
|
|
35
|
-
"build": "tsc",
|
|
36
|
-
"dev": "tsc --watch",
|
|
37
|
-
"test": "vitest run",
|
|
38
|
-
"test:watch": "vitest"
|
|
39
|
-
},
|
|
40
|
-
"devDependencies": {
|
|
41
|
-
"@types/better-sqlite3": "^7.6.13",
|
|
42
|
-
"@types/cors": "^2.8.19",
|
|
43
|
-
"@types/express": "^5.0.6",
|
|
44
|
-
"@types/node": "^25.5.0",
|
|
45
|
-
"typescript": "^5.7.0",
|
|
46
|
-
"vitest": "^3.0.0"
|
|
47
|
-
},
|
|
48
|
-
"dependencies": {
|
|
49
|
-
"@anthropic-ai/sdk": "^0.82.0",
|
|
50
|
-
"@modelcontextprotocol/sdk": "^1.28.0",
|
|
51
|
-
"@types/multer": "^2.1.0",
|
|
52
|
-
"@xenova/transformers": "^2.17.2",
|
|
53
|
-
"b4a": "^1.8.0",
|
|
54
|
-
"better-sqlite3": "^12.8.0",
|
|
55
|
-
"chokidar": "^5.0.0",
|
|
56
|
-
"cors": "^2.8.6",
|
|
57
|
-
"express": "^5.2.1",
|
|
58
|
-
"gray-matter": "^4.0.3",
|
|
59
|
-
"hyperswarm": "^4.17.0",
|
|
60
|
-
"mammoth": "^1.12.0",
|
|
61
|
-
"multer": "^2.1.1",
|
|
62
|
-
"officeparser": "^6.0.7",
|
|
63
|
-
"sqlite-vec": "^0.1.7",
|
|
64
|
-
"unpdf": "^1.4.0",
|
|
65
|
-
"xlsx": "^0.18.5"
|
|
66
|
-
}
|
|
67
|
-
}
|