@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
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { SqliteStore } from '@knowzai/local-store/local-only';
|
|
3
|
+
import { findRepoBinding, resolveConfinedRepoPath, resolveRepoPath } from '../../lib/repo-binding.js';
|
|
4
|
+
import { requireRepoBinding } from '../../lib/repo-command-support.js';
|
|
5
|
+
import { assertRepoScopeReady } from '../../lib/repo-scope.js';
|
|
6
|
+
import { createRepoLocalMcpRuntime } from '../../lib/repo-local-mcp-runtime.js';
|
|
7
|
+
import { RepoLocalMcpBackend } from '../../lib/repo-local-mcp-backend.js';
|
|
8
|
+
import { LocalMcpServer } from '../../lib/local-mcp-server.js';
|
|
9
|
+
import { runLocalMcpStdio } from '../../lib/local-mcp-stdio.js';
|
|
10
|
+
export async function openRepoLocalMcpServer(path, maxChars = 16_000) {
|
|
11
|
+
const binding = requireRepoBinding(findRepoBinding(path));
|
|
12
|
+
const dbPath = resolveRepoPath(binding, binding.dbPath);
|
|
13
|
+
// SQLite may open these adjacent files. Validate each binding-derived name
|
|
14
|
+
// before the native driver gets an opportunity to follow it.
|
|
15
|
+
resolveConfinedRepoPath(binding.repoRoot, `${binding.dbPath}-wal`, { allowMissingLeaf: true });
|
|
16
|
+
resolveConfinedRepoPath(binding.repoRoot, `${binding.dbPath}-shm`, { allowMissingLeaf: true });
|
|
17
|
+
const store = new SqliteStore(dbPath);
|
|
18
|
+
try {
|
|
19
|
+
await store.init();
|
|
20
|
+
await assertRepoScopeReady(store, binding);
|
|
21
|
+
const backend = new RepoLocalMcpBackend(binding, store, createRepoLocalMcpRuntime());
|
|
22
|
+
return {
|
|
23
|
+
server: new LocalMcpServer(backend, { maxChars }),
|
|
24
|
+
close: () => store.close(),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
await store.close();
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export default class McpServe extends Command {
|
|
33
|
+
static id = 'mcp:serve';
|
|
34
|
+
static description = 'Serve the bound working-tree index over local-only stdio MCP. Never performs network I/O.';
|
|
35
|
+
static flags = {
|
|
36
|
+
path: Flags.string({ description: 'Repository path or nested path', default: '.' }),
|
|
37
|
+
'max-chars': Flags.integer({ description: 'Maximum UTF-16 characters in a tool result', default: 16_000, min: 256 }),
|
|
38
|
+
};
|
|
39
|
+
async run() {
|
|
40
|
+
const { flags } = await this.parse(McpServe);
|
|
41
|
+
const opened = await openRepoLocalMcpServer(flags.path, flags['max-chars']);
|
|
42
|
+
try {
|
|
43
|
+
await runLocalMcpStdio(opened.server);
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
await opened.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/mcp/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACtG,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAY,EACZ,QAAQ,GAAG,MAAM;IAEjB,MAAM,OAAO,GAAG,kBAAkB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,2EAA2E;IAC3E,6DAA6D;IAC7D,uBAAuB,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/F,uBAAuB,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/F,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACrF,OAAO;YACL,MAAM,EAAE,IAAI,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC;YACjD,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE;SAC3B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,MAAM,CAAU,EAAE,GAAG,WAAW,CAAC;IACjC,MAAM,CAAU,WAAW,GACzB,2FAA2F,CAAC;IAC9F,MAAM,CAAU,KAAK,GAAG;QACtB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QACnF,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,4CAA4C,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;KACrH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/commands/menu.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/commands/menu.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW;IAC3C,OAAgB,WAAW,SAC+E;IAC1G,OAAgB,QAAQ,WAA4F;IACpH,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAmF3B"}
|
package/dist/commands/menu.js
CHANGED
|
@@ -3,6 +3,7 @@ import { loadConfig, resolveProfileName, resolveApiUrl, getUiFrontend } from '@k
|
|
|
3
3
|
import * as ui from '../lib/ui.js';
|
|
4
4
|
import { BaseCommand } from '../base-command.js';
|
|
5
5
|
import { resolveFrontend } from '../menu/frontends.js';
|
|
6
|
+
import { isInteractiveTty, shouldOnboard, loginInvitation } from '../lib/onboarding.js';
|
|
6
7
|
export default class Menu extends BaseCommand {
|
|
7
8
|
static description = 'Interactive menu — browse and run every knowz operation (this is what `knowz` with no command opens).';
|
|
8
9
|
static examples = ['<%= config.bin %>', '<%= config.bin %> menu', '<%= config.bin %> menu --frontend tui'];
|
|
@@ -28,7 +29,14 @@ export default class Menu extends BaseCommand {
|
|
|
28
29
|
};
|
|
29
30
|
const loadStats = async () => {
|
|
30
31
|
try {
|
|
31
|
-
|
|
32
|
+
// Signed out, this call can only 401 — and it is awaited behind a
|
|
33
|
+
// spinner before the menu paints. Skip it so the screen the user needs
|
|
34
|
+
// (the one with "Sign in to Knowz" on it) appears immediately.
|
|
35
|
+
if (!(await (await this.authState(flags)).isAuthenticated())) {
|
|
36
|
+
connected = false;
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
const client = await this.apiClient(flags, { allowAnonymous: true });
|
|
32
40
|
const stats = await client.stats.get();
|
|
33
41
|
connected = true;
|
|
34
42
|
return stats;
|
|
@@ -38,13 +46,41 @@ export default class Menu extends BaseCommand {
|
|
|
38
46
|
return undefined;
|
|
39
47
|
}
|
|
40
48
|
};
|
|
41
|
-
|
|
49
|
+
// First-run onboarding: a brand-new install has no credential, and every
|
|
50
|
+
// menu entry below needs one. Offer guided sign-in BEFORE the menu opens
|
|
51
|
+
// rather than letting the user pick an action that can only 401.
|
|
52
|
+
const auth = await this.authState(flags);
|
|
53
|
+
if (shouldOnboard({
|
|
54
|
+
authenticated: await auth.isAuthenticated(),
|
|
55
|
+
interactive: isInteractiveTty(),
|
|
56
|
+
jsonMode: this.jsonEnabled(),
|
|
57
|
+
})) {
|
|
58
|
+
console.log(ui.warn(loginInvitation(auth.profile, auth.apiUrl)));
|
|
59
|
+
console.log('');
|
|
60
|
+
try {
|
|
61
|
+
await this.config.runCommand('login', flags.profile ? ['--profile', flags.profile] : []);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Declining or failing sign-in still opens the menu — "Sign in to Knowz"
|
|
65
|
+
// is waiting at the top of it, and offline/local actions still work.
|
|
66
|
+
console.log(ui.warn('Continuing signed out — pick "Sign in to Knowz" when you\'re ready.'));
|
|
67
|
+
}
|
|
68
|
+
console.log('');
|
|
69
|
+
}
|
|
70
|
+
const client = await this.apiClient(flags, { allowAnonymous: true });
|
|
42
71
|
const { frontend, fellBack, requested } = resolveFrontend(flags.frontend, process.env, getUiFrontend(loadConfig()));
|
|
43
72
|
if (fellBack) {
|
|
44
73
|
console.log(ui.warn(`The '${requested}' interface isn't available yet — opening the classic menu. ` +
|
|
45
74
|
`(It'll light up here once the Ink TUI ships.)`));
|
|
46
75
|
}
|
|
47
|
-
await frontend.run({
|
|
76
|
+
await frontend.run({
|
|
77
|
+
config: this.config,
|
|
78
|
+
version: this.config.version,
|
|
79
|
+
identity,
|
|
80
|
+
loadStats,
|
|
81
|
+
client,
|
|
82
|
+
isAuthenticated: async () => (await this.authState(flags)).isAuthenticated(),
|
|
83
|
+
});
|
|
48
84
|
}
|
|
49
85
|
}
|
|
50
86
|
//# sourceMappingURL=menu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/commands/menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7F,OAAO,KAAK,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/commands/menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
2
|
+
/**
|
|
3
|
+
* R11 — accepting a NEW fingerprint changes the trusted identity of the remote
|
|
4
|
+
* instance. Owner-grade TOFU decisions are interactive by design: typed
|
|
5
|
+
* confirmation (the peer slug), NO --yes bypass, non-TTY runs refused.
|
|
6
|
+
*/
|
|
7
|
+
export default class PeerAcceptFingerprint extends PeerCommand {
|
|
8
|
+
static description: string;
|
|
9
|
+
static args: {
|
|
10
|
+
peerRef: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
11
|
+
};
|
|
12
|
+
static flags: {
|
|
13
|
+
email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
};
|
|
15
|
+
run(): Promise<unknown>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=accept-fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accept-fingerprint.d.ts","sourceRoot":"","sources":["../../../src/commands/peer/accept-fingerprint.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,WAAW;IAC5D,OAAgB,WAAW,SAAoF;IAC/G,OAAgB,IAAI;;MAElB;IACF,OAAgB,KAAK;;MAAoC;IAEnD,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAoB9B"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Args } from '@oclif/core';
|
|
2
|
+
import { KnowzError, ExitCode } from '@knowzai/core';
|
|
3
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
4
|
+
/**
|
|
5
|
+
* R11 — accepting a NEW fingerprint changes the trusted identity of the remote
|
|
6
|
+
* instance. Owner-grade TOFU decisions are interactive by design: typed
|
|
7
|
+
* confirmation (the peer slug), NO --yes bypass, non-TTY runs refused.
|
|
8
|
+
*/
|
|
9
|
+
export default class PeerAcceptFingerprint extends PeerCommand {
|
|
10
|
+
static description = "Accept a federation peer's NEW identity fingerprint (interactive-only; Owner).";
|
|
11
|
+
static args = {
|
|
12
|
+
peerRef: Args.string({ required: true, description: 'Peer id or slug' }),
|
|
13
|
+
};
|
|
14
|
+
static flags = { ...PeerCommand.peerAuthFlags };
|
|
15
|
+
async run() {
|
|
16
|
+
const { args, flags } = await this.parse(PeerAcceptFingerprint);
|
|
17
|
+
if (!this.peerInteractive()) {
|
|
18
|
+
throw new KnowzError('accept-fingerprint changes the trusted identity of the remote instance and is interactive-only — ' +
|
|
19
|
+
'run it from a terminal (there is deliberately no --yes bypass).', ExitCode.Usage);
|
|
20
|
+
}
|
|
21
|
+
const client = await this.peerApiClient(flags);
|
|
22
|
+
const peer = await this.resolvePeer(client, args.peerRef);
|
|
23
|
+
this.log(`This changes the trusted identity of the remote instance '${peer.slug}' (${peer.baseUrl}).`);
|
|
24
|
+
if (peer.remoteInstanceFingerprint)
|
|
25
|
+
this.log(`Currently pinned fingerprint: ${peer.remoteInstanceFingerprint}`);
|
|
26
|
+
const { input } = await import('@inquirer/prompts');
|
|
27
|
+
const typed = await input({ message: `Type the peer slug ('${peer.slug}') to confirm` });
|
|
28
|
+
if (typed !== peer.slug)
|
|
29
|
+
throw new KnowzError('Confirmation did not match — nothing changed.', ExitCode.Usage);
|
|
30
|
+
const updated = await this.withFederationHints(() => client.federation.acceptNewFingerprint(peer.id));
|
|
31
|
+
this.log(`New fingerprint pinned: ${updated.remoteInstanceFingerprint ?? '(none reported)'}`);
|
|
32
|
+
return updated;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=accept-fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accept-fingerprint.js","sourceRoot":"","sources":["../../../src/commands/peer/accept-fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,WAAW;IAC5D,MAAM,CAAU,WAAW,GAAG,gFAAgF,CAAC;IAC/G,MAAM,CAAU,IAAI,GAAG;QACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;KACzE,CAAC;IACF,MAAM,CAAU,KAAK,GAAG,EAAE,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC;IAEzD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,UAAU,CAClB,mGAAmG;gBACjG,iEAAiE,EACnE,QAAQ,CAAC,KAAK,CACf,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,6DAA6D,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QACvG,IAAI,IAAI,CAAC,yBAAyB;YAAE,IAAI,CAAC,GAAG,CAAC,iCAAiC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAChH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,wBAAwB,IAAI,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;QACzF,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,UAAU,CAAC,+CAA+C,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/G,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACtG,IAAI,CAAC,GAAG,CAAC,2BAA2B,OAAO,CAAC,yBAAyB,IAAI,iBAAiB,EAAE,CAAC,CAAC;QAC9F,OAAO,OAAO,CAAC;IACjB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
2
|
+
/**
|
|
3
|
+
* `knowz peer add <slug>` — register a federation peer. The credential handed
|
|
4
|
+
* over is the key THIS instance will present TO the remote, so it must be a
|
|
5
|
+
* personal `ukz_` key (client-side preflight, R9). Transport is KnowzApiKey
|
|
6
|
+
* (numeric 0 on the wire, R13).
|
|
7
|
+
*/
|
|
8
|
+
export default class PeerAdd extends PeerCommand {
|
|
9
|
+
static description: string;
|
|
10
|
+
static examples: string[];
|
|
11
|
+
static args: {
|
|
12
|
+
slug: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
13
|
+
};
|
|
14
|
+
static flags: {
|
|
15
|
+
email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
url: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
name: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
|
+
key: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
};
|
|
20
|
+
run(): Promise<unknown>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=add.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/commands/peer/add.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,WAAW;IAC9C,OAAgB,WAAW,SAA4F;IACvH,OAAgB,QAAQ,WAEtB;IACF,OAAgB,IAAI;;MAElB;IACF,OAAgB,KAAK;;;;;MAOnB;IAEI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAmB9B"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
3
|
+
/**
|
|
4
|
+
* `knowz peer add <slug>` — register a federation peer. The credential handed
|
|
5
|
+
* over is the key THIS instance will present TO the remote, so it must be a
|
|
6
|
+
* personal `ukz_` key (client-side preflight, R9). Transport is KnowzApiKey
|
|
7
|
+
* (numeric 0 on the wire, R13).
|
|
8
|
+
*/
|
|
9
|
+
export default class PeerAdd extends PeerCommand {
|
|
10
|
+
static description = 'Register a federation peer instance (requires a ukz_ personal API key for the remote).';
|
|
11
|
+
static examples = [
|
|
12
|
+
'KNOWZ_PEER_API_KEY=ukz_… <%= config.bin %> peer add cloud --url https://api.knowz.io --name "Knowz Cloud"',
|
|
13
|
+
];
|
|
14
|
+
static args = {
|
|
15
|
+
slug: Args.string({ required: true, description: 'Short unique name for the peer' }),
|
|
16
|
+
};
|
|
17
|
+
static flags = {
|
|
18
|
+
url: Flags.string({ required: true, description: 'Base URL of the remote instance API' }),
|
|
19
|
+
name: Flags.string({ required: true, description: 'Display name' }),
|
|
20
|
+
key: Flags.string({
|
|
21
|
+
description: 'ukz_ personal API key for the remote (prefer KNOWZ_PEER_API_KEY or the hidden prompt)',
|
|
22
|
+
}),
|
|
23
|
+
...PeerCommand.peerAuthFlags,
|
|
24
|
+
};
|
|
25
|
+
async run() {
|
|
26
|
+
const { args, flags } = await this.parse(PeerAdd);
|
|
27
|
+
const apiKey = await this.resolveKeyInput(flags.key); // R9 preflight BEFORE any HTTP
|
|
28
|
+
const client = await this.peerApiClient(flags);
|
|
29
|
+
const peer = await this.withFederationHints(() => client.federation.create({
|
|
30
|
+
slug: args.slug,
|
|
31
|
+
displayName: flags.name,
|
|
32
|
+
baseUrl: flags.url,
|
|
33
|
+
transport: 0, // KnowzApiKey (R13 — numeric enum on the wire)
|
|
34
|
+
apiKey,
|
|
35
|
+
}));
|
|
36
|
+
if (!this.jsonEnabled()) {
|
|
37
|
+
this.log(`Peer added: ${this.describePeer(peer)}`);
|
|
38
|
+
if (peer.remoteInstanceFingerprint)
|
|
39
|
+
this.log(`Fingerprint pinned: ${peer.remoteInstanceFingerprint}`);
|
|
40
|
+
}
|
|
41
|
+
return peer;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/peer/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,WAAW;IAC9C,MAAM,CAAU,WAAW,GAAG,wFAAwF,CAAC;IACvH,MAAM,CAAU,QAAQ,GAAG;QACzB,2GAA2G;KAC5G,CAAC;IACF,MAAM,CAAU,IAAI,GAAG;QACrB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;KACrF,CAAC;IACF,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC;QACzF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;QACnE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,uFAAuF;SACrG,CAAC;QACF,GAAG,WAAW,CAAC,aAAa;KAC7B,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,+BAA+B;QACrF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAC/C,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,KAAK,CAAC,IAAI;YACvB,OAAO,EAAE,KAAK,CAAC,GAAG;YAClB,SAAS,EAAE,CAAC,EAAE,+CAA+C;YAC7D,MAAM;SACP,CAAC,CACH,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,IAAI,IAAI,CAAC,yBAAyB;gBAAE,IAAI,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;QACxG,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
2
|
+
export default class PeerCancel extends PeerCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
peerRef: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
runId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<unknown>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=cancel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancel.d.ts","sourceRoot":"","sources":["../../../src/commands/peer/cancel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,OAAgB,WAAW,SAAmC;IAC9D,OAAgB,IAAI;;;MAGlB;IACF,OAAgB,KAAK;;MAAoC;IAEnD,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAQ9B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Args } from '@oclif/core';
|
|
2
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
3
|
+
export default class PeerCancel extends PeerCommand {
|
|
4
|
+
static description = 'Cancel an in-flight sync run.';
|
|
5
|
+
static args = {
|
|
6
|
+
peerRef: Args.string({ required: true, description: 'Peer id or slug' }),
|
|
7
|
+
runId: Args.string({ required: true, description: 'Run id' }),
|
|
8
|
+
};
|
|
9
|
+
static flags = { ...PeerCommand.peerAuthFlags };
|
|
10
|
+
async run() {
|
|
11
|
+
const { args, flags } = await this.parse(PeerCancel);
|
|
12
|
+
const client = await this.peerApiClient(flags);
|
|
13
|
+
const peer = await this.resolvePeer(client, args.peerRef);
|
|
14
|
+
await this.withFederationHints(() => client.federation.cancelRun(peer.id, args.runId));
|
|
15
|
+
if (!this.jsonEnabled())
|
|
16
|
+
this.log(`Cancel requested for run ${args.runId}.`);
|
|
17
|
+
return { cancelled: true, runId: args.runId };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=cancel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancel.js","sourceRoot":"","sources":["../../../src/commands/peer/cancel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAU,WAAW,GAAG,+BAA+B,CAAC;IAC9D,MAAM,CAAU,IAAI,GAAG;QACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;QACxE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;KAC9D,CAAC;IACF,MAAM,CAAU,KAAK,GAAG,EAAE,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC;IAEzD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAC7E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAChD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
2
|
+
/** R13 — direction goes numeric on the wire (Pull=0, Push=1). */
|
|
3
|
+
export default class PeerLink extends PeerCommand {
|
|
4
|
+
static description: string;
|
|
5
|
+
static args: {
|
|
6
|
+
peerRef: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
'local-vault': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
'remote-vault': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
direction: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<unknown>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/commands/peer/link.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,iEAAiE;AACjE,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,OAAgB,WAAW,SAAgE;IAC3F,OAAgB,IAAI;;MAElB;IACF,OAAgB,KAAK;;;;;MAKnB;IAEI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAgB9B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
3
|
+
import { resolveVaultRef } from '../../lib/vault.js';
|
|
4
|
+
/** R13 — direction goes numeric on the wire (Pull=0, Push=1). */
|
|
5
|
+
export default class PeerLink extends PeerCommand {
|
|
6
|
+
static description = 'Link a local vault to a remote vault on a federation peer.';
|
|
7
|
+
static args = {
|
|
8
|
+
peerRef: Args.string({ required: true, description: 'Peer id or slug' }),
|
|
9
|
+
};
|
|
10
|
+
static flags = {
|
|
11
|
+
'local-vault': Flags.string({ required: true, description: 'Local vault id or name' }),
|
|
12
|
+
'remote-vault': Flags.string({ required: true, description: 'Remote vault id (GUID)' }),
|
|
13
|
+
direction: Flags.string({ required: true, options: ['pull', 'push'], description: 'Sync direction' }),
|
|
14
|
+
...PeerCommand.peerAuthFlags,
|
|
15
|
+
};
|
|
16
|
+
async run() {
|
|
17
|
+
const { args, flags } = await this.parse(PeerLink);
|
|
18
|
+
const client = await this.peerApiClient(flags);
|
|
19
|
+
const peer = await this.resolvePeer(client, args.peerRef);
|
|
20
|
+
const localVaultId = await resolveVaultRef(client, flags['local-vault']);
|
|
21
|
+
const link = await this.withFederationHints(() => client.federation.createVaultLink(peer.id, {
|
|
22
|
+
peerId: peer.id,
|
|
23
|
+
localVaultId,
|
|
24
|
+
remoteVaultId: flags['remote-vault'],
|
|
25
|
+
direction: flags.direction === 'pull' ? 0 : 1,
|
|
26
|
+
}));
|
|
27
|
+
if (!this.jsonEnabled())
|
|
28
|
+
this.log(`Vault link ${link.id} created (${flags.direction}).`);
|
|
29
|
+
return link;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../src/commands/peer/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,iEAAiE;AACjE,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,MAAM,CAAU,WAAW,GAAG,4DAA4D,CAAC;IAC3F,MAAM,CAAU,IAAI,GAAG;QACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;KACzE,CAAC;IACF,MAAM,CAAU,KAAK,GAAG;QACtB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;QACtF,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;QACvF,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;QACrG,GAAG,WAAW,CAAC,aAAa;KAC7B,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAC/C,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE;YACzC,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,YAAY;YACZ,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC;YACpC,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9C,CAAC,CACH,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,EAAE,aAAa,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC;IACd,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
2
|
+
export default class PeerLinks extends PeerCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
peerRef: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static flags: {
|
|
8
|
+
email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
run(): Promise<unknown>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=links.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../../src/commands/peer/links.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,OAAgB,WAAW,SAA4D;IACvF,OAAgB,IAAI;;MAElB;IACF,OAAgB,KAAK;;MAAoC;IAEnD,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAgB9B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Args } from '@oclif/core';
|
|
2
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
3
|
+
export default class PeerLinks extends PeerCommand {
|
|
4
|
+
static description = 'List the vault links configured for a federation peer.';
|
|
5
|
+
static args = {
|
|
6
|
+
peerRef: Args.string({ required: true, description: 'Peer id or slug' }),
|
|
7
|
+
};
|
|
8
|
+
static flags = { ...PeerCommand.peerAuthFlags };
|
|
9
|
+
async run() {
|
|
10
|
+
const { args, flags } = await this.parse(PeerLinks);
|
|
11
|
+
const client = await this.peerApiClient(flags);
|
|
12
|
+
const peer = await this.resolvePeer(client, args.peerRef);
|
|
13
|
+
const links = await this.withFederationHints(() => client.federation.listVaultLinks(peer.id));
|
|
14
|
+
if (!this.jsonEnabled()) {
|
|
15
|
+
if (!links.length)
|
|
16
|
+
this.log(`No vault links for ${peer.slug}.`);
|
|
17
|
+
for (const l of links) {
|
|
18
|
+
this.log(`${l.id}: local ${l.localVaultId} ↔ remote ${l.remoteVaultId} ` +
|
|
19
|
+
`(direction ${String(l.direction)}, ${l.isActive ? 'active' : 'INACTIVE'})`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return links;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../../src/commands/peer/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAU,WAAW,GAAG,wDAAwD,CAAC;IACvF,MAAM,CAAU,IAAI,GAAG;QACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;KACzE,CAAC;IACF,MAAM,CAAU,KAAK,GAAG,EAAE,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC;IAEzD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9F,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,IAAI,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YAChE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,IAAI,CAAC,GAAG,CACN,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,YAAY,aAAa,CAAC,CAAC,aAAa,GAAG;oBAC7D,cAAc,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,CAC9E,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
2
|
+
export default class PeerList extends PeerCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static flags: {
|
|
5
|
+
email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
6
|
+
all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<unknown>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/peer/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,OAAgB,WAAW,SAA4B;IACvD,OAAgB,KAAK;;;MAGnB;IAEI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAU9B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
3
|
+
export default class PeerList extends PeerCommand {
|
|
4
|
+
static description = 'List federation peers.';
|
|
5
|
+
static flags = {
|
|
6
|
+
all: Flags.boolean({ description: 'Include disabled peers' }),
|
|
7
|
+
...PeerCommand.peerAuthFlags,
|
|
8
|
+
};
|
|
9
|
+
async run() {
|
|
10
|
+
const { flags } = await this.parse(PeerList);
|
|
11
|
+
const client = await this.peerApiClient(flags);
|
|
12
|
+
const peers = await this.withFederationHints(() => client.federation.list(flags.all));
|
|
13
|
+
if (!this.jsonEnabled()) {
|
|
14
|
+
if (!peers.length)
|
|
15
|
+
this.log('No federation peers.');
|
|
16
|
+
for (const p of peers)
|
|
17
|
+
this.log(this.describePeer(p));
|
|
18
|
+
}
|
|
19
|
+
return peers;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/peer/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,MAAM,CAAU,WAAW,GAAG,wBAAwB,CAAC;IACvD,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;QAC7D,GAAG,WAAW,CAAC,aAAa;KAC7B,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpD,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
2
|
+
export default class PeerPull extends PeerCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
peerRef: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
link: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
since: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
'skip-re-enrichment': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
'max-file-mb': import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
wait: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
timeout: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
};
|
|
17
|
+
run(): Promise<unknown>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=pull.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/commands/peer/pull.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAgB,MAAM,2BAA2B,CAAC;AAEtE,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,OAAgB,WAAW,SAAgF;IAC3G,OAAgB,QAAQ,WAGtB;IACF,OAAgB,IAAI;;MAElB;IACF,OAAgB,KAAK;;;;;;;;MAAqD;IAEpE,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAgB9B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Args } from '@oclif/core';
|
|
2
|
+
import { PeerCommand, syncRunFlags } from '../../lib/peer-command.js';
|
|
3
|
+
export default class PeerPull extends PeerCommand {
|
|
4
|
+
static description = 'Pull vault content FROM a federation peer over a vault link (202 + runId).';
|
|
5
|
+
static examples = [
|
|
6
|
+
'<%= config.bin %> peer pull cloud --link 6f2c… --wait',
|
|
7
|
+
'<%= config.bin %> peer pull cloud --link 6f2c… --since 2026-08-01T00:00:00Z --skip-re-enrichment',
|
|
8
|
+
];
|
|
9
|
+
static args = {
|
|
10
|
+
peerRef: Args.string({ required: true, description: 'Peer id or slug' }),
|
|
11
|
+
};
|
|
12
|
+
static flags = { ...syncRunFlags, ...PeerCommand.peerAuthFlags };
|
|
13
|
+
async run() {
|
|
14
|
+
const { args, flags } = await this.parse(PeerPull);
|
|
15
|
+
const client = await this.peerApiClient(flags);
|
|
16
|
+
return this.enqueueSyncRun('pull', {
|
|
17
|
+
client,
|
|
18
|
+
peerRef: args.peerRef,
|
|
19
|
+
vaultLinkId: flags.link,
|
|
20
|
+
options: {
|
|
21
|
+
...(flags['skip-re-enrichment'] ? { skipReEnrichment: true } : {}),
|
|
22
|
+
...(flags['max-file-mb'] !== undefined ? { maxFileMb: flags['max-file-mb'] } : {}),
|
|
23
|
+
...(flags.since ? { since: flags.since } : {}),
|
|
24
|
+
},
|
|
25
|
+
wait: flags.wait,
|
|
26
|
+
timeoutSeconds: flags.timeout,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=pull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/commands/peer/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEtE,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,MAAM,CAAU,WAAW,GAAG,4EAA4E,CAAC;IAC3G,MAAM,CAAU,QAAQ,GAAG;QACzB,uDAAuD;QACvD,kGAAkG;KACnG,CAAC;IACF,MAAM,CAAU,IAAI,GAAG;QACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;KACzE,CAAC;IACF,MAAM,CAAU,KAAK,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC;IAE1E,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;YACjC,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,KAAK,CAAC,IAAI;YACvB,OAAO,EAAE;gBACP,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClF,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/C;YACD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,cAAc,EAAE,KAAK,CAAC,OAAO;SAC9B,CAAC,CAAC;IACL,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PeerCommand } from '../../lib/peer-command.js';
|
|
2
|
+
export default class PeerPush extends PeerCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
peerRef: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
link: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
since: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
'skip-re-enrichment': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
'max-file-mb': import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
wait: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
timeout: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
};
|
|
17
|
+
run(): Promise<unknown>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/commands/peer/push.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAgB,MAAM,2BAA2B,CAAC;AAEtE,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,OAAgB,WAAW,SAA8E;IACzG,OAAgB,QAAQ,WAGtB;IACF,OAAgB,IAAI;;MAElB;IACF,OAAgB,KAAK;;;;;;;;MAAqD;IAEpE,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAgB9B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Args } from '@oclif/core';
|
|
2
|
+
import { PeerCommand, syncRunFlags } from '../../lib/peer-command.js';
|
|
3
|
+
export default class PeerPush extends PeerCommand {
|
|
4
|
+
static description = 'Push vault content TO a federation peer over a vault link (202 + runId).';
|
|
5
|
+
static examples = [
|
|
6
|
+
'<%= config.bin %> peer push cloud --link 6f2c… --wait',
|
|
7
|
+
'<%= config.bin %> peer push cloud --link 6f2c… --since 2026-08-01T00:00:00Z --skip-re-enrichment',
|
|
8
|
+
];
|
|
9
|
+
static args = {
|
|
10
|
+
peerRef: Args.string({ required: true, description: 'Peer id or slug' }),
|
|
11
|
+
};
|
|
12
|
+
static flags = { ...syncRunFlags, ...PeerCommand.peerAuthFlags };
|
|
13
|
+
async run() {
|
|
14
|
+
const { args, flags } = await this.parse(PeerPush);
|
|
15
|
+
const client = await this.peerApiClient(flags);
|
|
16
|
+
return this.enqueueSyncRun('push', {
|
|
17
|
+
client,
|
|
18
|
+
peerRef: args.peerRef,
|
|
19
|
+
vaultLinkId: flags.link,
|
|
20
|
+
options: {
|
|
21
|
+
...(flags['skip-re-enrichment'] ? { skipReEnrichment: true } : {}),
|
|
22
|
+
...(flags['max-file-mb'] !== undefined ? { maxFileMb: flags['max-file-mb'] } : {}),
|
|
23
|
+
...(flags.since ? { since: flags.since } : {}),
|
|
24
|
+
},
|
|
25
|
+
wait: flags.wait,
|
|
26
|
+
timeoutSeconds: flags.timeout,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/commands/peer/push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEtE,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,MAAM,CAAU,WAAW,GAAG,0EAA0E,CAAC;IACzG,MAAM,CAAU,QAAQ,GAAG;QACzB,uDAAuD;QACvD,kGAAkG;KACnG,CAAC;IACF,MAAM,CAAU,IAAI,GAAG;QACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;KACzE,CAAC;IACF,MAAM,CAAU,KAAK,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC;IAE1E,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;YACjC,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,KAAK,CAAC,IAAI;YACvB,OAAO,EAAE;gBACP,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClF,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/C;YACD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,cAAc,EAAE,KAAK,CAAC,OAAO;SAC9B,CAAC,CAAC;IACL,CAAC"}
|