@sunilp-org/jam-cli 0.1.0 → 0.1.2

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 (110) hide show
  1. package/README.md +431 -63
  2. package/dist/commands/ask.d.ts +4 -0
  3. package/dist/commands/ask.d.ts.map +1 -1
  4. package/dist/commands/ask.js +202 -10
  5. package/dist/commands/ask.js.map +1 -1
  6. package/dist/commands/commit.d.ts +12 -0
  7. package/dist/commands/commit.d.ts.map +1 -0
  8. package/dist/commands/commit.js +135 -0
  9. package/dist/commands/commit.js.map +1 -0
  10. package/dist/commands/config.d.ts.map +1 -1
  11. package/dist/commands/config.js +2 -1
  12. package/dist/commands/config.js.map +1 -1
  13. package/dist/commands/context.d.ts +12 -0
  14. package/dist/commands/context.d.ts.map +1 -0
  15. package/dist/commands/context.js +52 -0
  16. package/dist/commands/context.js.map +1 -0
  17. package/dist/commands/review.d.ts +25 -0
  18. package/dist/commands/review.d.ts.map +1 -0
  19. package/dist/commands/review.js +117 -0
  20. package/dist/commands/review.js.map +1 -0
  21. package/dist/commands/run.d.ts +1 -0
  22. package/dist/commands/run.d.ts.map +1 -1
  23. package/dist/commands/run.js +199 -197
  24. package/dist/commands/run.js.map +1 -1
  25. package/dist/config/loader.d.ts.map +1 -1
  26. package/dist/config/loader.js +39 -3
  27. package/dist/config/loader.js.map +1 -1
  28. package/dist/index.js +63 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/providers/base.d.ts +26 -0
  31. package/dist/providers/base.d.ts.map +1 -1
  32. package/dist/providers/embedded.d.ts +20 -0
  33. package/dist/providers/embedded.d.ts.map +1 -0
  34. package/dist/providers/embedded.js +302 -0
  35. package/dist/providers/embedded.js.map +1 -0
  36. package/dist/providers/factory.d.ts.map +1 -1
  37. package/dist/providers/factory.js +25 -1
  38. package/dist/providers/factory.js.map +1 -1
  39. package/dist/providers/groq.d.ts +16 -0
  40. package/dist/providers/groq.d.ts.map +1 -0
  41. package/dist/providers/groq.js +23 -0
  42. package/dist/providers/groq.js.map +1 -0
  43. package/dist/providers/ollama.d.ts +6 -1
  44. package/dist/providers/ollama.d.ts.map +1 -1
  45. package/dist/providers/ollama.js +77 -4
  46. package/dist/providers/ollama.js.map +1 -1
  47. package/dist/providers/openai.d.ts +18 -0
  48. package/dist/providers/openai.d.ts.map +1 -0
  49. package/dist/providers/openai.js +229 -0
  50. package/dist/providers/openai.js.map +1 -0
  51. package/dist/tools/all-tools.d.ts +18 -0
  52. package/dist/tools/all-tools.d.ts.map +1 -0
  53. package/dist/tools/all-tools.js +95 -0
  54. package/dist/tools/all-tools.js.map +1 -0
  55. package/dist/tools/apply_patch.js +1 -1
  56. package/dist/tools/apply_patch.js.map +1 -1
  57. package/dist/tools/context-tools.d.ts +14 -0
  58. package/dist/tools/context-tools.d.ts.map +1 -0
  59. package/dist/tools/context-tools.js +63 -0
  60. package/dist/tools/context-tools.js.map +1 -0
  61. package/dist/tools/git_diff.js +1 -1
  62. package/dist/tools/git_diff.js.map +1 -1
  63. package/dist/tools/git_status.js +1 -1
  64. package/dist/tools/git_status.js.map +1 -1
  65. package/dist/tools/registry.d.ts.map +1 -1
  66. package/dist/tools/registry.js +2 -0
  67. package/dist/tools/registry.js.map +1 -1
  68. package/dist/tools/run_command.d.ts +8 -3
  69. package/dist/tools/run_command.d.ts.map +1 -1
  70. package/dist/tools/run_command.js +90 -3
  71. package/dist/tools/run_command.js.map +1 -1
  72. package/dist/ui/chat.d.ts.map +1 -1
  73. package/dist/ui/chat.js +173 -1
  74. package/dist/ui/chat.js.map +1 -1
  75. package/dist/ui/logo.d.ts.map +1 -1
  76. package/dist/ui/logo.js +5 -1
  77. package/dist/ui/logo.js.map +1 -1
  78. package/dist/utils/agent.d.ts +130 -0
  79. package/dist/utils/agent.d.ts.map +1 -0
  80. package/dist/utils/agent.js +449 -0
  81. package/dist/utils/agent.js.map +1 -0
  82. package/dist/utils/cache.d.ts +30 -0
  83. package/dist/utils/cache.d.ts.map +1 -0
  84. package/dist/utils/cache.js +62 -0
  85. package/dist/utils/cache.js.map +1 -0
  86. package/dist/utils/context.d.ts +38 -0
  87. package/dist/utils/context.d.ts.map +1 -0
  88. package/dist/utils/context.js +383 -0
  89. package/dist/utils/context.js.map +1 -0
  90. package/dist/utils/critic.d.ts +31 -0
  91. package/dist/utils/critic.d.ts.map +1 -0
  92. package/dist/utils/critic.js +126 -0
  93. package/dist/utils/critic.js.map +1 -0
  94. package/dist/utils/index-builder.d.ts +53 -0
  95. package/dist/utils/index-builder.d.ts.map +1 -0
  96. package/dist/utils/index-builder.js +241 -0
  97. package/dist/utils/index-builder.js.map +1 -0
  98. package/dist/utils/memory.d.ts +104 -0
  99. package/dist/utils/memory.d.ts.map +1 -0
  100. package/dist/utils/memory.js +215 -0
  101. package/dist/utils/memory.js.map +1 -0
  102. package/dist/utils/past-sessions.d.ts +31 -0
  103. package/dist/utils/past-sessions.d.ts.map +1 -0
  104. package/dist/utils/past-sessions.js +126 -0
  105. package/dist/utils/past-sessions.js.map +1 -0
  106. package/dist/utils/tokens.d.ts +53 -0
  107. package/dist/utils/tokens.d.ts.map +1 -0
  108. package/dist/utils/tokens.js +138 -0
  109. package/dist/utils/tokens.js.map +1 -0
  110. package/package.json +6 -2
@@ -8,6 +8,30 @@ export async function createProvider(profile) {
8
8
  model: profile.model,
9
9
  });
10
10
  }
11
- throw new JamError(`Unknown provider: "${provider}". Supported providers: ollama`, 'CONFIG_INVALID');
11
+ if (provider === 'openai') {
12
+ const { OpenAIAdapter } = await import('./openai.js');
13
+ return new OpenAIAdapter({
14
+ baseUrl: profile.baseUrl,
15
+ model: profile.model,
16
+ apiKey: profile.apiKey,
17
+ });
18
+ }
19
+ if (provider === 'groq') {
20
+ const { GroqAdapter } = await import('./groq.js');
21
+ return new GroqAdapter({
22
+ baseUrl: profile.baseUrl,
23
+ model: profile.model,
24
+ apiKey: profile.apiKey,
25
+ });
26
+ }
27
+ if (provider === 'embedded') {
28
+ process.stderr.write('\n \x1b[33m[EXPERIMENTAL]\x1b[0m Using embedded provider — model runs in-process via node-llama-cpp.\n' +
29
+ ' Model will be downloaded on first use only when provider is set to "embedded".\n\n');
30
+ const { EmbeddedAdapter } = await import('./embedded.js');
31
+ return new EmbeddedAdapter({
32
+ model: profile.model,
33
+ });
34
+ }
35
+ throw new JamError(`Unknown provider: "${provider}". Supported providers: ollama, openai, groq, embedded`, 'CONFIG_INVALID');
12
36
  }
13
37
  //# sourceMappingURL=factory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/providers/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgB;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,OAAO,IAAI,aAAa,CAAC;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,QAAQ,CAChB,sBAAsB,QAAQ,gCAAgC,EAC9D,gBAAgB,CACjB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/providers/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgB;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,OAAO,IAAI,aAAa,CAAC;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,OAAO,IAAI,aAAa,CAAC;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAClD,OAAO,IAAI,WAAW,CAAC;YACrB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yGAAyG;YACzG,sFAAsF,CACvF,CAAC;QACF,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAC1D,OAAO,IAAI,eAAe,CAAC;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,QAAQ,CAChB,sBAAsB,QAAQ,wDAAwD,EACtF,gBAAgB,CACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { OpenAIAdapter } from './openai.js';
2
+ import type { ProviderInfo } from './base.js';
3
+ /**
4
+ * Groq provider adapter.
5
+ * Groq's API is OpenAI-compatible, so this extends OpenAIAdapter with
6
+ * Groq-specific defaults (base URL, model, env var for API key).
7
+ */
8
+ export declare class GroqAdapter extends OpenAIAdapter {
9
+ readonly info: ProviderInfo;
10
+ constructor(options?: {
11
+ baseUrl?: string;
12
+ model?: string;
13
+ apiKey?: string;
14
+ });
15
+ }
16
+ //# sourceMappingURL=groq.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groq.d.ts","sourceRoot":"","sources":["../../src/providers/groq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAK9C;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,aAAa;IAC5C,SAAkB,IAAI,EAAE,YAAY,CAGlC;gBAEU,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;CAQhF"}
@@ -0,0 +1,23 @@
1
+ import { OpenAIAdapter } from './openai.js';
2
+ const GROQ_BASE_URL = 'https://api.groq.com/openai';
3
+ const DEFAULT_MODEL = 'llama3-8b-8192';
4
+ /**
5
+ * Groq provider adapter.
6
+ * Groq's API is OpenAI-compatible, so this extends OpenAIAdapter with
7
+ * Groq-specific defaults (base URL, model, env var for API key).
8
+ */
9
+ export class GroqAdapter extends OpenAIAdapter {
10
+ info = {
11
+ name: 'groq',
12
+ supportsStreaming: true,
13
+ };
14
+ constructor(options = {}) {
15
+ const apiKey = options.apiKey ?? process.env['GROQ_API_KEY'];
16
+ super({
17
+ baseUrl: options.baseUrl ?? GROQ_BASE_URL,
18
+ model: options.model ?? DEFAULT_MODEL,
19
+ apiKey,
20
+ });
21
+ }
22
+ }
23
+ //# sourceMappingURL=groq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groq.js","sourceRoot":"","sources":["../../src/providers/groq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,aAAa,GAAG,6BAA6B,CAAC;AACpD,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAEvC;;;;GAIG;AACH,MAAM,OAAO,WAAY,SAAQ,aAAa;IAC1B,IAAI,GAAiB;QACrC,IAAI,EAAE,MAAM;QACZ,iBAAiB,EAAE,IAAI;KACxB,CAAC;IAEF,YAAY,UAAiE,EAAE;QAC7E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC7D,KAAK,CAAC;YACJ,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,aAAa;YACzC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,aAAa;YACrC,MAAM;SACP,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- import type { ProviderAdapter, ProviderInfo, CompletionRequest, StreamChunk } from './base.js';
1
+ import type { ProviderAdapter, ProviderInfo, CompletionRequest, StreamChunk, Message, ToolDefinition, ChatWithToolsResponse } from './base.js';
2
2
  export declare class OllamaAdapter implements ProviderAdapter {
3
3
  readonly info: ProviderInfo;
4
4
  private readonly baseUrl;
@@ -10,5 +10,10 @@ export declare class OllamaAdapter implements ProviderAdapter {
10
10
  listModels(): Promise<string[]>;
11
11
  validateCredentials(): Promise<void>;
12
12
  streamCompletion(request: CompletionRequest): AsyncIterable<StreamChunk>;
13
+ /**
14
+ * Single non-streaming turn that supports Ollama tool calling.
15
+ * Returns the assistant's text content and/or an array of tool calls.
16
+ */
17
+ chatWithTools(messages: Message[], tools: ToolDefinition[], options?: Pick<CompletionRequest, 'model' | 'temperature' | 'maxTokens' | 'systemPrompt'>): Promise<ChatWithToolsResponse>;
13
18
  }
14
19
  //# sourceMappingURL=ollama.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAW,MAAM,WAAW,CAAC;AAmCxG,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAGzB;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO;IAKxD,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA8B/B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBnC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,aAAa,CAAC,WAAW,CAAC;CAoHhF"}
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAY,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAmCzJ,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAGzB;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO;IAKxD,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAsC/B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BnC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,aAAa,CAAC,WAAW,CAAC;IAqH/E;;;OAGG;IACG,aAAa,CACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc,CAAM,GAC5F,OAAO,CAAC,qBAAqB,CAAC;CAgFlC"}
@@ -33,10 +33,18 @@ export class OllamaAdapter {
33
33
  });
34
34
  }
35
35
  catch (err) {
36
- throw new JamError(`Cannot reach Ollama at ${this.baseUrl}. Start Ollama with: ollama serve`, 'PROVIDER_UNAVAILABLE', { retryable: false, cause: err });
36
+ const cause = err;
37
+ const isConnRefused = cause?.code === 'ECONNREFUSED' || cause?.code === 'ECONNRESET';
38
+ throw new JamError(isConnRefused
39
+ ? `Ollama is not running at ${this.baseUrl}. Start it with: ollama serve\n` +
40
+ `If Ollama is not installed, visit: https://ollama.com\n` +
41
+ `Run \`jam doctor\` for full diagnostics.`
42
+ : `Cannot reach Ollama at ${this.baseUrl}. Start it with: ollama serve\n` +
43
+ `Run \`jam doctor\` for full diagnostics.`, 'PROVIDER_UNAVAILABLE', { retryable: false, cause: err });
37
44
  }
38
45
  if (!response.ok) {
39
- throw new JamError(`Ollama returned HTTP ${response.status}. Is Ollama running at ${this.baseUrl}?`, 'PROVIDER_UNAVAILABLE', { retryable: false });
46
+ throw new JamError(`Ollama returned HTTP ${response.status}. Is Ollama running at ${this.baseUrl}?\n` +
47
+ `Run \`jam doctor\` for full diagnostics.`, 'PROVIDER_UNAVAILABLE', { retryable: false });
40
48
  }
41
49
  const data = (await response.json());
42
50
  return (data.models ?? []).map((m) => m.name);
@@ -47,13 +55,21 @@ export class OllamaAdapter {
47
55
  signal: AbortSignal.timeout(5000),
48
56
  });
49
57
  if (!response.ok) {
50
- throw new JamError(`Ollama returned HTTP ${response.status}. Is Ollama running at ${this.baseUrl}?`, 'PROVIDER_UNAVAILABLE', { retryable: false });
58
+ throw new JamError(`Ollama returned HTTP ${response.status}. Is Ollama running at ${this.baseUrl}?\n` +
59
+ `Run \`jam doctor\` for full diagnostics.`, 'PROVIDER_UNAVAILABLE', { retryable: false });
51
60
  }
52
61
  }
53
62
  catch (err) {
54
63
  if (JamError.isJamError(err))
55
64
  throw err;
56
- throw new JamError(`Cannot reach Ollama at ${this.baseUrl}. Start Ollama with: ollama serve`, 'PROVIDER_UNAVAILABLE', { retryable: false, cause: err });
65
+ const cause = err;
66
+ const isConnRefused = cause?.code === 'ECONNREFUSED' || cause?.code === 'ECONNRESET';
67
+ throw new JamError(isConnRefused
68
+ ? `Ollama is not running at ${this.baseUrl}. Start it with: ollama serve\n` +
69
+ `If Ollama is not installed, visit: https://ollama.com\n` +
70
+ `Run \`jam doctor\` for full diagnostics.`
71
+ : `Cannot reach Ollama at ${this.baseUrl}. Start it with: ollama serve\n` +
72
+ `Run \`jam doctor\` for full diagnostics.`, 'PROVIDER_UNAVAILABLE', { retryable: false, cause: err });
57
73
  }
58
74
  }
59
75
  async *streamCompletion(request) {
@@ -148,5 +164,62 @@ export class OllamaAdapter {
148
164
  }
149
165
  }
150
166
  }
167
+ /**
168
+ * Single non-streaming turn that supports Ollama tool calling.
169
+ * Returns the assistant's text content and/or an array of tool calls.
170
+ */
171
+ async chatWithTools(messages, tools, options = {}) {
172
+ const ollamaMessages = [];
173
+ if (options.systemPrompt) {
174
+ ollamaMessages.push({ role: 'system', content: options.systemPrompt });
175
+ }
176
+ ollamaMessages.push(...toOllamaMessages(messages));
177
+ const body = {
178
+ model: options.model ?? this.model,
179
+ messages: ollamaMessages,
180
+ tools: tools.map((t) => ({
181
+ type: 'function',
182
+ function: { name: t.name, description: t.description, parameters: t.parameters },
183
+ })),
184
+ stream: false,
185
+ options: {
186
+ ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
187
+ ...(options.maxTokens !== undefined ? { num_predict: options.maxTokens } : {}),
188
+ },
189
+ };
190
+ let response;
191
+ try {
192
+ response = await fetch(`${this.baseUrl}/api/chat`, {
193
+ method: 'POST',
194
+ headers: { 'Content-Type': 'application/json' },
195
+ body: JSON.stringify(body),
196
+ signal: AbortSignal.timeout(120_000),
197
+ });
198
+ }
199
+ catch (err) {
200
+ throw new JamError(`Failed to connect to Ollama at ${this.baseUrl}`, 'PROVIDER_UNAVAILABLE', { retryable: true, cause: err });
201
+ }
202
+ if (!response.ok) {
203
+ const errorText = await response.text().catch(() => '');
204
+ throw new JamError(`Ollama error ${response.status}: ${errorText}`, 'PROVIDER_STREAM_ERROR', { retryable: false, statusCode: response.status });
205
+ }
206
+ const data = (await response.json());
207
+ const msg = data.message;
208
+ const toolCalls = msg.tool_calls?.map((tc) => ({
209
+ name: tc.function.name,
210
+ arguments: tc.function.arguments,
211
+ }));
212
+ const promptTokens = data.prompt_eval_count ?? 0;
213
+ const completionTokens = data.eval_count ?? 0;
214
+ return {
215
+ content: msg.content ?? null,
216
+ toolCalls: toolCalls?.length ? toolCalls : undefined,
217
+ usage: {
218
+ promptTokens,
219
+ completionTokens,
220
+ totalTokens: promptTokens + completionTokens,
221
+ },
222
+ };
223
+ }
151
224
  }
152
225
  //# sourceMappingURL=ollama.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ProviderAdapter, ProviderInfo, CompletionRequest, StreamChunk, Message, ToolDefinition, ChatWithToolsResponse } from './base.js';
2
+ export declare class OpenAIAdapter implements ProviderAdapter {
3
+ readonly info: ProviderInfo;
4
+ private readonly baseUrl;
5
+ private readonly model;
6
+ private readonly apiKey;
7
+ constructor(options?: {
8
+ baseUrl?: string;
9
+ model?: string;
10
+ apiKey?: string;
11
+ });
12
+ private authHeaders;
13
+ listModels(): Promise<string[]>;
14
+ validateCredentials(): Promise<void>;
15
+ streamCompletion(request: CompletionRequest): AsyncIterable<StreamChunk>;
16
+ chatWithTools(messages: Message[], tools: ToolDefinition[], options?: Pick<CompletionRequest, 'model' | 'temperature' | 'maxTokens' | 'systemPrompt'>): Promise<ChatWithToolsResponse>;
17
+ }
18
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,OAAO,EACP,cAAc,EAEd,qBAAqB,EACtB,MAAM,WAAW,CAAC;AAuDnB,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAGzB;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;gBAEhC,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAM/E,OAAO,CAAC,WAAW;IAcb,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAoC/B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,aAAa,CAAC,WAAW,CAAC;IAgIzE,aAAa,CACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc,CAAM,GAC5F,OAAO,CAAC,qBAAqB,CAAC;CA2FlC"}
@@ -0,0 +1,229 @@
1
+ import { JamError } from '../utils/errors.js';
2
+ const DEFAULT_BASE_URL = 'https://api.openai.com';
3
+ const DEFAULT_MODEL = 'gpt-4o-mini';
4
+ function toOpenAIMessages(messages) {
5
+ return messages.map((m) => ({ role: m.role, content: m.content }));
6
+ }
7
+ function getApiKey(profileApiKey) {
8
+ return profileApiKey ?? process.env['OPENAI_API_KEY'];
9
+ }
10
+ export class OpenAIAdapter {
11
+ info = {
12
+ name: 'openai',
13
+ supportsStreaming: true,
14
+ };
15
+ baseUrl;
16
+ model;
17
+ apiKey;
18
+ constructor(options = {}) {
19
+ this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, '');
20
+ this.model = options.model ?? DEFAULT_MODEL;
21
+ this.apiKey = getApiKey(options.apiKey);
22
+ }
23
+ authHeaders() {
24
+ if (!this.apiKey) {
25
+ throw new JamError('No OpenAI API key found. Set OPENAI_API_KEY environment variable or configure apiKey in your profile.', 'PROVIDER_AUTH_FAILED', { retryable: false });
26
+ }
27
+ return {
28
+ 'Content-Type': 'application/json',
29
+ Authorization: `Bearer ${this.apiKey}`,
30
+ };
31
+ }
32
+ async listModels() {
33
+ const headers = this.authHeaders();
34
+ let response;
35
+ try {
36
+ response = await fetch(`${this.baseUrl}/v1/models`, {
37
+ headers,
38
+ signal: AbortSignal.timeout(10_000),
39
+ });
40
+ }
41
+ catch (err) {
42
+ throw new JamError(`Cannot reach OpenAI at ${this.baseUrl}. Check your network connection.`, 'PROVIDER_UNAVAILABLE', { retryable: false, cause: err });
43
+ }
44
+ if (response.status === 401) {
45
+ throw new JamError('OpenAI API key is invalid or expired. Set a valid OPENAI_API_KEY.', 'PROVIDER_AUTH_FAILED', { retryable: false, statusCode: response.status });
46
+ }
47
+ if (!response.ok) {
48
+ throw new JamError(`OpenAI returned HTTP ${response.status} from /v1/models.`, 'PROVIDER_UNAVAILABLE', { retryable: false, statusCode: response.status });
49
+ }
50
+ const data = (await response.json());
51
+ return (data.data ?? []).map((m) => m.id).sort();
52
+ }
53
+ async validateCredentials() {
54
+ // A lightweight check: list models (requires a valid API key)
55
+ await this.listModels();
56
+ }
57
+ async *streamCompletion(request) {
58
+ const messages = [];
59
+ if (request.systemPrompt) {
60
+ messages.push({ role: 'system', content: request.systemPrompt });
61
+ }
62
+ messages.push(...toOpenAIMessages(request.messages));
63
+ const body = {
64
+ model: request.model ?? this.model,
65
+ messages,
66
+ stream: true,
67
+ stream_options: { include_usage: true },
68
+ ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),
69
+ ...(request.maxTokens !== undefined ? { max_tokens: request.maxTokens } : {}),
70
+ };
71
+ const headers = this.authHeaders();
72
+ let response;
73
+ try {
74
+ response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
75
+ method: 'POST',
76
+ headers,
77
+ body: JSON.stringify(body),
78
+ signal: AbortSignal.timeout(120_000),
79
+ });
80
+ }
81
+ catch (err) {
82
+ throw new JamError(`Failed to connect to OpenAI at ${this.baseUrl}`, 'PROVIDER_UNAVAILABLE', { retryable: true, cause: err });
83
+ }
84
+ if (response.status === 401) {
85
+ throw new JamError('OpenAI API key is invalid or expired. Set a valid OPENAI_API_KEY.', 'PROVIDER_AUTH_FAILED', { retryable: false, statusCode: response.status });
86
+ }
87
+ if (response.status === 404) {
88
+ throw new JamError(`Model not found: ${request.model ?? this.model}. Check available models with: jam models list`, 'PROVIDER_MODEL_NOT_FOUND', { retryable: false, statusCode: response.status });
89
+ }
90
+ if (response.status === 429) {
91
+ throw new JamError('OpenAI rate limit reached. Try again shortly.', 'PROVIDER_RATE_LIMITED', { retryable: true, statusCode: response.status });
92
+ }
93
+ if (!response.ok) {
94
+ const errorText = await response.text().catch(() => '');
95
+ throw new JamError(`OpenAI error ${response.status}: ${errorText}`, 'PROVIDER_STREAM_ERROR', { retryable: false, statusCode: response.status });
96
+ }
97
+ if (!response.body) {
98
+ throw new JamError('OpenAI returned empty response body', 'PROVIDER_STREAM_ERROR', {
99
+ retryable: true,
100
+ });
101
+ }
102
+ const decoder = new TextDecoder();
103
+ let buffer = '';
104
+ for await (const rawChunk of response.body) {
105
+ buffer += decoder.decode(rawChunk, { stream: true });
106
+ const lines = buffer.split('\n');
107
+ buffer = lines.pop() ?? '';
108
+ for (const line of lines) {
109
+ const trimmed = line.trim();
110
+ if (!trimmed || trimmed === 'data: [DONE]')
111
+ continue;
112
+ if (!trimmed.startsWith('data: '))
113
+ continue;
114
+ let parsed;
115
+ try {
116
+ parsed = JSON.parse(trimmed.slice(6));
117
+ }
118
+ catch {
119
+ continue;
120
+ }
121
+ const choice = parsed.choices?.[0];
122
+ if (choice) {
123
+ const delta = choice.delta.content ?? '';
124
+ const done = choice.finish_reason !== null;
125
+ if (done) {
126
+ const usage = parsed.usage;
127
+ yield {
128
+ delta: '',
129
+ done: true,
130
+ usage: usage
131
+ ? {
132
+ promptTokens: usage.prompt_tokens,
133
+ completionTokens: usage.completion_tokens,
134
+ totalTokens: usage.total_tokens,
135
+ }
136
+ : undefined,
137
+ };
138
+ }
139
+ else if (delta) {
140
+ yield { delta, done: false };
141
+ }
142
+ }
143
+ else if (parsed.usage) {
144
+ // usage-only chunk (stream_options.include_usage)
145
+ yield {
146
+ delta: '',
147
+ done: true,
148
+ usage: {
149
+ promptTokens: parsed.usage.prompt_tokens,
150
+ completionTokens: parsed.usage.completion_tokens,
151
+ totalTokens: parsed.usage.total_tokens,
152
+ },
153
+ };
154
+ }
155
+ }
156
+ }
157
+ }
158
+ async chatWithTools(messages, tools, options = {}) {
159
+ const openAIMessages = [];
160
+ if (options.systemPrompt) {
161
+ openAIMessages.push({ role: 'system', content: options.systemPrompt });
162
+ }
163
+ openAIMessages.push(...toOpenAIMessages(messages));
164
+ const body = {
165
+ model: options.model ?? this.model,
166
+ messages: openAIMessages,
167
+ tools: tools.map((t) => ({
168
+ type: 'function',
169
+ function: { name: t.name, description: t.description, parameters: t.parameters },
170
+ })),
171
+ ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
172
+ ...(options.maxTokens !== undefined ? { max_tokens: options.maxTokens } : {}),
173
+ };
174
+ const headers = this.authHeaders();
175
+ let response;
176
+ try {
177
+ response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
178
+ method: 'POST',
179
+ headers,
180
+ body: JSON.stringify(body),
181
+ signal: AbortSignal.timeout(120_000),
182
+ });
183
+ }
184
+ catch (err) {
185
+ throw new JamError(`Failed to connect to OpenAI at ${this.baseUrl}`, 'PROVIDER_UNAVAILABLE', { retryable: true, cause: err });
186
+ }
187
+ if (response.status === 401) {
188
+ throw new JamError('OpenAI API key is invalid or expired. Set a valid OPENAI_API_KEY.', 'PROVIDER_AUTH_FAILED', { retryable: false, statusCode: response.status });
189
+ }
190
+ if (!response.ok) {
191
+ const errorText = await response.text().catch(() => '');
192
+ throw new JamError(`OpenAI error ${response.status}: ${errorText}`, 'PROVIDER_STREAM_ERROR', { retryable: false, statusCode: response.status });
193
+ }
194
+ const data = (await response.json());
195
+ const msg = data.choices[0]?.message;
196
+ if (!msg) {
197
+ throw new JamError('OpenAI returned no choices.', 'PROVIDER_STREAM_ERROR', {
198
+ retryable: false,
199
+ });
200
+ }
201
+ const toolCalls = msg.tool_calls?.map((tc) => {
202
+ let parsedArgs;
203
+ try {
204
+ parsedArgs = JSON.parse(tc.function.arguments);
205
+ }
206
+ catch {
207
+ throw new JamError(`Failed to parse tool call arguments from OpenAI response for tool "${tc.function.name}"`, 'PROVIDER_STREAM_ERROR', { retryable: false });
208
+ }
209
+ return {
210
+ id: tc.id,
211
+ name: tc.function.name,
212
+ arguments: parsedArgs,
213
+ };
214
+ });
215
+ const usage = data.usage;
216
+ return {
217
+ content: msg.content ?? null,
218
+ toolCalls: toolCalls?.length ? toolCalls : undefined,
219
+ usage: usage
220
+ ? {
221
+ promptTokens: usage.prompt_tokens,
222
+ completionTokens: usage.completion_tokens,
223
+ totalTokens: usage.total_tokens,
224
+ }
225
+ : undefined,
226
+ };
227
+ }
228
+ }
229
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Full tool set for `jam run` — read-only tools plus write tools.
3
+ *
4
+ * Uses the shared READ_ONLY_TOOL_SCHEMAS from context-tools.ts and adds
5
+ * write tools (git_status, git_diff, write_file, apply_patch).
6
+ */
7
+ import type { ToolDefinition } from '../providers/base.js';
8
+ /** All tool schemas for the run command (read + write). */
9
+ export declare const ALL_TOOL_SCHEMAS: ToolDefinition[];
10
+ /** Set of read-only tool names (no confirmation needed). */
11
+ export declare const READONLY_TOOL_NAMES: Set<string>;
12
+ /**
13
+ * Execute any tool (read or write).
14
+ * For read-only tools, delegates to executeReadOnlyTool.
15
+ * For write tools, uses the full registry.
16
+ */
17
+ export declare function executeTool(name: string, args: Record<string, unknown>, workspaceRoot: string): Promise<string>;
18
+ //# sourceMappingURL=all-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"all-tools.d.ts","sourceRoot":"","sources":["../../src/tools/all-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAkE3D,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAG5C,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,aAAmD,CAAC;AAEpF;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAejB"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Full tool set for `jam run` — read-only tools plus write tools.
3
+ *
4
+ * Uses the shared READ_ONLY_TOOL_SCHEMAS from context-tools.ts and adds
5
+ * write tools (git_status, git_diff, write_file, apply_patch).
6
+ */
7
+ import { READ_ONLY_TOOL_SCHEMAS, executeReadOnlyTool } from './context-tools.js';
8
+ import { JamError } from '../utils/errors.js';
9
+ // ── Write-capable tool schemas ────────────────────────────────────────────────
10
+ const WRITE_TOOL_SCHEMAS = [
11
+ {
12
+ name: 'git_status',
13
+ description: 'Get current git status. Use this to see which files have been modified, staged, or are untracked.',
14
+ parameters: { type: 'object', properties: {}, required: [] },
15
+ },
16
+ {
17
+ name: 'git_diff',
18
+ description: 'Get git diff for the current changes. Use staged=true to see staged changes.',
19
+ parameters: {
20
+ type: 'object',
21
+ properties: {
22
+ staged: { type: 'boolean', description: 'Show staged changes instead of unstaged' },
23
+ path: { type: 'string', description: 'Limit diff to a specific file path' },
24
+ },
25
+ required: [],
26
+ },
27
+ },
28
+ {
29
+ name: 'write_file',
30
+ description: 'Write content to a file. Use mode="append" to add to the end of a file. Default is "overwrite". Explain what you are changing and why before calling this tool.',
31
+ parameters: {
32
+ type: 'object',
33
+ properties: {
34
+ path: { type: 'string', description: 'File path relative to workspace root' },
35
+ content: { type: 'string', description: 'The full content to write to the file' },
36
+ mode: { type: 'string', description: '"overwrite" (default) or "append"' },
37
+ },
38
+ required: ['path', 'content'],
39
+ },
40
+ },
41
+ {
42
+ name: 'apply_patch',
43
+ description: 'Apply a unified diff patch to modify files. Use this for precise, targeted edits to existing files.',
44
+ parameters: {
45
+ type: 'object',
46
+ properties: {
47
+ patch: { type: 'string', description: 'Unified diff content (the patch to apply)' },
48
+ },
49
+ required: ['patch'],
50
+ },
51
+ },
52
+ {
53
+ name: 'run_command',
54
+ description: 'Execute a shell command and return its stdout and stderr. ' +
55
+ 'Use for running tests, builds, linters, or other safe commands. ' +
56
+ 'Dangerous commands (rm -rf, sudo, etc.) are blocked.',
57
+ parameters: {
58
+ type: 'object',
59
+ properties: {
60
+ command: { type: 'string', description: 'The executable to run (e.g. "npm", "git", "python")' },
61
+ args: { type: 'string', description: 'Space-separated arguments (e.g. "test --run")' },
62
+ timeout: { type: 'number', description: 'Timeout in seconds. Default is 30.' },
63
+ },
64
+ required: ['command'],
65
+ },
66
+ },
67
+ ];
68
+ /** All tool schemas for the run command (read + write). */
69
+ export const ALL_TOOL_SCHEMAS = [
70
+ ...READ_ONLY_TOOL_SCHEMAS,
71
+ ...WRITE_TOOL_SCHEMAS,
72
+ ];
73
+ /** Set of read-only tool names (no confirmation needed). */
74
+ export const READONLY_TOOL_NAMES = new Set(READ_ONLY_TOOL_SCHEMAS.map(t => t.name));
75
+ /**
76
+ * Execute any tool (read or write).
77
+ * For read-only tools, delegates to executeReadOnlyTool.
78
+ * For write tools, uses the full registry.
79
+ */
80
+ export async function executeTool(name, args, workspaceRoot) {
81
+ // Read-only tools share the same executor
82
+ if (READONLY_TOOL_NAMES.has(name)) {
83
+ return executeReadOnlyTool(name, args, workspaceRoot);
84
+ }
85
+ // Write tools use the full registry
86
+ const { createDefaultRegistry } = await import('./registry.js');
87
+ const registry = createDefaultRegistry();
88
+ const tool = registry.get(name);
89
+ if (!tool) {
90
+ throw new JamError(`Unknown tool: ${name}`, 'TOOL_NOT_FOUND');
91
+ }
92
+ const result = await tool.execute(args, { workspaceRoot, cwd: process.cwd() });
93
+ return result.error ? `Error: ${result.error}` : result.output;
94
+ }
95
+ //# sourceMappingURL=all-tools.js.map