@de-otio/chaoskb-client 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/agent-registry/config-merger.d.ts +28 -0
- package/dist/cli/agent-registry/config-merger.d.ts.map +1 -0
- package/dist/cli/agent-registry/config-merger.js +90 -0
- package/dist/cli/agent-registry/config-merger.js.map +1 -0
- package/dist/cli/agent-registry/detector.d.ts +7 -0
- package/dist/cli/agent-registry/detector.d.ts.map +1 -0
- package/dist/cli/agent-registry/detector.js +100 -0
- package/dist/cli/agent-registry/detector.js.map +1 -0
- package/dist/cli/agent-registry/index.d.ts +26 -0
- package/dist/cli/agent-registry/index.d.ts.map +1 -0
- package/dist/cli/agent-registry/index.js +77 -0
- package/dist/cli/agent-registry/index.js.map +1 -0
- package/dist/cli/agent-registry/path-validator.d.ts +11 -0
- package/dist/cli/agent-registry/path-validator.d.ts.map +1 -0
- package/dist/cli/agent-registry/path-validator.js +69 -0
- package/dist/cli/agent-registry/path-validator.js.map +1 -0
- package/dist/cli/agent-registry/registry.json +108 -0
- package/dist/cli/agent-registry/types.d.ts +29 -0
- package/dist/cli/agent-registry/types.d.ts.map +1 -0
- package/dist/cli/agent-registry/types.js +2 -0
- package/dist/cli/agent-registry/types.js.map +1 -0
- package/dist/cli/bootstrap-lock.d.ts +7 -0
- package/dist/cli/bootstrap-lock.d.ts.map +1 -0
- package/dist/cli/bootstrap-lock.js +62 -0
- package/dist/cli/bootstrap-lock.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +23 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +438 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/commands/config.d.ts +13 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +244 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/devices.d.ts +21 -0
- package/dist/cli/commands/devices.d.ts.map +1 -0
- package/dist/cli/commands/devices.js +229 -0
- package/dist/cli/commands/devices.js.map +1 -0
- package/dist/cli/commands/export.d.ts +12 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +183 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/import.d.ts +26 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +311 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/kb.d.ts +39 -0
- package/dist/cli/commands/kb.d.ts.map +1 -0
- package/dist/cli/commands/kb.js +138 -0
- package/dist/cli/commands/kb.js.map +1 -0
- package/dist/cli/commands/project.d.ts +6 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +115 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/projects.d.ts +33 -0
- package/dist/cli/commands/projects.d.ts.map +1 -0
- package/dist/cli/commands/projects.js +189 -0
- package/dist/cli/commands/projects.js.map +1 -0
- package/dist/cli/commands/register.d.ts +8 -0
- package/dist/cli/commands/register.d.ts.map +1 -0
- package/dist/cli/commands/register.js +146 -0
- package/dist/cli/commands/register.js.map +1 -0
- package/dist/cli/commands/rotate-key.d.ts +16 -0
- package/dist/cli/commands/rotate-key.d.ts.map +1 -0
- package/dist/cli/commands/rotate-key.js +197 -0
- package/dist/cli/commands/rotate-key.js.map +1 -0
- package/dist/cli/commands/setup-sync.d.ts +2 -0
- package/dist/cli/commands/setup-sync.d.ts.map +1 -0
- package/dist/cli/commands/setup-sync.js +165 -0
- package/dist/cli/commands/setup-sync.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +12 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +39 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/status.d.ts +5 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +96 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/uninstall.d.ts +4 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/uninstall.js +85 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/commands/unregister.d.ts +2 -0
- package/dist/cli/commands/unregister.d.ts.map +1 -0
- package/dist/cli/commands/unregister.js +46 -0
- package/dist/cli/commands/unregister.js.map +1 -0
- package/dist/cli/device-metadata.d.ts +15 -0
- package/dist/cli/device-metadata.d.ts.map +1 -0
- package/dist/cli/device-metadata.js +58 -0
- package/dist/cli/device-metadata.js.map +1 -0
- package/dist/cli/github.d.ts +38 -0
- package/dist/cli/github.d.ts.map +1 -0
- package/dist/cli/github.js +159 -0
- package/dist/cli/github.js.map +1 -0
- package/dist/cli/guide-hashes.json +13 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +226 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/mcp-server.d.ts +205 -0
- package/dist/cli/mcp-server.d.ts.map +1 -0
- package/dist/cli/mcp-server.js +366 -0
- package/dist/cli/mcp-server.js.map +1 -0
- package/dist/cli/tools/kb-delete.d.ts +10 -0
- package/dist/cli/tools/kb-delete.d.ts.map +1 -0
- package/dist/cli/tools/kb-delete.js +28 -0
- package/dist/cli/tools/kb-delete.js.map +1 -0
- package/dist/cli/tools/kb-ingest.d.ts +13 -0
- package/dist/cli/tools/kb-ingest.d.ts.map +1 -0
- package/dist/cli/tools/kb-ingest.js +72 -0
- package/dist/cli/tools/kb-ingest.js.map +1 -0
- package/dist/cli/tools/kb-list.d.ts +20 -0
- package/dist/cli/tools/kb-list.d.ts.map +1 -0
- package/dist/cli/tools/kb-list.js +24 -0
- package/dist/cli/tools/kb-list.js.map +1 -0
- package/dist/cli/tools/kb-query-shared.d.ts +27 -0
- package/dist/cli/tools/kb-query-shared.d.ts.map +1 -0
- package/dist/cli/tools/kb-query-shared.js +28 -0
- package/dist/cli/tools/kb-query-shared.js.map +1 -0
- package/dist/cli/tools/kb-query.d.ts +20 -0
- package/dist/cli/tools/kb-query.d.ts.map +1 -0
- package/dist/cli/tools/kb-query.js +109 -0
- package/dist/cli/tools/kb-query.js.map +1 -0
- package/dist/cli/tools/kb-summary.d.ts +29 -0
- package/dist/cli/tools/kb-summary.d.ts.map +1 -0
- package/dist/cli/tools/kb-summary.js +89 -0
- package/dist/cli/tools/kb-summary.js.map +1 -0
- package/dist/cli/tools/kb-sync-status.d.ts +7 -0
- package/dist/cli/tools/kb-sync-status.d.ts.map +1 -0
- package/dist/cli/tools/kb-sync-status.js +48 -0
- package/dist/cli/tools/kb-sync-status.js.map +1 -0
- package/dist/crypto/aad.d.ts +8 -0
- package/dist/crypto/aad.d.ts.map +1 -0
- package/dist/crypto/aad.js +11 -0
- package/dist/crypto/aad.js.map +1 -0
- package/dist/crypto/aead.d.ts +21 -0
- package/dist/crypto/aead.d.ts.map +1 -0
- package/dist/crypto/aead.js +43 -0
- package/dist/crypto/aead.js.map +1 -0
- package/dist/crypto/argon2.d.ts +11 -0
- package/dist/crypto/argon2.d.ts.map +1 -0
- package/dist/crypto/argon2.js +33 -0
- package/dist/crypto/argon2.js.map +1 -0
- package/dist/crypto/blob-id.d.ts +6 -0
- package/dist/crypto/blob-id.d.ts.map +1 -0
- package/dist/crypto/blob-id.js +33 -0
- package/dist/crypto/blob-id.js.map +1 -0
- package/dist/crypto/canonical-json.d.ts +6 -0
- package/dist/crypto/canonical-json.d.ts.map +1 -0
- package/dist/crypto/canonical-json.js +88 -0
- package/dist/crypto/canonical-json.js.map +1 -0
- package/dist/crypto/commitment.d.ts +12 -0
- package/dist/crypto/commitment.d.ts.map +1 -0
- package/dist/crypto/commitment.js +37 -0
- package/dist/crypto/commitment.js.map +1 -0
- package/dist/crypto/encryption-service.d.ts +19 -0
- package/dist/crypto/encryption-service.d.ts.map +1 -0
- package/dist/crypto/encryption-service.js +38 -0
- package/dist/crypto/encryption-service.js.map +1 -0
- package/dist/crypto/envelope-cbor.d.ts +37 -0
- package/dist/crypto/envelope-cbor.d.ts.map +1 -0
- package/dist/crypto/envelope-cbor.js +124 -0
- package/dist/crypto/envelope-cbor.js.map +1 -0
- package/dist/crypto/envelope.d.ts +34 -0
- package/dist/crypto/envelope.d.ts.map +1 -0
- package/dist/crypto/envelope.js +160 -0
- package/dist/crypto/envelope.js.map +1 -0
- package/dist/crypto/hkdf.d.ts +16 -0
- package/dist/crypto/hkdf.d.ts.map +1 -0
- package/dist/crypto/hkdf.js +33 -0
- package/dist/crypto/hkdf.js.map +1 -0
- package/dist/crypto/index.d.ts +15 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +15 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/invite.d.ts +31 -0
- package/dist/crypto/invite.d.ts.map +1 -0
- package/dist/crypto/invite.js +137 -0
- package/dist/crypto/invite.js.map +1 -0
- package/dist/crypto/keyring.d.ts +37 -0
- package/dist/crypto/keyring.d.ts.map +1 -0
- package/dist/crypto/keyring.js +219 -0
- package/dist/crypto/keyring.js.map +1 -0
- package/dist/crypto/known-keys.d.ts +34 -0
- package/dist/crypto/known-keys.d.ts.map +1 -0
- package/dist/crypto/known-keys.js +106 -0
- package/dist/crypto/known-keys.js.map +1 -0
- package/dist/crypto/project-keys.d.ts +26 -0
- package/dist/crypto/project-keys.d.ts.map +1 -0
- package/dist/crypto/project-keys.js +69 -0
- package/dist/crypto/project-keys.js.map +1 -0
- package/dist/crypto/secure-buffer.d.ts +31 -0
- package/dist/crypto/secure-buffer.d.ts.map +1 -0
- package/dist/crypto/secure-buffer.js +61 -0
- package/dist/crypto/secure-buffer.js.map +1 -0
- package/dist/crypto/ssh-agent.d.ts +16 -0
- package/dist/crypto/ssh-agent.d.ts.map +1 -0
- package/dist/crypto/ssh-agent.js +225 -0
- package/dist/crypto/ssh-agent.js.map +1 -0
- package/dist/crypto/ssh-keys.d.ts +19 -0
- package/dist/crypto/ssh-keys.d.ts.map +1 -0
- package/dist/crypto/ssh-keys.js +121 -0
- package/dist/crypto/ssh-keys.js.map +1 -0
- package/dist/crypto/tiers/enhanced.d.ts +25 -0
- package/dist/crypto/tiers/enhanced.d.ts.map +1 -0
- package/dist/crypto/tiers/enhanced.js +56 -0
- package/dist/crypto/tiers/enhanced.js.map +1 -0
- package/dist/crypto/tiers/maximum.d.ts +19 -0
- package/dist/crypto/tiers/maximum.d.ts.map +1 -0
- package/dist/crypto/tiers/maximum.js +25 -0
- package/dist/crypto/tiers/maximum.js.map +1 -0
- package/dist/crypto/tiers/standard.d.ts +27 -0
- package/dist/crypto/tiers/standard.d.ts.map +1 -0
- package/dist/crypto/tiers/standard.js +147 -0
- package/dist/crypto/tiers/standard.js.map +1 -0
- package/dist/crypto/types.d.ts +169 -0
- package/dist/crypto/types.d.ts.map +1 -0
- package/dist/crypto/types.js +11 -0
- package/dist/crypto/types.js.map +1 -0
- package/dist/pipeline/chunker.d.ts +27 -0
- package/dist/pipeline/chunker.d.ts.map +1 -0
- package/dist/pipeline/chunker.js +96 -0
- package/dist/pipeline/chunker.js.map +1 -0
- package/dist/pipeline/content-pipeline.d.ts +24 -0
- package/dist/pipeline/content-pipeline.d.ts.map +1 -0
- package/dist/pipeline/content-pipeline.js +49 -0
- package/dist/pipeline/content-pipeline.js.map +1 -0
- package/dist/pipeline/embedder.d.ts +49 -0
- package/dist/pipeline/embedder.d.ts.map +1 -0
- package/dist/pipeline/embedder.js +195 -0
- package/dist/pipeline/embedder.js.map +1 -0
- package/dist/pipeline/extract.d.ts +17 -0
- package/dist/pipeline/extract.d.ts.map +1 -0
- package/dist/pipeline/extract.js +70 -0
- package/dist/pipeline/extract.js.map +1 -0
- package/dist/pipeline/fetch.d.ts +26 -0
- package/dist/pipeline/fetch.d.ts.map +1 -0
- package/dist/pipeline/fetch.js +91 -0
- package/dist/pipeline/fetch.js.map +1 -0
- package/dist/pipeline/index.d.ts +10 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +10 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/model-manager.d.ts +57 -0
- package/dist/pipeline/model-manager.d.ts.map +1 -0
- package/dist/pipeline/model-manager.js +234 -0
- package/dist/pipeline/model-manager.js.map +1 -0
- package/dist/pipeline/search.d.ts +37 -0
- package/dist/pipeline/search.d.ts.map +1 -0
- package/dist/pipeline/search.js +65 -0
- package/dist/pipeline/search.js.map +1 -0
- package/dist/pipeline/tokenizer.d.ts +29 -0
- package/dist/pipeline/tokenizer.d.ts.map +1 -0
- package/dist/pipeline/tokenizer.js +54 -0
- package/dist/pipeline/tokenizer.js.map +1 -0
- package/dist/pipeline/types.d.ts +86 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +2 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/pipeline/wordpiece-tokenizer.d.ts +60 -0
- package/dist/pipeline/wordpiece-tokenizer.d.ts.map +1 -0
- package/dist/pipeline/wordpiece-tokenizer.js +251 -0
- package/dist/pipeline/wordpiece-tokenizer.js.map +1 -0
- package/dist/storage/chunk-repo.d.ts +29 -0
- package/dist/storage/chunk-repo.d.ts.map +1 -0
- package/dist/storage/chunk-repo.js +115 -0
- package/dist/storage/chunk-repo.js.map +1 -0
- package/dist/storage/database-manager.d.ts +17 -0
- package/dist/storage/database-manager.d.ts.map +1 -0
- package/dist/storage/database-manager.js +100 -0
- package/dist/storage/database-manager.js.map +1 -0
- package/dist/storage/database.d.ts +10 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +34 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/embedding-index.d.ts +22 -0
- package/dist/storage/embedding-index.d.ts.map +1 -0
- package/dist/storage/embedding-index.js +78 -0
- package/dist/storage/embedding-index.js.map +1 -0
- package/dist/storage/index.d.ts +10 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +10 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/kb-database.d.ts +11 -0
- package/dist/storage/kb-database.d.ts.map +1 -0
- package/dist/storage/kb-database.js +24 -0
- package/dist/storage/kb-database.js.map +1 -0
- package/dist/storage/schema.d.ts +6 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +122 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/storage/source-repo.d.ts +20 -0
- package/dist/storage/source-repo.d.ts.map +1 -0
- package/dist/storage/source-repo.js +120 -0
- package/dist/storage/source-repo.js.map +1 -0
- package/dist/storage/sync-status-repo.d.ts +15 -0
- package/dist/storage/sync-status-repo.d.ts.map +1 -0
- package/dist/storage/sync-status-repo.js +40 -0
- package/dist/storage/sync-status-repo.js.map +1 -0
- package/dist/storage/types.d.ts +139 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +9 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/sync/canary.d.ts +14 -0
- package/dist/sync/canary.d.ts.map +1 -0
- package/dist/sync/canary.js +53 -0
- package/dist/sync/canary.js.map +1 -0
- package/dist/sync/full-sync.d.ts +16 -0
- package/dist/sync/full-sync.d.ts.map +1 -0
- package/dist/sync/full-sync.js +91 -0
- package/dist/sync/full-sync.js.map +1 -0
- package/dist/sync/http-client.d.ts +28 -0
- package/dist/sync/http-client.d.ts.map +1 -0
- package/dist/sync/http-client.js +90 -0
- package/dist/sync/http-client.js.map +1 -0
- package/dist/sync/incremental-sync.d.ts +17 -0
- package/dist/sync/incremental-sync.d.ts.map +1 -0
- package/dist/sync/incremental-sync.js +155 -0
- package/dist/sync/incremental-sync.js.map +1 -0
- package/dist/sync/index.d.ts +12 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +12 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/quota.d.ts +17 -0
- package/dist/sync/quota.d.ts.map +1 -0
- package/dist/sync/quota.js +48 -0
- package/dist/sync/quota.js.map +1 -0
- package/dist/sync/sequence.d.ts +21 -0
- package/dist/sync/sequence.d.ts.map +1 -0
- package/dist/sync/sequence.js +49 -0
- package/dist/sync/sequence.js.map +1 -0
- package/dist/sync/ssh-signer.d.ts +59 -0
- package/dist/sync/ssh-signer.d.ts.map +1 -0
- package/dist/sync/ssh-signer.js +241 -0
- package/dist/sync/ssh-signer.js.map +1 -0
- package/dist/sync/sync-service.d.ts +48 -0
- package/dist/sync/sync-service.d.ts.map +1 -0
- package/dist/sync/sync-service.js +116 -0
- package/dist/sync/sync-service.js.map +1 -0
- package/dist/sync/types.d.ts +106 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +2 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/sync/upload-queue.d.ts +40 -0
- package/dist/sync/upload-queue.d.ts.map +1 -0
- package/dist/sync/upload-queue.js +148 -0
- package/dist/sync/upload-queue.js.map +1 -0
- package/dist/sync/verification.d.ts +17 -0
- package/dist/sync/verification.d.ts.map +1 -0
- package/dist/sync/verification.js +25 -0
- package/dist/sync/verification.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +16 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { handleKbIngest } from './tools/kb-ingest.js';
|
|
5
|
+
import { handleKbQuery } from './tools/kb-query.js';
|
|
6
|
+
import { handleKbList } from './tools/kb-list.js';
|
|
7
|
+
import { handleKbDelete } from './tools/kb-delete.js';
|
|
8
|
+
import { handleKbSummary } from './tools/kb-summary.js';
|
|
9
|
+
import { handleKbQueryShared } from './tools/kb-query-shared.js';
|
|
10
|
+
const TOOL_DEFINITIONS = [
|
|
11
|
+
{
|
|
12
|
+
name: 'kb_ingest',
|
|
13
|
+
description: 'Ingest a URL into the knowledge base. Fetches content, extracts text, chunks, embeds, encrypts, and stores locally.',
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
url: { type: 'string', description: 'URL to ingest' },
|
|
18
|
+
tags: {
|
|
19
|
+
type: 'array',
|
|
20
|
+
items: { type: 'string' },
|
|
21
|
+
description: 'Optional tags to assign to the source',
|
|
22
|
+
},
|
|
23
|
+
kb: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
description: 'Named KB to ingest into (required when multiple KBs exist, defaults to active KB)',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
required: ['url'],
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'kb_query',
|
|
33
|
+
description: 'Search the knowledge base. Supports semantic (embedding) search, keyword (FTS5) search, or hybrid (both combined). Without a kb parameter, searches all KBs and merges results.',
|
|
34
|
+
inputSchema: {
|
|
35
|
+
type: 'object',
|
|
36
|
+
properties: {
|
|
37
|
+
query: { type: 'string', description: 'Search query' },
|
|
38
|
+
limit: {
|
|
39
|
+
type: 'number',
|
|
40
|
+
description: 'Maximum number of results to return (default: 10)',
|
|
41
|
+
},
|
|
42
|
+
mode: {
|
|
43
|
+
type: 'string',
|
|
44
|
+
enum: ['semantic', 'keyword', 'hybrid'],
|
|
45
|
+
description: 'Search mode: "semantic" (default) for meaning-based, "keyword" for exact text match, "hybrid" for combined ranking',
|
|
46
|
+
},
|
|
47
|
+
kb: {
|
|
48
|
+
type: 'string',
|
|
49
|
+
description: 'Named KB to search (omit to search all KBs)',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
required: ['query'],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'kb_list',
|
|
57
|
+
description: 'List saved sources in the knowledge base with metadata. Without a kb parameter, lists sources across all KBs.',
|
|
58
|
+
inputSchema: {
|
|
59
|
+
type: 'object',
|
|
60
|
+
properties: {
|
|
61
|
+
limit: {
|
|
62
|
+
type: 'number',
|
|
63
|
+
description: 'Maximum number of sources to return (default: 20)',
|
|
64
|
+
},
|
|
65
|
+
offset: {
|
|
66
|
+
type: 'number',
|
|
67
|
+
description: 'Offset for pagination (default: 0)',
|
|
68
|
+
},
|
|
69
|
+
tags: {
|
|
70
|
+
type: 'array',
|
|
71
|
+
items: { type: 'string' },
|
|
72
|
+
description: 'Filter by tags',
|
|
73
|
+
},
|
|
74
|
+
kb: {
|
|
75
|
+
type: 'string',
|
|
76
|
+
description: 'Named KB to list (omit to list all KBs)',
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'kb_delete',
|
|
83
|
+
description: 'Soft-delete a source and its chunks from the knowledge base.',
|
|
84
|
+
inputSchema: {
|
|
85
|
+
type: 'object',
|
|
86
|
+
properties: {
|
|
87
|
+
id: { type: 'string', description: 'Source ID to delete' },
|
|
88
|
+
},
|
|
89
|
+
required: ['id'],
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: 'kb_summary',
|
|
94
|
+
description: 'Get a summary of articles added during a time period. Returns structured data for the agent to summarize.',
|
|
95
|
+
inputSchema: {
|
|
96
|
+
type: 'object',
|
|
97
|
+
properties: {
|
|
98
|
+
period: {
|
|
99
|
+
type: 'string',
|
|
100
|
+
description: 'Time period: "week", "month", "year", or custom range "YYYY-MM-DD:YYYY-MM-DD"',
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
required: ['period'],
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'kb_query_shared',
|
|
108
|
+
description: 'Search a shared project knowledge base. Like kb_query but includes content attribution (project name, uploader) in each result for provenance tracking.',
|
|
109
|
+
inputSchema: {
|
|
110
|
+
type: 'object',
|
|
111
|
+
properties: {
|
|
112
|
+
query: { type: 'string', description: 'Search query' },
|
|
113
|
+
project: { type: 'string', description: 'Shared project name to search' },
|
|
114
|
+
limit: {
|
|
115
|
+
type: 'number',
|
|
116
|
+
description: 'Maximum number of results to return (default: 10)',
|
|
117
|
+
},
|
|
118
|
+
mode: {
|
|
119
|
+
type: 'string',
|
|
120
|
+
enum: ['semantic', 'keyword', 'hybrid'],
|
|
121
|
+
description: 'Search mode: "semantic" (default), "keyword", or "hybrid"',
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
required: ['query', 'project'],
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
export function createMcpServer(deps) {
|
|
129
|
+
const server = new Server({ name: 'chaoskb', version: '0.1.0' }, { capabilities: { tools: {} } });
|
|
130
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
131
|
+
tools: TOOL_DEFINITIONS,
|
|
132
|
+
}));
|
|
133
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
134
|
+
const { name, arguments: args } = request.params;
|
|
135
|
+
try {
|
|
136
|
+
switch (name) {
|
|
137
|
+
case 'kb_ingest': {
|
|
138
|
+
const result = await handleKbIngest({
|
|
139
|
+
url: args.url,
|
|
140
|
+
tags: args.tags,
|
|
141
|
+
}, deps);
|
|
142
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
143
|
+
}
|
|
144
|
+
case 'kb_query': {
|
|
145
|
+
const result = await handleKbQuery({
|
|
146
|
+
query: args.query,
|
|
147
|
+
limit: args.limit,
|
|
148
|
+
mode: args.mode,
|
|
149
|
+
}, deps);
|
|
150
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
151
|
+
}
|
|
152
|
+
case 'kb_list': {
|
|
153
|
+
const result = await handleKbList({
|
|
154
|
+
limit: args.limit,
|
|
155
|
+
offset: args.offset,
|
|
156
|
+
tags: args.tags,
|
|
157
|
+
}, deps);
|
|
158
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
159
|
+
}
|
|
160
|
+
case 'kb_delete': {
|
|
161
|
+
const result = await handleKbDelete({
|
|
162
|
+
id: args.id,
|
|
163
|
+
}, deps);
|
|
164
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
165
|
+
}
|
|
166
|
+
case 'kb_summary': {
|
|
167
|
+
const result = await handleKbSummary({
|
|
168
|
+
period: args.period,
|
|
169
|
+
}, deps);
|
|
170
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
171
|
+
}
|
|
172
|
+
case 'kb_query_shared': {
|
|
173
|
+
const result = await handleKbQueryShared({
|
|
174
|
+
query: args.query,
|
|
175
|
+
project: args.project,
|
|
176
|
+
limit: args.limit,
|
|
177
|
+
mode: args.mode,
|
|
178
|
+
}, deps);
|
|
179
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
180
|
+
}
|
|
181
|
+
default:
|
|
182
|
+
return {
|
|
183
|
+
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
184
|
+
isError: true,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
190
|
+
return {
|
|
191
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
192
|
+
isError: true,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
return server;
|
|
197
|
+
}
|
|
198
|
+
export async function startMcpServer(options) {
|
|
199
|
+
// In production, dependencies are initialized here.
|
|
200
|
+
// For now, we set up the server structure and connect transport.
|
|
201
|
+
// Actual initialization requires loading config, opening DB, etc.
|
|
202
|
+
const { loadConfig } = await import('./commands/setup.js');
|
|
203
|
+
let config = await loadConfig();
|
|
204
|
+
if (!config && process.env.CHAOSKB_UNSAFE_NO_KEYRING === '1') {
|
|
205
|
+
// In CI/test mode, synthesize a minimal config so setup is not required
|
|
206
|
+
config = { securityTier: 'standard', projects: [] };
|
|
207
|
+
}
|
|
208
|
+
if (!config) {
|
|
209
|
+
// Auto-bootstrap on first launch
|
|
210
|
+
process.stderr.write('First launch — setting up ChaosKB...\n');
|
|
211
|
+
const { bootstrap } = await import('./bootstrap.js');
|
|
212
|
+
await bootstrap();
|
|
213
|
+
config = await loadConfig();
|
|
214
|
+
if (!config) {
|
|
215
|
+
process.stderr.write('Bootstrap failed. See ~/.chaoskb/ for details.\n');
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
process.stderr.write('ChaosKB is ready.\n');
|
|
219
|
+
}
|
|
220
|
+
// These would be real implementations in production.
|
|
221
|
+
// The module structure supports dependency injection for testability.
|
|
222
|
+
// For the MCP server startup, we dynamically load the real implementations.
|
|
223
|
+
// Placeholder: in a real build, these come from the actual modules
|
|
224
|
+
const deps = await initializeDependencies(options, config);
|
|
225
|
+
const server = createMcpServer(deps);
|
|
226
|
+
const transport = new StdioServerTransport();
|
|
227
|
+
await server.connect(transport);
|
|
228
|
+
}
|
|
229
|
+
async function initializeDependencies(options, config) {
|
|
230
|
+
// Dynamic imports to keep startup fast when running in CLI mode
|
|
231
|
+
const { KeyringService } = await import('../crypto/keyring.js');
|
|
232
|
+
const { EncryptionService } = await import('../crypto/encryption-service.js');
|
|
233
|
+
const { DatabaseManager } = await import('../storage/database-manager.js');
|
|
234
|
+
const { ModelManager } = await import('../pipeline/model-manager.js');
|
|
235
|
+
const { Embedder } = await import('../pipeline/embedder.js');
|
|
236
|
+
const { ContentPipeline } = await import('../pipeline/content-pipeline.js');
|
|
237
|
+
// 1. Set up encryption service
|
|
238
|
+
const encryption = new EncryptionService();
|
|
239
|
+
// 2. Retrieve master key from OS keyring (or generate ephemeral key for CI)
|
|
240
|
+
let masterKey;
|
|
241
|
+
if (process.env.CHAOSKB_UNSAFE_NO_KEYRING === '1') {
|
|
242
|
+
process.stderr.write('\n⚠ CHAOSKB_UNSAFE_NO_KEYRING=1 — key material is NOT protected by OS keyring. For testing only.\n\n');
|
|
243
|
+
masterKey = encryption.generateMasterKey();
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
if (config.securityTier === 'maximum') {
|
|
247
|
+
// Maximum tier: decrypt master key from passphrase-wrapped blob
|
|
248
|
+
masterKey = await unlockMaximumTierKey();
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
const keyring = new KeyringService();
|
|
252
|
+
masterKey = await keyring.retrieve('chaoskb', 'master-key');
|
|
253
|
+
if (!masterKey && process.env.CHAOSKB_KEY_STORAGE === 'file') {
|
|
254
|
+
// File-based key fallback
|
|
255
|
+
const { FILE_KEY_PATH } = await import('./bootstrap.js');
|
|
256
|
+
const fs = await import('node:fs');
|
|
257
|
+
try {
|
|
258
|
+
const hex = fs.readFileSync(FILE_KEY_PATH, 'utf-8').trim();
|
|
259
|
+
const { SecureBuffer } = await import('../crypto/secure-buffer.js');
|
|
260
|
+
masterKey = SecureBuffer.from(Buffer.from(hex, 'hex'));
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
// Fall through to the error below
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (!masterKey) {
|
|
268
|
+
throw new Error('Master key not found. Run `chaoskb-mcp setup` or ensure your OS keyring is accessible.');
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// 3. Derive key set from master key
|
|
272
|
+
const keys = encryption.deriveKeys(masterKey);
|
|
273
|
+
// 3. Initialize database
|
|
274
|
+
const dbManager = new DatabaseManager();
|
|
275
|
+
const db = options.projectName
|
|
276
|
+
? dbManager.getProjectDb(options.projectName)
|
|
277
|
+
: dbManager.getPersonalDb();
|
|
278
|
+
// 4. Load embedding index from database
|
|
279
|
+
db.embeddingIndex.load();
|
|
280
|
+
// 5. Ensure ONNX model is available and create content pipeline
|
|
281
|
+
const modelManager = new ModelManager();
|
|
282
|
+
const modelPath = await modelManager.ensureModel((downloaded, total) => {
|
|
283
|
+
if (total > 0) {
|
|
284
|
+
// Write progress to stderr (stdout is reserved for MCP JSON-RPC)
|
|
285
|
+
process.stderr.write(`\rDownloading embedding model: ${Math.round((downloaded / total) * 100)}%`);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
// Clear the progress line
|
|
289
|
+
process.stderr.write('\r\x1b[K');
|
|
290
|
+
const embedder = new Embedder(modelPath);
|
|
291
|
+
const pipeline = new ContentPipeline({
|
|
292
|
+
maxChunkTokens: 500,
|
|
293
|
+
overlapTokens: 50,
|
|
294
|
+
fetchTimeoutMs: 30000,
|
|
295
|
+
maxRedirects: 5,
|
|
296
|
+
userAgent: 'ChaosKB/0.1',
|
|
297
|
+
}, embedder);
|
|
298
|
+
return { db, dbManager, pipeline, encryption, keys };
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Unlock the master key for maximum security tier.
|
|
302
|
+
*
|
|
303
|
+
* Reads the encrypted key blob from ~/.chaoskb/master-key.enc,
|
|
304
|
+
* prompts for the passphrase on stderr, derives the wrapping key
|
|
305
|
+
* with Argon2id, and decrypts with XChaCha20-Poly1305.
|
|
306
|
+
*
|
|
307
|
+
* MCP servers communicate over stdin/stdout (JSON-RPC), so the
|
|
308
|
+
* passphrase prompt goes to stderr. This only works when stderr
|
|
309
|
+
* is a TTY (i.e. the agent spawned the process with a PTY).
|
|
310
|
+
* In non-TTY environments, maximum tier cannot unlock.
|
|
311
|
+
*/
|
|
312
|
+
async function unlockMaximumTierKey() {
|
|
313
|
+
const fs = await import('node:fs');
|
|
314
|
+
const path = await import('node:path');
|
|
315
|
+
const { CHAOSKB_DIR } = await import('./bootstrap.js');
|
|
316
|
+
const blobPath = path.join(CHAOSKB_DIR, 'master-key.enc');
|
|
317
|
+
let blobJson;
|
|
318
|
+
try {
|
|
319
|
+
blobJson = fs.readFileSync(blobPath, 'utf-8');
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
throw new Error(`Maximum tier key blob not found at ${blobPath}. ` +
|
|
323
|
+
'Re-run `chaoskb-mcp config upgrade-tier maximum` or reinstall.');
|
|
324
|
+
}
|
|
325
|
+
const blob = JSON.parse(blobJson);
|
|
326
|
+
if (blob.v !== 1 || blob.kdf !== 'argon2id') {
|
|
327
|
+
throw new Error(`Unsupported key blob format: v=${blob.v}, kdf=${blob.kdf}`);
|
|
328
|
+
}
|
|
329
|
+
// Prompt for passphrase on stderr (stdout is reserved for MCP JSON-RPC)
|
|
330
|
+
const readline = await import('node:readline');
|
|
331
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
|
|
332
|
+
const passphrase = await new Promise((resolve) => {
|
|
333
|
+
rl.question('Enter your ChaosKB passphrase: ', (answer) => {
|
|
334
|
+
rl.close();
|
|
335
|
+
resolve(answer.trim());
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
// Derive wrapping key
|
|
339
|
+
const { argon2Derive } = await import('../crypto/index.js');
|
|
340
|
+
const salt = Buffer.from(blob.salt, 'hex');
|
|
341
|
+
const wrappingKey = argon2Derive(passphrase, salt);
|
|
342
|
+
try {
|
|
343
|
+
// Decrypt master key
|
|
344
|
+
const { aeadDecrypt } = await import('../crypto/aead.js');
|
|
345
|
+
const nonce = new Uint8Array(Buffer.from(blob.nonce, 'hex'));
|
|
346
|
+
const ctAndTag = Buffer.from(blob.ciphertext, 'hex');
|
|
347
|
+
// XChaCha20-Poly1305 tag is last 16 bytes
|
|
348
|
+
const ciphertext = new Uint8Array(ctAndTag.subarray(0, ctAndTag.length - 16));
|
|
349
|
+
const tag = new Uint8Array(ctAndTag.subarray(ctAndTag.length - 16));
|
|
350
|
+
const aad = Buffer.from('chaoskb-master-key-wrap-v1');
|
|
351
|
+
let plaintext;
|
|
352
|
+
try {
|
|
353
|
+
plaintext = aeadDecrypt(wrappingKey.buffer, nonce, ciphertext, tag, aad);
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
throw new Error('Incorrect passphrase.');
|
|
357
|
+
}
|
|
358
|
+
const { SecureBuffer } = await import('../crypto/secure-buffer.js');
|
|
359
|
+
return SecureBuffer.from(Buffer.from(plaintext));
|
|
360
|
+
}
|
|
361
|
+
finally {
|
|
362
|
+
wrappingKey.dispose();
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
export { TOOL_DEFINITIONS };
|
|
366
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../cli/mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { McpDependencies } from '../mcp-server.js';
|
|
2
|
+
export interface KbDeleteInput {
|
|
3
|
+
id: string;
|
|
4
|
+
}
|
|
5
|
+
export interface KbDeleteResult {
|
|
6
|
+
id: string;
|
|
7
|
+
deleted: true;
|
|
8
|
+
}
|
|
9
|
+
export declare function handleKbDelete(input: KbDeleteInput, deps: McpDependencies): Promise<KbDeleteResult>;
|
|
10
|
+
//# sourceMappingURL=kb-delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-delete.d.ts","sourceRoot":"","sources":["../../../cli/tools/kb-delete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,IAAI,CAAC;CACf;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,cAAc,CAAC,CAgCzB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { SyncStatus } from '../../storage/types.js';
|
|
2
|
+
export async function handleKbDelete(input, deps) {
|
|
3
|
+
const { db } = deps;
|
|
4
|
+
// 1. Verify the source exists
|
|
5
|
+
const source = db.sources.getById(input.id);
|
|
6
|
+
if (!source) {
|
|
7
|
+
throw new Error(`Source not found: ${input.id}`);
|
|
8
|
+
}
|
|
9
|
+
if (source.deletedAt) {
|
|
10
|
+
throw new Error(`Source already deleted: ${input.id}`);
|
|
11
|
+
}
|
|
12
|
+
// 2. Soft-delete the source and its chunks
|
|
13
|
+
const deleted = db.sources.softDelete(input.id);
|
|
14
|
+
if (!deleted) {
|
|
15
|
+
throw new Error(`Failed to delete source: ${input.id}`);
|
|
16
|
+
}
|
|
17
|
+
// 3. Remove from embedding index
|
|
18
|
+
db.embeddingIndex.remove(input.id);
|
|
19
|
+
// 4. Set sync status to pending_delete for the source and all chunks
|
|
20
|
+
db.syncStatus.set(input.id, SyncStatus.PendingDelete);
|
|
21
|
+
// Also mark chunk blobs for deletion
|
|
22
|
+
const chunks = db.chunks.getBySourceId(input.id);
|
|
23
|
+
for (const chunk of chunks) {
|
|
24
|
+
db.syncStatus.set(chunk.id, SyncStatus.PendingDelete);
|
|
25
|
+
}
|
|
26
|
+
return { id: input.id, deleted: true };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=kb-delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-delete.js","sourceRoot":"","sources":["../../../cli/tools/kb-delete.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWpD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAoB,EACpB,IAAqB;IAErB,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAEpB,8BAA8B;IAC9B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,2CAA2C;IAC3C,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,iCAAiC;IACjC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAEnC,qEAAqE;IACrE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;IAEtD,qCAAqC;IACrC,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { McpDependencies } from '../mcp-server.js';
|
|
2
|
+
export interface KbIngestInput {
|
|
3
|
+
url: string;
|
|
4
|
+
tags?: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface KbIngestResult {
|
|
7
|
+
title: string;
|
|
8
|
+
url: string;
|
|
9
|
+
chunkCount: number;
|
|
10
|
+
blobIds: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare function handleKbIngest(input: KbIngestInput, deps: McpDependencies): Promise<KbIngestResult>;
|
|
13
|
+
//# sourceMappingURL=kb-ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-ingest.d.ts","sourceRoot":"","sources":["../../../cli/tools/kb-ingest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIxD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,cAAc,CAAC,CAoFzB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export async function handleKbIngest(input, deps) {
|
|
2
|
+
const { db, pipeline, encryption, keys } = deps;
|
|
3
|
+
// 1. Fetch and extract content from URL
|
|
4
|
+
const extracted = await pipeline.fetchAndExtract(input.url);
|
|
5
|
+
// 2. Chunk the extracted text
|
|
6
|
+
const chunks = pipeline.chunk(extracted.content);
|
|
7
|
+
// 3. Embed all chunks
|
|
8
|
+
const embeddedChunks = await pipeline.embedChunks(chunks);
|
|
9
|
+
// 4. Generate blob IDs
|
|
10
|
+
const sourceId = encryption.generateBlobId();
|
|
11
|
+
const chunkBlobIds = embeddedChunks.map(() => encryption.generateBlobId());
|
|
12
|
+
const allBlobIds = [sourceId, ...chunkBlobIds];
|
|
13
|
+
// 5. Encrypt source payload
|
|
14
|
+
const sourcePayload = {
|
|
15
|
+
type: 'source',
|
|
16
|
+
url: input.url,
|
|
17
|
+
title: extracted.title,
|
|
18
|
+
tags: input.tags,
|
|
19
|
+
chunkCount: embeddedChunks.length,
|
|
20
|
+
chunkIds: chunkBlobIds,
|
|
21
|
+
};
|
|
22
|
+
encryption.encrypt(sourcePayload, keys, 'CEK');
|
|
23
|
+
// 6. Encrypt each chunk payload
|
|
24
|
+
for (let i = 0; i < embeddedChunks.length; i++) {
|
|
25
|
+
const ec = embeddedChunks[i];
|
|
26
|
+
const chunkPayload = {
|
|
27
|
+
type: 'chunk',
|
|
28
|
+
sourceId,
|
|
29
|
+
index: ec.index,
|
|
30
|
+
model: ec.model,
|
|
31
|
+
content: ec.content,
|
|
32
|
+
tokenCount: ec.tokenCount,
|
|
33
|
+
embedding: Array.from(ec.embedding),
|
|
34
|
+
};
|
|
35
|
+
encryption.encrypt(chunkPayload, keys, 'CEK');
|
|
36
|
+
}
|
|
37
|
+
// 7. Store source record in database
|
|
38
|
+
db.sources.insert({
|
|
39
|
+
id: sourceId,
|
|
40
|
+
url: input.url,
|
|
41
|
+
title: extracted.title,
|
|
42
|
+
tags: input.tags ?? [],
|
|
43
|
+
chunkCount: embeddedChunks.length,
|
|
44
|
+
blobSizeBytes: extracted.byteLength,
|
|
45
|
+
});
|
|
46
|
+
// 8. Store chunk records with embeddings
|
|
47
|
+
const chunkRecords = embeddedChunks.map((ec, _i) => ({
|
|
48
|
+
sourceId,
|
|
49
|
+
chunkIndex: ec.index,
|
|
50
|
+
content: ec.content,
|
|
51
|
+
embedding: ec.embedding,
|
|
52
|
+
tokenCount: ec.tokenCount,
|
|
53
|
+
model: ec.model,
|
|
54
|
+
}));
|
|
55
|
+
db.chunks.insertMany(chunkRecords);
|
|
56
|
+
// 9. Add embeddings to in-memory index
|
|
57
|
+
db.embeddingIndex.add(sourceId, embeddedChunks.map((ec) => ({
|
|
58
|
+
chunkIndex: ec.index,
|
|
59
|
+
embedding: ec.embedding,
|
|
60
|
+
})));
|
|
61
|
+
// 10. Set sync status to local_only for all blobs
|
|
62
|
+
for (const blobId of allBlobIds) {
|
|
63
|
+
db.syncStatus.set(blobId, 'local_only');
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
title: extracted.title,
|
|
67
|
+
url: input.url,
|
|
68
|
+
chunkCount: embeddedChunks.length,
|
|
69
|
+
blobIds: allBlobIds,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=kb-ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-ingest.js","sourceRoot":"","sources":["../../../cli/tools/kb-ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { McpDependencies } from '../mcp-server.js';
|
|
2
|
+
export interface KbListInput {
|
|
3
|
+
limit?: number;
|
|
4
|
+
offset?: number;
|
|
5
|
+
tags?: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface KbListSourceItem {
|
|
8
|
+
id: string;
|
|
9
|
+
title: string;
|
|
10
|
+
url: string;
|
|
11
|
+
tags: string[];
|
|
12
|
+
chunkCount: number;
|
|
13
|
+
createdAt: string;
|
|
14
|
+
}
|
|
15
|
+
export interface KbListResult {
|
|
16
|
+
sources: KbListSourceItem[];
|
|
17
|
+
total: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function handleKbList(input: KbListInput, deps: McpDependencies): Promise<KbListResult>;
|
|
20
|
+
//# sourceMappingURL=kb-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-list.d.ts","sourceRoot":"","sources":["../../../cli/tools/kb-list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,YAAY,CAAC,CA0BvB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export async function handleKbList(input, deps) {
|
|
2
|
+
const { db } = deps;
|
|
3
|
+
const limit = input.limit ?? 20;
|
|
4
|
+
const offset = input.offset ?? 0;
|
|
5
|
+
const filter = {
|
|
6
|
+
tags: input.tags,
|
|
7
|
+
includeDeleted: false,
|
|
8
|
+
};
|
|
9
|
+
const pagination = { limit, offset };
|
|
10
|
+
const sources = db.sources.list(filter, pagination);
|
|
11
|
+
const total = db.sources.count(filter);
|
|
12
|
+
return {
|
|
13
|
+
sources: sources.map((s) => ({
|
|
14
|
+
id: s.id,
|
|
15
|
+
title: s.title,
|
|
16
|
+
url: s.url,
|
|
17
|
+
tags: s.tags,
|
|
18
|
+
chunkCount: s.chunkCount,
|
|
19
|
+
createdAt: s.createdAt,
|
|
20
|
+
})),
|
|
21
|
+
total,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=kb-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-list.js","sourceRoot":"","sources":["../../../cli/tools/kb-list.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAkB,EAClB,IAAqB;IAErB,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IACpB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAEjC,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,cAAc,EAAE,KAAK;KACtB,CAAC;IAEF,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAErC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEvC,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC;QACH,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { McpDependencies } from '../mcp-server.js';
|
|
2
|
+
import type { KbQueryInput, KbQueryResultItem } from './kb-query.js';
|
|
3
|
+
export interface SharedSource {
|
|
4
|
+
project: string;
|
|
5
|
+
uploader: string;
|
|
6
|
+
type: 'shared';
|
|
7
|
+
}
|
|
8
|
+
export interface KbQuerySharedResultItem extends KbQueryResultItem {
|
|
9
|
+
source: SharedSource;
|
|
10
|
+
}
|
|
11
|
+
export interface KbQuerySharedResult {
|
|
12
|
+
results: KbQuerySharedResultItem[];
|
|
13
|
+
mode: string;
|
|
14
|
+
}
|
|
15
|
+
export interface KbQuerySharedInput extends KbQueryInput {
|
|
16
|
+
project: string;
|
|
17
|
+
uploader?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Wraps the existing kb-query logic but adds attribution metadata
|
|
21
|
+
* (`source: { project, uploader, type: 'shared' }`) to each result.
|
|
22
|
+
*
|
|
23
|
+
* This makes content provenance visible to the agent when querying
|
|
24
|
+
* shared project knowledge bases.
|
|
25
|
+
*/
|
|
26
|
+
export declare function handleKbQueryShared(input: KbQuerySharedInput, deps: McpDependencies): Promise<KbQuerySharedResult>;
|
|
27
|
+
//# sourceMappingURL=kb-query-shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-query-shared.d.ts","sourceRoot":"","sources":["../../../cli/tools/kb-query-shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAiB,MAAM,eAAe,CAAC;AAEpF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,kBAAkB,EACzB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,mBAAmB,CAAC,CAuB9B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { handleKbQuery } from './kb-query.js';
|
|
2
|
+
/**
|
|
3
|
+
* Wraps the existing kb-query logic but adds attribution metadata
|
|
4
|
+
* (`source: { project, uploader, type: 'shared' }`) to each result.
|
|
5
|
+
*
|
|
6
|
+
* This makes content provenance visible to the agent when querying
|
|
7
|
+
* shared project knowledge bases.
|
|
8
|
+
*/
|
|
9
|
+
export async function handleKbQueryShared(input, deps) {
|
|
10
|
+
const baseResult = await handleKbQuery({
|
|
11
|
+
query: input.query,
|
|
12
|
+
limit: input.limit,
|
|
13
|
+
mode: input.mode,
|
|
14
|
+
}, deps);
|
|
15
|
+
const results = baseResult.results.map((item) => ({
|
|
16
|
+
...item,
|
|
17
|
+
source: {
|
|
18
|
+
project: input.project,
|
|
19
|
+
uploader: input.uploader ?? 'unknown',
|
|
20
|
+
type: 'shared',
|
|
21
|
+
},
|
|
22
|
+
}));
|
|
23
|
+
return {
|
|
24
|
+
results,
|
|
25
|
+
mode: baseResult.mode,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=kb-query-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-query-shared.js","sourceRoot":"","sources":["../../../cli/tools/kb-query-shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAuB9C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAyB,EACzB,IAAqB;IAErB,MAAM,UAAU,GAAkB,MAAM,aAAa,CACnD;QACE,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,EACD,IAAI,CACL,CAAC;IAEF,MAAM,OAAO,GAA8B,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3E,GAAG,IAAI;QACP,MAAM,EAAE;YACN,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,SAAS;YACrC,IAAI,EAAE,QAAiB;SACxB;KACF,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,OAAO;QACP,IAAI,EAAE,UAAU,CAAC,IAAI;KACtB,CAAC;AACJ,CAAC"}
|