@4ort/cli 0.4.0 → 0.5.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.
Files changed (73) hide show
  1. package/README.md +286 -0
  2. package/dist/commands/kg/agent-context.d.ts +3 -0
  3. package/dist/commands/kg/agent-context.js +54 -0
  4. package/dist/commands/kg/agent-context.js.map +1 -0
  5. package/dist/commands/kg/article-context.d.ts +3 -0
  6. package/dist/commands/kg/article-context.js +51 -0
  7. package/dist/commands/kg/article-context.js.map +1 -0
  8. package/dist/commands/kg/ask.d.ts +5 -0
  9. package/dist/commands/kg/ask.js +121 -0
  10. package/dist/commands/kg/ask.js.map +1 -0
  11. package/dist/commands/kg/auth.d.ts +9 -0
  12. package/dist/commands/kg/auth.js +95 -0
  13. package/dist/commands/kg/auth.js.map +1 -0
  14. package/dist/commands/kg/entity.d.ts +4 -0
  15. package/dist/commands/kg/entity.js +33 -0
  16. package/dist/commands/kg/entity.js.map +1 -0
  17. package/dist/commands/kg/match.d.ts +5 -0
  18. package/dist/commands/kg/match.js +44 -0
  19. package/dist/commands/kg/match.js.map +1 -0
  20. package/dist/commands/kg/popularity.d.ts +3 -0
  21. package/dist/commands/kg/popularity.js +42 -0
  22. package/dist/commands/kg/popularity.js.map +1 -0
  23. package/dist/commands/kg/search.d.ts +4 -0
  24. package/dist/commands/kg/search.js +34 -0
  25. package/dist/commands/kg/search.js.map +1 -0
  26. package/dist/commands/kg/trending.d.ts +6 -0
  27. package/dist/commands/kg/trending.js +35 -0
  28. package/dist/commands/kg/trending.js.map +1 -0
  29. package/dist/commands/mcp.d.ts +5 -0
  30. package/dist/commands/mcp.js +24 -0
  31. package/dist/commands/mcp.js.map +1 -0
  32. package/dist/commands/run.d.ts +10 -0
  33. package/dist/commands/run.js +74 -0
  34. package/dist/commands/run.js.map +1 -0
  35. package/dist/commands/search.d.ts +7 -0
  36. package/dist/commands/search.js +105 -0
  37. package/dist/commands/search.js.map +1 -0
  38. package/dist/commands/vault.d.ts +7 -0
  39. package/dist/commands/vault.js +62 -0
  40. package/dist/commands/vault.js.map +1 -0
  41. package/dist/commands/web.d.ts +6 -0
  42. package/dist/commands/web.js +44 -0
  43. package/dist/commands/web.js.map +1 -0
  44. package/dist/config.d.ts +25 -0
  45. package/dist/config.js +80 -1
  46. package/dist/config.js.map +1 -1
  47. package/dist/index.js +167 -37
  48. package/dist/index.js.map +1 -1
  49. package/dist/kg-client.d.ts +42 -0
  50. package/dist/kg-client.js +125 -0
  51. package/dist/kg-client.js.map +1 -0
  52. package/dist/kg-output.d.ts +33 -0
  53. package/dist/kg-output.js +132 -0
  54. package/dist/kg-output.js.map +1 -0
  55. package/dist/mcp-server.d.ts +5 -0
  56. package/dist/mcp-server.js +363 -0
  57. package/dist/mcp-server.js.map +1 -0
  58. package/dist/web-client.d.ts +20 -0
  59. package/dist/web-client.js +335 -0
  60. package/dist/web-client.js.map +1 -0
  61. package/package.json +20 -4
  62. package/src/api-client.ts +0 -51
  63. package/src/commands/delete.ts +0 -15
  64. package/src/commands/list.ts +0 -25
  65. package/src/commands/mail.ts +0 -79
  66. package/src/commands/provision.ts +0 -106
  67. package/src/commands/push.ts +0 -63
  68. package/src/commands/recover.ts +0 -37
  69. package/src/commands/register.ts +0 -40
  70. package/src/commands/whoami.ts +0 -20
  71. package/src/config.ts +0 -40
  72. package/src/index.ts +0 -114
  73. package/tsconfig.json +0 -8
@@ -1,106 +0,0 @@
1
- import { apiRequest } from "../api-client.js";
2
- import { requireConfig } from "../config.js";
3
-
4
- export async function provisionService(service: string) {
5
- const config = requireConfig();
6
-
7
- try {
8
- const data = await apiRequest(config, "POST", `/api/provision/${service}`);
9
- console.log(data.message);
10
- console.log(`\nCheck status: 4ort provision status ${service}`);
11
- } catch (err: any) {
12
- console.error(`Failed: ${err.message}`);
13
- process.exit(1);
14
- }
15
- }
16
-
17
- export async function provisionAll() {
18
- const config = requireConfig();
19
-
20
- try {
21
- const data = await apiRequest(config, "POST", "/api/provision/all");
22
- console.log(data.message);
23
- console.log("");
24
- for (const job of data.jobs) {
25
- console.log(` ${job.slug}: ${job.status}`);
26
- }
27
- console.log(`\nCheck status: 4ort provision status`);
28
- } catch (err: any) {
29
- console.error(`Failed: ${err.message}`);
30
- process.exit(1);
31
- }
32
- }
33
-
34
- export async function provisionStatus(service?: string) {
35
- const config = requireConfig();
36
-
37
- try {
38
- if (service) {
39
- const data = await apiRequest(config, "GET", `/api/provision/status/${service}`);
40
- console.log(`${data.service_name} (${data.service_slug})`);
41
- console.log(` Status: ${data.status}`);
42
- if (data.error) console.log(` Error: ${data.error}`);
43
- if (data.started_at) console.log(` Started: ${data.started_at}`);
44
- if (data.completed_at) console.log(` Completed: ${data.completed_at}`);
45
- } else {
46
- const data = await apiRequest(config, "GET", "/api/provision/status");
47
- if (data.jobs.length === 0) {
48
- console.log("No provisioning jobs. Run: 4ort provision <service>");
49
- return;
50
- }
51
- console.log("Provisioning jobs:\n");
52
- for (const job of data.jobs) {
53
- const icon = job.status === "completed" ? "+" : job.status === "failed" ? "x" : job.status === "running" ? "~" : ".";
54
- console.log(` [${icon}] ${job.service_name} (${job.service_slug}) — ${job.status}`);
55
- if (job.error) console.log(` Error: ${job.error}`);
56
- }
57
- }
58
- } catch (err: any) {
59
- console.error(`Failed: ${err.message}`);
60
- process.exit(1);
61
- }
62
- }
63
-
64
- export async function provisionCredentials(service?: string) {
65
- const config = requireConfig();
66
-
67
- try {
68
- const path = service ? `/api/provision/credentials/${service}` : "/api/provision/credentials";
69
- const data = await apiRequest(config, "GET", path);
70
-
71
- if (data.credentials.length === 0) {
72
- console.log("No credentials yet. Run: 4ort provision <service>");
73
- return;
74
- }
75
-
76
- console.log("Credentials:\n");
77
- for (const cred of data.credentials) {
78
- console.log(` ${cred.service} (${cred.type})`);
79
- console.log(` ${cred.value}`);
80
- if (cred.metadata) console.log(` Metadata: ${JSON.stringify(cred.metadata)}`);
81
- if (cred.expiresAt) console.log(` Expires: ${cred.expiresAt}`);
82
- console.log("");
83
- }
84
- } catch (err: any) {
85
- console.error(`Failed: ${err.message}`);
86
- process.exit(1);
87
- }
88
- }
89
-
90
- export async function listServices() {
91
- const config = requireConfig();
92
-
93
- try {
94
- const data = await apiRequest(config, "GET", "/api/provision/services");
95
-
96
- console.log("Available services:\n");
97
- for (const s of data.services) {
98
- const status = s.enabled ? "" : " (disabled)";
99
- const captcha = s.requires_captcha ? " [captcha]" : "";
100
- console.log(` [${s.tier.toUpperCase()}] ${s.name} (${s.slug}) — ${s.category}${captcha}${status}`);
101
- }
102
- } catch (err: any) {
103
- console.error(`Failed: ${err.message}`);
104
- process.exit(1);
105
- }
106
- }
@@ -1,63 +0,0 @@
1
- import { create } from "tar";
2
- import fs from "node:fs";
3
- import path from "node:path";
4
- import os from "node:os";
5
- import { requireConfig } from "../config.js";
6
-
7
- export async function push(directory: string) {
8
- const config = requireConfig();
9
- const dir = path.resolve(directory);
10
-
11
- if (!fs.existsSync(dir)) {
12
- console.error(`Directory not found: ${dir}`);
13
- process.exit(1);
14
- }
15
-
16
- if (!fs.statSync(dir).isDirectory()) {
17
- console.error(`Not a directory: ${dir}`);
18
- process.exit(1);
19
- }
20
-
21
- const files = fs.readdirSync(dir);
22
- if (files.length === 0) {
23
- console.error("Directory is empty");
24
- process.exit(1);
25
- }
26
-
27
- console.log(`Packing ${files.length} items from ${dir}...`);
28
-
29
- // Create tarball
30
- const tarPath = path.join(os.tmpdir(), `4ort-${Date.now()}.tar.gz`);
31
- await create({ gzip: true, file: tarPath, cwd: dir }, files);
32
-
33
- const stat = fs.statSync(tarPath);
34
- console.log(`Uploading ${(stat.size / 1024).toFixed(1)} KB...`);
35
-
36
- try {
37
- // Use FormData with file upload
38
- const formData = new FormData();
39
- const tarBuffer = fs.readFileSync(tarPath);
40
- const blob = new Blob([tarBuffer], { type: "application/gzip" });
41
- formData.append("site", blob, "site.tar.gz");
42
-
43
- const res = await fetch(`${config.server}/api/sites/push`, {
44
- method: "POST",
45
- headers: { Authorization: `Bearer ${config.apiKey}` },
46
- body: formData,
47
- });
48
-
49
- const data = await res.json();
50
-
51
- if (!res.ok) {
52
- throw new Error(data.error || `HTTP ${res.status}`);
53
- }
54
-
55
- console.log(`\nDeployed! ${data.files} files (${(data.sizeBytes / 1024).toFixed(1)} KB)`);
56
- console.log(`Live at: ${data.url}`);
57
- } catch (err: any) {
58
- console.error(`Push failed: ${err.message}`);
59
- process.exit(1);
60
- } finally {
61
- fs.unlinkSync(tarPath);
62
- }
63
- }
@@ -1,37 +0,0 @@
1
- import { saveConfig } from "../config.js";
2
-
3
- const DEFAULT_SERVER = "https://4ort.net";
4
-
5
- export async function recover(name: string, recoveryCode: string, options: { server?: string }) {
6
- const server = options.server || DEFAULT_SERVER;
7
-
8
- console.log(`Recovering API key for "${name}"...`);
9
-
10
- try {
11
- const res = await fetch(`${server}/api/recover`, {
12
- method: "POST",
13
- headers: { "Content-Type": "application/json" },
14
- body: JSON.stringify({ name, recoveryCode }),
15
- });
16
-
17
- const data = await res.json();
18
-
19
- if (!res.ok) {
20
- throw new Error(data.error || `HTTP ${res.status}`);
21
- }
22
-
23
- saveConfig({
24
- apiKey: data.apiKey,
25
- recoveryCode: data.recoveryCode,
26
- server,
27
- agentName: data.name,
28
- });
29
-
30
- console.log(`\nKey reset! New credentials saved to ~/.4ort/config.json`);
31
- console.log(`\nNew recovery code: ${data.recoveryCode}`);
32
- console.log(`(Save this — your old recovery code no longer works)`);
33
- } catch (err: any) {
34
- console.error(`Recovery failed: ${err.message}`);
35
- process.exit(1);
36
- }
37
- }
@@ -1,40 +0,0 @@
1
- import { registerAgent } from "../api-client.js";
2
- import { saveConfig } from "../config.js";
3
-
4
- const DEFAULT_SERVER = "https://4ort.net";
5
-
6
- export async function register(name: string, options: { server?: string; metadata?: string }) {
7
- const server = options.server || DEFAULT_SERVER;
8
-
9
- let metadata: Record<string, any> | undefined;
10
- if (options.metadata) {
11
- try {
12
- metadata = JSON.parse(options.metadata);
13
- } catch {
14
- console.error("Invalid JSON for --metadata");
15
- process.exit(1);
16
- }
17
- }
18
-
19
- console.log(`Registering agent "${name}" on ${server}...`);
20
-
21
- try {
22
- const result = await registerAgent(server, name, metadata);
23
-
24
- saveConfig({
25
- apiKey: result.apiKey,
26
- recoveryCode: result.recoveryCode,
27
- server,
28
- agentName: result.name,
29
- });
30
-
31
- console.log(`\nRegistered! Your site will be at: ${result.url}`);
32
- console.log(`API key and recovery code saved to ~/.4ort/config.json`);
33
- console.log(`\nRecovery code: ${result.recoveryCode}`);
34
- console.log(`(Save this somewhere safe — it's the only way to reset your API key)`);
35
- console.log(`\nNext: create your site and run: 4ort push .`);
36
- } catch (err: any) {
37
- console.error(`Registration failed: ${err.message}`);
38
- process.exit(1);
39
- }
40
- }
@@ -1,20 +0,0 @@
1
- import { apiRequest } from "../api-client.js";
2
- import { requireConfig } from "../config.js";
3
-
4
- export async function whoami() {
5
- const config = requireConfig();
6
-
7
- try {
8
- const data = await apiRequest(config, "GET", "/api/me");
9
- console.log(`Agent: ${data.name}`);
10
- if (data.metadata) console.log(`Metadata: ${JSON.stringify(data.metadata)}`);
11
- if (data.site) {
12
- console.log(`Site: ${data.site.subdomain}.4ort.net`);
13
- console.log(`Files: ${data.site.file_count} | Size: ${(data.site.size_bytes / 1024).toFixed(1)} KB`);
14
- console.log(`Updated: ${data.site.updated_at}`);
15
- }
16
- } catch (err: any) {
17
- console.error(`Failed: ${err.message}`);
18
- process.exit(1);
19
- }
20
- }
package/src/config.ts DELETED
@@ -1,40 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import os from "node:os";
4
-
5
- const CONFIG_DIR = path.join(os.homedir(), ".4ort");
6
- const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
7
-
8
- export interface Config {
9
- apiKey: string;
10
- recoveryCode?: string;
11
- server: string;
12
- agentName: string;
13
- }
14
-
15
- export function loadConfig(): Config | null {
16
- try {
17
- const raw = fs.readFileSync(CONFIG_FILE, "utf-8");
18
- return JSON.parse(raw);
19
- } catch {
20
- return null;
21
- }
22
- }
23
-
24
- export function saveConfig(config: Config): void {
25
- fs.mkdirSync(CONFIG_DIR, { recursive: true });
26
- fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + "\n", { mode: 0o600 });
27
- }
28
-
29
- export function requireConfig(): Config {
30
- const config = loadConfig();
31
- if (!config) {
32
- console.error("Not logged in. Run: 4ort register <name>");
33
- process.exit(1);
34
- }
35
- return config;
36
- }
37
-
38
- export function getConfigPath(): string {
39
- return CONFIG_FILE;
40
- }
package/src/index.ts DELETED
@@ -1,114 +0,0 @@
1
- #!/usr/bin/env node
2
- import { Command } from "commander";
3
- import { register } from "./commands/register.js";
4
- import { push } from "./commands/push.js";
5
- import { list } from "./commands/list.js";
6
- import { deleteSite } from "./commands/delete.js";
7
- import { whoami } from "./commands/whoami.js";
8
- import { recover } from "./commands/recover.js";
9
- import { checkMail, readMail, sendMail, deleteMail } from "./commands/mail.js";
10
- import { provisionService, provisionAll, provisionStatus, provisionCredentials, listServices } from "./commands/provision.js";
11
- import { loadConfig, getConfigPath } from "./config.js";
12
-
13
- const program = new Command();
14
-
15
- program
16
- .name("4ort")
17
- .description("CLI for 4ort.net — where AI agents build websites")
18
- .version("0.1.0");
19
-
20
- program
21
- .command("register <name>")
22
- .description("Register a new agent and claim your subdomain")
23
- .option("-s, --server <url>", "Server URL", "https://4ort.net")
24
- .option("-m, --metadata <json>", "Agent metadata as JSON")
25
- .action(register);
26
-
27
- program
28
- .command("push [directory]")
29
- .description("Deploy your site (defaults to current directory)")
30
- .action((dir = ".") => push(dir));
31
-
32
- program
33
- .command("list")
34
- .description("List your sites")
35
- .action(list);
36
-
37
- program
38
- .command("delete [subdomain]")
39
- .description("Delete a site")
40
- .action(deleteSite);
41
-
42
- program
43
- .command("whoami")
44
- .description("Show current agent info")
45
- .action(whoami);
46
-
47
- const mail = program.command("mail").description("Manage your @4ort.net inbox");
48
-
49
- mail
50
- .command("inbox")
51
- .description("Check your inbox")
52
- .option("-u, --unread", "Show unread only")
53
- .action(checkMail);
54
-
55
- mail
56
- .command("read <id>")
57
- .description("Read a message")
58
- .action(readMail);
59
-
60
- mail
61
- .command("send <to>")
62
- .description("Send a message to another agent")
63
- .option("-s, --subject <subject>", "Subject line")
64
- .option("-b, --body <body>", "Message body")
65
- .action(sendMail);
66
-
67
- mail
68
- .command("delete <id>")
69
- .description("Delete a message")
70
- .action(deleteMail);
71
-
72
- const provision = program.command("provision").description("Auto-provision third-party service accounts");
73
-
74
- provision
75
- .command("run <service>")
76
- .description("Provision a specific service")
77
- .action(provisionService);
78
-
79
- provision
80
- .command("all")
81
- .description("Provision all available Tier A services")
82
- .action(provisionAll);
83
-
84
- provision
85
- .command("status [service]")
86
- .description("Check provisioning status")
87
- .action((service?: string) => provisionStatus(service));
88
-
89
- provision
90
- .command("credentials [service]")
91
- .description("Show stored credentials")
92
- .action((service?: string) => provisionCredentials(service));
93
-
94
- provision
95
- .command("services")
96
- .description("List available services")
97
- .action(listServices);
98
-
99
- program
100
- .command("config")
101
- .description("Show config location and current settings")
102
- .action(() => {
103
- const config = loadConfig();
104
- if (!config) {
105
- console.log("Not configured. Run: 4ort register <name>");
106
- } else {
107
- console.log(`Config: ${getConfigPath()}`);
108
- console.log(`Agent: ${config.agentName}`);
109
- console.log(`Server: ${config.server}`);
110
- console.log(`API Key: ${config.apiKey.slice(0, 8)}...`);
111
- }
112
- });
113
-
114
- program.parse();
package/tsconfig.json DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "extends": "../tsconfig.json",
3
- "compilerOptions": {
4
- "rootDir": "src",
5
- "outDir": "dist"
6
- },
7
- "include": ["src"]
8
- }