@knowzai/cli 0.1.0 → 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/assets/portable/.env.example +3 -0
- package/assets/portable/docker-compose.yml +18 -0
- package/assets/portable/releases.json +22 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/base-command.d.ts +21 -2
- package/dist/base-command.d.ts.map +1 -1
- package/dist/base-command.js +47 -4
- package/dist/base-command.js.map +1 -1
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +5 -1
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/auth/status.d.ts +1 -1
- package/dist/commands/auth/status.d.ts.map +1 -1
- package/dist/commands/auth/status.js +4 -0
- package/dist/commands/auth/status.js.map +1 -1
- package/dist/commands/chat.d.ts +5 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +32 -13
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/config/get.d.ts.map +1 -1
- package/dist/commands/config/get.js +3 -1
- package/dist/commands/config/get.js.map +1 -1
- package/dist/commands/config/list.d.ts.map +1 -1
- package/dist/commands/config/list.js +12 -4
- package/dist/commands/config/list.js.map +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/export.d.ts +27 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +155 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import.d.ts +27 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +124 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/index/scan.d.ts.map +1 -1
- package/dist/commands/index/scan.js +24 -5
- package/dist/commands/index/scan.js.map +1 -1
- package/dist/commands/knowledge/amend.d.ts +1 -0
- package/dist/commands/knowledge/amend.d.ts.map +1 -1
- package/dist/commands/knowledge/amend.js +11 -2
- package/dist/commands/knowledge/amend.js.map +1 -1
- package/dist/commands/knowledge/attach.d.ts +19 -0
- package/dist/commands/knowledge/attach.d.ts.map +1 -0
- package/dist/commands/knowledge/attach.js +51 -0
- package/dist/commands/knowledge/attach.js.map +1 -0
- package/dist/commands/knowledge/create.d.ts +9 -1
- package/dist/commands/knowledge/create.d.ts.map +1 -1
- package/dist/commands/knowledge/create.js +26 -4
- package/dist/commands/knowledge/create.js.map +1 -1
- package/dist/commands/knowledge/update.d.ts +1 -0
- package/dist/commands/knowledge/update.d.ts.map +1 -1
- package/dist/commands/knowledge/update.js +4 -1
- package/dist/commands/knowledge/update.js.map +1 -1
- package/dist/commands/login.d.ts +19 -3
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +113 -64
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +35 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/mcp/serve.d.ts +16 -0
- package/dist/commands/mcp/serve.d.ts.map +1 -0
- package/dist/commands/mcp/serve.js +50 -0
- package/dist/commands/mcp/serve.js.map +1 -0
- package/dist/commands/menu.d.ts.map +1 -1
- package/dist/commands/menu.js +39 -3
- package/dist/commands/menu.js.map +1 -1
- package/dist/commands/peer/accept-fingerprint.d.ts +17 -0
- package/dist/commands/peer/accept-fingerprint.d.ts.map +1 -0
- package/dist/commands/peer/accept-fingerprint.js +35 -0
- package/dist/commands/peer/accept-fingerprint.js.map +1 -0
- package/dist/commands/peer/add.d.ts +22 -0
- package/dist/commands/peer/add.d.ts.map +1 -0
- package/dist/commands/peer/add.js +44 -0
- package/dist/commands/peer/add.js.map +1 -0
- package/dist/commands/peer/cancel.d.ts +13 -0
- package/dist/commands/peer/cancel.d.ts.map +1 -0
- package/dist/commands/peer/cancel.js +20 -0
- package/dist/commands/peer/cancel.js.map +1 -0
- package/dist/commands/peer/link.d.ts +16 -0
- package/dist/commands/peer/link.d.ts.map +1 -0
- package/dist/commands/peer/link.js +32 -0
- package/dist/commands/peer/link.js.map +1 -0
- package/dist/commands/peer/links.d.ts +12 -0
- package/dist/commands/peer/links.d.ts.map +1 -0
- package/dist/commands/peer/links.js +25 -0
- package/dist/commands/peer/links.js.map +1 -0
- package/dist/commands/peer/list.d.ts +10 -0
- package/dist/commands/peer/list.d.ts.map +1 -0
- package/dist/commands/peer/list.js +22 -0
- package/dist/commands/peer/list.js.map +1 -0
- package/dist/commands/peer/pull.d.ts +19 -0
- package/dist/commands/peer/pull.d.ts.map +1 -0
- package/dist/commands/peer/pull.js +30 -0
- package/dist/commands/peer/pull.js.map +1 -0
- package/dist/commands/peer/push.d.ts +19 -0
- package/dist/commands/peer/push.d.ts.map +1 -0
- package/dist/commands/peer/push.js +30 -0
- package/dist/commands/peer/push.js.map +1 -0
- package/dist/commands/peer/remove.d.ts +12 -0
- package/dist/commands/peer/remove.d.ts.map +1 -0
- package/dist/commands/peer/remove.js +19 -0
- package/dist/commands/peer/remove.js.map +1 -0
- package/dist/commands/peer/rotate-key.d.ts +14 -0
- package/dist/commands/peer/rotate-key.d.ts.map +1 -0
- package/dist/commands/peer/rotate-key.js +26 -0
- package/dist/commands/peer/rotate-key.js.map +1 -0
- package/dist/commands/peer/run.d.ts +13 -0
- package/dist/commands/peer/run.d.ts.map +1 -0
- package/dist/commands/peer/run.js +31 -0
- package/dist/commands/peer/run.js.map +1 -0
- package/dist/commands/peer/runs.d.ts +15 -0
- package/dist/commands/peer/runs.d.ts.map +1 -0
- package/dist/commands/peer/runs.js +32 -0
- package/dist/commands/peer/runs.js.map +1 -0
- package/dist/commands/peer/test.d.ts +13 -0
- package/dist/commands/peer/test.d.ts.map +1 -0
- package/dist/commands/peer/test.js +30 -0
- package/dist/commands/peer/test.js.map +1 -0
- package/dist/commands/peer/unlink.d.ts +13 -0
- package/dist/commands/peer/unlink.d.ts.map +1 -0
- package/dist/commands/peer/unlink.js +20 -0
- package/dist/commands/peer/unlink.js.map +1 -0
- package/dist/commands/pg/status.d.ts.map +1 -1
- package/dist/commands/pg/status.js +6 -3
- package/dist/commands/pg/status.js.map +1 -1
- package/dist/commands/pg/up.d.ts.map +1 -1
- package/dist/commands/pg/up.js +9 -4
- package/dist/commands/pg/up.js.map +1 -1
- package/dist/commands/platform/status.d.ts.map +1 -1
- package/dist/commands/platform/status.js +4 -4
- package/dist/commands/platform/status.js.map +1 -1
- package/dist/commands/profile/purge.d.ts +20 -0
- package/dist/commands/profile/purge.d.ts.map +1 -0
- package/dist/commands/profile/purge.js +43 -0
- package/dist/commands/profile/purge.js.map +1 -0
- package/dist/commands/repo/context.d.ts.map +1 -1
- package/dist/commands/repo/context.js +3 -1
- package/dist/commands/repo/context.js.map +1 -1
- package/dist/commands/repo/graph.d.ts +3 -6
- package/dist/commands/repo/graph.d.ts.map +1 -1
- package/dist/commands/repo/graph.js +24 -40
- package/dist/commands/repo/graph.js.map +1 -1
- package/dist/commands/repo/index/index.d.ts +1 -0
- package/dist/commands/repo/index/index.d.ts.map +1 -1
- package/dist/commands/repo/index/index.js +100 -12
- package/dist/commands/repo/index/index.js.map +1 -1
- package/dist/commands/repo/search.d.ts.map +1 -1
- package/dist/commands/repo/search.js +2 -0
- package/dist/commands/repo/search.js.map +1 -1
- package/dist/commands/repo/setup.d.ts +9 -2
- package/dist/commands/repo/setup.d.ts.map +1 -1
- package/dist/commands/repo/setup.js +84 -8
- package/dist/commands/repo/setup.js.map +1 -1
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +21 -3
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/transfer.d.ts +30 -0
- package/dist/commands/transfer.d.ts.map +1 -0
- package/dist/commands/transfer.js +140 -0
- package/dist/commands/transfer.js.map +1 -0
- package/dist/commands/tui.js +1 -1
- package/dist/commands/tui.js.map +1 -1
- package/dist/commands/up.d.ts +5 -2
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +41 -12
- package/dist/commands/up.js.map +1 -1
- package/dist/lib/attach.d.ts +48 -0
- package/dist/lib/attach.d.ts.map +1 -0
- package/dist/lib/attach.js +91 -0
- package/dist/lib/attach.js.map +1 -0
- package/dist/lib/chat-render.d.ts +39 -0
- package/dist/lib/chat-render.d.ts.map +1 -0
- package/dist/lib/chat-render.js +77 -0
- package/dist/lib/chat-render.js.map +1 -0
- package/dist/lib/cmek-guard.d.ts +52 -0
- package/dist/lib/cmek-guard.d.ts.map +1 -0
- package/dist/lib/cmek-guard.js +73 -0
- package/dist/lib/cmek-guard.js.map +1 -0
- package/dist/lib/content.d.ts +7 -0
- package/dist/lib/content.d.ts.map +1 -1
- package/dist/lib/content.js +9 -2
- package/dist/lib/content.js.map +1 -1
- package/dist/lib/credential-purge.d.ts +52 -0
- package/dist/lib/credential-purge.d.ts.map +1 -0
- package/dist/lib/credential-purge.js +37 -0
- package/dist/lib/credential-purge.js.map +1 -0
- package/dist/lib/ingest.d.ts.map +1 -1
- package/dist/lib/ingest.js +7 -3
- package/dist/lib/ingest.js.map +1 -1
- package/dist/lib/local-mcp-server.d.ts +82 -0
- package/dist/lib/local-mcp-server.d.ts.map +1 -0
- package/dist/lib/local-mcp-server.js +252 -0
- package/dist/lib/local-mcp-server.js.map +1 -0
- package/dist/lib/local-mcp-stdio.d.ts +8 -0
- package/dist/lib/local-mcp-stdio.d.ts.map +1 -0
- package/dist/lib/local-mcp-stdio.js +50 -0
- package/dist/lib/local-mcp-stdio.js.map +1 -0
- package/dist/lib/login-guided.d.ts +20 -0
- package/dist/lib/login-guided.d.ts.map +1 -0
- package/dist/lib/login-guided.js +89 -0
- package/dist/lib/login-guided.js.map +1 -0
- package/dist/lib/login.d.ts +58 -12
- package/dist/lib/login.d.ts.map +1 -1
- package/dist/lib/login.js +170 -12
- package/dist/lib/login.js.map +1 -1
- package/dist/lib/onboarding.d.ts +56 -0
- package/dist/lib/onboarding.d.ts.map +1 -0
- package/dist/lib/onboarding.js +67 -0
- package/dist/lib/onboarding.js.map +1 -0
- package/dist/lib/peer-command.d.ts +51 -0
- package/dist/lib/peer-command.d.ts.map +1 -0
- package/dist/lib/peer-command.js +120 -0
- package/dist/lib/peer-command.js.map +1 -0
- package/dist/lib/peer-support.d.ts +67 -0
- package/dist/lib/peer-support.d.ts.map +1 -0
- package/dist/lib/peer-support.js +154 -0
- package/dist/lib/peer-support.js.map +1 -0
- package/dist/lib/platform-frontdoor-runtime.d.ts.map +1 -1
- package/dist/lib/platform-frontdoor-runtime.js +4 -0
- package/dist/lib/platform-frontdoor-runtime.js.map +1 -1
- package/dist/lib/platform-frontdoor.d.ts +18 -2
- package/dist/lib/platform-frontdoor.d.ts.map +1 -1
- package/dist/lib/platform-frontdoor.js +148 -9
- package/dist/lib/platform-frontdoor.js.map +1 -1
- package/dist/lib/platform-lifecycle.d.ts +7 -0
- package/dist/lib/platform-lifecycle.d.ts.map +1 -1
- package/dist/lib/platform-lifecycle.js +14 -3
- package/dist/lib/platform-lifecycle.js.map +1 -1
- package/dist/lib/platform-onboarding.d.ts +1 -0
- package/dist/lib/platform-onboarding.d.ts.map +1 -1
- package/dist/lib/platform-onboarding.js +13 -2
- package/dist/lib/platform-onboarding.js.map +1 -1
- package/dist/lib/platform-profile-purge.d.ts +1 -1
- package/dist/lib/platform-profile-purge.d.ts.map +1 -1
- package/dist/lib/platform-profile-purge.js +2 -1
- package/dist/lib/platform-profile-purge.js.map +1 -1
- package/dist/lib/platform-provider-prompt.d.ts +4 -0
- package/dist/lib/platform-provider-prompt.d.ts.map +1 -1
- package/dist/lib/platform-provider-prompt.js +4 -0
- package/dist/lib/platform-provider-prompt.js.map +1 -1
- package/dist/lib/platform-release-manifest.d.ts +14 -0
- package/dist/lib/platform-release-manifest.d.ts.map +1 -1
- package/dist/lib/platform-release-manifest.js +24 -0
- package/dist/lib/platform-release-manifest.js.map +1 -1
- package/dist/lib/portability-shared.d.ts +49 -0
- package/dist/lib/portability-shared.d.ts.map +1 -0
- package/dist/lib/portability-shared.js +220 -0
- package/dist/lib/portability-shared.js.map +1 -0
- package/dist/lib/project-mcp-config.d.ts +14 -0
- package/dist/lib/project-mcp-config.d.ts.map +1 -0
- package/dist/lib/project-mcp-config.js +78 -0
- package/dist/lib/project-mcp-config.js.map +1 -0
- package/dist/lib/release-package-graph.d.ts +154 -0
- package/dist/lib/release-package-graph.d.ts.map +1 -0
- package/dist/lib/release-package-graph.js +249 -0
- package/dist/lib/release-package-graph.js.map +1 -0
- package/dist/lib/repo-binding.d.ts +7 -2
- package/dist/lib/repo-binding.d.ts.map +1 -1
- package/dist/lib/repo-binding.js +131 -18
- package/dist/lib/repo-binding.js.map +1 -1
- package/dist/lib/repo-command-support.d.ts +3 -1
- package/dist/lib/repo-command-support.d.ts.map +1 -1
- package/dist/lib/repo-command-support.js.map +1 -1
- package/dist/lib/repo-local-mcp-backend.d.ts +65 -0
- package/dist/lib/repo-local-mcp-backend.d.ts.map +1 -0
- package/dist/lib/repo-local-mcp-backend.js +288 -0
- package/dist/lib/repo-local-mcp-backend.js.map +1 -0
- package/dist/lib/repo-local-mcp-runtime.d.ts +17 -0
- package/dist/lib/repo-local-mcp-runtime.d.ts.map +1 -0
- package/dist/lib/repo-local-mcp-runtime.js +136 -0
- package/dist/lib/repo-local-mcp-runtime.js.map +1 -0
- package/dist/lib/repo-scope-migration.d.ts +4 -0
- package/dist/lib/repo-scope-migration.d.ts.map +1 -0
- package/dist/lib/repo-scope-migration.js +55 -0
- package/dist/lib/repo-scope-migration.js.map +1 -0
- package/dist/lib/repo-scope.d.ts +9 -0
- package/dist/lib/repo-scope.d.ts.map +1 -0
- package/dist/lib/repo-scope.js +15 -0
- package/dist/lib/repo-scope.js.map +1 -0
- package/dist/lib/safe-file.d.ts +141 -0
- package/dist/lib/safe-file.d.ts.map +1 -0
- package/dist/lib/safe-file.js +296 -0
- package/dist/lib/safe-file.js.map +1 -0
- package/dist/lib/setup-console.d.ts +1 -1
- package/dist/lib/setup-console.d.ts.map +1 -1
- package/dist/lib/setup-console.js +3 -1
- package/dist/lib/setup-console.js.map +1 -1
- package/dist/lib/setup-page.d.ts.map +1 -1
- package/dist/lib/setup-page.js +18 -6
- package/dist/lib/setup-page.js.map +1 -1
- package/dist/lib/setup-plan.d.ts +2 -1
- package/dist/lib/setup-plan.d.ts.map +1 -1
- package/dist/lib/setup-plan.js +9 -2
- package/dist/lib/setup-plan.js.map +1 -1
- package/dist/lib/setup-server.d.ts.map +1 -1
- package/dist/lib/setup-server.js +13 -3
- package/dist/lib/setup-server.js.map +1 -1
- package/dist/lib/sso-login.d.ts +42 -0
- package/dist/lib/sso-login.d.ts.map +1 -0
- package/dist/lib/sso-login.js +135 -0
- package/dist/lib/sso-login.js.map +1 -0
- package/dist/lib/transfer.d.ts +80 -0
- package/dist/lib/transfer.d.ts.map +1 -0
- package/dist/lib/transfer.js +173 -0
- package/dist/lib/transfer.js.map +1 -0
- package/dist/lib/tui.d.ts +0 -6
- package/dist/lib/tui.d.ts.map +1 -1
- package/dist/lib/tui.js +6 -1
- package/dist/lib/tui.js.map +1 -1
- package/dist/lib/ui.js +1 -1
- package/dist/lib/ui.js.map +1 -1
- package/dist/menu/run.d.ts +7 -0
- package/dist/menu/run.d.ts.map +1 -1
- package/dist/menu/run.js +38 -2
- package/dist/menu/run.js.map +1 -1
- package/oclif.manifest.json +3400 -1361
- package/package.json +15 -10
|
@@ -3,6 +3,8 @@ import { KnowzError, ExitCode } from '@knowzai/core';
|
|
|
3
3
|
import { BaseCommand } from '../../base-command.js';
|
|
4
4
|
import { resolveContentInput } from '../../lib/content.js';
|
|
5
5
|
import { pollUntilTerminal, isTerminalStatus } from '../../lib/poll.js';
|
|
6
|
+
import { uploadAndAttach, assertReadableFiles, applyAttachExitCode, } from '../../lib/attach.js';
|
|
7
|
+
import { assertNoRawUploadUnderCmek, encryptOutboundContent } from '../../lib/cmek-guard.js';
|
|
6
8
|
const TYPES = ['Note', 'Document', 'Code', 'Link', 'File'];
|
|
7
9
|
export default class KnowledgeCreate extends BaseCommand {
|
|
8
10
|
static description = 'Create a knowledge item (content from --content, --file, or stdin).';
|
|
@@ -13,6 +15,12 @@ export default class KnowledgeCreate extends BaseCommand {
|
|
|
13
15
|
file: Flags.file({ description: 'Read content from a file', exists: true }),
|
|
14
16
|
type: Flags.string({ description: 'Knowledge type', options: TYPES, default: 'Note' }),
|
|
15
17
|
tag: Flags.string({ description: 'Tag (repeatable)', multiple: true }),
|
|
18
|
+
attach: Flags.file({
|
|
19
|
+
description: 'Upload a local file and attach it to the new item (repeatable)',
|
|
20
|
+
multiple: true,
|
|
21
|
+
exists: true,
|
|
22
|
+
}),
|
|
23
|
+
passphrase: Flags.string({ description: 'CMEK passphrase (if the profile is CMEK-enabled)' }),
|
|
16
24
|
wait: Flags.boolean({ description: 'Poll until enrichment reaches a terminal state' }),
|
|
17
25
|
};
|
|
18
26
|
async run() {
|
|
@@ -20,26 +28,40 @@ export default class KnowledgeCreate extends BaseCommand {
|
|
|
20
28
|
const title = args.title ?? flags.title;
|
|
21
29
|
if (!title)
|
|
22
30
|
throw new KnowzError('A title is required (positional or --title).', ExitCode.Usage);
|
|
31
|
+
const encryptor = this.cmekEncryptor(flags);
|
|
32
|
+
// H4 — refuse before the item exists, so a CMEK profile never ends up with a
|
|
33
|
+
// half-created item plus a plaintext attachment in the cloud.
|
|
34
|
+
if (flags.attach?.length)
|
|
35
|
+
assertNoRawUploadUnderCmek(encryptor, '--attach');
|
|
23
36
|
const client = await this.apiClient(flags);
|
|
24
37
|
const content = await resolveContentInput({ content: flags.content, file: flags.file });
|
|
25
38
|
const vaultId = await this.resolveVaultId(client, flags);
|
|
26
39
|
const created = await client.knowledge.create({
|
|
27
40
|
vaultId,
|
|
28
41
|
title,
|
|
29
|
-
|
|
42
|
+
// H4 — this direct write bypassed CMEK entirely; encrypt before the
|
|
43
|
+
// content leaves the machine, exactly as `sync push` does.
|
|
44
|
+
content: encryptOutboundContent(encryptor, content),
|
|
30
45
|
type: flags.type,
|
|
31
46
|
tags: flags.tag,
|
|
32
47
|
});
|
|
33
48
|
if (!this.jsonEnabled())
|
|
34
49
|
this.log(created.id);
|
|
50
|
+
// Attach before any --wait poll, so enrichment is observed with the files linked.
|
|
51
|
+
let attachments;
|
|
52
|
+
if (flags.attach?.length) {
|
|
53
|
+
assertReadableFiles(flags.attach);
|
|
54
|
+
attachments = await uploadAndAttach(client, created.id, flags.attach);
|
|
55
|
+
applyAttachExitCode(attachments);
|
|
56
|
+
}
|
|
35
57
|
if (flags.wait) {
|
|
36
58
|
const status = await pollUntilTerminal(() => client.knowledge.status(created.id), (s) => isTerminalStatus(s.enrichmentStatus), { label: 'enrichment' });
|
|
37
59
|
if (this.jsonEnabled())
|
|
38
|
-
return status;
|
|
60
|
+
return attachments ? { ...status, attachments } : status;
|
|
39
61
|
this.log(`status: ${status.enrichmentStatus}`);
|
|
40
|
-
return status;
|
|
62
|
+
return attachments ? { ...status, attachments } : status;
|
|
41
63
|
}
|
|
42
|
-
return created;
|
|
64
|
+
return attachments ? { ...created, attachments } : created;
|
|
43
65
|
}
|
|
44
66
|
}
|
|
45
67
|
//# sourceMappingURL=create.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/knowledge/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/knowledge/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ export default class KnowledgeUpdate extends BaseCommand {
|
|
|
10
10
|
content: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
11
|
file: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
12
|
tag: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
passphrase: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
14
|
};
|
|
14
15
|
run(): Promise<KnowledgeDetail>;
|
|
15
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/knowledge/update.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/knowledge/update.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,OAAgB,WAAW,SAA+D;IAC1F,OAAgB,IAAI;;MAAwE;IAC5F,OAAgB,KAAK;;;;;;MAMnB;IAEI,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;CAmBtC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Args, Flags } from '@oclif/core';
|
|
2
2
|
import { BaseCommand } from '../../base-command.js';
|
|
3
3
|
import { resolveContentInput } from '../../lib/content.js';
|
|
4
|
+
import { encryptOutboundContent } from '../../lib/cmek-guard.js';
|
|
4
5
|
export default class KnowledgeUpdate extends BaseCommand {
|
|
5
6
|
static description = 'Update a knowledge item (title, content, tags, or vault).';
|
|
6
7
|
static args = { id: Args.string({ description: 'Knowledge id', required: true }) };
|
|
@@ -9,6 +10,7 @@ export default class KnowledgeUpdate extends BaseCommand {
|
|
|
9
10
|
content: Flags.string({ description: 'New content text' }),
|
|
10
11
|
file: Flags.file({ description: 'Read new content from a file', exists: true }),
|
|
11
12
|
tag: Flags.string({ description: 'Replace tags (repeatable)', multiple: true }),
|
|
13
|
+
passphrase: Flags.string({ description: 'CMEK passphrase (if the profile is CMEK-enabled)' }),
|
|
12
14
|
};
|
|
13
15
|
async run() {
|
|
14
16
|
const { args, flags } = await this.parse(KnowledgeUpdate);
|
|
@@ -19,7 +21,8 @@ export default class KnowledgeUpdate extends BaseCommand {
|
|
|
19
21
|
const vaultId = flags.vault ? await this.resolveVaultId(client, flags) : undefined;
|
|
20
22
|
const updated = await client.knowledge.update(args.id, {
|
|
21
23
|
title: flags.title,
|
|
22
|
-
content
|
|
24
|
+
// H4 — encrypt before the content leaves the machine when CMEK is on.
|
|
25
|
+
content: encryptOutboundContent(this.cmekEncryptor(flags), content),
|
|
23
26
|
tags: flags.tag,
|
|
24
27
|
vaultId,
|
|
25
28
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/knowledge/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/knowledge/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,MAAM,CAAU,WAAW,GAAG,2DAA2D,CAAC;IAC1F,MAAM,CAAU,IAAI,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC5F,MAAM,CAAU,KAAK,GAAG;QACtB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;QACjD,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;QAC1D,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC/E,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC/E,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kDAAkD,EAAE,CAAC;KAC9F,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,OAAO,GACX,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI;YACvC,CAAC,CAAC,MAAM,mBAAmB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YACzE,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE;YACrD,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,sEAAsE;YACtE,OAAO,EAAE,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;YACnE,IAAI,EAAE,KAAK,CAAC,GAAG;YACf,OAAO;SACR,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,OAAO,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC;IACjB,CAAC"}
|
package/dist/commands/login.d.ts
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
import { BaseCommand } from '../base-command.js';
|
|
2
2
|
import { type LoginResult } from '../lib/login.js';
|
|
3
|
+
export declare function resolveRegistrationPassword(flags: {
|
|
4
|
+
password?: string;
|
|
5
|
+
'password-stdin'?: boolean;
|
|
6
|
+
}, env: Readonly<Record<string, string | undefined>>, deps: {
|
|
7
|
+
readStdin: () => Promise<string>;
|
|
8
|
+
isTty: boolean;
|
|
9
|
+
prompt: () => Promise<string>;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
password: string;
|
|
12
|
+
source: 'env' | 'stdin' | 'flag' | 'prompt';
|
|
13
|
+
}>;
|
|
3
14
|
export default class Login extends BaseCommand {
|
|
4
15
|
static description: string;
|
|
5
16
|
static examples: string[];
|
|
6
17
|
static flags: {
|
|
18
|
+
sso: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
19
|
+
oauth: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
20
|
+
'no-open': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
21
|
register: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
22
|
'self-hosted': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
23
|
key: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
@@ -12,12 +26,14 @@ export default class Login extends BaseCommand {
|
|
|
12
26
|
email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
27
|
name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
28
|
password: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
29
|
+
'password-stdin': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
30
|
+
'age-13-plus': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
31
|
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
32
|
};
|
|
17
33
|
run(): Promise<LoginResult>;
|
|
18
|
-
/**
|
|
34
|
+
/** Device-code SSO → minted ukz_ key, then the regular verify-and-store path. */
|
|
35
|
+
private completeSso;
|
|
36
|
+
/** Non-interactive / flag-driven input (scripts, --key-stdin, --register, --sso …). */
|
|
19
37
|
private flagLogin;
|
|
20
|
-
/** Guided sign-in: pick a method, then collect inputs with helpful validation. */
|
|
21
|
-
private guidedLogin;
|
|
22
38
|
}
|
|
23
39
|
//# sourceMappingURL=login.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAA8C,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAK/F,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,EACxD,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EACjD,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,GACxF,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAA;CAAE,CAAC,CAgB5E;AAED,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,WAAW;IAC5C,OAAgB,WAAW,SACgG;IAC3H,OAAgB,QAAQ,WAOtB;IACF,OAAgB,KAAK;;;;;;;;;;;;;;;MAiCnB;IAEI,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;IAsDjC,iFAAiF;YACnE,WAAW;IAmBzB,uFAAuF;YACzE,SAAS;CAuExB"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,39 +1,53 @@
|
|
|
1
1
|
import { Flags } from '@oclif/core';
|
|
2
|
-
import {
|
|
2
|
+
import { hostname } from 'node:os';
|
|
3
|
+
import { loadConfig, saveConfig, resolveProfileName, resolveApiUrlInfo, formatApiUrlSourceNotices, enforceTls, logger, registerSecret, KnowzError, ExitCode, } from '@knowzai/core';
|
|
3
4
|
import { createApiClient } from '@knowzai/api-client';
|
|
5
|
+
import { guidedLogin, replaceConfirmer } from '../lib/login-guided.js';
|
|
4
6
|
import { BaseCommand } from '../base-command.js';
|
|
5
|
-
import { performLogin } from '../lib/login.js';
|
|
6
|
-
import { readKeyFromStdin, promptHidden } from '../lib/prompt.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
7
|
+
import { performLogin, tenantLabel } from '../lib/login.js';
|
|
8
|
+
import { readKeyFromStdin, readStdinText, promptHidden } from '../lib/prompt.js';
|
|
9
|
+
import { openBrowser } from '../lib/browser.js';
|
|
10
|
+
import { runCliSsoLogin } from '../lib/sso-login.js';
|
|
11
|
+
export async function resolveRegistrationPassword(flags, env, deps) {
|
|
12
|
+
const fromEnv = env.KNOWZ_PASSWORD?.trim();
|
|
13
|
+
if (fromEnv)
|
|
14
|
+
return { password: fromEnv, source: 'env' };
|
|
15
|
+
if (flags['password-stdin']) {
|
|
16
|
+
const fromStdin = (await deps.readStdin()).trim();
|
|
17
|
+
if (fromStdin)
|
|
18
|
+
return { password: fromStdin, source: 'stdin' };
|
|
17
19
|
}
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return `${r.reason}${hint ? ` — ${hint}` : ''}`;
|
|
20
|
+
if (flags.password)
|
|
21
|
+
return { password: flags.password, source: 'flag' };
|
|
22
|
+
if (deps.isTty) {
|
|
23
|
+
const prompted = (await deps.prompt()).trim();
|
|
24
|
+
if (prompted)
|
|
25
|
+
return { password: prompted, source: 'prompt' };
|
|
26
|
+
}
|
|
27
|
+
throw new KnowzError('No registration password provided. Use KNOWZ_PASSWORD or --password-stdin.', ExitCode.Usage);
|
|
27
28
|
}
|
|
28
29
|
export default class Login extends BaseCommand {
|
|
29
|
-
static description = 'Authenticate: paste an API key, register a new tenant, or use a self-hosted key. Verifies before storing.';
|
|
30
|
+
static description = 'Authenticate: browser SSO, paste an API key, register a new tenant, or use a self-hosted key. Verifies before storing.';
|
|
30
31
|
static examples = [
|
|
31
32
|
'<%= config.bin %> login # guided sign-in (pick a method)',
|
|
33
|
+
'<%= config.bin %> login --sso # browser SSO (device authorization)',
|
|
32
34
|
'<%= config.bin %> login --key-stdin # echo $KEY | knowz login --key-stdin',
|
|
33
|
-
'<%= config.bin %> login --register --name "Me" --email me@example.com',
|
|
35
|
+
'printf \'%s\\n\' "$KNOWZ_PASSWORD" | <%= config.bin %> login --register --name "Me" --email me@example.com --password-stdin --age-13-plus',
|
|
34
36
|
'<%= config.bin %> login --self-hosted --api-url http://localhost:5000 --key-stdin',
|
|
37
|
+
'<%= config.bin %> login --profile work --force # re-point a profile already registered to another tenant',
|
|
35
38
|
];
|
|
36
39
|
static flags = {
|
|
40
|
+
sso: Flags.boolean({
|
|
41
|
+
description: 'Sign in via browser SSO (device authorization). Mints a user API key and stores it durably.',
|
|
42
|
+
exclusive: ['register', 'self-hosted', 'key', 'key-stdin'],
|
|
43
|
+
}),
|
|
44
|
+
oauth: Flags.boolean({
|
|
45
|
+
description: 'Alias of --sso (device-authorization browser sign-in)',
|
|
46
|
+
exclusive: ['register', 'self-hosted', 'key', 'key-stdin', 'sso'],
|
|
47
|
+
}),
|
|
48
|
+
'no-open': Flags.boolean({
|
|
49
|
+
description: 'With --sso, do not open a browser; print the verification URL and user code',
|
|
50
|
+
}),
|
|
37
51
|
register: Flags.boolean({ description: 'Register a new tenant' }),
|
|
38
52
|
'self-hosted': Flags.boolean({ description: 'Use a self-hosted key' }),
|
|
39
53
|
key: Flags.string({ description: 'API key (prefer --key-stdin; flags leak via shell history)' }),
|
|
@@ -43,41 +57,86 @@ export default class Login extends BaseCommand {
|
|
|
43
57
|
}),
|
|
44
58
|
email: Flags.string({ description: 'Email (with --register)' }),
|
|
45
59
|
name: Flags.string({ description: 'Name (with --register)' }),
|
|
46
|
-
password: Flags.string({
|
|
47
|
-
|
|
60
|
+
password: Flags.string({
|
|
61
|
+
description: 'Password (with --register; prefer env or --password-stdin because flags leak via shell history)',
|
|
62
|
+
}),
|
|
63
|
+
'password-stdin': Flags.boolean({ description: 'Read the registration password from stdin' }),
|
|
64
|
+
'age-13-plus': Flags.boolean({
|
|
65
|
+
description: 'Confirm you are at least 13 years old (required to register)',
|
|
66
|
+
}),
|
|
67
|
+
force: Flags.boolean({
|
|
68
|
+
description: 'Replace the credentials a profile is already registered with (also honored by the guided sign-in)',
|
|
69
|
+
}),
|
|
48
70
|
};
|
|
49
71
|
async run() {
|
|
50
72
|
const { flags } = await this.parse(Login);
|
|
51
73
|
const cfg = loadConfig();
|
|
52
74
|
const profile = resolveProfileName({ profileFlag: flags.profile }, cfg);
|
|
53
|
-
const
|
|
75
|
+
const urlInfo = resolveApiUrlInfo({ apiUrlFlag: flags['api-url'], profileFlag: flags.profile }, cfg);
|
|
76
|
+
const apiUrl = urlInfo.url;
|
|
77
|
+
if (!this.jsonEnabled()) {
|
|
78
|
+
for (const line of formatApiUrlSourceNotices(urlInfo))
|
|
79
|
+
this.log(line);
|
|
80
|
+
}
|
|
54
81
|
const store = (await this.authState(flags)).store;
|
|
55
82
|
// Guided interactive sign-in: no mode/key flags, a real terminal, human output.
|
|
56
|
-
const noFlags = !flags.register && !flags['self-hosted'] && !flags.key && !flags['key-stdin'];
|
|
57
|
-
|
|
58
|
-
? await
|
|
83
|
+
const noFlags = !flags.register && !flags['self-hosted'] && !flags.key && !flags['key-stdin'] && !flags.sso && !flags.oauth;
|
|
84
|
+
let input = noFlags && process.stdin.isTTY && !this.jsonEnabled()
|
|
85
|
+
? await guidedLogin(profile, apiUrl, flags.force, (line) => this.log(line))
|
|
59
86
|
: await this.flagLogin(flags, profile, apiUrl);
|
|
87
|
+
if (input.mode === 'sso') {
|
|
88
|
+
input = await this.completeSso(input, flags['no-open']);
|
|
89
|
+
}
|
|
60
90
|
if (input.key)
|
|
61
91
|
registerSecret(input.key);
|
|
62
92
|
if (flags.password)
|
|
63
93
|
registerSecret(flags.password);
|
|
64
94
|
enforceTls(input.apiUrl);
|
|
65
95
|
const anon = createApiClient({ baseUrl: input.apiUrl });
|
|
96
|
+
const confirmReplace = replaceConfirmer({ isTty: process.stdin.isTTY === true, json: this.jsonEnabled() });
|
|
66
97
|
const res = await performLogin(input, {
|
|
67
98
|
store,
|
|
68
99
|
config: cfg,
|
|
69
100
|
saveConfig,
|
|
70
101
|
validateKey: (apiKey) => anon.auth.validateKey({ apiKey }),
|
|
71
102
|
register: (req) => anon.auth.register(req),
|
|
103
|
+
signIn: (req) => anon.auth.login(req),
|
|
104
|
+
createApiKey: (req, token) => anon.apiKeys.create(req, { token }),
|
|
105
|
+
...(confirmReplace ? { confirmReplace } : {}),
|
|
72
106
|
});
|
|
73
107
|
if (this.jsonEnabled())
|
|
74
108
|
return res;
|
|
75
|
-
|
|
109
|
+
const tenant = tenantLabel({ id: res.tenantId, name: res.tenantName });
|
|
110
|
+
this.log(`✓ Logged in to profile '${res.profile}' (${res.keyType ?? 'key'})${res.tenantId || res.tenantName ? ` — tenant ${res.tenantName ?? tenant}` : ''}.`);
|
|
111
|
+
if (res.alreadyRegistered) {
|
|
112
|
+
this.log(` This profile was already registered to ${tenant}; its stored key was replaced.`);
|
|
113
|
+
}
|
|
114
|
+
if (res.createdApiKey) {
|
|
115
|
+
this.log(' A new API key was created for this machine (manage it under Settings → API keys).');
|
|
116
|
+
}
|
|
76
117
|
return res;
|
|
77
118
|
}
|
|
78
|
-
/**
|
|
119
|
+
/** Device-code SSO → minted ukz_ key, then the regular verify-and-store path. */
|
|
120
|
+
async completeSso(input, noOpen) {
|
|
121
|
+
const minted = await runCliSsoLogin(input.apiUrl, {
|
|
122
|
+
fetch: globalThis.fetch,
|
|
123
|
+
openBrowser,
|
|
124
|
+
now: Date.now,
|
|
125
|
+
sleep: (ms) => new Promise((r) => setTimeout(r, ms)),
|
|
126
|
+
emit: (line) => (this.jsonEnabled() ? this.logToStderr(line) : this.log(line)),
|
|
127
|
+
}, {
|
|
128
|
+
noOpen,
|
|
129
|
+
clientName: `Knowz CLI (${input.profile}@${hostname()})`,
|
|
130
|
+
});
|
|
131
|
+
registerSecret(minted.credential);
|
|
132
|
+
return { ...input, mode: 'paste', key: minted.credential };
|
|
133
|
+
}
|
|
134
|
+
/** Non-interactive / flag-driven input (scripts, --key-stdin, --register, --sso …). */
|
|
79
135
|
async flagLogin(flags, profile, apiUrl) {
|
|
80
136
|
enforceTls(apiUrl);
|
|
137
|
+
if (flags.sso || flags.oauth) {
|
|
138
|
+
return { profile, apiUrl, mode: 'sso', force: flags.force };
|
|
139
|
+
}
|
|
81
140
|
const mode = flags.register ? 'register' : flags['self-hosted'] ? 'self-hosted' : 'paste';
|
|
82
141
|
let key;
|
|
83
142
|
if (mode !== 'register') {
|
|
@@ -92,9 +151,22 @@ export default class Login extends BaseCommand {
|
|
|
92
151
|
key = await promptHidden('API key: ');
|
|
93
152
|
}
|
|
94
153
|
else {
|
|
95
|
-
throw new KnowzError('No API key provided. Use --key-stdin or --key.', ExitCode.Usage);
|
|
154
|
+
throw new KnowzError('No API key provided. Use --sso, --key-stdin, or --key.', ExitCode.Usage);
|
|
96
155
|
}
|
|
97
156
|
}
|
|
157
|
+
let registrationPassword;
|
|
158
|
+
if (mode === 'register') {
|
|
159
|
+
const resolved = await resolveRegistrationPassword(flags, process.env, {
|
|
160
|
+
readStdin: readStdinText,
|
|
161
|
+
isTty: process.stdin.isTTY === true,
|
|
162
|
+
prompt: () => promptHidden('Password: '),
|
|
163
|
+
});
|
|
164
|
+
registrationPassword = resolved.password;
|
|
165
|
+
if (resolved.source === 'flag') {
|
|
166
|
+
logger.warn('Passing --password on the command line can leak via shell history; prefer KNOWZ_PASSWORD or --password-stdin.');
|
|
167
|
+
}
|
|
168
|
+
registerSecret(registrationPassword);
|
|
169
|
+
}
|
|
98
170
|
return {
|
|
99
171
|
profile,
|
|
100
172
|
apiUrl,
|
|
@@ -102,38 +174,15 @@ export default class Login extends BaseCommand {
|
|
|
102
174
|
key,
|
|
103
175
|
storeTenantKey: flags['store-tenant-key'],
|
|
104
176
|
force: flags.force,
|
|
105
|
-
register: mode === 'register'
|
|
177
|
+
register: mode === 'register'
|
|
178
|
+
? {
|
|
179
|
+
name: flags.name ?? '',
|
|
180
|
+
email: flags.email ?? '',
|
|
181
|
+
password: registrationPassword,
|
|
182
|
+
ageAttested: flags['age-13-plus'],
|
|
183
|
+
}
|
|
184
|
+
: undefined,
|
|
106
185
|
};
|
|
107
186
|
}
|
|
108
|
-
/** Guided sign-in: pick a method, then collect inputs with helpful validation. */
|
|
109
|
-
async guidedLogin(profile, apiUrl) {
|
|
110
|
-
const { select, input: ask, password } = await import('@inquirer/prompts');
|
|
111
|
-
this.log(`\nSign in to Knowz · profile '${profile}' → ${apiUrl}`);
|
|
112
|
-
this.log("Don't have a key yet? Choose “Register” to create an account.\n");
|
|
113
|
-
const method = await select({
|
|
114
|
-
message: 'How do you want to sign in?',
|
|
115
|
-
choices: [
|
|
116
|
-
{ name: 'Paste an existing API key', value: 'paste', description: 'You already have a ukz_ or kz_ key' },
|
|
117
|
-
{ name: 'Register a new account', value: 'register', description: 'Create a tenant and get a key' },
|
|
118
|
-
{ name: 'Connect a self-hosted instance', value: 'self', description: 'Point at your own Knowz host' },
|
|
119
|
-
],
|
|
120
|
-
});
|
|
121
|
-
if (method === 'register') {
|
|
122
|
-
const name = (await ask({ message: 'Your name', required: true })).trim();
|
|
123
|
-
const email = (await ask({ message: 'Email', required: true })).trim();
|
|
124
|
-
const pw = (await password({ message: 'Password (optional — press enter to skip)' })).trim();
|
|
125
|
-
return { profile, apiUrl, mode: 'register', register: { name, email, password: pw || undefined } };
|
|
126
|
-
}
|
|
127
|
-
let url = apiUrl;
|
|
128
|
-
if (method === 'self') {
|
|
129
|
-
url = (await ask({ message: 'API base URL', default: apiUrl, required: true })).trim();
|
|
130
|
-
enforceTls(url); // fail fast with a clear message before asking for the key
|
|
131
|
-
}
|
|
132
|
-
const key = (await password({
|
|
133
|
-
message: 'Paste your API key (input is hidden; starts with ukz_ or kz_)',
|
|
134
|
-
validate: (v) => explainKey(v),
|
|
135
|
-
})).trim();
|
|
136
|
-
return { profile, apiUrl: url, mode: method === 'self' ? 'self-hosted' : 'paste', key };
|
|
137
|
-
}
|
|
138
187
|
}
|
|
139
188
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EACL,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAqBjD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAW;IAC7C,OAAgB,WAAW,SAC0E;IACrG,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAmBzC,8EAA8E;IAC9E,OAAO,CAAC,aAAa;CAKtB"}
|
package/dist/commands/logout.js
CHANGED
|
@@ -1,23 +1,57 @@
|
|
|
1
1
|
import { Flags } from '@oclif/core';
|
|
2
|
+
import { loadConfig, saveConfig } from '@knowzai/core';
|
|
2
3
|
import { BaseCommand } from '../base-command.js';
|
|
4
|
+
/**
|
|
5
|
+
* Drop the tenant binding a profile picked up at login. `apiUrl`, `label`,
|
|
6
|
+
* `defaultVaultId` and `pgDsn` are the user's own settings and survive — only
|
|
7
|
+
* the identity the deleted key stood for goes away, so the next `knowz login`
|
|
8
|
+
* sees a clean profile instead of refusing as "already registered" (#669).
|
|
9
|
+
*/
|
|
10
|
+
function clearTenantBinding(cfg, profiles) {
|
|
11
|
+
let changed = false;
|
|
12
|
+
for (const name of profiles) {
|
|
13
|
+
const profile = cfg.profiles[name];
|
|
14
|
+
if (!profile)
|
|
15
|
+
continue;
|
|
16
|
+
if (profile.tenantId === undefined && profile.email === undefined)
|
|
17
|
+
continue;
|
|
18
|
+
const { tenantId: _tenantId, email: _email, ...rest } = profile;
|
|
19
|
+
cfg.profiles[name] = rest;
|
|
20
|
+
changed = true;
|
|
21
|
+
}
|
|
22
|
+
return changed;
|
|
23
|
+
}
|
|
3
24
|
export default class Logout extends BaseCommand {
|
|
4
|
-
static description = 'Remove stored credentials for the active profile (or all profiles).';
|
|
25
|
+
static description = 'Remove stored credentials for the active profile (or all profiles) and clear its tenant binding.';
|
|
5
26
|
static flags = {
|
|
6
27
|
all: Flags.boolean({ description: 'Remove credentials for all profiles' }),
|
|
7
28
|
};
|
|
8
29
|
async run() {
|
|
9
30
|
const { flags } = await this.parse(Logout);
|
|
10
31
|
const auth = await this.authState(flags);
|
|
32
|
+
// The store delete comes first and is never caught: config must not claim a
|
|
33
|
+
// logout the keychain refused to perform.
|
|
11
34
|
if (flags.all) {
|
|
35
|
+
const before = await auth.store.listProfiles();
|
|
12
36
|
await auth.store.deleteAll();
|
|
37
|
+
const remaining = new Set(await auth.store.listProfiles());
|
|
38
|
+
this.forgetTenants(before.filter((profile) => !remaining.has(profile)));
|
|
13
39
|
if (!this.jsonEnabled())
|
|
14
40
|
this.log('Removed credentials for all profiles.');
|
|
15
41
|
return { removed: 'all' };
|
|
16
42
|
}
|
|
17
43
|
await auth.store.deleteSecret(auth.profile);
|
|
44
|
+
this.forgetTenants(auth.profile);
|
|
18
45
|
if (!this.jsonEnabled())
|
|
19
46
|
this.log(`Logged out of profile '${auth.profile}'.`);
|
|
20
47
|
return { removed: auth.profile };
|
|
21
48
|
}
|
|
49
|
+
/** Clear tenant bindings only for profiles whose credentials were removed. */
|
|
50
|
+
forgetTenants(profile) {
|
|
51
|
+
const cfg = loadConfig();
|
|
52
|
+
const names = Array.isArray(profile) ? profile : [profile];
|
|
53
|
+
if (clearTenantBinding(cfg, names))
|
|
54
|
+
saveConfig(cfg);
|
|
55
|
+
}
|
|
22
56
|
}
|
|
23
57
|
//# sourceMappingURL=logout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAW;IAC7C,MAAM,CAAU,WAAW,
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import { LocalMcpServer } from '../../lib/local-mcp-server.js';
|
|
3
|
+
export declare function openRepoLocalMcpServer(path: string, maxChars?: number): Promise<{
|
|
4
|
+
server: LocalMcpServer;
|
|
5
|
+
close(): Promise<void>;
|
|
6
|
+
}>;
|
|
7
|
+
export default class McpServe extends Command {
|
|
8
|
+
static id: string;
|
|
9
|
+
static description: string;
|
|
10
|
+
static flags: {
|
|
11
|
+
path: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
'max-chars': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAO7C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAG/D,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,QAAQ,SAAS,GAChB,OAAO,CAAC;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAqB7D;AAED,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,OAAgB,EAAE,SAAe;IACjC,OAAgB,WAAW,SACmE;IAC9F,OAAgB,KAAK;;;MAGnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAS3B"}
|