@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
package/dist/lib/login.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/lib/login.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/lib/login.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/login.js
CHANGED
|
@@ -1,4 +1,118 @@
|
|
|
1
|
-
import { KnowzError, ExitCode, enforceTls, validateKeyFormat, keyType, } from '@knowzai/core';
|
|
1
|
+
import { KnowzError, ExitCode, enforceTls, registerSecret, validateKeyFormat, keyType, } from '@knowzai/core';
|
|
2
|
+
import { quoteArg } from './claude-hooks.js';
|
|
3
|
+
/**
|
|
4
|
+
* 13+ attestation the API requires on new-account creation. Mirrors
|
|
5
|
+
* `AgeEligibilityCopy` on the server and `AGE_ELIGIBILITY_COPY_VERSION` in the
|
|
6
|
+
* web client — bump together when the copy changes.
|
|
7
|
+
*/
|
|
8
|
+
export const AGE_ELIGIBILITY_COPY_VERSION = 'age_eligibility.v1';
|
|
9
|
+
export const AGE_ELIGIBILITY_SURFACE = 'cli_register';
|
|
10
|
+
export const AGE_ELIGIBILITY_TEXT = 'I confirm I am at least 13 years old. Knowz is not available to people under 13.';
|
|
11
|
+
export const AGE_ELIGIBILITY_UNDER_13_MESSAGE = 'Knowz is not available to people under 13. No account was created.';
|
|
12
|
+
/** "Alex Space (0f0…)"-style label: name when the server gave us one, else the id. */
|
|
13
|
+
export function tenantLabel(ref) {
|
|
14
|
+
const name = ref?.name?.trim();
|
|
15
|
+
const id = ref?.id?.trim();
|
|
16
|
+
if (name && id)
|
|
17
|
+
return `${name} (${id})`;
|
|
18
|
+
return name || id || 'an unknown tenant';
|
|
19
|
+
}
|
|
20
|
+
/** Label the key carries in the workspace's key list, so it is recognizable there. */
|
|
21
|
+
function apiKeyName(profile) {
|
|
22
|
+
return `knowz CLI (${profile})`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Register, then obtain a real API key. Registration no longer returns one
|
|
26
|
+
* (#661: `PersonalApiKey` is documented as always null), so the CLI signs in
|
|
27
|
+
* with the password and calls `POST /api/v1/api-keys`. A legacy build that
|
|
28
|
+
* still mints keys is honored as-is — no second key is created.
|
|
29
|
+
*/
|
|
30
|
+
async function keyForRegistration(input, deps, reg) {
|
|
31
|
+
const wantTenantKey = Boolean(input.storeTenantKey);
|
|
32
|
+
const res = await deps
|
|
33
|
+
.register({
|
|
34
|
+
name: reg.name,
|
|
35
|
+
email: reg.email,
|
|
36
|
+
...(reg.password === undefined ? {} : { password: reg.password }),
|
|
37
|
+
// Only sent when the person actually attested — never auto-checked.
|
|
38
|
+
...(reg.ageAttested
|
|
39
|
+
? {
|
|
40
|
+
ageEligibilityAttested: true,
|
|
41
|
+
ageEligibilityCopyVersion: AGE_ELIGIBILITY_COPY_VERSION,
|
|
42
|
+
ageEligibilitySurface: AGE_ELIGIBILITY_SURFACE,
|
|
43
|
+
}
|
|
44
|
+
: {}),
|
|
45
|
+
})
|
|
46
|
+
.catch((e) => {
|
|
47
|
+
// The server enforces the 13+ gate; point at the flag that satisfies it.
|
|
48
|
+
const text = e instanceof Error ? e.message : String(e);
|
|
49
|
+
if (!reg.ageAttested && /at least 13|age confirmation|AGE_ELIGIBILITY/i.test(text)) {
|
|
50
|
+
throw new KnowzError(`${text} Pass --age-13-plus to confirm.`, ExitCode.Usage);
|
|
51
|
+
}
|
|
52
|
+
throw e;
|
|
53
|
+
});
|
|
54
|
+
const legacy = wantTenantKey ? res.apiKey : res.userApiKey;
|
|
55
|
+
if (legacy && validateKeyFormat(legacy.trim()).ok) {
|
|
56
|
+
return { key: legacy.trim(), created: false, tenantId: res.tenantId, userId: res.userId };
|
|
57
|
+
}
|
|
58
|
+
// No usable key in the response → sign in (or reuse a token the register
|
|
59
|
+
// endpoint issued) and create one explicitly.
|
|
60
|
+
let token = res.token;
|
|
61
|
+
let tenantId = res.tenantId;
|
|
62
|
+
let userId = res.userId;
|
|
63
|
+
if (!token) {
|
|
64
|
+
if (!reg.password) {
|
|
65
|
+
throw new KnowzError('Registration does not return an API key any more; the CLI has to sign in and create one. ' +
|
|
66
|
+
'Re-run with --password (it is also the password for the web app).', ExitCode.Usage);
|
|
67
|
+
}
|
|
68
|
+
const session = await deps.signIn({ usernameOrEmail: reg.email, password: reg.password });
|
|
69
|
+
token = session.token;
|
|
70
|
+
tenantId = session.tenantId || tenantId;
|
|
71
|
+
userId = session.userId ?? userId;
|
|
72
|
+
}
|
|
73
|
+
registerSecret(token);
|
|
74
|
+
const wanted = wantTenantKey ? 'tenant' : 'user';
|
|
75
|
+
const created = await deps.createApiKey({ name: apiKeyName(input.profile), keyType: wanted }, token);
|
|
76
|
+
const key = created.key?.trim();
|
|
77
|
+
if (!key) {
|
|
78
|
+
throw new KnowzError('Creating an API key after registration failed: the server returned no key.', ExitCode.Auth);
|
|
79
|
+
}
|
|
80
|
+
const fmt = validateKeyFormat(key);
|
|
81
|
+
if (!fmt.ok) {
|
|
82
|
+
throw new KnowzError(`Creating an API key after registration failed: ${fmt.reason}`, ExitCode.Auth);
|
|
83
|
+
}
|
|
84
|
+
return { key, created: true, tenantId, userId };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Best-effort display name for the tenant a profile is already bound to. The
|
|
88
|
+
* stored key is the only thing that knows it, so we re-validate it — but a
|
|
89
|
+
* revoked/offline key must not turn an explanatory message into a failure, so
|
|
90
|
+
* every error degrades to "no name" and the caller falls back to the id.
|
|
91
|
+
*/
|
|
92
|
+
async function storedTenantName(storedKey, storedTenantId, deps) {
|
|
93
|
+
try {
|
|
94
|
+
const v = await deps.validateKey(storedKey);
|
|
95
|
+
if (!v.isValid)
|
|
96
|
+
return undefined;
|
|
97
|
+
// Guard against a stale binding: only trust the name if it is this tenant.
|
|
98
|
+
if (storedTenantId && v.tenant?.id && v.tenant.id !== storedTenantId)
|
|
99
|
+
return undefined;
|
|
100
|
+
return v.tenant?.name;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function sameApiUrl(left, right) {
|
|
107
|
+
if (!left)
|
|
108
|
+
return false;
|
|
109
|
+
try {
|
|
110
|
+
return new URL(left).href.replace(/\/+$/u, '') === new URL(right).href.replace(/\/+$/u, '');
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
2
116
|
/**
|
|
3
117
|
* Verify-on-login, persist-after-verify (S-N3-6). Never returns or logs the key.
|
|
4
118
|
* Throws KnowzError(Auth) on rejected credentials, KnowzError(Usage) on bad
|
|
@@ -9,14 +123,22 @@ export async function performLogin(input, deps) {
|
|
|
9
123
|
let key;
|
|
10
124
|
let verify;
|
|
11
125
|
let email;
|
|
126
|
+
let createdApiKey = false;
|
|
127
|
+
if (input.mode === 'sso') {
|
|
128
|
+
throw new KnowzError('SSO login must mint a key before persist', ExitCode.Usage);
|
|
129
|
+
}
|
|
12
130
|
if (input.mode === 'register') {
|
|
13
131
|
if (!input.register?.email || !input.register?.name) {
|
|
14
132
|
throw new KnowzError('register requires --email and --name', ExitCode.Usage);
|
|
15
133
|
}
|
|
16
|
-
const
|
|
17
|
-
key =
|
|
134
|
+
const reg = await keyForRegistration(input, deps, input.register);
|
|
135
|
+
key = reg.key;
|
|
136
|
+
createdApiKey = reg.created;
|
|
18
137
|
email = input.register.email;
|
|
19
|
-
|
|
138
|
+
// The key was just issued by an authenticated call, so it needs no second
|
|
139
|
+
// round-trip to validate — re-verifying would also fail on a tenant that
|
|
140
|
+
// starts in the Pending activation state.
|
|
141
|
+
verify = { isValid: true, tenant: { id: reg.tenantId ?? '' }, user: { id: reg.userId ?? '', email } };
|
|
20
142
|
}
|
|
21
143
|
else {
|
|
22
144
|
if (!input.key)
|
|
@@ -31,26 +153,62 @@ export async function performLogin(input, deps) {
|
|
|
31
153
|
}
|
|
32
154
|
email = verify.user?.email;
|
|
33
155
|
}
|
|
34
|
-
|
|
156
|
+
registerSecret(key);
|
|
157
|
+
// Already-registered guard (S-N3-6, #669). A profile that already holds a key
|
|
158
|
+
// is never silently re-pointed: a different tenant is refused without --force,
|
|
159
|
+
// and even a same-tenant rotation asks first when there is someone to ask.
|
|
35
160
|
const existing = await deps.store.getSecret(input.profile);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
161
|
+
const existingTenantId = deps.config.profiles[input.profile]?.tenantId;
|
|
162
|
+
const incoming = { id: verify.tenant?.id, name: verify.tenant?.name };
|
|
163
|
+
const sameTenant = Boolean(existing && existingTenantId && incoming.id && existingTenantId === incoming.id);
|
|
164
|
+
const differentTenant = Boolean(existing && existingTenantId && incoming.id && existingTenantId !== incoming.id);
|
|
165
|
+
// Without a prompt, a same-tenant rotation needs no decision and no explanation,
|
|
166
|
+
// so it must not pay for the extra round-trip the tenant name costs.
|
|
167
|
+
const needsDecision = !input.force && (sameTenant || differentTenant) && (Boolean(deps.confirmReplace) || differentTenant);
|
|
168
|
+
if (needsDecision) {
|
|
169
|
+
// Only now is a name worth a round-trip: we are about to talk to a human.
|
|
170
|
+
const storedApiUrl = deps.config.profiles[input.profile]?.apiUrl;
|
|
171
|
+
const current = {
|
|
172
|
+
id: existingTenantId,
|
|
173
|
+
name: sameApiUrl(storedApiUrl, input.apiUrl)
|
|
174
|
+
? await storedTenantName(existing, existingTenantId, deps)
|
|
175
|
+
: undefined,
|
|
176
|
+
};
|
|
177
|
+
const ctx = { profile: input.profile, sameTenant, current, incoming };
|
|
178
|
+
const confirmed = deps.confirmReplace
|
|
179
|
+
? await deps.confirmReplace(ctx)
|
|
180
|
+
: // No prompt available: rotating the same tenant's key is safe, moving the
|
|
181
|
+
// profile to another tenant is not.
|
|
182
|
+
sameTenant;
|
|
183
|
+
if (!confirmed) {
|
|
184
|
+
const quotedProfile = quoteArg(input.profile);
|
|
185
|
+
throw new KnowzError(differentTenant
|
|
186
|
+
? `Profile '${input.profile}' is already registered to tenant ${tenantLabel(current)}. ` +
|
|
187
|
+
`The key you provided belongs to tenant ${tenantLabel(incoming)}. ` +
|
|
188
|
+
`Nothing was changed. To replace it, re-run: knowz login --profile ${quotedProfile} --force`
|
|
189
|
+
: `Profile '${input.profile}' is already registered to tenant ${tenantLabel(current)}. ` +
|
|
190
|
+
`The stored key was left unchanged. To replace it, re-run: knowz login --profile ${quotedProfile} --force`, ExitCode.Usage);
|
|
41
191
|
}
|
|
42
192
|
}
|
|
43
193
|
await deps.store.setSecret(input.profile, key);
|
|
44
194
|
const prev = deps.config.profiles[input.profile];
|
|
45
195
|
deps.config.profiles[input.profile] = {
|
|
46
196
|
apiUrl: input.apiUrl,
|
|
47
|
-
tenantId: verify.tenant?.id
|
|
197
|
+
tenantId: verify.tenant?.id || prev?.tenantId,
|
|
48
198
|
email: email ?? prev?.email,
|
|
49
199
|
label: prev?.label,
|
|
50
200
|
defaultVaultId: prev?.defaultVaultId,
|
|
51
201
|
};
|
|
52
202
|
deps.config.activeProfile = input.profile;
|
|
53
203
|
deps.saveConfig(deps.config);
|
|
54
|
-
return {
|
|
204
|
+
return {
|
|
205
|
+
profile: input.profile,
|
|
206
|
+
keyType: keyType(key),
|
|
207
|
+
tenantId: verify.tenant?.id || undefined,
|
|
208
|
+
...(verify.tenant?.name ? { tenantName: verify.tenant.name } : {}),
|
|
209
|
+
email,
|
|
210
|
+
...(createdApiKey ? { createdApiKey: true } : {}),
|
|
211
|
+
...(sameTenant ? { alreadyRegistered: true } : {}),
|
|
212
|
+
};
|
|
55
213
|
}
|
|
56
214
|
//# sourceMappingURL=login.js.map
|
package/dist/lib/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/lib/login.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,OAAO,GAIR,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/lib/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* First-run onboarding + the client-side auth gate.
|
|
3
|
+
*
|
|
4
|
+
* Two problems this module owns:
|
|
5
|
+
*
|
|
6
|
+
* 1. A freshly installed CLI had no idea whether you were signed in. Every
|
|
7
|
+
* cloud command built an *anonymous* api-client, fired the request, and let
|
|
8
|
+
* the server answer 401. That is a slow, confusing "it let me do it and
|
|
9
|
+
* then it didn't" experience — and in an interactive terminal there was
|
|
10
|
+
* nothing telling the user that `knowz login` even exists.
|
|
11
|
+
* 2. Nothing ever offered to sign you in. Login was buried at
|
|
12
|
+
* Settings → Authentication → Log in.
|
|
13
|
+
*
|
|
14
|
+
* The decision logic lives here as pure functions so it is unit-testable
|
|
15
|
+
* without a TTY, a keychain, or a network. `base-command.ts` and `menu.ts` are
|
|
16
|
+
* the only IO shells that consume it.
|
|
17
|
+
*/
|
|
18
|
+
/** Everything the gate needs to know about the current invocation. */
|
|
19
|
+
export interface AuthGateContext {
|
|
20
|
+
/** A credential is present for the resolved profile. */
|
|
21
|
+
authenticated: boolean;
|
|
22
|
+
/** Both stdin and stdout are TTYs — we may prompt. */
|
|
23
|
+
interactive: boolean;
|
|
24
|
+
/** `--json` was passed: output must stay a single machine-readable document. */
|
|
25
|
+
jsonMode: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* What a command needing the cloud API should do.
|
|
29
|
+
* - `proceed` — a credential exists, carry on.
|
|
30
|
+
* - `prompt` — interactive human terminal: offer guided login inline, then retry.
|
|
31
|
+
* - `fail` — script/CI/`--json`: never block on stdin, fail fast with exit 3.
|
|
32
|
+
*/
|
|
33
|
+
export type AuthGateDecision = 'proceed' | 'prompt' | 'fail';
|
|
34
|
+
export declare function decideAuthGate(ctx: AuthGateContext): AuthGateDecision;
|
|
35
|
+
/** True when both standard streams are a terminal, i.e. a human is watching. */
|
|
36
|
+
export declare function isInteractiveTty(streams?: {
|
|
37
|
+
stdin?: unknown;
|
|
38
|
+
stdout?: unknown;
|
|
39
|
+
}): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* The message shown when we cannot (or must not) prompt. It names the profile
|
|
42
|
+
* and backend deliberately: the single most common support question is "why is
|
|
43
|
+
* my data missing", and the answer is almost always that the CLI is pointed at
|
|
44
|
+
* a different estate than the user assumed.
|
|
45
|
+
*/
|
|
46
|
+
export declare function notAuthenticatedMessage(profile: string, apiUrl: string): string;
|
|
47
|
+
/** The inline offer shown in an interactive terminal before the guided login. */
|
|
48
|
+
export declare function loginInvitation(profile: string, apiUrl: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Whether the interactive shell should open onboarding instead of the normal
|
|
51
|
+
* menu. Kept separate from `decideAuthGate` because the menu tolerates an
|
|
52
|
+
* anonymous session (you must be able to reach "Log in" without being logged
|
|
53
|
+
* in) — it just shouldn't *start* there silently on a fresh install.
|
|
54
|
+
*/
|
|
55
|
+
export declare function shouldOnboard(ctx: AuthGateContext): boolean;
|
|
56
|
+
//# sourceMappingURL=onboarding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,aAAa,EAAE,OAAO,CAAC;IACvB,sDAAsD;IACtD,WAAW,EAAE,OAAO,CAAC;IACrB,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE7D,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,gBAAgB,CAIrE;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAY,GAAG,OAAO,CAGlG;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAW/E;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQvE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAE3D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* First-run onboarding + the client-side auth gate.
|
|
3
|
+
*
|
|
4
|
+
* Two problems this module owns:
|
|
5
|
+
*
|
|
6
|
+
* 1. A freshly installed CLI had no idea whether you were signed in. Every
|
|
7
|
+
* cloud command built an *anonymous* api-client, fired the request, and let
|
|
8
|
+
* the server answer 401. That is a slow, confusing "it let me do it and
|
|
9
|
+
* then it didn't" experience — and in an interactive terminal there was
|
|
10
|
+
* nothing telling the user that `knowz login` even exists.
|
|
11
|
+
* 2. Nothing ever offered to sign you in. Login was buried at
|
|
12
|
+
* Settings → Authentication → Log in.
|
|
13
|
+
*
|
|
14
|
+
* The decision logic lives here as pure functions so it is unit-testable
|
|
15
|
+
* without a TTY, a keychain, or a network. `base-command.ts` and `menu.ts` are
|
|
16
|
+
* the only IO shells that consume it.
|
|
17
|
+
*/
|
|
18
|
+
export function decideAuthGate(ctx) {
|
|
19
|
+
if (ctx.authenticated)
|
|
20
|
+
return 'proceed';
|
|
21
|
+
if (ctx.jsonMode || !ctx.interactive)
|
|
22
|
+
return 'fail';
|
|
23
|
+
return 'prompt';
|
|
24
|
+
}
|
|
25
|
+
/** True when both standard streams are a terminal, i.e. a human is watching. */
|
|
26
|
+
export function isInteractiveTty(streams = process) {
|
|
27
|
+
const s = streams;
|
|
28
|
+
return Boolean(s.stdin?.isTTY) && Boolean(s.stdout?.isTTY);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The message shown when we cannot (or must not) prompt. It names the profile
|
|
32
|
+
* and backend deliberately: the single most common support question is "why is
|
|
33
|
+
* my data missing", and the answer is almost always that the CLI is pointed at
|
|
34
|
+
* a different estate than the user assumed.
|
|
35
|
+
*/
|
|
36
|
+
export function notAuthenticatedMessage(profile, apiUrl) {
|
|
37
|
+
let host = apiUrl;
|
|
38
|
+
try {
|
|
39
|
+
host = new URL(apiUrl).host;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
/* keep the raw string when it isn't a URL */
|
|
43
|
+
}
|
|
44
|
+
return (`Not signed in — profile '${profile}' (${host}) has no stored API key. ` +
|
|
45
|
+
`Run \`knowz login\` to sign in, register, or connect a self-hosted instance.`);
|
|
46
|
+
}
|
|
47
|
+
/** The inline offer shown in an interactive terminal before the guided login. */
|
|
48
|
+
export function loginInvitation(profile, apiUrl) {
|
|
49
|
+
let host = apiUrl;
|
|
50
|
+
try {
|
|
51
|
+
host = new URL(apiUrl).host;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
/* keep the raw string when it isn't a URL */
|
|
55
|
+
}
|
|
56
|
+
return `You're not signed in yet (profile '${profile}' → ${host}). Let's fix that.`;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Whether the interactive shell should open onboarding instead of the normal
|
|
60
|
+
* menu. Kept separate from `decideAuthGate` because the menu tolerates an
|
|
61
|
+
* anonymous session (you must be able to reach "Log in" without being logged
|
|
62
|
+
* in) — it just shouldn't *start* there silently on a fresh install.
|
|
63
|
+
*/
|
|
64
|
+
export function shouldOnboard(ctx) {
|
|
65
|
+
return !ctx.authenticated && ctx.interactive && !ctx.jsonMode;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/lib/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAoBH,MAAM,UAAU,cAAc,CAAC,GAAoB;IACjD,IAAI,GAAG,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,MAAM,CAAC;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,UAAiD,OAAO;IACvF,MAAM,CAAC,GAAG,OAAwE,CAAC;IACnF,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,MAAc;IACrE,IAAI,IAAI,GAAG,MAAM,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IACD,OAAO,CACL,4BAA4B,OAAO,MAAM,IAAI,2BAA2B;QACxE,8EAA8E,CAC/E,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,MAAc;IAC7D,IAAI,IAAI,GAAG,MAAM,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IACD,OAAO,sCAAsC,OAAO,OAAO,IAAI,oBAAoB,CAAC;AACtF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAoB;IAChD,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type KnowzApiClient, type FederationPeer, type FederationSyncOptionsInput } from '@knowzai/api-client';
|
|
2
|
+
import { BaseCommand, type GlobalFlags } from '../base-command.js';
|
|
3
|
+
export interface PeerGlobalFlags extends GlobalFlags {
|
|
4
|
+
email?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Shared shell for every `knowz peer` command (CLI_InstanceTransfer R8):
|
|
8
|
+
* builds a per-invocation Bearer-token client via `users/login` — the
|
|
9
|
+
* federation plane is JWT-only, the stored API key cannot reach it — and
|
|
10
|
+
* decorates federation refusals with actionable hints (R10). The credential
|
|
11
|
+
* store keeps holding ONLY the API key; the password/token never persist.
|
|
12
|
+
*/
|
|
13
|
+
export declare abstract class PeerCommand extends BaseCommand {
|
|
14
|
+
static readonly peerAuthFlags: {
|
|
15
|
+
email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
};
|
|
17
|
+
protected peerInteractive(): boolean;
|
|
18
|
+
/** Bearer-token client for the active profile (R8). */
|
|
19
|
+
protected peerApiClient(flags: PeerGlobalFlags): Promise<KnowzApiClient>;
|
|
20
|
+
/** Attach the R10 follow-up hint to federation refusals, then rethrow. */
|
|
21
|
+
protected withFederationHints<T>(fn: () => Promise<T>): Promise<T>;
|
|
22
|
+
/** Resolve `<peerRef>` (GUID or slug) to the peer row. */
|
|
23
|
+
protected resolvePeer(client: KnowzApiClient, ref: string): Promise<FederationPeer>;
|
|
24
|
+
/** Source + preflight the peer credential (R9). */
|
|
25
|
+
protected resolveKeyInput(keyFlag: string | undefined): Promise<string>;
|
|
26
|
+
/** Compact human rendering for a peer row. */
|
|
27
|
+
protected describePeer(peer: FederationPeer): string;
|
|
28
|
+
/**
|
|
29
|
+
* Shared `peer pull` / `peer push` body (R12): 202 + runId; `--wait` polls
|
|
30
|
+
* every 2 s to a terminal status; exit 0 ONLY on Succeeded/NoOp — the server
|
|
31
|
+
* status is trusted, never re-interpreted.
|
|
32
|
+
*/
|
|
33
|
+
protected enqueueSyncRun(direction: 'pull' | 'push', input: {
|
|
34
|
+
client: KnowzApiClient;
|
|
35
|
+
peerRef: string;
|
|
36
|
+
vaultLinkId: string;
|
|
37
|
+
options: FederationSyncOptionsInput;
|
|
38
|
+
wait: boolean;
|
|
39
|
+
timeoutSeconds: number;
|
|
40
|
+
}): Promise<unknown>;
|
|
41
|
+
}
|
|
42
|
+
/** Flag set shared by `peer pull` and `peer push`. */
|
|
43
|
+
export declare const syncRunFlags: {
|
|
44
|
+
link: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
45
|
+
since: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
46
|
+
'skip-re-enrichment': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
47
|
+
'max-file-mb': import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
48
|
+
wait: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
49
|
+
timeout: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=peer-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-command.d.ts","sourceRoot":"","sources":["../../src/lib/peer-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,0BAA0B,EAChC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAanE,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,8BAAsB,WAAY,SAAQ,WAAW;IACnD,MAAM,CAAC,QAAQ,CAAC,aAAa;;MAI3B;IAEF,SAAS,CAAC,eAAe,IAAI,OAAO;IAIpC,uDAAuD;cACvC,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAuB9E,0EAA0E;cAC1D,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAUxE,0DAA0D;IAC1D,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAInF,mDAAmD;IACnD,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAUvE,8CAA8C;IAC9C,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IAMpD;;;;OAIG;cACa,cAAc,CAC5B,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,KAAK,EAAE;QACL,MAAM,EAAE,cAAc,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,0BAA0B,CAAC;QACpC,IAAI,EAAE,OAAO,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;KACxB,GACA,OAAO,CAAC,OAAO,CAAC;CA4BpB;AAED,sDAAsD;AACtD,eAAO,MAAM,YAAY;;;;;;;CAOxB,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { enforceTls } from '@knowzai/core';
|
|
3
|
+
import { createApiClient, } from '@knowzai/api-client';
|
|
4
|
+
import { BaseCommand } from '../base-command.js';
|
|
5
|
+
import { isInteractiveTty } from './onboarding.js';
|
|
6
|
+
import { promptHidden } from './prompt.js';
|
|
7
|
+
import { acquirePeerBearer, describeFederationError, resolvePeerByRef, resolvePeerKey, runExitOk, runStatusName, waitForRun, } from './peer-support.js';
|
|
8
|
+
/**
|
|
9
|
+
* Shared shell for every `knowz peer` command (CLI_InstanceTransfer R8):
|
|
10
|
+
* builds a per-invocation Bearer-token client via `users/login` — the
|
|
11
|
+
* federation plane is JWT-only, the stored API key cannot reach it — and
|
|
12
|
+
* decorates federation refusals with actionable hints (R10). The credential
|
|
13
|
+
* store keeps holding ONLY the API key; the password/token never persist.
|
|
14
|
+
*/
|
|
15
|
+
export class PeerCommand extends BaseCommand {
|
|
16
|
+
static peerAuthFlags = {
|
|
17
|
+
email: Flags.string({
|
|
18
|
+
description: 'Account email for the JWT sign-in (defaults to the profile email)',
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
peerInteractive() {
|
|
22
|
+
return isInteractiveTty() && !this.jsonEnabled();
|
|
23
|
+
}
|
|
24
|
+
/** Bearer-token client for the active profile (R8). */
|
|
25
|
+
async peerApiClient(flags) {
|
|
26
|
+
const auth = await this.authState(flags);
|
|
27
|
+
enforceTls(auth.apiUrl);
|
|
28
|
+
const summary = await auth.summary();
|
|
29
|
+
const anonymous = createApiClient({ baseUrl: auth.apiUrl });
|
|
30
|
+
const token = await acquirePeerBearer({
|
|
31
|
+
profileEmail: summary.email,
|
|
32
|
+
emailFlag: flags.email,
|
|
33
|
+
interactive: this.peerInteractive(),
|
|
34
|
+
env: process.env,
|
|
35
|
+
login: (creds) => anonymous.auth.login(creds),
|
|
36
|
+
promptPassword: (message) => promptHidden(`${message}: `),
|
|
37
|
+
promptEmail: async (message) => {
|
|
38
|
+
const { input } = await import('@inquirer/prompts');
|
|
39
|
+
return input({ message });
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
return createApiClient({
|
|
43
|
+
baseUrl: auth.apiUrl,
|
|
44
|
+
auth: () => ({ header: 'Authorization', value: `Bearer ${token}` }),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** Attach the R10 follow-up hint to federation refusals, then rethrow. */
|
|
48
|
+
async withFederationHints(fn) {
|
|
49
|
+
try {
|
|
50
|
+
return await fn();
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
const hint = describeFederationError(e);
|
|
54
|
+
if (hint)
|
|
55
|
+
process.stderr.write(`→ ${hint}\n`);
|
|
56
|
+
throw e;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Resolve `<peerRef>` (GUID or slug) to the peer row. */
|
|
60
|
+
resolvePeer(client, ref) {
|
|
61
|
+
return this.withFederationHints(() => resolvePeerByRef(client.federation, ref));
|
|
62
|
+
}
|
|
63
|
+
/** Source + preflight the peer credential (R9). */
|
|
64
|
+
resolveKeyInput(keyFlag) {
|
|
65
|
+
return resolvePeerKey({
|
|
66
|
+
keyFlag,
|
|
67
|
+
interactive: this.peerInteractive(),
|
|
68
|
+
env: process.env,
|
|
69
|
+
warn: (m) => process.stderr.write(`Warning: ${m}\n`),
|
|
70
|
+
promptSecret: (message) => promptHidden(`${message}: `),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/** Compact human rendering for a peer row. */
|
|
74
|
+
describePeer(peer) {
|
|
75
|
+
const state = peer.isEnabled ? 'enabled' : 'DISABLED';
|
|
76
|
+
const tested = peer.lastTestStatus ? `, last test: ${peer.lastTestStatus}` : '';
|
|
77
|
+
return `${peer.slug} (${peer.id}) → ${peer.baseUrl} [${state}${tested}]`;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Shared `peer pull` / `peer push` body (R12): 202 + runId; `--wait` polls
|
|
81
|
+
* every 2 s to a terminal status; exit 0 ONLY on Succeeded/NoOp — the server
|
|
82
|
+
* status is trusted, never re-interpreted.
|
|
83
|
+
*/
|
|
84
|
+
async enqueueSyncRun(direction, input) {
|
|
85
|
+
const peer = await this.resolvePeer(input.client, input.peerRef);
|
|
86
|
+
const enqueue = await this.withFederationHints(() => input.client.federation[direction](peer.id, { vaultLinkId: input.vaultLinkId, options: input.options }));
|
|
87
|
+
if (!this.jsonEnabled())
|
|
88
|
+
this.log(`Run ${enqueue.runId} queued (${direction}).`);
|
|
89
|
+
if (!input.wait)
|
|
90
|
+
return enqueue;
|
|
91
|
+
const detail = await waitForRun(async () => {
|
|
92
|
+
const d = await input.client.federation.getRun(peer.id, enqueue.runId);
|
|
93
|
+
const summary = (d.summary ?? d);
|
|
94
|
+
return { ...d, status: summary.status };
|
|
95
|
+
}, { intervalMs: 2000, timeoutMs: input.timeoutSeconds * 1000 });
|
|
96
|
+
const summary = (detail.summary ?? detail);
|
|
97
|
+
const status = summary.status;
|
|
98
|
+
if (!this.jsonEnabled()) {
|
|
99
|
+
this.log(`Run ${enqueue.runId}: ${runStatusName(status)}`);
|
|
100
|
+
if (summary.itemsSucceeded !== undefined || summary.itemsFailed !== undefined) {
|
|
101
|
+
this.log(`Items: ${Number(summary.itemsSucceeded ?? 0)} succeeded, ${Number(summary.itemsFailed ?? 0)} failed`);
|
|
102
|
+
}
|
|
103
|
+
if (detail.lastError)
|
|
104
|
+
this.log(`Last error: ${String(detail.lastError)}`);
|
|
105
|
+
}
|
|
106
|
+
if (!runExitOk(status))
|
|
107
|
+
process.exitCode = 1;
|
|
108
|
+
return detail;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** Flag set shared by `peer pull` and `peer push`. */
|
|
112
|
+
export const syncRunFlags = {
|
|
113
|
+
link: Flags.string({ required: true, description: 'Vault link id' }),
|
|
114
|
+
since: Flags.string({ description: 'Only items changed since this ISO-8601 timestamp' }),
|
|
115
|
+
'skip-re-enrichment': Flags.boolean({ description: 'Skip AI re-enrichment of transferred items' }),
|
|
116
|
+
'max-file-mb': Flags.integer({ description: 'Skip files larger than this many MB' }),
|
|
117
|
+
wait: Flags.boolean({ description: 'Poll until the run reaches a terminal status' }),
|
|
118
|
+
timeout: Flags.integer({ default: 600, description: 'Seconds to wait with --wait (default 600)' }),
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=peer-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-command.js","sourceRoot":"","sources":["../../src/lib/peer-command.ts"],"names":[],"mappings":"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"}
|