@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,183 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as readline from 'node:readline';
|
|
4
|
+
import * as crypto from 'node:crypto';
|
|
5
|
+
import { loadConfig } from './setup.js';
|
|
6
|
+
function prompt(rl, question) {
|
|
7
|
+
return new Promise((resolve) => {
|
|
8
|
+
rl.question(question, (answer) => {
|
|
9
|
+
resolve(answer.trim());
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export async function exportCommand(options) {
|
|
14
|
+
const config = await loadConfig();
|
|
15
|
+
if (!config) {
|
|
16
|
+
console.error('ChaosKB is not set up. Run `chaoskb-mcp setup` first.');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const outputDir = path.resolve(options.outputPath);
|
|
20
|
+
if (!fs.existsSync(outputDir)) {
|
|
21
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
console.log('');
|
|
24
|
+
console.log(' ChaosKB Export');
|
|
25
|
+
console.log(' ==============');
|
|
26
|
+
console.log('');
|
|
27
|
+
if (options.format === 'encrypted') {
|
|
28
|
+
await exportEncrypted(outputDir);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
await exportPlaintext(outputDir);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function exportEncrypted(outputDir) {
|
|
35
|
+
const rl = readline.createInterface({
|
|
36
|
+
input: process.stdin,
|
|
37
|
+
output: process.stdout,
|
|
38
|
+
});
|
|
39
|
+
try {
|
|
40
|
+
console.log(' Format: encrypted (envelope format with Argon2id-wrapped key)');
|
|
41
|
+
console.log('');
|
|
42
|
+
// Prompt for export passphrase
|
|
43
|
+
const passphrase = await prompt(rl, ' Enter export passphrase: ');
|
|
44
|
+
if (!passphrase || passphrase.length < 8) {
|
|
45
|
+
console.log(' Passphrase must be at least 8 characters. Export cancelled.');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const confirm = await prompt(rl, ' Confirm passphrase: ');
|
|
49
|
+
if (passphrase !== confirm) {
|
|
50
|
+
console.log(' Passphrases do not match. Export cancelled.');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
console.log('');
|
|
54
|
+
console.log(' Deriving wrapping key with Argon2id...');
|
|
55
|
+
const { DatabaseManager } = await import('../../storage/database-manager.js');
|
|
56
|
+
const { EncryptionService } = await import('../../crypto/encryption-service.js');
|
|
57
|
+
const { KeyringService } = await import('../../crypto/keyring.js');
|
|
58
|
+
const { argon2Derive } = await import('../../crypto/index.js');
|
|
59
|
+
const keyring = new KeyringService();
|
|
60
|
+
const masterKey = await keyring.retrieve('chaoskb', 'master-key');
|
|
61
|
+
if (!masterKey) {
|
|
62
|
+
console.log(' Master key not found in OS keyring. Run `chaoskb-mcp setup` first.');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Derive wrapping key from export passphrase
|
|
66
|
+
const salt = crypto.randomBytes(32);
|
|
67
|
+
const derived = argon2Derive(passphrase, salt);
|
|
68
|
+
// Encrypt canary with wrapping key (verifies passphrase on import)
|
|
69
|
+
const encryption = new EncryptionService();
|
|
70
|
+
const wrappingKeys = encryption.deriveKeys(derived);
|
|
71
|
+
const canary = { type: 'canary', value: 'chaoskb-canary-v1' };
|
|
72
|
+
const wrappedCanary = encryption.encrypt(canary, wrappingKeys);
|
|
73
|
+
// Collect all sources and chunks from DB
|
|
74
|
+
const dbManager = new DatabaseManager();
|
|
75
|
+
const db = dbManager.getPersonalDb();
|
|
76
|
+
const sources = db.sources.list({}, { limit: 100000, offset: 0 });
|
|
77
|
+
const exportSources = [];
|
|
78
|
+
for (const source of sources) {
|
|
79
|
+
const chunks = db.chunks.getBySourceId(source.id);
|
|
80
|
+
exportSources.push({
|
|
81
|
+
id: source.id,
|
|
82
|
+
url: source.url,
|
|
83
|
+
title: source.title,
|
|
84
|
+
tags: source.tags,
|
|
85
|
+
chunks: chunks
|
|
86
|
+
.sort((a, b) => a.chunkIndex - b.chunkIndex)
|
|
87
|
+
.map((c) => ({ index: c.chunkIndex, content: c.content, tokenCount: c.tokenCount })),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// Encrypt the source data using AEAD directly (not via envelope — data is not a Payload type)
|
|
91
|
+
const { aeadEncrypt } = await import('../../crypto/aead.js');
|
|
92
|
+
const sourcesJson = JSON.stringify(exportSources);
|
|
93
|
+
const sourcesBytes = new TextEncoder().encode(sourcesJson);
|
|
94
|
+
const dataKey = new Uint8Array(wrappingKeys.contentKey.buffer);
|
|
95
|
+
const aad = new TextEncoder().encode('chaoskb-export-data');
|
|
96
|
+
const { nonce, ciphertext, tag } = aeadEncrypt(dataKey, sourcesBytes, aad);
|
|
97
|
+
// Concatenate nonce + ciphertext + tag
|
|
98
|
+
const encryptedData = new Uint8Array(nonce.length + ciphertext.length + tag.length);
|
|
99
|
+
encryptedData.set(nonce, 0);
|
|
100
|
+
encryptedData.set(ciphertext, nonce.length);
|
|
101
|
+
encryptedData.set(tag, nonce.length + ciphertext.length);
|
|
102
|
+
const exportData = {
|
|
103
|
+
version: 1,
|
|
104
|
+
format: 'chaoskb-export-encrypted',
|
|
105
|
+
exportedAt: new Date().toISOString(),
|
|
106
|
+
wrappedKey: {
|
|
107
|
+
alg: 'argon2id',
|
|
108
|
+
salt: salt.toString('base64'),
|
|
109
|
+
params: { m: 262144, t: 3, p: 1 },
|
|
110
|
+
ct: Buffer.from(wrappedCanary.bytes).toString('base64'),
|
|
111
|
+
},
|
|
112
|
+
data: Buffer.from(encryptedData).toString('base64'),
|
|
113
|
+
sourceCount: sources.length,
|
|
114
|
+
};
|
|
115
|
+
masterKey.dispose();
|
|
116
|
+
dbManager.closeAll();
|
|
117
|
+
const outputFile = path.join(outputDir, 'chaoskb-export.json');
|
|
118
|
+
fs.writeFileSync(outputFile, JSON.stringify(exportData, null, 2), {
|
|
119
|
+
mode: 0o600,
|
|
120
|
+
});
|
|
121
|
+
console.log(` Exported to: ${outputFile}`);
|
|
122
|
+
console.log('');
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
rl.close();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function exportPlaintext(outputDir) {
|
|
129
|
+
console.log(' Format: plaintext (Markdown files)');
|
|
130
|
+
console.log('');
|
|
131
|
+
// In production:
|
|
132
|
+
// 1. Open database and list all sources
|
|
133
|
+
// 2. For each source, get all chunks
|
|
134
|
+
// 3. Write each source as a Markdown file with YAML frontmatter
|
|
135
|
+
// 4. Generate manifest.json with SHA-256 hashes
|
|
136
|
+
const manifest = {};
|
|
137
|
+
const { DatabaseManager } = await import('../../storage/database-manager.js');
|
|
138
|
+
const dbManager = new DatabaseManager();
|
|
139
|
+
const db = dbManager.getPersonalDb();
|
|
140
|
+
const sources = db.sources.list({}, { limit: 100000, offset: 0 });
|
|
141
|
+
for (const source of sources) {
|
|
142
|
+
const chunks = db.chunks.getBySourceId(source.id);
|
|
143
|
+
const content = chunks
|
|
144
|
+
.sort((a, b) => a.chunkIndex - b.chunkIndex)
|
|
145
|
+
.map((c) => c.content)
|
|
146
|
+
.join('\n\n');
|
|
147
|
+
const frontmatter = [
|
|
148
|
+
'---',
|
|
149
|
+
`title: "${(source.title ?? '').replace(/"/g, '\\"')}"`,
|
|
150
|
+
`url: ${source.url}`,
|
|
151
|
+
`tags: [${(source.tags ?? []).map((t) => `"${t}"`).join(', ')}]`,
|
|
152
|
+
`date: ${source.createdAt}`,
|
|
153
|
+
'---',
|
|
154
|
+
].join('\n');
|
|
155
|
+
const fileContent = `${frontmatter}\n\n${content}\n`;
|
|
156
|
+
const safeName = sanitizeFilename(source.title ?? source.id);
|
|
157
|
+
const filePath = path.join(outputDir, `${safeName}.md`);
|
|
158
|
+
fs.writeFileSync(filePath, fileContent);
|
|
159
|
+
const hash = crypto.createHash('sha256').update(fileContent).digest('hex');
|
|
160
|
+
manifest[`${safeName}.md`] = { sha256: hash, title: source.title ?? '', url: source.url };
|
|
161
|
+
}
|
|
162
|
+
dbManager.closeAll();
|
|
163
|
+
const manifestPath = path.join(outputDir, 'manifest.json');
|
|
164
|
+
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
165
|
+
console.log(` Exported to: ${outputDir}`);
|
|
166
|
+
console.log(` Manifest: ${manifestPath}`);
|
|
167
|
+
console.log(` Files: ${Object.keys(manifest).length}`);
|
|
168
|
+
console.log('');
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Sanitize a string for use as a filename.
|
|
172
|
+
* Removes characters not safe for filesystems and truncates to reasonable length.
|
|
173
|
+
*/
|
|
174
|
+
export function sanitizeFilename(name) {
|
|
175
|
+
return name
|
|
176
|
+
.replace(/[/\\?%*:|"<>]/g, '-')
|
|
177
|
+
.replace(/\s+/g, '-')
|
|
178
|
+
.replace(/-+/g, '-')
|
|
179
|
+
.replace(/^-|-$/g, '')
|
|
180
|
+
.substring(0, 200)
|
|
181
|
+
|| 'untitled';
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../cli/commands/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import command: restore a previously exported knowledge base.
|
|
3
|
+
*
|
|
4
|
+
* Supports two formats:
|
|
5
|
+
* - **Plaintext**: directory of Markdown files with YAML frontmatter + manifest.json
|
|
6
|
+
* - **Encrypted**: single JSON file with Argon2id-wrapped key and encrypted source data
|
|
7
|
+
*/
|
|
8
|
+
export interface ImportOptions {
|
|
9
|
+
inputPath: string;
|
|
10
|
+
overwrite?: boolean;
|
|
11
|
+
projectName?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ImportResult {
|
|
14
|
+
imported: number;
|
|
15
|
+
skipped: number;
|
|
16
|
+
errors: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Import a previously exported knowledge base.
|
|
20
|
+
*
|
|
21
|
+
* Auto-detects format:
|
|
22
|
+
* - If inputPath is a directory → plaintext import (Markdown files)
|
|
23
|
+
* - If inputPath is a .json file → encrypted import
|
|
24
|
+
*/
|
|
25
|
+
export declare function importCommand(options: ImportOptions): Promise<ImportResult>;
|
|
26
|
+
//# sourceMappingURL=import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../cli/commands/import.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAkBD;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA2BjF"}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import command: restore a previously exported knowledge base.
|
|
3
|
+
*
|
|
4
|
+
* Supports two formats:
|
|
5
|
+
* - **Plaintext**: directory of Markdown files with YAML frontmatter + manifest.json
|
|
6
|
+
* - **Encrypted**: single JSON file with Argon2id-wrapped key and encrypted source data
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import * as crypto from 'node:crypto';
|
|
11
|
+
import * as readline from 'node:readline';
|
|
12
|
+
import { loadConfig } from './setup.js';
|
|
13
|
+
function prompt(rl, question) {
|
|
14
|
+
return new Promise((resolve) => {
|
|
15
|
+
rl.question(question, (answer) => {
|
|
16
|
+
resolve(answer.trim());
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Import a previously exported knowledge base.
|
|
22
|
+
*
|
|
23
|
+
* Auto-detects format:
|
|
24
|
+
* - If inputPath is a directory → plaintext import (Markdown files)
|
|
25
|
+
* - If inputPath is a .json file → encrypted import
|
|
26
|
+
*/
|
|
27
|
+
export async function importCommand(options) {
|
|
28
|
+
const config = await loadConfig();
|
|
29
|
+
if (!config) {
|
|
30
|
+
console.error('ChaosKB is not set up. Run `chaoskb-mcp setup` first.');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
const inputPath = path.resolve(options.inputPath);
|
|
34
|
+
if (!fs.existsSync(inputPath)) {
|
|
35
|
+
throw new Error(`Import path does not exist: ${inputPath}`);
|
|
36
|
+
}
|
|
37
|
+
console.log('');
|
|
38
|
+
console.log(' ChaosKB Import');
|
|
39
|
+
console.log(' ==============');
|
|
40
|
+
console.log('');
|
|
41
|
+
const stat = fs.statSync(inputPath);
|
|
42
|
+
if (stat.isDirectory()) {
|
|
43
|
+
return importPlaintext(inputPath, options);
|
|
44
|
+
}
|
|
45
|
+
if (inputPath.endsWith('.json')) {
|
|
46
|
+
return importEncrypted(inputPath, options);
|
|
47
|
+
}
|
|
48
|
+
throw new Error(`Unrecognized import format. Provide a directory (plaintext) or .json file (encrypted).`);
|
|
49
|
+
}
|
|
50
|
+
// --- Plaintext import ---
|
|
51
|
+
async function importPlaintext(inputDir, options) {
|
|
52
|
+
console.log(' Format: plaintext (Markdown files)');
|
|
53
|
+
console.log('');
|
|
54
|
+
// Load manifest if it exists
|
|
55
|
+
const manifestPath = path.join(inputDir, 'manifest.json');
|
|
56
|
+
let manifest = null;
|
|
57
|
+
if (fs.existsSync(manifestPath)) {
|
|
58
|
+
manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
59
|
+
console.log(` Found manifest with ${Object.keys(manifest).length} entries`);
|
|
60
|
+
}
|
|
61
|
+
const mdFiles = fs.readdirSync(inputDir)
|
|
62
|
+
.filter((f) => f.endsWith('.md') && f !== 'README.md')
|
|
63
|
+
.sort();
|
|
64
|
+
if (mdFiles.length === 0) {
|
|
65
|
+
console.log(' No Markdown files found in import directory.');
|
|
66
|
+
return { imported: 0, skipped: 0, errors: [] };
|
|
67
|
+
}
|
|
68
|
+
console.log(` Found ${mdFiles.length} Markdown files to import`);
|
|
69
|
+
console.log('');
|
|
70
|
+
const { DatabaseManager } = await import('../../storage/database-manager.js');
|
|
71
|
+
const dbManager = new DatabaseManager();
|
|
72
|
+
const db = options.projectName
|
|
73
|
+
? dbManager.getProjectDb(options.projectName)
|
|
74
|
+
: dbManager.getPersonalDb();
|
|
75
|
+
const result = { imported: 0, skipped: 0, errors: [] };
|
|
76
|
+
try {
|
|
77
|
+
for (const mdFile of mdFiles) {
|
|
78
|
+
const filePath = path.join(inputDir, mdFile);
|
|
79
|
+
try {
|
|
80
|
+
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
81
|
+
if (manifest && manifest[mdFile]) {
|
|
82
|
+
const expectedHash = manifest[mdFile].sha256;
|
|
83
|
+
const actualHash = crypto.createHash('sha256').update(fileContent).digest('hex');
|
|
84
|
+
if (actualHash !== expectedHash) {
|
|
85
|
+
result.errors.push(`${mdFile}: SHA-256 mismatch (file may be corrupted)`);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const parsed = parseFrontmatter(fileContent);
|
|
90
|
+
if (!parsed) {
|
|
91
|
+
result.errors.push(`${mdFile}: invalid or missing YAML frontmatter`);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const { frontmatter, content } = parsed;
|
|
95
|
+
const existingSources = db.sources.list({ titleSearch: frontmatter.title });
|
|
96
|
+
const duplicate = existingSources.find((s) => s.url === frontmatter.url);
|
|
97
|
+
if (duplicate && !options.overwrite) {
|
|
98
|
+
console.log(` Skipped: ${frontmatter.title} (duplicate URL)`);
|
|
99
|
+
result.skipped++;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (duplicate && options.overwrite) {
|
|
103
|
+
db.sources.softDelete(duplicate.id);
|
|
104
|
+
db.embeddingIndex.remove(duplicate.id);
|
|
105
|
+
db.chunks.deleteBySourceId(duplicate.id);
|
|
106
|
+
}
|
|
107
|
+
const sourceId = crypto.randomUUID();
|
|
108
|
+
db.sources.insert({
|
|
109
|
+
id: sourceId,
|
|
110
|
+
url: frontmatter.url,
|
|
111
|
+
title: frontmatter.title,
|
|
112
|
+
tags: frontmatter.tags,
|
|
113
|
+
chunkCount: 0,
|
|
114
|
+
blobSizeBytes: Buffer.byteLength(content, 'utf-8'),
|
|
115
|
+
});
|
|
116
|
+
db.chunks.insertMany([{
|
|
117
|
+
sourceId,
|
|
118
|
+
chunkIndex: 0,
|
|
119
|
+
content,
|
|
120
|
+
embedding: new Float32Array(384),
|
|
121
|
+
tokenCount: 0,
|
|
122
|
+
model: 'import-pending',
|
|
123
|
+
}]);
|
|
124
|
+
console.log(` Imported: ${frontmatter.title}`);
|
|
125
|
+
result.imported++;
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
129
|
+
result.errors.push(`${mdFile}: ${msg}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
dbManager.closeAll();
|
|
135
|
+
}
|
|
136
|
+
printSummary(result);
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
// --- Encrypted import ---
|
|
140
|
+
async function importEncrypted(inputFile, options) {
|
|
141
|
+
console.log(' Format: encrypted');
|
|
142
|
+
console.log('');
|
|
143
|
+
const rawData = fs.readFileSync(inputFile, 'utf-8');
|
|
144
|
+
const exportData = JSON.parse(rawData);
|
|
145
|
+
if (exportData.format !== 'chaoskb-export-encrypted') {
|
|
146
|
+
throw new Error(`Unrecognized export format: ${exportData.format}`);
|
|
147
|
+
}
|
|
148
|
+
if (!exportData.data) {
|
|
149
|
+
throw new Error('Export file does not contain source data (may be from an older version)');
|
|
150
|
+
}
|
|
151
|
+
// Prompt for passphrase
|
|
152
|
+
const rl = readline.createInterface({
|
|
153
|
+
input: process.stdin,
|
|
154
|
+
output: process.stdout,
|
|
155
|
+
});
|
|
156
|
+
let passphrase;
|
|
157
|
+
try {
|
|
158
|
+
passphrase = await prompt(rl, ' Enter export passphrase: ');
|
|
159
|
+
if (!passphrase) {
|
|
160
|
+
console.log(' No passphrase provided. Import cancelled.');
|
|
161
|
+
return { imported: 0, skipped: 0, errors: [] };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
rl.close();
|
|
166
|
+
}
|
|
167
|
+
console.log('');
|
|
168
|
+
console.log(' Deriving wrapping key with Argon2id...');
|
|
169
|
+
const { EncryptionService } = await import('../../crypto/encryption-service.js');
|
|
170
|
+
const { argon2Derive } = await import('../../crypto/index.js');
|
|
171
|
+
// Derive the wrapping key from the passphrase and salt
|
|
172
|
+
const salt = new Uint8Array(Buffer.from(exportData.wrappedKey.salt, 'base64'));
|
|
173
|
+
const derived = argon2Derive(passphrase, salt);
|
|
174
|
+
const encryption = new EncryptionService();
|
|
175
|
+
const wrappingKeys = encryption.deriveKeys(derived);
|
|
176
|
+
// Verify passphrase by trying to decrypt the canary
|
|
177
|
+
try {
|
|
178
|
+
const canaryBytes = new Uint8Array(Buffer.from(exportData.wrappedKey.ct, 'base64'));
|
|
179
|
+
// The canary is an encrypted envelope — if decryption succeeds, passphrase is correct
|
|
180
|
+
void canaryBytes;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Canary check is best-effort; the data decryption below will fail definitively
|
|
184
|
+
}
|
|
185
|
+
// Decrypt the source data using AEAD directly
|
|
186
|
+
let sourcesJson;
|
|
187
|
+
try {
|
|
188
|
+
const { aeadDecrypt } = await import('../../crypto/aead.js');
|
|
189
|
+
const encryptedData = new Uint8Array(Buffer.from(exportData.data, 'base64'));
|
|
190
|
+
const dataKey = new Uint8Array(wrappingKeys.contentKey.buffer);
|
|
191
|
+
const aad = new TextEncoder().encode('chaoskb-export-data');
|
|
192
|
+
// Split: nonce (24 bytes) + ciphertext + tag (16 bytes)
|
|
193
|
+
const nonceSize = 24;
|
|
194
|
+
const tagSize = 16;
|
|
195
|
+
const nonce = encryptedData.slice(0, nonceSize);
|
|
196
|
+
const ciphertext = encryptedData.slice(nonceSize, encryptedData.length - tagSize);
|
|
197
|
+
const tag = encryptedData.slice(encryptedData.length - tagSize);
|
|
198
|
+
const plaintext = aeadDecrypt(dataKey, nonce, ciphertext, tag, aad);
|
|
199
|
+
sourcesJson = new TextDecoder().decode(plaintext);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
throw new Error('Failed to decrypt export data. Wrong passphrase?');
|
|
203
|
+
}
|
|
204
|
+
const sources = JSON.parse(sourcesJson);
|
|
205
|
+
console.log(` Decrypted ${sources.length} sources`);
|
|
206
|
+
console.log('');
|
|
207
|
+
// Import into database
|
|
208
|
+
const { DatabaseManager } = await import('../../storage/database-manager.js');
|
|
209
|
+
const dbManager = new DatabaseManager();
|
|
210
|
+
const db = options.projectName
|
|
211
|
+
? dbManager.getProjectDb(options.projectName)
|
|
212
|
+
: dbManager.getPersonalDb();
|
|
213
|
+
const result = { imported: 0, skipped: 0, errors: [] };
|
|
214
|
+
try {
|
|
215
|
+
for (const source of sources) {
|
|
216
|
+
try {
|
|
217
|
+
const existingSources = db.sources.list({ titleSearch: source.title });
|
|
218
|
+
const duplicate = existingSources.find((s) => s.url === source.url);
|
|
219
|
+
if (duplicate && !options.overwrite) {
|
|
220
|
+
console.log(` Skipped: ${source.title} (duplicate URL)`);
|
|
221
|
+
result.skipped++;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (duplicate && options.overwrite) {
|
|
225
|
+
db.sources.softDelete(duplicate.id);
|
|
226
|
+
db.embeddingIndex.remove(duplicate.id);
|
|
227
|
+
db.chunks.deleteBySourceId(duplicate.id);
|
|
228
|
+
}
|
|
229
|
+
const sourceId = crypto.randomUUID();
|
|
230
|
+
db.sources.insert({
|
|
231
|
+
id: sourceId,
|
|
232
|
+
url: source.url,
|
|
233
|
+
title: source.title,
|
|
234
|
+
tags: source.tags,
|
|
235
|
+
chunkCount: source.chunks.length,
|
|
236
|
+
blobSizeBytes: source.chunks.reduce((sum, c) => sum + Buffer.byteLength(c.content, 'utf-8'), 0),
|
|
237
|
+
});
|
|
238
|
+
db.chunks.insertMany(source.chunks.map((c) => ({
|
|
239
|
+
sourceId,
|
|
240
|
+
chunkIndex: c.index,
|
|
241
|
+
content: c.content,
|
|
242
|
+
embedding: new Float32Array(384), // Will need re-embedding
|
|
243
|
+
tokenCount: c.tokenCount,
|
|
244
|
+
model: 'import-pending',
|
|
245
|
+
})));
|
|
246
|
+
console.log(` Imported: ${source.title} (${source.chunks.length} chunks)`);
|
|
247
|
+
result.imported++;
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
251
|
+
result.errors.push(`${source.title}: ${msg}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
dbManager.closeAll();
|
|
257
|
+
}
|
|
258
|
+
printSummary(result);
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
// --- Helpers ---
|
|
262
|
+
function printSummary(result) {
|
|
263
|
+
console.log('');
|
|
264
|
+
console.log(` Summary: ${result.imported} imported, ${result.skipped} skipped, ${result.errors.length} errors`);
|
|
265
|
+
if (result.errors.length > 0) {
|
|
266
|
+
console.log('');
|
|
267
|
+
console.log(' Errors:');
|
|
268
|
+
for (const err of result.errors) {
|
|
269
|
+
console.log(` - ${err}`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
console.log('');
|
|
273
|
+
}
|
|
274
|
+
function parseFrontmatter(fileContent) {
|
|
275
|
+
const fmMatch = fileContent.match(/^---\n([\s\S]*?)\n---\n\n?([\s\S]*)$/);
|
|
276
|
+
if (!fmMatch) {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
const yamlBlock = fmMatch[1];
|
|
280
|
+
const content = fmMatch[2].trim();
|
|
281
|
+
const title = extractYamlValue(yamlBlock, 'title') ?? '';
|
|
282
|
+
const url = extractYamlValue(yamlBlock, 'url') ?? '';
|
|
283
|
+
const dateStr = extractYamlValue(yamlBlock, 'date') ?? '';
|
|
284
|
+
const tagsMatch = yamlBlock.match(/^tags:\s*\[(.*)\]\s*$/m);
|
|
285
|
+
const tags = [];
|
|
286
|
+
if (tagsMatch) {
|
|
287
|
+
const tagMatches = tagsMatch[1].matchAll(/"([^"]*)"/g);
|
|
288
|
+
for (const m of tagMatches) {
|
|
289
|
+
tags.push(m[1]);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (!url) {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
frontmatter: { title, url, tags, date: dateStr },
|
|
297
|
+
content,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
function extractYamlValue(yaml, key) {
|
|
301
|
+
const quotedMatch = yaml.match(new RegExp(`^${key}:\\s*"((?:[^"\\\\]|\\\\.)*)"\\s*$`, 'm'));
|
|
302
|
+
if (quotedMatch) {
|
|
303
|
+
return quotedMatch[1].replace(/\\"/g, '"');
|
|
304
|
+
}
|
|
305
|
+
const plainMatch = yaml.match(new RegExp(`^${key}:\\s*(.+)$`, 'm'));
|
|
306
|
+
if (plainMatch) {
|
|
307
|
+
return plainMatch[1].trim();
|
|
308
|
+
}
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../../cli/commands/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface KBConfig {
|
|
2
|
+
name: string;
|
|
3
|
+
sshKeyPath?: string;
|
|
4
|
+
github?: string;
|
|
5
|
+
endpoint?: string;
|
|
6
|
+
securityTier?: string;
|
|
7
|
+
createdAt: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* F1.1: `chaoskb kb create <name> --key <path> [--github <username>]`
|
|
11
|
+
*/
|
|
12
|
+
export declare function kbCreateCommand(name: string, options: {
|
|
13
|
+
key?: string;
|
|
14
|
+
github?: string;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* F1.5: `chaoskb kb list`
|
|
18
|
+
*/
|
|
19
|
+
export declare function kbListCommand(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* F1.6: `chaoskb kb delete <name>`
|
|
22
|
+
*/
|
|
23
|
+
export declare function kbDeleteCommand(name: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* List all named KBs by reading config.json from each subdirectory.
|
|
26
|
+
*/
|
|
27
|
+
export declare function listKBs(): KBConfig[];
|
|
28
|
+
/**
|
|
29
|
+
* F1.7: Get the default KB path. Creates `~/.chaoskb/default/` if needed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getDefaultKBPath(): string;
|
|
32
|
+
/**
|
|
33
|
+
* F1.8: Migrate flat layout to `default/` subdirectory.
|
|
34
|
+
*
|
|
35
|
+
* If `~/.chaoskb/config.json` exists (flat layout), move everything
|
|
36
|
+
* into `~/.chaoskb/default/`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function migrateToNamedKBLayout(): boolean;
|
|
39
|
+
//# sourceMappingURL=kb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb.d.ts","sourceRoot":"","sources":["../../../cli/commands/kb.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBnD;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWjE;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,QAAQ,EAAE,CAqBpC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CA2BhD"}
|