@alextis59/athena 1.0.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 (201) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +147 -0
  3. package/dist/agent/ask.d.ts +7 -0
  4. package/dist/agent/ask.d.ts.map +1 -0
  5. package/dist/agent/ask.js +35 -0
  6. package/dist/agent/ask.js.map +1 -0
  7. package/dist/agent/citations.d.ts +27 -0
  8. package/dist/agent/citations.d.ts.map +1 -0
  9. package/dist/agent/citations.js +190 -0
  10. package/dist/agent/citations.js.map +1 -0
  11. package/dist/agent/fake-provider.d.ts +9 -0
  12. package/dist/agent/fake-provider.d.ts.map +1 -0
  13. package/dist/agent/fake-provider.js +51 -0
  14. package/dist/agent/fake-provider.js.map +1 -0
  15. package/dist/agent/index.d.ts +10 -0
  16. package/dist/agent/index.d.ts.map +1 -0
  17. package/dist/agent/index.js +6 -0
  18. package/dist/agent/index.js.map +1 -0
  19. package/dist/agent/loop.d.ts +11 -0
  20. package/dist/agent/loop.d.ts.map +1 -0
  21. package/dist/agent/loop.js +156 -0
  22. package/dist/agent/loop.js.map +1 -0
  23. package/dist/agent/providers.d.ts +17 -0
  24. package/dist/agent/providers.d.ts.map +1 -0
  25. package/dist/agent/providers.js +171 -0
  26. package/dist/agent/providers.js.map +1 -0
  27. package/dist/agent/tools.d.ts +8 -0
  28. package/dist/agent/tools.d.ts.map +1 -0
  29. package/dist/agent/tools.js +233 -0
  30. package/dist/agent/tools.js.map +1 -0
  31. package/dist/agent/types.d.ts +84 -0
  32. package/dist/agent/types.d.ts.map +1 -0
  33. package/dist/agent/types.js +2 -0
  34. package/dist/agent/types.js.map +1 -0
  35. package/dist/cli/help.d.ts +2 -0
  36. package/dist/cli/help.d.ts.map +1 -0
  37. package/dist/cli/help.js +28 -0
  38. package/dist/cli/help.js.map +1 -0
  39. package/dist/cli/main.d.ts +3 -0
  40. package/dist/cli/main.d.ts.map +1 -0
  41. package/dist/cli/main.js +5 -0
  42. package/dist/cli/main.js.map +1 -0
  43. package/dist/cli/options.d.ts +21 -0
  44. package/dist/cli/options.d.ts.map +1 -0
  45. package/dist/cli/options.js +97 -0
  46. package/dist/cli/options.js.map +1 -0
  47. package/dist/cli/run.d.ts +21 -0
  48. package/dist/cli/run.d.ts.map +1 -0
  49. package/dist/cli/run.js +144 -0
  50. package/dist/cli/run.js.map +1 -0
  51. package/dist/config/index.d.ts +4 -0
  52. package/dist/config/index.d.ts.map +1 -0
  53. package/dist/config/index.js +3 -0
  54. package/dist/config/index.js.map +1 -0
  55. package/dist/config/loader.d.ts +14 -0
  56. package/dist/config/loader.d.ts.map +1 -0
  57. package/dist/config/loader.js +352 -0
  58. package/dist/config/loader.js.map +1 -0
  59. package/dist/config/schema.d.ts +6 -0
  60. package/dist/config/schema.d.ts.map +1 -0
  61. package/dist/config/schema.js +72 -0
  62. package/dist/config/schema.js.map +1 -0
  63. package/dist/config/types.d.ts +53 -0
  64. package/dist/config/types.d.ts.map +1 -0
  65. package/dist/config/types.js +2 -0
  66. package/dist/config/types.js.map +1 -0
  67. package/dist/doctor/doctor.d.ts +47 -0
  68. package/dist/doctor/doctor.d.ts.map +1 -0
  69. package/dist/doctor/doctor.js +159 -0
  70. package/dist/doctor/doctor.js.map +1 -0
  71. package/dist/embeddings/index.d.ts +117 -0
  72. package/dist/embeddings/index.d.ts.map +1 -0
  73. package/dist/embeddings/index.js +515 -0
  74. package/dist/embeddings/index.js.map +1 -0
  75. package/dist/errors.d.ts +19 -0
  76. package/dist/errors.d.ts.map +1 -0
  77. package/dist/errors.js +37 -0
  78. package/dist/errors.js.map +1 -0
  79. package/dist/index.d.ts +17 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +9 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/indexer/discovery.d.ts +10 -0
  84. package/dist/indexer/discovery.d.ts.map +1 -0
  85. package/dist/indexer/discovery.js +38 -0
  86. package/dist/indexer/discovery.js.map +1 -0
  87. package/dist/indexer/hash.d.ts +3 -0
  88. package/dist/indexer/hash.d.ts.map +1 -0
  89. package/dist/indexer/hash.js +11 -0
  90. package/dist/indexer/hash.js.map +1 -0
  91. package/dist/indexer/index.d.ts +7 -0
  92. package/dist/indexer/index.d.ts.map +1 -0
  93. package/dist/indexer/index.js +5 -0
  94. package/dist/indexer/index.js.map +1 -0
  95. package/dist/indexer/kinds.d.ts +4 -0
  96. package/dist/indexer/kinds.d.ts.map +1 -0
  97. package/dist/indexer/kinds.js +38 -0
  98. package/dist/indexer/kinds.js.map +1 -0
  99. package/dist/indexer/run.d.ts +42 -0
  100. package/dist/indexer/run.d.ts.map +1 -0
  101. package/dist/indexer/run.js +563 -0
  102. package/dist/indexer/run.js.map +1 -0
  103. package/dist/logging/logger.d.ts +11 -0
  104. package/dist/logging/logger.d.ts.map +1 -0
  105. package/dist/logging/logger.js +18 -0
  106. package/dist/logging/logger.js.map +1 -0
  107. package/dist/mcp/index.d.ts +35 -0
  108. package/dist/mcp/index.d.ts.map +1 -0
  109. package/dist/mcp/index.js +392 -0
  110. package/dist/mcp/index.js.map +1 -0
  111. package/dist/parsers/chunking.d.ts +4 -0
  112. package/dist/parsers/chunking.d.ts.map +1 -0
  113. package/dist/parsers/chunking.js +112 -0
  114. package/dist/parsers/chunking.js.map +1 -0
  115. package/dist/parsers/index.d.ts +8 -0
  116. package/dist/parsers/index.d.ts.map +1 -0
  117. package/dist/parsers/index.js +5 -0
  118. package/dist/parsers/index.js.map +1 -0
  119. package/dist/parsers/line-parser.d.ts +13 -0
  120. package/dist/parsers/line-parser.d.ts.map +1 -0
  121. package/dist/parsers/line-parser.js +242 -0
  122. package/dist/parsers/line-parser.js.map +1 -0
  123. package/dist/parsers/normalize.d.ts +4 -0
  124. package/dist/parsers/normalize.d.ts.map +1 -0
  125. package/dist/parsers/normalize.js +17 -0
  126. package/dist/parsers/normalize.js.map +1 -0
  127. package/dist/parsers/parser.d.ts +14 -0
  128. package/dist/parsers/parser.d.ts.map +1 -0
  129. package/dist/parsers/parser.js +77 -0
  130. package/dist/parsers/parser.js.map +1 -0
  131. package/dist/parsers/pdf2llm.d.ts +14 -0
  132. package/dist/parsers/pdf2llm.d.ts.map +1 -0
  133. package/dist/parsers/pdf2llm.js +215 -0
  134. package/dist/parsers/pdf2llm.js.map +1 -0
  135. package/dist/parsers/types.d.ts +48 -0
  136. package/dist/parsers/types.d.ts.map +1 -0
  137. package/dist/parsers/types.js +2 -0
  138. package/dist/parsers/types.js.map +1 -0
  139. package/dist/retrieval/index.d.ts +4 -0
  140. package/dist/retrieval/index.d.ts.map +1 -0
  141. package/dist/retrieval/index.js +3 -0
  142. package/dist/retrieval/index.js.map +1 -0
  143. package/dist/retrieval/schemas.d.ts +127 -0
  144. package/dist/retrieval/schemas.d.ts.map +1 -0
  145. package/dist/retrieval/schemas.js +65 -0
  146. package/dist/retrieval/schemas.js.map +1 -0
  147. package/dist/retrieval/tools.d.ts +31 -0
  148. package/dist/retrieval/tools.d.ts.map +1 -0
  149. package/dist/retrieval/tools.js +803 -0
  150. package/dist/retrieval/tools.js.map +1 -0
  151. package/dist/retrieval/types.d.ts +104 -0
  152. package/dist/retrieval/types.d.ts.map +1 -0
  153. package/dist/retrieval/types.js +2 -0
  154. package/dist/retrieval/types.js.map +1 -0
  155. package/dist/server/index.d.ts +3 -0
  156. package/dist/server/index.d.ts.map +1 -0
  157. package/dist/server/index.js +2 -0
  158. package/dist/server/index.js.map +1 -0
  159. package/dist/server/server.d.ts +49 -0
  160. package/dist/server/server.d.ts.map +1 -0
  161. package/dist/server/server.js +517 -0
  162. package/dist/server/server.js.map +1 -0
  163. package/dist/shared/types.d.ts +98 -0
  164. package/dist/shared/types.d.ts.map +1 -0
  165. package/dist/shared/types.js +2 -0
  166. package/dist/shared/types.js.map +1 -0
  167. package/dist/storage/database.d.ts +18 -0
  168. package/dist/storage/database.d.ts.map +1 -0
  169. package/dist/storage/database.js +66 -0
  170. package/dist/storage/database.js.map +1 -0
  171. package/dist/storage/index.d.ts +8 -0
  172. package/dist/storage/index.d.ts.map +1 -0
  173. package/dist/storage/index.js +5 -0
  174. package/dist/storage/index.js.map +1 -0
  175. package/dist/storage/migrations.d.ts +15 -0
  176. package/dist/storage/migrations.d.ts.map +1 -0
  177. package/dist/storage/migrations.js +170 -0
  178. package/dist/storage/migrations.js.map +1 -0
  179. package/dist/storage/paths.d.ts +15 -0
  180. package/dist/storage/paths.d.ts.map +1 -0
  181. package/dist/storage/paths.js +27 -0
  182. package/dist/storage/paths.js.map +1 -0
  183. package/dist/storage/schema.d.ts +11 -0
  184. package/dist/storage/schema.d.ts.map +1 -0
  185. package/dist/storage/schema.js +40 -0
  186. package/dist/storage/schema.js.map +1 -0
  187. package/dist/ui/index.d.ts +2 -0
  188. package/dist/ui/index.d.ts.map +1 -0
  189. package/dist/ui/index.js +2 -0
  190. package/dist/ui/index.js.map +1 -0
  191. package/dist/ui/static-app.d.ts +2 -0
  192. package/dist/ui/static-app.d.ts.map +1 -0
  193. package/dist/ui/static-app.js +735 -0
  194. package/dist/ui/static-app.js.map +1 -0
  195. package/docs/adr/0001-sqlite-driver.md +23 -0
  196. package/docs/agentic-rag-specifications.md +659 -0
  197. package/docs/agentic-rag-study.md +1056 -0
  198. package/docs/implementation-plan.md +1425 -0
  199. package/docs/mcp-integration.md +154 -0
  200. package/docs/validation-corpus.md +71 -0
  201. package/package.json +79 -0
@@ -0,0 +1,156 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { UserFacingError } from "../errors.js";
3
+ import { RetrievalToolRuntime } from "../retrieval/index.js";
4
+ import { openDatabase, resolveAthenaPaths } from "../storage/index.js";
5
+ import { validateAnswerCitations } from "./citations.js";
6
+ import { createModelToolDefinitions, executeAgentTool } from "./tools.js";
7
+ export const DEFAULT_MAX_AGENT_STEPS = 6;
8
+ export async function* runAgentTurn(input) {
9
+ const maxSteps = input.maxSteps ?? DEFAULT_MAX_AGENT_STEPS;
10
+ if (!Number.isInteger(maxSteps) || maxSteps < 1) {
11
+ throw new UserFacingError("maxSteps must be a positive integer.");
12
+ }
13
+ const runtime = new RetrievalToolRuntime(input.root, input.dbPath);
14
+ const tools = createModelToolDefinitions();
15
+ const messages = buildModelMessages(input);
16
+ let answer = "";
17
+ try {
18
+ for (let step = 0; step < maxSteps; step += 1) {
19
+ const toolCalls = [];
20
+ let assistantText = "";
21
+ let finishReason = "stop";
22
+ for await (const event of input.provider.streamResponse({
23
+ model: input.model,
24
+ messages,
25
+ tools
26
+ })) {
27
+ if (event.type === "message_delta") {
28
+ answer += event.text;
29
+ assistantText += event.text;
30
+ yield event;
31
+ continue;
32
+ }
33
+ if (event.type === "tool_call") {
34
+ const toolCall = {
35
+ id: event.id,
36
+ name: event.name,
37
+ input: event.input
38
+ };
39
+ toolCalls.push(toolCall);
40
+ yield event;
41
+ continue;
42
+ }
43
+ finishReason = event.finishReason;
44
+ }
45
+ if (toolCalls.length === 0) {
46
+ yield* finishTurn(input, runtime, answer, finishReason);
47
+ return;
48
+ }
49
+ const assistantMessage = {
50
+ role: "assistant",
51
+ content: assistantText
52
+ };
53
+ if (toolCalls.length > 0) {
54
+ assistantMessage.toolCalls = toolCalls;
55
+ }
56
+ messages.push(assistantMessage);
57
+ for (const toolCall of toolCalls) {
58
+ const result = await executeAgentTool(runtime, toolCall.name, toolCall.input);
59
+ messages.push({
60
+ role: "tool",
61
+ toolCallId: toolCall.id,
62
+ name: toolCall.name,
63
+ content: JSON.stringify(result.payload)
64
+ });
65
+ yield {
66
+ type: "tool_result",
67
+ id: toolCall.id,
68
+ name: toolCall.name,
69
+ result
70
+ };
71
+ }
72
+ }
73
+ const budgetAnswer = "Athena could not complete the answer within the tool budget.";
74
+ answer =
75
+ answer.trim() === "" ? budgetAnswer : `${answer}\n\n${budgetAnswer}`;
76
+ yield* finishTurn(input, runtime, answer, "tool_budget");
77
+ }
78
+ finally {
79
+ runtime.close();
80
+ }
81
+ }
82
+ export function buildModelMessages(input) {
83
+ const messages = [
84
+ {
85
+ role: "system",
86
+ content: [
87
+ "You are Athena, a local-first documentation RAG agent.",
88
+ "Use only Athena tools for repository facts.",
89
+ "Cite text sources as [path:start-end] and PDF sources as [path.pdf p.N].",
90
+ "If evidence is missing, say what could not be verified."
91
+ ].join(" ")
92
+ }
93
+ ];
94
+ for (const turn of input.previousTurns ?? []) {
95
+ messages.push({ role: "user", content: turn.question });
96
+ messages.push({ role: "assistant", content: turn.answerSummary });
97
+ }
98
+ const pinnedSources = input.pinnedSources === undefined || input.pinnedSources.length === 0
99
+ ? ""
100
+ : `\nPinned sources: ${input.pinnedSources.join(", ")}`;
101
+ messages.push({
102
+ role: "user",
103
+ content: `${input.question}${pinnedSources}`
104
+ });
105
+ return messages;
106
+ }
107
+ export { createModelToolDefinitions };
108
+ async function* finishTurn(input, runtime, answer, finishReason) {
109
+ const citations = await validateAnswerCitations({
110
+ root: input.root,
111
+ answer,
112
+ runtime
113
+ });
114
+ persistConversationTurn(input, answer, citations);
115
+ yield {
116
+ type: "complete",
117
+ finishReason,
118
+ answer
119
+ };
120
+ }
121
+ function persistConversationTurn(input, answer, citations) {
122
+ const paths = resolveAthenaPaths(input.root, input.dbPath);
123
+ const database = openDatabase(paths.databasePath, {
124
+ fileMustExist: true
125
+ });
126
+ const createdAt = new Date().toISOString();
127
+ try {
128
+ const turnId = randomUUID();
129
+ database
130
+ .prepare([
131
+ "INSERT INTO conversation_turns",
132
+ "(id, question, answer_summary, citations_json, pinned_sources_json, created_at)",
133
+ "VALUES (?, ?, ?, ?, ?, ?)"
134
+ ].join(" "))
135
+ .run(turnId, input.question, summarizeAnswer(answer), JSON.stringify(citations), JSON.stringify(input.pinnedSources ?? []), createdAt);
136
+ const insertCitation = database.prepare([
137
+ "INSERT INTO answer_citations",
138
+ "(id, turn_id, chunk_id, source_path, locator_json, label, created_at)",
139
+ "VALUES (?, ?, ?, ?, ?, ?, ?)"
140
+ ].join(" "));
141
+ for (const citation of citations) {
142
+ insertCitation.run(randomUUID(), turnId, citation.chunkId ?? null, citation.locator.path, JSON.stringify(citation.locator), citation.label, createdAt);
143
+ }
144
+ }
145
+ finally {
146
+ database.close();
147
+ }
148
+ }
149
+ function summarizeAnswer(answer) {
150
+ const normalized = answer.trim().replace(/\s+/gu, " ");
151
+ if (normalized.length <= 1_000) {
152
+ return normalized;
153
+ }
154
+ return `${normalized.slice(0, 997)}...`;
155
+ }
156
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ChatProviderConfig } from "../config/index.js";
2
+ import type { ModelEvent, ModelProvider, ModelProviderRequest } from "./types.js";
3
+ export type FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
4
+ export interface CreateModelProviderOptions {
5
+ env?: NodeJS.ProcessEnv;
6
+ fetch?: FetchLike;
7
+ ollamaBaseUrl?: string;
8
+ }
9
+ export declare function createConfiguredModelProvider(config: ChatProviderConfig, options?: CreateModelProviderOptions): ModelProvider;
10
+ export declare function validateModelProviderConfig(config: ChatProviderConfig, env?: NodeJS.ProcessEnv): void;
11
+ export declare class OllamaModelProvider implements ModelProvider {
12
+ private readonly baseUrl;
13
+ private readonly fetchImpl;
14
+ constructor(options?: CreateModelProviderOptions);
15
+ streamResponse(input: ModelProviderRequest): AsyncIterable<ModelEvent>;
16
+ }
17
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/agent/providers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EACV,UAAU,EAGV,aAAa,EACb,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,SAAS,GAAG,CACtB,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAC7B,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,WAAW,0BAA0B;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAyBD,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,0BAA+B,GACvC,aAAa,CAoBf;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,kBAAkB,EAC1B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,IAAI,CAoBN;AAED,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAEnB,OAAO,GAAE,0BAA+B;IAS7C,cAAc,CAC1B,KAAK,EAAE,oBAAoB,GAC1B,aAAa,CAAC,UAAU,CAAC;CAsD7B"}
@@ -0,0 +1,171 @@
1
+ import { UserFacingError } from "../errors.js";
2
+ const credentialEnvByProvider = {
3
+ openai: "OPENAI_API_KEY",
4
+ anthropic: "ANTHROPIC_API_KEY",
5
+ gemini: "GEMINI_API_KEY"
6
+ };
7
+ export function createConfiguredModelProvider(config, options = {}) {
8
+ validateModelProviderConfig(config, options.env);
9
+ if (config.provider === "ollama") {
10
+ const providerOptions = {};
11
+ if (options.ollamaBaseUrl !== undefined) {
12
+ providerOptions.ollamaBaseUrl = options.ollamaBaseUrl;
13
+ }
14
+ if (options.fetch !== undefined) {
15
+ providerOptions.fetch = options.fetch;
16
+ }
17
+ return new OllamaModelProvider(providerOptions);
18
+ }
19
+ throw new UserFacingError(`Chat provider '${config.provider}' is validated but no Athena adapter is implemented yet.`);
20
+ }
21
+ export function validateModelProviderConfig(config, env = process.env) {
22
+ if (config.provider === "none") {
23
+ throw new UserFacingError("No chat provider configured. Set chat.provider and chat.model before asking questions.");
24
+ }
25
+ if (config.model === null || config.model.trim() === "") {
26
+ throw new UserFacingError(`chat.model is required when chat.provider is '${config.provider}'.`);
27
+ }
28
+ const credentialEnv = credentialEnvByProvider[config.provider];
29
+ if (credentialEnv !== undefined && env[credentialEnv] === undefined) {
30
+ throw new UserFacingError(`${credentialEnv} is required when chat.provider is '${config.provider}'.`);
31
+ }
32
+ }
33
+ export class OllamaModelProvider {
34
+ baseUrl;
35
+ fetchImpl;
36
+ constructor(options = {}) {
37
+ this.baseUrl = normalizeBaseUrl(options.ollamaBaseUrl ??
38
+ process.env.OLLAMA_HOST ??
39
+ "http://127.0.0.1:11434");
40
+ this.fetchImpl = options.fetch ?? fetch;
41
+ }
42
+ async *streamResponse(input) {
43
+ const response = await this.fetchImpl(`${this.baseUrl}/api/chat`, {
44
+ method: "POST",
45
+ headers: { "content-type": "application/json" },
46
+ body: JSON.stringify(toOllamaRequest(input))
47
+ });
48
+ if (!response.ok) {
49
+ throw new UserFacingError(`Ollama chat request failed with HTTP ${String(response.status)}.`);
50
+ }
51
+ if (response.body === null) {
52
+ throw new UserFacingError("Ollama chat response did not include a stream.");
53
+ }
54
+ const reader = response.body.getReader();
55
+ const decoder = new TextDecoder();
56
+ let buffer = "";
57
+ try {
58
+ for (;;) {
59
+ const chunk = await reader.read();
60
+ if (chunk.done) {
61
+ break;
62
+ }
63
+ buffer += decoder.decode(chunk.value, { stream: true });
64
+ const lines = buffer.split("\n");
65
+ buffer = lines.pop() ?? "";
66
+ for (const line of lines) {
67
+ for (const event of parseOllamaLine(line)) {
68
+ yield event;
69
+ }
70
+ }
71
+ }
72
+ buffer += decoder.decode();
73
+ if (buffer.trim() !== "") {
74
+ for (const event of parseOllamaLine(buffer)) {
75
+ yield event;
76
+ }
77
+ }
78
+ }
79
+ finally {
80
+ reader.releaseLock();
81
+ }
82
+ }
83
+ }
84
+ function toOllamaRequest(input) {
85
+ const body = {
86
+ model: input.model,
87
+ stream: true,
88
+ messages: input.messages.map(toOllamaMessage)
89
+ };
90
+ if (input.tools.length > 0) {
91
+ body.tools = input.tools.map(toOllamaTool);
92
+ }
93
+ if (input.temperature !== undefined) {
94
+ body.options = { temperature: input.temperature };
95
+ }
96
+ return body;
97
+ }
98
+ function toOllamaMessage(message) {
99
+ if (message.role === "tool") {
100
+ return {
101
+ role: "tool",
102
+ content: message.content,
103
+ tool_call_id: message.toolCallId,
104
+ name: message.name
105
+ };
106
+ }
107
+ if (message.role === "assistant" && message.toolCalls !== undefined) {
108
+ return {
109
+ role: "assistant",
110
+ content: message.content,
111
+ tool_calls: message.toolCalls.map((toolCall) => ({
112
+ id: toolCall.id,
113
+ function: {
114
+ name: toolCall.name,
115
+ arguments: toolCall.input
116
+ }
117
+ }))
118
+ };
119
+ }
120
+ return {
121
+ role: message.role,
122
+ content: message.content
123
+ };
124
+ }
125
+ function toOllamaTool(tool) {
126
+ return {
127
+ type: "function",
128
+ function: {
129
+ name: tool.name,
130
+ description: tool.description,
131
+ parameters: tool.inputSchema
132
+ }
133
+ };
134
+ }
135
+ function parseOllamaLine(line) {
136
+ const trimmed = line.trim();
137
+ if (trimmed === "") {
138
+ return [];
139
+ }
140
+ const chunk = JSON.parse(trimmed);
141
+ const events = [];
142
+ if (chunk.message?.content !== undefined && chunk.message.content !== "") {
143
+ events.push({ type: "message_delta", text: chunk.message.content });
144
+ }
145
+ for (const [index, toolCall] of (chunk.message?.tool_calls ?? []).entries()) {
146
+ const name = toolCall.function?.name;
147
+ if (name === undefined || name === "") {
148
+ continue;
149
+ }
150
+ events.push({
151
+ type: "tool_call",
152
+ id: toolCall.id ?? `ollama-tool-${String(index + 1)}`,
153
+ name,
154
+ input: toolCall.function?.arguments ?? {}
155
+ });
156
+ }
157
+ if (chunk.done === true) {
158
+ events.push({
159
+ type: "complete",
160
+ finishReason: toFinishReason(chunk.done_reason)
161
+ });
162
+ }
163
+ return events;
164
+ }
165
+ function toFinishReason(reason) {
166
+ return reason === "length" ? "length" : "stop";
167
+ }
168
+ function normalizeBaseUrl(baseUrl) {
169
+ return baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
170
+ }
171
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/agent/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAuC/C,MAAM,uBAAuB,GAA0C;IACrE,MAAM,EAAE,gBAAgB;IACxB,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAEF,MAAM,UAAU,6BAA6B,CAC3C,MAA0B,EAC1B,UAAsC,EAAE;IAExC,2BAA2B,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,eAAe,GAA+B,EAAE,CAAC;QAEvD,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACxC,eAAe,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QACxD,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,eAAe,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QACxC,CAAC;QAED,OAAO,IAAI,mBAAmB,CAAC,eAAe,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,eAAe,CACvB,kBAAkB,MAAM,CAAC,QAAQ,0DAA0D,CAC5F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,MAA0B,EAC1B,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,IAAI,eAAe,CACvB,wFAAwF,CACzF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,eAAe,CACvB,iDAAiD,MAAM,CAAC,QAAQ,IAAI,CACrE,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE/D,IAAI,aAAa,KAAK,SAAS,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,SAAS,EAAE,CAAC;QACpE,MAAM,IAAI,eAAe,CACvB,GAAG,aAAa,uCAAuC,MAAM,CAAC,QAAQ,IAAI,CAC3E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,OAAO,mBAAmB;IACb,OAAO,CAAS;IAChB,SAAS,CAAY;IAEtC,YAAmB,UAAsC,EAAE;QACzD,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAC7B,OAAO,CAAC,aAAa;YACnB,OAAO,CAAC,GAAG,CAAC,WAAW;YACvB,wBAAwB,CAC3B,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IAC1C,CAAC;IAEM,KAAK,CAAC,CAAC,cAAc,CAC1B,KAA2B;QAE3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;SAC7C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,eAAe,CACvB,wCAAwC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CACnE,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,eAAe,CACvB,gDAAgD,CACjD,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GACV,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,SAAS,CAAC;gBACR,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAElC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACf,MAAM;gBACR,CAAC;gBAED,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC1C,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAE3B,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACzB,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5C,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAED,SAAS,eAAe,CAAC,KAA2B;IAClD,MAAM,IAAI,GAA4B;QACpC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;KAC9C,CAAC;IAEF,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,OAAqB;IAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,YAAY,EAAE,OAAO,CAAC,UAAU;YAChC,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpE,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC/C,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,SAAS,EAAE,QAAQ,CAAC,KAAK;iBAC1B;aACF,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAyB;IAC7C,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,WAAW;SAC7B;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;IACvD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5E,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;QAErC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YACtC,SAAS;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,QAAQ,CAAC,EAAE,IAAI,eAAe,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE;YACrD,IAAI;YACJ,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,UAAU;YAChB,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC;SAChD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,MAA0B;IAChD,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AACjD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAChE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { toolSchemas } from "../retrieval/index.js";
2
+ import type { RetrievalToolRuntime } from "../retrieval/index.js";
3
+ import type { ToolResult } from "../shared/types.js";
4
+ import type { ModelToolDefinition } from "./types.js";
5
+ export type AgentToolName = keyof typeof toolSchemas;
6
+ export declare function createModelToolDefinitions(): ModelToolDefinition[];
7
+ export declare function executeAgentTool(runtime: RetrievalToolRuntime, name: string, input: unknown): Promise<ToolResult>;
8
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/agent/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAKV,oBAAoB,EAGrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,WAAW,CAAC;AAuBrD,wBAAgB,0BAA0B,IAAI,mBAAmB,EAAE,CAMlE;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC,CAarB"}
@@ -0,0 +1,233 @@
1
+ import { UserFacingError } from "../errors.js";
2
+ import { toolSchemas } from "../retrieval/index.js";
3
+ const toolDescriptions = {
4
+ searchDocs: "Search indexed documentation chunks.",
5
+ readSourceRange: "Read exact source lines from an indexed document.",
6
+ readPdfSource: "Read generated Markdown and source-map metadata for an indexed PDF.",
7
+ grepDocs: "Search indexed source files for an exact string or regex.",
8
+ listDocs: "List indexed documentation sources.",
9
+ relatedChunks: "Fetch neighboring chunks around a retrieved chunk."
10
+ };
11
+ const sourceKinds = new Set([
12
+ "markdown",
13
+ "mdx",
14
+ "text",
15
+ "rst",
16
+ "asciidoc",
17
+ "html",
18
+ "pdf",
19
+ "unknown"
20
+ ]);
21
+ export function createModelToolDefinitions() {
22
+ return Object.entries(toolSchemas).map(([name, schema]) => ({
23
+ name,
24
+ description: toolDescriptions[name],
25
+ inputSchema: { ...schema }
26
+ }));
27
+ }
28
+ export async function executeAgentTool(runtime, name, input) {
29
+ const beforeSeenChunkIds = new Set(runtime.trace.seenChunkIds);
30
+ const beforeReadCount = runtime.trace.readLocators.length;
31
+ const payload = await executeValidatedTool(runtime, name, input);
32
+ return {
33
+ toolName: name,
34
+ payload,
35
+ retrievedChunkIds: [...runtime.trace.seenChunkIds].filter((chunkId) => !beforeSeenChunkIds.has(chunkId)),
36
+ readLocators: runtime.trace.readLocators.slice(beforeReadCount)
37
+ };
38
+ }
39
+ async function executeValidatedTool(runtime, name, input) {
40
+ switch (name) {
41
+ case "searchDocs":
42
+ return runtime.searchDocs(readSearchDocsInput(input));
43
+ case "readSourceRange":
44
+ return await runtime.readSourceRange(readSourceRangeInput(input));
45
+ case "readPdfSource":
46
+ return runtime.readPdfSource(readPdfSourceInput(input));
47
+ case "grepDocs":
48
+ return await runtime.grepDocs(readGrepDocsInput(input));
49
+ case "listDocs":
50
+ return runtime.listDocs(readListDocsInput(input));
51
+ case "relatedChunks":
52
+ return runtime.relatedChunks(readRelatedChunksInput(input));
53
+ default:
54
+ throw new UserFacingError(`Unknown Athena tool: ${name}`);
55
+ }
56
+ }
57
+ function readSearchDocsInput(input) {
58
+ const record = readRecord(input, "searchDocs input");
59
+ assertOnlyKeys(record, ["query", "limit", "pathPrefix", "kind"], "searchDocs");
60
+ const result = {
61
+ query: readRequiredString(record, "query")
62
+ };
63
+ readOptionalLimit(record, "limit", 1, 50, (limit) => {
64
+ result.limit = limit;
65
+ });
66
+ readOptionalPathPrefix(record, result);
67
+ readOptionalKind(record, result);
68
+ return result;
69
+ }
70
+ function readSourceRangeInput(input) {
71
+ const record = readRecord(input, "readSourceRange input");
72
+ assertOnlyKeys(record, ["path", "startLine", "endLine"], "readSourceRange");
73
+ const path = readRequiredPath(record, "path");
74
+ const startLine = readRequiredInteger(record, "startLine", 1);
75
+ const endLine = readRequiredInteger(record, "endLine", 1);
76
+ if (endLine < startLine) {
77
+ throw new UserFacingError("readSourceRange endLine must be greater than or equal to startLine.");
78
+ }
79
+ return {
80
+ path,
81
+ startLine,
82
+ endLine
83
+ };
84
+ }
85
+ function readPdfSourceInput(input) {
86
+ const record = readRecord(input, "readPdfSource input");
87
+ assertOnlyKeys(record, ["path", "page", "regionId"], "readPdfSource");
88
+ const result = {
89
+ path: readRequiredPath(record, "path")
90
+ };
91
+ if (record.page !== undefined) {
92
+ result.page = readRequiredInteger(record, "page", 1);
93
+ }
94
+ if (record.regionId !== undefined) {
95
+ result.regionId = readRequiredString(record, "regionId");
96
+ }
97
+ return result;
98
+ }
99
+ function readGrepDocsInput(input) {
100
+ const record = readRecord(input, "grepDocs input");
101
+ assertOnlyKeys(record, ["pattern", "regex", "limit", "pathPrefix", "kind"], "grepDocs");
102
+ const result = {
103
+ pattern: readRequiredString(record, "pattern")
104
+ };
105
+ if (result.pattern.length > 128) {
106
+ throw new UserFacingError("grepDocs pattern must be 128 characters or fewer.");
107
+ }
108
+ readOptionalBoolean(record, "regex", (regex) => {
109
+ result.regex = regex;
110
+ });
111
+ readOptionalLimit(record, "limit", 1, 100, (limit) => {
112
+ result.limit = limit;
113
+ });
114
+ readOptionalPathPrefix(record, result);
115
+ readOptionalKind(record, result);
116
+ return result;
117
+ }
118
+ function readListDocsInput(input) {
119
+ const record = readRecord(input, "listDocs input");
120
+ assertOnlyKeys(record, ["pathPrefix", "kind", "limit"], "listDocs");
121
+ const result = {};
122
+ readOptionalLimit(record, "limit", 1, 500, (limit) => {
123
+ result.limit = limit;
124
+ });
125
+ readOptionalPathPrefix(record, result);
126
+ readOptionalKind(record, result);
127
+ return result;
128
+ }
129
+ function readRelatedChunksInput(input) {
130
+ const record = readRecord(input, "relatedChunks input");
131
+ assertOnlyKeys(record, ["chunkId", "before", "after"], "relatedChunks");
132
+ const result = {
133
+ chunkId: readRequiredString(record, "chunkId")
134
+ };
135
+ readOptionalLimit(record, "before", 0, 10, (before) => {
136
+ result.before = before;
137
+ });
138
+ readOptionalLimit(record, "after", 0, 10, (after) => {
139
+ result.after = after;
140
+ });
141
+ return result;
142
+ }
143
+ function readRecord(input, label) {
144
+ if (typeof input !== "object" || input === null || Array.isArray(input)) {
145
+ throw new UserFacingError(`${label} must be an object.`);
146
+ }
147
+ return input;
148
+ }
149
+ function assertOnlyKeys(record, allowedKeys, toolName) {
150
+ const allowed = new Set(allowedKeys);
151
+ const unknownKeys = Object.keys(record).filter((key) => !allowed.has(key));
152
+ if (unknownKeys.length > 0) {
153
+ throw new UserFacingError(`${toolName} received unsupported fields: ${unknownKeys.join(", ")}.`);
154
+ }
155
+ }
156
+ function readRequiredString(record, field) {
157
+ const value = record[field];
158
+ if (typeof value !== "string" || value.trim() === "") {
159
+ throw new UserFacingError(`${field} must be a non-empty string.`);
160
+ }
161
+ return value;
162
+ }
163
+ function readRequiredPath(record, field) {
164
+ const value = readRequiredString(record, field);
165
+ if (value.includes("..") || value.startsWith("/")) {
166
+ throw new UserFacingError(`${field} must be repository-relative.`);
167
+ }
168
+ return value;
169
+ }
170
+ function readRequiredInteger(record, field, min) {
171
+ const value = record[field];
172
+ if (typeof value !== "number" || !Number.isInteger(value) || value < min) {
173
+ throw new UserFacingError(`${field} must be an integer greater than or equal to ${String(min)}.`);
174
+ }
175
+ return value;
176
+ }
177
+ function readOptionalLimit(record, field, min, max, setValue) {
178
+ const value = record[field];
179
+ if (value === undefined) {
180
+ return;
181
+ }
182
+ if (typeof value !== "number" ||
183
+ !Number.isInteger(value) ||
184
+ value < min ||
185
+ value > max) {
186
+ throw new UserFacingError(`${field} must be an integer between ${String(min)} and ${String(max)}.`);
187
+ }
188
+ setValue(value);
189
+ }
190
+ function readOptionalBoolean(record, field, setValue) {
191
+ const value = record[field];
192
+ if (value === undefined) {
193
+ return;
194
+ }
195
+ if (typeof value !== "boolean") {
196
+ throw new UserFacingError(`${field} must be a boolean.`);
197
+ }
198
+ setValue(value);
199
+ }
200
+ function readOptionalPathPrefix(record, result) {
201
+ const value = record.pathPrefix;
202
+ if (value === undefined) {
203
+ return;
204
+ }
205
+ if (typeof value !== "string" ||
206
+ value.includes("..") ||
207
+ value.startsWith("/")) {
208
+ throw new UserFacingError("pathPrefix must be repository-relative.");
209
+ }
210
+ result.pathPrefix = value;
211
+ }
212
+ function readOptionalKind(record, result) {
213
+ const value = record.kind;
214
+ if (value === undefined) {
215
+ return;
216
+ }
217
+ if (typeof value !== "string" || !sourceKinds.has(value)) {
218
+ throw new UserFacingError(`Unsupported source kind: ${describeValue(value)}.`);
219
+ }
220
+ result.kind = value;
221
+ }
222
+ function describeValue(value) {
223
+ if (typeof value === "string" ||
224
+ typeof value === "number" ||
225
+ typeof value === "boolean") {
226
+ return String(value);
227
+ }
228
+ if (value === null) {
229
+ return "null";
230
+ }
231
+ return typeof value;
232
+ }
233
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/agent/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAepD,MAAM,gBAAgB,GAAkC;IACtD,UAAU,EAAE,sCAAsC;IAClD,eAAe,EAAE,mDAAmD;IACpE,aAAa,EACX,qEAAqE;IACvE,QAAQ,EAAE,2DAA2D;IACrE,QAAQ,EAAE,qCAAqC;IAC/C,aAAa,EAAE,oDAAoD;CACpE,CAAC;AAEF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAa;IACtC,UAAU;IACV,KAAK;IACL,MAAM;IACN,KAAK;IACL,UAAU;IACV,MAAM;IACN,KAAK;IACL,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,UAAU,0BAA0B;IACxC,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI;QACJ,WAAW,EAAE,gBAAgB,CAAC,IAAqB,CAAC;QACpD,WAAW,EAAE,EAAE,GAAG,MAAM,EAAE;KAC3B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAA6B,EAC7B,IAAY,EACZ,KAAc;IAEd,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAEjE,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,OAAO;QACP,iBAAiB,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CACvD,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAC9C;QACD,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,OAA6B,EAC7B,IAAY,EACZ,KAAc;IAEd,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY;YACf,OAAO,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,KAAK,iBAAiB;YACpB,OAAO,MAAM,OAAO,CAAC,eAAe,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,KAAK,eAAe;YAClB,OAAO,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,KAAK,UAAU;YACb,OAAO,MAAM,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,KAAK,UAAU;YACb,OAAO,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACpD,KAAK,eAAe;YAClB,OAAO,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D;YACE,MAAM,IAAI,eAAe,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACrD,cAAc,CACZ,MAAM,EACN,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EACxC,YAAY,CACb,CAAC;IACF,MAAM,MAAM,GAAoB;QAC9B,KAAK,EAAE,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC;KAC3C,CAAC;IAEF,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;IAC1D,cAAc,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAE1D,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,eAAe,CACvB,qEAAqE,CACtE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI;QACJ,SAAS;QACT,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IACxD,cAAc,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,eAAe,CAAC,CAAC;IACtE,MAAM,MAAM,GAAuB;QACjC,IAAI,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;KACvC,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACnD,cAAc,CACZ,MAAM,EACN,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EACnD,UAAU,CACX,CAAC;IACF,MAAM,MAAM,GAAkB;QAC5B,OAAO,EAAE,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC;KAC/C,CAAC;IAEF,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAChC,MAAM,IAAI,eAAe,CACvB,mDAAmD,CACpD,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC7C,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;QACnD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACnD,cAAc,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IACpE,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;QACnD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IACxD,cAAc,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC;IACxE,MAAM,MAAM,GAAuB;QACjC,OAAO,EAAE,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC;KAC/C,CAAC;IAEF,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;QACpD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,KAAa;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,eAAe,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CACrB,MAA+B,EAC/B,WAA8B,EAC9B,QAAgB;IAEhB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE3E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,eAAe,CACvB,GAAG,QAAQ,iCAAiC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACtE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,MAA+B,EAC/B,KAAa;IAEb,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,eAAe,CAAC,GAAG,KAAK,8BAA8B,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CACvB,MAA+B,EAC/B,KAAa;IAEb,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAEhD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,eAAe,CAAC,GAAG,KAAK,+BAA+B,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAA+B,EAC/B,KAAa,EACb,GAAW;IAEX,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QACzE,MAAM,IAAI,eAAe,CACvB,GAAG,KAAK,gDAAgD,MAAM,CAAC,GAAG,CAAC,GAAG,CACvE,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CACxB,MAA+B,EAC/B,KAAa,EACb,GAAW,EACX,GAAW,EACX,QAAiC;IAEjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QACxB,KAAK,GAAG,GAAG;QACX,KAAK,GAAG,GAAG,EACX,CAAC;QACD,MAAM,IAAI,eAAe,CACvB,GAAG,KAAK,+BAA+B,MAAM,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,GAAG,CAAC,GAAG,CACzE,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAA+B,EAC/B,KAAa,EACb,QAAkC;IAElC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,eAAe,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;IAC3D,CAAC;IAED,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,sBAAsB,CAC7B,MAA+B,EAC/B,MAA+B;IAE/B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;IAEhC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EACrB,CAAC;QACD,MAAM,IAAI,eAAe,CAAC,yCAAyC,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;AAC5B,CAAC;AAED,SAAS,gBAAgB,CACvB,MAA+B,EAC/B,MAA6B;IAE7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;IAE1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAmB,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,eAAe,CACvB,4BAA4B,aAAa,CAAC,KAAK,CAAC,GAAG,CACpD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAI,GAAG,KAAmB,CAAC;AACpC,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,SAAS,EAC1B,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,OAAO,KAAK,CAAC;AACtB,CAAC"}