stepproof 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/adapters/anthropic.d.ts +7 -2
  2. package/dist/adapters/anthropic.d.ts.map +1 -1
  3. package/dist/adapters/anthropic.js +35 -4
  4. package/dist/adapters/anthropic.js.map +1 -1
  5. package/dist/adapters/azure-openai.d.ts +13 -0
  6. package/dist/adapters/azure-openai.d.ts.map +1 -0
  7. package/dist/adapters/azure-openai.js +90 -0
  8. package/dist/adapters/azure-openai.js.map +1 -0
  9. package/dist/adapters/base.d.ts +20 -1
  10. package/dist/adapters/base.d.ts.map +1 -1
  11. package/dist/adapters/bedrock.d.ts +11 -0
  12. package/dist/adapters/bedrock.d.ts.map +1 -0
  13. package/dist/adapters/bedrock.js +145 -0
  14. package/dist/adapters/bedrock.js.map +1 -0
  15. package/dist/adapters/gemini.d.ts +3 -2
  16. package/dist/adapters/gemini.d.ts.map +1 -1
  17. package/dist/adapters/gemini.js +38 -4
  18. package/dist/adapters/gemini.js.map +1 -1
  19. package/dist/adapters/index.d.ts +7 -0
  20. package/dist/adapters/index.d.ts.map +1 -1
  21. package/dist/adapters/index.js +36 -1
  22. package/dist/adapters/index.js.map +1 -1
  23. package/dist/adapters/ollama.d.ts +3 -2
  24. package/dist/adapters/ollama.d.ts.map +1 -1
  25. package/dist/adapters/ollama.js +22 -6
  26. package/dist/adapters/ollama.js.map +1 -1
  27. package/dist/adapters/openai.d.ts +7 -2
  28. package/dist/adapters/openai.d.ts.map +1 -1
  29. package/dist/adapters/openai.js +37 -6
  30. package/dist/adapters/openai.js.map +1 -1
  31. package/dist/assertions/engine.d.ts +12 -1
  32. package/dist/assertions/engine.d.ts.map +1 -1
  33. package/dist/assertions/engine.js +343 -1
  34. package/dist/assertions/engine.js.map +1 -1
  35. package/dist/baseline.d.ts +2 -1
  36. package/dist/baseline.d.ts.map +1 -1
  37. package/dist/baseline.js +18 -1
  38. package/dist/baseline.js.map +1 -1
  39. package/dist/cli.js +163 -6
  40. package/dist/cli.js.map +1 -1
  41. package/dist/commands/diff.d.ts +2 -0
  42. package/dist/commands/diff.d.ts.map +1 -0
  43. package/dist/commands/diff.js +252 -0
  44. package/dist/commands/diff.js.map +1 -0
  45. package/dist/commands/generate.d.ts +12 -0
  46. package/dist/commands/generate.d.ts.map +1 -0
  47. package/dist/commands/generate.js +112 -0
  48. package/dist/commands/generate.js.map +1 -0
  49. package/dist/commands/watch.d.ts +7 -0
  50. package/dist/commands/watch.d.ts.map +1 -0
  51. package/dist/commands/watch.js +84 -0
  52. package/dist/commands/watch.js.map +1 -0
  53. package/dist/core/scenario-parser.d.ts +1 -1
  54. package/dist/core/scenario-parser.d.ts.map +1 -1
  55. package/dist/core/scenario-parser.js +191 -9
  56. package/dist/core/scenario-parser.js.map +1 -1
  57. package/dist/core/scenario-runner.d.ts +4 -0
  58. package/dist/core/scenario-runner.d.ts.map +1 -1
  59. package/dist/core/scenario-runner.js +402 -61
  60. package/dist/core/scenario-runner.js.map +1 -1
  61. package/dist/core/types.d.ts +80 -4
  62. package/dist/core/types.d.ts.map +1 -1
  63. package/dist/dataset.d.ts +6 -0
  64. package/dist/dataset.d.ts.map +1 -0
  65. package/dist/dataset.js +108 -0
  66. package/dist/dataset.js.map +1 -0
  67. package/dist/reporters/github-comment.d.ts +8 -0
  68. package/dist/reporters/github-comment.d.ts.map +1 -0
  69. package/dist/reporters/github-comment.js +114 -0
  70. package/dist/reporters/github-comment.js.map +1 -0
  71. package/dist/reporters/terminal-reporter.d.ts.map +1 -1
  72. package/dist/reporters/terminal-reporter.js +39 -5
  73. package/dist/reporters/terminal-reporter.js.map +1 -1
  74. package/package.json +1 -1
@@ -1,8 +1,13 @@
1
- import type { AdapterResponse, ProviderAdapter } from './base.js';
1
+ import type { AdapterResponse, CallOptions, ChatMessage, ProviderAdapter } from './base.js';
2
2
  export declare class AnthropicAdapter implements ProviderAdapter {
3
3
  private client;
4
4
  private model;
5
5
  constructor(model: string);
6
- call(prompt: string, system?: string): Promise<AdapterResponse>;
6
+ call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
7
+ chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
8
+ stream(prompt: string, system?: string, options?: CallOptions): AsyncGenerator<{
9
+ token: string;
10
+ timestampMs: number;
11
+ }>;
7
12
  }
8
13
  //# sourceMappingURL=anthropic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/adapters/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAsBlE,qBAAa,gBAAiB,YAAW,eAAe;IACtD,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAQnB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAwBtE"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/adapters/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAqB5F,qBAAa,gBAAiB,YAAW,eAAe;IACtD,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAQnB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAItF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAoC9F,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAoB9H"}
@@ -10,7 +10,6 @@ async function withRetry(fn) {
10
10
  catch (err) {
11
11
  lastError = err;
12
12
  const status = err.status;
13
- // Only retry on rate limit (429) or server error (5xx)
14
13
  if (status !== 429 && !(status && status >= 500))
15
14
  throw err;
16
15
  const delay = BASE_DELAY_MS * Math.pow(2, attempt);
@@ -29,13 +28,27 @@ export class AnthropicAdapter {
29
28
  }
30
29
  this.client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
31
30
  }
32
- async call(prompt, system) {
31
+ async call(prompt, system, options) {
32
+ return this.chat([{ role: 'user', content: prompt }], system, options);
33
+ }
34
+ async chat(messages, system, options) {
35
+ const apiMessages = [];
36
+ for (const msg of messages) {
37
+ if (msg.role === 'system') {
38
+ system = system ? `${system}\n\n${msg.content}` : msg.content;
39
+ }
40
+ else {
41
+ apiMessages.push({ role: msg.role, content: msg.content });
42
+ }
43
+ }
33
44
  const startMs = Date.now();
34
45
  const response = await withRetry(() => this.client.messages.create({
35
46
  model: this.model,
36
- max_tokens: 1024,
47
+ max_tokens: options?.maxTokens ?? 1024,
37
48
  ...(system && { system }),
38
- messages: [{ role: 'user', content: prompt }],
49
+ ...(options?.temperature !== undefined && { temperature: options.temperature }),
50
+ ...(options?.topP !== undefined && { top_p: options.topP }),
51
+ messages: apiMessages,
39
52
  }));
40
53
  const durationMs = Date.now() - startMs;
41
54
  const content = response.content[0];
@@ -49,5 +62,23 @@ export class AnthropicAdapter {
49
62
  durationMs,
50
63
  };
51
64
  }
65
+ async *stream(prompt, system, options) {
66
+ const apiMessages = [
67
+ { role: 'user', content: prompt },
68
+ ];
69
+ const stream = this.client.messages.stream({
70
+ model: this.model,
71
+ max_tokens: options?.maxTokens ?? 1024,
72
+ ...(system && { system }),
73
+ ...(options?.temperature !== undefined && { temperature: options.temperature }),
74
+ ...(options?.topP !== undefined && { top_p: options.topP }),
75
+ messages: apiMessages,
76
+ });
77
+ for await (const event of stream) {
78
+ if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
79
+ yield { token: event.delta.text, timestampMs: Date.now() };
80
+ }
81
+ }
82
+ }
52
83
  }
53
84
  //# sourceMappingURL=anthropic.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/adapters/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,KAAK,UAAU,SAAS,CAAI,EAAoB;IAC9C,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,SAAS,GAAG,GAAG,CAAC;YAChB,MAAM,MAAM,GAAI,GAA2B,CAAC,MAAM,CAAC;YACnD,uDAAuD;YACvD,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,IAAI,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YAC5D,MAAM,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAY;IAClB,KAAK,CAAS;IAEtB,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,MAAe;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI;YAChB,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;YACzB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAC9C,CAAC,CACH,CAAC;QACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QAExC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAE1D,OAAO;YACL,IAAI;YACJ,KAAK,EAAE;gBACL,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY;gBACxC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa;aAC3C;YACD,UAAU;SACX,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/adapters/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { AdapterResponse, CallOptions, ChatMessage, ProviderAdapter } from './base.js';
2
+ export declare class AzureOpenAIAdapter implements ProviderAdapter {
3
+ private client;
4
+ private deployment;
5
+ constructor(deployment: string);
6
+ call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
7
+ chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
8
+ stream(prompt: string, system?: string, options?: CallOptions): AsyncGenerator<{
9
+ token: string;
10
+ timestampMs: number;
11
+ }>;
12
+ }
13
+ //# sourceMappingURL=azure-openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-openai.d.ts","sourceRoot":"","sources":["../../src/adapters/azure-openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAqB5F,qBAAa,kBAAmB,YAAW,eAAe;IACxD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAsBxB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAItF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IA8B9F,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAuB9H"}
@@ -0,0 +1,90 @@
1
+ import { AzureOpenAI } from 'openai';
2
+ const MAX_RETRIES = 3;
3
+ const BASE_DELAY_MS = 1000;
4
+ async function withRetry(fn) {
5
+ let lastError;
6
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
7
+ try {
8
+ return await fn();
9
+ }
10
+ catch (err) {
11
+ lastError = err;
12
+ const status = err.status;
13
+ if (status !== 429 && !(status && status >= 500))
14
+ throw err;
15
+ const delay = BASE_DELAY_MS * Math.pow(2, attempt);
16
+ await new Promise((res) => setTimeout(res, delay));
17
+ }
18
+ }
19
+ throw lastError;
20
+ }
21
+ export class AzureOpenAIAdapter {
22
+ client;
23
+ deployment;
24
+ constructor(deployment) {
25
+ this.deployment = deployment;
26
+ const apiKey = process.env.AZURE_OPENAI_API_KEY;
27
+ const endpoint = process.env.AZURE_OPENAI_ENDPOINT;
28
+ if (!apiKey) {
29
+ throw new Error('AZURE_OPENAI_API_KEY environment variable is required for azure-openai provider');
30
+ }
31
+ if (!endpoint) {
32
+ throw new Error('AZURE_OPENAI_ENDPOINT environment variable is required for azure-openai provider');
33
+ }
34
+ const apiVersion = process.env.AZURE_OPENAI_API_VERSION ?? '2024-10-21';
35
+ this.client = new AzureOpenAI({
36
+ apiKey,
37
+ endpoint,
38
+ apiVersion,
39
+ deployment,
40
+ });
41
+ }
42
+ async call(prompt, system, options) {
43
+ return this.chat([{ role: 'user', content: prompt }], system, options);
44
+ }
45
+ async chat(messages, system, options) {
46
+ const apiMessages = [];
47
+ if (system) {
48
+ apiMessages.push({ role: 'system', content: system });
49
+ }
50
+ for (const msg of messages) {
51
+ apiMessages.push({ role: msg.role, content: msg.content });
52
+ }
53
+ const startMs = Date.now();
54
+ const response = await withRetry(() => this.client.chat.completions.create({
55
+ model: this.deployment,
56
+ messages: apiMessages,
57
+ ...(options?.temperature !== undefined && { temperature: options.temperature }),
58
+ ...(options?.topP !== undefined && { top_p: options.topP }),
59
+ ...(options?.maxTokens !== undefined && { max_tokens: options.maxTokens }),
60
+ }));
61
+ const durationMs = Date.now() - startMs;
62
+ const text = response.choices[0]?.message?.content ?? '';
63
+ const usage = response.usage
64
+ ? { inputTokens: response.usage.prompt_tokens, outputTokens: response.usage.completion_tokens }
65
+ : undefined;
66
+ return { text, usage, durationMs };
67
+ }
68
+ async *stream(prompt, system, options) {
69
+ const apiMessages = [];
70
+ if (system) {
71
+ apiMessages.push({ role: 'system', content: system });
72
+ }
73
+ apiMessages.push({ role: 'user', content: prompt });
74
+ const stream = await this.client.chat.completions.create({
75
+ model: this.deployment,
76
+ messages: apiMessages,
77
+ stream: true,
78
+ ...(options?.temperature !== undefined && { temperature: options.temperature }),
79
+ ...(options?.topP !== undefined && { top_p: options.topP }),
80
+ ...(options?.maxTokens !== undefined && { max_tokens: options.maxTokens }),
81
+ });
82
+ for await (const chunk of stream) {
83
+ const delta = chunk.choices[0]?.delta?.content;
84
+ if (delta) {
85
+ yield { token: delta, timestampMs: Date.now() };
86
+ }
87
+ }
88
+ }
89
+ }
90
+ //# sourceMappingURL=azure-openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-openai.js","sourceRoot":"","sources":["../../src/adapters/azure-openai.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,8 @@
1
+ export interface CallOptions {
2
+ temperature?: number;
3
+ topP?: number;
4
+ maxTokens?: number;
5
+ }
1
6
  export interface AdapterResponse {
2
7
  text: string;
3
8
  usage?: {
@@ -5,8 +10,22 @@ export interface AdapterResponse {
5
10
  outputTokens: number;
6
11
  };
7
12
  durationMs: number;
13
+ streamMetrics?: {
14
+ ttftMs: number;
15
+ tokensPerSecond: number;
16
+ interTokenLatencyMs: number;
17
+ };
18
+ }
19
+ export interface ChatMessage {
20
+ role: 'user' | 'assistant' | 'system';
21
+ content: string;
8
22
  }
9
23
  export interface ProviderAdapter {
10
- call(prompt: string, system?: string): Promise<AdapterResponse>;
24
+ call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
25
+ chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
26
+ stream?(prompt: string, system?: string, options?: CallOptions): AsyncGenerator<{
27
+ token: string;
28
+ timestampMs: number;
29
+ }>;
11
30
  }
12
31
  //# sourceMappingURL=base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/adapters/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACjE"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/adapters/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACvF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAChG,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzH"}
@@ -0,0 +1,11 @@
1
+ import type { AdapterResponse, CallOptions, ChatMessage, ProviderAdapter } from './base.js';
2
+ export declare class BedrockAdapter implements ProviderAdapter {
3
+ private model;
4
+ private region;
5
+ private accessKeyId;
6
+ private secretAccessKey;
7
+ constructor(model: string);
8
+ call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
9
+ chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
10
+ }
11
+ //# sourceMappingURL=bedrock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bedrock.d.ts","sourceRoot":"","sources":["../../src/adapters/bedrock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AA2G5F,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;gBAEpB,KAAK,EAAE,MAAM;IAenB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAItF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;CA+DtG"}
@@ -0,0 +1,145 @@
1
+ import * as crypto from 'node:crypto';
2
+ const MAX_RETRIES = 3;
3
+ const BASE_DELAY_MS = 1000;
4
+ async function withRetry(fn) {
5
+ let lastError;
6
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
7
+ try {
8
+ return await fn();
9
+ }
10
+ catch (err) {
11
+ lastError = err;
12
+ const status = err.status;
13
+ if (status !== 429 && !(status && status >= 500))
14
+ throw err;
15
+ const delay = BASE_DELAY_MS * Math.pow(2, attempt);
16
+ await new Promise((res) => setTimeout(res, delay));
17
+ }
18
+ }
19
+ throw lastError;
20
+ }
21
+ // ── Minimal AWS Signature V4 signer ─────────────────────────────────
22
+ // O(n) in payload size — single pass HMAC chain + SHA-256 hash
23
+ function hmacSha256(key, data) {
24
+ return crypto.createHmac('sha256', key).update(data, 'utf8').digest();
25
+ }
26
+ function sha256Hex(data) {
27
+ return crypto.createHash('sha256').update(data, 'utf8').digest('hex');
28
+ }
29
+ function signRequest(method, url, headers, body, region, service, accessKeyId, secretAccessKey) {
30
+ const now = new Date();
31
+ const dateStamp = now.toISOString().replace(/[-:T]/g, '').slice(0, 8);
32
+ const amzDate = dateStamp + 'T' + now.toISOString().replace(/[-:T]/g, '').slice(8, 14) + 'Z';
33
+ const payloadHash = sha256Hex(body);
34
+ // Canonical headers — must be sorted by name
35
+ const canonicalHeaders = {
36
+ 'content-type': headers['Content-Type'] ?? 'application/json',
37
+ host: url.host,
38
+ 'x-amz-content-sha256': payloadHash,
39
+ 'x-amz-date': amzDate,
40
+ };
41
+ const sortedHeaderNames = Object.keys(canonicalHeaders).sort();
42
+ const canonicalHeaderStr = sortedHeaderNames.map(k => `${k}:${canonicalHeaders[k]}\n`).join('');
43
+ const signedHeadersStr = sortedHeaderNames.join(';');
44
+ const canonicalPath = url.pathname;
45
+ const canonicalQueryString = url.search ? url.search.slice(1) : '';
46
+ const canonicalRequest = [
47
+ method,
48
+ canonicalPath,
49
+ canonicalQueryString,
50
+ canonicalHeaderStr,
51
+ signedHeadersStr,
52
+ payloadHash,
53
+ ].join('\n');
54
+ const credentialScope = `${dateStamp}/${region}/${service}/aws4_request`;
55
+ const stringToSign = [
56
+ 'AWS4-HMAC-SHA256',
57
+ amzDate,
58
+ credentialScope,
59
+ sha256Hex(canonicalRequest),
60
+ ].join('\n');
61
+ // Derive signing key: HMAC chain
62
+ const kDate = hmacSha256(`AWS4${secretAccessKey}`, dateStamp);
63
+ const kRegion = hmacSha256(kDate, region);
64
+ const kService = hmacSha256(kRegion, service);
65
+ const kSigning = hmacSha256(kService, 'aws4_request');
66
+ const signature = hmacSha256(kSigning, stringToSign).toString('hex');
67
+ return {
68
+ Authorization: `AWS4-HMAC-SHA256 Credential=${accessKeyId}/${credentialScope}, SignedHeaders=${signedHeadersStr}, Signature=${signature}`,
69
+ 'x-amz-date': amzDate,
70
+ 'x-amz-content-sha256': payloadHash,
71
+ };
72
+ }
73
+ export class BedrockAdapter {
74
+ model;
75
+ region;
76
+ accessKeyId;
77
+ secretAccessKey;
78
+ constructor(model) {
79
+ this.model = model;
80
+ this.region = process.env.AWS_REGION ?? 'us-east-1';
81
+ if (!process.env.AWS_ACCESS_KEY_ID) {
82
+ throw new Error('AWS_ACCESS_KEY_ID environment variable is required for bedrock provider');
83
+ }
84
+ if (!process.env.AWS_SECRET_ACCESS_KEY) {
85
+ throw new Error('AWS_SECRET_ACCESS_KEY environment variable is required for bedrock provider');
86
+ }
87
+ this.accessKeyId = process.env.AWS_ACCESS_KEY_ID;
88
+ this.secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
89
+ }
90
+ async call(prompt, system, options) {
91
+ return this.chat([{ role: 'user', content: prompt }], system, options);
92
+ }
93
+ async chat(messages, system, options) {
94
+ // Build Anthropic Messages API format (Bedrock uses the same schema for Claude models)
95
+ const apiMessages = [];
96
+ let effectiveSystem = system;
97
+ for (const msg of messages) {
98
+ if (msg.role === 'system') {
99
+ effectiveSystem = effectiveSystem ? `${effectiveSystem}\n\n${msg.content}` : msg.content;
100
+ }
101
+ else {
102
+ apiMessages.push({ role: msg.role, content: msg.content });
103
+ }
104
+ }
105
+ const body = {
106
+ anthropic_version: 'bedrock-2023-05-31',
107
+ max_tokens: options?.maxTokens ?? 1024,
108
+ messages: apiMessages,
109
+ };
110
+ if (effectiveSystem)
111
+ body.system = effectiveSystem;
112
+ if (options?.temperature !== undefined)
113
+ body.temperature = options.temperature;
114
+ if (options?.topP !== undefined)
115
+ body.top_p = options.topP;
116
+ const bodyStr = JSON.stringify(body);
117
+ const encodedModel = encodeURIComponent(this.model);
118
+ const endpoint = `https://bedrock-runtime.${this.region}.amazonaws.com/model/${encodedModel}/invoke`;
119
+ const url = new URL(endpoint);
120
+ const reqHeaders = { 'Content-Type': 'application/json' };
121
+ const sigHeaders = signRequest('POST', url, reqHeaders, bodyStr, this.region, 'bedrock', this.accessKeyId, this.secretAccessKey);
122
+ const startMs = Date.now();
123
+ const response = await withRetry(() => fetch(endpoint, {
124
+ method: 'POST',
125
+ headers: {
126
+ ...reqHeaders,
127
+ ...sigHeaders,
128
+ },
129
+ body: bodyStr,
130
+ }));
131
+ const durationMs = Date.now() - startMs;
132
+ if (!response.ok) {
133
+ const errorBody = await response.text().catch(() => '');
134
+ throw Object.assign(new Error(`Bedrock request failed: ${response.status} ${response.statusText} — ${errorBody}`), { status: response.status });
135
+ }
136
+ const data = (await response.json());
137
+ const textBlock = data.content?.find(c => c.type === 'text');
138
+ const text = textBlock?.text ?? '';
139
+ const usage = data.usage
140
+ ? { inputTokens: data.usage.input_tokens, outputTokens: data.usage.output_tokens }
141
+ : undefined;
142
+ return { text, usage, durationMs };
143
+ }
144
+ }
145
+ //# sourceMappingURL=bedrock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../src/adapters/bedrock.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- import type { AdapterResponse, ProviderAdapter } from './base.js';
1
+ import type { AdapterResponse, CallOptions, ChatMessage, ProviderAdapter } from './base.js';
2
2
  export declare class GeminiAdapter implements ProviderAdapter {
3
3
  private client;
4
4
  private model;
5
5
  constructor(model: string);
6
- call(prompt: string, system?: string): Promise<AdapterResponse>;
6
+ call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
7
+ chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
7
8
  }
8
9
  //# sourceMappingURL=gemini.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAsBlE,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAWnB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAkBtE"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAqB5F,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAWnB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAItF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;CAqDtG"}
@@ -10,7 +10,6 @@ async function withRetry(fn) {
10
10
  catch (err) {
11
11
  lastError = err;
12
12
  const status = err.status;
13
- // Only retry on rate limit (429) or server error (5xx)
14
13
  if (status !== 429 && !(status && status >= 500))
15
14
  throw err;
16
15
  const delay = BASE_DELAY_MS * Math.pow(2, attempt);
@@ -30,13 +29,48 @@ export class GeminiAdapter {
30
29
  }
31
30
  this.client = new GoogleGenerativeAI(apiKey);
32
31
  }
33
- async call(prompt, system) {
32
+ async call(prompt, system, options) {
33
+ return this.chat([{ role: 'user', content: prompt }], system, options);
34
+ }
35
+ async chat(messages, system, options) {
36
+ let effectiveSystem = system;
37
+ for (const msg of messages) {
38
+ if (msg.role === 'system') {
39
+ effectiveSystem = effectiveSystem ? `${effectiveSystem}\n\n${msg.content}` : msg.content;
40
+ }
41
+ }
42
+ const generationConfig = {};
43
+ if (options?.temperature !== undefined)
44
+ generationConfig.temperature = options.temperature;
45
+ if (options?.topP !== undefined)
46
+ generationConfig.topP = options.topP;
47
+ if (options?.maxTokens !== undefined)
48
+ generationConfig.maxOutputTokens = options.maxTokens;
34
49
  const generativeModel = this.client.getGenerativeModel({
35
50
  model: this.model,
36
- ...(system && { systemInstruction: system }),
51
+ ...(effectiveSystem && { systemInstruction: effectiveSystem }),
52
+ ...(Object.keys(generationConfig).length > 0 && { generationConfig }),
37
53
  });
54
+ const nonSystemMessages = messages.filter(m => m.role !== 'system');
55
+ if (nonSystemMessages.length === 1 && nonSystemMessages[0].role === 'user') {
56
+ const startMs = Date.now();
57
+ const result = await withRetry(() => generativeModel.generateContent(nonSystemMessages[0].content));
58
+ const durationMs = Date.now() - startMs;
59
+ const text = result.response.text();
60
+ const usageMetadata = result.response.usageMetadata;
61
+ const usage = usageMetadata
62
+ ? { inputTokens: usageMetadata.promptTokenCount ?? 0, outputTokens: usageMetadata.candidatesTokenCount ?? 0 }
63
+ : undefined;
64
+ return { text, usage, durationMs };
65
+ }
66
+ const history = nonSystemMessages.slice(0, -1).map(m => ({
67
+ role: m.role === 'assistant' ? 'model' : 'user',
68
+ parts: [{ text: m.content }],
69
+ }));
70
+ const lastMsg = nonSystemMessages[nonSystemMessages.length - 1];
71
+ const chat = generativeModel.startChat({ history });
38
72
  const startMs = Date.now();
39
- const result = await withRetry(() => generativeModel.generateContent(prompt));
73
+ const result = await withRetry(() => chat.sendMessage(lastMsg.content));
40
74
  const durationMs = Date.now() - startMs;
41
75
  const text = result.response.text();
42
76
  const usageMetadata = result.response.usageMetadata;
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,KAAK,UAAU,SAAS,CAAI,EAAoB;IAC9C,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,SAAS,GAAG,GAAG,CAAC;YAChB,MAAM,MAAM,GAAI,GAA2B,CAAC,MAAM,CAAC;YACnD,uDAAuD;YACvD,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,IAAI,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YAC5D,MAAM,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,aAAa;IAChB,MAAM,CAAqB;IAC3B,KAAK,CAAS;IAEtB,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,MAAe;QACxC,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;YACrD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,CAAC,MAAM,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC;SAC7C,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QAExC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;QACpD,MAAM,KAAK,GAAG,aAAa;YACzB,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,gBAAgB,IAAI,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,oBAAoB,IAAI,CAAC,EAAE;YAC7G,CAAC,CAAC,SAAS,CAAC;QAEd,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IACrC,CAAC;CACF"}
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,11 @@
1
1
  import type { ProviderAdapter } from './base.js';
2
2
  export declare function getAdapter(provider: string, model: string): ProviderAdapter;
3
+ /**
4
+ * Load a custom provider plugin from a JS file and wrap it as a ProviderAdapter.
5
+ * The plugin must export an object/class with at least a `call(prompt, system?)` method.
6
+ * An optional `chat(messages, system?)` method is used if present; otherwise chat
7
+ * falls back to call() with the last user message.
8
+ */
9
+ export declare function getCustomAdapter(pluginPath: string): Promise<ProviderAdapter>;
3
10
  export type { ProviderAdapter };
4
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAa3E;AAED,YAAY,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA6C,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5F,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAiB3E;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA0BnF;AAED,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -2,6 +2,8 @@ import { OpenAIAdapter } from './openai.js';
2
2
  import { AnthropicAdapter } from './anthropic.js';
3
3
  import { GeminiAdapter } from './gemini.js';
4
4
  import { OllamaAdapter } from './ollama.js';
5
+ import { AzureOpenAIAdapter } from './azure-openai.js';
6
+ import { BedrockAdapter } from './bedrock.js';
5
7
  export function getAdapter(provider, model) {
6
8
  switch (provider) {
7
9
  case 'openai':
@@ -12,8 +14,41 @@ export function getAdapter(provider, model) {
12
14
  return new GeminiAdapter(model);
13
15
  case 'ollama':
14
16
  return new OllamaAdapter(model);
17
+ case 'azure-openai':
18
+ return new AzureOpenAIAdapter(model);
19
+ case 'bedrock':
20
+ return new BedrockAdapter(model);
15
21
  default:
16
- throw new Error(`Unknown provider: "${provider}". Supported providers: openai, anthropic, gemini, ollama`);
22
+ throw new Error(`Unknown provider: "${provider}". Supported providers: openai, anthropic, gemini, ollama, azure-openai, bedrock`);
17
23
  }
18
24
  }
25
+ /**
26
+ * Load a custom provider plugin from a JS file and wrap it as a ProviderAdapter.
27
+ * The plugin must export an object/class with at least a `call(prompt, system?)` method.
28
+ * An optional `chat(messages, system?)` method is used if present; otherwise chat
29
+ * falls back to call() with the last user message.
30
+ */
31
+ export async function getCustomAdapter(pluginPath) {
32
+ let mod;
33
+ try {
34
+ mod = await import(pluginPath);
35
+ }
36
+ catch (e) {
37
+ throw new Error(`Failed to load custom provider plugin: ${pluginPath}: ${e.message}`);
38
+ }
39
+ // Support both CJS (module.exports = { call }) and ESM (export default { call })
40
+ const plugin = (typeof mod.default === 'object' && mod.default !== null ? mod.default : mod);
41
+ if (typeof plugin.call !== 'function') {
42
+ throw new Error(`Custom provider plugin must export a "call(prompt, system?)" method: ${pluginPath}`);
43
+ }
44
+ const callFn = plugin.call.bind(plugin);
45
+ const chatFn = typeof plugin.chat === 'function'
46
+ ? plugin.chat.bind(plugin)
47
+ : async (messages, system, _options) => {
48
+ // Fallback: concatenate messages into a single prompt
49
+ const lastUser = [...messages].reverse().find(m => m.role === 'user');
50
+ return callFn(lastUser?.content ?? '', system);
51
+ };
52
+ return { call: callFn, chat: chatFn };
53
+ }
19
54
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,KAAa;IACxD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,WAAW;YACd,OAAO,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACrC,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC;YACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,2DAA2D,CAAC,CAAC;IAC/G,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,KAAa;IACxD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,WAAW;YACd,OAAO,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACrC,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,cAAc;YACjB,OAAO,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,SAAS;YACZ,OAAO,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;QACnC;YACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,kFAAkF,CAAC,CAAC;IACtI,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IACvD,IAAI,GAA4B,CAAC;IACjC,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,0CAA0C,UAAU,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,iFAAiF;IACjF,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAA4B,CAAC;IAExH,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,wEAAwE,UAAU,EAAE,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAyF,CAAC;IAEhI,MAAM,MAAM,GAA4B,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU;QACvE,CAAC,CAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAmG;QAC7H,CAAC,CAAC,KAAK,EAAE,QAAuB,EAAE,MAAe,EAAE,QAAsB,EAAE,EAAE;YACzE,sDAAsD;YACtD,MAAM,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YACtE,OAAO,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC;IAEN,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACxC,CAAC"}
@@ -1,8 +1,9 @@
1
- import type { AdapterResponse, ProviderAdapter } from './base.js';
1
+ import type { AdapterResponse, CallOptions, ChatMessage, ProviderAdapter } from './base.js';
2
2
  export declare class OllamaAdapter implements ProviderAdapter {
3
3
  private baseUrl;
4
4
  private model;
5
5
  constructor(model: string);
6
- call(prompt: string, system?: string): Promise<AdapterResponse>;
6
+ call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
7
+ chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
7
8
  }
8
9
  //# sourceMappingURL=ollama.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AA4BlE,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAKnB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CA+BtE"}
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AA2B5F,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAKnB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAItF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;CA4CtG"}