@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.
Files changed (186) hide show
  1. package/dist/cli/index.d.ts +7 -0
  2. package/dist/cli/index.d.ts.map +1 -0
  3. package/dist/cli/index.js +183 -0
  4. package/dist/cli/index.js.map +1 -0
  5. package/dist/config/SettingsManager.d.ts +25 -0
  6. package/dist/config/SettingsManager.d.ts.map +1 -0
  7. package/dist/config/SettingsManager.js +96 -0
  8. package/dist/config/SettingsManager.js.map +1 -0
  9. package/dist/core/CoWorkerAgent.d.ts +52 -0
  10. package/dist/core/CoWorkerAgent.d.ts.map +1 -0
  11. package/dist/core/CoWorkerAgent.js +308 -0
  12. package/dist/core/CoWorkerAgent.js.map +1 -0
  13. package/dist/mcp/MCPClientManager.d.ts +30 -0
  14. package/dist/mcp/MCPClientManager.d.ts.map +1 -0
  15. package/dist/mcp/MCPClientManager.js +100 -0
  16. package/dist/mcp/MCPClientManager.js.map +1 -0
  17. package/dist/permissions/PermissionInterceptor.d.ts +21 -0
  18. package/dist/permissions/PermissionInterceptor.d.ts.map +1 -0
  19. package/dist/permissions/PermissionInterceptor.js +104 -0
  20. package/dist/permissions/PermissionInterceptor.js.map +1 -0
  21. package/dist/session/SessionManager.d.ts +38 -0
  22. package/dist/session/SessionManager.d.ts.map +1 -0
  23. package/dist/session/SessionManager.js +129 -0
  24. package/dist/session/SessionManager.js.map +1 -0
  25. package/dist/skills/HookAndSkillManager.d.ts +37 -0
  26. package/dist/skills/HookAndSkillManager.d.ts.map +1 -0
  27. package/dist/skills/HookAndSkillManager.js +141 -0
  28. package/dist/skills/HookAndSkillManager.js.map +1 -0
  29. package/dist/task/TaskEngine.d.ts +29 -0
  30. package/dist/task/TaskEngine.d.ts.map +1 -0
  31. package/dist/task/TaskEngine.js +117 -0
  32. package/dist/task/TaskEngine.js.map +1 -0
  33. package/dist/tools/CronManager.d.ts +22 -0
  34. package/dist/tools/CronManager.d.ts.map +1 -0
  35. package/dist/tools/CronManager.js +44 -0
  36. package/dist/tools/CronManager.js.map +1 -0
  37. package/dist/tools/NativeTools.d.ts +33 -0
  38. package/dist/tools/NativeTools.d.ts.map +1 -0
  39. package/dist/tools/NativeTools.js +175 -0
  40. package/dist/tools/NativeTools.js.map +1 -0
  41. package/dist/tools/Schemas.d.ts +365 -0
  42. package/dist/tools/Schemas.d.ts.map +1 -0
  43. package/dist/tools/Schemas.js +177 -0
  44. package/dist/tools/Schemas.js.map +1 -0
  45. package/dist/ui/InkUI.d.ts +2 -0
  46. package/dist/ui/InkUI.d.ts.map +1 -0
  47. package/dist/ui/InkUI.js +11 -0
  48. package/dist/ui/InkUI.js.map +1 -0
  49. package/package.json +18 -8
  50. package/dist/agents/runner.d.ts +0 -19
  51. package/dist/agents/runner.d.ts.map +0 -1
  52. package/dist/agents/runner.js +0 -170
  53. package/dist/agents/runner.js.map +0 -1
  54. package/dist/api/sylix.d.ts +0 -53
  55. package/dist/api/sylix.d.ts.map +0 -1
  56. package/dist/api/sylix.js +0 -237
  57. package/dist/api/sylix.js.map +0 -1
  58. package/dist/cli.d.ts +0 -3
  59. package/dist/cli.d.ts.map +0 -1
  60. package/dist/cli.js +0 -369
  61. package/dist/cli.js.map +0 -1
  62. package/dist/commands/ask.d.ts +0 -2
  63. package/dist/commands/ask.d.ts.map +0 -1
  64. package/dist/commands/ask.js +0 -55
  65. package/dist/commands/ask.js.map +0 -1
  66. package/dist/commands/chat.d.ts +0 -8
  67. package/dist/commands/chat.d.ts.map +0 -1
  68. package/dist/commands/chat.js +0 -479
  69. package/dist/commands/chat.js.map +0 -1
  70. package/dist/commands/commit.d.ts +0 -2
  71. package/dist/commands/commit.d.ts.map +0 -1
  72. package/dist/commands/commit.js +0 -163
  73. package/dist/commands/commit.js.map +0 -1
  74. package/dist/commands/config.d.ts +0 -3
  75. package/dist/commands/config.d.ts.map +0 -1
  76. package/dist/commands/config.js +0 -101
  77. package/dist/commands/config.js.map +0 -1
  78. package/dist/commands/edit.d.ts +0 -2
  79. package/dist/commands/edit.d.ts.map +0 -1
  80. package/dist/commands/edit.js +0 -112
  81. package/dist/commands/edit.js.map +0 -1
  82. package/dist/commands/explain.d.ts +0 -2
  83. package/dist/commands/explain.d.ts.map +0 -1
  84. package/dist/commands/explain.js +0 -99
  85. package/dist/commands/explain.js.map +0 -1
  86. package/dist/commands/login.d.ts +0 -2
  87. package/dist/commands/login.d.ts.map +0 -1
  88. package/dist/commands/login.js +0 -151
  89. package/dist/commands/login.js.map +0 -1
  90. package/dist/commands/review.d.ts +0 -2
  91. package/dist/commands/review.d.ts.map +0 -1
  92. package/dist/commands/review.js +0 -137
  93. package/dist/commands/review.js.map +0 -1
  94. package/dist/commands/run.d.ts +0 -2
  95. package/dist/commands/run.d.ts.map +0 -1
  96. package/dist/commands/run.js +0 -136
  97. package/dist/commands/run.js.map +0 -1
  98. package/dist/config/settings.d.ts +0 -33
  99. package/dist/config/settings.d.ts.map +0 -1
  100. package/dist/config/settings.js +0 -72
  101. package/dist/config/settings.js.map +0 -1
  102. package/dist/context/reader.d.ts +0 -24
  103. package/dist/context/reader.d.ts.map +0 -1
  104. package/dist/context/reader.js +0 -209
  105. package/dist/context/reader.js.map +0 -1
  106. package/dist/hooks/engine.d.ts +0 -9
  107. package/dist/hooks/engine.d.ts.map +0 -1
  108. package/dist/hooks/engine.js +0 -85
  109. package/dist/hooks/engine.js.map +0 -1
  110. package/dist/mcp/client.d.ts +0 -15
  111. package/dist/mcp/client.d.ts.map +0 -1
  112. package/dist/mcp/client.js +0 -211
  113. package/dist/mcp/client.js.map +0 -1
  114. package/dist/mcp/transport.d.ts +0 -46
  115. package/dist/mcp/transport.d.ts.map +0 -1
  116. package/dist/mcp/transport.js +0 -196
  117. package/dist/mcp/transport.js.map +0 -1
  118. package/dist/memory/loader.d.ts +0 -41
  119. package/dist/memory/loader.d.ts.map +0 -1
  120. package/dist/memory/loader.js +0 -249
  121. package/dist/memory/loader.js.map +0 -1
  122. package/dist/permissions/manager.d.ts +0 -7
  123. package/dist/permissions/manager.d.ts.map +0 -1
  124. package/dist/permissions/manager.js +0 -125
  125. package/dist/permissions/manager.js.map +0 -1
  126. package/dist/scripts/postinstall.d.ts +0 -7
  127. package/dist/scripts/postinstall.d.ts.map +0 -1
  128. package/dist/scripts/postinstall.js +0 -23
  129. package/dist/scripts/postinstall.js.map +0 -1
  130. package/dist/session/memory.d.ts +0 -6
  131. package/dist/session/memory.d.ts.map +0 -1
  132. package/dist/session/memory.js +0 -81
  133. package/dist/session/memory.js.map +0 -1
  134. package/dist/session/store.d.ts +0 -19
  135. package/dist/session/store.d.ts.map +0 -1
  136. package/dist/session/store.js +0 -94
  137. package/dist/session/store.js.map +0 -1
  138. package/dist/tools/bash.d.ts +0 -2
  139. package/dist/tools/bash.d.ts.map +0 -1
  140. package/dist/tools/bash.js +0 -40
  141. package/dist/tools/bash.js.map +0 -1
  142. package/dist/tools/chrome.d.ts +0 -10
  143. package/dist/tools/chrome.d.ts.map +0 -1
  144. package/dist/tools/chrome.js +0 -228
  145. package/dist/tools/chrome.js.map +0 -1
  146. package/dist/tools/edit.d.ts +0 -2
  147. package/dist/tools/edit.d.ts.map +0 -1
  148. package/dist/tools/edit.js +0 -67
  149. package/dist/tools/edit.js.map +0 -1
  150. package/dist/tools/glob.d.ts +0 -10
  151. package/dist/tools/glob.d.ts.map +0 -1
  152. package/dist/tools/glob.js +0 -245
  153. package/dist/tools/glob.js.map +0 -1
  154. package/dist/tools/grep.d.ts +0 -10
  155. package/dist/tools/grep.d.ts.map +0 -1
  156. package/dist/tools/grep.js +0 -252
  157. package/dist/tools/grep.js.map +0 -1
  158. package/dist/tools/ls.d.ts +0 -2
  159. package/dist/tools/ls.d.ts.map +0 -1
  160. package/dist/tools/ls.js +0 -75
  161. package/dist/tools/ls.js.map +0 -1
  162. package/dist/tools/read.d.ts +0 -2
  163. package/dist/tools/read.d.ts.map +0 -1
  164. package/dist/tools/read.js +0 -72
  165. package/dist/tools/read.js.map +0 -1
  166. package/dist/tools/registry.d.ts +0 -3
  167. package/dist/tools/registry.d.ts.map +0 -1
  168. package/dist/tools/registry.js +0 -281
  169. package/dist/tools/registry.js.map +0 -1
  170. package/dist/tools/schema.json +0 -508
  171. package/dist/tools/task.d.ts +0 -11
  172. package/dist/tools/task.d.ts.map +0 -1
  173. package/dist/tools/task.js +0 -118
  174. package/dist/tools/task.js.map +0 -1
  175. package/dist/tools/web.d.ts +0 -3
  176. package/dist/tools/web.d.ts.map +0 -1
  177. package/dist/tools/web.js +0 -113
  178. package/dist/tools/web.js.map +0 -1
  179. package/dist/tools/write.d.ts +0 -18
  180. package/dist/tools/write.d.ts.map +0 -1
  181. package/dist/tools/write.js +0 -122
  182. package/dist/tools/write.js.map +0 -1
  183. package/dist/utils/output.d.ts +0 -62
  184. package/dist/utils/output.d.ts.map +0 -1
  185. package/dist/utils/output.js +0 -487
  186. package/dist/utils/output.js.map +0 -1
@@ -0,0 +1,129 @@
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.SessionManager = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Phase 2 & 4: Session Checkpointing and Token Resuming
41
+ * Fully implemented to write memory snapshots mapped by session ID.
42
+ */
43
+ class SessionManager {
44
+ constructor(sessionId) {
45
+ this.baseDir = '.coworker/sessions';
46
+ this.currentSessionId = sessionId;
47
+ this.state = {
48
+ id: sessionId,
49
+ summary: '',
50
+ messages: [],
51
+ createdAt: new Date().toISOString()
52
+ };
53
+ }
54
+ getSessionFilePath() {
55
+ return path.join(process.cwd(), this.baseDir, `${this.currentSessionId}.json`);
56
+ }
57
+ getCheckpointsDir() {
58
+ return path.join(process.cwd(), this.baseDir, this.currentSessionId, 'checkpoints');
59
+ }
60
+ async loadCheckpoint() {
61
+ try {
62
+ const dbPath = this.getSessionFilePath();
63
+ const content = await fs.readFile(dbPath, 'utf8');
64
+ this.state = JSON.parse(content);
65
+ console.log(`[CoWorker Session] Resumed session: ${this.currentSessionId}`);
66
+ }
67
+ catch {
68
+ console.log(`[CoWorker Session] Started new session: ${this.currentSessionId}`);
69
+ await this.saveCheckpoint();
70
+ }
71
+ }
72
+ async saveCheckpoint() {
73
+ try {
74
+ const dbPath = this.getSessionFilePath();
75
+ await fs.mkdir(path.dirname(dbPath), { recursive: true });
76
+ await fs.writeFile(dbPath, JSON.stringify(this.state, null, 2), 'utf8');
77
+ }
78
+ catch (err) {
79
+ console.error(`[CoWorker Session] Failed to save DB: ${err.message}`);
80
+ }
81
+ }
82
+ /**
83
+ * Pushes a new turn into the context window and automatically triggers token rollup if needed.
84
+ */
85
+ async appendMessage(message) {
86
+ this.state.messages.push(message);
87
+ await this.rollupMemory();
88
+ await this.saveCheckpoint();
89
+ }
90
+ /**
91
+ * Token buffer protection. Roughly estimates 4 chars = 1 token.
92
+ * If > 12000 tokens (approx 48000 chars), we snip the old context and summarize.
93
+ */
94
+ async rollupMemory() {
95
+ const MAX_CHAR_LIMIT = 48000;
96
+ // Very coarse approximation
97
+ const totalChars = this.state.messages.reduce((acc, curr) => acc + curr.content.length, 0);
98
+ if (totalChars > MAX_CHAR_LIMIT) {
99
+ console.log(`[CoWorker Memory] Context threshold exceeded (${totalChars} chars). Triggering rollup compression.`);
100
+ const messagesToKeep = 15; // Keeping the most recent turns unadulterated
101
+ const oldestMessages = this.state.messages.slice(0, this.state.messages.length - messagesToKeep);
102
+ this.state.summary += `\\n[COMPRESSED HISTORY LOG]: The agent achieved multiple back and forth turns. Focus shifted. Previous tokens collapsed.`;
103
+ // We drop the oldest context, preserving system instructions if any.
104
+ const retainedMessages = this.state.messages.slice(-messagesToKeep);
105
+ this.state.messages = retainedMessages;
106
+ await this.saveCheckpoint();
107
+ }
108
+ }
109
+ /**
110
+ * Used for 'Edit' and 'Write' tools to backup a file before mutating it.
111
+ */
112
+ async backupFileBeforeMutation(targetFilePath) {
113
+ try {
114
+ const absoluteTarget = path.resolve(process.cwd(), targetFilePath);
115
+ const content = await fs.readFile(absoluteTarget, 'utf8');
116
+ const checkpointsDir = this.getCheckpointsDir();
117
+ await fs.mkdir(checkpointsDir, { recursive: true });
118
+ const sanitizedName = path.basename(absoluteTarget);
119
+ const backupPath = path.join(checkpointsDir, `${Date.now()}_${sanitizedName}.bak`);
120
+ await fs.writeFile(backupPath, content, 'utf8');
121
+ console.log(`[CoWorker Safety] Checkpointed ${targetFilePath} before mutation.`);
122
+ }
123
+ catch (e) {
124
+ // Silently ignore if file doesn't exist yet (e.g. for creating new files)
125
+ }
126
+ }
127
+ }
128
+ exports.SessionManager = SessionManager;
129
+ //# sourceMappingURL=SessionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export interface Skill {
2
+ name: string;
3
+ description: string;
4
+ systemPromptInjection: string;
5
+ }
6
+ export interface HookRegexCommand {
7
+ matcher: RegExp;
8
+ command: string;
9
+ }
10
+ /**
11
+ * Phase 3: Hooks and Skills.
12
+ * Allows overriding CoWorker dynamically with custom Markdown slash-commands
13
+ * and executing terminal commands automagically during tool lifecycles.
14
+ */
15
+ export declare class HookAndSkillManager {
16
+ private events;
17
+ loadedSkills: Map<string, Skill>;
18
+ preToolHooks: HookRegexCommand[];
19
+ postToolHooks: HookRegexCommand[];
20
+ constructor();
21
+ private registerInternalHooks;
22
+ /**
23
+ * Fired before the main CoWorker agent loop executes an LLM-requested tool.
24
+ */
25
+ firePreToolHook(toolName: string, args: Record<string, any>): Promise<void>;
26
+ /**
27
+ * Fired after the tool completes execution. Enables output masking/summarization by skills.
28
+ */
29
+ firePostToolHook(toolName: string, result: string): Promise<void>;
30
+ /**
31
+ * Reads .coworker/skills/*.md mapping frontmatter to /commands.
32
+ */
33
+ loadSkillsFromDirectory(dirPath?: string): Promise<void>;
34
+ getSkillPrompt(skillName: string): string | null;
35
+ getSlashCommands(): string[];
36
+ }
37
+ //# sourceMappingURL=HookAndSkillManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HookAndSkillManager.d.ts","sourceRoot":"","sources":["../../src/skills/HookAndSkillManager.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAsB;IAC7B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAa;IAC7C,YAAY,EAAE,gBAAgB,EAAE,CAAM;IACtC,aAAa,EAAE,gBAAgB,EAAE,CAAM;;IAM9C,OAAO,CAAC,qBAAqB;IA8B7B;;OAEG;IACU,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxF;;OAEG;IACU,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9E;;OAEG;IACU,uBAAuB,CAAC,OAAO,GAAE,MAAqD,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC5G,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIhD,gBAAgB,IAAI,MAAM,EAAE;CAGpC"}
@@ -0,0 +1,141 @@
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.HookAndSkillManager = void 0;
37
+ const events_1 = require("events");
38
+ const fs = __importStar(require("fs/promises"));
39
+ const path = __importStar(require("path"));
40
+ /**
41
+ * Phase 3: Hooks and Skills.
42
+ * Allows overriding CoWorker dynamically with custom Markdown slash-commands
43
+ * and executing terminal commands automagically during tool lifecycles.
44
+ */
45
+ class HookAndSkillManager {
46
+ constructor() {
47
+ this.events = new events_1.EventEmitter();
48
+ this.loadedSkills = new Map();
49
+ this.preToolHooks = [];
50
+ this.postToolHooks = [];
51
+ this.registerInternalHooks();
52
+ }
53
+ registerInternalHooks() {
54
+ this.events.on('PreToolUse', async (toolName, args, resolve, reject) => {
55
+ const toolSignature = `${toolName}(${JSON.stringify(args)})`;
56
+ for (const hook of this.preToolHooks) {
57
+ if (hook.matcher.test(toolSignature)) {
58
+ console.log(`[Hooks] Triggered PreTool hook for ${toolName}. Executing automation: ${hook.command}`);
59
+ try {
60
+ // In standard node we'd spawn to the shell. We simulate it here.
61
+ // await executeBash(hook.command);
62
+ }
63
+ catch (err) {
64
+ return reject(`Hook automation failed blocking tool execution: ${err.message}`);
65
+ }
66
+ }
67
+ }
68
+ resolve();
69
+ });
70
+ this.events.on('PostToolUse', async (toolName, result, resolve) => {
71
+ console.log(`[Hooks] PostToolUse fired for ${toolName} (output length: ${result.length})`);
72
+ for (const hook of this.postToolHooks) {
73
+ if (hook.matcher.test(toolName)) {
74
+ console.log(`[Hooks] Triggered PostTool hook for ${toolName}. Running: ${hook.command}`);
75
+ }
76
+ }
77
+ resolve();
78
+ });
79
+ }
80
+ /**
81
+ * Fired before the main CoWorker agent loop executes an LLM-requested tool.
82
+ */
83
+ async firePreToolHook(toolName, args) {
84
+ return new Promise((resolve, reject) => {
85
+ this.events.emit('PreToolUse', toolName, args, resolve, reject);
86
+ });
87
+ }
88
+ /**
89
+ * Fired after the tool completes execution. Enables output masking/summarization by skills.
90
+ */
91
+ async firePostToolHook(toolName, result) {
92
+ return new Promise((resolve) => {
93
+ this.events.emit('PostToolUse', toolName, result, resolve);
94
+ });
95
+ }
96
+ /**
97
+ * Reads .coworker/skills/*.md mapping frontmatter to /commands.
98
+ */
99
+ async loadSkillsFromDirectory(dirPath = path.join(process.cwd(), '.coworker/skills')) {
100
+ try {
101
+ const files = await fs.readdir(dirPath);
102
+ for (const file of files) {
103
+ if (!file.endsWith('.md'))
104
+ continue;
105
+ const content = await fs.readFile(path.join(dirPath, file), 'utf8');
106
+ // Very basic YAML frontmatter regex extraction without an external library
107
+ const yamlMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);
108
+ let name = file.replace('.md', '');
109
+ let description = 'Custom loaded user skill';
110
+ let body = content;
111
+ if (yamlMatch) {
112
+ const rawYaml = yamlMatch[1];
113
+ const nameMatch = rawYaml.match(/name:\\s*(.+)/);
114
+ const descMatch = rawYaml.match(/description:\\s*(.+)/);
115
+ if (nameMatch)
116
+ name = nameMatch[1].trim();
117
+ if (descMatch)
118
+ description = descMatch[1].trim();
119
+ body = content.replace(yamlMatch[0], '').trim();
120
+ }
121
+ this.loadedSkills.set(name, {
122
+ name,
123
+ description,
124
+ systemPromptInjection: body
125
+ });
126
+ }
127
+ console.log(`[Skills] Loaded ${this.loadedSkills.size} slash commands.`);
128
+ }
129
+ catch {
130
+ // Directory doesn't exist, which is fine
131
+ }
132
+ }
133
+ getSkillPrompt(skillName) {
134
+ return this.loadedSkills.get(skillName)?.systemPromptInjection || null;
135
+ }
136
+ getSlashCommands() {
137
+ return Array.from(this.loadedSkills.keys()).map(name => `/${name}`);
138
+ }
139
+ }
140
+ exports.HookAndSkillManager = HookAndSkillManager;
141
+ //# sourceMappingURL=HookAndSkillManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HookAndSkillManager.js","sourceRoot":"","sources":["../../src/skills/HookAndSkillManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export type TaskState = 'pending' | 'in_progress' | 'blocked' | 'completed';
2
+ export interface Task {
3
+ id: string;
4
+ description: string;
5
+ state: TaskState;
6
+ dependencies: string[];
7
+ notes: string;
8
+ }
9
+ /**
10
+ * Phase 2: Agentic Autonomy - Task Graph Management.
11
+ * Gives the LLM a persistent notepad to track 10+ step plans across subagents.
12
+ * Now fully persists to disk so CoWorker can resume after shutting down.
13
+ */
14
+ export declare class TaskEngine {
15
+ private tasks;
16
+ private readonly persistenceRelativePath;
17
+ constructor();
18
+ private getActiveDiskPath;
19
+ private loadGraphFromDisk;
20
+ private saveGraphToDisk;
21
+ createTask(description: string, dependencies?: string[]): Promise<string>;
22
+ updateTaskState(id: string, state: TaskState, notes?: string): Promise<void>;
23
+ listTasks(): Task[];
24
+ /**
25
+ * Generates a markdown representation of the task graph to inject into the LLM context wrapper.
26
+ */
27
+ getContextString(): string;
28
+ }
29
+ //# sourceMappingURL=TaskEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskEngine.d.ts","sourceRoot":"","sources":["../../src/task/TaskEngine.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,CAAC;AAE5E,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;;YAMpD,iBAAiB;YAKjB,iBAAiB;YAQjB,eAAe;IAMvB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAO7E,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBlF,SAAS,IAAI,IAAI,EAAE;IAInB;;OAEG;IACH,gBAAgB,IAAI,MAAM;CAa3B"}
@@ -0,0 +1,117 @@
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.TaskEngine = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const crypto_1 = require("crypto");
40
+ /**
41
+ * Phase 2: Agentic Autonomy - Task Graph Management.
42
+ * Gives the LLM a persistent notepad to track 10+ step plans across subagents.
43
+ * Now fully persists to disk so CoWorker can resume after shutting down.
44
+ */
45
+ class TaskEngine {
46
+ constructor() {
47
+ this.tasks = new Map();
48
+ this.persistenceRelativePath = '.coworker/tasks.json';
49
+ this.loadGraphFromDisk().catch(() => { });
50
+ }
51
+ async getActiveDiskPath() {
52
+ const cwd = process.cwd();
53
+ return path.join(cwd, this.persistenceRelativePath);
54
+ }
55
+ async loadGraphFromDisk() {
56
+ const dbPath = await this.getActiveDiskPath();
57
+ const data = await fs.readFile(dbPath, 'utf8');
58
+ const parsed = JSON.parse(data);
59
+ this.tasks.clear();
60
+ parsed.forEach(t => this.tasks.set(t.id, t));
61
+ }
62
+ async saveGraphToDisk() {
63
+ const dbPath = await this.getActiveDiskPath();
64
+ await fs.mkdir(path.dirname(dbPath), { recursive: true });
65
+ await fs.writeFile(dbPath, JSON.stringify(this.listTasks(), null, 2), 'utf8');
66
+ }
67
+ async createTask(description, dependencies = []) {
68
+ const id = `task_${(0, crypto_1.randomUUID)().substring(0, 8)}`;
69
+ this.tasks.set(id, { id, description, state: 'pending', dependencies, notes: '' });
70
+ await this.saveGraphToDisk();
71
+ return id;
72
+ }
73
+ async updateTaskState(id, state, notes) {
74
+ const task = this.tasks.get(id);
75
+ if (!task)
76
+ throw new Error(`Task ${id} not found.`);
77
+ if (state === 'in_progress') {
78
+ // Verify dependencies are met
79
+ const unfinishedDeps = task.dependencies.filter(depId => this.tasks.get(depId)?.state !== 'completed');
80
+ if (unfinishedDeps.length > 0) {
81
+ task.state = 'blocked';
82
+ task.notes = `Blocked by unfinished dependencies: ${unfinishedDeps.join(', ')}`;
83
+ await this.saveGraphToDisk();
84
+ return;
85
+ }
86
+ }
87
+ task.state = state;
88
+ if (notes)
89
+ task.notes = notes;
90
+ await this.saveGraphToDisk();
91
+ }
92
+ listTasks() {
93
+ return Array.from(this.tasks.values());
94
+ }
95
+ /**
96
+ * Generates a markdown representation of the task graph to inject into the LLM context wrapper.
97
+ */
98
+ getContextString() {
99
+ const tasks = this.listTasks();
100
+ if (tasks.length === 0)
101
+ return '';
102
+ let doc = '## ACTIVE TASK LIST\\n';
103
+ tasks.forEach(t => {
104
+ let icon = '[ ]';
105
+ if (t.state === 'in_progress')
106
+ icon = '[>]';
107
+ if (t.state === 'completed')
108
+ icon = '[x]';
109
+ if (t.state === 'blocked')
110
+ icon = '[!]';
111
+ doc += `${icon} ${t.id}: ${t.description} (Deps: ${t.dependencies.join(', ')}) \\n`;
112
+ });
113
+ return doc;
114
+ }
115
+ }
116
+ exports.TaskEngine = TaskEngine;
117
+ //# sourceMappingURL=TaskEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskEngine.js","sourceRoot":"","sources":["../../src/task/TaskEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Phase 4 Parity: Natively allows the agent to schedule recurring tasks or checks.
3
+ */
4
+ export declare class CronManager {
5
+ private jobs;
6
+ /**
7
+ * Creates a recurring interval job.
8
+ */
9
+ createCron(description: string, intervalMinutes: number, callback: () => void): string;
10
+ /**
11
+ * Lists all active scheduled tasks.
12
+ */
13
+ listCrons(): Array<{
14
+ id: string;
15
+ description: string;
16
+ }>;
17
+ /**
18
+ * Deletes a specific scheduled task.
19
+ */
20
+ deleteCron(id: string): boolean;
21
+ }
22
+ //# sourceMappingURL=CronManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CronManager.d.ts","sourceRoot":"","sources":["../../src/tools/CronManager.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAmC;IAE/C;;OAEG;IACI,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM;IAa7F;;OAEG;IACI,SAAS,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAI9D;;OAEG;IACI,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAQvC"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CronManager = void 0;
4
+ const crypto_1 = require("crypto");
5
+ /**
6
+ * Phase 4 Parity: Natively allows the agent to schedule recurring tasks or checks.
7
+ */
8
+ class CronManager {
9
+ constructor() {
10
+ this.jobs = new Map();
11
+ }
12
+ /**
13
+ * Creates a recurring interval job.
14
+ */
15
+ createCron(description, intervalMinutes, callback) {
16
+ const id = (0, crypto_1.randomUUID)();
17
+ const intervalMs = intervalMinutes * 60 * 1000;
18
+ const timer = setInterval(() => {
19
+ console.log(`\\n\\x1b[35m[Cron Execution] Triggering job: ${description}\\x1b[0m`);
20
+ callback();
21
+ }, intervalMs);
22
+ this.jobs.set(id, { id, description, intervalMs, timer });
23
+ return id;
24
+ }
25
+ /**
26
+ * Lists all active scheduled tasks.
27
+ */
28
+ listCrons() {
29
+ return Array.from(this.jobs.values()).map(j => ({ id: j.id, description: j.description }));
30
+ }
31
+ /**
32
+ * Deletes a specific scheduled task.
33
+ */
34
+ deleteCron(id) {
35
+ const job = this.jobs.get(id);
36
+ if (!job)
37
+ return false;
38
+ clearInterval(job.timer);
39
+ this.jobs.delete(id);
40
+ return true;
41
+ }
42
+ }
43
+ exports.CronManager = CronManager;
44
+ //# sourceMappingURL=CronManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CronManager.js","sourceRoot":"","sources":["../../src/tools/CronManager.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AASpC;;GAEG;AACH,MAAa,WAAW;IAAxB;QACU,SAAI,GAAyB,IAAI,GAAG,EAAE,CAAC;IAoCjD,CAAC;IAlCC;;OAEG;IACI,UAAU,CAAC,WAAmB,EAAE,eAAuB,EAAE,QAAoB;QAClF,MAAM,EAAE,GAAG,IAAA,mBAAU,GAAE,CAAC;QACxB,MAAM,UAAU,GAAG,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC;QAE/C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,OAAO,CAAC,GAAG,CAAC,gDAAgD,WAAW,UAAU,CAAC,CAAC;YACnF,QAAQ,EAAE,CAAC;QACb,CAAC,EAAE,UAAU,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACI,SAAS;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,EAAU;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QAEvB,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AArCD,kCAqCC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Phase 1: Native filesystem tooling avoiding brittle OS-dependent bash shells (dir/findstr).
3
+ * Fully implemented functions with zero external dependencies.
4
+ */
5
+ export declare class NativeTools {
6
+ /**
7
+ * Safely writes a file from scratch, creating parent subdirectories automatically.
8
+ */
9
+ static executeWrite(filePath: string, content: string): Promise<string>;
10
+ /**
11
+ * Native Glob implementation to replace 'dir /s /b'.
12
+ * Walks directories natively, skipping node_modules and .git automatically.
13
+ */
14
+ static executeGlob(pattern: string, dir?: string): Promise<string[]>;
15
+ /**
16
+ * Native Grep implementation to replace 'findstr'.
17
+ * Reads files matching a pattern and runs RegExp across them.
18
+ */
19
+ static executeGrep(regexQuery: string, filesToSearch: string[]): Promise<string>;
20
+ /**
21
+ * Native HTTP fetch to pull web content and strip basic HTML out.
22
+ */
23
+ static executeWebFetch(urlStr: string): Promise<string>;
24
+ /**
25
+ * Native WebSearch tool utilizing the existing duck-duck-scrape dependency.
26
+ */
27
+ static executeWebSearch(query: string): Promise<string>;
28
+ /**
29
+ * AskUserQuestion tool - pauses execution and prompts the developer for input natively.
30
+ */
31
+ static executeAskUserQuestion(question: string): Promise<string>;
32
+ }
33
+ //# sourceMappingURL=NativeTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeTools.d.ts","sourceRoot":"","sources":["../../src/tools/NativeTools.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,qBAAa,WAAW;IAEtB;;OAEG;WACU,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO7E;;;OAGG;WACU,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiCzF;;;OAGG;WACU,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBtF;;OAEG;WACU,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA6B7D;;OAEG;WACU,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa7D;;OAEG;WACU,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAcvE"}