@imisbahk/hive 0.1.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 (132) hide show
  1. package/.rocket/ARCHITECTURE.md +7 -0
  2. package/.rocket/README.md +31 -0
  3. package/.rocket/SYMBOLS.md +282 -0
  4. package/.rocket/config.json +18 -0
  5. package/001-local-first-storage.md +43 -0
  6. package/003-memory-architechture.md +71 -0
  7. package/CONTRIBUTING.md +149 -0
  8. package/LICENSE.md +21 -0
  9. package/README.md +146 -0
  10. package/dist/agent/agent.d.ts +32 -0
  11. package/dist/agent/agent.d.ts.map +1 -0
  12. package/dist/agent/agent.js +103 -0
  13. package/dist/agent/agent.js.map +1 -0
  14. package/dist/agent/index.d.ts +3 -0
  15. package/dist/agent/index.d.ts.map +1 -0
  16. package/dist/agent/index.js +2 -0
  17. package/dist/agent/index.js.map +1 -0
  18. package/dist/cli/commands/chat.d.ts +12 -0
  19. package/dist/cli/commands/chat.d.ts.map +1 -0
  20. package/dist/cli/commands/chat.js +117 -0
  21. package/dist/cli/commands/chat.js.map +1 -0
  22. package/dist/cli/commands/config.d.ts +7 -0
  23. package/dist/cli/commands/config.d.ts.map +1 -0
  24. package/dist/cli/commands/config.js +234 -0
  25. package/dist/cli/commands/config.js.map +1 -0
  26. package/dist/cli/commands/init.d.ts +8 -0
  27. package/dist/cli/commands/init.d.ts.map +1 -0
  28. package/dist/cli/commands/init.js +186 -0
  29. package/dist/cli/commands/init.js.map +1 -0
  30. package/dist/cli/commands/nuke.d.ts +4 -0
  31. package/dist/cli/commands/nuke.d.ts.map +1 -0
  32. package/dist/cli/commands/nuke.js +47 -0
  33. package/dist/cli/commands/nuke.js.map +1 -0
  34. package/dist/cli/commands/status.d.ts +4 -0
  35. package/dist/cli/commands/status.d.ts.map +1 -0
  36. package/dist/cli/commands/status.js +114 -0
  37. package/dist/cli/commands/status.js.map +1 -0
  38. package/dist/cli/helpers/providerPrompts.d.ts +13 -0
  39. package/dist/cli/helpers/providerPrompts.d.ts.map +1 -0
  40. package/dist/cli/helpers/providerPrompts.js +138 -0
  41. package/dist/cli/helpers/providerPrompts.js.map +1 -0
  42. package/dist/cli/index.d.ts +3 -0
  43. package/dist/cli/index.d.ts.map +1 -0
  44. package/dist/cli/index.js +31 -0
  45. package/dist/cli/index.js.map +1 -0
  46. package/dist/providers/anthropic.d.ts +10 -0
  47. package/dist/providers/anthropic.d.ts.map +1 -0
  48. package/dist/providers/anthropic.js +108 -0
  49. package/dist/providers/anthropic.js.map +1 -0
  50. package/dist/providers/api-key.d.ts +3 -0
  51. package/dist/providers/api-key.d.ts.map +1 -0
  52. package/dist/providers/api-key.js +15 -0
  53. package/dist/providers/api-key.js.map +1 -0
  54. package/dist/providers/base.d.ts +41 -0
  55. package/dist/providers/base.d.ts.map +1 -0
  56. package/dist/providers/base.js +157 -0
  57. package/dist/providers/base.js.map +1 -0
  58. package/dist/providers/google.d.ts +6 -0
  59. package/dist/providers/google.d.ts.map +1 -0
  60. package/dist/providers/google.js +19 -0
  61. package/dist/providers/google.js.map +1 -0
  62. package/dist/providers/groq.d.ts +6 -0
  63. package/dist/providers/groq.d.ts.map +1 -0
  64. package/dist/providers/groq.js +19 -0
  65. package/dist/providers/groq.js.map +1 -0
  66. package/dist/providers/index.d.ts +4 -0
  67. package/dist/providers/index.d.ts.map +1 -0
  68. package/dist/providers/index.js +58 -0
  69. package/dist/providers/index.js.map +1 -0
  70. package/dist/providers/mistral.d.ts +6 -0
  71. package/dist/providers/mistral.d.ts.map +1 -0
  72. package/dist/providers/mistral.js +19 -0
  73. package/dist/providers/mistral.js.map +1 -0
  74. package/dist/providers/ollama.d.ts +6 -0
  75. package/dist/providers/ollama.d.ts.map +1 -0
  76. package/dist/providers/ollama.js +20 -0
  77. package/dist/providers/ollama.js.map +1 -0
  78. package/dist/providers/openai-compatible.d.ts +22 -0
  79. package/dist/providers/openai-compatible.d.ts.map +1 -0
  80. package/dist/providers/openai-compatible.js +36 -0
  81. package/dist/providers/openai-compatible.js.map +1 -0
  82. package/dist/providers/openai.d.ts +6 -0
  83. package/dist/providers/openai.d.ts.map +1 -0
  84. package/dist/providers/openai.js +19 -0
  85. package/dist/providers/openai.js.map +1 -0
  86. package/dist/providers/openrouter.d.ts +6 -0
  87. package/dist/providers/openrouter.d.ts.map +1 -0
  88. package/dist/providers/openrouter.js +19 -0
  89. package/dist/providers/openrouter.js.map +1 -0
  90. package/dist/providers/together.d.ts +6 -0
  91. package/dist/providers/together.d.ts.map +1 -0
  92. package/dist/providers/together.js +19 -0
  93. package/dist/providers/together.js.map +1 -0
  94. package/dist/storage/db.d.ts +48 -0
  95. package/dist/storage/db.d.ts.map +1 -0
  96. package/dist/storage/db.js +298 -0
  97. package/dist/storage/db.js.map +1 -0
  98. package/dist/storage/schema.d.ts +43 -0
  99. package/dist/storage/schema.d.ts.map +1 -0
  100. package/dist/storage/schema.js +69 -0
  101. package/dist/storage/schema.js.map +1 -0
  102. package/index.md +16 -0
  103. package/package.json +48 -0
  104. package/prompts/Behaviour.md +23 -0
  105. package/prompts/Code.md +12 -0
  106. package/prompts/Memory.md +11 -0
  107. package/prompts/System.md +6 -0
  108. package/releases/v1/v0.1/RELEASE-NOTES.md +0 -0
  109. package/src/agent/agent.ts +155 -0
  110. package/src/agent/index.ts +2 -0
  111. package/src/cli/commands/chat.ts +169 -0
  112. package/src/cli/commands/config.ts +282 -0
  113. package/src/cli/commands/init.ts +242 -0
  114. package/src/cli/commands/nuke.ts +60 -0
  115. package/src/cli/commands/status.ts +147 -0
  116. package/src/cli/helpers/providerPrompts.ts +192 -0
  117. package/src/cli/index.ts +38 -0
  118. package/src/providers/anthropic.ts +146 -0
  119. package/src/providers/api-key.ts +23 -0
  120. package/src/providers/base.ts +234 -0
  121. package/src/providers/google.ts +21 -0
  122. package/src/providers/groq.ts +21 -0
  123. package/src/providers/index.ts +65 -0
  124. package/src/providers/mistral.ts +21 -0
  125. package/src/providers/ollama.ts +22 -0
  126. package/src/providers/openai-compatible.ts +58 -0
  127. package/src/providers/openai.ts +21 -0
  128. package/src/providers/openrouter.ts +21 -0
  129. package/src/providers/together.ts +21 -0
  130. package/src/storage/db.ts +476 -0
  131. package/src/storage/schema.ts +116 -0
  132. package/tsconfig.json +51 -0
@@ -0,0 +1,234 @@
1
+ import process from "node:process";
2
+ import chalk from "chalk";
3
+ import inquirer from "inquirer";
4
+ import keytar from "keytar";
5
+ import ora from "ora";
6
+ import { resolveProviderApiKey } from "../../providers/api-key.js";
7
+ import { normalizeProviderName } from "../../providers/base.js";
8
+ import { promptForModel, promptForProvider } from "../helpers/providerPrompts.js";
9
+ import { closeHiveDatabase, getPrimaryAgent, openHiveDatabase, setMetaValue, updatePrimaryAgentModel, updatePrimaryAgentProviderAndModel, } from "../../storage/db.js";
10
+ const KEYCHAIN_SERVICE = "hive";
11
+ export function registerConfigCommand(program) {
12
+ const configCommand = program
13
+ .command("config")
14
+ .description("Update provider, model, or API keys without re-running init");
15
+ configCommand
16
+ .command("provider")
17
+ .description("Change provider, model, and API key")
18
+ .action(async () => {
19
+ await runConfigProviderCommand();
20
+ });
21
+ configCommand
22
+ .command("model")
23
+ .description("Change model for the current provider")
24
+ .action(async () => {
25
+ await runConfigModelCommand();
26
+ });
27
+ configCommand
28
+ .command("key")
29
+ .description("Update API key for the current provider")
30
+ .action(async () => {
31
+ await runConfigKeyCommand();
32
+ });
33
+ configCommand
34
+ .command("show")
35
+ .description("Show current provider, model, and key status")
36
+ .action(async () => {
37
+ await runConfigShowCommand();
38
+ });
39
+ }
40
+ export async function runConfigProviderCommand() {
41
+ const spinner = ora("Loading configuration...").start();
42
+ const db = openHiveDatabase();
43
+ try {
44
+ ensureInteractiveTerminal("`hive config provider` requires an interactive terminal.");
45
+ const agent = getPrimaryAgent(db);
46
+ if (!agent) {
47
+ spinner.stop();
48
+ console.error(chalk.red("Hive is not initialized. Run `hive init` first."));
49
+ return;
50
+ }
51
+ const currentProvider = normalizeProviderName(agent.provider);
52
+ const currentModel = agent.model;
53
+ spinner.stop();
54
+ printCurrentProviderAndModel(currentProvider, currentModel);
55
+ const provider = await promptForProvider({
56
+ defaultProvider: currentProvider,
57
+ });
58
+ const model = await promptForModel(provider, {
59
+ defaultModel: provider === currentProvider ? currentModel : undefined,
60
+ });
61
+ let apiKey;
62
+ if (provider !== "ollama") {
63
+ const answer = (await inquirer.prompt([
64
+ {
65
+ type: "password",
66
+ name: "apiKey",
67
+ message: "Enter your API key:",
68
+ mask: "*",
69
+ validate: requiredField("API key is required."),
70
+ },
71
+ ]));
72
+ apiKey = answer.apiKey.trim();
73
+ }
74
+ spinner.start("Saving configuration...");
75
+ const updatedAgent = updatePrimaryAgentProviderAndModel(db, {
76
+ provider,
77
+ model,
78
+ });
79
+ setMetaValue(db, "provider", updatedAgent.provider);
80
+ setMetaValue(db, "model", updatedAgent.model);
81
+ if (provider !== "ollama" && apiKey) {
82
+ await keytar.setPassword(KEYCHAIN_SERVICE, provider, apiKey);
83
+ }
84
+ spinner.succeed("Configuration saved.");
85
+ console.log("Provider updated. Run `hive chat` to use it.");
86
+ }
87
+ catch (error) {
88
+ if (spinner.isSpinning) {
89
+ spinner.fail("Failed to update provider configuration.");
90
+ }
91
+ throw error;
92
+ }
93
+ finally {
94
+ closeHiveDatabase(db);
95
+ }
96
+ }
97
+ export async function runConfigModelCommand() {
98
+ const spinner = ora("Loading configuration...").start();
99
+ const db = openHiveDatabase();
100
+ try {
101
+ ensureInteractiveTerminal("`hive config model` requires an interactive terminal.");
102
+ const agent = getPrimaryAgent(db);
103
+ if (!agent) {
104
+ spinner.stop();
105
+ console.error(chalk.red("Hive is not initialized. Run `hive init` first."));
106
+ return;
107
+ }
108
+ const provider = normalizeProviderName(agent.provider);
109
+ const currentModel = agent.model;
110
+ spinner.stop();
111
+ printCurrentProviderAndModel(provider, currentModel);
112
+ const model = await promptForModel(provider, {
113
+ defaultModel: currentModel,
114
+ });
115
+ spinner.start("Saving model...");
116
+ const updatedAgent = updatePrimaryAgentModel(db, model);
117
+ setMetaValue(db, "model", updatedAgent.model);
118
+ spinner.succeed("Configuration saved.");
119
+ console.log("Model updated. Run `hive chat` to use it.");
120
+ }
121
+ catch (error) {
122
+ if (spinner.isSpinning) {
123
+ spinner.fail("Failed to update model configuration.");
124
+ }
125
+ throw error;
126
+ }
127
+ finally {
128
+ closeHiveDatabase(db);
129
+ }
130
+ }
131
+ export async function runConfigKeyCommand() {
132
+ const spinner = ora("Loading configuration...").start();
133
+ const db = openHiveDatabase();
134
+ try {
135
+ ensureInteractiveTerminal("`hive config key` requires an interactive terminal.");
136
+ const agent = getPrimaryAgent(db);
137
+ if (!agent) {
138
+ spinner.stop();
139
+ console.error(chalk.red("Hive is not initialized. Run `hive init` first."));
140
+ return;
141
+ }
142
+ const provider = normalizeProviderName(agent.provider);
143
+ spinner.stop();
144
+ console.log(chalk.dim(`Current provider: ${provider}`));
145
+ const answer = (await inquirer.prompt([
146
+ {
147
+ type: "password",
148
+ name: "apiKey",
149
+ message: "Enter your API key:",
150
+ mask: "*",
151
+ validate: requiredField("API key is required."),
152
+ },
153
+ ]));
154
+ spinner.start("Saving key...");
155
+ await keytar.setPassword(KEYCHAIN_SERVICE, provider, answer.apiKey.trim());
156
+ spinner.succeed("Configuration saved.");
157
+ console.log("API key updated. Run `hive chat` to use it.");
158
+ }
159
+ catch (error) {
160
+ if (spinner.isSpinning) {
161
+ spinner.fail("Failed to update API key.");
162
+ }
163
+ throw error;
164
+ }
165
+ finally {
166
+ closeHiveDatabase(db);
167
+ }
168
+ }
169
+ export async function runConfigShowCommand() {
170
+ const db = openHiveDatabase();
171
+ try {
172
+ const agent = getPrimaryAgent(db);
173
+ if (!agent) {
174
+ console.error(chalk.red("Hive is not initialized. Run `hive init` first."));
175
+ return;
176
+ }
177
+ const provider = normalizeProviderName(agent.provider);
178
+ const keyStatus = await getKeyStatus(provider);
179
+ console.log(`Provider: ${provider}`);
180
+ console.log(`Model: ${agent.model}`);
181
+ console.log(`Agent name: ${agent.agent_name ?? "not set"}`);
182
+ console.log(`API key: ${keyStatus}`);
183
+ }
184
+ finally {
185
+ closeHiveDatabase(db);
186
+ }
187
+ }
188
+ function ensureInteractiveTerminal(errorMessage) {
189
+ if (!process.stdin.isTTY) {
190
+ throw new Error(errorMessage);
191
+ }
192
+ }
193
+ function printCurrentProviderAndModel(provider, model) {
194
+ console.log(chalk.dim(`Current provider: ${provider}`));
195
+ console.log(chalk.dim(`Current model: ${model}`));
196
+ }
197
+ async function getKeyStatus(provider) {
198
+ const apiKey = await resolveProviderApiKey(provider, apiKeyEnvVar(provider));
199
+ return apiKey ? "set" : "not set";
200
+ }
201
+ function apiKeyEnvVar(provider) {
202
+ switch (provider) {
203
+ case "openai":
204
+ return "OPENAI_API_KEY";
205
+ case "anthropic":
206
+ return "ANTHROPIC_API_KEY";
207
+ case "ollama":
208
+ return "OLLAMA_API_KEY";
209
+ case "groq":
210
+ return "GROQ_API_KEY";
211
+ case "mistral":
212
+ return "MISTRAL_API_KEY";
213
+ case "google":
214
+ return "GOOGLE_API_KEY";
215
+ case "openrouter":
216
+ return "OPENROUTER_API_KEY";
217
+ case "together":
218
+ return "TOGETHER_API_KEY";
219
+ default:
220
+ return assertNever(provider);
221
+ }
222
+ }
223
+ function requiredField(message) {
224
+ return (value) => {
225
+ if (value.trim().length > 0) {
226
+ return true;
227
+ }
228
+ return message;
229
+ };
230
+ }
231
+ function assertNever(value) {
232
+ throw new Error(`Unsupported provider: ${String(value)}`);
233
+ }
234
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Command } from "commander";
2
+ interface InitCommandOptions {
3
+ force?: boolean;
4
+ }
5
+ export declare function registerInitCommand(program: Command): void;
6
+ export declare function runInitCommand(options?: InitCommandOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,UAAU,kBAAkB;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ1D;AAED,wBAAsB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEpF"}
@@ -0,0 +1,186 @@
1
+ import process from "node:process";
2
+ import * as fs from "node:fs";
3
+ import { join } from "node:path";
4
+ import chalk from "chalk";
5
+ import inquirer from "inquirer";
6
+ import keytar from "keytar";
7
+ import ora from "ora";
8
+ import { buildDefaultPersona } from "../../agent/agent.js";
9
+ import { promptForModel, promptForProvider } from "../helpers/providerPrompts.js";
10
+ import { closeHiveDatabase, getHiveHomeDir, getPrimaryAgent, openHiveDatabase, setMetaValue, upsertPrimaryAgent, } from "../../storage/db.js";
11
+ const KEYCHAIN_SERVICE = "hive";
12
+ export function registerInitCommand(program) {
13
+ program
14
+ .command("init")
15
+ .description("Birth your local Hive agent")
16
+ .option("--force", "overwrite ~/.hive/prompts when loading prompts")
17
+ .action(async (options) => {
18
+ await runInitCommand(options);
19
+ });
20
+ }
21
+ export async function runInitCommand(options = {}) {
22
+ const spinner = ora("Preparing init...").start();
23
+ const db = openHiveDatabase();
24
+ try {
25
+ if (!process.stdin.isTTY) {
26
+ throw new Error("`hive init` requires an interactive terminal.");
27
+ }
28
+ const existing = getPrimaryAgent(db);
29
+ spinner.stop();
30
+ if (existing) {
31
+ const { reinitialize } = (await inquirer.prompt([
32
+ {
33
+ type: "confirm",
34
+ name: "reinitialize",
35
+ message: "Agent already exists. Reinitialize? (y/n)",
36
+ default: false,
37
+ },
38
+ ]));
39
+ if (!reinitialize) {
40
+ console.log(chalk.dim("Initialization cancelled."));
41
+ return;
42
+ }
43
+ }
44
+ const answers = await askInitQuestions();
45
+ spinner.start("Initializing...");
46
+ if (answers.provider !== "ollama" && answers.apiKey) {
47
+ await keytar.setPassword(KEYCHAIN_SERVICE, answers.provider, answers.apiKey);
48
+ }
49
+ const agent = upsertPrimaryAgent(db, {
50
+ name: answers.name,
51
+ provider: answers.provider,
52
+ model: answers.model,
53
+ persona: buildDefaultPersona(answers.name),
54
+ dob: answers.dob,
55
+ location: answers.location,
56
+ profession: answers.profession,
57
+ aboutRaw: answers.aboutRaw,
58
+ agentName: answers.agentName ?? null,
59
+ });
60
+ setMetaValue(db, "initialized_at", new Date().toISOString());
61
+ setMetaValue(db, "provider", agent.provider);
62
+ setMetaValue(db, "model", agent.model);
63
+ copyPromptsDirectory(options.force ?? false);
64
+ spinner.succeed("Initialization complete.");
65
+ console.log(chalk.green(`HIVE-ID: ${agent.id}`));
66
+ if (agent.agent_name) {
67
+ console.log(chalk.green(`Agent name: ${agent.agent_name}`));
68
+ }
69
+ console.log(chalk.green(`Provider: ${agent.provider}`));
70
+ console.log(chalk.green(`Model: ${agent.model}`));
71
+ console.log("Run `hive chat` to start talking.");
72
+ }
73
+ catch (error) {
74
+ if (spinner.isSpinning) {
75
+ spinner.fail("Hive initialization failed.");
76
+ }
77
+ throw error;
78
+ }
79
+ finally {
80
+ closeHiveDatabase(db);
81
+ }
82
+ }
83
+ async function askInitQuestions() {
84
+ const { name } = (await inquirer.prompt([
85
+ {
86
+ type: "input",
87
+ name: "name",
88
+ message: "What's your name?",
89
+ validate: requiredField("Name is required."),
90
+ },
91
+ ]));
92
+ const { dob } = (await inquirer.prompt([
93
+ {
94
+ type: "input",
95
+ name: "dob",
96
+ message: "Date of birth? (DD/MM/YYYY)",
97
+ validate: (value) => /^\d{2}\/\d{2}\/\d{4}$/.test(value.trim()) || "Use DD/MM/YYYY format.",
98
+ },
99
+ ]));
100
+ const { location } = (await inquirer.prompt([
101
+ {
102
+ type: "input",
103
+ name: "location",
104
+ message: "Where are you based?",
105
+ validate: requiredField("Location is required."),
106
+ },
107
+ ]));
108
+ const { profession } = (await inquirer.prompt([
109
+ {
110
+ type: "input",
111
+ name: "profession",
112
+ message: "What do you do?",
113
+ validate: requiredField("Profession is required."),
114
+ },
115
+ ]));
116
+ const { aboutRaw } = (await inquirer.prompt([
117
+ {
118
+ type: "input",
119
+ name: "aboutRaw",
120
+ message: "Tell me about yourself. Who you are, what you're building, what matters to you. No rules.",
121
+ validate: requiredField("About is required."),
122
+ },
123
+ ]));
124
+ const provider = await promptForProvider();
125
+ const model = await promptForModel(provider);
126
+ let apiKey;
127
+ if (provider !== "ollama") {
128
+ const answer = (await inquirer.prompt([
129
+ {
130
+ type: "password",
131
+ name: "apiKey",
132
+ message: "Enter your API key:",
133
+ mask: "*",
134
+ validate: requiredField("API key is required."),
135
+ },
136
+ ]));
137
+ apiKey = answer.apiKey.trim();
138
+ }
139
+ const { agentName } = (await inquirer.prompt([
140
+ {
141
+ type: "input",
142
+ name: "agentName",
143
+ message: "What do you want to call your agent? (optional)",
144
+ },
145
+ ]));
146
+ return {
147
+ name: name.trim(),
148
+ dob: dob.trim(),
149
+ location: location.trim(),
150
+ profession: profession.trim(),
151
+ aboutRaw,
152
+ provider,
153
+ model,
154
+ apiKey,
155
+ agentName: normalizeOptional(agentName),
156
+ };
157
+ }
158
+ function requiredField(message) {
159
+ return (value) => {
160
+ if (value.trim().length > 0) {
161
+ return true;
162
+ }
163
+ return message;
164
+ };
165
+ }
166
+ function normalizeOptional(value) {
167
+ const trimmed = value.trim();
168
+ return trimmed.length > 0 ? trimmed : undefined;
169
+ }
170
+ function copyPromptsDirectory(force) {
171
+ const sourcePath = join(process.cwd(), "prompts");
172
+ const destinationPath = join(getHiveHomeDir(), "prompts");
173
+ if (!fs.existsSync(sourcePath)) {
174
+ console.warn(chalk.yellow("Warning: prompts/ folder not found. Skipping prompts load."));
175
+ return;
176
+ }
177
+ if (fs.existsSync(destinationPath)) {
178
+ if (!force) {
179
+ return;
180
+ }
181
+ fs.rmSync(destinationPath, { recursive: true, force: true });
182
+ }
183
+ fs.cpSync(sourcePath, destinationPath, { recursive: true });
184
+ console.log("Prompts loaded → ~/.hive/prompts/");
185
+ }
186
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ export declare function registerNukeCommand(program: Command): void;
3
+ export declare function runNukeCommand(): Promise<void>;
4
+ //# sourceMappingURL=nuke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuke.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/nuke.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO1D;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCpD"}
@@ -0,0 +1,47 @@
1
+ import * as fs from "node:fs";
2
+ import { stdin, stdout } from "node:process";
3
+ import { createInterface } from "node:readline/promises";
4
+ import chalk from "chalk";
5
+ import keytar from "keytar";
6
+ import { SUPPORTED_PROVIDER_NAMES } from "../../providers/base.js";
7
+ import { getHiveHomeDir } from "../../storage/db.js";
8
+ const KEYCHAIN_SERVICE = "hive";
9
+ const NUKE_CONFIRMATION = "nuke";
10
+ export function registerNukeCommand(program) {
11
+ program
12
+ .command("nuke")
13
+ .description("Permanently delete your local Hive data and keys")
14
+ .action(async () => {
15
+ await runNukeCommand();
16
+ });
17
+ }
18
+ export async function runNukeCommand() {
19
+ console.log(chalk.red("This will permanently delete your agent, all memory, all conversations, and all keys. This cannot be undone."));
20
+ const rl = createInterface({
21
+ input: stdin,
22
+ output: stdout,
23
+ terminal: true,
24
+ });
25
+ let confirmation = "";
26
+ try {
27
+ confirmation = (await rl.question('Are you sure? Type "nuke" to confirm: ')).trim();
28
+ }
29
+ finally {
30
+ rl.close();
31
+ }
32
+ if (confirmation !== NUKE_CONFIRMATION) {
33
+ console.log(chalk.dim("Aborted."));
34
+ return;
35
+ }
36
+ fs.rmSync(getHiveHomeDir(), { recursive: true, force: true });
37
+ for (const providerName of SUPPORTED_PROVIDER_NAMES) {
38
+ try {
39
+ await keytar.deletePassword(KEYCHAIN_SERVICE, providerName);
40
+ }
41
+ catch {
42
+ // Missing or inaccessible keychain entries are non-fatal for nuke.
43
+ }
44
+ }
45
+ console.log(chalk.green("The Hive has been nuked. Gone."));
46
+ }
47
+ //# sourceMappingURL=nuke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuke.js","sourceRoot":"","sources":["../../../src/cli/commands/nuke.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,8GAA8G,CAC/G,CACF,CAAC;IAEF,MAAM,EAAE,GAAG,eAAe,CAAC;QACzB,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,YAAY,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtF,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IAED,IAAI,YAAY,KAAK,iBAAiB,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9D,KAAK,MAAM,YAAY,IAAI,wBAAwB,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,cAAc,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;QACrE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ export declare function registerStatusCommand(program: Command): void;
3
+ export declare function runStatusCommand(): Promise<void>;
4
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO5D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCtD"}
@@ -0,0 +1,114 @@
1
+ import * as fs from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import chalk from "chalk";
5
+ import keytar from "keytar";
6
+ import { closeHiveDatabase, getHiveDatabasePath, getHiveHomeDir, getMetaValue, getPrimaryAgent, openHiveDatabase, } from "../../storage/db.js";
7
+ const KEYCHAIN_SERVICE = "hive";
8
+ const PROMPTS_DIRECTORY = "prompts";
9
+ export function registerStatusCommand(program) {
10
+ program
11
+ .command("status")
12
+ .description("Show Hive setup status")
13
+ .action(async () => {
14
+ await runStatusCommand();
15
+ });
16
+ }
17
+ export async function runStatusCommand() {
18
+ const db = openHiveDatabase();
19
+ try {
20
+ const agent = getPrimaryAgent(db);
21
+ if (!agent) {
22
+ console.log("Hive is not initialized. Run `hive init` to get started.");
23
+ return;
24
+ }
25
+ const provider = agent.provider;
26
+ const keyStatus = await getApiKeyStatus(provider);
27
+ const dbPath = getHiveDatabasePath();
28
+ const promptsPath = join(getHiveHomeDir(), PROMPTS_DIRECTORY);
29
+ const dbSizeBytes = getFileSize(dbPath);
30
+ const promptFiles = countFiles(promptsPath);
31
+ const initializedRaw = getMetaValue(db, "initialized_at") ?? agent.created_at;
32
+ console.log(chalk.whiteBright("🐝 The Hive — Status"));
33
+ console.log();
34
+ printStatusLine("Agent", agent.agent_name ?? "not set");
35
+ printStatusLine("Owner", agent.name);
36
+ printStatusLine("Provider", provider);
37
+ printStatusLine("Model", agent.model);
38
+ printStatusLine("API Key", keyStatus);
39
+ console.log();
40
+ printStatusLine("Database", `${displayPath(dbPath)} (${formatBytes(dbSizeBytes)})`);
41
+ printStatusLine("Prompts", `${ensureTrailingSlash(displayPath(promptsPath))} (${promptFiles} files)`);
42
+ console.log();
43
+ printStatusLine("Initialized", formatDate(initializedRaw));
44
+ }
45
+ finally {
46
+ closeHiveDatabase(db);
47
+ }
48
+ }
49
+ async function getApiKeyStatus(providerName) {
50
+ let key = null;
51
+ try {
52
+ key = await keytar.getPassword(KEYCHAIN_SERVICE, providerName);
53
+ }
54
+ catch {
55
+ key = null;
56
+ }
57
+ return key && key.trim().length > 0 ? "set ✓" : "not set ✗";
58
+ }
59
+ function printStatusLine(label, value) {
60
+ const paddedLabel = `${label}:`.padEnd(10, " ");
61
+ console.log(`${chalk.dim(paddedLabel)} ${chalk.whiteBright(value)}`);
62
+ }
63
+ function getFileSize(path) {
64
+ try {
65
+ return fs.statSync(path).size;
66
+ }
67
+ catch {
68
+ return 0;
69
+ }
70
+ }
71
+ function countFiles(path) {
72
+ try {
73
+ return fs
74
+ .readdirSync(path, { withFileTypes: true })
75
+ .filter((entry) => entry.isFile()).length;
76
+ }
77
+ catch {
78
+ return 0;
79
+ }
80
+ }
81
+ function formatBytes(bytes) {
82
+ const units = ["B", "KB", "MB", "GB", "TB"];
83
+ let unitIndex = 0;
84
+ let value = bytes;
85
+ while (value >= 1024 && unitIndex < units.length - 1) {
86
+ value /= 1024;
87
+ unitIndex += 1;
88
+ }
89
+ if (unitIndex === 0) {
90
+ return `${value} ${units[unitIndex]}`;
91
+ }
92
+ return `${value.toFixed(1)} ${units[unitIndex]}`;
93
+ }
94
+ function formatDate(value) {
95
+ const date = new Date(value);
96
+ if (Number.isNaN(date.getTime())) {
97
+ return value;
98
+ }
99
+ return date.toISOString().slice(0, 10);
100
+ }
101
+ function displayPath(path) {
102
+ const home = homedir();
103
+ if (path === home) {
104
+ return "~";
105
+ }
106
+ if (path.startsWith(`${home}/`)) {
107
+ return `~/${path.slice(home.length + 1)}`;
108
+ }
109
+ return path;
110
+ }
111
+ function ensureTrailingSlash(path) {
112
+ return path.endsWith("/") ? path : `${path}/`;
113
+ }
114
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}