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,17 @@
1
+ import type { PermissionResult } from './types.js';
2
+ import { PermissionLevel } from './types.js';
3
+ export interface PermissionConfig {
4
+ autoApproveSafe: boolean;
5
+ allow?: string[];
6
+ deny?: string[];
7
+ }
8
+ export declare class PermissionChecker {
9
+ private config;
10
+ private sessionApprovedTools;
11
+ constructor(config: PermissionConfig);
12
+ check(toolName: string, input: Record<string, unknown>, permissionLevel: PermissionLevel): Promise<PermissionResult>;
13
+ approve(toolName: string, input: Record<string, unknown>): void;
14
+ approveTool(toolName: string): void;
15
+ private matchesPattern;
16
+ }
17
+ //# sourceMappingURL=permission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.d.ts","sourceRoot":"","sources":["../src/permission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,oBAAoB,CAAqB;gBAErC,MAAM,EAAE,gBAAgB;IAI9B,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,gBAAgB,CAAC;IAsD5B,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI/D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAInC,OAAO,CAAC,cAAc;CAgBvB"}
@@ -0,0 +1,74 @@
1
+ import { PermissionLevel } from './types.js';
2
+ export class PermissionChecker {
3
+ config;
4
+ sessionApprovedTools = new Set();
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ async check(toolName, input, permissionLevel) {
9
+ // Check deny list first
10
+ if (this.config.deny) {
11
+ for (const pattern of this.config.deny) {
12
+ if (this.matchesPattern(pattern, toolName, input)) {
13
+ return { approved: false, reason: 'denied_by_rule' };
14
+ }
15
+ }
16
+ }
17
+ // Auto-approve safe tools
18
+ if (permissionLevel === PermissionLevel.SAFE && this.config.autoApproveSafe) {
19
+ return { approved: true };
20
+ }
21
+ // Check if tool was approved for this session
22
+ if (this.sessionApprovedTools.has(toolName)) {
23
+ return { approved: true };
24
+ }
25
+ // Check allow list - if tool matches any pattern, auto-approve
26
+ if (this.config.allow) {
27
+ for (const pattern of this.config.allow) {
28
+ if (this.matchesPattern(pattern, toolName, input)) {
29
+ return { approved: true };
30
+ }
31
+ }
32
+ }
33
+ // For file operations, auto-approve by default
34
+ if (['file_read', 'file_write', 'file_edit'].includes(toolName)) {
35
+ return { approved: true };
36
+ }
37
+ // For bash commands, check if it's a common/safe command
38
+ if (toolName === 'bash') {
39
+ const command = String(input.command ?? '');
40
+ // Auto-approve common commands
41
+ const safeCommands = ['ls', 'dir', 'pwd', 'echo', 'cat', 'type', 'whoami', 'cd', 'mkdir', 'touch', 'cp', 'mv', 'find', 'tree', 'git', 'node', 'npm', 'pnpm', 'powershell'];
42
+ const isSafe = safeCommands.some(cmd => command.trim().startsWith(cmd));
43
+ if (isSafe) {
44
+ return { approved: true };
45
+ }
46
+ }
47
+ // For warn level, require confirmation
48
+ if (permissionLevel === PermissionLevel.WARN) {
49
+ return { approved: false, reason: 'requires_confirmation' };
50
+ }
51
+ // For unsafe level, require confirmation
52
+ return { approved: false, reason: 'requires_confirmation' };
53
+ }
54
+ approve(toolName, input) {
55
+ this.sessionApprovedTools.add(toolName);
56
+ }
57
+ approveTool(toolName) {
58
+ this.sessionApprovedTools.add(toolName);
59
+ }
60
+ matchesPattern(pattern, toolName, input) {
61
+ const match = pattern.match(/^(\w+)(?:\((.+)\))?$/);
62
+ if (!match)
63
+ return false;
64
+ const [, patTool, patArg] = match;
65
+ if (patTool !== toolName)
66
+ return false;
67
+ if (!patArg)
68
+ return true;
69
+ const inputValue = String(input.command ?? input.path ?? input.query ?? '');
70
+ const regex = new RegExp('^' + patArg.replace(/\*/g, '.*').replace(/\?/g, '.') + '$');
71
+ return regex.test(inputValue);
72
+ }
73
+ }
74
+ //# sourceMappingURL=permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.js","sourceRoot":"","sources":["../src/permission.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ToolDef } from '@halfcopilot/provider';
2
+ import type { Tool, PermissionLevel } from './types.js';
3
+ export declare class ToolRegistry {
4
+ private tools;
5
+ register(tool: Tool): void;
6
+ unregister(name: string): void;
7
+ get(name: string): Tool;
8
+ has(name: string): boolean;
9
+ definitions(): ToolDef[];
10
+ list(): string[];
11
+ getByPermission(level: PermissionLevel): Tool[];
12
+ }
13
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGxD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA2B;IAExC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAI1B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQvB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,WAAW,IAAI,OAAO,EAAE;IAQxB,IAAI,IAAI,MAAM,EAAE;IAIhB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,EAAE;CAGhD"}
@@ -0,0 +1,34 @@
1
+ import { ToolError } from '@halfcopilot/shared';
2
+ export class ToolRegistry {
3
+ tools = new Map();
4
+ register(tool) {
5
+ this.tools.set(tool.name, tool);
6
+ }
7
+ unregister(name) {
8
+ this.tools.delete(name);
9
+ }
10
+ get(name) {
11
+ const tool = this.tools.get(name);
12
+ if (!tool) {
13
+ throw new ToolError(name, `Tool "${name}" not found`);
14
+ }
15
+ return tool;
16
+ }
17
+ has(name) {
18
+ return this.tools.has(name);
19
+ }
20
+ definitions() {
21
+ return Array.from(this.tools.values()).map(({ name, description, inputSchema }) => ({
22
+ name,
23
+ description,
24
+ inputSchema,
25
+ }));
26
+ }
27
+ list() {
28
+ return Array.from(this.tools.keys());
29
+ }
30
+ getByPermission(level) {
31
+ return Array.from(this.tools.values()).filter(t => t.permissionLevel === level);
32
+ }
33
+ }
34
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,OAAO,YAAY;IACf,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAExC,QAAQ,CAAC,IAAU;QACjB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,IAAY;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,SAAS,IAAI,aAAa,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,WAAW;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YAClF,IAAI;YACJ,WAAW;YACX,WAAW;SACZ,CAAC,CAAC,CAAC;IACN,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,eAAe,CAAC,KAAsB;QACpC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,KAAK,CAAC,CAAC;IAClF,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ import type { ToolDef } from '@halfcopilot/provider';
2
+ export declare enum PermissionLevel {
3
+ SAFE = "safe",
4
+ WARN = "warn",
5
+ UNSAFE = "unsafe"
6
+ }
7
+ export interface ToolContext {
8
+ projectRoot: string;
9
+ workingDirectory: string;
10
+ signal: AbortSignal;
11
+ sessionId: string;
12
+ }
13
+ export interface ToolResult {
14
+ output: string;
15
+ error?: string;
16
+ metadata?: Record<string, unknown>;
17
+ }
18
+ export interface Tool extends ToolDef {
19
+ permissionLevel: PermissionLevel;
20
+ execute(input: Record<string, unknown>, context: ToolContext): Promise<ToolResult>;
21
+ toProviderFormat?(): ToolDef;
22
+ }
23
+ export interface PermissionResult {
24
+ approved: boolean;
25
+ reason?: string;
26
+ }
27
+ export declare const TOOL_PERMISSIONS: Record<string, PermissionLevel>;
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,oBAAY,eAAe;IACzB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,IAAK,SAAQ,OAAO;IACnC,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnF,gBAAgB,CAAC,IAAI,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAQ5D,CAAC"}
@@ -0,0 +1,16 @@
1
+ export var PermissionLevel;
2
+ (function (PermissionLevel) {
3
+ PermissionLevel["SAFE"] = "safe";
4
+ PermissionLevel["WARN"] = "warn";
5
+ PermissionLevel["UNSAFE"] = "unsafe";
6
+ })(PermissionLevel || (PermissionLevel = {}));
7
+ export const TOOL_PERMISSIONS = {
8
+ file_read: PermissionLevel.SAFE,
9
+ file_write: PermissionLevel.WARN,
10
+ file_edit: PermissionLevel.WARN,
11
+ bash: PermissionLevel.UNSAFE,
12
+ grep: PermissionLevel.SAFE,
13
+ glob: PermissionLevel.SAFE,
14
+ list_files: PermissionLevel.SAFE,
15
+ };
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,gCAAa,CAAA;IACb,gCAAa,CAAA;IACb,oCAAiB,CAAA;AACnB,CAAC,EAJW,eAAe,KAAf,eAAe,QAI1B;AA0BD,MAAM,CAAC,MAAM,gBAAgB,GAAoC;IAC/D,SAAS,EAAE,eAAe,CAAC,IAAI;IAC/B,UAAU,EAAE,eAAe,CAAC,IAAI;IAChC,SAAS,EAAE,eAAe,CAAC,IAAI;IAC/B,IAAI,EAAE,eAAe,CAAC,MAAM;IAC5B,IAAI,EAAE,eAAe,CAAC,IAAI;IAC1B,IAAI,EAAE,eAAe,CAAC,IAAI;IAC1B,UAAU,EAAE,eAAe,CAAC,IAAI;CACjC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "halfcopilot",
3
+ "version": "1.0.0",
4
+ "description": "HalfCopilot — Multi-model Agent Framework CLI with Beautiful Chat Interface",
5
+ "type": "module",
6
+ "bin": {
7
+ "halfcop": "./bin/halfcop.js",
8
+ "halfcopilot": "./bin/halfcop.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "scripts": {
12
+ "postinstall": "node scripts/postinstall.mjs"
13
+ },
14
+ "files": [
15
+ "bin/",
16
+ "dist/",
17
+ "scripts/",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "dependencies": {
22
+ "@halfcopilot/shared": "file:./dist/packages/shared/dist",
23
+ "@halfcopilot/config": "file:./dist/packages/config/dist",
24
+ "@halfcopilot/provider": "file:./dist/packages/provider/dist",
25
+ "@halfcopilot/tools": "file:./dist/packages/tools/dist",
26
+ "@halfcopilot/core": "file:./dist/packages/core/dist",
27
+ "@halfcopilot/memory": "file:./dist/packages/memory/dist",
28
+ "@halfcopilot/mcp": "file:./dist/packages/mcp/dist",
29
+ "@halfcopilot/skills": "file:./dist/packages/skills/dist",
30
+ "@halfcopilot/cli": "file:./dist/packages/cli/dist",
31
+ "commander": "^12.0.0",
32
+ "openai": "^4.77.0",
33
+ "@anthropic-ai/sdk": "^0.36.0",
34
+ "zod": "^3.24.0"
35
+ },
36
+ "engines": {
37
+ "node": ">=20.0.0"
38
+ },
39
+ "keywords": [
40
+ "agent", "cli", "ai", "multi-model", "copilot",
41
+ "code-assistant", "deepseek", "openai", "anthropic"
42
+ ],
43
+ "author": "HalfCopilot Team",
44
+ "license": "MIT",
45
+ "repository": "https://github.com/halfcopilot/halfcopilot",
46
+ "homepage": "https://github.com/halfcopilot/halfcopilot"
47
+ }
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Postinstall script for HalfCopilot
5
+ * Shows welcome message after installation
6
+ */
7
+
8
+ console.log('');
9
+ console.log('╔══════════════════════════════════════════════════╗');
10
+ console.log('║ HalfCopilot installed successfully! 🎉 ║');
11
+ console.log('╚══════════════════════════════════════════════════╝');
12
+ console.log('');
13
+ console.log(' Get started:');
14
+ console.log('');
15
+ console.log(' halfcop # Start interactive chat');
16
+ console.log(' halfcop run "prompt" # Run single prompt');
17
+ console.log(' halfcop models # List available models');
18
+ console.log(' halfcop doctor # Check configuration');
19
+ console.log('');
20
+ console.log(' Configure your API keys:');
21
+ console.log('');
22
+ console.log(' Create ~/.halfcopilot/settings.json');
23
+ console.log(' See: https://github.com/halfcopilot/halfcopilot#configuration');
24
+ console.log('');