@sylix/coworker 1.1.4 → 1.2.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/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +183 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/SettingsManager.d.ts +25 -0
- package/dist/config/SettingsManager.d.ts.map +1 -0
- package/dist/config/SettingsManager.js +96 -0
- package/dist/config/SettingsManager.js.map +1 -0
- package/dist/core/CoWorkerAgent.d.ts +52 -0
- package/dist/core/CoWorkerAgent.d.ts.map +1 -0
- package/dist/core/CoWorkerAgent.js +308 -0
- package/dist/core/CoWorkerAgent.js.map +1 -0
- package/dist/mcp/MCPClientManager.d.ts +30 -0
- package/dist/mcp/MCPClientManager.d.ts.map +1 -0
- package/dist/mcp/MCPClientManager.js +100 -0
- package/dist/mcp/MCPClientManager.js.map +1 -0
- package/dist/permissions/PermissionInterceptor.d.ts +21 -0
- package/dist/permissions/PermissionInterceptor.d.ts.map +1 -0
- package/dist/permissions/PermissionInterceptor.js +104 -0
- package/dist/permissions/PermissionInterceptor.js.map +1 -0
- package/dist/session/SessionManager.d.ts +38 -0
- package/dist/session/SessionManager.d.ts.map +1 -0
- package/dist/session/SessionManager.js +129 -0
- package/dist/session/SessionManager.js.map +1 -0
- package/dist/skills/HookAndSkillManager.d.ts +37 -0
- package/dist/skills/HookAndSkillManager.d.ts.map +1 -0
- package/dist/skills/HookAndSkillManager.js +141 -0
- package/dist/skills/HookAndSkillManager.js.map +1 -0
- package/dist/task/TaskEngine.d.ts +29 -0
- package/dist/task/TaskEngine.d.ts.map +1 -0
- package/dist/task/TaskEngine.js +117 -0
- package/dist/task/TaskEngine.js.map +1 -0
- package/dist/tools/CronManager.d.ts +22 -0
- package/dist/tools/CronManager.d.ts.map +1 -0
- package/dist/tools/CronManager.js +44 -0
- package/dist/tools/CronManager.js.map +1 -0
- package/dist/tools/NativeTools.d.ts +33 -0
- package/dist/tools/NativeTools.d.ts.map +1 -0
- package/dist/tools/NativeTools.js +175 -0
- package/dist/tools/NativeTools.js.map +1 -0
- package/dist/tools/Schemas.d.ts +365 -0
- package/dist/tools/Schemas.d.ts.map +1 -0
- package/dist/tools/Schemas.js +177 -0
- package/dist/tools/Schemas.js.map +1 -0
- package/dist/ui/InkUI.d.ts +2 -0
- package/dist/ui/InkUI.d.ts.map +1 -0
- package/dist/ui/InkUI.js +11 -0
- package/dist/ui/InkUI.js.map +1 -0
- package/package.json +18 -8
- package/dist/agents/runner.d.ts +0 -19
- package/dist/agents/runner.d.ts.map +0 -1
- package/dist/agents/runner.js +0 -170
- package/dist/agents/runner.js.map +0 -1
- package/dist/api/sylix.d.ts +0 -53
- package/dist/api/sylix.d.ts.map +0 -1
- package/dist/api/sylix.js +0 -237
- package/dist/api/sylix.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -369
- package/dist/cli.js.map +0 -1
- package/dist/commands/ask.d.ts +0 -2
- package/dist/commands/ask.d.ts.map +0 -1
- package/dist/commands/ask.js +0 -55
- package/dist/commands/ask.js.map +0 -1
- package/dist/commands/chat.d.ts +0 -8
- package/dist/commands/chat.d.ts.map +0 -1
- package/dist/commands/chat.js +0 -479
- package/dist/commands/chat.js.map +0 -1
- package/dist/commands/commit.d.ts +0 -2
- package/dist/commands/commit.d.ts.map +0 -1
- package/dist/commands/commit.js +0 -163
- package/dist/commands/commit.js.map +0 -1
- package/dist/commands/config.d.ts +0 -3
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -101
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/edit.d.ts +0 -2
- package/dist/commands/edit.d.ts.map +0 -1
- package/dist/commands/edit.js +0 -112
- package/dist/commands/edit.js.map +0 -1
- package/dist/commands/explain.d.ts +0 -2
- package/dist/commands/explain.d.ts.map +0 -1
- package/dist/commands/explain.js +0 -99
- package/dist/commands/explain.js.map +0 -1
- package/dist/commands/login.d.ts +0 -2
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/login.js +0 -151
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/review.d.ts +0 -2
- package/dist/commands/review.d.ts.map +0 -1
- package/dist/commands/review.js +0 -137
- package/dist/commands/review.js.map +0 -1
- package/dist/commands/run.d.ts +0 -2
- package/dist/commands/run.d.ts.map +0 -1
- package/dist/commands/run.js +0 -136
- package/dist/commands/run.js.map +0 -1
- package/dist/config/settings.d.ts +0 -33
- package/dist/config/settings.d.ts.map +0 -1
- package/dist/config/settings.js +0 -72
- package/dist/config/settings.js.map +0 -1
- package/dist/context/reader.d.ts +0 -24
- package/dist/context/reader.d.ts.map +0 -1
- package/dist/context/reader.js +0 -209
- package/dist/context/reader.js.map +0 -1
- package/dist/hooks/engine.d.ts +0 -9
- package/dist/hooks/engine.d.ts.map +0 -1
- package/dist/hooks/engine.js +0 -85
- package/dist/hooks/engine.js.map +0 -1
- package/dist/mcp/client.d.ts +0 -15
- package/dist/mcp/client.d.ts.map +0 -1
- package/dist/mcp/client.js +0 -211
- package/dist/mcp/client.js.map +0 -1
- package/dist/mcp/transport.d.ts +0 -46
- package/dist/mcp/transport.d.ts.map +0 -1
- package/dist/mcp/transport.js +0 -196
- package/dist/mcp/transport.js.map +0 -1
- package/dist/memory/loader.d.ts +0 -41
- package/dist/memory/loader.d.ts.map +0 -1
- package/dist/memory/loader.js +0 -249
- package/dist/memory/loader.js.map +0 -1
- package/dist/permissions/manager.d.ts +0 -7
- package/dist/permissions/manager.d.ts.map +0 -1
- package/dist/permissions/manager.js +0 -125
- package/dist/permissions/manager.js.map +0 -1
- package/dist/scripts/postinstall.d.ts +0 -7
- package/dist/scripts/postinstall.d.ts.map +0 -1
- package/dist/scripts/postinstall.js +0 -23
- package/dist/scripts/postinstall.js.map +0 -1
- package/dist/session/memory.d.ts +0 -6
- package/dist/session/memory.d.ts.map +0 -1
- package/dist/session/memory.js +0 -81
- package/dist/session/memory.js.map +0 -1
- package/dist/session/store.d.ts +0 -19
- package/dist/session/store.d.ts.map +0 -1
- package/dist/session/store.js +0 -94
- package/dist/session/store.js.map +0 -1
- package/dist/tools/bash.d.ts +0 -2
- package/dist/tools/bash.d.ts.map +0 -1
- package/dist/tools/bash.js +0 -40
- package/dist/tools/bash.js.map +0 -1
- package/dist/tools/chrome.d.ts +0 -10
- package/dist/tools/chrome.d.ts.map +0 -1
- package/dist/tools/chrome.js +0 -228
- package/dist/tools/chrome.js.map +0 -1
- package/dist/tools/edit.d.ts +0 -2
- package/dist/tools/edit.d.ts.map +0 -1
- package/dist/tools/edit.js +0 -67
- package/dist/tools/edit.js.map +0 -1
- package/dist/tools/glob.d.ts +0 -10
- package/dist/tools/glob.d.ts.map +0 -1
- package/dist/tools/glob.js +0 -245
- package/dist/tools/glob.js.map +0 -1
- package/dist/tools/grep.d.ts +0 -10
- package/dist/tools/grep.d.ts.map +0 -1
- package/dist/tools/grep.js +0 -252
- package/dist/tools/grep.js.map +0 -1
- package/dist/tools/ls.d.ts +0 -2
- package/dist/tools/ls.d.ts.map +0 -1
- package/dist/tools/ls.js +0 -75
- package/dist/tools/ls.js.map +0 -1
- package/dist/tools/read.d.ts +0 -2
- package/dist/tools/read.d.ts.map +0 -1
- package/dist/tools/read.js +0 -72
- package/dist/tools/read.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -3
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -281
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/schema.json +0 -508
- package/dist/tools/task.d.ts +0 -11
- package/dist/tools/task.d.ts.map +0 -1
- package/dist/tools/task.js +0 -118
- package/dist/tools/task.js.map +0 -1
- package/dist/tools/web.d.ts +0 -3
- package/dist/tools/web.d.ts.map +0 -1
- package/dist/tools/web.js +0 -113
- package/dist/tools/web.js.map +0 -1
- package/dist/tools/write.d.ts +0 -18
- package/dist/tools/write.d.ts.map +0 -1
- package/dist/tools/write.js +0 -122
- package/dist/tools/write.js.map +0 -1
- package/dist/utils/output.d.ts +0 -62
- package/dist/utils/output.d.ts.map +0 -1
- package/dist/utils/output.js +0 -487
- package/dist/utils/output.js.map +0 -1
package/dist/mcp/transport.js
DELETED
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.HttpTransport = exports.StdioTransport = exports.MCPTransport = void 0;
|
|
7
|
-
const events_1 = require("events");
|
|
8
|
-
const child_process_1 = require("child_process");
|
|
9
|
-
const http_1 = __importDefault(require("http"));
|
|
10
|
-
const https_1 = __importDefault(require("https"));
|
|
11
|
-
class MCPTransport extends events_1.EventEmitter {
|
|
12
|
-
}
|
|
13
|
-
exports.MCPTransport = MCPTransport;
|
|
14
|
-
// ─── Stdio Transport ───
|
|
15
|
-
// Communicates with MCP server via stdin/stdout of a child process
|
|
16
|
-
class StdioTransport extends MCPTransport {
|
|
17
|
-
constructor(command, args = [], env) {
|
|
18
|
-
super();
|
|
19
|
-
this.command = command;
|
|
20
|
-
this.args = args;
|
|
21
|
-
this.env = env;
|
|
22
|
-
this.process = null;
|
|
23
|
-
this.buffer = '';
|
|
24
|
-
this._connected = false;
|
|
25
|
-
}
|
|
26
|
-
get isConnected() {
|
|
27
|
-
return this._connected;
|
|
28
|
-
}
|
|
29
|
-
async connect() {
|
|
30
|
-
return new Promise((resolve, reject) => {
|
|
31
|
-
try {
|
|
32
|
-
this.process = (0, child_process_1.spawn)(this.command, this.args, {
|
|
33
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
34
|
-
env: { ...process.env, ...this.env },
|
|
35
|
-
shell: process.platform === 'win32'
|
|
36
|
-
});
|
|
37
|
-
this.process.stdout?.on('data', (data) => {
|
|
38
|
-
this.buffer += data.toString();
|
|
39
|
-
this.processBuffer();
|
|
40
|
-
});
|
|
41
|
-
this.process.stderr?.on('data', (data) => {
|
|
42
|
-
if (process.env.COWORKER_DEBUG) {
|
|
43
|
-
console.error(`[MCP stderr] ${data.toString().trim()}`);
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
this.process.on('error', (err) => {
|
|
47
|
-
this._connected = false;
|
|
48
|
-
this.emit('error', err);
|
|
49
|
-
reject(err);
|
|
50
|
-
});
|
|
51
|
-
this.process.on('close', (code) => {
|
|
52
|
-
this._connected = false;
|
|
53
|
-
this.emit('close', code);
|
|
54
|
-
});
|
|
55
|
-
this._connected = true;
|
|
56
|
-
resolve();
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
reject(err);
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
async send(message) {
|
|
64
|
-
if (!this.process?.stdin?.writable) {
|
|
65
|
-
throw new Error('MCP transport not connected');
|
|
66
|
-
}
|
|
67
|
-
const json = JSON.stringify(message);
|
|
68
|
-
const header = `Content-Length: ${Buffer.byteLength(json)}\r\n\r\n`;
|
|
69
|
-
this.process.stdin.write(header + json);
|
|
70
|
-
}
|
|
71
|
-
close() {
|
|
72
|
-
this._connected = false;
|
|
73
|
-
if (this.process) {
|
|
74
|
-
this.process.kill();
|
|
75
|
-
this.process = null;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
processBuffer() {
|
|
79
|
-
// Parse Content-Length delimited JSON-RPC messages
|
|
80
|
-
while (true) {
|
|
81
|
-
const headerEnd = this.buffer.indexOf('\r\n\r\n');
|
|
82
|
-
if (headerEnd === -1)
|
|
83
|
-
break;
|
|
84
|
-
const header = this.buffer.substring(0, headerEnd);
|
|
85
|
-
const lengthMatch = header.match(/Content-Length:\s*(\d+)/i);
|
|
86
|
-
if (!lengthMatch) {
|
|
87
|
-
// Try parsing as raw JSON line
|
|
88
|
-
const lineEnd = this.buffer.indexOf('\n');
|
|
89
|
-
if (lineEnd === -1)
|
|
90
|
-
break;
|
|
91
|
-
const line = this.buffer.substring(0, lineEnd).trim();
|
|
92
|
-
this.buffer = this.buffer.substring(lineEnd + 1);
|
|
93
|
-
if (line) {
|
|
94
|
-
try {
|
|
95
|
-
const msg = JSON.parse(line);
|
|
96
|
-
this.emit('message', msg);
|
|
97
|
-
}
|
|
98
|
-
catch { /* skip */ }
|
|
99
|
-
}
|
|
100
|
-
continue;
|
|
101
|
-
}
|
|
102
|
-
const contentLength = parseInt(lengthMatch[1], 10);
|
|
103
|
-
const contentStart = headerEnd + 4;
|
|
104
|
-
if (this.buffer.length < contentStart + contentLength)
|
|
105
|
-
break;
|
|
106
|
-
const content = this.buffer.substring(contentStart, contentStart + contentLength);
|
|
107
|
-
this.buffer = this.buffer.substring(contentStart + contentLength);
|
|
108
|
-
try {
|
|
109
|
-
const message = JSON.parse(content);
|
|
110
|
-
this.emit('message', message);
|
|
111
|
-
}
|
|
112
|
-
catch { /* skip malformed */ }
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
exports.StdioTransport = StdioTransport;
|
|
117
|
-
// ─── HTTP/SSE Transport ───
|
|
118
|
-
// Connects to an MCP server via HTTP endpoint
|
|
119
|
-
class HttpTransport extends MCPTransport {
|
|
120
|
-
constructor(url, headers = {}) {
|
|
121
|
-
super();
|
|
122
|
-
this.url = url;
|
|
123
|
-
this.headers = headers;
|
|
124
|
-
this._connected = false;
|
|
125
|
-
this.eventSource = null;
|
|
126
|
-
}
|
|
127
|
-
get isConnected() {
|
|
128
|
-
return this._connected;
|
|
129
|
-
}
|
|
130
|
-
async connect() {
|
|
131
|
-
// Test connectivity with a simple request
|
|
132
|
-
try {
|
|
133
|
-
await this.httpRequest('GET', this.url);
|
|
134
|
-
this._connected = true;
|
|
135
|
-
}
|
|
136
|
-
catch (err) {
|
|
137
|
-
throw new Error(`Failed to connect to MCP server at ${this.url}: ${err.message}`);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
async send(message) {
|
|
141
|
-
if (!this._connected) {
|
|
142
|
-
throw new Error('MCP transport not connected');
|
|
143
|
-
}
|
|
144
|
-
try {
|
|
145
|
-
const responseText = await this.httpRequest('POST', this.url, message);
|
|
146
|
-
if (responseText) {
|
|
147
|
-
try {
|
|
148
|
-
const response = JSON.parse(responseText);
|
|
149
|
-
this.emit('message', response);
|
|
150
|
-
}
|
|
151
|
-
catch { /* skip */ }
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
catch (err) {
|
|
155
|
-
this.emit('error', err);
|
|
156
|
-
throw err;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
close() {
|
|
160
|
-
this._connected = false;
|
|
161
|
-
if (this.eventSource) {
|
|
162
|
-
this.eventSource.close();
|
|
163
|
-
this.eventSource = null;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
httpRequest(method, url, body) {
|
|
167
|
-
return new Promise((resolve, reject) => {
|
|
168
|
-
const parsedUrl = new URL(url);
|
|
169
|
-
const lib = parsedUrl.protocol === 'https:' ? https_1.default : http_1.default;
|
|
170
|
-
const options = {
|
|
171
|
-
hostname: parsedUrl.hostname,
|
|
172
|
-
port: parsedUrl.port,
|
|
173
|
-
path: parsedUrl.pathname + parsedUrl.search,
|
|
174
|
-
method,
|
|
175
|
-
headers: {
|
|
176
|
-
'Content-Type': 'application/json',
|
|
177
|
-
'User-Agent': 'CoWorker-MCP/1.0',
|
|
178
|
-
...this.headers
|
|
179
|
-
}
|
|
180
|
-
};
|
|
181
|
-
const req = lib.request(options, (res) => {
|
|
182
|
-
let data = '';
|
|
183
|
-
res.on('data', (chunk) => { data += chunk; });
|
|
184
|
-
res.on('end', () => resolve(data));
|
|
185
|
-
});
|
|
186
|
-
req.on('error', reject);
|
|
187
|
-
req.setTimeout(15000, () => { req.destroy(); reject(new Error('Request timed out')); });
|
|
188
|
-
if (body) {
|
|
189
|
-
req.write(JSON.stringify(body));
|
|
190
|
-
}
|
|
191
|
-
req.end();
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
exports.HttpTransport = HttpTransport;
|
|
196
|
-
//# sourceMappingURL=transport.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/mcp/transport.ts"],"names":[],"mappings":"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"}
|
package/dist/memory/loader.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CoWorker Memory System
|
|
3
|
-
*
|
|
4
|
-
* Mimics Claude Code's CLAUDE.md multi-level memory hierarchy.
|
|
5
|
-
*
|
|
6
|
-
* Memory is loaded in this priority order (later overrides earlier):
|
|
7
|
-
* 1. Global user memory: ~/.coworker/COWORKER.md
|
|
8
|
-
* 2. Project memory: <cwd>/COWORKER.md or <cwd>/.coworker/COWORKER.md
|
|
9
|
-
* 3. Rules directory: <cwd>/.coworker/rules/*.md (modular rules files)
|
|
10
|
-
* 4. Auto-memory index: ~/.coworker/projects/<project>/memory/MEMORY.md
|
|
11
|
-
* 5. Auto-memory details: ~/.coworker/projects/<project>/memory/*.md
|
|
12
|
-
*/
|
|
13
|
-
export interface MemoryContext {
|
|
14
|
-
global?: string;
|
|
15
|
-
project?: string;
|
|
16
|
-
rules: string[];
|
|
17
|
-
autoMemory?: string;
|
|
18
|
-
autoMemoryDetails: string[];
|
|
19
|
-
}
|
|
20
|
-
export interface AutoMemoryEntry {
|
|
21
|
-
key: string;
|
|
22
|
-
content: string;
|
|
23
|
-
updatedAt: string;
|
|
24
|
-
}
|
|
25
|
-
declare function getAutoMemoryDir(cwd?: string): string;
|
|
26
|
-
/**
|
|
27
|
-
* Load all COWORKER.md memory files in the correct priority chain.
|
|
28
|
-
*/
|
|
29
|
-
export declare function loadMemory(cwd?: string): Promise<MemoryContext>;
|
|
30
|
-
/**
|
|
31
|
-
* Build the system prompt injection string from a loaded MemoryContext.
|
|
32
|
-
*/
|
|
33
|
-
export declare function buildMemorySystemPrompt(ctx: MemoryContext): string;
|
|
34
|
-
/**
|
|
35
|
-
* Write a new memory entry to the auto-memory store.
|
|
36
|
-
* CoWorker AI will call this after conversation to save learnings.
|
|
37
|
-
*/
|
|
38
|
-
export declare function writeAutoMemory(key: string, content: string, cwd?: string): Promise<void>;
|
|
39
|
-
export declare function showMemory(cwd?: string): Promise<void>;
|
|
40
|
-
export { getAutoMemoryDir };
|
|
41
|
-
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/memory/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD,iBAAS,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9C;AAwCD;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkEpF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAoBlE;AAID;;;GAGG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAwBf;AAID,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC3E;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
package/dist/memory/loader.js
DELETED
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* CoWorker Memory System
|
|
4
|
-
*
|
|
5
|
-
* Mimics Claude Code's CLAUDE.md multi-level memory hierarchy.
|
|
6
|
-
*
|
|
7
|
-
* Memory is loaded in this priority order (later overrides earlier):
|
|
8
|
-
* 1. Global user memory: ~/.coworker/COWORKER.md
|
|
9
|
-
* 2. Project memory: <cwd>/COWORKER.md or <cwd>/.coworker/COWORKER.md
|
|
10
|
-
* 3. Rules directory: <cwd>/.coworker/rules/*.md (modular rules files)
|
|
11
|
-
* 4. Auto-memory index: ~/.coworker/projects/<project>/memory/MEMORY.md
|
|
12
|
-
* 5. Auto-memory details: ~/.coworker/projects/<project>/memory/*.md
|
|
13
|
-
*/
|
|
14
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
-
if (k2 === undefined) k2 = k;
|
|
16
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
-
}
|
|
20
|
-
Object.defineProperty(o, k2, desc);
|
|
21
|
-
}) : (function(o, m, k, k2) {
|
|
22
|
-
if (k2 === undefined) k2 = k;
|
|
23
|
-
o[k2] = m[k];
|
|
24
|
-
}));
|
|
25
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
-
}) : function(o, v) {
|
|
28
|
-
o["default"] = v;
|
|
29
|
-
});
|
|
30
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
-
var ownKeys = function(o) {
|
|
32
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
-
var ar = [];
|
|
34
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
-
return ar;
|
|
36
|
-
};
|
|
37
|
-
return ownKeys(o);
|
|
38
|
-
};
|
|
39
|
-
return function (mod) {
|
|
40
|
-
if (mod && mod.__esModule) return mod;
|
|
41
|
-
var result = {};
|
|
42
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
-
__setModuleDefault(result, mod);
|
|
44
|
-
return result;
|
|
45
|
-
};
|
|
46
|
-
})();
|
|
47
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
exports.loadMemory = loadMemory;
|
|
49
|
-
exports.buildMemorySystemPrompt = buildMemorySystemPrompt;
|
|
50
|
-
exports.writeAutoMemory = writeAutoMemory;
|
|
51
|
-
exports.showMemory = showMemory;
|
|
52
|
-
exports.getAutoMemoryDir = getAutoMemoryDir;
|
|
53
|
-
const fs = __importStar(require("fs-extra"));
|
|
54
|
-
const path = __importStar(require("path"));
|
|
55
|
-
const os = __importStar(require("os"));
|
|
56
|
-
const crypto = __importStar(require("crypto"));
|
|
57
|
-
const COWORKER_DIR = path.join(os.homedir(), '.coworker');
|
|
58
|
-
// ── Project ID Hash ────────────────────────────────────────────────────────
|
|
59
|
-
function getProjectId(cwd = process.cwd()) {
|
|
60
|
-
return crypto.createHash('md5').update(cwd).digest('hex').substring(0, 12);
|
|
61
|
-
}
|
|
62
|
-
function getAutoMemoryDir(cwd) {
|
|
63
|
-
const projectId = getProjectId(cwd);
|
|
64
|
-
return path.join(COWORKER_DIR, 'projects', projectId, 'memory');
|
|
65
|
-
}
|
|
66
|
-
// ── COWORKER.md Loader ─────────────────────────────────────────────────────
|
|
67
|
-
async function readFileIfExists(filePath) {
|
|
68
|
-
try {
|
|
69
|
-
if (await fs.pathExists(filePath)) {
|
|
70
|
-
const content = await fs.readFile(filePath, 'utf8');
|
|
71
|
-
return content.trim() || null;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
// ignore
|
|
76
|
-
}
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Process @import directives in COWORKER.md files.
|
|
81
|
-
* Syntax: @path/to/file.md or @~/path/relative-to-home
|
|
82
|
-
*/
|
|
83
|
-
async function resolveImports(content, baseDir) {
|
|
84
|
-
const importRegex = /^@(.+)$/gm;
|
|
85
|
-
let result = content;
|
|
86
|
-
let match;
|
|
87
|
-
while ((match = importRegex.exec(content)) !== null) {
|
|
88
|
-
const importPath = match[1].trim();
|
|
89
|
-
const absolutePath = importPath.startsWith('~/')
|
|
90
|
-
? path.join(os.homedir(), importPath.slice(2))
|
|
91
|
-
: path.resolve(baseDir, importPath);
|
|
92
|
-
const importedContent = await readFileIfExists(absolutePath);
|
|
93
|
-
if (importedContent) {
|
|
94
|
-
result = result.replace(match[0], `\n<!-- Imported from ${importPath} -->\n${importedContent}\n`);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return result;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Load all COWORKER.md memory files in the correct priority chain.
|
|
101
|
-
*/
|
|
102
|
-
async function loadMemory(cwd = process.cwd()) {
|
|
103
|
-
const ctx = { rules: [], autoMemoryDetails: [] };
|
|
104
|
-
// 1. Global user memory: ~/.coworker/COWORKER.md
|
|
105
|
-
const globalMemoryPath = path.join(COWORKER_DIR, 'COWORKER.md');
|
|
106
|
-
const globalContent = await readFileIfExists(globalMemoryPath);
|
|
107
|
-
if (globalContent) {
|
|
108
|
-
ctx.global = await resolveImports(globalContent, COWORKER_DIR);
|
|
109
|
-
}
|
|
110
|
-
// 2. Project memory: look for COWORKER.md walking up the directory tree
|
|
111
|
-
let dir = cwd;
|
|
112
|
-
const roots = [];
|
|
113
|
-
while (dir !== path.dirname(dir)) {
|
|
114
|
-
roots.unshift(dir);
|
|
115
|
-
dir = path.dirname(dir);
|
|
116
|
-
}
|
|
117
|
-
let projectContent = null;
|
|
118
|
-
for (const d of roots) {
|
|
119
|
-
const candidates = [
|
|
120
|
-
path.join(d, 'COWORKER.md'),
|
|
121
|
-
path.join(d, '.coworker', 'COWORKER.md'),
|
|
122
|
-
];
|
|
123
|
-
for (const candidate of candidates) {
|
|
124
|
-
const content = await readFileIfExists(candidate);
|
|
125
|
-
if (content) {
|
|
126
|
-
projectContent = await resolveImports(content, path.dirname(candidate));
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
if (projectContent)
|
|
132
|
-
ctx.project = projectContent;
|
|
133
|
-
// 3. Rules directory: <cwd>/.coworker/rules/*.md
|
|
134
|
-
const rulesDir = path.join(cwd, '.coworker', 'rules');
|
|
135
|
-
if (await fs.pathExists(rulesDir)) {
|
|
136
|
-
const ruleFiles = (await fs.readdir(rulesDir))
|
|
137
|
-
.filter(f => f.endsWith('.md'))
|
|
138
|
-
.sort(); // deterministic order
|
|
139
|
-
for (const ruleFile of ruleFiles) {
|
|
140
|
-
const ruleContent = await readFileIfExists(path.join(rulesDir, ruleFile));
|
|
141
|
-
if (ruleContent)
|
|
142
|
-
ctx.rules.push(`## Rule: ${ruleFile}\n${ruleContent}`);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
// 4. Auto-memory index: MEMORY.md
|
|
146
|
-
const autoMemDir = getAutoMemoryDir(cwd);
|
|
147
|
-
const memoryIndexPath = path.join(autoMemDir, 'MEMORY.md');
|
|
148
|
-
const autoMemContent = await readFileIfExists(memoryIndexPath);
|
|
149
|
-
if (autoMemContent) {
|
|
150
|
-
ctx.autoMemory = autoMemContent;
|
|
151
|
-
}
|
|
152
|
-
// 5. Auto-memory detail files (everything except MEMORY.md)
|
|
153
|
-
if (await fs.pathExists(autoMemDir)) {
|
|
154
|
-
const detailFiles = (await fs.readdir(autoMemDir))
|
|
155
|
-
.filter(f => f.endsWith('.md') && f !== 'MEMORY.md')
|
|
156
|
-
.sort();
|
|
157
|
-
for (const file of detailFiles) {
|
|
158
|
-
const content = await readFileIfExists(path.join(autoMemDir, file));
|
|
159
|
-
if (content)
|
|
160
|
-
ctx.autoMemoryDetails.push(`## ${file.replace('.md', '')}\n${content}`);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
return ctx;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Build the system prompt injection string from a loaded MemoryContext.
|
|
167
|
-
*/
|
|
168
|
-
function buildMemorySystemPrompt(ctx) {
|
|
169
|
-
const parts = [];
|
|
170
|
-
if (ctx.global) {
|
|
171
|
-
parts.push(`# Global User Instructions\n${ctx.global}`);
|
|
172
|
-
}
|
|
173
|
-
if (ctx.project) {
|
|
174
|
-
parts.push(`# Project Instructions (COWORKER.md)\n${ctx.project}`);
|
|
175
|
-
}
|
|
176
|
-
if (ctx.rules.length > 0) {
|
|
177
|
-
parts.push(`# Project Rules\n${ctx.rules.join('\n\n')}`);
|
|
178
|
-
}
|
|
179
|
-
if (ctx.autoMemory) {
|
|
180
|
-
parts.push(`# Accumulated Memory (auto-learned)\n${ctx.autoMemory}`);
|
|
181
|
-
}
|
|
182
|
-
if (ctx.autoMemoryDetails.length > 0) {
|
|
183
|
-
parts.push(`# Memory Details\n${ctx.autoMemoryDetails.join('\n\n')}`);
|
|
184
|
-
}
|
|
185
|
-
return parts.join('\n\n---\n\n');
|
|
186
|
-
}
|
|
187
|
-
// ── Auto-Memory Writer ─────────────────────────────────────────────────────
|
|
188
|
-
/**
|
|
189
|
-
* Write a new memory entry to the auto-memory store.
|
|
190
|
-
* CoWorker AI will call this after conversation to save learnings.
|
|
191
|
-
*/
|
|
192
|
-
async function writeAutoMemory(key, content, cwd = process.cwd()) {
|
|
193
|
-
const autoMemDir = getAutoMemoryDir(cwd);
|
|
194
|
-
await fs.ensureDir(autoMemDir);
|
|
195
|
-
// Save detail file
|
|
196
|
-
const detailFile = `${key.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`;
|
|
197
|
-
await fs.writeFile(path.join(autoMemDir, detailFile), content, 'utf8');
|
|
198
|
-
// Update the MEMORY.md index with a one-liner about this entry
|
|
199
|
-
const indexPath = path.join(autoMemDir, 'MEMORY.md');
|
|
200
|
-
const existingIndex = (await readFileIfExists(indexPath)) || '# Auto-Memory Index\n\n';
|
|
201
|
-
// Replace or append the entry
|
|
202
|
-
const entryPattern = new RegExp(`^- \\[${key}\\].*$`, 'm');
|
|
203
|
-
const entry = `- [${key}] ${content.split('\n')[0].substring(0, 80)} (updated: ${new Date().toISOString().split('T')[0]})`;
|
|
204
|
-
let newIndex;
|
|
205
|
-
if (entryPattern.test(existingIndex)) {
|
|
206
|
-
newIndex = existingIndex.replace(entryPattern, entry);
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
newIndex = existingIndex.trim() + '\n' + entry;
|
|
210
|
-
}
|
|
211
|
-
await fs.writeFile(indexPath, newIndex, 'utf8');
|
|
212
|
-
}
|
|
213
|
-
// ── /memory slash command helpers ──────────────────────────────────────────
|
|
214
|
-
async function showMemory(cwd = process.cwd()) {
|
|
215
|
-
const { theme } = await Promise.resolve().then(() => __importStar(require('../utils/output')));
|
|
216
|
-
const ctx = await loadMemory(cwd);
|
|
217
|
-
console.log();
|
|
218
|
-
console.log(theme.brand(' CoWorker Memory'));
|
|
219
|
-
console.log();
|
|
220
|
-
if (!ctx.global && !ctx.project && ctx.rules.length === 0 && !ctx.autoMemory) {
|
|
221
|
-
console.log(theme.dim(' No memory loaded. Create a COWORKER.md file in your project to get started.'));
|
|
222
|
-
console.log(theme.dim(' Run /init to scaffold one.'));
|
|
223
|
-
console.log();
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
if (ctx.global) {
|
|
227
|
-
console.log(theme.success(' ✓') + theme.dim(' ~/.coworker/COWORKER.md (global)'));
|
|
228
|
-
}
|
|
229
|
-
if (ctx.project) {
|
|
230
|
-
console.log(theme.success(' ✓') + theme.dim(` ${cwd}/COWORKER.md (project)`));
|
|
231
|
-
}
|
|
232
|
-
ctx.rules.forEach(r => {
|
|
233
|
-
const name = r.match(/## Rule: (.+)/)?.[1] || 'rule';
|
|
234
|
-
console.log(theme.success(' ✓') + theme.dim(` .coworker/rules/${name}`));
|
|
235
|
-
});
|
|
236
|
-
if (ctx.autoMemory) {
|
|
237
|
-
const lineCount = ctx.autoMemory.split('\n').length;
|
|
238
|
-
console.log(theme.success(' ✓') + theme.dim(` Auto-memory (${lineCount} entries)`));
|
|
239
|
-
}
|
|
240
|
-
if (ctx.autoMemoryDetails.length > 0) {
|
|
241
|
-
console.log(theme.success(' ✓') + theme.dim(` ${ctx.autoMemoryDetails.length} auto-memory detail files`));
|
|
242
|
-
}
|
|
243
|
-
console.log();
|
|
244
|
-
console.log(theme.dim(' Tip: Edit ~/.coworker/COWORKER.md for global preferences.'));
|
|
245
|
-
console.log(theme.dim(' Tip: Edit COWORKER.md in your project for project-specific rules.'));
|
|
246
|
-
console.log(theme.dim(' Tip: Add .coworker/rules/*.md for modular rule files.'));
|
|
247
|
-
console.log();
|
|
248
|
-
}
|
|
249
|
-
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/memory/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export type PermissionMode = 'default' | 'plan' | 'acceptEdits' | 'bypass';
|
|
2
|
-
export declare function setPermissionMode(mode: PermissionMode): void;
|
|
3
|
-
export declare function getPermissionMode(): PermissionMode;
|
|
4
|
-
export declare function setSkipPermissions(skip: boolean): void;
|
|
5
|
-
export declare function checkPermission(toolName: string, args: any): Promise<'approve' | 'deny'>;
|
|
6
|
-
export declare function resetPermissions(): void;
|
|
7
|
-
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/permissions/manager.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,CAAC;AAsB3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAE5D;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAElD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAEtD;AAGD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,GACR,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,CAsC7B;AAyDD,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC"}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.setPermissionMode = setPermissionMode;
|
|
7
|
-
exports.getPermissionMode = getPermissionMode;
|
|
8
|
-
exports.setSkipPermissions = setSkipPermissions;
|
|
9
|
-
exports.checkPermission = checkPermission;
|
|
10
|
-
exports.resetPermissions = resetPermissions;
|
|
11
|
-
const readline_1 = __importDefault(require("readline"));
|
|
12
|
-
const output_1 = require("../utils/output");
|
|
13
|
-
// Tool risk classification
|
|
14
|
-
const SAFE_TOOLS = new Set([
|
|
15
|
-
'Read', 'LS', 'Glob', 'Grep', 'ChromeGetUrl', 'ChromeGetDom',
|
|
16
|
-
'ChromeConsole', 'ChromeScreenshot', 'TaskGet', 'TaskList',
|
|
17
|
-
'WebSearch', 'WebFetch', 'EnterPlanMode', 'ExitPlanMode',
|
|
18
|
-
'AskUserQuestion'
|
|
19
|
-
]);
|
|
20
|
-
const DANGEROUS_TOOLS = new Set([
|
|
21
|
-
'Bash', 'Edit', 'Write', 'ChromeNavigate', 'ChromeClick',
|
|
22
|
-
'ChromeFill', 'ChromeEval', 'ChromeClose'
|
|
23
|
-
]);
|
|
24
|
-
// Track session-level "always allow" decisions
|
|
25
|
-
const sessionAllowedTools = new Set();
|
|
26
|
-
const sessionAllowedCommands = new Set();
|
|
27
|
-
let currentMode = 'default';
|
|
28
|
-
let skipAllPermissions = false;
|
|
29
|
-
function setPermissionMode(mode) {
|
|
30
|
-
currentMode = mode;
|
|
31
|
-
}
|
|
32
|
-
function getPermissionMode() {
|
|
33
|
-
return currentMode;
|
|
34
|
-
}
|
|
35
|
-
function setSkipPermissions(skip) {
|
|
36
|
-
skipAllPermissions = skip;
|
|
37
|
-
}
|
|
38
|
-
// Check if a tool requires approval
|
|
39
|
-
async function checkPermission(toolName, args) {
|
|
40
|
-
// Bypass mode — everything approved
|
|
41
|
-
if (skipAllPermissions || currentMode === 'bypass') {
|
|
42
|
-
return 'approve';
|
|
43
|
-
}
|
|
44
|
-
// Plan mode — only safe (read-only) tools allowed
|
|
45
|
-
if (currentMode === 'plan') {
|
|
46
|
-
if (SAFE_TOOLS.has(toolName))
|
|
47
|
-
return 'approve';
|
|
48
|
-
console.log(output_1.theme.warning(` ⚠ ${toolName} blocked — currently in plan mode (read-only)`));
|
|
49
|
-
return 'deny';
|
|
50
|
-
}
|
|
51
|
-
// acceptEdits mode — Edits/Writes auto-approved, Bash still needs approval
|
|
52
|
-
if (currentMode === 'acceptEdits') {
|
|
53
|
-
if (toolName === 'Edit' || toolName === 'Write')
|
|
54
|
-
return 'approve';
|
|
55
|
-
}
|
|
56
|
-
// Safe tools always auto-approved
|
|
57
|
-
if (SAFE_TOOLS.has(toolName)) {
|
|
58
|
-
return 'approve';
|
|
59
|
-
}
|
|
60
|
-
// Session-level allow
|
|
61
|
-
if (sessionAllowedTools.has(toolName)) {
|
|
62
|
-
return 'approve';
|
|
63
|
-
}
|
|
64
|
-
// For Bash, check if the specific command was allowed
|
|
65
|
-
if (toolName === 'Bash' && args?.command) {
|
|
66
|
-
if (sessionAllowedCommands.has(args.command)) {
|
|
67
|
-
return 'approve';
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// ─── Interactive Prompt ───
|
|
71
|
-
return await promptForPermission(toolName, args);
|
|
72
|
-
}
|
|
73
|
-
async function promptForPermission(toolName, args) {
|
|
74
|
-
const argsPreview = toolName === 'Bash'
|
|
75
|
-
? args.command || JSON.stringify(args)
|
|
76
|
-
: JSON.stringify(args).substring(0, 120);
|
|
77
|
-
console.log();
|
|
78
|
-
console.log(output_1.theme.warning(` ╭─ Permission Required ──────────────────────╮`));
|
|
79
|
-
console.log(output_1.theme.warning(` │ `) + output_1.theme.brand(toolName) + output_1.theme.dim(`: ${argsPreview}`));
|
|
80
|
-
console.log(output_1.theme.warning(` ╰─────────────────────────────────────────────╯`));
|
|
81
|
-
console.log();
|
|
82
|
-
console.log(` ${output_1.theme.success('y')} — Yes, allow this once`);
|
|
83
|
-
console.log(` ${output_1.theme.success('a')} — Always allow ${toolName} this session`);
|
|
84
|
-
if (toolName === 'Bash' && args?.command) {
|
|
85
|
-
console.log(` ${output_1.theme.success('c')} — Always allow this exact command`);
|
|
86
|
-
}
|
|
87
|
-
console.log(` ${output_1.theme.error('n')} — Deny`);
|
|
88
|
-
console.log();
|
|
89
|
-
const answer = await askUser('Allow? (y/a/c/n): ');
|
|
90
|
-
const choice = answer.toLowerCase().trim();
|
|
91
|
-
if (choice === 'y' || choice === 'yes') {
|
|
92
|
-
return 'approve';
|
|
93
|
-
}
|
|
94
|
-
if (choice === 'a') {
|
|
95
|
-
sessionAllowedTools.add(toolName);
|
|
96
|
-
console.log(output_1.theme.dim(` ✓ ${toolName} will be auto-approved for this session`));
|
|
97
|
-
return 'approve';
|
|
98
|
-
}
|
|
99
|
-
if (choice === 'c' && toolName === 'Bash' && args?.command) {
|
|
100
|
-
sessionAllowedCommands.add(args.command);
|
|
101
|
-
console.log(output_1.theme.dim(` ✓ Command will be auto-approved for this session`));
|
|
102
|
-
return 'approve';
|
|
103
|
-
}
|
|
104
|
-
return 'deny';
|
|
105
|
-
}
|
|
106
|
-
function askUser(prompt) {
|
|
107
|
-
return new Promise((resolve) => {
|
|
108
|
-
const rl = readline_1.default.createInterface({
|
|
109
|
-
input: process.stdin,
|
|
110
|
-
output: process.stdout
|
|
111
|
-
});
|
|
112
|
-
rl.question(output_1.theme.dim(prompt), (answer) => {
|
|
113
|
-
rl.close();
|
|
114
|
-
resolve(answer);
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
// Reset permissions (for new sessions)
|
|
119
|
-
function resetPermissions() {
|
|
120
|
-
sessionAllowedTools.clear();
|
|
121
|
-
sessionAllowedCommands.clear();
|
|
122
|
-
currentMode = 'default';
|
|
123
|
-
skipAllPermissions = false;
|
|
124
|
-
}
|
|
125
|
-
//# sourceMappingURL=manager.js.map
|