halfcopilot 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 (226) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -0
  3. package/bin/halfcop.js +22 -0
  4. package/dist/index.js +3 -0
  5. package/dist/packages/cli/dist/halfcop.d.ts +6 -0
  6. package/dist/packages/cli/dist/halfcop.d.ts.map +1 -0
  7. package/dist/packages/cli/dist/halfcop.js +448 -0
  8. package/dist/packages/cli/dist/halfcop.js.map +1 -0
  9. package/dist/packages/cli/dist/index.d.ts +3 -0
  10. package/dist/packages/cli/dist/index.d.ts.map +1 -0
  11. package/dist/packages/cli/dist/index.js +251 -0
  12. package/dist/packages/cli/dist/index.js.map +1 -0
  13. package/dist/packages/cli/dist/tui/app.d.ts +11 -0
  14. package/dist/packages/cli/dist/tui/app.d.ts.map +1 -0
  15. package/dist/packages/cli/dist/tui/app.js +72 -0
  16. package/dist/packages/cli/dist/tui/app.js.map +1 -0
  17. package/dist/packages/cli/dist/tui/components/ChatView.d.ts +12 -0
  18. package/dist/packages/cli/dist/tui/components/ChatView.d.ts.map +1 -0
  19. package/dist/packages/cli/dist/tui/components/ChatView.js +6 -0
  20. package/dist/packages/cli/dist/tui/components/ChatView.js.map +1 -0
  21. package/dist/packages/cli/dist/tui/components/InputField.d.ts +8 -0
  22. package/dist/packages/cli/dist/tui/components/InputField.d.ts.map +1 -0
  23. package/dist/packages/cli/dist/tui/components/InputField.js +22 -0
  24. package/dist/packages/cli/dist/tui/components/InputField.js.map +1 -0
  25. package/dist/packages/cli/dist/tui/components/StatusBar.d.ts +13 -0
  26. package/dist/packages/cli/dist/tui/components/StatusBar.d.ts.map +1 -0
  27. package/dist/packages/cli/dist/tui/components/StatusBar.js +6 -0
  28. package/dist/packages/cli/dist/tui/components/StatusBar.js.map +1 -0
  29. package/dist/packages/cli/dist/tui/components/ToolApproval.d.ts +10 -0
  30. package/dist/packages/cli/dist/tui/components/ToolApproval.d.ts.map +1 -0
  31. package/dist/packages/cli/dist/tui/components/ToolApproval.js +14 -0
  32. package/dist/packages/cli/dist/tui/components/ToolApproval.js.map +1 -0
  33. package/dist/packages/cli/dist/tui/components/index.d.ts +5 -0
  34. package/dist/packages/cli/dist/tui/components/index.d.ts.map +1 -0
  35. package/dist/packages/cli/dist/tui/components/index.js +5 -0
  36. package/dist/packages/cli/dist/tui/components/index.js.map +1 -0
  37. package/dist/packages/cli/dist/tui/index.d.ts +3 -0
  38. package/dist/packages/cli/dist/tui/index.d.ts.map +1 -0
  39. package/dist/packages/cli/dist/tui/index.js +3 -0
  40. package/dist/packages/cli/dist/tui/index.js.map +1 -0
  41. package/dist/packages/config/dist/defaults.d.ts +3 -0
  42. package/dist/packages/config/dist/defaults.d.ts.map +1 -0
  43. package/dist/packages/config/dist/defaults.js +30 -0
  44. package/dist/packages/config/dist/defaults.js.map +1 -0
  45. package/dist/packages/config/dist/index.d.ts +4 -0
  46. package/dist/packages/config/dist/index.d.ts.map +1 -0
  47. package/dist/packages/config/dist/index.js +4 -0
  48. package/dist/packages/config/dist/index.js.map +1 -0
  49. package/dist/packages/config/dist/loader.d.ts +4 -0
  50. package/dist/packages/config/dist/loader.d.ts.map +1 -0
  51. package/dist/packages/config/dist/loader.js +80 -0
  52. package/dist/packages/config/dist/loader.js.map +1 -0
  53. package/dist/packages/config/dist/schema.d.ts +323 -0
  54. package/dist/packages/config/dist/schema.d.ts.map +1 -0
  55. package/dist/packages/config/dist/schema.js +56 -0
  56. package/dist/packages/config/dist/schema.js.map +1 -0
  57. package/dist/packages/core/dist/agent-loop.d.ts +19 -0
  58. package/dist/packages/core/dist/agent-loop.d.ts.map +1 -0
  59. package/dist/packages/core/dist/agent-loop.js +140 -0
  60. package/dist/packages/core/dist/agent-loop.js.map +1 -0
  61. package/dist/packages/core/dist/conversation.d.ts +22 -0
  62. package/dist/packages/core/dist/conversation.d.ts.map +1 -0
  63. package/dist/packages/core/dist/conversation.js +66 -0
  64. package/dist/packages/core/dist/conversation.js.map +1 -0
  65. package/dist/packages/core/dist/hybrid/index.d.ts +4 -0
  66. package/dist/packages/core/dist/hybrid/index.d.ts.map +1 -0
  67. package/dist/packages/core/dist/hybrid/index.js +4 -0
  68. package/dist/packages/core/dist/hybrid/index.js.map +1 -0
  69. package/dist/packages/core/dist/hybrid/mapper.d.ts +11 -0
  70. package/dist/packages/core/dist/hybrid/mapper.d.ts.map +1 -0
  71. package/dist/packages/core/dist/hybrid/mapper.js +53 -0
  72. package/dist/packages/core/dist/hybrid/mapper.js.map +1 -0
  73. package/dist/packages/core/dist/hybrid/parser.d.ts +36 -0
  74. package/dist/packages/core/dist/hybrid/parser.d.ts.map +1 -0
  75. package/dist/packages/core/dist/hybrid/parser.js +118 -0
  76. package/dist/packages/core/dist/hybrid/parser.js.map +1 -0
  77. package/dist/packages/core/dist/hybrid/provider.d.ts +14 -0
  78. package/dist/packages/core/dist/hybrid/provider.d.ts.map +1 -0
  79. package/dist/packages/core/dist/hybrid/provider.js +109 -0
  80. package/dist/packages/core/dist/hybrid/provider.js.map +1 -0
  81. package/dist/packages/core/dist/index.d.ts +5 -0
  82. package/dist/packages/core/dist/index.d.ts.map +1 -0
  83. package/dist/packages/core/dist/index.js +5 -0
  84. package/dist/packages/core/dist/index.js.map +1 -0
  85. package/dist/packages/core/dist/types.d.ts +36 -0
  86. package/dist/packages/core/dist/types.d.ts.map +1 -0
  87. package/dist/packages/core/dist/types.js +11 -0
  88. package/dist/packages/core/dist/types.js.map +1 -0
  89. package/dist/packages/mcp/dist/adapter.d.ts +15 -0
  90. package/dist/packages/mcp/dist/adapter.d.ts.map +1 -0
  91. package/dist/packages/mcp/dist/adapter.js +44 -0
  92. package/dist/packages/mcp/dist/adapter.js.map +1 -0
  93. package/dist/packages/mcp/dist/client.d.ts +31 -0
  94. package/dist/packages/mcp/dist/client.d.ts.map +1 -0
  95. package/dist/packages/mcp/dist/client.js +140 -0
  96. package/dist/packages/mcp/dist/client.js.map +1 -0
  97. package/dist/packages/mcp/dist/index.d.ts +6 -0
  98. package/dist/packages/mcp/dist/index.d.ts.map +1 -0
  99. package/dist/packages/mcp/dist/index.js +4 -0
  100. package/dist/packages/mcp/dist/index.js.map +1 -0
  101. package/dist/packages/mcp/dist/transport.d.ts +47 -0
  102. package/dist/packages/mcp/dist/transport.d.ts.map +1 -0
  103. package/dist/packages/mcp/dist/transport.js +123 -0
  104. package/dist/packages/mcp/dist/transport.js.map +1 -0
  105. package/dist/packages/mcp/dist/types.d.ts +64 -0
  106. package/dist/packages/mcp/dist/types.d.ts.map +1 -0
  107. package/dist/packages/mcp/dist/types.js +2 -0
  108. package/dist/packages/mcp/dist/types.js.map +1 -0
  109. package/dist/packages/memory/dist/index.d.ts +3 -0
  110. package/dist/packages/memory/dist/index.d.ts.map +1 -0
  111. package/dist/packages/memory/dist/index.js +2 -0
  112. package/dist/packages/memory/dist/index.js.map +1 -0
  113. package/dist/packages/memory/dist/store.d.ts +15 -0
  114. package/dist/packages/memory/dist/store.d.ts.map +1 -0
  115. package/dist/packages/memory/dist/store.js +93 -0
  116. package/dist/packages/memory/dist/store.js.map +1 -0
  117. package/dist/packages/memory/dist/types.d.ts +14 -0
  118. package/dist/packages/memory/dist/types.d.ts.map +1 -0
  119. package/dist/packages/memory/dist/types.js +2 -0
  120. package/dist/packages/memory/dist/types.js.map +1 -0
  121. package/dist/packages/provider/dist/anthropic.d.ts +21 -0
  122. package/dist/packages/provider/dist/anthropic.d.ts.map +1 -0
  123. package/dist/packages/provider/dist/anthropic.js +148 -0
  124. package/dist/packages/provider/dist/anthropic.js.map +1 -0
  125. package/dist/packages/provider/dist/base.d.ts +16 -0
  126. package/dist/packages/provider/dist/base.d.ts.map +1 -0
  127. package/dist/packages/provider/dist/base.js +9 -0
  128. package/dist/packages/provider/dist/base.js.map +1 -0
  129. package/dist/packages/provider/dist/index.d.ts +6 -0
  130. package/dist/packages/provider/dist/index.d.ts.map +1 -0
  131. package/dist/packages/provider/dist/index.js +5 -0
  132. package/dist/packages/provider/dist/index.js.map +1 -0
  133. package/dist/packages/provider/dist/openai.d.ts +23 -0
  134. package/dist/packages/provider/dist/openai.d.ts.map +1 -0
  135. package/dist/packages/provider/dist/openai.js +171 -0
  136. package/dist/packages/provider/dist/openai.js.map +1 -0
  137. package/dist/packages/provider/dist/registry.d.ts +11 -0
  138. package/dist/packages/provider/dist/registry.d.ts.map +1 -0
  139. package/dist/packages/provider/dist/registry.js +61 -0
  140. package/dist/packages/provider/dist/registry.js.map +1 -0
  141. package/dist/packages/provider/dist/types.d.ts +84 -0
  142. package/dist/packages/provider/dist/types.d.ts.map +1 -0
  143. package/dist/packages/provider/dist/types.js +3 -0
  144. package/dist/packages/provider/dist/types.js.map +1 -0
  145. package/dist/packages/shared/dist/errors.d.ts +18 -0
  146. package/dist/packages/shared/dist/errors.d.ts.map +1 -0
  147. package/dist/packages/shared/dist/errors.js +35 -0
  148. package/dist/packages/shared/dist/errors.js.map +1 -0
  149. package/dist/packages/shared/dist/index.d.ts +4 -0
  150. package/dist/packages/shared/dist/index.d.ts.map +1 -0
  151. package/dist/packages/shared/dist/index.js +4 -0
  152. package/dist/packages/shared/dist/index.js.map +1 -0
  153. package/dist/packages/shared/dist/logger.d.ts +18 -0
  154. package/dist/packages/shared/dist/logger.d.ts.map +1 -0
  155. package/dist/packages/shared/dist/logger.js +39 -0
  156. package/dist/packages/shared/dist/logger.js.map +1 -0
  157. package/dist/packages/shared/dist/utils.d.ts +5 -0
  158. package/dist/packages/shared/dist/utils.d.ts.map +1 -0
  159. package/dist/packages/shared/dist/utils.js +27 -0
  160. package/dist/packages/shared/dist/utils.js.map +1 -0
  161. package/dist/packages/skills/dist/builtins.d.ts +8 -0
  162. package/dist/packages/skills/dist/builtins.d.ts.map +1 -0
  163. package/dist/packages/skills/dist/builtins.js +144 -0
  164. package/dist/packages/skills/dist/builtins.js.map +1 -0
  165. package/dist/packages/skills/dist/index.d.ts +4 -0
  166. package/dist/packages/skills/dist/index.d.ts.map +1 -0
  167. package/dist/packages/skills/dist/index.js +3 -0
  168. package/dist/packages/skills/dist/index.js.map +1 -0
  169. package/dist/packages/skills/dist/registry.d.ts +13 -0
  170. package/dist/packages/skills/dist/registry.d.ts.map +1 -0
  171. package/dist/packages/skills/dist/registry.js +93 -0
  172. package/dist/packages/skills/dist/registry.js.map +1 -0
  173. package/dist/packages/skills/dist/types.d.ts +35 -0
  174. package/dist/packages/skills/dist/types.d.ts.map +1 -0
  175. package/dist/packages/skills/dist/types.js +2 -0
  176. package/dist/packages/skills/dist/types.js.map +1 -0
  177. package/dist/packages/tools/dist/builtins/bash.d.ts +3 -0
  178. package/dist/packages/tools/dist/builtins/bash.d.ts.map +1 -0
  179. package/dist/packages/tools/dist/builtins/bash.js +38 -0
  180. package/dist/packages/tools/dist/builtins/bash.js.map +1 -0
  181. package/dist/packages/tools/dist/builtins/file-edit.d.ts +3 -0
  182. package/dist/packages/tools/dist/builtins/file-edit.d.ts.map +1 -0
  183. package/dist/packages/tools/dist/builtins/file-edit.js +45 -0
  184. package/dist/packages/tools/dist/builtins/file-edit.js.map +1 -0
  185. package/dist/packages/tools/dist/builtins/file-read.d.ts +3 -0
  186. package/dist/packages/tools/dist/builtins/file-read.d.ts.map +1 -0
  187. package/dist/packages/tools/dist/builtins/file-read.js +39 -0
  188. package/dist/packages/tools/dist/builtins/file-read.js.map +1 -0
  189. package/dist/packages/tools/dist/builtins/file-write.d.ts +3 -0
  190. package/dist/packages/tools/dist/builtins/file-write.d.ts.map +1 -0
  191. package/dist/packages/tools/dist/builtins/file-write.js +30 -0
  192. package/dist/packages/tools/dist/builtins/file-write.js.map +1 -0
  193. package/dist/packages/tools/dist/builtins/glob.d.ts +3 -0
  194. package/dist/packages/tools/dist/builtins/glob.d.ts.map +1 -0
  195. package/dist/packages/tools/dist/builtins/glob.js +33 -0
  196. package/dist/packages/tools/dist/builtins/glob.js.map +1 -0
  197. package/dist/packages/tools/dist/builtins/grep.d.ts +3 -0
  198. package/dist/packages/tools/dist/builtins/grep.d.ts.map +1 -0
  199. package/dist/packages/tools/dist/builtins/grep.js +59 -0
  200. package/dist/packages/tools/dist/builtins/grep.js.map +1 -0
  201. package/dist/packages/tools/dist/builtins/index.d.ts +10 -0
  202. package/dist/packages/tools/dist/builtins/index.d.ts.map +1 -0
  203. package/dist/packages/tools/dist/builtins/index.js +18 -0
  204. package/dist/packages/tools/dist/builtins/index.js.map +1 -0
  205. package/dist/packages/tools/dist/executor.d.ts +11 -0
  206. package/dist/packages/tools/dist/executor.d.ts.map +1 -0
  207. package/dist/packages/tools/dist/executor.js +36 -0
  208. package/dist/packages/tools/dist/executor.js.map +1 -0
  209. package/dist/packages/tools/dist/index.d.ts +7 -0
  210. package/dist/packages/tools/dist/index.d.ts.map +1 -0
  211. package/dist/packages/tools/dist/index.js +6 -0
  212. package/dist/packages/tools/dist/index.js.map +1 -0
  213. package/dist/packages/tools/dist/permission.d.ts +17 -0
  214. package/dist/packages/tools/dist/permission.d.ts.map +1 -0
  215. package/dist/packages/tools/dist/permission.js +74 -0
  216. package/dist/packages/tools/dist/permission.js.map +1 -0
  217. package/dist/packages/tools/dist/registry.d.ts +13 -0
  218. package/dist/packages/tools/dist/registry.d.ts.map +1 -0
  219. package/dist/packages/tools/dist/registry.js +34 -0
  220. package/dist/packages/tools/dist/registry.js.map +1 -0
  221. package/dist/packages/tools/dist/types.d.ts +28 -0
  222. package/dist/packages/tools/dist/types.d.ts.map +1 -0
  223. package/dist/packages/tools/dist/types.js +16 -0
  224. package/dist/packages/tools/dist/types.js.map +1 -0
  225. package/package.json +47 -0
  226. package/scripts/postinstall.mjs +24 -0
@@ -0,0 +1,140 @@
1
+ import { AgentState } from './types.js';
2
+ import { ConversationManager } from './conversation.js';
3
+ const PLAN_SAFE_TOOLS = ['file_read', 'grep', 'glob', 'list_files'];
4
+ export class AgentLoop {
5
+ config;
6
+ currentMode;
7
+ currentState = AgentState.IDLE;
8
+ turnCount = 0;
9
+ conversation;
10
+ providerName;
11
+ modelName;
12
+ constructor(config) {
13
+ this.config = config;
14
+ this.currentMode = config.mode ?? 'auto';
15
+ this.conversation = new ConversationManager({ maxMessages: 100 });
16
+ this.providerName = config.providerName ?? 'unknown';
17
+ this.modelName = config.model ?? 'unknown';
18
+ }
19
+ async *run(userMessage) {
20
+ this.conversation.addUserMessage(userMessage);
21
+ this.turnCount = 0;
22
+ this.currentState = AgentState.THINKING;
23
+ yield { type: 'state_change', state: AgentState.THINKING };
24
+ while (this.turnCount < this.config.maxTurns) {
25
+ this.turnCount++;
26
+ let hasToolUse = false;
27
+ const messages = this.conversation.buildMessages(this.getSystemPrompt());
28
+ const tools = this.config.tools.definitions();
29
+ const stream = this.config.provider.chat({
30
+ model: this.config.model,
31
+ messages,
32
+ tools: this.currentMode === 'plan' ? this.filterPlanTools(tools) : tools,
33
+ systemPrompt: undefined,
34
+ maxTokens: 16384,
35
+ });
36
+ let fullText = '';
37
+ for await (const event of stream) {
38
+ if (event.type === 'text') {
39
+ fullText += event.content;
40
+ yield { type: 'text', content: event.content };
41
+ }
42
+ if (event.type === 'thinking') {
43
+ yield { type: 'thinking', content: event.content };
44
+ }
45
+ if (event.type === 'tool_use') {
46
+ hasToolUse = true;
47
+ const toolName = event.name;
48
+ const toolInput = event.input;
49
+ yield { type: 'tool_use', toolName, toolInput };
50
+ if (this.currentMode === 'plan' && !PLAN_SAFE_TOOLS.includes(toolName)) {
51
+ const msg = `Tool "${toolName}" is not allowed in plan mode. Switch to act mode to execute.`;
52
+ yield { type: 'tool_result', toolName, toolOutput: msg };
53
+ this.conversation.addToolResult(event.id, msg, true);
54
+ continue;
55
+ }
56
+ this.currentState = AgentState.TOOL_CALLING;
57
+ yield { type: 'state_change', state: AgentState.TOOL_CALLING };
58
+ try {
59
+ const result = await this.config.executor.execute(toolName, toolInput, {
60
+ projectRoot: process.cwd(),
61
+ workingDirectory: process.cwd(),
62
+ signal: new AbortController().signal,
63
+ sessionId: 'default',
64
+ });
65
+ yield { type: 'tool_result', toolName, toolOutput: result.output };
66
+ this.conversation.addToolResult(event.id, result.output, !!result.error);
67
+ }
68
+ catch (err) {
69
+ const errorMsg = err instanceof Error ? err.message : String(err);
70
+ yield { type: 'tool_result', toolName, toolOutput: errorMsg };
71
+ this.conversation.addToolResult(event.id, errorMsg, true);
72
+ }
73
+ this.currentState = AgentState.THINKING;
74
+ yield { type: 'state_change', state: AgentState.THINKING };
75
+ }
76
+ if (event.type === 'done') {
77
+ this.conversation.addTokenUsage(event.usage);
78
+ if (!hasToolUse) {
79
+ if (fullText) {
80
+ this.conversation.addAssistantMessage(fullText);
81
+ }
82
+ this.currentState = AgentState.IDLE;
83
+ yield { type: 'state_change', state: AgentState.IDLE };
84
+ yield { type: 'done', usage: event.usage };
85
+ return;
86
+ }
87
+ }
88
+ if (event.type === 'error') {
89
+ this.currentState = AgentState.ERROR;
90
+ yield { type: 'state_change', state: AgentState.ERROR };
91
+ yield { type: 'error', error: event.error };
92
+ return;
93
+ }
94
+ }
95
+ }
96
+ this.currentState = AgentState.IDLE;
97
+ yield { type: 'state_change', state: AgentState.IDLE };
98
+ yield { type: 'done', usage: this.conversation.getTotalUsage() };
99
+ }
100
+ getMode() {
101
+ return this.currentMode;
102
+ }
103
+ setMode(mode) {
104
+ this.currentMode = mode;
105
+ }
106
+ getState() {
107
+ return this.currentState;
108
+ }
109
+ getSystemPrompt() {
110
+ const basePrompt = this.config.systemPrompt ?? `You are HalfCopilot, a helpful AI coding assistant powered by the ${this.modelName} model from ${this.providerName}.
111
+
112
+ You have access to the following tools:
113
+ - file_read: Read file contents
114
+ - file_write: Write file contents
115
+ - file_edit: Edit file contents
116
+ - bash: Execute shell commands
117
+ - grep: Search for patterns in files
118
+ - glob: Find files matching patterns
119
+
120
+ When helping users, be concise and direct. Always explain what you're doing and why.`;
121
+ let prompt = basePrompt;
122
+ // Add model information
123
+ prompt += `\n\n## Current Session Information
124
+ - Model: ${this.modelName}
125
+ - Provider: ${this.providerName}
126
+ - Mode: ${this.currentMode}
127
+
128
+ You are currently using the ${this.modelName} model provided by ${this.providerName}.`;
129
+ if (this.currentMode === 'plan') {
130
+ prompt += '\n\nYou are currently in PLAN mode. You can only read files and search the codebase. You cannot write files or execute commands. Analyze the situation and present a plan.';
131
+ }
132
+ return prompt;
133
+ }
134
+ filterPlanTools(tools) {
135
+ if (!tools)
136
+ return undefined;
137
+ return tools.filter((t) => PLAN_SAFE_TOOLS.includes(t.name));
138
+ }
139
+ }
140
+ //# sourceMappingURL=agent-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Message, TokenUsage } from '@halfcopilot/provider';
2
+ export interface ConversationConfig {
3
+ maxMessages: number;
4
+ compactionThreshold?: number;
5
+ }
6
+ export declare class ConversationManager {
7
+ private messages;
8
+ private totalUsage;
9
+ private config;
10
+ constructor(config: ConversationConfig);
11
+ addUserMessage(content: string): void;
12
+ addAssistantMessage(content: string | Message[]): void;
13
+ addToolResult(toolUseId: string, output: string, isError?: boolean): void;
14
+ getMessages(): Message[];
15
+ buildMessages(systemPrompt?: string): Message[];
16
+ addTokenUsage(usage: TokenUsage): void;
17
+ getTotalUsage(): TokenUsage;
18
+ getMessageCount(): number;
19
+ clear(): void;
20
+ private enforceLimit;
21
+ }
22
+ //# sourceMappingURL=conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,UAAU,CAAmD;IACrE,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,EAAE,kBAAkB;IAItC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKrC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,IAAI;IAStD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,IAAI;IAUvE,WAAW,IAAI,OAAO,EAAE;IAIxB,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE;IAS/C,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAKtC,aAAa,IAAI,UAAU;IAI3B,eAAe,IAAI,MAAM;IAIzB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,YAAY;CAYrB"}
@@ -0,0 +1,66 @@
1
+ export class ConversationManager {
2
+ messages = [];
3
+ totalUsage = { inputTokens: 0, outputTokens: 0 };
4
+ config;
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ addUserMessage(content) {
9
+ this.messages.push({ role: 'user', content });
10
+ this.enforceLimit();
11
+ }
12
+ addAssistantMessage(content) {
13
+ if (typeof content === 'string') {
14
+ this.messages.push({ role: 'assistant', content });
15
+ }
16
+ else {
17
+ this.messages.push({ role: 'assistant', content: content });
18
+ }
19
+ this.enforceLimit();
20
+ }
21
+ addToolResult(toolUseId, output, isError = false) {
22
+ this.messages.push({
23
+ role: 'tool_result',
24
+ toolUseId,
25
+ content: output,
26
+ isError,
27
+ });
28
+ this.enforceLimit();
29
+ }
30
+ getMessages() {
31
+ return [...this.messages];
32
+ }
33
+ buildMessages(systemPrompt) {
34
+ const msgs = [];
35
+ if (systemPrompt) {
36
+ msgs.push({ role: 'system', content: systemPrompt });
37
+ }
38
+ msgs.push(...this.messages);
39
+ return msgs;
40
+ }
41
+ addTokenUsage(usage) {
42
+ this.totalUsage.inputTokens += usage.inputTokens;
43
+ this.totalUsage.outputTokens += usage.outputTokens;
44
+ }
45
+ getTotalUsage() {
46
+ return { ...this.totalUsage };
47
+ }
48
+ getMessageCount() {
49
+ return this.messages.length;
50
+ }
51
+ clear() {
52
+ this.messages = [];
53
+ }
54
+ enforceLimit() {
55
+ while (this.messages.length > this.config.maxMessages) {
56
+ const idx = this.messages.findIndex((m) => m.role === 'user' || m.role === 'assistant');
57
+ if (idx >= 0) {
58
+ this.messages.splice(idx, 1);
59
+ }
60
+ else {
61
+ break;
62
+ }
63
+ }
64
+ }
65
+ }
66
+ //# sourceMappingURL=conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,mBAAmB;IACtB,QAAQ,GAAc,EAAE,CAAC;IACzB,UAAU,GAAe,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAC7D,MAAM,CAAqB;IAEnC,YAAY,MAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,cAAc,CAAC,OAAe;QAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,mBAAmB,CAAC,OAA2B;QAC7C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAc,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,aAAa,CAAC,SAAiB,EAAE,MAAc,EAAE,OAAO,GAAG,KAAK;QAC9D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,aAAa;YACnB,SAAS;YACT,OAAO,EAAE,MAAM;YACf,OAAO;SACR,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,aAAa,CAAC,YAAqB;QACjC,MAAM,IAAI,GAAc,EAAE,CAAC;QAC3B,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,KAAiB;QAC7B,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAC;IACrD,CAAC;IAED,aAAa;QACX,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAEO,YAAY;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CACnD,CAAC;YACF,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export { TextBlockParser, type TextBlock, type TextBlockType, type ParseResult, type ParseError } from './parser.js';
2
+ export { TextBlockToToolCallMapper, type ToolCall } from './mapper.js';
3
+ export { HybridProvider } from './provider.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hybrid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACrH,OAAO,EAAE,yBAAyB,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { TextBlockParser } from './parser.js';
2
+ export { TextBlockToToolCallMapper } from './mapper.js';
3
+ export { HybridProvider } from './provider.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hybrid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyE,MAAM,aAAa,CAAC;AACrH,OAAO,EAAE,yBAAyB,EAAiB,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { TextBlock } from './parser.js';
2
+ export interface ToolCall {
3
+ id: string;
4
+ name: string;
5
+ input: Record<string, unknown>;
6
+ }
7
+ export declare class TextBlockToToolCallMapper {
8
+ private readonly mapping;
9
+ map(block: TextBlock): ToolCall;
10
+ }
11
+ //# sourceMappingURL=mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../src/hybrid/mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAyCtB;IAEF,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ;CAOhC"}
@@ -0,0 +1,53 @@
1
+ import { generateId } from '@halfcopilot/shared';
2
+ export class TextBlockToToolCallMapper {
3
+ mapping = {
4
+ read: (block) => ({
5
+ id: generateId(),
6
+ name: 'file_read',
7
+ input: { path: block.params.path },
8
+ }),
9
+ edit: (block) => ({
10
+ id: generateId(),
11
+ name: 'file_edit',
12
+ input: {
13
+ path: block.params.path,
14
+ oldText: block.params._oldContent,
15
+ newText: block.params._newContent,
16
+ },
17
+ }),
18
+ create: (block) => ({
19
+ id: generateId(),
20
+ name: 'file_write',
21
+ input: { path: block.params.path, content: block.body },
22
+ }),
23
+ run: (block) => ({
24
+ id: generateId(),
25
+ name: 'bash',
26
+ input: {
27
+ command: block.params.command,
28
+ timeout: block.params.timeout ? parseInt(block.params.timeout) : undefined,
29
+ },
30
+ }),
31
+ search: (block) => ({
32
+ id: generateId(),
33
+ name: 'grep',
34
+ input: {
35
+ pattern: block.params.pattern,
36
+ glob: block.params.glob,
37
+ },
38
+ }),
39
+ glob: (block) => ({
40
+ id: generateId(),
41
+ name: 'glob',
42
+ input: { pattern: block.params.pattern },
43
+ }),
44
+ };
45
+ map(block) {
46
+ const mapper = this.mapping[block.type];
47
+ if (!mapper) {
48
+ throw new Error(`Unknown text block type: ${block.type}`);
49
+ }
50
+ return mapper(block);
51
+ }
52
+ }
53
+ //# sourceMappingURL=mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../src/hybrid/mapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAQjD,MAAM,OAAO,yBAAyB;IACnB,OAAO,GAAmD;QACzE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChB,EAAE,EAAE,UAAU,EAAE;YAChB,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;SACnC,CAAC;QACF,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChB,EAAE,EAAE,UAAU,EAAE;YAChB,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE;gBACL,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;gBACvB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;gBACjC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;aAClC;SACF,CAAC;QACF,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAClB,EAAE,EAAE,UAAU,EAAE;YAChB,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE;SACxD,CAAC;QACF,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACf,EAAE,EAAE,UAAU,EAAE;YAChB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;gBAC7B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;aAC3E;SACF,CAAC;QACF,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAClB,EAAE,EAAE,UAAU,EAAE;YAChB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;gBAC7B,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;aACxB;SACF,CAAC;QACF,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChB,EAAE,EAAE,UAAU,EAAE;YAChB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;SACzC,CAAC;KACH,CAAC;IAEF,GAAG,CAAC,KAAgB;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ export type TextBlockType = 'read' | 'edit' | 'create' | 'run' | 'search' | 'glob';
2
+ export interface TextBlock {
3
+ type: TextBlockType;
4
+ params: Record<string, string>;
5
+ body?: string;
6
+ source: {
7
+ line: number;
8
+ column: number;
9
+ };
10
+ }
11
+ export interface TextPart {
12
+ text: string;
13
+ line: number;
14
+ }
15
+ export interface ParseError {
16
+ message: string;
17
+ line: number;
18
+ severity: 'error' | 'warning';
19
+ }
20
+ export interface ParseResult {
21
+ blocks: TextBlock[];
22
+ textParts: TextPart[];
23
+ errors: ParseError[];
24
+ }
25
+ export declare class TextBlockParser {
26
+ private readonly BLOCK_START;
27
+ private readonly BLOCK_END;
28
+ private readonly PARAM_LINE;
29
+ private readonly EDIT_SEPARATOR;
30
+ private readonly INLINE_RUN;
31
+ private readonly INLINE_READ;
32
+ parse(text: string): ParseResult;
33
+ private parseEditBody;
34
+ hasTextBlocks(text: string): boolean;
35
+ }
36
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/hybrid/parser.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEnF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgD;IAC5E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAE5C,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAyFhC,OAAO,CAAC,aAAa;IA8BrB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAGrC"}
@@ -0,0 +1,118 @@
1
+ export class TextBlockParser {
2
+ BLOCK_START = /^```(read|edit|create|run|search|glob)\s*$/;
3
+ BLOCK_END = /^```\s*$/;
4
+ PARAM_LINE = /^(\w+):\s*(.+)$/;
5
+ EDIT_SEPARATOR = /^>>>>>>> REPLACE$/;
6
+ INLINE_RUN = /^!\s*(.+)$/;
7
+ INLINE_READ = /^@\s*(.+)$/;
8
+ parse(text) {
9
+ const blocks = [];
10
+ const textParts = [];
11
+ const errors = [];
12
+ const lines = text.split('\n');
13
+ let i = 0;
14
+ while (i < lines.length) {
15
+ // Try inline commands first
16
+ const inlineRun = this.INLINE_RUN.exec(lines[i]);
17
+ if (inlineRun) {
18
+ blocks.push({
19
+ type: 'run',
20
+ params: { command: inlineRun[1].trim() },
21
+ source: { line: i + 1, column: 1 },
22
+ });
23
+ i++;
24
+ continue;
25
+ }
26
+ const inlineRead = this.INLINE_READ.exec(lines[i]);
27
+ if (inlineRead) {
28
+ blocks.push({
29
+ type: 'read',
30
+ params: { path: inlineRead[1].trim() },
31
+ source: { line: i + 1, column: 1 },
32
+ });
33
+ i++;
34
+ continue;
35
+ }
36
+ // Try to match text block start
37
+ const startMatch = this.BLOCK_START.exec(lines[i]);
38
+ if (startMatch) {
39
+ const blockType = startMatch[1];
40
+ const startLine = i;
41
+ // Extract parameters
42
+ const params = {};
43
+ i++;
44
+ while (i < lines.length && this.PARAM_LINE.test(lines[i])) {
45
+ const [, key, value] = this.PARAM_LINE.exec(lines[i]);
46
+ params[key] = value.trim();
47
+ i++;
48
+ }
49
+ // Extract body
50
+ let body = '';
51
+ const bodyLines = [];
52
+ while (i < lines.length && !this.BLOCK_END.test(lines[i])) {
53
+ bodyLines.push(lines[i]);
54
+ i++;
55
+ }
56
+ if (i < lines.length) {
57
+ body = bodyLines.join('\n');
58
+ i++; // Skip closing ```
59
+ }
60
+ else {
61
+ errors.push({
62
+ message: `Unclosed text block starting at line ${startLine + 1}`,
63
+ line: startLine + 1,
64
+ severity: 'warning',
65
+ });
66
+ }
67
+ // Handle EDIT type special body
68
+ if (blockType === 'edit') {
69
+ const parsed = this.parseEditBody(body);
70
+ params._oldContent = parsed.oldContent;
71
+ params._newContent = parsed.newContent;
72
+ }
73
+ blocks.push({
74
+ type: blockType,
75
+ params,
76
+ body,
77
+ source: { line: startLine + 1, column: 1 },
78
+ });
79
+ }
80
+ else {
81
+ textParts.push({ text: lines[i], line: i });
82
+ i++;
83
+ }
84
+ }
85
+ return { blocks, textParts, errors };
86
+ }
87
+ parseEditBody(body) {
88
+ const separator = this.EDIT_SEPARATOR;
89
+ const lines = body.split('\n');
90
+ const oldLines = [];
91
+ const newLines = [];
92
+ let foundSeparator = false;
93
+ for (const line of lines) {
94
+ if (separator.test(line)) {
95
+ foundSeparator = true;
96
+ continue;
97
+ }
98
+ if (foundSeparator) {
99
+ newLines.push(line);
100
+ }
101
+ else {
102
+ oldLines.push(line);
103
+ }
104
+ }
105
+ if (!foundSeparator) {
106
+ // No separator, treat entire body as new content (create file semantics)
107
+ return { oldContent: '', newContent: body };
108
+ }
109
+ return {
110
+ oldContent: oldLines.join('\n'),
111
+ newContent: newLines.join('\n'),
112
+ };
113
+ }
114
+ hasTextBlocks(text) {
115
+ return this.BLOCK_START.test(text) || this.INLINE_RUN.test(text) || this.INLINE_READ.test(text);
116
+ }
117
+ }
118
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/hybrid/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Provider, ChatParams, ChatEvent, ProviderCapabilities } from '@halfcopilot/provider';
2
+ export declare class HybridProvider implements Provider {
3
+ readonly name: string;
4
+ readonly capabilities: ProviderCapabilities;
5
+ private inner;
6
+ private parser;
7
+ private mapper;
8
+ constructor(inner: Provider);
9
+ chat(params: ChatParams): AsyncGenerator<ChatEvent>;
10
+ supportsToolUse(): boolean;
11
+ supportsStreaming(): boolean;
12
+ private injectTextBlockProtocol;
13
+ }
14
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/hybrid/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAInG,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAE5C,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAA4B;gBAE9B,KAAK,EAAE,QAAQ;IAQpB,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,cAAc,CAAC,SAAS,CAAC;IAyC1D,eAAe,IAAI,OAAO;IAI1B,iBAAiB,IAAI,OAAO;IAI5B,OAAO,CAAC,uBAAuB;CAgDhC"}
@@ -0,0 +1,109 @@
1
+ import { TextBlockParser } from './parser.js';
2
+ import { TextBlockToToolCallMapper } from './mapper.js';
3
+ export class HybridProvider {
4
+ name;
5
+ capabilities;
6
+ inner;
7
+ parser;
8
+ mapper;
9
+ constructor(inner) {
10
+ this.inner = inner;
11
+ this.name = inner.name;
12
+ this.capabilities = inner.capabilities;
13
+ this.parser = new TextBlockParser();
14
+ this.mapper = new TextBlockToToolCallMapper();
15
+ }
16
+ async *chat(params) {
17
+ // If provider supports tool_use, pass through directly
18
+ if (this.capabilities.toolUse) {
19
+ yield* this.inner.chat(params);
20
+ return;
21
+ }
22
+ // Inject text block protocol into system prompt
23
+ const enhancedParams = this.injectTextBlockProtocol(params);
24
+ // Call underlying provider
25
+ let fullText = '';
26
+ for await (const event of this.inner.chat(enhancedParams)) {
27
+ if (event.type === 'text') {
28
+ fullText += event.content;
29
+ yield event; // Still pass through text stream to TUI
30
+ }
31
+ else {
32
+ yield event;
33
+ }
34
+ }
35
+ // Parse text blocks and convert to tool_use events
36
+ const result = this.parser.parse(fullText);
37
+ for (const block of result.blocks) {
38
+ try {
39
+ const toolCall = this.mapper.map(block);
40
+ yield {
41
+ type: 'tool_use',
42
+ id: toolCall.id,
43
+ name: toolCall.name,
44
+ input: toolCall.input,
45
+ };
46
+ }
47
+ catch (error) {
48
+ yield {
49
+ type: 'error',
50
+ error: error instanceof Error ? error : new Error(String(error)),
51
+ };
52
+ }
53
+ }
54
+ }
55
+ supportsToolUse() {
56
+ return this.capabilities.toolUse;
57
+ }
58
+ supportsStreaming() {
59
+ return this.capabilities.streaming;
60
+ }
61
+ injectTextBlockProtocol(params) {
62
+ const protocolPrompt = `You can use the following text blocks to perform actions:
63
+
64
+ \`\`\`read
65
+ path: /path/to/file
66
+ \`\`\`
67
+
68
+ \`\`\`edit
69
+ path: /path/to/file
70
+ \`\`\`
71
+ old content
72
+ >>>>>>> REPLACE
73
+ new content
74
+ \`\`\`
75
+
76
+ \`\`\`create
77
+ path: /path/to/new/file
78
+ \`\`\`
79
+ file content
80
+ \`\`\`
81
+
82
+ \`\`\`run
83
+ command: shell command here
84
+ \`\`\`
85
+
86
+ \`\`\`search
87
+ pattern: regex pattern
88
+ glob: **/*.ts
89
+ \`\`\`
90
+
91
+ \`\`\`glob
92
+ pattern: src/**/*.ts
93
+ \`\`\`
94
+
95
+ You can also use inline commands:
96
+ - !command - Run a shell command
97
+ - @path - Read a file
98
+
99
+ Use these blocks when you need to read files, edit code, create files, run commands, or search the codebase.`;
100
+ return {
101
+ ...params,
102
+ messages: [
103
+ { role: 'system', content: protocolPrompt },
104
+ ...params.messages,
105
+ ],
106
+ };
107
+ }
108
+ }
109
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/hybrid/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,OAAO,cAAc;IAChB,IAAI,CAAS;IACb,YAAY,CAAuB;IAEpC,KAAK,CAAW;IAChB,MAAM,CAAkB;IACxB,MAAM,CAA4B;IAE1C,YAAY,KAAe;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,yBAAyB,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,CAAC,IAAI,CAAC,MAAkB;QAC5B,uDAAuD;QACvD,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC9B,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,gDAAgD;QAChD,MAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAE5D,2BAA2B;QAC3B,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC1D,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC;gBAC1B,MAAM,KAAK,CAAC,CAAC,wCAAwC;YACvD,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,mDAAmD;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACxC,MAAM;oBACJ,IAAI,EAAE,UAAU;oBAChB,EAAE,EAAE,QAAQ,CAAC,EAAE;oBACf,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;iBACtB,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;iBACjE,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IACnC,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;IACrC,CAAC;IAEO,uBAAuB,CAAC,MAAkB;QAChD,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6GAqCkF,CAAC;QAE1G,OAAO;YACL,GAAG,MAAM;YACT,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE;gBAC3C,GAAG,MAAM,CAAC,QAAQ;aACnB;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export { AgentLoop } from './agent-loop.js';
2
+ export { AgentState, type AgentConfig, type AgentEvent, type AgentMode } from './types.js';
3
+ export { ConversationManager, type ConversationConfig } from './conversation.js';
4
+ export { TextBlockParser, TextBlockToToolCallMapper, HybridProvider, type TextBlock, type TextBlockType, type ParseResult, type ToolCall } from './hybrid/index.js';
5
+ //# sourceMappingURL=index.d.ts.map