@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,13 @@
1
+ import { type ProviderName } from "../../providers/base.js";
2
+ interface PromptForProviderOptions {
3
+ message?: string;
4
+ defaultProvider?: ProviderName;
5
+ }
6
+ interface PromptForModelOptions {
7
+ message?: string;
8
+ defaultModel?: string;
9
+ }
10
+ export declare function promptForProvider(options?: PromptForProviderOptions): Promise<ProviderName>;
11
+ export declare function promptForModel(provider: ProviderName, options?: PromptForModelOptions): Promise<string>;
12
+ export {};
13
+ //# sourceMappingURL=providerPrompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerPrompts.d.ts","sourceRoot":"","sources":["../../../src/cli/helpers/providerPrompts.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAmCtF,UAAU,wBAAwB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,YAAY,CAAC;CAChC;AAED,UAAU,qBAAqB;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,YAAY,CAAC,CAevB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,CAmEjB"}
@@ -0,0 +1,138 @@
1
+ import inquirer from "inquirer";
2
+ import fetch from "node-fetch";
3
+ import { SUPPORTED_PROVIDER_NAMES } from "../../providers/base.js";
4
+ const OLLAMA_TAGS_URL = "http://localhost:11434/api/tags";
5
+ const MODEL_CHOICES_BY_PROVIDER = {
6
+ openai: ["gpt-4o", "gpt-4o-mini", "o1"],
7
+ anthropic: [
8
+ "claude-opus-4-6",
9
+ "claude-sonnet-4-6",
10
+ "claude-haiku-4-5-20251001",
11
+ ],
12
+ groq: ["llama-3.3-70b-versatile", "llama-3.1-8b-instant", "mixtral-8x7b-32768"],
13
+ mistral: ["mistral-large-latest", "mistral-small-latest", "codestral-latest"],
14
+ google: ["gemini-2.0-flash", "gemini-2.0-flash-lite", "gemini-2.0-pro-exp-02-05"],
15
+ openrouter: [
16
+ "openai/gpt-4o-mini",
17
+ "anthropic/claude-3.5-sonnet",
18
+ "google/gemini-2.0-flash-001",
19
+ ],
20
+ together: [
21
+ "meta-llama/Llama-3.3-70B-Instruct-Turbo",
22
+ "meta-llama/Llama-3.1-8B-Instruct-Turbo",
23
+ "Qwen/Qwen2.5-Coder-32B-Instruct",
24
+ ],
25
+ };
26
+ export async function promptForProvider(options = {}) {
27
+ const answer = (await inquirer.prompt([
28
+ {
29
+ type: "list",
30
+ name: "provider",
31
+ message: options.message ?? "Choose a provider",
32
+ choices: SUPPORTED_PROVIDER_NAMES.map((value) => ({
33
+ name: value,
34
+ value,
35
+ })),
36
+ default: options.defaultProvider,
37
+ },
38
+ ]));
39
+ return answer.provider;
40
+ }
41
+ export async function promptForModel(provider, options = {}) {
42
+ const promptMessage = options.message ?? "Choose a model";
43
+ if (provider === "ollama") {
44
+ const ollamaModels = await fetchOllamaModels();
45
+ if (ollamaModels && ollamaModels.length > 0) {
46
+ const defaultSelection = options.defaultModel && ollamaModels.includes(options.defaultModel)
47
+ ? [options.defaultModel]
48
+ : undefined;
49
+ const answer = (await inquirer.prompt([
50
+ {
51
+ type: "checkbox",
52
+ name: "model",
53
+ message: promptMessage,
54
+ choices: ollamaModels.map((value) => ({
55
+ name: value,
56
+ value,
57
+ })),
58
+ default: defaultSelection,
59
+ validate: (values) => values.length === 1 || "Select exactly one model.",
60
+ },
61
+ ]));
62
+ return answer.model[0];
63
+ }
64
+ const fallbackMessage = ollamaModels === null
65
+ ? "Ollama not detected. Enter model name manually:"
66
+ : "No local Ollama models found. Enter model name manually:";
67
+ const answer = (await inquirer.prompt([
68
+ {
69
+ type: "input",
70
+ name: "model",
71
+ message: fallbackMessage,
72
+ validate: requiredField("Model is required."),
73
+ },
74
+ ]));
75
+ return answer.model.trim();
76
+ }
77
+ const modelChoices = MODEL_CHOICES_BY_PROVIDER[provider];
78
+ const defaultModel = options.defaultModel && modelChoices.includes(options.defaultModel)
79
+ ? options.defaultModel
80
+ : undefined;
81
+ const answer = (await inquirer.prompt([
82
+ {
83
+ type: "list",
84
+ name: "model",
85
+ message: promptMessage,
86
+ choices: modelChoices.map((value) => ({
87
+ name: value,
88
+ value,
89
+ })),
90
+ default: defaultModel,
91
+ },
92
+ ]));
93
+ return answer.model;
94
+ }
95
+ async function fetchOllamaModels() {
96
+ const controller = new AbortController();
97
+ const timeout = setTimeout(() => {
98
+ controller.abort();
99
+ }, 1000);
100
+ try {
101
+ const response = await fetch(OLLAMA_TAGS_URL, {
102
+ signal: controller.signal,
103
+ });
104
+ if (!response.ok) {
105
+ return null;
106
+ }
107
+ const payload = (await response.json());
108
+ if (!Array.isArray(payload.models)) {
109
+ return [];
110
+ }
111
+ return Array.from(new Set(payload.models
112
+ .map((entry) => {
113
+ if (typeof entry.name === "string" && entry.name.trim().length > 0) {
114
+ return entry.name.trim();
115
+ }
116
+ if (typeof entry.model === "string" && entry.model.trim().length > 0) {
117
+ return entry.model.trim();
118
+ }
119
+ return "";
120
+ })
121
+ .filter((value) => value.length > 0)));
122
+ }
123
+ catch {
124
+ return null;
125
+ }
126
+ finally {
127
+ clearTimeout(timeout);
128
+ }
129
+ }
130
+ function requiredField(message) {
131
+ return (value) => {
132
+ if (value.trim().length > 0) {
133
+ return true;
134
+ }
135
+ return message;
136
+ };
137
+ }
138
+ //# sourceMappingURL=providerPrompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerPrompts.js","sourceRoot":"","sources":["../../../src/cli/helpers/providerPrompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "dotenv/config";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC"}
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env node
2
+ import "dotenv/config";
3
+ import chalk from "chalk";
4
+ import { Command } from "commander";
5
+ import { registerChatCommand } from "./commands/chat.js";
6
+ import { registerConfigCommand } from "./commands/config.js";
7
+ import { registerInitCommand } from "./commands/init.js";
8
+ import { registerNukeCommand } from "./commands/nuke.js";
9
+ import { registerStatusCommand } from "./commands/status.js";
10
+ const program = new Command();
11
+ program
12
+ .name("hive")
13
+ .description("Your agent. Always running. Always learning. Always working.")
14
+ .version("0.1.0");
15
+ registerInitCommand(program);
16
+ registerChatCommand(program);
17
+ registerConfigCommand(program);
18
+ registerStatusCommand(program);
19
+ registerNukeCommand(program);
20
+ program
21
+ .parseAsync(process.argv)
22
+ .catch((error) => {
23
+ if (error instanceof Error) {
24
+ console.error(chalk.red(error.message));
25
+ process.exitCode = 1;
26
+ return;
27
+ }
28
+ console.error(chalk.red(String(error)));
29
+ process.exitCode = 1;
30
+ });
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC;AAEvB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,OAAO;KACJ,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;KACxB,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACxB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type Provider, type StreamChatRequest } from "./base.js";
2
+ export declare class AnthropicProvider implements Provider {
3
+ readonly name: "anthropic";
4
+ readonly defaultModel: string;
5
+ private readonly apiKey?;
6
+ constructor(apiKey?: string);
7
+ streamChat(request: StreamChatRequest): AsyncGenerator<string>;
8
+ }
9
+ export declare function createAnthropicProvider(): Promise<AnthropicProvider>;
10
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,QAAQ,EAEb,KAAK,iBAAiB,EACvB,MAAM,WAAW,CAAC;AAUnB,qBAAa,iBAAkB,YAAW,QAAQ;IAChD,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;gBAErB,MAAM,CAAC,EAAE,MAAM;IAKpB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAAC;CAgEtE;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAG1E"}
@@ -0,0 +1,108 @@
1
+ import fetch from "node-fetch";
2
+ import { resolveProviderApiKey } from "./api-key.js";
3
+ import { ProviderConfigurationError, ProviderRequestError, iterateSseData, } from "./base.js";
4
+ const ANTHROPIC_API_URL = "https://api.anthropic.com/v1/messages";
5
+ const DEFAULT_ANTHROPIC_MODEL = "claude-3-5-haiku-latest";
6
+ export class AnthropicProvider {
7
+ name = "anthropic";
8
+ defaultModel;
9
+ apiKey;
10
+ constructor(apiKey) {
11
+ this.apiKey = apiKey;
12
+ this.defaultModel = process.env.ANTHROPIC_MODEL ?? DEFAULT_ANTHROPIC_MODEL;
13
+ }
14
+ async *streamChat(request) {
15
+ if (!this.apiKey) {
16
+ throw new ProviderConfigurationError('Provider "anthropic" is missing ANTHROPIC_API_KEY.');
17
+ }
18
+ const system = request.messages
19
+ .filter((message) => message.role === "system")
20
+ .map((message) => message.content)
21
+ .join("\n\n");
22
+ const messages = toAnthropicMessages(request.messages);
23
+ const response = await fetch(ANTHROPIC_API_URL, {
24
+ method: "POST",
25
+ headers: {
26
+ "content-type": "application/json",
27
+ "x-api-key": this.apiKey,
28
+ "anthropic-version": "2023-06-01",
29
+ },
30
+ body: JSON.stringify({
31
+ model: request.model ?? this.defaultModel,
32
+ stream: true,
33
+ max_tokens: request.maxTokens ?? 1024,
34
+ temperature: request.temperature,
35
+ system: system.length > 0 ? system : undefined,
36
+ messages,
37
+ }),
38
+ });
39
+ if (!response.ok) {
40
+ const bodyText = await response.text();
41
+ throw new ProviderRequestError(`anthropic request failed: HTTP ${response.status} ${response.statusText} ${bodyText}`);
42
+ }
43
+ for await (const data of iterateSseData(response)) {
44
+ if (data === "[DONE]") {
45
+ return;
46
+ }
47
+ const payload = parseJson(data);
48
+ if (!payload) {
49
+ continue;
50
+ }
51
+ if (payload.type === "error") {
52
+ const error = payload.error;
53
+ const message = typeof error?.message === "string"
54
+ ? error.message
55
+ : "anthropic stream error";
56
+ throw new ProviderRequestError(message);
57
+ }
58
+ const text = pickAnthropicDelta(payload);
59
+ if (text.length > 0) {
60
+ yield text;
61
+ }
62
+ }
63
+ }
64
+ }
65
+ export async function createAnthropicProvider() {
66
+ const apiKey = await resolveProviderApiKey("anthropic", "ANTHROPIC_API_KEY");
67
+ return new AnthropicProvider(apiKey);
68
+ }
69
+ function toAnthropicMessages(messages) {
70
+ const filtered = messages.filter((message) => message.role !== "system");
71
+ if (filtered.length === 0) {
72
+ return [{ role: "user", content: "Hello." }];
73
+ }
74
+ return filtered.map((message) => ({
75
+ role: message.role === "assistant" ? "assistant" : "user",
76
+ content: message.content,
77
+ }));
78
+ }
79
+ function pickAnthropicDelta(payload) {
80
+ if (payload.type === "content_block_start") {
81
+ const contentBlock = payload.content_block;
82
+ if (contentBlock?.type === "text" && typeof contentBlock.text === "string") {
83
+ return contentBlock.text;
84
+ }
85
+ }
86
+ if (payload.type === "content_block_delta") {
87
+ const delta = payload.delta;
88
+ if (delta?.type === "text_delta" && typeof delta.text === "string") {
89
+ return delta.text;
90
+ }
91
+ }
92
+ if (payload.type === "message_delta") {
93
+ const delta = payload.delta;
94
+ if (typeof delta?.text === "string") {
95
+ return delta.text;
96
+ }
97
+ }
98
+ return "";
99
+ }
100
+ function parseJson(value) {
101
+ try {
102
+ return JSON.parse(value);
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ }
108
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ProviderName } from "./base.js";
2
+ export declare function resolveProviderApiKey(providerName: ProviderName, envVarName: string): Promise<string | undefined>;
3
+ //# sourceMappingURL=api-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.d.ts","sourceRoot":"","sources":["../../src/providers/api-key.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAI9C,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAa7B"}
@@ -0,0 +1,15 @@
1
+ import keytar from "keytar";
2
+ const KEYCHAIN_SERVICE = "hive";
3
+ export async function resolveProviderApiKey(providerName, envVarName) {
4
+ let keychainValue = null;
5
+ try {
6
+ keychainValue = await keytar.getPassword(KEYCHAIN_SERVICE, providerName);
7
+ }
8
+ catch {
9
+ keychainValue = null;
10
+ }
11
+ return (keychainValue ??
12
+ process.env[envVarName] ??
13
+ undefined);
14
+ }
15
+ //# sourceMappingURL=api-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.js","sourceRoot":"","sources":["../../src/providers/api-key.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAI5B,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,YAA0B,EAC1B,UAAkB;IAElB,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,OAAO,CACL,aAAa;QACb,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QACvB,SAAS,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { type Response } from "node-fetch";
2
+ export declare const SUPPORTED_PROVIDER_NAMES: readonly ["openai", "anthropic", "ollama", "groq", "mistral", "google", "openrouter", "together"];
3
+ export type ProviderName = (typeof SUPPORTED_PROVIDER_NAMES)[number];
4
+ export type ProviderMessageRole = "system" | "user" | "assistant";
5
+ export interface ProviderMessage {
6
+ role: ProviderMessageRole;
7
+ content: string;
8
+ }
9
+ export interface StreamChatRequest {
10
+ messages: ProviderMessage[];
11
+ model?: string;
12
+ temperature?: number;
13
+ maxTokens?: number;
14
+ }
15
+ export interface Provider {
16
+ readonly name: ProviderName;
17
+ readonly defaultModel: string;
18
+ streamChat(request: StreamChatRequest): AsyncGenerator<string>;
19
+ }
20
+ export declare class ProviderConfigurationError extends Error {
21
+ constructor(message: string);
22
+ }
23
+ export declare class ProviderRequestError extends Error {
24
+ constructor(message: string);
25
+ }
26
+ export interface OpenAICompatibleStreamInput {
27
+ provider: ProviderName;
28
+ baseUrl: string;
29
+ apiKey?: string;
30
+ model: string;
31
+ messages: ProviderMessage[];
32
+ temperature?: number;
33
+ maxTokens?: number;
34
+ extraHeaders?: Record<string, string>;
35
+ extraBody?: Record<string, unknown>;
36
+ }
37
+ export declare function normalizeProviderName(raw?: string): ProviderName;
38
+ export declare function streamOpenAICompatibleChat(input: OpenAICompatibleStreamInput): AsyncGenerator<string>;
39
+ export declare function iterateSseData(response: Response): AsyncGenerator<string>;
40
+ export declare function chunkText(text: string, chunkSize?: number): AsyncGenerator<string>;
41
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAElD,eAAO,MAAM,wBAAwB,mGAS3B,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AACrE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;CAChE;AAED,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,wBAAgB,qBAAqB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAahE;AAED,wBAAuB,0BAA0B,CAC/C,KAAK,EAAE,2BAA2B,GACjC,cAAc,CAAC,MAAM,CAAC,CAqExB;AAED,wBAAuB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CA4BhF;AAED,wBAAuB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAIrF"}
@@ -0,0 +1,157 @@
1
+ import fetch from "node-fetch";
2
+ export const SUPPORTED_PROVIDER_NAMES = [
3
+ "openai",
4
+ "anthropic",
5
+ "ollama",
6
+ "groq",
7
+ "mistral",
8
+ "google",
9
+ "openrouter",
10
+ "together",
11
+ ];
12
+ export class ProviderConfigurationError extends Error {
13
+ constructor(message) {
14
+ super(message);
15
+ this.name = "ProviderConfigurationError";
16
+ }
17
+ }
18
+ export class ProviderRequestError extends Error {
19
+ constructor(message) {
20
+ super(message);
21
+ this.name = "ProviderRequestError";
22
+ }
23
+ }
24
+ export function normalizeProviderName(raw) {
25
+ if (!raw) {
26
+ return "openai";
27
+ }
28
+ const normalized = raw.trim().toLowerCase();
29
+ if (SUPPORTED_PROVIDER_NAMES.includes(normalized)) {
30
+ return normalized;
31
+ }
32
+ throw new ProviderConfigurationError(`Unsupported provider \"${raw}\". Supported providers: ${SUPPORTED_PROVIDER_NAMES.join(", ")}.`);
33
+ }
34
+ export async function* streamOpenAICompatibleChat(input) {
35
+ const endpoint = `${input.baseUrl.replace(/\/$/, "")}/chat/completions`;
36
+ const headers = {
37
+ "content-type": "application/json",
38
+ ...(input.extraHeaders ?? {}),
39
+ };
40
+ if (input.apiKey) {
41
+ headers.authorization = `Bearer ${input.apiKey}`;
42
+ }
43
+ const body = {
44
+ model: input.model,
45
+ messages: input.messages,
46
+ stream: true,
47
+ ...(input.extraBody ?? {}),
48
+ };
49
+ if (input.temperature !== undefined) {
50
+ body.temperature = input.temperature;
51
+ }
52
+ if (input.maxTokens !== undefined) {
53
+ body.max_tokens = input.maxTokens;
54
+ }
55
+ const response = await fetch(endpoint, {
56
+ method: "POST",
57
+ headers,
58
+ body: JSON.stringify(body),
59
+ });
60
+ await ensureOk(response, `${input.provider} request failed`);
61
+ for await (const data of iterateSseData(response)) {
62
+ if (data === "[DONE]") {
63
+ return;
64
+ }
65
+ const payload = parseJson(data);
66
+ if (!payload) {
67
+ continue;
68
+ }
69
+ const errorMessage = pickErrorMessage(payload);
70
+ if (errorMessage) {
71
+ throw new ProviderRequestError(`${input.provider} error: ${errorMessage}`);
72
+ }
73
+ const maybeChoices = payload.choices;
74
+ if (!Array.isArray(maybeChoices) || maybeChoices.length === 0) {
75
+ continue;
76
+ }
77
+ const firstChoice = maybeChoices[0];
78
+ const delta = firstChoice.delta;
79
+ const text = typeof delta?.content === "string"
80
+ ? delta.content
81
+ : typeof firstChoice.text === "string"
82
+ ? firstChoice.text
83
+ : "";
84
+ if (text.length > 0) {
85
+ yield text;
86
+ }
87
+ }
88
+ }
89
+ export async function* iterateSseData(response) {
90
+ if (!response.body) {
91
+ return;
92
+ }
93
+ let buffer = "";
94
+ for await (const chunk of response.body) {
95
+ buffer += chunk.toString("utf8").replace(/\r\n/g, "\n");
96
+ let eventBoundary = buffer.indexOf("\n\n");
97
+ while (eventBoundary !== -1) {
98
+ const rawEvent = buffer.slice(0, eventBoundary);
99
+ buffer = buffer.slice(eventBoundary + 2);
100
+ const data = parseSseData(rawEvent);
101
+ if (data !== null) {
102
+ yield data;
103
+ }
104
+ eventBoundary = buffer.indexOf("\n\n");
105
+ }
106
+ }
107
+ const remaining = parseSseData(buffer);
108
+ if (remaining !== null) {
109
+ yield remaining;
110
+ }
111
+ }
112
+ export async function* chunkText(text, chunkSize = 32) {
113
+ for (let start = 0; start < text.length; start += chunkSize) {
114
+ yield text.slice(start, start + chunkSize);
115
+ }
116
+ }
117
+ function parseSseData(rawEvent) {
118
+ const lines = rawEvent
119
+ .split("\n")
120
+ .map((line) => line.trimEnd())
121
+ .filter((line) => line.startsWith("data:"))
122
+ .map((line) => line.slice(5).trimStart());
123
+ if (lines.length === 0) {
124
+ return null;
125
+ }
126
+ return lines.join("\n").trim();
127
+ }
128
+ function parseJson(value) {
129
+ try {
130
+ return JSON.parse(value);
131
+ }
132
+ catch {
133
+ return null;
134
+ }
135
+ }
136
+ function pickErrorMessage(payload) {
137
+ const maybeError = payload.error;
138
+ if (typeof maybeError === "string") {
139
+ return maybeError;
140
+ }
141
+ if (maybeError && typeof maybeError === "object") {
142
+ const message = maybeError.message;
143
+ if (typeof message === "string") {
144
+ return message;
145
+ }
146
+ }
147
+ return null;
148
+ }
149
+ async function ensureOk(response, fallbackMessage) {
150
+ if (response.ok) {
151
+ return;
152
+ }
153
+ const bodyText = (await response.text()).trim();
154
+ const details = bodyText.length > 0 ? ` ${bodyText}` : "";
155
+ throw new ProviderRequestError(`${fallbackMessage}: HTTP ${response.status} ${response.statusText}${details}`);
156
+ }
157
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { OpenAICompatibleProvider } from "./openai-compatible.js";
2
+ export declare class GoogleProvider extends OpenAICompatibleProvider {
3
+ constructor(apiKey?: string);
4
+ }
5
+ export declare function createGoogleProvider(): Promise<GoogleProvider>;
6
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAKlE,qBAAa,cAAe,SAAQ,wBAAwB;gBAC9C,MAAM,CAAC,EAAE,MAAM;CAQ5B;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC,CAGpE"}
@@ -0,0 +1,19 @@
1
+ import { resolveProviderApiKey } from "./api-key.js";
2
+ import { OpenAICompatibleProvider } from "./openai-compatible.js";
3
+ const DEFAULT_GOOGLE_BASE_URL = "https://generativelanguage.googleapis.com/v1beta/openai";
4
+ const DEFAULT_GOOGLE_MODEL = "gemini-3.0-flash";
5
+ export class GoogleProvider extends OpenAICompatibleProvider {
6
+ constructor(apiKey) {
7
+ super({
8
+ name: "google",
9
+ baseUrl: process.env.GOOGLE_BASE_URL ?? DEFAULT_GOOGLE_BASE_URL,
10
+ apiKey,
11
+ defaultModel: process.env.GOOGLE_MODEL ?? DEFAULT_GOOGLE_MODEL,
12
+ });
13
+ }
14
+ }
15
+ export async function createGoogleProvider() {
16
+ const apiKey = await resolveProviderApiKey("google", "GOOGLE_API_KEY");
17
+ return new GoogleProvider(apiKey);
18
+ }
19
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,uBAAuB,GAAG,yDAAyD,CAAC;AAC1F,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEhD,MAAM,OAAO,cAAe,SAAQ,wBAAwB;IAC1D,YAAY,MAAe;QACzB,KAAK,CAAC;YACJ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,uBAAuB;YAC/D,MAAM;YACN,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,oBAAoB;SAC/D,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IACvE,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { OpenAICompatibleProvider } from "./openai-compatible.js";
2
+ export declare class GroqProvider extends OpenAICompatibleProvider {
3
+ constructor(apiKey?: string);
4
+ }
5
+ export declare function createGroqProvider(): Promise<GroqProvider>;
6
+ //# sourceMappingURL=groq.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groq.d.ts","sourceRoot":"","sources":["../../src/providers/groq.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAKlE,qBAAa,YAAa,SAAQ,wBAAwB;gBAC5C,MAAM,CAAC,EAAE,MAAM;CAQ5B;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC,CAGhE"}