@sylix/coworker 1.5.2 → 2.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/README.md +57 -164
- package/dist/agents/SubagentLoader.d.ts +59 -0
- package/dist/agents/SubagentLoader.d.ts.map +1 -0
- package/dist/agents/SubagentLoader.js +140 -0
- package/dist/agents/SubagentLoader.js.map +1 -0
- package/dist/agents/SubagentRunner.d.ts +15 -0
- package/dist/agents/SubagentRunner.d.ts.map +1 -0
- package/dist/agents/SubagentRunner.js +116 -0
- package/dist/agents/SubagentRunner.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +0 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/slash/config.d.ts.map +1 -1
- package/dist/commands/slash/config.js +15 -0
- package/dist/commands/slash/config.js.map +1 -1
- package/dist/commands/slash/context.d.ts.map +1 -1
- package/dist/commands/slash/context.js +31 -0
- package/dist/commands/slash/context.js.map +1 -1
- package/dist/commands/slash/core.js +4 -4
- package/dist/commands/slash/core.js.map +1 -1
- package/dist/commands/slash/registry.d.ts.map +1 -1
- package/dist/commands/slash/registry.js +2 -0
- package/dist/commands/slash/registry.js.map +1 -1
- package/dist/commands/slash/session.d.ts.map +1 -1
- package/dist/commands/slash/session.js +97 -44
- package/dist/commands/slash/session.js.map +1 -1
- package/dist/commands/slash/snapshot.d.ts +3 -0
- package/dist/commands/slash/snapshot.d.ts.map +1 -0
- package/dist/commands/slash/snapshot.js +144 -0
- package/dist/commands/slash/snapshot.js.map +1 -0
- package/dist/config/SettingsManager.d.ts +2 -0
- package/dist/config/SettingsManager.d.ts.map +1 -1
- package/dist/config/SettingsManager.js +7 -0
- package/dist/config/SettingsManager.js.map +1 -1
- package/dist/core/CoWorkerAgent.d.ts +32 -0
- package/dist/core/CoWorkerAgent.d.ts.map +1 -1
- package/dist/core/CoWorkerAgent.js +446 -74
- package/dist/core/CoWorkerAgent.js.map +1 -1
- package/dist/hooks/HookEngine.d.ts +115 -0
- package/dist/hooks/HookEngine.d.ts.map +1 -0
- package/dist/hooks/HookEngine.js +220 -0
- package/dist/hooks/HookEngine.js.map +1 -0
- package/dist/memory/AutoMemory.d.ts +55 -0
- package/dist/memory/AutoMemory.d.ts.map +1 -0
- package/dist/memory/AutoMemory.js +185 -0
- package/dist/memory/AutoMemory.js.map +1 -0
- package/dist/permissions/PermissionInterceptor.d.ts +55 -7
- package/dist/permissions/PermissionInterceptor.d.ts.map +1 -1
- package/dist/permissions/PermissionInterceptor.js +170 -22
- package/dist/permissions/PermissionInterceptor.js.map +1 -1
- package/dist/scripts/check-playwright-paths.d.ts +2 -0
- package/dist/scripts/check-playwright-paths.d.ts.map +1 -0
- package/dist/scripts/check-playwright-paths.js +23 -0
- package/dist/scripts/check-playwright-paths.js.map +1 -0
- package/dist/scripts/check-require-resolve.d.ts +2 -0
- package/dist/scripts/check-require-resolve.d.ts.map +1 -0
- package/dist/scripts/check-require-resolve.js +19 -0
- package/dist/scripts/check-require-resolve.js.map +1 -0
- package/dist/scripts/test-sylix.d.ts +2 -0
- package/dist/scripts/test-sylix.d.ts.map +1 -0
- package/dist/scripts/test-sylix.js +80 -0
- package/dist/scripts/test-sylix.js.map +1 -0
- package/dist/services/BrowserService.d.ts +1 -0
- package/dist/services/BrowserService.d.ts.map +1 -1
- package/dist/services/BrowserService.js +4 -2
- package/dist/services/BrowserService.js.map +1 -1
- package/dist/services/browser/sandbox/playwright-internals.d.ts.map +1 -1
- package/dist/services/browser/sandbox/playwright-internals.js +20 -0
- package/dist/services/browser/sandbox/playwright-internals.js.map +1 -1
- package/dist/services/browser/sandbox/quickjs-sandbox.d.ts +1 -0
- package/dist/services/browser/sandbox/quickjs-sandbox.d.ts.map +1 -1
- package/dist/services/browser/sandbox/quickjs-sandbox.js +12 -3
- package/dist/services/browser/sandbox/quickjs-sandbox.js.map +1 -1
- package/dist/services/browser/sandbox/script-runner-quickjs.d.ts +4 -1
- package/dist/services/browser/sandbox/script-runner-quickjs.d.ts.map +1 -1
- package/dist/services/browser/sandbox/script-runner-quickjs.js +3 -0
- package/dist/services/browser/sandbox/script-runner-quickjs.js.map +1 -1
- package/dist/session/SessionManager.d.ts +53 -10
- package/dist/session/SessionManager.d.ts.map +1 -1
- package/dist/session/SessionManager.js +127 -55
- package/dist/session/SessionManager.js.map +1 -1
- package/dist/session/db.d.ts +81 -0
- package/dist/session/db.d.ts.map +1 -0
- package/dist/session/db.js +268 -0
- package/dist/session/db.js.map +1 -0
- package/dist/skills/HookAndSkillManager.d.ts +7 -5
- package/dist/skills/HookAndSkillManager.d.ts.map +1 -1
- package/dist/skills/HookAndSkillManager.js +30 -56
- package/dist/skills/HookAndSkillManager.js.map +1 -1
- package/dist/snapshot/SnapshotManager.d.ts +94 -0
- package/dist/snapshot/SnapshotManager.d.ts.map +1 -0
- package/dist/snapshot/SnapshotManager.js +260 -0
- package/dist/snapshot/SnapshotManager.js.map +1 -0
- package/dist/tools/LSPTool.d.ts +18 -0
- package/dist/tools/LSPTool.d.ts.map +1 -0
- package/dist/tools/LSPTool.js +137 -0
- package/dist/tools/LSPTool.js.map +1 -0
- package/dist/tools/NativeTools.d.ts +4 -3
- package/dist/tools/NativeTools.d.ts.map +1 -1
- package/dist/tools/NativeTools.js +80 -26
- package/dist/tools/NativeTools.js.map +1 -1
- package/dist/tools/Schemas.d.ts +69 -0
- package/dist/tools/Schemas.d.ts.map +1 -1
- package/dist/tools/Schemas.js +32 -0
- package/dist/tools/Schemas.js.map +1 -1
- package/dist/utils/contextManager.d.ts +1 -1
- package/dist/utils/contextManager.d.ts.map +1 -1
- package/dist/utils/output.d.ts +3 -5
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +46 -62
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/systemPrompt.d.ts.map +1 -1
- package/dist/utils/systemPrompt.js +13 -2
- package/dist/utils/systemPrompt.js.map +1 -1
- package/dist/utils/welcome.d.ts.map +1 -1
- package/dist/utils/welcome.js +7 -3
- package/dist/utils/welcome.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.AutoMemory = void 0;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const fsSync = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
43
|
+
// AUTO MEMORY — AI-Written Persistent Learnings Across Sessions
|
|
44
|
+
// Modeled after Claude Code's auto-memory system.
|
|
45
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
46
|
+
/**
|
|
47
|
+
* AutoMemory persists AI-learned knowledge across sessions.
|
|
48
|
+
*
|
|
49
|
+
* Storage: ~/.coworker/auto-memory/{worktree-hash}.md
|
|
50
|
+
* Loading: First 200 lines or 25KB are injected into system prompt
|
|
51
|
+
* Writing: Called at session end or when agent explicitly wants to remember
|
|
52
|
+
*
|
|
53
|
+
* Format: Timestamped markdown entries
|
|
54
|
+
* ```
|
|
55
|
+
* ## 2026-03-29
|
|
56
|
+
* - Build command: `npm run build`
|
|
57
|
+
* - Test framework: vitest
|
|
58
|
+
* - Important: The API uses JWT auth, stored in .env
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
class AutoMemory {
|
|
62
|
+
constructor() {
|
|
63
|
+
this.MAX_LOAD_LINES = 200;
|
|
64
|
+
this.MAX_LOAD_BYTES = 25 * 1024; // 25KB
|
|
65
|
+
this.memoryDir = path.join(os.homedir(), '.coworker', 'auto-memory');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Compute a stable hash for the current working tree.
|
|
69
|
+
* Uses git rev-parse if in a git repo, falls back to path hash.
|
|
70
|
+
*/
|
|
71
|
+
getWorktreeHash(cwd) {
|
|
72
|
+
try {
|
|
73
|
+
const gitRoot = (0, child_process_1.execSync)('git rev-parse --show-toplevel', {
|
|
74
|
+
cwd,
|
|
75
|
+
encoding: 'utf8',
|
|
76
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
77
|
+
}).trim();
|
|
78
|
+
// Hash the git root path for a stable identifier
|
|
79
|
+
let h = 0;
|
|
80
|
+
for (const c of gitRoot)
|
|
81
|
+
h = (h * 31 + c.charCodeAt(0)) & 0xffffffff;
|
|
82
|
+
return Math.abs(h).toString(16).padStart(8, '0');
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Not a git repo — hash the CWD
|
|
86
|
+
let h = 0;
|
|
87
|
+
for (const c of cwd)
|
|
88
|
+
h = (h * 31 + c.charCodeAt(0)) & 0xffffffff;
|
|
89
|
+
return Math.abs(h).toString(16).padStart(8, '0');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
getMemoryPath(cwd) {
|
|
93
|
+
return path.join(this.memoryDir, `${this.getWorktreeHash(cwd)}.md`);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Load auto memory for the given CWD.
|
|
97
|
+
* Returns the first 200 lines / 25KB for injection into system prompt.
|
|
98
|
+
*/
|
|
99
|
+
async load(cwd) {
|
|
100
|
+
const memPath = this.getMemoryPath(cwd);
|
|
101
|
+
try {
|
|
102
|
+
const content = await fs.readFile(memPath, 'utf8');
|
|
103
|
+
// Enforce limits
|
|
104
|
+
const lines = content.split('\n');
|
|
105
|
+
const truncatedLines = lines.slice(0, this.MAX_LOAD_LINES);
|
|
106
|
+
let result = truncatedLines.join('\n');
|
|
107
|
+
if (result.length > this.MAX_LOAD_BYTES) {
|
|
108
|
+
result = result.substring(0, this.MAX_LOAD_BYTES) + '\n... (auto-memory truncated)';
|
|
109
|
+
}
|
|
110
|
+
if (lines.length > this.MAX_LOAD_LINES) {
|
|
111
|
+
result += `\n... (${lines.length - this.MAX_LOAD_LINES} more lines in ~/.coworker/auto-memory/)`;
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return ''; // No memory file yet
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Append a new learning entry to auto memory.
|
|
121
|
+
* Called at session end or when the agent wants to "remember" something.
|
|
122
|
+
*/
|
|
123
|
+
async append(cwd, entry) {
|
|
124
|
+
const memPath = this.getMemoryPath(cwd);
|
|
125
|
+
await fs.mkdir(this.memoryDir, { recursive: true });
|
|
126
|
+
const date = new Date().toISOString().split('T')[0];
|
|
127
|
+
const header = `\n## ${date}\n`;
|
|
128
|
+
let existing = '';
|
|
129
|
+
try {
|
|
130
|
+
existing = await fs.readFile(memPath, 'utf8');
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// File doesn't exist yet — start with a header
|
|
134
|
+
existing = `# Auto Memory — CoWorker Learnings\n\nThis file is automatically maintained by CoWorker.\nEdit with \`/memory auto edit\` or clear with \`/memory auto clear\`.\n`;
|
|
135
|
+
}
|
|
136
|
+
// Avoid duplicate date headers
|
|
137
|
+
const formatted = existing.includes(`## ${date}`)
|
|
138
|
+
? `${existing}\n${entry}`
|
|
139
|
+
: `${existing}${header}${entry}`;
|
|
140
|
+
await fs.writeFile(memPath, formatted, 'utf8');
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Clear all auto memory for a working tree.
|
|
144
|
+
*/
|
|
145
|
+
async clear(cwd) {
|
|
146
|
+
const memPath = this.getMemoryPath(cwd);
|
|
147
|
+
try {
|
|
148
|
+
await fs.unlink(memPath);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Already doesn't exist
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get the full path to the memory file (for opening in editor).
|
|
156
|
+
*/
|
|
157
|
+
getPath(cwd) {
|
|
158
|
+
return this.getMemoryPath(cwd);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check if auto memory exists for the given CWD.
|
|
162
|
+
*/
|
|
163
|
+
exists(cwd) {
|
|
164
|
+
return fsSync.existsSync(this.getMemoryPath(cwd));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Extract learnings from a conversation for auto-persistence.
|
|
168
|
+
* This returns a prompt to be sent to the LLM to extract learnings.
|
|
169
|
+
*/
|
|
170
|
+
getExtractionPrompt() {
|
|
171
|
+
return `Extract the key learnings from this conversation that would be useful for future sessions.
|
|
172
|
+
Focus on:
|
|
173
|
+
- Build/test/run commands discovered
|
|
174
|
+
- Architecture patterns and conventions
|
|
175
|
+
- Important file paths and their purposes
|
|
176
|
+
- User preferences and workflow habits
|
|
177
|
+
- Debugging insights and gotchas
|
|
178
|
+
- Technology stack details and quirks
|
|
179
|
+
|
|
180
|
+
Format as a bullet list, max 10 entries. Each entry should be a single concise line.
|
|
181
|
+
Only include genuinely useful, reusable knowledge. Skip trivial things.`;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
exports.AutoMemory = AutoMemory;
|
|
185
|
+
//# sourceMappingURL=AutoMemory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutoMemory.js","sourceRoot":"","sources":["../../src/memory/AutoMemory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission action tiers — match Claude Code's 3-tier system.
|
|
3
|
+
* allow — execute immediately
|
|
4
|
+
* ask — prompt user before executing
|
|
5
|
+
* deny — block execution
|
|
6
|
+
*/
|
|
7
|
+
type PermissionAction = 'allow' | 'ask' | 'deny';
|
|
1
8
|
export interface PermissionSettings {
|
|
2
|
-
mode: 'plan' | 'auto' | 'acceptEdits';
|
|
3
|
-
|
|
4
|
-
|
|
9
|
+
mode: 'plan' | 'auto' | 'acceptEdits' | 'default' | 'explore';
|
|
10
|
+
/** Flat list of allowed tool names (legacy fallback) */
|
|
11
|
+
allowedTools?: string[];
|
|
12
|
+
/** Flat list of denied tool names (legacy fallback) */
|
|
13
|
+
deniedTools?: string[];
|
|
14
|
+
/**
|
|
15
|
+
* Structured rules in Claude Code format:
|
|
16
|
+
* { "Bash(npm run *)": "allow", "Edit(*.env)": "ask" }
|
|
17
|
+
* or nested: { "Bash": { "*": "allow", "git push *": "deny" } }
|
|
18
|
+
*/
|
|
19
|
+
rules?: Record<string, PermissionAction | Record<string, PermissionAction>>;
|
|
5
20
|
}
|
|
6
21
|
/**
|
|
7
|
-
* Phase 1: Security Interceptor.
|
|
8
|
-
*
|
|
22
|
+
* Phase 1: Security Interceptor with glob-based permission rules.
|
|
23
|
+
* Supports: allow | ask | deny per tool+pattern, persistent "always allow",
|
|
24
|
+
* shell-operator awareness for Bash commands, and corrective rejection.
|
|
9
25
|
*/
|
|
10
26
|
export declare class PermissionInterceptor {
|
|
11
27
|
private settings;
|
|
12
28
|
private readonly safeTools;
|
|
29
|
+
private persistentApprovals;
|
|
13
30
|
constructor(settings?: Partial<PermissionSettings>);
|
|
14
31
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
32
|
+
* Parse a rule key like "Edit(*.env)" or "Bash(npm run *)" or "mcp__puppeteer__*".
|
|
33
|
+
* Returns { tool, pattern } or null if the format is invalid.
|
|
34
|
+
*/
|
|
35
|
+
private parseRuleKey;
|
|
36
|
+
/**
|
|
37
|
+
* Check if an argument value matches a glob pattern.
|
|
38
|
+
* Shell-operator-aware: Bash(npm run *) won't match "npm run test && evil"
|
|
39
|
+
* (the && separates word boundaries).
|
|
40
|
+
*/
|
|
41
|
+
private matchesPattern;
|
|
42
|
+
/**
|
|
43
|
+
* Extract the relevant argument value for pattern matching from a tool's args.
|
|
44
|
+
*/
|
|
45
|
+
private extractArgValue;
|
|
46
|
+
/**
|
|
47
|
+
* Evaluate a single rule against tool+args.
|
|
48
|
+
*/
|
|
49
|
+
private ruleMatches;
|
|
50
|
+
/**
|
|
51
|
+
* Resolve the final action for a tool call by checking all applicable rules.
|
|
52
|
+
* Priority: deny > ask > allow (deny always wins)
|
|
53
|
+
*/
|
|
54
|
+
private resolveAction;
|
|
55
|
+
/**
|
|
56
|
+
* Evaluates a tool call. Returns true if allowed, false if denied.
|
|
57
|
+
* May yield a CLI prompt if running in a TTY and the rule is "ask".
|
|
17
58
|
*/
|
|
18
59
|
intercept(toolName: string, args: Record<string, any>): Promise<boolean>;
|
|
60
|
+
/**
|
|
61
|
+
* Grants a "always allow" approval for the remainder of the session.
|
|
62
|
+
* Can be scoped to a specific argument pattern.
|
|
63
|
+
*/
|
|
64
|
+
approveAlways(toolName: string, pattern?: string): void;
|
|
19
65
|
private promptUserForPermission;
|
|
66
|
+
private summarizeArgs;
|
|
20
67
|
}
|
|
68
|
+
export {};
|
|
21
69
|
//# sourceMappingURL=PermissionInterceptor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionInterceptor.d.ts","sourceRoot":"","sources":["../../src/permissions/PermissionInterceptor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PermissionInterceptor.d.ts","sourceRoot":"","sources":["../../src/permissions/PermissionInterceptor.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,KAAK,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AA0BjD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9D,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;CAC7E;AAcD;;;;GAIG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8E;IACxG,OAAO,CAAC,mBAAmB,CAA4B;gBAE3C,QAAQ,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC;IAUlD;;;OAGG;IACH,OAAO,CAAC,YAAY;IAWpB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAoCrB;;;OAGG;IACU,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAsCrF;;;OAGG;IACI,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;YAIhD,uBAAuB;IA6BrC,OAAO,CAAC,aAAa;CAYtB"}
|
|
@@ -35,44 +35,177 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.PermissionInterceptor = void 0;
|
|
37
37
|
const readline = __importStar(require("readline"));
|
|
38
|
+
const chalk = __importStar(require("chalk"));
|
|
39
|
+
const picomatch_1 = require("picomatch");
|
|
38
40
|
/**
|
|
39
|
-
* Phase 1: Security Interceptor.
|
|
40
|
-
*
|
|
41
|
+
* Phase 1: Security Interceptor with glob-based permission rules.
|
|
42
|
+
* Supports: allow | ask | deny per tool+pattern, persistent "always allow",
|
|
43
|
+
* shell-operator awareness for Bash commands, and corrective rejection.
|
|
41
44
|
*/
|
|
42
45
|
class PermissionInterceptor {
|
|
43
46
|
constructor(settings) {
|
|
44
47
|
this.safeTools = ['Read', 'Glob', 'Grep', 'web_search', 'web_fetch', 'ls_dir', 'read_file'];
|
|
48
|
+
this.persistentApprovals = [];
|
|
45
49
|
this.settings = {
|
|
46
|
-
mode: '
|
|
50
|
+
mode: 'default',
|
|
47
51
|
allowedTools: [],
|
|
48
52
|
deniedTools: [],
|
|
53
|
+
rules: {},
|
|
49
54
|
...settings,
|
|
50
55
|
};
|
|
51
56
|
}
|
|
52
57
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
58
|
+
* Parse a rule key like "Edit(*.env)" or "Bash(npm run *)" or "mcp__puppeteer__*".
|
|
59
|
+
* Returns { tool, pattern } or null if the format is invalid.
|
|
55
60
|
*/
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
61
|
+
parseRuleKey(key) {
|
|
62
|
+
const parenOpen = key.indexOf('(');
|
|
63
|
+
const parenClose = key.lastIndexOf(')');
|
|
64
|
+
if (parenOpen !== -1 && parenClose !== -1 && parenClose > parenOpen) {
|
|
65
|
+
const tool = key.slice(0, parenOpen);
|
|
66
|
+
const pattern = key.slice(parenOpen + 1, parenClose);
|
|
67
|
+
return { tool, pattern };
|
|
68
|
+
}
|
|
69
|
+
return { tool: key, pattern: undefined };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if an argument value matches a glob pattern.
|
|
73
|
+
* Shell-operator-aware: Bash(npm run *) won't match "npm run test && evil"
|
|
74
|
+
* (the && separates word boundaries).
|
|
75
|
+
*/
|
|
76
|
+
matchesPattern(value, pattern) {
|
|
77
|
+
if (!pattern || !value)
|
|
78
|
+
return false;
|
|
79
|
+
// Shell-operator awareness: only match the first command segment
|
|
80
|
+
const firstCmd = value.split('&&')[0].split('||')[0].split(';')[0].trim();
|
|
81
|
+
// Word-boundary glob: "npm run *" — the * won't match across spaces in a different way
|
|
82
|
+
if (pattern.endsWith('*') && !pattern.includes(' ')) {
|
|
83
|
+
// Simple prefix glob
|
|
84
|
+
const prefix = pattern.slice(0, -1);
|
|
85
|
+
return firstCmd.startsWith(prefix);
|
|
86
|
+
}
|
|
87
|
+
// Standard picomatch glob
|
|
88
|
+
return (0, picomatch_1.isMatch)(firstCmd, pattern) || (0, picomatch_1.isMatch)(value, pattern);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Extract the relevant argument value for pattern matching from a tool's args.
|
|
92
|
+
*/
|
|
93
|
+
extractArgValue(toolName, args) {
|
|
94
|
+
// Bash commands
|
|
95
|
+
if (toolName === 'Bash' || toolName === 'executeBash') {
|
|
96
|
+
return args.command;
|
|
59
97
|
}
|
|
60
|
-
|
|
98
|
+
// File path tools
|
|
99
|
+
if (['Edit', 'Write', 'Read', 'executeWrite', 'executeRead', 'executeEdit'].includes(toolName)) {
|
|
100
|
+
return args.filePath || args.file_path || args.path;
|
|
101
|
+
}
|
|
102
|
+
// Directory tools
|
|
103
|
+
if (['LS', 'Glob', 'executeLS', 'executeGlob'].includes(toolName)) {
|
|
104
|
+
return args.dirPath || args.dir_path || args.path || args.pattern;
|
|
105
|
+
}
|
|
106
|
+
// Web tools
|
|
107
|
+
if (['WebFetch', 'executeWebFetch'].includes(toolName)) {
|
|
108
|
+
return args.url;
|
|
109
|
+
}
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Evaluate a single rule against tool+args.
|
|
114
|
+
*/
|
|
115
|
+
ruleMatches(rule, toolName, args) {
|
|
116
|
+
if (!(0, picomatch_1.isMatch)(toolName, rule.tool))
|
|
117
|
+
return false;
|
|
118
|
+
if (rule.pattern === undefined)
|
|
61
119
|
return true;
|
|
120
|
+
const value = this.extractArgValue(toolName, args);
|
|
121
|
+
return this.matchesPattern(value, rule.pattern);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Resolve the final action for a tool call by checking all applicable rules.
|
|
125
|
+
* Priority: deny > ask > allow (deny always wins)
|
|
126
|
+
*/
|
|
127
|
+
resolveAction(toolName, args) {
|
|
128
|
+
const rules = this.settings.rules ?? {};
|
|
129
|
+
const toolRules = [];
|
|
130
|
+
// Build flat list of rules from structured config
|
|
131
|
+
for (const [key, value] of Object.entries(rules)) {
|
|
132
|
+
const { tool, pattern } = this.parseRuleKey(key);
|
|
133
|
+
if (!(0, picomatch_1.isMatch)(toolName, tool))
|
|
134
|
+
continue;
|
|
135
|
+
if (typeof value === 'string') {
|
|
136
|
+
toolRules.push({ tool, pattern, action: value });
|
|
137
|
+
}
|
|
138
|
+
else if (typeof value === 'object') {
|
|
139
|
+
for (const [subPattern, subAction] of Object.entries(value)) {
|
|
140
|
+
toolRules.push({ tool, pattern: subPattern === '*' ? undefined : subPattern, action: subAction });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Check persistent approvals first
|
|
145
|
+
for (const approval of this.persistentApprovals) {
|
|
146
|
+
if (!(0, picomatch_1.isMatch)(toolName, approval.tool))
|
|
147
|
+
continue;
|
|
148
|
+
if (approval.pattern === undefined)
|
|
149
|
+
return 'allow';
|
|
150
|
+
const value = this.extractArgValue(toolName, args);
|
|
151
|
+
if (this.matchesPattern(value, approval.pattern))
|
|
152
|
+
return 'allow';
|
|
153
|
+
}
|
|
154
|
+
// Evaluate rules in priority order: deny > ask > allow
|
|
155
|
+
let action = 'allow';
|
|
156
|
+
for (const rule of toolRules) {
|
|
157
|
+
if (!this.ruleMatches(rule, toolName, args))
|
|
158
|
+
continue;
|
|
159
|
+
if (rule.action === 'deny')
|
|
160
|
+
return 'deny';
|
|
161
|
+
if (rule.action === 'ask')
|
|
162
|
+
action = 'ask';
|
|
62
163
|
}
|
|
63
|
-
|
|
64
|
-
|
|
164
|
+
return action;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Evaluates a tool call. Returns true if allowed, false if denied.
|
|
168
|
+
* May yield a CLI prompt if running in a TTY and the rule is "ask".
|
|
169
|
+
*/
|
|
170
|
+
async intercept(toolName, args) {
|
|
171
|
+
// Safe read-only tools always bypass prompts in non-restrictive modes
|
|
172
|
+
if (this.safeTools.includes(toolName) || this.settings.mode === 'auto') {
|
|
173
|
+
return true;
|
|
65
174
|
}
|
|
66
|
-
//
|
|
67
|
-
if (
|
|
68
|
-
|
|
175
|
+
// Plan or Explore mode — read-only, no mutations allowed
|
|
176
|
+
if (this.settings.mode === 'plan' || this.settings.mode === 'explore') {
|
|
177
|
+
const mutationTools = ['Write', 'Edit', 'MultiEdit', 'Bash', 'executeWrite', 'executeEdit', 'executeBash', 'executeMultiEdit'];
|
|
178
|
+
if (mutationTools.includes(toolName)) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
69
182
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
// We must either pass it via WebSocket to the frontend or auto-allow based on strict sandbox logic.
|
|
73
|
-
console.warn(`[WARNING] Auto-allowing ${toolName} due to headless execution.`);
|
|
183
|
+
// Legacy flat allowlist/denylist support
|
|
184
|
+
if (this.settings.allowedTools?.includes(toolName))
|
|
74
185
|
return true;
|
|
186
|
+
if (this.settings.deniedTools?.includes(toolName))
|
|
187
|
+
return false;
|
|
188
|
+
// Resolve structured rule action
|
|
189
|
+
const action = this.resolveAction(toolName, args);
|
|
190
|
+
if (action === 'deny') {
|
|
191
|
+
throw new Error(`Permission Denied: ${toolName} is blocked by policy.`);
|
|
192
|
+
}
|
|
193
|
+
if (action === 'ask') {
|
|
194
|
+
if (process.stdin.isTTY) {
|
|
195
|
+
return await this.promptUserForPermission(toolName, args);
|
|
196
|
+
}
|
|
197
|
+
// Headless — deny by default for ask rules when there's no UI
|
|
198
|
+
console.warn(`[WARNING] Auto-denying ${toolName} (ask rule) in headless mode.`);
|
|
199
|
+
return false;
|
|
75
200
|
}
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Grants a "always allow" approval for the remainder of the session.
|
|
205
|
+
* Can be scoped to a specific argument pattern.
|
|
206
|
+
*/
|
|
207
|
+
approveAlways(toolName, pattern) {
|
|
208
|
+
this.persistentApprovals.push({ tool: toolName, pattern });
|
|
76
209
|
}
|
|
77
210
|
async promptUserForPermission(toolName, args) {
|
|
78
211
|
return new Promise((resolve) => {
|
|
@@ -80,14 +213,17 @@ class PermissionInterceptor {
|
|
|
80
213
|
input: process.stdin,
|
|
81
214
|
output: process.stdout
|
|
82
215
|
});
|
|
216
|
+
const argSummary = this.summarizeArgs(toolName, args);
|
|
83
217
|
console.warn(`\n\x1b[33m[SECURITY ALERT] CoWorker wants to execute: ${toolName}\x1b[0m`);
|
|
84
|
-
|
|
85
|
-
|
|
218
|
+
if (argSummary)
|
|
219
|
+
console.warn(` Target: ${argSummary}`);
|
|
220
|
+
console.warn(` Args: ${JSON.stringify(args).substring(0, 200)}`);
|
|
221
|
+
rl.question(`\x1b[36mAllow this action?\x1b[0m ${chalk.dim('[y/N/a (Always)]')} `, (answer) => {
|
|
86
222
|
rl.close();
|
|
87
223
|
const response = answer.trim().toLowerCase();
|
|
88
224
|
if (response === 'a') {
|
|
89
|
-
this.
|
|
90
|
-
console.log(`\x1b[
|
|
225
|
+
this.approveAlways(toolName);
|
|
226
|
+
console.log(`\x1b[32m✓ Tool ${toolName} added to session allowlist (always).\x1b[0m`);
|
|
91
227
|
resolve(true);
|
|
92
228
|
}
|
|
93
229
|
else if (response === 'y') {
|
|
@@ -99,6 +235,18 @@ class PermissionInterceptor {
|
|
|
99
235
|
});
|
|
100
236
|
});
|
|
101
237
|
}
|
|
238
|
+
summarizeArgs(toolName, args) {
|
|
239
|
+
if (toolName === 'Bash' || toolName === 'executeBash') {
|
|
240
|
+
return args.command?.substring(0, 80);
|
|
241
|
+
}
|
|
242
|
+
if (['Edit', 'Write', 'Read'].includes(toolName)) {
|
|
243
|
+
return args.filePath || args.file_path || args.path;
|
|
244
|
+
}
|
|
245
|
+
if (toolName === 'Glob' || toolName === 'executeGlob') {
|
|
246
|
+
return args.pattern;
|
|
247
|
+
}
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
102
250
|
}
|
|
103
251
|
exports.PermissionInterceptor = PermissionInterceptor;
|
|
104
252
|
//# sourceMappingURL=PermissionInterceptor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionInterceptor.js","sourceRoot":"","sources":["../../src/permissions/PermissionInterceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAqC;
|
|
1
|
+
{"version":3,"file":"PermissionInterceptor.js","sourceRoot":"","sources":["../../src/permissions/PermissionInterceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-playwright-paths.d.ts","sourceRoot":"","sources":["../../src/scripts/check-playwright-paths.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const modulePath = node_path_1.default.join('lib', 'server', 'index.js');
|
|
9
|
+
const currentDir = __dirname;
|
|
10
|
+
console.log('__dirname:', currentDir);
|
|
11
|
+
console.log('process.cwd():', process.cwd());
|
|
12
|
+
const candidates = [
|
|
13
|
+
node_path_1.default.resolve(currentDir, "../../../../node_modules/playwright-core", modulePath),
|
|
14
|
+
node_path_1.default.resolve(currentDir, "../../../node_modules/playwright-core", modulePath),
|
|
15
|
+
node_path_1.default.resolve(currentDir, "../../node_modules/playwright-core", modulePath),
|
|
16
|
+
node_path_1.default.resolve(currentDir, "../node_modules/playwright-core", modulePath),
|
|
17
|
+
node_path_1.default.resolve(currentDir, "node_modules/playwright-core", modulePath),
|
|
18
|
+
node_path_1.default.resolve(process.cwd(), "node_modules/playwright-core", modulePath),
|
|
19
|
+
];
|
|
20
|
+
candidates.forEach((c, i) => {
|
|
21
|
+
console.log(`Candidate ${i}: ${c} - ${(0, node_fs_1.existsSync)(c) ? 'FOUND' : 'NOT FOUND'}`);
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=check-playwright-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-playwright-paths.js","sourceRoot":"","sources":["../../src/scripts/check-playwright-paths.ts"],"names":[],"mappings":";;;;;AACA,0DAA6B;AAC7B,qCAAqC;AAErC,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC1D,MAAM,UAAU,GAAG,SAAS,CAAC;AAE7B,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AACtC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAE7C,MAAM,UAAU,GAAG;IACjB,mBAAI,CAAC,OAAO,CAAC,UAAU,EAAE,0CAA0C,EAAE,UAAU,CAAC;IAChF,mBAAI,CAAC,OAAO,CAAC,UAAU,EAAE,uCAAuC,EAAE,UAAU,CAAC;IAC7E,mBAAI,CAAC,OAAO,CAAC,UAAU,EAAE,oCAAoC,EAAE,UAAU,CAAC;IAC1E,mBAAI,CAAC,OAAO,CAAC,UAAU,EAAE,iCAAiC,EAAE,UAAU,CAAC;IACvE,mBAAI,CAAC,OAAO,CAAC,UAAU,EAAE,8BAA8B,EAAE,UAAU,CAAC;IACpE,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,8BAA8B,EAAE,UAAU,CAAC;CACxE,CAAC;AAEF,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IAC1B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,IAAA,oBAAU,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACjF,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-require-resolve.d.ts","sourceRoot":"","sources":["../../src/scripts/check-require-resolve.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
try {
|
|
9
|
+
const pkgJsonPath = require.resolve('playwright-core/package.json');
|
|
10
|
+
const pkgRoot = node_path_1.default.dirname(pkgJsonPath);
|
|
11
|
+
console.log('playwright-core root:', pkgRoot);
|
|
12
|
+
const internalPath = node_path_1.default.join(pkgRoot, 'lib', 'server', 'index.js');
|
|
13
|
+
console.log('Internal path:', internalPath);
|
|
14
|
+
console.log('Exists:', (0, node_fs_1.existsSync)(internalPath));
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
console.error('require.resolve failed:', e.message);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=check-require-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-require-resolve.js","sourceRoot":"","sources":["../../src/scripts/check-require-resolve.ts"],"names":[],"mappings":";;;;;AACA,0DAA6B;AAC7B,qCAAqC;AAErC,IAAI,CAAC;IACH,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,mBAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAE9C,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAA,oBAAU,EAAC,YAAY,CAAC,CAAC,CAAC;AACnD,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-sylix.d.ts","sourceRoot":"","sources":["../../src/scripts/test-sylix.ts"],"names":[],"mappings":""}
|