stellavault 0.2.0 → 0.3.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/package.json +1 -1
- package/packages/core/dist/api/dashboard.d.ts +3 -0
- package/packages/core/{src/api/dashboard.ts → dist/api/dashboard.js} +8 -11
- package/packages/core/dist/api/graph-data.d.ts +11 -0
- package/packages/core/dist/api/graph-data.js +255 -0
- package/packages/core/dist/api/pwa.d.ts +3 -0
- package/packages/core/{src/api/pwa.ts → dist/api/pwa.js} +27 -32
- package/packages/core/dist/api/server.d.ts +16 -0
- package/packages/core/dist/api/server.js +718 -0
- package/packages/core/dist/capture/voice.d.ts +24 -0
- package/packages/core/dist/capture/voice.js +135 -0
- package/packages/core/{src/cloud/index.ts → dist/cloud/index.d.ts} +1 -0
- package/packages/core/dist/cloud/index.js +2 -0
- package/packages/core/dist/cloud/sync.d.ts +29 -0
- package/packages/core/dist/cloud/sync.js +137 -0
- package/packages/core/dist/config.d.ts +27 -0
- package/packages/core/dist/config.js +55 -0
- package/packages/core/dist/federation/credits.d.ts +26 -0
- package/packages/core/dist/federation/credits.js +56 -0
- package/packages/core/dist/federation/identity.d.ts +14 -0
- package/packages/core/dist/federation/identity.js +74 -0
- package/packages/core/{src/federation/index.ts → dist/federation/index.d.ts} +1 -2
- package/packages/core/dist/federation/index.js +5 -0
- package/packages/core/dist/federation/node.d.ts +31 -0
- package/packages/core/dist/federation/node.js +216 -0
- package/packages/core/dist/federation/privacy.d.ts +8 -0
- package/packages/core/dist/federation/privacy.js +40 -0
- package/packages/core/dist/federation/reputation.d.ts +37 -0
- package/packages/core/dist/federation/reputation.js +139 -0
- package/packages/core/dist/federation/search.d.ts +19 -0
- package/packages/core/dist/federation/search.js +101 -0
- package/packages/core/dist/federation/sharing.d.ts +72 -0
- package/packages/core/dist/federation/sharing.js +246 -0
- package/packages/core/dist/federation/trust.d.ts +15 -0
- package/packages/core/dist/federation/trust.js +60 -0
- package/packages/core/dist/federation/types.d.ts +40 -0
- package/packages/core/dist/federation/types.js +3 -0
- package/packages/core/dist/i18n/index.d.ts +6 -0
- package/packages/core/dist/i18n/index.js +81 -0
- package/packages/core/{src/index.ts → dist/index.d.ts} +46 -65
- package/packages/core/dist/index.js +69 -0
- package/packages/core/dist/indexer/chunker.d.ts +14 -0
- package/packages/core/dist/indexer/chunker.js +148 -0
- package/packages/core/dist/indexer/embedder.d.ts +8 -0
- package/packages/core/dist/indexer/embedder.js +3 -0
- package/packages/core/dist/indexer/index.d.ts +28 -0
- package/packages/core/dist/indexer/index.js +74 -0
- package/packages/core/dist/indexer/local-embedder.d.ts +3 -0
- package/packages/core/dist/indexer/local-embedder.js +29 -0
- package/packages/core/dist/indexer/scanner.d.ts +11 -0
- package/packages/core/dist/indexer/scanner.js +137 -0
- package/packages/core/dist/indexer/watcher.d.ts +19 -0
- package/packages/core/dist/indexer/watcher.js +49 -0
- package/packages/core/dist/intelligence/code-linker.d.ts +20 -0
- package/packages/core/dist/intelligence/code-linker.js +88 -0
- package/packages/core/dist/intelligence/contradiction-detector.d.ts +20 -0
- package/packages/core/dist/intelligence/contradiction-detector.js +115 -0
- package/packages/core/dist/intelligence/decay-engine.d.ts +27 -0
- package/packages/core/dist/intelligence/decay-engine.js +190 -0
- package/packages/core/dist/intelligence/duplicate-detector.d.ts +20 -0
- package/packages/core/dist/intelligence/duplicate-detector.js +55 -0
- package/packages/core/dist/intelligence/fsrs.d.ts +43 -0
- package/packages/core/dist/intelligence/fsrs.js +70 -0
- package/packages/core/dist/intelligence/gap-detector.d.ts +25 -0
- package/packages/core/dist/intelligence/gap-detector.js +78 -0
- package/packages/core/dist/intelligence/learning-path.d.ts +31 -0
- package/packages/core/dist/intelligence/learning-path.js +53 -0
- package/packages/core/dist/intelligence/notifications.d.ts +31 -0
- package/packages/core/dist/intelligence/notifications.js +65 -0
- package/packages/core/dist/intelligence/predictive-gaps.d.ts +14 -0
- package/packages/core/dist/intelligence/predictive-gaps.js +74 -0
- package/packages/core/dist/intelligence/semantic-versioning.d.ts +37 -0
- package/packages/core/dist/intelligence/semantic-versioning.js +68 -0
- package/packages/core/dist/intelligence/types.d.ts +28 -0
- package/packages/core/dist/intelligence/types.js +3 -0
- package/packages/core/dist/mcp/custom-tools.d.ts +29 -0
- package/packages/core/dist/mcp/custom-tools.js +70 -0
- package/packages/core/{src/mcp/index.ts → dist/mcp/index.d.ts} +1 -0
- package/packages/core/dist/mcp/index.js +2 -0
- package/packages/core/dist/mcp/server.d.ts +49 -0
- package/packages/core/dist/mcp/server.js +151 -0
- package/packages/core/dist/mcp/tools/agentic-graph.d.ts +87 -0
- package/packages/core/dist/mcp/tools/agentic-graph.js +88 -0
- package/packages/core/dist/mcp/tools/brief.d.ts +31 -0
- package/packages/core/dist/mcp/tools/brief.js +39 -0
- package/packages/core/dist/mcp/tools/decay.d.ts +33 -0
- package/packages/core/dist/mcp/tools/decay.js +32 -0
- package/packages/core/dist/mcp/tools/decision-journal.d.ts +78 -0
- package/packages/core/dist/mcp/tools/decision-journal.js +79 -0
- package/packages/core/dist/mcp/tools/detect-gaps.d.ts +24 -0
- package/packages/core/dist/mcp/tools/detect-gaps.js +47 -0
- package/packages/core/dist/mcp/tools/export.d.ts +29 -0
- package/packages/core/dist/mcp/tools/export.js +60 -0
- package/packages/core/dist/mcp/tools/federated-search.d.ts +29 -0
- package/packages/core/dist/mcp/tools/federated-search.js +36 -0
- package/packages/core/dist/mcp/tools/generate-claude-md.d.ts +35 -0
- package/packages/core/dist/mcp/tools/generate-claude-md.js +107 -0
- package/packages/core/dist/mcp/tools/get-document.d.ts +35 -0
- package/packages/core/dist/mcp/tools/get-document.js +25 -0
- package/packages/core/dist/mcp/tools/get-evolution.d.ts +28 -0
- package/packages/core/dist/mcp/tools/get-evolution.js +70 -0
- package/packages/core/dist/mcp/tools/get-related.d.ts +32 -0
- package/packages/core/dist/mcp/tools/get-related.js +33 -0
- package/packages/core/dist/mcp/tools/learning-path.d.ts +23 -0
- package/packages/core/dist/mcp/tools/learning-path.js +45 -0
- package/packages/core/dist/mcp/tools/link-code.d.ts +34 -0
- package/packages/core/dist/mcp/tools/link-code.js +44 -0
- package/packages/core/dist/mcp/tools/list-topics.d.ts +15 -0
- package/packages/core/dist/mcp/tools/list-topics.js +18 -0
- package/packages/core/dist/mcp/tools/search.d.ts +39 -0
- package/packages/core/dist/mcp/tools/search.js +29 -0
- package/packages/core/dist/mcp/tools/snapshot.d.ts +47 -0
- package/packages/core/dist/mcp/tools/snapshot.js +84 -0
- package/packages/core/dist/multi-vault/index.d.ts +26 -0
- package/packages/core/dist/multi-vault/index.js +80 -0
- package/packages/core/dist/pack/creator.d.ts +21 -0
- package/packages/core/dist/pack/creator.js +105 -0
- package/packages/core/dist/pack/exporter.d.ts +4 -0
- package/packages/core/dist/pack/exporter.js +18 -0
- package/packages/core/dist/pack/importer.d.ts +10 -0
- package/packages/core/dist/pack/importer.js +55 -0
- package/packages/core/{src/pack/index.ts → dist/pack/index.d.ts} +1 -0
- package/packages/core/dist/pack/index.js +5 -0
- package/packages/core/dist/pack/marketplace.d.ts +14 -0
- package/packages/core/dist/pack/marketplace.js +90 -0
- package/packages/core/dist/pack/pii-masker.d.ts +7 -0
- package/packages/core/dist/pack/pii-masker.js +29 -0
- package/packages/core/dist/pack/types.d.ts +36 -0
- package/packages/core/dist/pack/types.js +3 -0
- package/packages/core/dist/plugins/index.d.ts +35 -0
- package/packages/core/dist/plugins/index.js +57 -0
- package/packages/core/dist/plugins/webhooks.d.ts +30 -0
- package/packages/core/dist/plugins/webhooks.js +79 -0
- package/packages/core/dist/search/adaptive.d.ts +16 -0
- package/packages/core/dist/search/adaptive.js +67 -0
- package/packages/core/dist/search/bm25.d.ts +4 -0
- package/packages/core/dist/search/bm25.js +10 -0
- package/packages/core/dist/search/index.d.ts +15 -0
- package/packages/core/dist/search/index.js +64 -0
- package/packages/core/dist/search/rrf.d.ts +7 -0
- package/packages/core/dist/search/rrf.js +21 -0
- package/packages/core/dist/search/semantic.d.ts +5 -0
- package/packages/core/dist/search/semantic.js +6 -0
- package/packages/core/{src/store/index.ts → dist/store/index.d.ts} +1 -0
- package/packages/core/dist/store/index.js +2 -0
- package/packages/core/dist/store/sqlite-vec.d.ts +6 -0
- package/packages/core/dist/store/sqlite-vec.js +251 -0
- package/packages/core/dist/store/types.d.ts +20 -0
- package/packages/core/dist/store/types.js +3 -0
- package/packages/core/dist/team/index.d.ts +25 -0
- package/packages/core/dist/team/index.js +97 -0
- package/packages/core/dist/types/chunk.d.ts +23 -0
- package/packages/core/dist/types/chunk.js +3 -0
- package/packages/core/dist/types/document.d.ts +23 -0
- package/packages/core/dist/types/document.js +3 -0
- package/packages/core/dist/types/graph.d.ts +39 -0
- package/packages/core/dist/types/graph.js +3 -0
- package/packages/core/dist/types/index.d.ts +5 -0
- package/packages/core/dist/types/index.js +2 -0
- package/packages/core/dist/types/search.d.ts +39 -0
- package/packages/core/dist/types/search.js +3 -0
- package/packages/core/dist/utils/retry.d.ts +25 -0
- package/packages/core/dist/utils/retry.js +59 -0
- package/.github/workflows/pages.yml +0 -37
- package/memory/MEMORY.md +0 -25
- package/packages/cli/dist/commands/brief-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/brief-cmd.js.map +0 -1
- package/packages/cli/dist/commands/capture-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/capture-cmd.js.map +0 -1
- package/packages/cli/dist/commands/card-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/card-cmd.js.map +0 -1
- package/packages/cli/dist/commands/clip-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/clip-cmd.js.map +0 -1
- package/packages/cli/dist/commands/cloud-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/cloud-cmd.js.map +0 -1
- package/packages/cli/dist/commands/contradictions-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/contradictions-cmd.js.map +0 -1
- package/packages/cli/dist/commands/decay-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/decay-cmd.js.map +0 -1
- package/packages/cli/dist/commands/digest-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/digest-cmd.js.map +0 -1
- package/packages/cli/dist/commands/duplicates-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/duplicates-cmd.js.map +0 -1
- package/packages/cli/dist/commands/federate-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/federate-cmd.js.map +0 -1
- package/packages/cli/dist/commands/gaps-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/gaps-cmd.js.map +0 -1
- package/packages/cli/dist/commands/graph-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/graph-cmd.js.map +0 -1
- package/packages/cli/dist/commands/index-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/index-cmd.js.map +0 -1
- package/packages/cli/dist/commands/init-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/init-cmd.js.map +0 -1
- package/packages/cli/dist/commands/learn-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/learn-cmd.js.map +0 -1
- package/packages/cli/dist/commands/pack-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/pack-cmd.js.map +0 -1
- package/packages/cli/dist/commands/review-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/review-cmd.js.map +0 -1
- package/packages/cli/dist/commands/search-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/search-cmd.js.map +0 -1
- package/packages/cli/dist/commands/serve-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/serve-cmd.js.map +0 -1
- package/packages/cli/dist/commands/status-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/status-cmd.js.map +0 -1
- package/packages/cli/dist/commands/sync-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/sync-cmd.js.map +0 -1
- package/packages/cli/dist/commands/vault-cmd.d.ts.map +0 -1
- package/packages/cli/dist/commands/vault-cmd.js.map +0 -1
- package/packages/cli/dist/index.d.ts.map +0 -1
- package/packages/cli/dist/index.js.map +0 -1
- package/packages/cli/src/commands/brief-cmd.ts +0 -87
- package/packages/cli/src/commands/capture-cmd.ts +0 -34
- package/packages/cli/src/commands/card-cmd.ts +0 -29
- package/packages/cli/src/commands/clip-cmd.ts +0 -172
- package/packages/cli/src/commands/cloud-cmd.ts +0 -75
- package/packages/cli/src/commands/contradictions-cmd.ts +0 -41
- package/packages/cli/src/commands/decay-cmd.ts +0 -57
- package/packages/cli/src/commands/digest-cmd.ts +0 -89
- package/packages/cli/src/commands/duplicates-cmd.ts +0 -38
- package/packages/cli/src/commands/federate-cmd.ts +0 -256
- package/packages/cli/src/commands/gaps-cmd.ts +0 -40
- package/packages/cli/src/commands/graph-cmd.ts +0 -88
- package/packages/cli/src/commands/index-cmd.ts +0 -65
- package/packages/cli/src/commands/init-cmd.ts +0 -145
- package/packages/cli/src/commands/learn-cmd.ts +0 -56
- package/packages/cli/src/commands/pack-cmd.ts +0 -121
- package/packages/cli/src/commands/review-cmd.ts +0 -125
- package/packages/cli/src/commands/search-cmd.ts +0 -45
- package/packages/cli/src/commands/serve-cmd.ts +0 -17
- package/packages/cli/src/commands/status-cmd.ts +0 -37
- package/packages/cli/src/commands/sync-cmd.ts +0 -68
- package/packages/cli/src/commands/vault-cmd.ts +0 -64
- package/packages/cli/src/index.ts +0 -187
- package/packages/core/src/api/graph-data.ts +0 -286
- package/packages/core/src/api/server.ts +0 -660
- package/packages/core/src/capture/voice.ts +0 -168
- package/packages/core/src/cloud/sync.ts +0 -167
- package/packages/core/src/config.ts +0 -82
- package/packages/core/src/federation/credits.ts +0 -80
- package/packages/core/src/federation/hyperswarm.d.ts +0 -19
- package/packages/core/src/federation/identity.ts +0 -90
- package/packages/core/src/federation/node.ts +0 -235
- package/packages/core/src/federation/privacy.ts +0 -52
- package/packages/core/src/federation/reputation.ts +0 -202
- package/packages/core/src/federation/search.ts +0 -129
- package/packages/core/src/federation/sharing.ts +0 -315
- package/packages/core/src/federation/trust.ts +0 -76
- package/packages/core/src/federation/types.ts +0 -25
- package/packages/core/src/i18n/index.ts +0 -85
- package/packages/core/src/indexer/chunker.ts +0 -180
- package/packages/core/src/indexer/embedder.ts +0 -9
- package/packages/core/src/indexer/index.ts +0 -113
- package/packages/core/src/indexer/local-embedder.ts +0 -35
- package/packages/core/src/indexer/scanner.ts +0 -142
- package/packages/core/src/indexer/watcher.ts +0 -62
- package/packages/core/src/intelligence/contradiction-detector.ts +0 -134
- package/packages/core/src/intelligence/decay-engine.ts +0 -229
- package/packages/core/src/intelligence/duplicate-detector.ts +0 -71
- package/packages/core/src/intelligence/fsrs.ts +0 -79
- package/packages/core/src/intelligence/gap-detector.ts +0 -109
- package/packages/core/src/intelligence/learning-path.ts +0 -86
- package/packages/core/src/intelligence/notifications.ts +0 -106
- package/packages/core/src/intelligence/predictive-gaps.ts +0 -94
- package/packages/core/src/intelligence/semantic-versioning.ts +0 -97
- package/packages/core/src/intelligence/types.ts +0 -28
- package/packages/core/src/mcp/custom-tools.ts +0 -97
- package/packages/core/src/mcp/server.ts +0 -142
- package/packages/core/src/mcp/tools/agentic-graph.ts +0 -96
- package/packages/core/src/mcp/tools/brief.ts +0 -49
- package/packages/core/src/mcp/tools/decay.ts +0 -40
- package/packages/core/src/mcp/tools/decision-journal.ts +0 -95
- package/packages/core/src/mcp/tools/export.ts +0 -72
- package/packages/core/src/mcp/tools/federated-search.ts +0 -43
- package/packages/core/src/mcp/tools/generate-claude-md.ts +0 -130
- package/packages/core/src/mcp/tools/get-document.ts +0 -26
- package/packages/core/src/mcp/tools/get-related.ts +0 -41
- package/packages/core/src/mcp/tools/learning-path.ts +0 -52
- package/packages/core/src/mcp/tools/list-topics.ts +0 -20
- package/packages/core/src/mcp/tools/search.ts +0 -35
- package/packages/core/src/mcp/tools/snapshot.ts +0 -98
- package/packages/core/src/multi-vault/index.ts +0 -118
- package/packages/core/src/pack/creator.ts +0 -127
- package/packages/core/src/pack/exporter.ts +0 -21
- package/packages/core/src/pack/importer.ts +0 -82
- package/packages/core/src/pack/marketplace.ts +0 -103
- package/packages/core/src/pack/pii-masker.ts +0 -38
- package/packages/core/src/pack/types.ts +0 -39
- package/packages/core/src/plugins/index.ts +0 -100
- package/packages/core/src/plugins/webhooks.ts +0 -110
- package/packages/core/src/search/bm25.ts +0 -16
- package/packages/core/src/search/index.ts +0 -83
- package/packages/core/src/search/rrf.ts +0 -31
- package/packages/core/src/search/semantic.ts +0 -15
- package/packages/core/src/store/sqlite-vec.ts +0 -290
- package/packages/core/src/store/types.ts +0 -22
- package/packages/core/src/team/index.ts +0 -126
- package/packages/core/src/types/chunk.ts +0 -25
- package/packages/core/src/types/document.ts +0 -24
- package/packages/core/src/types/graph.ts +0 -44
- package/packages/core/src/types/index.ts +0 -15
- package/packages/core/src/types/search.ts +0 -38
- package/packages/core/src/utils/retry.ts +0 -85
- package/packages/core/tests/api-card.test.ts +0 -60
- package/packages/core/tests/api-routes.test.ts +0 -98
- package/packages/core/tests/bm25.test.ts +0 -87
- package/packages/core/tests/chunker.test.ts +0 -48
- package/packages/core/tests/cluster.test.ts +0 -75
- package/packages/core/tests/constellation.test.ts +0 -77
- package/packages/core/tests/export-utils.test.ts +0 -97
- package/packages/core/tests/fsrs.test.ts +0 -96
- package/packages/core/tests/gesture-detector.test.ts +0 -45
- package/packages/core/tests/graph-data.test.ts +0 -87
- package/packages/core/tests/layout.test.ts +0 -83
- package/packages/core/tests/mcp.test.ts +0 -148
- package/packages/core/tests/pack.test.ts +0 -127
- package/packages/core/tests/pii-masker.test.ts +0 -42
- package/packages/core/tests/profile-card.test.ts +0 -62
- package/packages/core/tests/rrf.test.ts +0 -29
- package/packages/core/tests/search-integration.test.ts +0 -139
- package/packages/core/tests/store.test.ts +0 -80
- package/packages/graph/click-result.png +0 -0
- package/packages/graph/dist/assets/camera_utils-BMxqtvoZ.js +0 -1
- package/packages/graph/dist/assets/hands-DXA01_mx.js +0 -18
- package/packages/graph/dist/assets/index-DMEe2diW.js +0 -4192
- package/packages/graph/dist/assets/layout.worker-DbKCEFTz.js +0 -1
- package/packages/graph/dist/index.html +0 -17
- package/packages/graph/index.html +0 -17
- package/packages/graph/package.json +0 -32
- package/packages/graph/src/App.tsx +0 -7
- package/packages/graph/src/api/client.ts +0 -39
- package/packages/graph/src/components/ClusterFilter.tsx +0 -73
- package/packages/graph/src/components/ConstellationView.tsx +0 -232
- package/packages/graph/src/components/ExportPanel.tsx +0 -177
- package/packages/graph/src/components/Graph3D.tsx +0 -230
- package/packages/graph/src/components/GraphEdges.tsx +0 -100
- package/packages/graph/src/components/GraphNodes.tsx +0 -386
- package/packages/graph/src/components/HealthDashboard.tsx +0 -173
- package/packages/graph/src/components/Layout.tsx +0 -214
- package/packages/graph/src/components/MotionOverlay.tsx +0 -81
- package/packages/graph/src/components/MotionToggle.tsx +0 -33
- package/packages/graph/src/components/MultiverseView.tsx +0 -286
- package/packages/graph/src/components/NodeDetail.tsx +0 -232
- package/packages/graph/src/components/PulseParticle.tsx +0 -232
- package/packages/graph/src/components/SearchBar.tsx +0 -107
- package/packages/graph/src/components/StarField.tsx +0 -197
- package/packages/graph/src/components/StatusBar.tsx +0 -53
- package/packages/graph/src/components/Timeline.tsx +0 -148
- package/packages/graph/src/components/ToolsPanel.tsx +0 -512
- package/packages/graph/src/components/Tooltip.tsx +0 -100
- package/packages/graph/src/components/TypeFilter.tsx +0 -131
- package/packages/graph/src/embed/EmbedGraph.tsx +0 -144
- package/packages/graph/src/hooks/useConstellationLOD.ts +0 -76
- package/packages/graph/src/hooks/useDecay.ts +0 -37
- package/packages/graph/src/hooks/useExport.ts +0 -165
- package/packages/graph/src/hooks/useGraph.ts +0 -69
- package/packages/graph/src/hooks/useKeyboardNav.ts +0 -122
- package/packages/graph/src/hooks/useLayout.ts +0 -45
- package/packages/graph/src/hooks/useMotion.ts +0 -120
- package/packages/graph/src/hooks/usePulse.ts +0 -58
- package/packages/graph/src/hooks/useSearch.ts +0 -71
- package/packages/graph/src/lib/constellation.ts +0 -107
- package/packages/graph/src/lib/export-utils.ts +0 -48
- package/packages/graph/src/lib/gesture-detector.ts +0 -123
- package/packages/graph/src/lib/layout.worker.ts +0 -153
- package/packages/graph/src/lib/motion-controller.ts +0 -83
- package/packages/graph/src/lib/profile-card.ts +0 -122
- package/packages/graph/src/main.tsx +0 -4
- package/packages/graph/src/stores/graph-store.ts +0 -155
- package/packages/graph/success.png +0 -0
- package/packages/graph/test-click.mjs +0 -49
- package/packages/graph/test-explore.mjs +0 -102
- package/packages/graph/test-final.mjs +0 -61
- package/packages/graph/test-graph.mjs +0 -139
- package/packages/graph/test-hover.mjs +0 -48
- package/packages/graph/test-pulse.mjs +0 -68
- package/packages/graph/test-screenshot.mjs +0 -56
- package/packages/graph/test-v2.mjs +0 -97
- package/packages/graph/tsconfig.tsbuildinfo +0 -1
- package/packages/graph/vite.config.ts +0 -15
- package/packages/sync/.env.example +0 -11
- package/packages/sync/.sync-state.json +0 -317
- package/packages/sync/.upload-state.json +0 -1009
- package/packages/sync/create-stella-network-notion.mjs +0 -151
- package/packages/sync/create-stellavault-project-notion.mjs +0 -322
- package/packages/sync/logs/sync-2026-03-28.log +0 -6
- package/packages/sync/logs/sync-2026-03-29.log +0 -12
- package/packages/sync/logs/sync-2026-03-30.log +0 -6
- package/packages/sync/logs/sync-2026-03-31.log +0 -6
- package/packages/sync/logs/sync-2026-04-01.log +0 -6
- package/packages/sync/logs/sync-2026-04-02.log +0 -6
- package/packages/sync/package-lock.json +0 -373
- package/packages/sync/package.json +0 -16
- package/packages/sync/run-sync.bat +0 -18
- package/packages/sync/run-sync.mjs +0 -46
- package/packages/sync/setup-scheduler.mjs +0 -119
- package/packages/sync/structured-sync.mjs +0 -187
- package/packages/sync/sync-to-obsidian.mjs +0 -264
- package/packages/sync/upload-pdca-to-notion.mjs +0 -495
- package/tsconfig.base.json +0 -18
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
// Design Ref: §3.3 — SQLite-vec 스키마
|
|
2
|
+
// Design Ref: §3.2 — VectorStore 인터페이스 구현
|
|
3
|
+
import Database from 'better-sqlite3';
|
|
4
|
+
import * as sqliteVec from 'sqlite-vec';
|
|
5
|
+
import { mkdirSync } from 'node:fs';
|
|
6
|
+
import { dirname } from 'node:path';
|
|
7
|
+
export function createSqliteVecStore(dbPath, dimensions = 384) {
|
|
8
|
+
let db;
|
|
9
|
+
return {
|
|
10
|
+
async initialize() {
|
|
11
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
12
|
+
db = new Database(dbPath);
|
|
13
|
+
sqliteVec.load(db);
|
|
14
|
+
db.pragma('journal_mode = WAL');
|
|
15
|
+
db.pragma('foreign_keys = ON');
|
|
16
|
+
createTables(db, dimensions);
|
|
17
|
+
},
|
|
18
|
+
async upsertDocument(doc) {
|
|
19
|
+
db.prepare(`
|
|
20
|
+
INSERT OR REPLACE INTO documents (id, file_path, title, content, frontmatter, tags, last_modified, content_hash, indexed_at, source, type)
|
|
21
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
22
|
+
`).run(doc.id, doc.filePath, doc.title, doc.content, JSON.stringify(doc.frontmatter), JSON.stringify(doc.tags), doc.lastModified, doc.contentHash, new Date().toISOString(), doc.source ?? 'local', doc.type ?? 'note');
|
|
23
|
+
},
|
|
24
|
+
async upsertChunks(chunks) {
|
|
25
|
+
if (chunks.length === 0)
|
|
26
|
+
return;
|
|
27
|
+
const docId = chunks[0].documentId;
|
|
28
|
+
const tx = db.transaction(() => {
|
|
29
|
+
// 기존 청크 삭제 (문서 단위 교체)
|
|
30
|
+
// 새로 삽입할 chunk ID들도 미리 삭제 (다른 문서에서 온 중복 방지)
|
|
31
|
+
const newChunkIds = chunks.map(c => c.id);
|
|
32
|
+
db.prepare('DELETE FROM chunk_embeddings WHERE chunk_id IN (SELECT id FROM chunks WHERE document_id = ?)').run(docId);
|
|
33
|
+
db.prepare('DELETE FROM chunks WHERE document_id = ?').run(docId);
|
|
34
|
+
for (const cid of newChunkIds) {
|
|
35
|
+
db.prepare('DELETE FROM chunk_embeddings WHERE chunk_id = ?').run(cid);
|
|
36
|
+
db.prepare('DELETE FROM chunks WHERE id = ?').run(cid);
|
|
37
|
+
}
|
|
38
|
+
const insertChunk = db.prepare(`
|
|
39
|
+
INSERT INTO chunks (id, document_id, content, heading, start_line, end_line, token_count)
|
|
40
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
41
|
+
`);
|
|
42
|
+
const insertEmbedding = db.prepare(`
|
|
43
|
+
INSERT INTO chunk_embeddings (chunk_id, embedding)
|
|
44
|
+
VALUES (?, ?)
|
|
45
|
+
`);
|
|
46
|
+
for (const chunk of chunks) {
|
|
47
|
+
insertChunk.run(chunk.id, chunk.documentId, chunk.content, chunk.heading, chunk.startLine, chunk.endLine, chunk.tokenCount);
|
|
48
|
+
if (chunk.embedding) {
|
|
49
|
+
insertEmbedding.run(chunk.id, float32Buffer(chunk.embedding));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
tx();
|
|
54
|
+
},
|
|
55
|
+
async deleteByDocumentId(documentId) {
|
|
56
|
+
const tx = db.transaction(() => {
|
|
57
|
+
db.prepare('DELETE FROM chunk_embeddings WHERE chunk_id IN (SELECT id FROM chunks WHERE document_id = ?)').run(documentId);
|
|
58
|
+
db.prepare('DELETE FROM chunks WHERE document_id = ?').run(documentId);
|
|
59
|
+
db.prepare('DELETE FROM documents WHERE id = ?').run(documentId);
|
|
60
|
+
});
|
|
61
|
+
tx();
|
|
62
|
+
},
|
|
63
|
+
async searchSemantic(embedding, limit) {
|
|
64
|
+
const rows = db.prepare(`
|
|
65
|
+
SELECT chunk_id, distance
|
|
66
|
+
FROM chunk_embeddings
|
|
67
|
+
WHERE embedding MATCH ?
|
|
68
|
+
ORDER BY distance
|
|
69
|
+
LIMIT ?
|
|
70
|
+
`).all(float32Buffer(embedding), limit);
|
|
71
|
+
return rows.map(r => ({
|
|
72
|
+
chunkId: r.chunk_id,
|
|
73
|
+
score: 1 / (1 + r.distance), // distance → similarity score
|
|
74
|
+
}));
|
|
75
|
+
},
|
|
76
|
+
async searchKeyword(query, limit) {
|
|
77
|
+
const rows = db.prepare(`
|
|
78
|
+
SELECT c.id as chunk_id, rank
|
|
79
|
+
FROM chunks_fts f
|
|
80
|
+
JOIN chunks c ON c.rowid = f.rowid
|
|
81
|
+
WHERE chunks_fts MATCH ?
|
|
82
|
+
ORDER BY rank
|
|
83
|
+
LIMIT ?
|
|
84
|
+
`).all(query, limit);
|
|
85
|
+
return rows.map(r => ({
|
|
86
|
+
chunkId: r.chunk_id,
|
|
87
|
+
score: -r.rank, // FTS5 rank is negative (lower = better)
|
|
88
|
+
}));
|
|
89
|
+
},
|
|
90
|
+
async getDocument(documentId) {
|
|
91
|
+
const row = db.prepare('SELECT * FROM documents WHERE id = ?').get(documentId);
|
|
92
|
+
if (!row)
|
|
93
|
+
return null;
|
|
94
|
+
return rowToDocument(row);
|
|
95
|
+
},
|
|
96
|
+
async getChunk(chunkId) {
|
|
97
|
+
const row = db.prepare('SELECT * FROM chunks WHERE id = ?').get(chunkId);
|
|
98
|
+
if (!row)
|
|
99
|
+
return null;
|
|
100
|
+
return rowToChunk(row);
|
|
101
|
+
},
|
|
102
|
+
async getAllDocuments() {
|
|
103
|
+
const rows = db.prepare('SELECT * FROM documents ORDER BY last_modified DESC').all();
|
|
104
|
+
return rows.map(rowToDocument);
|
|
105
|
+
},
|
|
106
|
+
async getTopics() {
|
|
107
|
+
const rows = db.prepare(`
|
|
108
|
+
SELECT je.value as tag, COUNT(DISTINCT d.id) as count
|
|
109
|
+
FROM documents d, json_each(d.tags) je
|
|
110
|
+
GROUP BY je.value
|
|
111
|
+
ORDER BY count DESC
|
|
112
|
+
`).all();
|
|
113
|
+
return rows.map(r => ({
|
|
114
|
+
topic: r.tag,
|
|
115
|
+
count: r.count,
|
|
116
|
+
recentDocuments: [],
|
|
117
|
+
}));
|
|
118
|
+
},
|
|
119
|
+
async getStats() {
|
|
120
|
+
const docCount = db.prepare('SELECT COUNT(*) as c FROM documents').get().c;
|
|
121
|
+
const chunkCount = db.prepare('SELECT COUNT(*) as c FROM chunks').get().c;
|
|
122
|
+
const lastRow = db.prepare('SELECT indexed_at FROM documents ORDER BY indexed_at DESC LIMIT 1').get();
|
|
123
|
+
return {
|
|
124
|
+
documentCount: docCount,
|
|
125
|
+
chunkCount: chunkCount,
|
|
126
|
+
dbSizeBytes: 0, // 나중에 파일 크기 조회
|
|
127
|
+
lastIndexed: lastRow?.indexed_at ?? null,
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
async getDocumentEmbeddings() {
|
|
131
|
+
// 각 문서의 첫 청크 임베딩을 문서 대표 벡터로 사용
|
|
132
|
+
const rows = db.prepare(`
|
|
133
|
+
SELECT c.document_id, ce.embedding
|
|
134
|
+
FROM chunks c
|
|
135
|
+
JOIN chunk_embeddings ce ON ce.chunk_id = c.id
|
|
136
|
+
WHERE c.id IN (
|
|
137
|
+
SELECT MIN(id) FROM chunks GROUP BY document_id
|
|
138
|
+
)
|
|
139
|
+
`).all();
|
|
140
|
+
const result = new Map();
|
|
141
|
+
for (const row of rows) {
|
|
142
|
+
result.set(row.document_id, bufferToFloat32(row.embedding));
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
145
|
+
},
|
|
146
|
+
async close() {
|
|
147
|
+
db.close();
|
|
148
|
+
},
|
|
149
|
+
getDb() {
|
|
150
|
+
return db;
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function bufferToFloat32(buf) {
|
|
155
|
+
const float32 = new Float32Array(buf.buffer, buf.byteOffset, buf.byteLength / 4);
|
|
156
|
+
return Array.from(float32);
|
|
157
|
+
}
|
|
158
|
+
function createTables(db, dimensions = 384) {
|
|
159
|
+
// 기존 DB 마이그레이션: source/type 컬럼 추가
|
|
160
|
+
try {
|
|
161
|
+
db.exec(`ALTER TABLE documents ADD COLUMN source TEXT DEFAULT 'local'`);
|
|
162
|
+
}
|
|
163
|
+
catch { /* 이미 존재 */ }
|
|
164
|
+
try {
|
|
165
|
+
db.exec(`ALTER TABLE documents ADD COLUMN type TEXT DEFAULT 'note'`);
|
|
166
|
+
}
|
|
167
|
+
catch { /* 이미 존재 */ }
|
|
168
|
+
db.exec(`
|
|
169
|
+
CREATE TABLE IF NOT EXISTS documents (
|
|
170
|
+
id TEXT PRIMARY KEY,
|
|
171
|
+
file_path TEXT NOT NULL UNIQUE,
|
|
172
|
+
title TEXT NOT NULL,
|
|
173
|
+
content TEXT NOT NULL,
|
|
174
|
+
frontmatter TEXT,
|
|
175
|
+
tags TEXT DEFAULT '[]',
|
|
176
|
+
last_modified TEXT NOT NULL,
|
|
177
|
+
content_hash TEXT NOT NULL,
|
|
178
|
+
indexed_at TEXT NOT NULL,
|
|
179
|
+
source TEXT DEFAULT 'local',
|
|
180
|
+
type TEXT DEFAULT 'note'
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
CREATE TABLE IF NOT EXISTS chunks (
|
|
184
|
+
id TEXT PRIMARY KEY,
|
|
185
|
+
document_id TEXT NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
186
|
+
content TEXT NOT NULL,
|
|
187
|
+
heading TEXT,
|
|
188
|
+
start_line INTEGER,
|
|
189
|
+
end_line INTEGER,
|
|
190
|
+
token_count INTEGER
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS chunk_embeddings USING vec0(
|
|
194
|
+
chunk_id TEXT PRIMARY KEY,
|
|
195
|
+
embedding FLOAT[${dimensions}]
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS chunks_fts USING fts5(
|
|
199
|
+
content,
|
|
200
|
+
heading,
|
|
201
|
+
content='chunks',
|
|
202
|
+
content_rowid='rowid'
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
CREATE INDEX IF NOT EXISTS idx_chunks_document_id ON chunks(document_id);
|
|
206
|
+
CREATE INDEX IF NOT EXISTS idx_documents_content_hash ON documents(content_hash);
|
|
207
|
+
`);
|
|
208
|
+
// FTS5 트리거: chunks INSERT/DELETE 시 자동 동기화
|
|
209
|
+
db.exec(`
|
|
210
|
+
CREATE TRIGGER IF NOT EXISTS chunks_ai AFTER INSERT ON chunks BEGIN
|
|
211
|
+
INSERT INTO chunks_fts(rowid, content, heading) VALUES (new.rowid, new.content, new.heading);
|
|
212
|
+
END;
|
|
213
|
+
CREATE TRIGGER IF NOT EXISTS chunks_ad AFTER DELETE ON chunks BEGIN
|
|
214
|
+
INSERT INTO chunks_fts(chunks_fts, rowid, content, heading) VALUES('delete', old.rowid, old.content, old.heading);
|
|
215
|
+
END;
|
|
216
|
+
`);
|
|
217
|
+
}
|
|
218
|
+
// Document 헬퍼: upsertDocument는 indexer에서 호출
|
|
219
|
+
export function upsertDocument(db, doc) {
|
|
220
|
+
db.prepare(`
|
|
221
|
+
INSERT OR REPLACE INTO documents (id, file_path, title, content, frontmatter, tags, last_modified, content_hash, indexed_at)
|
|
222
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
223
|
+
`).run(doc.id, doc.filePath, doc.title, doc.content, JSON.stringify(doc.frontmatter), JSON.stringify(doc.tags), doc.lastModified, doc.contentHash, new Date().toISOString());
|
|
224
|
+
}
|
|
225
|
+
function rowToDocument(row) {
|
|
226
|
+
return {
|
|
227
|
+
id: row.id,
|
|
228
|
+
filePath: row.file_path,
|
|
229
|
+
title: row.title,
|
|
230
|
+
content: row.content,
|
|
231
|
+
frontmatter: JSON.parse(row.frontmatter || '{}'),
|
|
232
|
+
tags: JSON.parse(row.tags || '[]'),
|
|
233
|
+
lastModified: row.last_modified,
|
|
234
|
+
contentHash: row.content_hash,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function rowToChunk(row) {
|
|
238
|
+
return {
|
|
239
|
+
id: row.id,
|
|
240
|
+
documentId: row.document_id,
|
|
241
|
+
content: row.content,
|
|
242
|
+
heading: row.heading ?? '',
|
|
243
|
+
startLine: row.start_line,
|
|
244
|
+
endLine: row.end_line,
|
|
245
|
+
tokenCount: row.token_count,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
function float32Buffer(arr) {
|
|
249
|
+
return Buffer.from(new Float32Array(arr).buffer);
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=sqlite-vec.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
|
@@ -0,0 +1,97 @@
|
|
|
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
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
|
@@ -0,0 +1,39 @@
|
|
|
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
|
|
@@ -0,0 +1,5 @@
|
|
|
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
|
|
@@ -0,0 +1,39 @@
|
|
|
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
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
|
@@ -0,0 +1,59 @@
|
|
|
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,37 +0,0 @@
|
|
|
1
|
-
name: Deploy Landing Page to GitHub Pages
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [master]
|
|
6
|
-
paths: [docs/landing/**]
|
|
7
|
-
workflow_dispatch:
|
|
8
|
-
|
|
9
|
-
permissions:
|
|
10
|
-
contents: read
|
|
11
|
-
pages: write
|
|
12
|
-
id-token: write
|
|
13
|
-
|
|
14
|
-
concurrency:
|
|
15
|
-
group: pages
|
|
16
|
-
cancel-in-progress: false
|
|
17
|
-
|
|
18
|
-
jobs:
|
|
19
|
-
deploy:
|
|
20
|
-
environment:
|
|
21
|
-
name: github-pages
|
|
22
|
-
url: ${{ steps.deployment.outputs.page_url }}
|
|
23
|
-
runs-on: ubuntu-latest
|
|
24
|
-
steps:
|
|
25
|
-
- uses: actions/checkout@v4
|
|
26
|
-
|
|
27
|
-
- name: Setup Pages
|
|
28
|
-
uses: actions/configure-pages@v5
|
|
29
|
-
|
|
30
|
-
- name: Upload artifact
|
|
31
|
-
uses: actions/upload-pages-artifact@v3
|
|
32
|
-
with:
|
|
33
|
-
path: docs/landing
|
|
34
|
-
|
|
35
|
-
- name: Deploy to GitHub Pages
|
|
36
|
-
id: deployment
|
|
37
|
-
uses: actions/deploy-pages@v4
|