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,246 +0,0 @@
|
|
|
1
|
-
// Federation: Sharing Control v2 — Level-based sharing system
|
|
2
|
-
// Level 0: 차단 (검색 안 됨)
|
|
3
|
-
// Level 1: 제목 + 유사도만
|
|
4
|
-
// Level 2: Level 1 + 50자 스니펫
|
|
5
|
-
// Level 3: Level 2 + 요청 시 전문 (피어 승인)
|
|
6
|
-
// Level 4: Level 3 + 전문 자동 공개
|
|
7
|
-
//
|
|
8
|
-
// 상호 매칭: 내 공개 레벨이 높을수록 남의 것도 더 많이 볼 수 있음
|
|
9
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
10
|
-
import { join } from 'node:path';
|
|
11
|
-
import { homedir } from 'node:os';
|
|
12
|
-
export const LEVEL_LABELS = {
|
|
13
|
-
0: 'Blocked (not searchable)',
|
|
14
|
-
1: 'Title + similarity only',
|
|
15
|
-
2: 'Title + snippet (50 chars)',
|
|
16
|
-
3: 'Full text on request (approval needed)',
|
|
17
|
-
4: 'Full text auto-shared',
|
|
18
|
-
};
|
|
19
|
-
export const LEVEL_ICONS = {
|
|
20
|
-
0: '🚫', 1: '📌', 2: '📝', 3: '📖', 4: '🌐',
|
|
21
|
-
};
|
|
22
|
-
// 크레딧 보너스 (레벨별)
|
|
23
|
-
export const LEVEL_CREDIT_MULTIPLIER = {
|
|
24
|
-
0: 0, 1: 1, 2: 2, 3: 5, 4: 10,
|
|
25
|
-
};
|
|
26
|
-
const SHARING_FILE = join(homedir(), '.stellavault', 'federation', 'sharing.json');
|
|
27
|
-
const SENSITIVE_PATTERNS = [
|
|
28
|
-
/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/,
|
|
29
|
-
/\b\d{3}[-.]?\d{4}[-.]?\d{4}\b/,
|
|
30
|
-
/\b(sk-|pk-|api[_-]?key|token|secret)[a-zA-Z0-9_-]{10,}\b/i,
|
|
31
|
-
/\bpassword\s*[:=]\s*\S+/i,
|
|
32
|
-
/\b\d{6}[-]\d{7}\b/,
|
|
33
|
-
];
|
|
34
|
-
const DEFAULT_CONFIG = {
|
|
35
|
-
defaultLevel: 2, // 기본: 스니펫까지
|
|
36
|
-
myNodeLevel: 2, // 내 노드 기본: 스니펫까지
|
|
37
|
-
rules: [
|
|
38
|
-
// 기본 규칙
|
|
39
|
-
{ pattern: 'public', type: 'tag', level: 4 },
|
|
40
|
-
{ pattern: 'opensource', type: 'tag', level: 4 },
|
|
41
|
-
{ pattern: 'personal', type: 'tag', level: 1 },
|
|
42
|
-
{ pattern: 'private', type: 'tag', level: 0 },
|
|
43
|
-
{ pattern: 'secret', type: 'tag', level: 0 },
|
|
44
|
-
{ pattern: 'diary', type: 'tag', level: 0 },
|
|
45
|
-
{ pattern: 'salary', type: 'tag', level: 0 },
|
|
46
|
-
{ pattern: 'password', type: 'tag', level: 0 },
|
|
47
|
-
{ pattern: 'credential', type: 'tag', level: 0 },
|
|
48
|
-
{ pattern: '03_Daily', type: 'folder', level: 1 },
|
|
49
|
-
{ pattern: '06_Archive', type: 'folder', level: 1 },
|
|
50
|
-
{ pattern: '.obsidian', type: 'folder', level: 0 },
|
|
51
|
-
],
|
|
52
|
-
blockedDocIds: [],
|
|
53
|
-
blockSensitivePatterns: true,
|
|
54
|
-
pendingRequests: [],
|
|
55
|
-
};
|
|
56
|
-
export function loadSharingConfig() {
|
|
57
|
-
if (existsSync(SHARING_FILE)) {
|
|
58
|
-
const raw = JSON.parse(readFileSync(SHARING_FILE, 'utf-8'));
|
|
59
|
-
return { ...DEFAULT_CONFIG, ...raw };
|
|
60
|
-
}
|
|
61
|
-
return { ...DEFAULT_CONFIG };
|
|
62
|
-
}
|
|
63
|
-
export function saveSharingConfig(config) {
|
|
64
|
-
mkdirSync(join(homedir(), '.stellavault', 'federation'), { recursive: true });
|
|
65
|
-
writeFileSync(SHARING_FILE, JSON.stringify(config, null, 2), 'utf-8');
|
|
66
|
-
}
|
|
67
|
-
// 문서의 공유 레벨 결정
|
|
68
|
-
export function getDocumentLevel(doc, config) {
|
|
69
|
-
const cfg = config ?? loadSharingConfig();
|
|
70
|
-
// 1. 개별 차단
|
|
71
|
-
if (cfg.blockedDocIds.includes(doc.id))
|
|
72
|
-
return 0;
|
|
73
|
-
// 2. 민감 패턴 감지 → Level 0
|
|
74
|
-
if (cfg.blockSensitivePatterns) {
|
|
75
|
-
for (const pattern of SENSITIVE_PATTERNS) {
|
|
76
|
-
if (pattern.test(doc.content))
|
|
77
|
-
return 0;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
// 3. 규칙 매칭 (가장 구체적인 규칙 우선)
|
|
81
|
-
let matchedLevel = null;
|
|
82
|
-
// 문서ID 규칙 (가장 구체적)
|
|
83
|
-
for (const rule of cfg.rules) {
|
|
84
|
-
if (rule.type === 'doc' && rule.pattern === doc.id) {
|
|
85
|
-
return rule.level;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
// 태그 규칙 (가장 제한적인 것 적용)
|
|
89
|
-
const docTags = doc.tags.map(t => t.toLowerCase());
|
|
90
|
-
for (const rule of cfg.rules) {
|
|
91
|
-
if (rule.type === 'tag' && docTags.includes(rule.pattern.toLowerCase())) {
|
|
92
|
-
if (matchedLevel === null || rule.level < matchedLevel) {
|
|
93
|
-
matchedLevel = rule.level;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
// 폴더 규칙
|
|
98
|
-
for (const rule of cfg.rules) {
|
|
99
|
-
if (rule.type === 'folder' && doc.filePath.startsWith(rule.pattern)) {
|
|
100
|
-
if (matchedLevel === null || rule.level < matchedLevel) {
|
|
101
|
-
matchedLevel = rule.level;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return matchedLevel ?? cfg.defaultLevel;
|
|
106
|
-
}
|
|
107
|
-
// 이전 API 호환: isDocumentShareable = Level > 0
|
|
108
|
-
export function isDocumentShareable(doc, config) {
|
|
109
|
-
return getDocumentLevel(doc, config) > 0;
|
|
110
|
-
}
|
|
111
|
-
// 상호 매칭: 내 레벨에 따라 상대 문서를 어디까지 볼 수 있는가
|
|
112
|
-
export function getAccessibleLevel(myLevel, docLevel) {
|
|
113
|
-
// 내 공개 레벨이 상대 문서 레벨 이상이어야 열람 가능
|
|
114
|
-
// 단, 상대가 공개한 범위를 넘을 수는 없음
|
|
115
|
-
return Math.min(myLevel, docLevel);
|
|
116
|
-
}
|
|
117
|
-
export function buildLeveledResult(doc, similarity, requesterNodeLevel, config) {
|
|
118
|
-
const docLevel = getDocumentLevel(doc, config);
|
|
119
|
-
if (docLevel === 0)
|
|
120
|
-
return null; // 차단
|
|
121
|
-
const accessLevel = getAccessibleLevel(requesterNodeLevel, docLevel);
|
|
122
|
-
if (accessLevel === 0)
|
|
123
|
-
return null;
|
|
124
|
-
return {
|
|
125
|
-
title: accessLevel >= 1 ? doc.title : '[Hidden]',
|
|
126
|
-
similarity,
|
|
127
|
-
snippet: accessLevel >= 2 ? sanitizeSnippet(doc.content.slice(0, 50)) : undefined,
|
|
128
|
-
fullTextAvailable: docLevel >= 3,
|
|
129
|
-
autoShare: docLevel >= 4,
|
|
130
|
-
level: accessLevel,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
// 전문 열람 요청
|
|
134
|
-
export function createFullTextRequest(fromPeerId, fromName, documentId, documentTitle) {
|
|
135
|
-
const cfg = loadSharingConfig();
|
|
136
|
-
const request = {
|
|
137
|
-
requestId: `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
138
|
-
fromPeerId, fromName, documentTitle, documentId,
|
|
139
|
-
requestedAt: new Date().toISOString(),
|
|
140
|
-
status: 'pending',
|
|
141
|
-
};
|
|
142
|
-
cfg.pendingRequests.push(request);
|
|
143
|
-
// 최근 50개만 유지
|
|
144
|
-
if (cfg.pendingRequests.length > 50)
|
|
145
|
-
cfg.pendingRequests = cfg.pendingRequests.slice(-50);
|
|
146
|
-
saveSharingConfig(cfg);
|
|
147
|
-
return request;
|
|
148
|
-
}
|
|
149
|
-
export function approveRequest(requestId) {
|
|
150
|
-
const cfg = loadSharingConfig();
|
|
151
|
-
const req = cfg.pendingRequests.find(r => r.requestId === requestId);
|
|
152
|
-
if (!req)
|
|
153
|
-
return false;
|
|
154
|
-
req.status = 'approved';
|
|
155
|
-
saveSharingConfig(cfg);
|
|
156
|
-
return true;
|
|
157
|
-
}
|
|
158
|
-
export function denyRequest(requestId) {
|
|
159
|
-
const cfg = loadSharingConfig();
|
|
160
|
-
const req = cfg.pendingRequests.find(r => r.requestId === requestId);
|
|
161
|
-
if (!req)
|
|
162
|
-
return false;
|
|
163
|
-
req.status = 'denied';
|
|
164
|
-
saveSharingConfig(cfg);
|
|
165
|
-
return true;
|
|
166
|
-
}
|
|
167
|
-
export function getPendingRequests() {
|
|
168
|
-
return loadSharingConfig().pendingRequests.filter(r => r.status === 'pending');
|
|
169
|
-
}
|
|
170
|
-
// 스니펫 민감 정보 제거
|
|
171
|
-
export function sanitizeSnippet(snippet) {
|
|
172
|
-
let safe = snippet;
|
|
173
|
-
for (const pattern of SENSITIVE_PATTERNS) {
|
|
174
|
-
safe = safe.replace(pattern, '[REDACTED]');
|
|
175
|
-
}
|
|
176
|
-
return safe;
|
|
177
|
-
}
|
|
178
|
-
// 규칙 관리 헬퍼
|
|
179
|
-
export function setTagLevel(tag, level) {
|
|
180
|
-
const cfg = loadSharingConfig();
|
|
181
|
-
const existing = cfg.rules.findIndex(r => r.type === 'tag' && r.pattern.toLowerCase() === tag.toLowerCase());
|
|
182
|
-
if (existing >= 0)
|
|
183
|
-
cfg.rules[existing].level = level;
|
|
184
|
-
else
|
|
185
|
-
cfg.rules.push({ pattern: tag.toLowerCase(), type: 'tag', level });
|
|
186
|
-
saveSharingConfig(cfg);
|
|
187
|
-
}
|
|
188
|
-
export function setFolderLevel(folder, level) {
|
|
189
|
-
const cfg = loadSharingConfig();
|
|
190
|
-
const existing = cfg.rules.findIndex(r => r.type === 'folder' && r.pattern === folder);
|
|
191
|
-
if (existing >= 0)
|
|
192
|
-
cfg.rules[existing].level = level;
|
|
193
|
-
else
|
|
194
|
-
cfg.rules.push({ pattern: folder, type: 'folder', level });
|
|
195
|
-
saveSharingConfig(cfg);
|
|
196
|
-
}
|
|
197
|
-
export function setNodeLevel(level) {
|
|
198
|
-
const cfg = loadSharingConfig();
|
|
199
|
-
cfg.myNodeLevel = level;
|
|
200
|
-
saveSharingConfig(cfg);
|
|
201
|
-
}
|
|
202
|
-
export function setDefaultLevel(level) {
|
|
203
|
-
const cfg = loadSharingConfig();
|
|
204
|
-
cfg.defaultLevel = level;
|
|
205
|
-
saveSharingConfig(cfg);
|
|
206
|
-
}
|
|
207
|
-
// CLI 요약
|
|
208
|
-
export function getSharingSummary(config) {
|
|
209
|
-
const cfg = config ?? loadSharingConfig();
|
|
210
|
-
const lines = [];
|
|
211
|
-
lines.push(`My Node Level: ${LEVEL_ICONS[cfg.myNodeLevel]} Level ${cfg.myNodeLevel} (${LEVEL_LABELS[cfg.myNodeLevel]})`);
|
|
212
|
-
lines.push(`Default Doc Level: ${LEVEL_ICONS[cfg.defaultLevel]} Level ${cfg.defaultLevel}`);
|
|
213
|
-
lines.push(`Credit Multiplier: ${LEVEL_CREDIT_MULTIPLIER[cfg.myNodeLevel]}x`);
|
|
214
|
-
lines.push('');
|
|
215
|
-
lines.push('Rules:');
|
|
216
|
-
for (const rule of cfg.rules) {
|
|
217
|
-
lines.push(` ${LEVEL_ICONS[rule.level]} [${rule.type}] ${rule.pattern} → Level ${rule.level}`);
|
|
218
|
-
}
|
|
219
|
-
if (cfg.blockedDocIds.length > 0) {
|
|
220
|
-
lines.push(` 🚫 ${cfg.blockedDocIds.length} docs individually blocked`);
|
|
221
|
-
}
|
|
222
|
-
lines.push('');
|
|
223
|
-
const pending = cfg.pendingRequests.filter(r => r.status === 'pending');
|
|
224
|
-
if (pending.length > 0) {
|
|
225
|
-
lines.push(`📬 ${pending.length} pending full-text requests`);
|
|
226
|
-
}
|
|
227
|
-
lines.push(`Sensitive pattern filter: ${cfg.blockSensitivePatterns ? 'ON' : 'OFF'}`);
|
|
228
|
-
return lines.join('\n');
|
|
229
|
-
}
|
|
230
|
-
// 레거시 호환
|
|
231
|
-
export function addBlockedTag(tag) { setTagLevel(tag, 0); }
|
|
232
|
-
export function removeBlockedTag(tag) { setTagLevel(tag, 2); }
|
|
233
|
-
export function addBlockedFolder(folder) { setFolderLevel(folder, 0); }
|
|
234
|
-
export function blockDocument(docId) {
|
|
235
|
-
const cfg = loadSharingConfig();
|
|
236
|
-
if (!cfg.blockedDocIds.includes(docId)) {
|
|
237
|
-
cfg.blockedDocIds.push(docId);
|
|
238
|
-
saveSharingConfig(cfg);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
export function unblockDocument(docId) {
|
|
242
|
-
const cfg = loadSharingConfig();
|
|
243
|
-
cfg.blockedDocIds = cfg.blockedDocIds.filter(id => id !== docId);
|
|
244
|
-
saveSharingConfig(cfg);
|
|
245
|
-
}
|
|
246
|
-
//# sourceMappingURL=sharing.js.map
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export interface TrustEntry {
|
|
2
|
-
peerId: string;
|
|
3
|
-
displayName: string;
|
|
4
|
-
level: 'vouched' | 'neutral' | 'blocked';
|
|
5
|
-
reason?: string;
|
|
6
|
-
updatedAt: string;
|
|
7
|
-
}
|
|
8
|
-
export declare function vouch(peerId: string, displayName: string, reason?: string): TrustEntry;
|
|
9
|
-
export declare function revoke(peerId: string): boolean;
|
|
10
|
-
export declare function block(peerId: string, displayName: string, reason?: string): TrustEntry;
|
|
11
|
-
export declare function getTrustLevel(peerId: string): TrustEntry['level'];
|
|
12
|
-
export declare function isBlocked(peerId: string): boolean;
|
|
13
|
-
export declare function listTrusted(): TrustEntry[];
|
|
14
|
-
export declare function computeTrustScore(peerId: string): number;
|
|
15
|
-
//# sourceMappingURL=trust.d.ts.map
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
// Federation Phase 2: Web of Trust
|
|
2
|
-
// vouch/revoke/block — 노드 간 상호 신뢰 관리
|
|
3
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import { homedir } from 'node:os';
|
|
6
|
-
const TRUST_FILE = join(homedir(), '.stellavault', 'federation', 'trust.json');
|
|
7
|
-
function loadTrustDb() {
|
|
8
|
-
if (!existsSync(TRUST_FILE))
|
|
9
|
-
return new Map();
|
|
10
|
-
const raw = JSON.parse(readFileSync(TRUST_FILE, 'utf-8'));
|
|
11
|
-
return new Map(raw.map(e => [e.peerId, e]));
|
|
12
|
-
}
|
|
13
|
-
function saveTrustDb(db) {
|
|
14
|
-
mkdirSync(join(homedir(), '.stellavault', 'federation'), { recursive: true });
|
|
15
|
-
writeFileSync(TRUST_FILE, JSON.stringify([...db.values()], null, 2), 'utf-8');
|
|
16
|
-
}
|
|
17
|
-
export function vouch(peerId, displayName, reason) {
|
|
18
|
-
const db = loadTrustDb();
|
|
19
|
-
const entry = { peerId, displayName, level: 'vouched', reason, updatedAt: new Date().toISOString() };
|
|
20
|
-
db.set(peerId, entry);
|
|
21
|
-
saveTrustDb(db);
|
|
22
|
-
return entry;
|
|
23
|
-
}
|
|
24
|
-
export function revoke(peerId) {
|
|
25
|
-
const db = loadTrustDb();
|
|
26
|
-
const entry = db.get(peerId);
|
|
27
|
-
if (!entry)
|
|
28
|
-
return false;
|
|
29
|
-
entry.level = 'neutral';
|
|
30
|
-
entry.updatedAt = new Date().toISOString();
|
|
31
|
-
saveTrustDb(db);
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
export function block(peerId, displayName, reason) {
|
|
35
|
-
const db = loadTrustDb();
|
|
36
|
-
const entry = { peerId, displayName, level: 'blocked', reason, updatedAt: new Date().toISOString() };
|
|
37
|
-
db.set(peerId, entry);
|
|
38
|
-
saveTrustDb(db);
|
|
39
|
-
return entry;
|
|
40
|
-
}
|
|
41
|
-
export function getTrustLevel(peerId) {
|
|
42
|
-
const db = loadTrustDb();
|
|
43
|
-
return db.get(peerId)?.level ?? 'neutral';
|
|
44
|
-
}
|
|
45
|
-
export function isBlocked(peerId) {
|
|
46
|
-
return getTrustLevel(peerId) === 'blocked';
|
|
47
|
-
}
|
|
48
|
-
export function listTrusted() {
|
|
49
|
-
return [...loadTrustDb().values()];
|
|
50
|
-
}
|
|
51
|
-
// 신뢰 점수 계산 (0-100)
|
|
52
|
-
export function computeTrustScore(peerId) {
|
|
53
|
-
const level = getTrustLevel(peerId);
|
|
54
|
-
switch (level) {
|
|
55
|
-
case 'vouched': return 80;
|
|
56
|
-
case 'neutral': return 50;
|
|
57
|
-
case 'blocked': return 0;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=trust.js.map
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
export interface PeerInfo {
|
|
2
|
-
peerId: string;
|
|
3
|
-
displayName: string;
|
|
4
|
-
documentCount: number;
|
|
5
|
-
topTopics: string[];
|
|
6
|
-
joinedAt: string;
|
|
7
|
-
lastSeen: string;
|
|
8
|
-
}
|
|
9
|
-
export interface FederatedSearchResult {
|
|
10
|
-
title: string;
|
|
11
|
-
similarity: number;
|
|
12
|
-
snippet: string;
|
|
13
|
-
peerId: string;
|
|
14
|
-
peerName: string;
|
|
15
|
-
}
|
|
16
|
-
export type FederationMessage = {
|
|
17
|
-
type: 'handshake';
|
|
18
|
-
peerId: string;
|
|
19
|
-
displayName: string;
|
|
20
|
-
version: string;
|
|
21
|
-
documentCount: number;
|
|
22
|
-
topTopics: string[];
|
|
23
|
-
} | {
|
|
24
|
-
type: 'search_query';
|
|
25
|
-
queryId: string;
|
|
26
|
-
embedding: number[];
|
|
27
|
-
limit: number;
|
|
28
|
-
} | {
|
|
29
|
-
type: 'search_result';
|
|
30
|
-
queryId: string;
|
|
31
|
-
results: Array<{
|
|
32
|
-
title: string;
|
|
33
|
-
similarity: number;
|
|
34
|
-
snippet: string;
|
|
35
|
-
}>;
|
|
36
|
-
} | {
|
|
37
|
-
type: 'leave';
|
|
38
|
-
peerId: string;
|
|
39
|
-
};
|
|
40
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export type Locale = 'en' | 'ko' | 'ja' | 'zh';
|
|
2
|
-
export declare function setLocale(locale: Locale): void;
|
|
3
|
-
export declare function getLocale(): Locale;
|
|
4
|
-
export declare function t(key: string, fallback?: string): string;
|
|
5
|
-
export declare function detectLocale(): Locale;
|
|
6
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
// i18n Foundation (F-A19)
|
|
2
|
-
// Simple string externalization for CLI and Graph UI
|
|
3
|
-
const strings = {
|
|
4
|
-
en: {
|
|
5
|
-
'init.welcome': 'Stellavault Setup Wizard',
|
|
6
|
-
'init.tagline': "Notes die in folders. Let's bring yours to life.",
|
|
7
|
-
'init.step1': 'Where is your Obsidian vault?',
|
|
8
|
-
'init.step2': 'Indexing your vault',
|
|
9
|
-
'init.step3': 'Try your first search',
|
|
10
|
-
'init.done': 'Setup complete!',
|
|
11
|
-
'index.complete': 'Indexing complete',
|
|
12
|
-
'search.no_results': 'No results found.',
|
|
13
|
-
'decay.report_title': 'Knowledge Decay Report',
|
|
14
|
-
'decay.tip': 'Search a topic to refresh decaying knowledge',
|
|
15
|
-
'learn.title': 'Your Learning Path',
|
|
16
|
-
'learn.all_clear': 'All clear! Your knowledge is in great shape.',
|
|
17
|
-
'contradictions.title': 'potential contradictions found',
|
|
18
|
-
'contradictions.none': 'No contradictions detected. Your knowledge is consistent!',
|
|
19
|
-
'graph.title': 'Stellavault',
|
|
20
|
-
'graph.subtitle': 'Neural Knowledge Graph',
|
|
21
|
-
'error.vault_not_found': 'Vault not found',
|
|
22
|
-
'error.db_init_failed': 'Database initialization failed',
|
|
23
|
-
'error.embedder_failed': 'Embedding model failed to load',
|
|
24
|
-
},
|
|
25
|
-
ko: {
|
|
26
|
-
'init.welcome': 'Stellavault 설정 마법사',
|
|
27
|
-
'init.tagline': '노트는 폴더에서 죽습니다. 당신의 지식을 살려봅시다.',
|
|
28
|
-
'init.step1': 'Obsidian vault 경로가 어디인가요?',
|
|
29
|
-
'init.step2': 'vault 인덱싱 중',
|
|
30
|
-
'init.step3': '첫 번째 검색을 해보세요',
|
|
31
|
-
'init.done': '설정 완료!',
|
|
32
|
-
'index.complete': '인덱싱 완료',
|
|
33
|
-
'search.no_results': '검색 결과가 없습니다.',
|
|
34
|
-
'decay.report_title': '지식 감쇠 리포트',
|
|
35
|
-
'decay.tip': '검색하면 감쇠 중인 지식이 리프레시됩니다',
|
|
36
|
-
'learn.title': '당신의 학습 경로',
|
|
37
|
-
'learn.all_clear': '모든 지식이 건강합니다!',
|
|
38
|
-
'contradictions.title': '개의 잠재적 모순 발견',
|
|
39
|
-
'contradictions.none': '모순이 없습니다. 지식이 일관됩니다!',
|
|
40
|
-
'graph.title': 'Stellavault',
|
|
41
|
-
'graph.subtitle': '뉴럴 지식 그래프',
|
|
42
|
-
'error.vault_not_found': 'vault를 찾을 수 없습니다',
|
|
43
|
-
'error.db_init_failed': '데이터베이스 초기화 실패',
|
|
44
|
-
'error.embedder_failed': '임베딩 모델 로딩 실패',
|
|
45
|
-
},
|
|
46
|
-
ja: {
|
|
47
|
-
'init.welcome': 'Stellavault セットアップウィザード',
|
|
48
|
-
'init.tagline': 'ノートはフォルダで死にます。あなたの知識を生かしましょう。',
|
|
49
|
-
'graph.title': 'Stellavault',
|
|
50
|
-
'graph.subtitle': 'ニューラルナレッジグラフ',
|
|
51
|
-
'search.no_results': '検索結果がありません。',
|
|
52
|
-
},
|
|
53
|
-
zh: {
|
|
54
|
-
'init.welcome': 'Stellavault 设置向导',
|
|
55
|
-
'init.tagline': '笔记在文件夹中消亡。让你的知识活起来。',
|
|
56
|
-
'graph.title': 'Stellavault',
|
|
57
|
-
'graph.subtitle': '神经知识图谱',
|
|
58
|
-
'search.no_results': '没有搜索结果。',
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
let currentLocale = 'en';
|
|
62
|
-
export function setLocale(locale) {
|
|
63
|
-
currentLocale = locale;
|
|
64
|
-
}
|
|
65
|
-
export function getLocale() {
|
|
66
|
-
return currentLocale;
|
|
67
|
-
}
|
|
68
|
-
export function t(key, fallback) {
|
|
69
|
-
return strings[currentLocale]?.[key] ?? strings.en[key] ?? fallback ?? key;
|
|
70
|
-
}
|
|
71
|
-
export function detectLocale() {
|
|
72
|
-
const env = process.env.LANG || process.env.LANGUAGE || process.env.LC_ALL || '';
|
|
73
|
-
if (env.startsWith('ko'))
|
|
74
|
-
return 'ko';
|
|
75
|
-
if (env.startsWith('ja'))
|
|
76
|
-
return 'ja';
|
|
77
|
-
if (env.startsWith('zh'))
|
|
78
|
-
return 'zh';
|
|
79
|
-
return 'en';
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
// 저장 노트용 다국어 문자열 — 사용자 언어에 따라 노트 섹션 제목 결정
|
|
2
|
-
const strings = {
|
|
3
|
-
en: {
|
|
4
|
-
'summary': 'Summary',
|
|
5
|
-
'description': 'Description',
|
|
6
|
-
'transcript': 'Transcript',
|
|
7
|
-
'views': 'Views',
|
|
8
|
-
'relatedDocs': 'Related Documents',
|
|
9
|
-
'relatedConcepts': 'Related Concepts',
|
|
10
|
-
'relatedTags': 'Related Tags',
|
|
11
|
-
'source': 'Source',
|
|
12
|
-
'articles': 'Articles',
|
|
13
|
-
'concepts': 'Concepts',
|
|
14
|
-
'exploreFurther': 'Explore Further',
|
|
15
|
-
'noResults': 'No results found',
|
|
16
|
-
'tryDifferent': 'Try different keywords or create a note on this topic.',
|
|
17
|
-
'digDeeper': 'Dig deeper',
|
|
18
|
-
'findGaps': 'Find knowledge gaps',
|
|
19
|
-
'thisConceptAppears': 'This concept appears in',
|
|
20
|
-
'documents': 'documents',
|
|
21
|
-
'compiledFrom': 'Compiled',
|
|
22
|
-
'wikiArticlesFrom': 'wiki articles from',
|
|
23
|
-
'sourceDocuments': 'source documents',
|
|
24
|
-
'staleWarning': "documents haven't been modified in 6+ months. Run `stellavault decay` to review.",
|
|
25
|
-
'gapsFound': 'knowledge gaps found. Start filling the most critical ones.',
|
|
26
|
-
'duplicatesFound': 'duplicate documents detected. Run `stellavault duplicates` to merge.',
|
|
27
|
-
'isolatedFound': 'isolated notes found. Add tags or links to connect them.',
|
|
28
|
-
'healthy': 'Your knowledge base is healthy! Keep it up.',
|
|
29
|
-
'youtubeVideo': 'YouTube video',
|
|
30
|
-
},
|
|
31
|
-
ko: {
|
|
32
|
-
'summary': '핵심 요약',
|
|
33
|
-
'description': '설명',
|
|
34
|
-
'transcript': '영상 내용',
|
|
35
|
-
'views': '조회수',
|
|
36
|
-
'relatedDocs': '관련 문서',
|
|
37
|
-
'relatedConcepts': '관련 개념',
|
|
38
|
-
'relatedTags': '관련 태그',
|
|
39
|
-
'source': '원본',
|
|
40
|
-
'articles': '문서 목록',
|
|
41
|
-
'concepts': '개념',
|
|
42
|
-
'exploreFurther': '더 알아보기',
|
|
43
|
-
'noResults': '검색 결과 없음',
|
|
44
|
-
'tryDifferent': '다른 키워드로 검색하거나, 이 주제에 대한 노트를 작성해보세요.',
|
|
45
|
-
'digDeeper': '더 깊이 알아보기',
|
|
46
|
-
'findGaps': '빠진 지식 찾기',
|
|
47
|
-
'thisConceptAppears': '이 개념이 등장하는 문서',
|
|
48
|
-
'documents': '개',
|
|
49
|
-
'compiledFrom': '컴파일됨',
|
|
50
|
-
'wikiArticlesFrom': '개 위키 문서 생성 (원본',
|
|
51
|
-
'sourceDocuments': '개)',
|
|
52
|
-
'staleWarning': '개 문서가 6개월 이상 수정되지 않았어요. `stellavault decay`로 확인하세요.',
|
|
53
|
-
'gapsFound': '개 지식 빈틈이 발견됐어요. 중요한 것부터 채워보세요.',
|
|
54
|
-
'duplicatesFound': '개 겹치는 문서가 있어요. `stellavault duplicates`로 합치세요.',
|
|
55
|
-
'isolatedFound': '개 떨어진 노트가 있어요. 태그나 링크로 연결하세요.',
|
|
56
|
-
'healthy': '지식이 건강해요! 계속 유지하세요.',
|
|
57
|
-
'youtubeVideo': 'YouTube 영상',
|
|
58
|
-
},
|
|
59
|
-
ja: {
|
|
60
|
-
'summary': '要約',
|
|
61
|
-
'description': '説明',
|
|
62
|
-
'transcript': '内容',
|
|
63
|
-
'views': '再生回数',
|
|
64
|
-
'relatedDocs': '関連ドキュメント',
|
|
65
|
-
'relatedConcepts': '関連コンセプト',
|
|
66
|
-
'source': 'ソース',
|
|
67
|
-
'noResults': '検索結果なし',
|
|
68
|
-
'healthy': 'ナレッジベースは健全です!',
|
|
69
|
-
'youtubeVideo': 'YouTube動画',
|
|
70
|
-
},
|
|
71
|
-
zh: {
|
|
72
|
-
'summary': '摘要',
|
|
73
|
-
'description': '描述',
|
|
74
|
-
'transcript': '内容',
|
|
75
|
-
'views': '观看次数',
|
|
76
|
-
'relatedDocs': '相关文档',
|
|
77
|
-
'relatedConcepts': '相关概念',
|
|
78
|
-
'source': '来源',
|
|
79
|
-
'noResults': '未找到结果',
|
|
80
|
-
'healthy': '知识库很健康!',
|
|
81
|
-
'youtubeVideo': 'YouTube视频',
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
let currentNoteLocale = 'en';
|
|
85
|
-
export function setNoteLocale(locale) {
|
|
86
|
-
currentNoteLocale = locale;
|
|
87
|
-
}
|
|
88
|
-
export function getNoteLocale() {
|
|
89
|
-
return currentNoteLocale;
|
|
90
|
-
}
|
|
91
|
-
export function nt(key) {
|
|
92
|
-
return strings[currentNoteLocale]?.[key] ?? strings.en[key] ?? key;
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=note-strings.js.map
|