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.
- package/LICENSE +21 -0
- package/README.md +148 -0
- package/bin/halfcop.js +22 -0
- package/dist/index.js +3 -0
- package/dist/packages/cli/dist/halfcop.d.ts +6 -0
- package/dist/packages/cli/dist/halfcop.d.ts.map +1 -0
- package/dist/packages/cli/dist/halfcop.js +448 -0
- package/dist/packages/cli/dist/halfcop.js.map +1 -0
- package/dist/packages/cli/dist/index.d.ts +3 -0
- package/dist/packages/cli/dist/index.d.ts.map +1 -0
- package/dist/packages/cli/dist/index.js +251 -0
- package/dist/packages/cli/dist/index.js.map +1 -0
- package/dist/packages/cli/dist/tui/app.d.ts +11 -0
- package/dist/packages/cli/dist/tui/app.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/app.js +72 -0
- package/dist/packages/cli/dist/tui/app.js.map +1 -0
- package/dist/packages/cli/dist/tui/components/ChatView.d.ts +12 -0
- package/dist/packages/cli/dist/tui/components/ChatView.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/components/ChatView.js +6 -0
- package/dist/packages/cli/dist/tui/components/ChatView.js.map +1 -0
- package/dist/packages/cli/dist/tui/components/InputField.d.ts +8 -0
- package/dist/packages/cli/dist/tui/components/InputField.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/components/InputField.js +22 -0
- package/dist/packages/cli/dist/tui/components/InputField.js.map +1 -0
- package/dist/packages/cli/dist/tui/components/StatusBar.d.ts +13 -0
- package/dist/packages/cli/dist/tui/components/StatusBar.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/components/StatusBar.js +6 -0
- package/dist/packages/cli/dist/tui/components/StatusBar.js.map +1 -0
- package/dist/packages/cli/dist/tui/components/ToolApproval.d.ts +10 -0
- package/dist/packages/cli/dist/tui/components/ToolApproval.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/components/ToolApproval.js +14 -0
- package/dist/packages/cli/dist/tui/components/ToolApproval.js.map +1 -0
- package/dist/packages/cli/dist/tui/components/index.d.ts +5 -0
- package/dist/packages/cli/dist/tui/components/index.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/components/index.js +5 -0
- package/dist/packages/cli/dist/tui/components/index.js.map +1 -0
- package/dist/packages/cli/dist/tui/index.d.ts +3 -0
- package/dist/packages/cli/dist/tui/index.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/index.js +3 -0
- package/dist/packages/cli/dist/tui/index.js.map +1 -0
- package/dist/packages/config/dist/defaults.d.ts +3 -0
- package/dist/packages/config/dist/defaults.d.ts.map +1 -0
- package/dist/packages/config/dist/defaults.js +30 -0
- package/dist/packages/config/dist/defaults.js.map +1 -0
- package/dist/packages/config/dist/index.d.ts +4 -0
- package/dist/packages/config/dist/index.d.ts.map +1 -0
- package/dist/packages/config/dist/index.js +4 -0
- package/dist/packages/config/dist/index.js.map +1 -0
- package/dist/packages/config/dist/loader.d.ts +4 -0
- package/dist/packages/config/dist/loader.d.ts.map +1 -0
- package/dist/packages/config/dist/loader.js +80 -0
- package/dist/packages/config/dist/loader.js.map +1 -0
- package/dist/packages/config/dist/schema.d.ts +323 -0
- package/dist/packages/config/dist/schema.d.ts.map +1 -0
- package/dist/packages/config/dist/schema.js +56 -0
- package/dist/packages/config/dist/schema.js.map +1 -0
- package/dist/packages/core/dist/agent-loop.d.ts +19 -0
- package/dist/packages/core/dist/agent-loop.d.ts.map +1 -0
- package/dist/packages/core/dist/agent-loop.js +140 -0
- package/dist/packages/core/dist/agent-loop.js.map +1 -0
- package/dist/packages/core/dist/conversation.d.ts +22 -0
- package/dist/packages/core/dist/conversation.d.ts.map +1 -0
- package/dist/packages/core/dist/conversation.js +66 -0
- package/dist/packages/core/dist/conversation.js.map +1 -0
- package/dist/packages/core/dist/hybrid/index.d.ts +4 -0
- package/dist/packages/core/dist/hybrid/index.d.ts.map +1 -0
- package/dist/packages/core/dist/hybrid/index.js +4 -0
- package/dist/packages/core/dist/hybrid/index.js.map +1 -0
- package/dist/packages/core/dist/hybrid/mapper.d.ts +11 -0
- package/dist/packages/core/dist/hybrid/mapper.d.ts.map +1 -0
- package/dist/packages/core/dist/hybrid/mapper.js +53 -0
- package/dist/packages/core/dist/hybrid/mapper.js.map +1 -0
- package/dist/packages/core/dist/hybrid/parser.d.ts +36 -0
- package/dist/packages/core/dist/hybrid/parser.d.ts.map +1 -0
- package/dist/packages/core/dist/hybrid/parser.js +118 -0
- package/dist/packages/core/dist/hybrid/parser.js.map +1 -0
- package/dist/packages/core/dist/hybrid/provider.d.ts +14 -0
- package/dist/packages/core/dist/hybrid/provider.d.ts.map +1 -0
- package/dist/packages/core/dist/hybrid/provider.js +109 -0
- package/dist/packages/core/dist/hybrid/provider.js.map +1 -0
- package/dist/packages/core/dist/index.d.ts +5 -0
- package/dist/packages/core/dist/index.d.ts.map +1 -0
- package/dist/packages/core/dist/index.js +5 -0
- package/dist/packages/core/dist/index.js.map +1 -0
- package/dist/packages/core/dist/types.d.ts +36 -0
- package/dist/packages/core/dist/types.d.ts.map +1 -0
- package/dist/packages/core/dist/types.js +11 -0
- package/dist/packages/core/dist/types.js.map +1 -0
- package/dist/packages/mcp/dist/adapter.d.ts +15 -0
- package/dist/packages/mcp/dist/adapter.d.ts.map +1 -0
- package/dist/packages/mcp/dist/adapter.js +44 -0
- package/dist/packages/mcp/dist/adapter.js.map +1 -0
- package/dist/packages/mcp/dist/client.d.ts +31 -0
- package/dist/packages/mcp/dist/client.d.ts.map +1 -0
- package/dist/packages/mcp/dist/client.js +140 -0
- package/dist/packages/mcp/dist/client.js.map +1 -0
- package/dist/packages/mcp/dist/index.d.ts +6 -0
- package/dist/packages/mcp/dist/index.d.ts.map +1 -0
- package/dist/packages/mcp/dist/index.js +4 -0
- package/dist/packages/mcp/dist/index.js.map +1 -0
- package/dist/packages/mcp/dist/transport.d.ts +47 -0
- package/dist/packages/mcp/dist/transport.d.ts.map +1 -0
- package/dist/packages/mcp/dist/transport.js +123 -0
- package/dist/packages/mcp/dist/transport.js.map +1 -0
- package/dist/packages/mcp/dist/types.d.ts +64 -0
- package/dist/packages/mcp/dist/types.d.ts.map +1 -0
- package/dist/packages/mcp/dist/types.js +2 -0
- package/dist/packages/mcp/dist/types.js.map +1 -0
- package/dist/packages/memory/dist/index.d.ts +3 -0
- package/dist/packages/memory/dist/index.d.ts.map +1 -0
- package/dist/packages/memory/dist/index.js +2 -0
- package/dist/packages/memory/dist/index.js.map +1 -0
- package/dist/packages/memory/dist/store.d.ts +15 -0
- package/dist/packages/memory/dist/store.d.ts.map +1 -0
- package/dist/packages/memory/dist/store.js +93 -0
- package/dist/packages/memory/dist/store.js.map +1 -0
- package/dist/packages/memory/dist/types.d.ts +14 -0
- package/dist/packages/memory/dist/types.d.ts.map +1 -0
- package/dist/packages/memory/dist/types.js +2 -0
- package/dist/packages/memory/dist/types.js.map +1 -0
- package/dist/packages/provider/dist/anthropic.d.ts +21 -0
- package/dist/packages/provider/dist/anthropic.d.ts.map +1 -0
- package/dist/packages/provider/dist/anthropic.js +148 -0
- package/dist/packages/provider/dist/anthropic.js.map +1 -0
- package/dist/packages/provider/dist/base.d.ts +16 -0
- package/dist/packages/provider/dist/base.d.ts.map +1 -0
- package/dist/packages/provider/dist/base.js +9 -0
- package/dist/packages/provider/dist/base.js.map +1 -0
- package/dist/packages/provider/dist/index.d.ts +6 -0
- package/dist/packages/provider/dist/index.d.ts.map +1 -0
- package/dist/packages/provider/dist/index.js +5 -0
- package/dist/packages/provider/dist/index.js.map +1 -0
- package/dist/packages/provider/dist/openai.d.ts +23 -0
- package/dist/packages/provider/dist/openai.d.ts.map +1 -0
- package/dist/packages/provider/dist/openai.js +171 -0
- package/dist/packages/provider/dist/openai.js.map +1 -0
- package/dist/packages/provider/dist/registry.d.ts +11 -0
- package/dist/packages/provider/dist/registry.d.ts.map +1 -0
- package/dist/packages/provider/dist/registry.js +61 -0
- package/dist/packages/provider/dist/registry.js.map +1 -0
- package/dist/packages/provider/dist/types.d.ts +84 -0
- package/dist/packages/provider/dist/types.d.ts.map +1 -0
- package/dist/packages/provider/dist/types.js +3 -0
- package/dist/packages/provider/dist/types.js.map +1 -0
- package/dist/packages/shared/dist/errors.d.ts +18 -0
- package/dist/packages/shared/dist/errors.d.ts.map +1 -0
- package/dist/packages/shared/dist/errors.js +35 -0
- package/dist/packages/shared/dist/errors.js.map +1 -0
- package/dist/packages/shared/dist/index.d.ts +4 -0
- package/dist/packages/shared/dist/index.d.ts.map +1 -0
- package/dist/packages/shared/dist/index.js +4 -0
- package/dist/packages/shared/dist/index.js.map +1 -0
- package/dist/packages/shared/dist/logger.d.ts +18 -0
- package/dist/packages/shared/dist/logger.d.ts.map +1 -0
- package/dist/packages/shared/dist/logger.js +39 -0
- package/dist/packages/shared/dist/logger.js.map +1 -0
- package/dist/packages/shared/dist/utils.d.ts +5 -0
- package/dist/packages/shared/dist/utils.d.ts.map +1 -0
- package/dist/packages/shared/dist/utils.js +27 -0
- package/dist/packages/shared/dist/utils.js.map +1 -0
- package/dist/packages/skills/dist/builtins.d.ts +8 -0
- package/dist/packages/skills/dist/builtins.d.ts.map +1 -0
- package/dist/packages/skills/dist/builtins.js +144 -0
- package/dist/packages/skills/dist/builtins.js.map +1 -0
- package/dist/packages/skills/dist/index.d.ts +4 -0
- package/dist/packages/skills/dist/index.d.ts.map +1 -0
- package/dist/packages/skills/dist/index.js +3 -0
- package/dist/packages/skills/dist/index.js.map +1 -0
- package/dist/packages/skills/dist/registry.d.ts +13 -0
- package/dist/packages/skills/dist/registry.d.ts.map +1 -0
- package/dist/packages/skills/dist/registry.js +93 -0
- package/dist/packages/skills/dist/registry.js.map +1 -0
- package/dist/packages/skills/dist/types.d.ts +35 -0
- package/dist/packages/skills/dist/types.d.ts.map +1 -0
- package/dist/packages/skills/dist/types.js +2 -0
- package/dist/packages/skills/dist/types.js.map +1 -0
- package/dist/packages/tools/dist/builtins/bash.d.ts +3 -0
- package/dist/packages/tools/dist/builtins/bash.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/bash.js +38 -0
- package/dist/packages/tools/dist/builtins/bash.js.map +1 -0
- package/dist/packages/tools/dist/builtins/file-edit.d.ts +3 -0
- package/dist/packages/tools/dist/builtins/file-edit.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/file-edit.js +45 -0
- package/dist/packages/tools/dist/builtins/file-edit.js.map +1 -0
- package/dist/packages/tools/dist/builtins/file-read.d.ts +3 -0
- package/dist/packages/tools/dist/builtins/file-read.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/file-read.js +39 -0
- package/dist/packages/tools/dist/builtins/file-read.js.map +1 -0
- package/dist/packages/tools/dist/builtins/file-write.d.ts +3 -0
- package/dist/packages/tools/dist/builtins/file-write.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/file-write.js +30 -0
- package/dist/packages/tools/dist/builtins/file-write.js.map +1 -0
- package/dist/packages/tools/dist/builtins/glob.d.ts +3 -0
- package/dist/packages/tools/dist/builtins/glob.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/glob.js +33 -0
- package/dist/packages/tools/dist/builtins/glob.js.map +1 -0
- package/dist/packages/tools/dist/builtins/grep.d.ts +3 -0
- package/dist/packages/tools/dist/builtins/grep.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/grep.js +59 -0
- package/dist/packages/tools/dist/builtins/grep.js.map +1 -0
- package/dist/packages/tools/dist/builtins/index.d.ts +10 -0
- package/dist/packages/tools/dist/builtins/index.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/index.js +18 -0
- package/dist/packages/tools/dist/builtins/index.js.map +1 -0
- package/dist/packages/tools/dist/executor.d.ts +11 -0
- package/dist/packages/tools/dist/executor.d.ts.map +1 -0
- package/dist/packages/tools/dist/executor.js +36 -0
- package/dist/packages/tools/dist/executor.js.map +1 -0
- package/dist/packages/tools/dist/index.d.ts +7 -0
- package/dist/packages/tools/dist/index.d.ts.map +1 -0
- package/dist/packages/tools/dist/index.js +6 -0
- package/dist/packages/tools/dist/index.js.map +1 -0
- package/dist/packages/tools/dist/permission.d.ts +17 -0
- package/dist/packages/tools/dist/permission.d.ts.map +1 -0
- package/dist/packages/tools/dist/permission.js +74 -0
- package/dist/packages/tools/dist/permission.js.map +1 -0
- package/dist/packages/tools/dist/registry.d.ts +13 -0
- package/dist/packages/tools/dist/registry.d.ts.map +1 -0
- package/dist/packages/tools/dist/registry.js +34 -0
- package/dist/packages/tools/dist/registry.js.map +1 -0
- package/dist/packages/tools/dist/types.d.ts +28 -0
- package/dist/packages/tools/dist/types.d.ts.map +1 -0
- package/dist/packages/tools/dist/types.js +16 -0
- package/dist/packages/tools/dist/types.js.map +1 -0
- package/package.json +47 -0
- 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('');
|