@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.
Files changed (118) hide show
  1. package/README.md +57 -164
  2. package/dist/agents/SubagentLoader.d.ts +59 -0
  3. package/dist/agents/SubagentLoader.d.ts.map +1 -0
  4. package/dist/agents/SubagentLoader.js +140 -0
  5. package/dist/agents/SubagentLoader.js.map +1 -0
  6. package/dist/agents/SubagentRunner.d.ts +15 -0
  7. package/dist/agents/SubagentRunner.d.ts.map +1 -0
  8. package/dist/agents/SubagentRunner.js +116 -0
  9. package/dist/agents/SubagentRunner.js.map +1 -0
  10. package/dist/cli/index.d.ts.map +1 -1
  11. package/dist/cli/index.js +0 -9
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/commands/slash/config.d.ts.map +1 -1
  14. package/dist/commands/slash/config.js +15 -0
  15. package/dist/commands/slash/config.js.map +1 -1
  16. package/dist/commands/slash/context.d.ts.map +1 -1
  17. package/dist/commands/slash/context.js +31 -0
  18. package/dist/commands/slash/context.js.map +1 -1
  19. package/dist/commands/slash/core.js +4 -4
  20. package/dist/commands/slash/core.js.map +1 -1
  21. package/dist/commands/slash/registry.d.ts.map +1 -1
  22. package/dist/commands/slash/registry.js +2 -0
  23. package/dist/commands/slash/registry.js.map +1 -1
  24. package/dist/commands/slash/session.d.ts.map +1 -1
  25. package/dist/commands/slash/session.js +97 -44
  26. package/dist/commands/slash/session.js.map +1 -1
  27. package/dist/commands/slash/snapshot.d.ts +3 -0
  28. package/dist/commands/slash/snapshot.d.ts.map +1 -0
  29. package/dist/commands/slash/snapshot.js +144 -0
  30. package/dist/commands/slash/snapshot.js.map +1 -0
  31. package/dist/config/SettingsManager.d.ts +2 -0
  32. package/dist/config/SettingsManager.d.ts.map +1 -1
  33. package/dist/config/SettingsManager.js +7 -0
  34. package/dist/config/SettingsManager.js.map +1 -1
  35. package/dist/core/CoWorkerAgent.d.ts +32 -0
  36. package/dist/core/CoWorkerAgent.d.ts.map +1 -1
  37. package/dist/core/CoWorkerAgent.js +446 -74
  38. package/dist/core/CoWorkerAgent.js.map +1 -1
  39. package/dist/hooks/HookEngine.d.ts +115 -0
  40. package/dist/hooks/HookEngine.d.ts.map +1 -0
  41. package/dist/hooks/HookEngine.js +220 -0
  42. package/dist/hooks/HookEngine.js.map +1 -0
  43. package/dist/memory/AutoMemory.d.ts +55 -0
  44. package/dist/memory/AutoMemory.d.ts.map +1 -0
  45. package/dist/memory/AutoMemory.js +185 -0
  46. package/dist/memory/AutoMemory.js.map +1 -0
  47. package/dist/permissions/PermissionInterceptor.d.ts +55 -7
  48. package/dist/permissions/PermissionInterceptor.d.ts.map +1 -1
  49. package/dist/permissions/PermissionInterceptor.js +170 -22
  50. package/dist/permissions/PermissionInterceptor.js.map +1 -1
  51. package/dist/scripts/check-playwright-paths.d.ts +2 -0
  52. package/dist/scripts/check-playwright-paths.d.ts.map +1 -0
  53. package/dist/scripts/check-playwright-paths.js +23 -0
  54. package/dist/scripts/check-playwright-paths.js.map +1 -0
  55. package/dist/scripts/check-require-resolve.d.ts +2 -0
  56. package/dist/scripts/check-require-resolve.d.ts.map +1 -0
  57. package/dist/scripts/check-require-resolve.js +19 -0
  58. package/dist/scripts/check-require-resolve.js.map +1 -0
  59. package/dist/scripts/test-sylix.d.ts +2 -0
  60. package/dist/scripts/test-sylix.d.ts.map +1 -0
  61. package/dist/scripts/test-sylix.js +80 -0
  62. package/dist/scripts/test-sylix.js.map +1 -0
  63. package/dist/services/BrowserService.d.ts +1 -0
  64. package/dist/services/BrowserService.d.ts.map +1 -1
  65. package/dist/services/BrowserService.js +4 -2
  66. package/dist/services/BrowserService.js.map +1 -1
  67. package/dist/services/browser/sandbox/playwright-internals.d.ts.map +1 -1
  68. package/dist/services/browser/sandbox/playwright-internals.js +20 -0
  69. package/dist/services/browser/sandbox/playwright-internals.js.map +1 -1
  70. package/dist/services/browser/sandbox/quickjs-sandbox.d.ts +1 -0
  71. package/dist/services/browser/sandbox/quickjs-sandbox.d.ts.map +1 -1
  72. package/dist/services/browser/sandbox/quickjs-sandbox.js +12 -3
  73. package/dist/services/browser/sandbox/quickjs-sandbox.js.map +1 -1
  74. package/dist/services/browser/sandbox/script-runner-quickjs.d.ts +4 -1
  75. package/dist/services/browser/sandbox/script-runner-quickjs.d.ts.map +1 -1
  76. package/dist/services/browser/sandbox/script-runner-quickjs.js +3 -0
  77. package/dist/services/browser/sandbox/script-runner-quickjs.js.map +1 -1
  78. package/dist/session/SessionManager.d.ts +53 -10
  79. package/dist/session/SessionManager.d.ts.map +1 -1
  80. package/dist/session/SessionManager.js +127 -55
  81. package/dist/session/SessionManager.js.map +1 -1
  82. package/dist/session/db.d.ts +81 -0
  83. package/dist/session/db.d.ts.map +1 -0
  84. package/dist/session/db.js +268 -0
  85. package/dist/session/db.js.map +1 -0
  86. package/dist/skills/HookAndSkillManager.d.ts +7 -5
  87. package/dist/skills/HookAndSkillManager.d.ts.map +1 -1
  88. package/dist/skills/HookAndSkillManager.js +30 -56
  89. package/dist/skills/HookAndSkillManager.js.map +1 -1
  90. package/dist/snapshot/SnapshotManager.d.ts +94 -0
  91. package/dist/snapshot/SnapshotManager.d.ts.map +1 -0
  92. package/dist/snapshot/SnapshotManager.js +260 -0
  93. package/dist/snapshot/SnapshotManager.js.map +1 -0
  94. package/dist/tools/LSPTool.d.ts +18 -0
  95. package/dist/tools/LSPTool.d.ts.map +1 -0
  96. package/dist/tools/LSPTool.js +137 -0
  97. package/dist/tools/LSPTool.js.map +1 -0
  98. package/dist/tools/NativeTools.d.ts +4 -3
  99. package/dist/tools/NativeTools.d.ts.map +1 -1
  100. package/dist/tools/NativeTools.js +80 -26
  101. package/dist/tools/NativeTools.js.map +1 -1
  102. package/dist/tools/Schemas.d.ts +69 -0
  103. package/dist/tools/Schemas.d.ts.map +1 -1
  104. package/dist/tools/Schemas.js +32 -0
  105. package/dist/tools/Schemas.js.map +1 -1
  106. package/dist/utils/contextManager.d.ts +1 -1
  107. package/dist/utils/contextManager.d.ts.map +1 -1
  108. package/dist/utils/output.d.ts +3 -5
  109. package/dist/utils/output.d.ts.map +1 -1
  110. package/dist/utils/output.js +46 -62
  111. package/dist/utils/output.js.map +1 -1
  112. package/dist/utils/systemPrompt.d.ts.map +1 -1
  113. package/dist/utils/systemPrompt.js +13 -2
  114. package/dist/utils/systemPrompt.js.map +1 -1
  115. package/dist/utils/welcome.d.ts.map +1 -1
  116. package/dist/utils/welcome.js +7 -3
  117. package/dist/utils/welcome.js.map +1 -1
  118. 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
- allowedTools: string[];
4
- deniedTools: string[];
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
- * Actually intercepts execution and uses stdin to prompt the user if running in a TTY.
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
- * Evaluates a tool call. If it requires human interaction, pauses execution
16
- * and yields a CLI prompt request using native readline.
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":"AAEA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;IACtC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8E;gBAE5F,QAAQ,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC;IASlD;;;OAGG;IACU,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;YAwBvE,uBAAuB;CA0BtC"}
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
- * Actually intercepts execution and uses stdin to prompt the user if running in a TTY.
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: 'acceptEdits',
50
+ mode: 'default',
47
51
  allowedTools: [],
48
52
  deniedTools: [],
53
+ rules: {},
49
54
  ...settings,
50
55
  };
51
56
  }
52
57
  /**
53
- * Evaluates a tool call. If it requires human interaction, pauses execution
54
- * and yields a CLI prompt request using native readline.
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
- async intercept(toolName, args) {
57
- if (this.safeTools.includes(toolName) || this.settings.mode === 'auto') {
58
- return true; // Read-only tools bypass prompts
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
- if (this.settings.allowedTools.includes(toolName)) {
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
- if (this.settings.deniedTools.includes(toolName)) {
64
- throw new Error(`Permission Denied: Tool ${toolName} is explicitly blocked.`);
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
- // Trigger interactive IO if not running headlessly
67
- if (process.stdin.isTTY) {
68
- return await this.promptUserForPermission(toolName, args);
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
- else {
71
- // In a headless environment (like Sylix backend), we have no UI.
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
- console.warn(`Arguments:`, JSON.stringify(args, null, 2));
85
- rl.question(`Allow this action? [y/N/a (Always allow)]: `, (answer) => {
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.settings.allowedTools.push(toolName);
90
- console.log(`\x1b[32mTool ${toolName} added to session allowlist.\x1b[0m`);
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;AAQrC;;;GAGG;AACH,MAAa,qBAAqB;IAIhC,YAAY,QAAsC;QAFjC,cAAS,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAGtG,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI,EAAE,aAAa;YACnB,YAAY,EAAE,EAAE;YAChB,WAAW,EAAE,EAAE;YACf,GAAG,QAAQ;SACZ,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,IAAyB;QAChE,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACvE,OAAO,IAAI,CAAC,CAAC,iCAAiC;QAChD,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,yBAAyB,CAAC,CAAC;QAChF,CAAC;QAED,mDAAmD;QACnD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,kEAAkE;YAClE,oGAAoG;YACpG,OAAO,CAAC,IAAI,CAAC,2BAA2B,QAAQ,6BAA6B,CAAC,CAAC;YAC/E,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,QAAgB,EAAE,IAAyB;QAC/E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;gBAClC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YAEH,OAAO,CAAC,IAAI,CAAC,yDAAyD,QAAQ,SAAS,CAAC,CAAC;YACzF,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAE1D,EAAE,CAAC,QAAQ,CAAC,6CAA6C,EAAE,CAAC,MAAM,EAAE,EAAE;gBACpE,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAE7C,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;oBACrB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC1C,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,qCAAqC,CAAC,CAAC;oBAC3E,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;qBAAM,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;oBAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAnED,sDAmEC"}
1
+ {"version":3,"file":"PermissionInterceptor.js","sourceRoot":"","sources":["../../src/permissions/PermissionInterceptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=check-playwright-paths.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=check-require-resolve.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-sylix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-sylix.d.ts","sourceRoot":"","sources":["../../src/scripts/test-sylix.ts"],"names":[],"mappings":""}