@tyvm/knowhow 0.0.146 → 0.0.147

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 (214) hide show
  1. package/autodoc/cli-reference.md +36 -7
  2. package/bin/knowhow.js +8 -6
  3. package/package.json +1 -1
  4. package/src/agents/base/base.ts +24 -0
  5. package/src/agents/historyRollback.ts +36 -0
  6. package/src/agents/tools/startAgentTask.ts +41 -9
  7. package/src/auth/browserLogin.ts +9 -3
  8. package/src/auth/keyAuth.ts +115 -0
  9. package/src/auth/keyManager.ts +166 -0
  10. package/src/chat/modules/AgentModule.ts +114 -33
  11. package/src/chat/modules/AskModule.ts +2 -0
  12. package/src/chat/modules/BaseChatModule.ts +0 -1
  13. package/src/chat/modules/CustomCommandsModule.ts +2 -0
  14. package/src/chat/modules/InternalChatModule.ts +2 -0
  15. package/src/chat/modules/RemoteSyncModule.ts +4 -0
  16. package/src/chat/modules/RendererModule.ts +2 -0
  17. package/src/chat/modules/SearchModule.ts +2 -0
  18. package/src/chat/modules/SessionsModule.ts +103 -34
  19. package/src/chat/modules/SetupModule.ts +2 -0
  20. package/src/chat/modules/ShellCommandModule.ts +2 -0
  21. package/src/chat/modules/SystemModule.ts +2 -0
  22. package/src/chat/types.ts +2 -0
  23. package/src/cli.ts +1 -1
  24. package/src/clients/index.ts +2 -0
  25. package/src/commands/agent.ts +1 -38
  26. package/src/commands/agents.ts +403 -53
  27. package/src/commands/misc.ts +3 -2
  28. package/src/login.ts +89 -28
  29. package/src/services/AgentService.ts +2 -0
  30. package/src/services/AgentSyncFs.ts +65 -0
  31. package/src/services/AgentSyncKnowhowWeb.ts +22 -4
  32. package/src/services/BehaviorsService.ts +2 -0
  33. package/src/services/DockerService.ts +2 -0
  34. package/src/services/EmbeddingService.ts +2 -0
  35. package/src/services/EmbeddingsService.ts +3 -0
  36. package/src/services/KnowhowClient.ts +68 -7
  37. package/src/services/LazyToolsService.ts +9 -0
  38. package/src/services/Mcp.ts +2 -0
  39. package/src/services/McpServer.ts +2 -0
  40. package/src/services/MessageProcessor.ts +2 -0
  41. package/src/services/MinimalToolsService.ts +2 -0
  42. package/src/services/SessionManager.ts +5 -0
  43. package/src/services/SkillsService.ts +2 -0
  44. package/src/services/SyncedAgentWatcher.ts +2 -0
  45. package/src/services/SyncerService.ts +23 -8
  46. package/src/services/TaskRegistry.ts +2 -0
  47. package/src/services/Tools.ts +2 -0
  48. package/src/services/index.ts +2 -0
  49. package/src/services/modules/index.ts +4 -1
  50. package/src/types.ts +2 -0
  51. package/src/util/Trace.ts +1 -1
  52. package/src/utils/http.ts +18 -2
  53. package/tests/unit/agents/historyRollback.test.ts +53 -0
  54. package/tests/unit/auth/keyAuth.test.ts +102 -0
  55. package/tests/unit/auth/keyManager.test.ts +67 -0
  56. package/tests/unit/chat/historyCommandArgs.test.ts +37 -0
  57. package/tests/unit/commands/agents.test.ts +68 -0
  58. package/tests/unit/login.test.ts +119 -0
  59. package/tests/unit/services/AgentSyncKnowhowWeb.test.ts +38 -0
  60. package/tests/unit/services/LazyToolsService.test.ts +29 -0
  61. package/tests/unit/services/SessionManager.test.ts +43 -0
  62. package/tests/unit/services/SyncerService.test.ts +45 -0
  63. package/tests/unit/util/Trace.test.ts +119 -0
  64. package/tests/unit/utils/http.test.ts +43 -0
  65. package/ts_build/package.json +1 -1
  66. package/ts_build/src/agents/base/base.d.ts +1 -0
  67. package/ts_build/src/agents/base/base.js +31 -2
  68. package/ts_build/src/agents/base/base.js.map +1 -1
  69. package/ts_build/src/agents/historyRollback.d.ts +2 -0
  70. package/ts_build/src/agents/historyRollback.js +22 -0
  71. package/ts_build/src/agents/historyRollback.js.map +1 -0
  72. package/ts_build/src/agents/tools/startAgentTask.d.ts +2 -0
  73. package/ts_build/src/agents/tools/startAgentTask.js +36 -9
  74. package/ts_build/src/agents/tools/startAgentTask.js.map +1 -1
  75. package/ts_build/src/auth/browserLogin.d.ts +1 -0
  76. package/ts_build/src/auth/browserLogin.js +5 -2
  77. package/ts_build/src/auth/browserLogin.js.map +1 -1
  78. package/ts_build/src/auth/keyAuth.d.ts +5 -0
  79. package/ts_build/src/auth/keyAuth.js +79 -0
  80. package/ts_build/src/auth/keyAuth.js.map +1 -0
  81. package/ts_build/src/auth/keyManager.d.ts +14 -0
  82. package/ts_build/src/auth/keyManager.js +145 -0
  83. package/ts_build/src/auth/keyManager.js.map +1 -0
  84. package/ts_build/src/chat/modules/AgentModule.d.ts +13 -1
  85. package/ts_build/src/chat/modules/AgentModule.js +83 -24
  86. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  87. package/ts_build/src/chat/modules/AskModule.js +12 -2
  88. package/ts_build/src/chat/modules/AskModule.js.map +1 -1
  89. package/ts_build/src/chat/modules/BaseChatModule.js.map +1 -1
  90. package/ts_build/src/chat/modules/CustomCommandsModule.js +12 -2
  91. package/ts_build/src/chat/modules/CustomCommandsModule.js.map +1 -1
  92. package/ts_build/src/chat/modules/InternalChatModule.js +16 -2
  93. package/ts_build/src/chat/modules/InternalChatModule.js.map +1 -1
  94. package/ts_build/src/chat/modules/RemoteSyncModule.js +19 -2
  95. package/ts_build/src/chat/modules/RemoteSyncModule.js.map +1 -1
  96. package/ts_build/src/chat/modules/RendererModule.js +17 -2
  97. package/ts_build/src/chat/modules/RendererModule.js.map +1 -1
  98. package/ts_build/src/chat/modules/SearchModule.js +12 -2
  99. package/ts_build/src/chat/modules/SearchModule.js.map +1 -1
  100. package/ts_build/src/chat/modules/SessionsModule.d.ts +6 -0
  101. package/ts_build/src/chat/modules/SessionsModule.js +113 -18
  102. package/ts_build/src/chat/modules/SessionsModule.js.map +1 -1
  103. package/ts_build/src/chat/modules/SetupModule.js +17 -2
  104. package/ts_build/src/chat/modules/SetupModule.js.map +1 -1
  105. package/ts_build/src/chat/modules/ShellCommandModule.js +12 -2
  106. package/ts_build/src/chat/modules/ShellCommandModule.js.map +1 -1
  107. package/ts_build/src/chat/modules/SystemModule.js +12 -2
  108. package/ts_build/src/chat/modules/SystemModule.js.map +1 -1
  109. package/ts_build/src/chat/types.d.ts +2 -0
  110. package/ts_build/src/cli.js +1 -1
  111. package/ts_build/src/cli.js.map +1 -1
  112. package/ts_build/src/clients/index.js +19 -4
  113. package/ts_build/src/clients/index.js.map +1 -1
  114. package/ts_build/src/commands/agent.js +1 -21
  115. package/ts_build/src/commands/agent.js.map +1 -1
  116. package/ts_build/src/commands/agents.d.ts +1 -1
  117. package/ts_build/src/commands/agents.js +174 -16
  118. package/ts_build/src/commands/agents.js.map +1 -1
  119. package/ts_build/src/commands/misc.js +3 -2
  120. package/ts_build/src/commands/misc.js.map +1 -1
  121. package/ts_build/src/login.d.ts +1 -1
  122. package/ts_build/src/login.js +53 -15
  123. package/ts_build/src/login.js.map +1 -1
  124. package/ts_build/src/services/AgentService.js +18 -2
  125. package/ts_build/src/services/AgentService.js.map +1 -1
  126. package/ts_build/src/services/AgentSyncFs.d.ts +3 -0
  127. package/ts_build/src/services/AgentSyncFs.js +62 -15
  128. package/ts_build/src/services/AgentSyncFs.js.map +1 -1
  129. package/ts_build/src/services/AgentSyncKnowhowWeb.d.ts +2 -0
  130. package/ts_build/src/services/AgentSyncKnowhowWeb.js +28 -6
  131. package/ts_build/src/services/AgentSyncKnowhowWeb.js.map +1 -1
  132. package/ts_build/src/services/BehaviorsService.js +12 -2
  133. package/ts_build/src/services/BehaviorsService.js.map +1 -1
  134. package/ts_build/src/services/DockerService.js +20 -8
  135. package/ts_build/src/services/DockerService.js.map +1 -1
  136. package/ts_build/src/services/EmbeddingService.js +16 -2
  137. package/ts_build/src/services/EmbeddingService.js.map +1 -1
  138. package/ts_build/src/services/EmbeddingsService.js +12 -2
  139. package/ts_build/src/services/EmbeddingsService.js.map +1 -1
  140. package/ts_build/src/services/KnowhowClient.d.ts +7 -2
  141. package/ts_build/src/services/KnowhowClient.js +108 -10
  142. package/ts_build/src/services/KnowhowClient.js.map +1 -1
  143. package/ts_build/src/services/LazyToolsService.d.ts +1 -0
  144. package/ts_build/src/services/LazyToolsService.js +21 -2
  145. package/ts_build/src/services/LazyToolsService.js.map +1 -1
  146. package/ts_build/src/services/Mcp.js +12 -2
  147. package/ts_build/src/services/Mcp.js.map +1 -1
  148. package/ts_build/src/services/McpServer.js +17 -2
  149. package/ts_build/src/services/McpServer.js.map +1 -1
  150. package/ts_build/src/services/MessageProcessor.js +16 -2
  151. package/ts_build/src/services/MessageProcessor.js.map +1 -1
  152. package/ts_build/src/services/MinimalToolsService.js +16 -2
  153. package/ts_build/src/services/MinimalToolsService.js.map +1 -1
  154. package/ts_build/src/services/SessionManager.js +19 -2
  155. package/ts_build/src/services/SessionManager.js.map +1 -1
  156. package/ts_build/src/services/SkillsService.js +16 -2
  157. package/ts_build/src/services/SkillsService.js.map +1 -1
  158. package/ts_build/src/services/SyncedAgentWatcher.js +16 -2
  159. package/ts_build/src/services/SyncedAgentWatcher.js.map +1 -1
  160. package/ts_build/src/services/SyncerService.d.ts +1 -0
  161. package/ts_build/src/services/SyncerService.js +27 -5
  162. package/ts_build/src/services/SyncerService.js.map +1 -1
  163. package/ts_build/src/services/TaskRegistry.js +12 -2
  164. package/ts_build/src/services/TaskRegistry.js.map +1 -1
  165. package/ts_build/src/services/Tools.js +16 -2
  166. package/ts_build/src/services/Tools.js.map +1 -1
  167. package/ts_build/src/services/index.d.ts +2 -0
  168. package/ts_build/src/services/index.js +4 -2
  169. package/ts_build/src/services/index.js.map +1 -1
  170. package/ts_build/src/services/modules/index.d.ts +2 -1
  171. package/ts_build/src/services/modules/index.js +1 -1
  172. package/ts_build/src/services/modules/index.js.map +1 -1
  173. package/ts_build/src/types.d.ts +1 -0
  174. package/ts_build/src/types.js.map +1 -1
  175. package/ts_build/src/util/Trace.d.ts +1 -3
  176. package/ts_build/src/utils/http.d.ts +6 -2
  177. package/ts_build/src/utils/http.js +8 -2
  178. package/ts_build/src/utils/http.js.map +1 -1
  179. package/ts_build/tests/unit/agents/historyRollback.test.d.ts +1 -0
  180. package/ts_build/tests/unit/agents/historyRollback.test.js +42 -0
  181. package/ts_build/tests/unit/agents/historyRollback.test.js.map +1 -0
  182. package/ts_build/tests/unit/auth/keyAuth.test.d.ts +1 -0
  183. package/ts_build/tests/unit/auth/keyAuth.test.js +77 -0
  184. package/ts_build/tests/unit/auth/keyAuth.test.js.map +1 -0
  185. package/ts_build/tests/unit/auth/keyManager.test.d.ts +1 -0
  186. package/ts_build/tests/unit/auth/keyManager.test.js +52 -0
  187. package/ts_build/tests/unit/auth/keyManager.test.js.map +1 -0
  188. package/ts_build/tests/unit/chat/historyCommandArgs.test.d.ts +1 -0
  189. package/ts_build/tests/unit/chat/historyCommandArgs.test.js +29 -0
  190. package/ts_build/tests/unit/chat/historyCommandArgs.test.js.map +1 -0
  191. package/ts_build/tests/unit/commands/agents.test.d.ts +1 -0
  192. package/ts_build/tests/unit/commands/agents.test.js +91 -0
  193. package/ts_build/tests/unit/commands/agents.test.js.map +1 -0
  194. package/ts_build/tests/unit/login.test.d.ts +1 -0
  195. package/ts_build/tests/unit/login.test.js +97 -0
  196. package/ts_build/tests/unit/login.test.js.map +1 -0
  197. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.d.ts +1 -0
  198. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js +32 -0
  199. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js.map +1 -0
  200. package/ts_build/tests/unit/services/LazyToolsService.test.d.ts +1 -0
  201. package/ts_build/tests/unit/services/LazyToolsService.test.js +27 -0
  202. package/ts_build/tests/unit/services/LazyToolsService.test.js.map +1 -0
  203. package/ts_build/tests/unit/services/SessionManager.test.d.ts +1 -0
  204. package/ts_build/tests/unit/services/SessionManager.test.js +72 -0
  205. package/ts_build/tests/unit/services/SessionManager.test.js.map +1 -0
  206. package/ts_build/tests/unit/services/SyncerService.test.d.ts +1 -0
  207. package/ts_build/tests/unit/services/SyncerService.test.js +40 -0
  208. package/ts_build/tests/unit/services/SyncerService.test.js.map +1 -0
  209. package/ts_build/tests/unit/util/Trace.test.d.ts +1 -0
  210. package/ts_build/tests/unit/util/Trace.test.js +107 -0
  211. package/ts_build/tests/unit/util/Trace.test.js.map +1 -0
  212. package/ts_build/tests/unit/utils/http.test.d.ts +1 -0
  213. package/ts_build/tests/unit/utils/http.test.js +69 -0
  214. package/ts_build/tests/unit/utils/http.test.js.map +1 -0
@@ -5,11 +5,13 @@
5
5
  * Command semantics:
6
6
  * /attach <taskId> - Attach to a RUNNING session (in-memory, filesystem, or web).
7
7
  * If the task is completed, the user is told to use /resume instead.
8
- * /resume <taskId> - Resume a COMPLETED/saved session with optional additional context.
8
+ * /resume <taskId> [--rollback N] - Continue the same saved task.
9
+ * /fork <taskId> [--rollback N] - Start a new task from saved history.
9
10
  * /sessions - List sessions that can be attached to or resumed.
10
11
  * /logs [N] - Show the last N messages from the currently attached agent.
11
12
  */
12
13
  import { BaseChatModule } from "./BaseChatModule";
14
+ import { TraceAll } from "../../util/Trace";
13
15
  import { ChatCommand, ChatMode, ChatContext } from "../types";
14
16
  import { AgentModule } from "./AgentModule";
15
17
  import {
@@ -24,6 +26,33 @@ import { Marked } from "../../utils/index";
24
26
  import * as fs from "fs";
25
27
  import * as path from "path";
26
28
 
29
+ export function parseHistoryCommandArgs(args: string[]): {
30
+ id?: string;
31
+ rollback: number;
32
+ showAll: boolean;
33
+ } {
34
+ let id: string | undefined;
35
+ let rollback = 0;
36
+ let showAll = false;
37
+ for (let i = 0; i < args.length; i++) {
38
+ if (args[i] === "--all") {
39
+ showAll = true;
40
+ } else if (args[i] === "--rollback") {
41
+ const value = args[++i];
42
+ rollback = Number(value);
43
+ if (!Number.isInteger(rollback) || rollback < 0) {
44
+ throw new Error("--rollback must be a non-negative integer");
45
+ }
46
+ } else if (!id) {
47
+ id = args[i];
48
+ } else {
49
+ throw new Error(`Unexpected argument: ${args[i]}`);
50
+ }
51
+ }
52
+ return { id, rollback, showAll };
53
+ }
54
+
55
+ @TraceAll()
27
56
  export class SessionsModule extends BaseChatModule {
28
57
  name = "sessions";
29
58
  description = "Session and attachment management";
@@ -49,6 +78,12 @@ export class SessionsModule extends BaseChatModule {
49
78
  "Resume a completed/saved session with optional additional context",
50
79
  handler: this.handleResumeCommand.bind(this),
51
80
  },
81
+ {
82
+ name: "fork",
83
+ description:
84
+ "Fork a saved session into a new task; use --rollback N to discard recent agent interactions",
85
+ handler: this.handleForkCommand.bind(this),
86
+ },
52
87
  {
53
88
  name: "sessions",
54
89
  description:
@@ -305,10 +340,17 @@ export class SessionsModule extends BaseChatModule {
305
340
 
306
341
  async handleResumeCommand(args: string[]): Promise<void> {
307
342
  const sessionManager = this.agentModule.getSessionManager();
343
+ let parsed;
344
+ try {
345
+ parsed = parseHistoryCommandArgs(args);
346
+ } catch (error: any) {
347
+ console.error(`Usage: /resume <taskId> [--rollback N] [--all]\n${error.message}`);
348
+ return;
349
+ }
308
350
 
309
- if (args.length === 0 || args[0] === "--all") {
351
+ if (!parsed.id) {
310
352
  // Interactive: show saved sessions for selection
311
- const showAll = args[0] === "--all";
353
+ const showAll = parsed.showAll;
312
354
  const allSessions = sessionManager.listAvailableSessions();
313
355
  const savedSessions = showAll ? allSessions : allSessions.slice(0, 10);
314
356
  if (savedSessions.length === 0) {
@@ -328,18 +370,32 @@ export class SessionsModule extends BaseChatModule {
328
370
  );
329
371
 
330
372
  if (selectedId) {
331
- await this.resumeById(selectedId);
373
+ await this.resumeById(selectedId, parsed.rollback);
332
374
  }
333
375
  return;
334
376
  }
335
377
 
336
- await this.resumeById(args[0]);
378
+ await this.resumeById(parsed.id, parsed.rollback);
379
+ }
380
+
381
+ async handleForkCommand(args: string[]): Promise<void> {
382
+ let parsed;
383
+ try {
384
+ parsed = parseHistoryCommandArgs(args);
385
+ } catch (error: any) {
386
+ console.error(`Usage: /fork <taskId> [--rollback N]\n${error.message}`);
387
+ return;
388
+ }
389
+ if (!parsed.id) {
390
+ console.error("Usage: /fork <taskId> [--rollback N]");
391
+ return;
392
+ }
393
+ await this.resumeById(parsed.id, parsed.rollback, true);
337
394
  }
338
395
 
339
- private async resumeById(id: string): Promise<void> {
396
+ private async resumeById(id: string, rollback = 0, fork = false): Promise<void> {
340
397
  const sessionManager = this.agentModule.getSessionManager();
341
398
 
342
- // Check saved sessions first
343
399
  try {
344
400
  const session = sessionManager.loadSession(id);
345
401
  if (session) {
@@ -349,34 +405,46 @@ export class SessionsModule extends BaseChatModule {
349
405
  console.log(` Status : ${session.status}`);
350
406
 
351
407
  const additionalContext = await this.chatService?.getInput(
352
- "Add any additional context for resuming this session (or press Enter to skip): "
353
- );
354
- await this.agentModule.resumeSession(
355
- id,
356
- additionalContext?.trim() || undefined
408
+ `Add any additional context for ${fork ? "forking" : "resuming"} this session (or press Enter to skip): `
357
409
  );
410
+ if (fork) {
411
+ const result = await this.agentModule.resumeFromMessages({
412
+ agentName: session.agentName,
413
+ threads: session.threads,
414
+ input: additionalContext?.trim() || session.initialInput,
415
+ interactive: true,
416
+ rollback,
417
+ fork: true,
418
+ model: session.model,
419
+ provider: session.provider,
420
+ reasoningEffort: session.reasoningEffort,
421
+ summarizeReasoning: session.summarizeReasoning,
422
+ enabledTools: session.enabledTools,
423
+ });
424
+ console.log(`🌿 Forked ${id} into new task ${result.taskId}`);
425
+ } else {
426
+ await this.agentModule.resumeSession(
427
+ id,
428
+ additionalContext?.trim() || undefined,
429
+ rollback
430
+ );
431
+ }
358
432
  return;
359
433
  }
360
- } catch {
434
+ } catch (e: any) {
435
+ if (e?.message?.includes("rollback")) throw e;
361
436
  // not found as a saved session
362
437
  }
363
438
 
364
- // Check filesystem agent (may have metadata with threads)
365
439
  const fsAgentPath = path.join(".knowhow", "processes", "agents", id);
366
440
  if (fs.existsSync(fsAgentPath)) {
367
- // Try to load threads from metadata.json and resume
368
441
  const metadataPath = path.join(fsAgentPath, "metadata.json");
369
442
  if (fs.existsSync(metadataPath)) {
370
443
  try {
371
- const raw = fs.readFileSync(metadataPath, "utf-8");
372
- const metadata = JSON.parse(raw);
444
+ const metadata = JSON.parse(fs.readFileSync(metadataPath, "utf-8"));
373
445
  const threads: any[] = metadata.threads || [];
374
446
  const agentName = metadata.agentName || "Developer";
375
-
376
- // Try to get initialInput from the saved session file (more complete)
377
- // since metadata.json doesn't always store it
378
- const savedSession = sessionManager.loadSession(id);
379
- const initialInput = savedSession?.initialInput || metadata.initialInput || metadata.prompt || "";
447
+ const initialInput = metadata.initialInput || metadata.prompt || "";
380
448
 
381
449
  console.log(`\n📋 Found task in filesystem: ${id}`);
382
450
  console.log(` Agent : ${agentName}`);
@@ -384,30 +452,33 @@ export class SessionsModule extends BaseChatModule {
384
452
  console.log(` Status : ${metadata.status || "unknown"}`);
385
453
 
386
454
  const additionalContext = await this.chatService?.getInput(
387
- "Add any additional context for resuming this session (or press Enter to skip): "
455
+ `Add any additional context for ${fork ? "forking" : "resuming"} this session (or press Enter to skip): `
388
456
  );
389
-
390
- // Normalize threads: if flat Message[] (old buggy format), wrap in array
391
457
  const normalizedThreads = threads.length > 0 && !Array.isArray(threads[0])
392
458
  ? [threads]
393
459
  : threads;
394
-
395
- await this.agentModule.resumeFromMessages({
460
+ const result = await this.agentModule.resumeFromMessages({
396
461
  agentName,
397
- taskId: id,
462
+ remoteTaskId: fork
463
+ ? undefined
464
+ : metadata.remoteTaskId || metadata.knowhowTaskId,
465
+ taskId: fork ? undefined : id,
398
466
  threads: normalizedThreads,
399
- input: additionalContext?.trim() || initialInput || "",
467
+ input: additionalContext?.trim() || initialInput,
400
468
  interactive: true,
401
- // Restore the exact model/provider/reasoning the run used so
402
- // resuming doesn't silently drop back to agent defaults.
469
+ rollback,
470
+ fork,
403
471
  model: metadata.model,
404
472
  provider: metadata.provider,
405
473
  reasoningEffort: metadata.reasoningEffort,
406
474
  summarizeReasoning: metadata.summarizeReasoning,
475
+ enabledTools: metadata.enabledTools,
407
476
  });
477
+ if (fork) console.log(`🌿 Forked ${id} into new task ${result.taskId}`);
408
478
  return;
409
479
  } catch (e: any) {
410
480
  console.error(`⚠️ Failed to load metadata for task ${id}: ${e.message}`);
481
+ return;
411
482
  }
412
483
  }
413
484
  console.log(
@@ -417,9 +488,7 @@ export class SessionsModule extends BaseChatModule {
417
488
  return;
418
489
  }
419
490
 
420
- console.log(
421
- `Session "${id}" not found. Use /sessions to list available sessions.`
422
- );
491
+ console.log(`Session "${id}" not found. Use /sessions to list available sessions.`);
423
492
  }
424
493
 
425
494
  // ─────────────────────────────────────────────────────────────────────────────
@@ -1,4 +1,5 @@
1
1
  import { services } from "../../services";
2
+ import { TraceAll } from "../../util/Trace";
2
3
  import { login } from "../../login";
3
4
  import { ask } from "../../utils";
4
5
  import { CliChatService } from "../CliChatService";
@@ -6,6 +7,7 @@ import { ChatCommand, ChatMode } from "../types";
6
7
  import { AgentModule } from "./AgentModule";
7
8
  import { BaseChatModule } from "./BaseChatModule";
8
9
 
10
+ @TraceAll()
9
11
  export class SetupModule extends BaseChatModule {
10
12
  name = "setup";
11
13
  description = "Setup commands";
@@ -1,4 +1,5 @@
1
1
  import { BaseChatModule } from "./BaseChatModule";
2
+ import { TraceAll } from "../../util/Trace";
2
3
  import { ChatCommand, ChatContext, CommandResult } from "../types";
3
4
  import { execSync } from "child_process";
4
5
 
@@ -7,6 +8,7 @@ import { execSync } from "child_process";
7
8
  * /! - Execute command and display output in console (interactive if needed)
8
9
  * /!! - Execute command and send output to the AI agent
9
10
  */
11
+ @TraceAll()
10
12
  export class ShellCommandModule extends BaseChatModule {
11
13
  name = "shell-command";
12
14
  description = "Execute shell commands with /! and /!!";
@@ -1,10 +1,12 @@
1
1
  import { BaseChatModule } from "./BaseChatModule";
2
+ import { TraceAll } from "../../util/Trace";
2
3
  import { CliChatService } from "../CliChatService";
3
4
  import { ChatCommand, ChatMode, ChatContext } from "../types";
4
5
  import { ask } from "../../utils";
5
6
  import { services } from "../../services";
6
7
  import { Models } from "../../types";
7
8
 
9
+ @TraceAll()
8
10
  export class SystemModule extends BaseChatModule {
9
11
  name = "system";
10
12
  description = "System commands for model, provider, debug, and clear";
package/src/chat/types.ts CHANGED
@@ -104,6 +104,7 @@ export interface TaskInfo {
104
104
  provider?: string;
105
105
  reasoningEffort?: ReasoningEffort;
106
106
  summarizeReasoning?: boolean;
107
+ enabledTools?: string[];
107
108
  }
108
109
 
109
110
  export interface ChatSession {
@@ -126,6 +127,7 @@ export interface ChatSession {
126
127
  provider?: string;
127
128
  reasoningEffort?: ReasoningEffort;
128
129
  summarizeReasoning?: boolean;
130
+ enabledTools?: string[];
129
131
  }
130
132
 
131
133
  export interface ChatHistory {
package/src/cli.ts CHANGED
@@ -128,7 +128,7 @@ async function main() {
128
128
  addReplayCommand(program);
129
129
  addBehaviorsCommand(program);
130
130
  addSkillsCommand(program);
131
- addAgentsCommand(program);
131
+ addAgentsCommand(program, getChatService);
132
132
  addHashCommand(program);
133
133
  addSandboxCommand(program);
134
134
 
@@ -59,6 +59,7 @@ import { GenericLlamaClient } from "./llama";
59
59
  import { GenericFireworksClient } from "./fireworks";
60
60
  import { GenericMetaClient } from "./meta";
61
61
  import { GenericQwenClient } from "./qwen";
62
+ import { TraceAll } from "../util/Trace";
62
63
  export {
63
64
  OpenAiTextPricing,
64
65
  AnthropicTextPricing,
@@ -139,6 +140,7 @@ const DEFAULT_PROVIDERS: ModelProvider[] = [
139
140
  { provider: "qwen", envKey: "QWEN_CLOUD_API_KEY" },
140
141
  ];
141
142
 
143
+ @TraceAll()
142
144
  export class AIClient {
143
145
  clients: Record<string, GenericClient> = {};
144
146
 
@@ -55,7 +55,7 @@ export function addAgentCommand(program: Command, getChatService: () => any): vo
55
55
  "AI provider (openai, anthropic, google, xai)"
56
56
  )
57
57
  .option("--model <model>", "Specific model for the provider")
58
- .option("--agent-name <name>", "Which agent to use", "Patcher")
58
+ .option("--agent-name <name>", "Which agent to use (default: Patcher)")
59
59
  .option(
60
60
  "--reasoning-effort <effort>",
61
61
  `Reasoning effort: ${REASONING_EFFORTS.join(", ")}. Individual models support different subsets.`
@@ -94,10 +94,6 @@ export function addAgentCommand(program: Command, getChatService: () => any): vo
94
94
  )
95
95
  .option("--prompt-file <path>", "Custom prompt template file with {text}")
96
96
  .option("--input <text>", "Task input (fallback to stdin if not provided)")
97
- .option(
98
- "--resume",
99
- "Resume a previously started task using the --task-id (local FS or remote)"
100
- )
101
97
  .option(
102
98
  "--renderer <name>",
103
99
  "Renderer to use: basic, compact, fancy, or a path/package (default: from config or basic)"
@@ -124,39 +120,6 @@ export function addAgentCommand(program: Command, getChatService: () => any): vo
124
120
 
125
121
  const agentModule = new AgentModule();
126
122
 
127
- if (options.resume) {
128
- const threads = await agentModule.loadThreadsForTask(
129
- options.taskId,
130
- options.messageId
131
- );
132
- // Restore the exact model/provider/reasoning the original run used
133
- // (falls back to agent defaults when not persisted / remote-only).
134
- const savedSettings = await agentModule.loadTaskSettings(
135
- options.taskId,
136
- options.messageId
137
- );
138
- const resumeInput =
139
- options.input || "Please continue from where you left off.";
140
-
141
- await agentModule.initialize(chatService);
142
- const { taskCompleted: resumed } =
143
- await agentModule.resumeFromMessages({
144
- agentName:
145
- options.agentName || savedSettings.agentName || "Patcher",
146
- input: resumeInput,
147
- threads,
148
- messageId: options.messageId,
149
- taskId: options.taskId,
150
- // CLI-provided model/provider still win over persisted ones.
151
- model: options.model || savedSettings.model,
152
- provider: options.provider || savedSettings.provider,
153
- reasoningEffort: savedSettings.reasoningEffort,
154
- summarizeReasoning: savedSettings.summarizeReasoning,
155
- });
156
- await resumed;
157
- return;
158
- }
159
-
160
123
  let input = options.input;
161
124
 
162
125
  if (!input && !options.promptFile) {