neoctl 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +146 -0
  2. package/dist/agents/agent-definition.d.ts +39 -0
  3. package/dist/agents/agent-definition.js +57 -0
  4. package/dist/agents/agent-definition.js.map +1 -0
  5. package/dist/agents/agent-tool.d.ts +38 -0
  6. package/dist/agents/agent-tool.js +336 -0
  7. package/dist/agents/agent-tool.js.map +1 -0
  8. package/dist/agents/local-agent-task.d.ts +52 -0
  9. package/dist/agents/local-agent-task.js +63 -0
  10. package/dist/agents/local-agent-task.js.map +1 -0
  11. package/dist/agents/smoke-agents.d.ts +1 -0
  12. package/dist/agents/smoke-agents.js +142 -0
  13. package/dist/agents/smoke-agents.js.map +1 -0
  14. package/dist/agents/team.d.ts +10 -0
  15. package/dist/agents/team.js +2 -0
  16. package/dist/agents/team.js.map +1 -0
  17. package/dist/app/app-state.d.ts +21 -0
  18. package/dist/app/app-state.js +24 -0
  19. package/dist/app/app-state.js.map +1 -0
  20. package/dist/context/compaction.d.ts +49 -0
  21. package/dist/context/compaction.js +334 -0
  22. package/dist/context/compaction.js.map +1 -0
  23. package/dist/context/context-manager.d.ts +53 -0
  24. package/dist/context/context-manager.js +98 -0
  25. package/dist/context/context-manager.js.map +1 -0
  26. package/dist/context/prompts.d.ts +22 -0
  27. package/dist/context/prompts.js +84 -0
  28. package/dist/context/prompts.js.map +1 -0
  29. package/dist/context/smoke-context.d.ts +1 -0
  30. package/dist/context/smoke-context.js +151 -0
  31. package/dist/context/smoke-context.js.map +1 -0
  32. package/dist/core/assistant-output-filter.d.ts +9 -0
  33. package/dist/core/assistant-output-filter.js +78 -0
  34. package/dist/core/assistant-output-filter.js.map +1 -0
  35. package/dist/core/context-metrics.d.ts +10 -0
  36. package/dist/core/context-metrics.js +77 -0
  37. package/dist/core/context-metrics.js.map +1 -0
  38. package/dist/core/message-pipeline.d.ts +10 -0
  39. package/dist/core/message-pipeline.js +138 -0
  40. package/dist/core/message-pipeline.js.map +1 -0
  41. package/dist/core/query-engine.d.ts +86 -0
  42. package/dist/core/query-engine.js +337 -0
  43. package/dist/core/query-engine.js.map +1 -0
  44. package/dist/core/query.d.ts +47 -0
  45. package/dist/core/query.js +408 -0
  46. package/dist/core/query.js.map +1 -0
  47. package/dist/core/run-agent.d.ts +48 -0
  48. package/dist/core/run-agent.js +150 -0
  49. package/dist/core/run-agent.js.map +1 -0
  50. package/dist/core/smoke-core-loop.d.ts +1 -0
  51. package/dist/core/smoke-core-loop.js +42 -0
  52. package/dist/core/smoke-core-loop.js.map +1 -0
  53. package/dist/core/state.d.ts +37 -0
  54. package/dist/core/state.js +31 -0
  55. package/dist/core/state.js.map +1 -0
  56. package/dist/index.d.ts +42 -0
  57. package/dist/index.js +43 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/model/communication-logger.d.ts +30 -0
  60. package/dist/model/communication-logger.js +218 -0
  61. package/dist/model/communication-logger.js.map +1 -0
  62. package/dist/model/config.d.ts +25 -0
  63. package/dist/model/config.js +65 -0
  64. package/dist/model/config.js.map +1 -0
  65. package/dist/model/context-window.d.ts +32 -0
  66. package/dist/model/context-window.js +76 -0
  67. package/dist/model/context-window.js.map +1 -0
  68. package/dist/model/credentials.d.ts +13 -0
  69. package/dist/model/credentials.js +19 -0
  70. package/dist/model/credentials.js.map +1 -0
  71. package/dist/model/env.d.ts +8 -0
  72. package/dist/model/env.js +36 -0
  73. package/dist/model/env.js.map +1 -0
  74. package/dist/model/errors.d.ts +42 -0
  75. package/dist/model/errors.js +74 -0
  76. package/dist/model/errors.js.map +1 -0
  77. package/dist/model/http-transport.d.ts +26 -0
  78. package/dist/model/http-transport.js +118 -0
  79. package/dist/model/http-transport.js.map +1 -0
  80. package/dist/model/model-gateway.d.ts +103 -0
  81. package/dist/model/model-gateway.js +15 -0
  82. package/dist/model/model-gateway.js.map +1 -0
  83. package/dist/model/model-metadata.json +677 -0
  84. package/dist/model/openai-adapter.d.ts +34 -0
  85. package/dist/model/openai-adapter.js +152 -0
  86. package/dist/model/openai-adapter.js.map +1 -0
  87. package/dist/model/openai-chat-mapper.d.ts +11 -0
  88. package/dist/model/openai-chat-mapper.js +114 -0
  89. package/dist/model/openai-chat-mapper.js.map +1 -0
  90. package/dist/model/openai-mappers.d.ts +21 -0
  91. package/dist/model/openai-mappers.js +261 -0
  92. package/dist/model/openai-mappers.js.map +1 -0
  93. package/dist/model/openai-responses-adapter.d.ts +2 -0
  94. package/dist/model/openai-responses-adapter.js +2 -0
  95. package/dist/model/openai-responses-adapter.js.map +1 -0
  96. package/dist/model/openai-responses-mapper.d.ts +11 -0
  97. package/dist/model/openai-responses-mapper.js +218 -0
  98. package/dist/model/openai-responses-mapper.js.map +1 -0
  99. package/dist/model/provider-adapter.d.ts +17 -0
  100. package/dist/model/provider-adapter.js +2 -0
  101. package/dist/model/provider-adapter.js.map +1 -0
  102. package/dist/model/provider-factory.d.ts +4 -0
  103. package/dist/model/provider-factory.js +29 -0
  104. package/dist/model/provider-factory.js.map +1 -0
  105. package/dist/model/retry-runner.d.ts +8 -0
  106. package/dist/model/retry-runner.js +28 -0
  107. package/dist/model/retry-runner.js.map +1 -0
  108. package/dist/model/smoke-openai.d.ts +1 -0
  109. package/dist/model/smoke-openai.js +44 -0
  110. package/dist/model/smoke-openai.js.map +1 -0
  111. package/dist/model/smoke-responses-mapper.d.ts +1 -0
  112. package/dist/model/smoke-responses-mapper.js +72 -0
  113. package/dist/model/smoke-responses-mapper.js.map +1 -0
  114. package/dist/model/sse-decoder.d.ts +5 -0
  115. package/dist/model/sse-decoder.js +79 -0
  116. package/dist/model/sse-decoder.js.map +1 -0
  117. package/dist/repl/clipboard.d.ts +14 -0
  118. package/dist/repl/clipboard.js +92 -0
  119. package/dist/repl/clipboard.js.map +1 -0
  120. package/dist/repl/commands.d.ts +38 -0
  121. package/dist/repl/commands.js +86 -0
  122. package/dist/repl/commands.js.map +1 -0
  123. package/dist/repl/index.d.ts +2 -0
  124. package/dist/repl/index.js +2836 -0
  125. package/dist/repl/index.js.map +1 -0
  126. package/dist/repl/markdown-renderer.d.ts +81 -0
  127. package/dist/repl/markdown-renderer.js +546 -0
  128. package/dist/repl/markdown-renderer.js.map +1 -0
  129. package/dist/repl/render.d.ts +2 -0
  130. package/dist/repl/render.js +45 -0
  131. package/dist/repl/render.js.map +1 -0
  132. package/dist/repl/status-line.d.ts +19 -0
  133. package/dist/repl/status-line.js +160 -0
  134. package/dist/repl/status-line.js.map +1 -0
  135. package/dist/safety/audit.d.ts +10 -0
  136. package/dist/safety/audit.js +2 -0
  137. package/dist/safety/audit.js.map +1 -0
  138. package/dist/safety/permissions.d.ts +10 -0
  139. package/dist/safety/permissions.js +2 -0
  140. package/dist/safety/permissions.js.map +1 -0
  141. package/dist/safety/sandbox.d.ts +6 -0
  142. package/dist/safety/sandbox.js +2 -0
  143. package/dist/safety/sandbox.js.map +1 -0
  144. package/dist/session/session-store.d.ts +98 -0
  145. package/dist/session/session-store.js +249 -0
  146. package/dist/session/session-store.js.map +1 -0
  147. package/dist/session/smoke-session.d.ts +1 -0
  148. package/dist/session/smoke-session.js +85 -0
  149. package/dist/session/smoke-session.js.map +1 -0
  150. package/dist/session/tool-result-memory.d.ts +64 -0
  151. package/dist/session/tool-result-memory.js +303 -0
  152. package/dist/session/tool-result-memory.js.map +1 -0
  153. package/dist/skills/skill-tool.d.ts +28 -0
  154. package/dist/skills/skill-tool.js +107 -0
  155. package/dist/skills/skill-tool.js.map +1 -0
  156. package/dist/skills/smoke-skills.d.ts +1 -0
  157. package/dist/skills/smoke-skills.js +60 -0
  158. package/dist/skills/smoke-skills.js.map +1 -0
  159. package/dist/tasks/task-store.d.ts +43 -0
  160. package/dist/tasks/task-store.js +150 -0
  161. package/dist/tasks/task-store.js.map +1 -0
  162. package/dist/tasks/task-tools.d.ts +31 -0
  163. package/dist/tasks/task-tools.js +232 -0
  164. package/dist/tasks/task-tools.js.map +1 -0
  165. package/dist/tools/builtins/echo-tool.d.ts +4 -0
  166. package/dist/tools/builtins/echo-tool.js +26 -0
  167. package/dist/tools/builtins/echo-tool.js.map +1 -0
  168. package/dist/tools/builtins/edit-tool.d.ts +30 -0
  169. package/dist/tools/builtins/edit-tool.js +423 -0
  170. package/dist/tools/builtins/edit-tool.js.map +1 -0
  171. package/dist/tools/builtins/exec-tool.d.ts +18 -0
  172. package/dist/tools/builtins/exec-tool.js +290 -0
  173. package/dist/tools/builtins/exec-tool.js.map +1 -0
  174. package/dist/tools/builtins/filesystem-tools.d.ts +16 -0
  175. package/dist/tools/builtins/filesystem-tools.js +306 -0
  176. package/dist/tools/builtins/filesystem-tools.js.map +1 -0
  177. package/dist/tools/builtins/grep-tool.d.ts +56 -0
  178. package/dist/tools/builtins/grep-tool.js +320 -0
  179. package/dist/tools/builtins/grep-tool.js.map +1 -0
  180. package/dist/tools/builtins/ripgrep-binary.d.ts +6 -0
  181. package/dist/tools/builtins/ripgrep-binary.js +51 -0
  182. package/dist/tools/builtins/ripgrep-binary.js.map +1 -0
  183. package/dist/tools/builtins/search-providers.d.ts +49 -0
  184. package/dist/tools/builtins/search-providers.js +240 -0
  185. package/dist/tools/builtins/search-providers.js.map +1 -0
  186. package/dist/tools/builtins/search-tool.d.ts +18 -0
  187. package/dist/tools/builtins/search-tool.js +171 -0
  188. package/dist/tools/builtins/search-tool.js.map +1 -0
  189. package/dist/tools/registry.d.ts +18 -0
  190. package/dist/tools/registry.js +69 -0
  191. package/dist/tools/registry.js.map +1 -0
  192. package/dist/tools/run-tool-use.d.ts +13 -0
  193. package/dist/tools/run-tool-use.js +113 -0
  194. package/dist/tools/run-tool-use.js.map +1 -0
  195. package/dist/tools/schema.d.ts +2 -0
  196. package/dist/tools/schema.js +61 -0
  197. package/dist/tools/schema.js.map +1 -0
  198. package/dist/tools/smoke-tool-system.d.ts +1 -0
  199. package/dist/tools/smoke-tool-system.js +204 -0
  200. package/dist/tools/smoke-tool-system.js.map +1 -0
  201. package/dist/tools/streaming-tool-executor.d.ts +19 -0
  202. package/dist/tools/streaming-tool-executor.js +89 -0
  203. package/dist/tools/streaming-tool-executor.js.map +1 -0
  204. package/dist/tools/tool-orchestration.d.ts +15 -0
  205. package/dist/tools/tool-orchestration.js +89 -0
  206. package/dist/tools/tool-orchestration.js.map +1 -0
  207. package/dist/tools/tool.d.ts +121 -0
  208. package/dist/tools/tool.js +4 -0
  209. package/dist/tools/tool.js.map +1 -0
  210. package/dist/types/events.d.ts +66 -0
  211. package/dist/types/events.js +2 -0
  212. package/dist/types/events.js.map +1 -0
  213. package/dist/types/messages.d.ts +57 -0
  214. package/dist/types/messages.js +42 -0
  215. package/dist/types/messages.js.map +1 -0
  216. package/package.json +49 -0
  217. package/scripts/copy-model-metadata.mjs +4 -0
  218. package/scripts/install-ripgrep.cjs +152 -0
@@ -0,0 +1,42 @@
1
+ import { QueryEngine } from "./query-engine.js";
2
+ import { ToolRegistry } from "../tools/registry.js";
3
+ import { echoTool } from "../tools/builtins/echo-tool.js";
4
+ import { createTextMessage } from "../types/messages.js";
5
+ import { stripLeakedReasoningText } from "./assistant-output-filter.js";
6
+ class FakeToolCallingGateway {
7
+ async *stream(request) {
8
+ const hasToolResult = request.messages.some((message) => message.blocks.some((block) => block.type === "tool_result"));
9
+ if (!hasToolResult) {
10
+ yield { type: "tool_use", toolUse: { id: "call_echo", name: "echo", input: { text: "pong" } } };
11
+ yield { type: "response_completed", responseId: "resp_1", stopReason: "tool_calls" };
12
+ return;
13
+ }
14
+ yield { type: "assistant_delta", text: "done" };
15
+ yield { type: "assistant_message", message: createTextMessage("assistant", "done") };
16
+ yield { type: "response_completed", responseId: "resp_2", stopReason: "completed" };
17
+ }
18
+ }
19
+ async function main() {
20
+ const tools = new ToolRegistry();
21
+ tools.register(echoTool);
22
+ const engine = new QueryEngine({ modelGateway: new FakeToolCallingGateway(), tools, maxTurns: 4 });
23
+ const events = [];
24
+ for await (const event of engine.sendUserText("run tool")) {
25
+ events.push(event.type === "terminal" ? `${event.type}:${event.reason}` : event.type);
26
+ }
27
+ const snapshot = engine.snapshot();
28
+ const sanitized = stripLeakedReasoningText("目录内容:\n- `package-lock.json`We need answer in Chinese likely. Final maybe mention.");
29
+ const ok = events.includes("tool.started") &&
30
+ events.includes("tool.finished") &&
31
+ events.includes("terminal:completed") &&
32
+ sanitized === "目录内容:\n- `package-lock.json`" &&
33
+ snapshot.messages >= 3;
34
+ console.log(JSON.stringify({ ok, events, snapshot, sanitized }, null, 2));
35
+ if (!ok)
36
+ process.exitCode = 1;
37
+ }
38
+ main().catch((error) => {
39
+ console.error(error instanceof Error ? error.stack ?? error.message : String(error));
40
+ process.exitCode = 1;
41
+ });
42
+ //# sourceMappingURL=smoke-core-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke-core-loop.js","sourceRoot":"","sources":["../../src/core/smoke-core-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Message } from "../types/messages.js";
2
+ import type { ModelUsage } from "../model/model-gateway.js";
3
+ export type QueryPhase = "ready" | "preparing" | "compacting" | "calling_model" | "running_tools" | "injecting_context" | "stopped" | "failed";
4
+ export type ContinueReason = "initial" | "next_turn" | "fallback_model" | "max_output_tokens_escalate" | "max_output_tokens_recovery" | "reactive_compact_retry" | "stop_hook_blocking" | "token_budget_continuation";
5
+ export type TerminalReason = "completed" | "blocking_limit" | "model_error" | "image_error" | "prompt_too_long" | "aborted_streaming" | "aborted_tools" | "hook_stopped" | "stop_hook_prevented" | "max_turns";
6
+ export interface QueryTracking {
7
+ chainId: string;
8
+ depth: number;
9
+ turnId: string;
10
+ turnCounter: number;
11
+ }
12
+ export interface LoopTransition {
13
+ reason: ContinueReason;
14
+ detail?: string;
15
+ }
16
+ export interface QueryState {
17
+ phase: QueryPhase;
18
+ messages: Message[];
19
+ modelInputMessages?: Message[];
20
+ previousResponseId?: string;
21
+ currentModel?: string;
22
+ fallbackModel?: string;
23
+ queryTracking: QueryTracking;
24
+ maxOutputTokensRecoveryCount: number;
25
+ hasAttemptedReactiveCompact: boolean;
26
+ maxOutputTokensOverride?: number;
27
+ pendingToolSummary?: string;
28
+ stopHookActive?: boolean;
29
+ turnCount: number;
30
+ transition: LoopTransition;
31
+ lastUsage?: ModelUsage;
32
+ }
33
+ export declare function createInitialState(messages: Message[], options?: {
34
+ model?: string;
35
+ fallbackModel?: string;
36
+ }): QueryState;
37
+ export declare function nextTracking(previous: QueryTracking): QueryTracking;
@@ -0,0 +1,31 @@
1
+ export function createInitialState(messages, options) {
2
+ const chainId = cryptoId("chain");
3
+ return {
4
+ phase: "ready",
5
+ messages: [...messages],
6
+ currentModel: options?.model,
7
+ fallbackModel: options?.fallbackModel,
8
+ queryTracking: {
9
+ chainId,
10
+ depth: 0,
11
+ turnId: cryptoId("turn"),
12
+ turnCounter: 0,
13
+ },
14
+ maxOutputTokensRecoveryCount: 0,
15
+ hasAttemptedReactiveCompact: false,
16
+ turnCount: 0,
17
+ transition: { reason: "initial" },
18
+ };
19
+ }
20
+ export function nextTracking(previous) {
21
+ return {
22
+ chainId: previous.chainId,
23
+ depth: previous.depth,
24
+ turnCounter: previous.turnCounter + 1,
25
+ turnId: cryptoId("turn"),
26
+ };
27
+ }
28
+ function cryptoId(prefix) {
29
+ return `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
30
+ }
31
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAiEA,MAAM,UAAU,kBAAkB,CAAC,QAAmB,EAAE,OAAoD;IAC1G,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO;QACL,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC;QACvB,YAAY,EAAE,OAAO,EAAE,KAAK;QAC5B,aAAa,EAAE,OAAO,EAAE,aAAa;QACrC,aAAa,EAAE;YACb,OAAO;YACP,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;YACxB,WAAW,EAAE,CAAC;SACf;QACD,4BAA4B,EAAE,CAAC;QAC/B,2BAA2B,EAAE,KAAK;QAClC,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAuB;IAClD,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,WAAW,EAAE,QAAQ,CAAC,WAAW,GAAG,CAAC;QACrC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,42 @@
1
+ export * from "./core/query-engine.js";
2
+ export * from "./core/query.js";
3
+ export * from "./core/state.js";
4
+ export * from "./core/message-pipeline.js";
5
+ export * from "./core/run-agent.js";
6
+ export * from "./context/prompts.js";
7
+ export * from "./context/context-manager.js";
8
+ export * from "./context/compaction.js";
9
+ export * from "./agents/agent-definition.js";
10
+ export * from "./agents/agent-tool.js";
11
+ export * from "./agents/local-agent-task.js";
12
+ export * from "./tasks/task-store.js";
13
+ export * from "./tasks/task-tools.js";
14
+ export * from "./skills/skill-tool.js";
15
+ export * from "./model/model-gateway.js";
16
+ export * from "./model/config.js";
17
+ export * from "./model/communication-logger.js";
18
+ export * from "./model/context-window.js";
19
+ export * from "./model/provider-factory.js";
20
+ export * from "./model/openai-adapter.js";
21
+ export * from "./model/openai-responses-adapter.js";
22
+ export * from "./model/provider-adapter.js";
23
+ export * from "./model/env.js";
24
+ export * from "./model/errors.js";
25
+ export * from "./tools/tool.js";
26
+ export * from "./session/session-store.js";
27
+ export * from "./session/tool-result-memory.js";
28
+ export * from "./tools/registry.js";
29
+ export * from "./tools/run-tool-use.js";
30
+ export * from "./tools/tool-orchestration.js";
31
+ export * from "./tools/streaming-tool-executor.js";
32
+ export * from "./tools/schema.js";
33
+ export * from "./tools/builtins/echo-tool.js";
34
+ export * from "./tools/builtins/edit-tool.js";
35
+ export * from "./tools/builtins/exec-tool.js";
36
+ export * from "./tools/builtins/filesystem-tools.js";
37
+ export * from "./tools/builtins/grep-tool.js";
38
+ export * from "./tools/builtins/search-tool.js";
39
+ export * from "./tools/builtins/search-providers.js";
40
+ export * from "./tools/builtins/ripgrep-binary.js";
41
+ export * from "./types/messages.js";
42
+ export * from "./types/events.js";
package/dist/index.js ADDED
@@ -0,0 +1,43 @@
1
+ export * from "./core/query-engine.js";
2
+ export * from "./core/query.js";
3
+ export * from "./core/state.js";
4
+ export * from "./core/message-pipeline.js";
5
+ export * from "./core/run-agent.js";
6
+ export * from "./context/prompts.js";
7
+ export * from "./context/context-manager.js";
8
+ export * from "./context/compaction.js";
9
+ export * from "./agents/agent-definition.js";
10
+ export * from "./agents/agent-tool.js";
11
+ export * from "./agents/local-agent-task.js";
12
+ export * from "./tasks/task-store.js";
13
+ export * from "./tasks/task-tools.js";
14
+ export * from "./skills/skill-tool.js";
15
+ export * from "./model/model-gateway.js";
16
+ export * from "./model/config.js";
17
+ export * from "./model/communication-logger.js";
18
+ export * from "./model/context-window.js";
19
+ export * from "./model/provider-factory.js";
20
+ export * from "./model/openai-adapter.js";
21
+ export * from "./model/openai-responses-adapter.js";
22
+ export * from "./model/provider-adapter.js";
23
+ export * from "./model/env.js";
24
+ export * from "./model/errors.js";
25
+ export * from "./tools/tool.js";
26
+ export * from "./session/session-store.js";
27
+ export * from "./session/tool-result-memory.js";
28
+ export * from "./tools/registry.js";
29
+ export * from "./tools/run-tool-use.js";
30
+ export * from "./tools/tool-orchestration.js";
31
+ export * from "./tools/streaming-tool-executor.js";
32
+ export * from "./tools/schema.js";
33
+ export * from "./tools/builtins/echo-tool.js";
34
+ export * from "./tools/builtins/edit-tool.js";
35
+ export * from "./tools/builtins/exec-tool.js";
36
+ export * from "./tools/builtins/filesystem-tools.js";
37
+ export * from "./tools/builtins/grep-tool.js";
38
+ export * from "./tools/builtins/search-tool.js";
39
+ export * from "./tools/builtins/search-providers.js";
40
+ export * from "./tools/builtins/ripgrep-binary.js";
41
+ export * from "./types/messages.js";
42
+ export * from "./types/events.js";
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { ModelGateway, ModelRequest, ModelStreamEvent } from "./model-gateway.js";
2
+ export interface CommunicationLogSnapshot {
3
+ enabled: boolean;
4
+ directory?: string;
5
+ calls: number;
6
+ }
7
+ export declare class CommunicationLogger {
8
+ private directory?;
9
+ private calls;
10
+ setDirectory(directory: string | undefined): void;
11
+ snapshot(): CommunicationLogSnapshot;
12
+ createCallLog(request: ModelRequest): Promise<ModelCallLog | undefined>;
13
+ }
14
+ export declare class LoggingModelGateway implements ModelGateway {
15
+ private readonly inner;
16
+ readonly logger: CommunicationLogger;
17
+ constructor(inner: ModelGateway, logger: CommunicationLogger);
18
+ stream(request: ModelRequest): AsyncIterable<ModelStreamEvent>;
19
+ }
20
+ declare class ModelCallLog {
21
+ private readonly basePath;
22
+ private readonly request;
23
+ private readonly final;
24
+ constructor(basePath: string, request: ModelRequest);
25
+ writeRequest(): Promise<void>;
26
+ writeEvent(event: ModelStreamEvent): Promise<void>;
27
+ writeError(error: unknown): Promise<void>;
28
+ finish(error?: unknown): Promise<void>;
29
+ }
30
+ export {};
@@ -0,0 +1,218 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { ModelAPIError } from "./errors.js";
4
+ export class CommunicationLogger {
5
+ directory;
6
+ calls = 0;
7
+ setDirectory(directory) {
8
+ this.directory = directory ? path.resolve(directory) : undefined;
9
+ }
10
+ snapshot() {
11
+ return {
12
+ enabled: this.directory !== undefined,
13
+ directory: this.directory,
14
+ calls: this.calls,
15
+ };
16
+ }
17
+ async createCallLog(request) {
18
+ if (!this.directory)
19
+ return undefined;
20
+ await fs.mkdir(this.directory, { recursive: true });
21
+ this.calls += 1;
22
+ const id = `${new Date().toISOString().replace(/[:.]/g, "-")}-${String(this.calls).padStart(4, "0")}`;
23
+ const basePath = path.join(this.directory, `model-call-${id}`);
24
+ const log = new ModelCallLog(basePath, request);
25
+ await log.writeRequest();
26
+ return log;
27
+ }
28
+ }
29
+ export class LoggingModelGateway {
30
+ inner;
31
+ logger;
32
+ constructor(inner, logger) {
33
+ this.inner = inner;
34
+ this.logger = logger;
35
+ }
36
+ async *stream(request) {
37
+ const log = await this.logger.createCallLog(request);
38
+ try {
39
+ for await (const event of this.inner.stream(request)) {
40
+ await log?.writeEvent(event);
41
+ yield event;
42
+ }
43
+ await log?.finish();
44
+ }
45
+ catch (error) {
46
+ await log?.writeError(error);
47
+ await log?.finish(error);
48
+ throw error;
49
+ }
50
+ }
51
+ }
52
+ class ModelCallLog {
53
+ basePath;
54
+ request;
55
+ final = new FinalResponseAccumulator();
56
+ constructor(basePath, request) {
57
+ this.basePath = basePath;
58
+ this.request = request;
59
+ }
60
+ async writeRequest() {
61
+ await writeJson(`${this.basePath}.request.json`, {
62
+ kind: "model_request",
63
+ createdAt: new Date().toISOString(),
64
+ request: normalizeRequestForLog(this.request),
65
+ });
66
+ }
67
+ async writeEvent(event) {
68
+ this.final.push(event);
69
+ await appendJsonLine(`${this.basePath}.events.jsonl`, {
70
+ kind: "model_stream_event",
71
+ createdAt: new Date().toISOString(),
72
+ event,
73
+ });
74
+ }
75
+ async writeError(error) {
76
+ await appendJsonLine(`${this.basePath}.events.jsonl`, {
77
+ kind: "model_stream_error",
78
+ createdAt: new Date().toISOString(),
79
+ error: serializeError(error),
80
+ });
81
+ }
82
+ async finish(error) {
83
+ const final = this.final.snapshot(error);
84
+ await writeJson(`${this.basePath}.final.json`, {
85
+ kind: "model_final_response",
86
+ createdAt: new Date().toISOString(),
87
+ ...final,
88
+ });
89
+ await fs.writeFile(`${this.basePath}.final.txt`, final.text, "utf8");
90
+ }
91
+ }
92
+ class FinalResponseAccumulator {
93
+ textFromDelta = "";
94
+ assistantMessages = [];
95
+ toolUses = [];
96
+ responseIds = [];
97
+ stopReason;
98
+ push(event) {
99
+ if (event.type === "assistant_delta")
100
+ this.textFromDelta += event.text;
101
+ if (event.type === "assistant_message")
102
+ this.assistantMessages.push(event.message);
103
+ if (event.type === "tool_use")
104
+ this.toolUses.push(event.toolUse);
105
+ if (event.type === "response_started")
106
+ this.responseIds.push(event.responseId);
107
+ if (event.type === "response_completed") {
108
+ if (event.responseId)
109
+ this.responseIds.push(event.responseId);
110
+ this.stopReason = event.stopReason;
111
+ }
112
+ if (event.type === "response_incomplete") {
113
+ if (event.responseId)
114
+ this.responseIds.push(event.responseId);
115
+ this.stopReason = event.reason;
116
+ }
117
+ }
118
+ snapshot(error) {
119
+ const text = this.textFromDelta || this.assistantMessages.map(messageText).filter(Boolean).join("\n");
120
+ return {
121
+ text,
122
+ assistantMessages: this.assistantMessages,
123
+ toolUses: this.toolUses,
124
+ responseIds: [...new Set(this.responseIds)],
125
+ stopReason: this.stopReason,
126
+ error: error === undefined ? undefined : serializeError(error),
127
+ };
128
+ }
129
+ }
130
+ function normalizeRequestForLog(request) {
131
+ const { cancellation: _cancellation, ...serializable } = request;
132
+ return {
133
+ ...serializable,
134
+ messages: request.messages.map((message) => ({
135
+ ...message,
136
+ blocks: message.blocks.map(normalizeBlockForLog),
137
+ })),
138
+ };
139
+ }
140
+ function normalizeBlockForLog(block) {
141
+ return block;
142
+ }
143
+ function messageText(message) {
144
+ return message.blocks
145
+ .filter((block) => block.type === "text")
146
+ .map((block) => block.text)
147
+ .join("\n");
148
+ }
149
+ async function writeJson(filepath, value) {
150
+ await fs.writeFile(filepath, `${stableStringify(value)}\n`, "utf8");
151
+ }
152
+ async function appendJsonLine(filepath, value) {
153
+ await fs.appendFile(filepath, `${stableStringify(value)}\n`, "utf8");
154
+ }
155
+ function stableStringify(value) {
156
+ return JSON.stringify(value, replacer, 2);
157
+ }
158
+ function replacer(_key, value) {
159
+ if (value instanceof Error)
160
+ return serializeError(value);
161
+ if (typeof value === "bigint")
162
+ return value.toString();
163
+ if (typeof value === "function")
164
+ return `[Function ${value.name || "anonymous"}]`;
165
+ if (value instanceof Set)
166
+ return [...value];
167
+ if (value instanceof Map)
168
+ return Object.fromEntries(value.entries());
169
+ return value;
170
+ }
171
+ function serializeError(error) {
172
+ if (error instanceof ModelAPIError) {
173
+ return {
174
+ name: error.name,
175
+ message: error.message,
176
+ category: error.category,
177
+ provider: error.provider,
178
+ status: error.status,
179
+ code: error.code,
180
+ requestId: error.requestId,
181
+ retryAfterMs: error.retryAfterMs,
182
+ retryable: error.retryable,
183
+ request: error.request,
184
+ response: compactForLog(error.response),
185
+ raw: compactForLog(error.raw),
186
+ stack: error.stack,
187
+ };
188
+ }
189
+ if (error instanceof Error) {
190
+ return {
191
+ name: error.name,
192
+ message: error.message,
193
+ stack: error.stack,
194
+ };
195
+ }
196
+ return { message: String(error) };
197
+ }
198
+ function compactForLog(value, maxChars = 8000) {
199
+ if (value === undefined)
200
+ return undefined;
201
+ const text = safeStringify(value);
202
+ if (text.length <= maxChars)
203
+ return value;
204
+ return {
205
+ truncated: true,
206
+ originalLength: text.length,
207
+ preview: text.slice(0, maxChars),
208
+ };
209
+ }
210
+ function safeStringify(value) {
211
+ try {
212
+ return JSON.stringify(value, replacer);
213
+ }
214
+ catch (error) {
215
+ return String(error);
216
+ }
217
+ }
218
+ //# sourceMappingURL=communication-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"communication-logger.js","sourceRoot":"","sources":["../../src/model/communication-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ReasoningConfig } from "./model-gateway.js";
2
+ export type ModelProviderName = "openai";
3
+ export type ReasoningSummary = NonNullable<ReasoningConfig["summary"]>;
4
+ export interface BaseModelProviderConfig {
5
+ provider: ModelProviderName;
6
+ apiKey?: string;
7
+ baseUrl?: string;
8
+ model: string;
9
+ fallbackModel?: string;
10
+ timeoutMs?: number;
11
+ streamIdleTimeoutMs?: number;
12
+ maxRetries?: number;
13
+ defaultMaxOutputTokens?: number;
14
+ defaultReasoning?: ReasoningConfig;
15
+ }
16
+ export type OpenAIEndpointPreference = "responses" | "chat" | "auto";
17
+ export interface OpenAIProviderConfig extends BaseModelProviderConfig {
18
+ provider: "openai";
19
+ openai?: {
20
+ endpoint?: OpenAIEndpointPreference;
21
+ };
22
+ }
23
+ export type ModelProviderConfig = OpenAIProviderConfig;
24
+ export declare function readModelProviderConfig(env?: NodeJS.ProcessEnv): ModelProviderConfig | undefined;
25
+ export declare function parseReasoning(effortValue: string | undefined, summaryValue?: string | undefined): ReasoningConfig | undefined;
@@ -0,0 +1,65 @@
1
+ const DEFAULT_OPENAI_MODEL = "gpt-5.5";
2
+ const DEFAULT_MAX_OUTPUT_TOKENS = 800;
3
+ export function readModelProviderConfig(env = process.env) {
4
+ const provider = parseProvider(env.MODEL_PROVIDER ?? env.OPENAI_PROVIDER ?? "openai");
5
+ switch (provider) {
6
+ case "openai":
7
+ return readOpenAIProviderConfig(env);
8
+ }
9
+ }
10
+ export function parseReasoning(effortValue, summaryValue) {
11
+ const effort = parseReasoningEffort(effortValue);
12
+ const summary = parseReasoningSummary(summaryValue);
13
+ if (!effort && !summary)
14
+ return undefined;
15
+ return {
16
+ effort,
17
+ summary,
18
+ };
19
+ }
20
+ function readOpenAIProviderConfig(env) {
21
+ const apiKey = env.MODEL_API_KEY ?? env.OPENAI_API_KEY;
22
+ if (!apiKey)
23
+ return undefined;
24
+ const endpoint = parseOpenAIEndpoint(env.MODEL_ENDPOINT ?? env.OPENAI_ENDPOINT);
25
+ return {
26
+ provider: "openai",
27
+ apiKey,
28
+ baseUrl: env.MODEL_BASE_URL ?? env.OPENAI_BASE_URL,
29
+ model: env.MODEL_ID ?? env.OPENAI_MODEL ?? DEFAULT_OPENAI_MODEL,
30
+ fallbackModel: env.MODEL_FALLBACK_ID ?? env.OPENAI_FALLBACK_MODEL,
31
+ timeoutMs: parseNumber(env.MODEL_TIMEOUT_MS ?? env.OPENAI_TIMEOUT_MS),
32
+ streamIdleTimeoutMs: parseNumber(env.MODEL_STREAM_IDLE_TIMEOUT_MS ?? env.OPENAI_STREAM_IDLE_TIMEOUT_MS),
33
+ maxRetries: parseNumber(env.MODEL_MAX_RETRIES ?? env.OPENAI_MAX_RETRIES),
34
+ defaultMaxOutputTokens: parseNumber(env.MODEL_MAX_OUTPUT_TOKENS ?? env.OPENAI_MAX_OUTPUT_TOKENS) ?? DEFAULT_MAX_OUTPUT_TOKENS,
35
+ defaultReasoning: parseReasoning(env.MODEL_REASONING_EFFORT ?? env.OPENAI_REASONING_EFFORT, env.MODEL_REASONING_SUMMARY ?? env.OPENAI_REASONING_SUMMARY),
36
+ openai: endpoint ? { endpoint } : undefined,
37
+ };
38
+ }
39
+ function parseReasoningEffort(value) {
40
+ if (value === "none" || value === "minimal" || value === "low" || value === "medium" || value === "high" || value === "xhigh" || value === "max")
41
+ return value;
42
+ return undefined;
43
+ }
44
+ function parseReasoningSummary(value) {
45
+ if (value === "auto" || value === "concise" || value === "detailed")
46
+ return value;
47
+ return undefined;
48
+ }
49
+ function parseProvider(value) {
50
+ if (value === "openai")
51
+ return value;
52
+ throw new Error(`Unsupported MODEL_PROVIDER: ${value}`);
53
+ }
54
+ function parseOpenAIEndpoint(value) {
55
+ if (value === "responses" || value === "chat" || value === "auto")
56
+ return value;
57
+ return undefined;
58
+ }
59
+ function parseNumber(value) {
60
+ if (!value)
61
+ return undefined;
62
+ const parsed = Number(value);
63
+ return Number.isFinite(parsed) ? parsed : undefined;
64
+ }
65
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/model/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { ReasoningEffort } from "./model-gateway.js";
2
+ export interface ModelMetadata {
3
+ id: string;
4
+ provider: string;
5
+ modelIds: string[];
6
+ contextWindowTokens?: number;
7
+ maxOutputTokens?: number;
8
+ knowledgeCutoff?: string;
9
+ reasoning?: boolean;
10
+ reasoningEfforts?: ReasoningEffort[];
11
+ imageInput?: boolean;
12
+ source?: string;
13
+ notes?: string;
14
+ }
15
+ export interface ModelCatalog {
16
+ updatedAt?: string;
17
+ notes?: string[];
18
+ sources?: Record<string, string>;
19
+ models: ModelMetadata[];
20
+ }
21
+ export interface ContextWindowInfo {
22
+ tokens?: number;
23
+ source: "env" | "known" | "unknown";
24
+ model?: ModelMetadata;
25
+ catalogUpdatedAt?: string;
26
+ }
27
+ export declare function resolveContextWindowTokens(model: string | undefined, env?: NodeJS.ProcessEnv): ContextWindowInfo;
28
+ export declare function findModelMetadata(model: string, catalog?: ModelCatalog): ModelMetadata | undefined;
29
+ export declare function supportsImageInput(model: string | undefined, catalog?: ModelCatalog): boolean | undefined;
30
+ export declare function reasoningEffortsForModel(model: string | undefined, catalog?: ModelCatalog): ReasoningEffort[] | undefined;
31
+ export declare function supportsReasoningEffort(model: string | undefined, effort: ReasoningEffort, catalog?: ModelCatalog): boolean | undefined;
32
+ export declare function loadModelCatalog(): ModelCatalog;