@nexagent-cli/cli 0.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 (188) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/LICENSE +21 -0
  3. package/README.md +40 -0
  4. package/dist/agent/loop.d.ts +45 -0
  5. package/dist/agent/loop.d.ts.map +1 -0
  6. package/dist/agent/loop.js +270 -0
  7. package/dist/agent/loop.js.map +1 -0
  8. package/dist/agent/prompt.d.ts +3 -0
  9. package/dist/agent/prompt.d.ts.map +1 -0
  10. package/dist/agent/prompt.js +43 -0
  11. package/dist/agent/prompt.js.map +1 -0
  12. package/dist/commands/agent.d.ts +21 -0
  13. package/dist/commands/agent.d.ts.map +1 -0
  14. package/dist/commands/agent.js +111 -0
  15. package/dist/commands/agent.js.map +1 -0
  16. package/dist/commands/chat.d.ts +18 -0
  17. package/dist/commands/chat.d.ts.map +1 -0
  18. package/dist/commands/chat.js +115 -0
  19. package/dist/commands/chat.js.map +1 -0
  20. package/dist/commands/config.d.ts +10 -0
  21. package/dist/commands/config.d.ts.map +1 -0
  22. package/dist/commands/config.js +96 -0
  23. package/dist/commands/config.js.map +1 -0
  24. package/dist/commands/doctor.d.ts +8 -0
  25. package/dist/commands/doctor.d.ts.map +1 -0
  26. package/dist/commands/doctor.js +201 -0
  27. package/dist/commands/doctor.js.map +1 -0
  28. package/dist/commands/memory.d.ts +13 -0
  29. package/dist/commands/memory.d.ts.map +1 -0
  30. package/dist/commands/memory.js +97 -0
  31. package/dist/commands/memory.js.map +1 -0
  32. package/dist/commands/models.d.ts +2 -0
  33. package/dist/commands/models.d.ts.map +1 -0
  34. package/dist/commands/models.js +5 -0
  35. package/dist/commands/models.js.map +1 -0
  36. package/dist/commands/run.d.ts +13 -0
  37. package/dist/commands/run.d.ts.map +1 -0
  38. package/dist/commands/run.js +74 -0
  39. package/dist/commands/run.js.map +1 -0
  40. package/dist/commands/server.d.ts +8 -0
  41. package/dist/commands/server.d.ts.map +1 -0
  42. package/dist/commands/server.js +73 -0
  43. package/dist/commands/server.js.map +1 -0
  44. package/dist/commands/session.d.ts +11 -0
  45. package/dist/commands/session.d.ts.map +1 -0
  46. package/dist/commands/session.js +77 -0
  47. package/dist/commands/session.js.map +1 -0
  48. package/dist/commands/update.d.ts +17 -0
  49. package/dist/commands/update.d.ts.map +1 -0
  50. package/dist/commands/update.js +320 -0
  51. package/dist/commands/update.js.map +1 -0
  52. package/dist/config/loader.d.ts +4 -0
  53. package/dist/config/loader.d.ts.map +1 -0
  54. package/dist/config/loader.js +83 -0
  55. package/dist/config/loader.js.map +1 -0
  56. package/dist/config/wizard.d.ts +4 -0
  57. package/dist/config/wizard.d.ts.map +1 -0
  58. package/dist/config/wizard.js +131 -0
  59. package/dist/config/wizard.js.map +1 -0
  60. package/dist/db/database.d.ts +4 -0
  61. package/dist/db/database.d.ts.map +1 -0
  62. package/dist/db/database.js +130 -0
  63. package/dist/db/database.js.map +1 -0
  64. package/dist/db/session-store.d.ts +17 -0
  65. package/dist/db/session-store.d.ts.map +1 -0
  66. package/dist/db/session-store.js +117 -0
  67. package/dist/db/session-store.js.map +1 -0
  68. package/dist/index.d.ts +3 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +207 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/llm/providers/anthropic.d.ts +21 -0
  73. package/dist/llm/providers/anthropic.d.ts.map +1 -0
  74. package/dist/llm/providers/anthropic.js +186 -0
  75. package/dist/llm/providers/anthropic.js.map +1 -0
  76. package/dist/llm/providers/google.d.ts +13 -0
  77. package/dist/llm/providers/google.d.ts.map +1 -0
  78. package/dist/llm/providers/google.js +83 -0
  79. package/dist/llm/providers/google.js.map +1 -0
  80. package/dist/llm/providers/ollama.d.ts +12 -0
  81. package/dist/llm/providers/ollama.d.ts.map +1 -0
  82. package/dist/llm/providers/ollama.js +110 -0
  83. package/dist/llm/providers/ollama.js.map +1 -0
  84. package/dist/llm/providers/openai.d.ts +15 -0
  85. package/dist/llm/providers/openai.d.ts.map +1 -0
  86. package/dist/llm/providers/openai.js +180 -0
  87. package/dist/llm/providers/openai.js.map +1 -0
  88. package/dist/llm/router.d.ts +20 -0
  89. package/dist/llm/router.d.ts.map +1 -0
  90. package/dist/llm/router.js +52 -0
  91. package/dist/llm/router.js.map +1 -0
  92. package/dist/memory/manager.d.ts +16 -0
  93. package/dist/memory/manager.d.ts.map +1 -0
  94. package/dist/memory/manager.js +114 -0
  95. package/dist/memory/manager.js.map +1 -0
  96. package/dist/safety/gate.d.ts +14 -0
  97. package/dist/safety/gate.d.ts.map +1 -0
  98. package/dist/safety/gate.js +102 -0
  99. package/dist/safety/gate.js.map +1 -0
  100. package/dist/subagents/orchestrator.d.ts +20 -0
  101. package/dist/subagents/orchestrator.d.ts.map +1 -0
  102. package/dist/subagents/orchestrator.js +151 -0
  103. package/dist/subagents/orchestrator.js.map +1 -0
  104. package/dist/tools/file-delete.d.ts +15 -0
  105. package/dist/tools/file-delete.d.ts.map +1 -0
  106. package/dist/tools/file-delete.js +94 -0
  107. package/dist/tools/file-delete.js.map +1 -0
  108. package/dist/tools/file-edit.d.ts +19 -0
  109. package/dist/tools/file-edit.d.ts.map +1 -0
  110. package/dist/tools/file-edit.js +182 -0
  111. package/dist/tools/file-edit.js.map +1 -0
  112. package/dist/tools/file-list.d.ts +13 -0
  113. package/dist/tools/file-list.d.ts.map +1 -0
  114. package/dist/tools/file-list.js +92 -0
  115. package/dist/tools/file-list.js.map +1 -0
  116. package/dist/tools/file-read.d.ts +13 -0
  117. package/dist/tools/file-read.d.ts.map +1 -0
  118. package/dist/tools/file-read.js +68 -0
  119. package/dist/tools/file-read.js.map +1 -0
  120. package/dist/tools/file-search.d.ts +14 -0
  121. package/dist/tools/file-search.d.ts.map +1 -0
  122. package/dist/tools/file-search.js +133 -0
  123. package/dist/tools/file-search.js.map +1 -0
  124. package/dist/tools/file-write.d.ts +14 -0
  125. package/dist/tools/file-write.d.ts.map +1 -0
  126. package/dist/tools/file-write.js +80 -0
  127. package/dist/tools/file-write.js.map +1 -0
  128. package/dist/tools/memory-read.d.ts +22 -0
  129. package/dist/tools/memory-read.d.ts.map +1 -0
  130. package/dist/tools/memory-read.js +114 -0
  131. package/dist/tools/memory-read.js.map +1 -0
  132. package/dist/tools/memory-write.d.ts +2 -0
  133. package/dist/tools/memory-write.d.ts.map +1 -0
  134. package/dist/tools/memory-write.js +5 -0
  135. package/dist/tools/memory-write.js.map +1 -0
  136. package/dist/tools/registry.d.ts +12 -0
  137. package/dist/tools/registry.d.ts.map +1 -0
  138. package/dist/tools/registry.js +66 -0
  139. package/dist/tools/registry.js.map +1 -0
  140. package/dist/tools/shell-exec.d.ts +14 -0
  141. package/dist/tools/shell-exec.d.ts.map +1 -0
  142. package/dist/tools/shell-exec.js +112 -0
  143. package/dist/tools/shell-exec.js.map +1 -0
  144. package/dist/tools/web-fetch.d.ts +12 -0
  145. package/dist/tools/web-fetch.d.ts.map +1 -0
  146. package/dist/tools/web-fetch.js +91 -0
  147. package/dist/tools/web-fetch.js.map +1 -0
  148. package/dist/tools/web-search.d.ts +12 -0
  149. package/dist/tools/web-search.d.ts.map +1 -0
  150. package/dist/tools/web-search.js +88 -0
  151. package/dist/tools/web-search.js.map +1 -0
  152. package/dist/ui/ChatApp.d.ts +22 -0
  153. package/dist/ui/ChatApp.d.ts.map +1 -0
  154. package/dist/ui/ChatApp.js +94 -0
  155. package/dist/ui/ChatApp.js.map +1 -0
  156. package/dist/ui/ConfirmDialog.d.ts +20 -0
  157. package/dist/ui/ConfirmDialog.d.ts.map +1 -0
  158. package/dist/ui/ConfirmDialog.js +23 -0
  159. package/dist/ui/ConfirmDialog.js.map +1 -0
  160. package/dist/ui/InputBar.d.ts +15 -0
  161. package/dist/ui/InputBar.d.ts.map +1 -0
  162. package/dist/ui/InputBar.js +49 -0
  163. package/dist/ui/InputBar.js.map +1 -0
  164. package/dist/ui/MessageList.d.ts +21 -0
  165. package/dist/ui/MessageList.d.ts.map +1 -0
  166. package/dist/ui/MessageList.js +29 -0
  167. package/dist/ui/MessageList.js.map +1 -0
  168. package/dist/ui/Spinner.d.ts +8 -0
  169. package/dist/ui/Spinner.d.ts.map +1 -0
  170. package/dist/ui/Spinner.js +16 -0
  171. package/dist/ui/Spinner.js.map +1 -0
  172. package/dist/ui/StatusBar.d.ts +32 -0
  173. package/dist/ui/StatusBar.d.ts.map +1 -0
  174. package/dist/ui/StatusBar.js +42 -0
  175. package/dist/ui/StatusBar.js.map +1 -0
  176. package/dist/ui/ToolPanel.d.ts +2 -0
  177. package/dist/ui/ToolPanel.d.ts.map +1 -0
  178. package/dist/ui/ToolPanel.js +5 -0
  179. package/dist/ui/ToolPanel.js.map +1 -0
  180. package/dist/utils/changelog.d.ts +19 -0
  181. package/dist/utils/changelog.d.ts.map +1 -0
  182. package/dist/utils/changelog.js +111 -0
  183. package/dist/utils/changelog.js.map +1 -0
  184. package/dist/utils/env.d.ts +9 -0
  185. package/dist/utils/env.d.ts.map +1 -0
  186. package/dist/utils/env.js +37 -0
  187. package/dist/utils/env.js.map +1 -0
  188. package/package.json +72 -0
@@ -0,0 +1,20 @@
1
+ import type { LLMProvider, LLMRequestOptions, LLMResponse, LLMStreamChunk, LLMCapabilities } from '@nexagent-cli/shared';
2
+ import type { LLMProviderName } from '@nexagent-cli/shared';
3
+ interface RouterConfig {
4
+ provider: LLMProviderName;
5
+ apiKey?: string;
6
+ baseUrl?: string;
7
+ }
8
+ export declare class LLMRouter implements LLMProvider {
9
+ readonly name: string;
10
+ private delegate;
11
+ constructor(config: RouterConfig);
12
+ private static build;
13
+ complete(options: LLMRequestOptions): Promise<LLMResponse>;
14
+ stream(options: LLMRequestOptions): AsyncGenerator<LLMStreamChunk>;
15
+ countTokens(text: string, model: string): number;
16
+ getCapabilities(model: string): LLMCapabilities;
17
+ listModels(): Promise<string[]>;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../src/llm/router.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAM5D,UAAU,YAAY;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAG,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,SAAU,YAAW,WAAW;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAc;gBAElB,MAAM,EAAE,YAAY;IAKhC,OAAO,CAAC,MAAM,CAAC,KAAK;IAoBpB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IAI1D,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAAC,cAAc,CAAC;IAIlE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAIhD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe;IAI/C,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAGhC"}
@@ -0,0 +1,52 @@
1
+ // ============================================================
2
+ // LLM Router — provider-agnostic interface
3
+ // Supports: OpenAI, Anthropic, Google, Ollama, OpenAI-compatible
4
+ // ============================================================
5
+ import { OpenAIProvider } from './providers/openai.js';
6
+ import { AnthropicProvider } from './providers/anthropic.js';
7
+ import { GoogleProvider } from './providers/google.js';
8
+ import { OllamaProvider } from './providers/ollama.js';
9
+ export class LLMRouter {
10
+ name;
11
+ delegate;
12
+ constructor(config) {
13
+ this.name = config.provider;
14
+ this.delegate = LLMRouter.build(config);
15
+ }
16
+ static build(config) {
17
+ switch (config.provider) {
18
+ case 'openai':
19
+ return new OpenAIProvider(config.apiKey, config.baseUrl);
20
+ case 'anthropic':
21
+ return new AnthropicProvider(config.apiKey);
22
+ case 'google':
23
+ return new GoogleProvider(config.apiKey);
24
+ case 'ollama':
25
+ return new OllamaProvider(config.baseUrl ?? 'http://localhost:11434');
26
+ case 'openai-compatible':
27
+ if (!config.baseUrl)
28
+ throw new Error('openai-compatible provider requires a baseUrl');
29
+ return new OpenAIProvider(config.apiKey, config.baseUrl);
30
+ default: {
31
+ const _exhaustive = config.provider;
32
+ throw new Error(`Unknown LLM provider: ${String(_exhaustive)}`);
33
+ }
34
+ }
35
+ }
36
+ complete(options) {
37
+ return this.delegate.complete(options);
38
+ }
39
+ stream(options) {
40
+ return this.delegate.stream(options);
41
+ }
42
+ countTokens(text, model) {
43
+ return this.delegate.countTokens(text, model);
44
+ }
45
+ getCapabilities(model) {
46
+ return this.delegate.getCapabilities(model);
47
+ }
48
+ listModels() {
49
+ return this.delegate.listModels();
50
+ }
51
+ }
52
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../src/llm/router.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,2CAA2C;AAC3C,iEAAiE;AACjE,+DAA+D;AAU/D,OAAO,EAAE,cAAc,EAAE,MAAS,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAS,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAS,uBAAuB,CAAC;AAQ1D,MAAM,OAAO,SAAS;IACX,IAAI,CAAS;IACd,QAAQ,CAAc;IAE9B,YAAY,MAAoB;QAC9B,IAAI,CAAC,IAAI,GAAO,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,MAAoB;QACvC,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,KAAK,QAAQ;gBACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3D,KAAK,WAAW;gBACd,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9C,KAAK,QAAQ;gBACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3C,KAAK,QAAQ;gBACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,OAAO,IAAI,wBAAwB,CAAC,CAAC;YACxE,KAAK,mBAAmB;gBACtB,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBACtF,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3D,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,WAAW,GAAU,MAAM,CAAC,QAAQ,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,OAA0B;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,OAA0B;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,WAAW,CAAC,IAAY,EAAE,KAAa;QACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,eAAe,CAAC,KAAa;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { MemoryBlock, MemoryBlockType, MemoryReadOptions } from '@nexagent-cli/shared';
3
+ export declare class MemoryManager {
4
+ private db;
5
+ private agentName;
6
+ constructor(db: Database.Database, agentName: string);
7
+ read(opts?: MemoryReadOptions): Promise<MemoryBlock[]>;
8
+ getBlock(blockId: string): MemoryBlock | null;
9
+ upsertBlock(blockType: MemoryBlockType, content: string, blockId?: string): MemoryBlock;
10
+ deleteBlock(blockId: string): void;
11
+ archiveBlock(blockId: string): void;
12
+ pinBlock(blockId: string, pinned: boolean): void;
13
+ listAll(includeArchived?: boolean): MemoryBlock[];
14
+ private rowToBlock;
15
+ }
16
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../src/memory/manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAS5F,qBAAa,aAAa;IAEtB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS;gBADT,EAAE,EAAS,QAAQ,CAAC,QAAQ,EAC5B,SAAS,EAAE,MAAM;IAGrB,IAAI,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAiDhE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAO7C,WAAW,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW;IA8BvF,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKlC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAKhD,OAAO,CAAC,eAAe,UAAQ,GAAG,WAAW,EAAE;IAQ/C,OAAO,CAAC,UAAU;CAanB"}
@@ -0,0 +1,114 @@
1
+ // ============================================================
2
+ // MemoryManager — read/write persistent memory blocks
3
+ // Semantic search via basic keyword matching (sqlite-vss optional)
4
+ // ============================================================
5
+ import { generateId } from '@nexagent-cli/shared';
6
+ export class MemoryManager {
7
+ db;
8
+ agentName;
9
+ constructor(db, agentName) {
10
+ this.db = db;
11
+ this.agentName = agentName;
12
+ }
13
+ async read(opts = {}) {
14
+ const { semanticQuery, includeArchived = false, limit = 10, tokenBudget, pinFirst = true, } = opts;
15
+ let query = 'SELECT * FROM memory_blocks WHERE agent_name = ?';
16
+ const params = [this.agentName];
17
+ if (!includeArchived) {
18
+ query += ' AND archived = 0';
19
+ }
20
+ query += ' ORDER BY pinned DESC, updated_at DESC';
21
+ const rows = this.db.prepare(query).all(...params);
22
+ let blocks = rows.map(this.rowToBlock);
23
+ // Keyword relevance scoring for semantic-like filtering
24
+ if (semanticQuery) {
25
+ const keywords = semanticQuery.toLowerCase().split(/\s+/).filter(w => w.length > 3);
26
+ blocks = blocks
27
+ .map(b => ({
28
+ block: b,
29
+ score: keywords.reduce((s, kw) => s + (b.content.toLowerCase().includes(kw) ? 1 : 0), 0),
30
+ }))
31
+ .sort((a, b) => {
32
+ if (a.block.pinned !== b.block.pinned)
33
+ return a.block.pinned ? -1 : 1;
34
+ return b.score - a.score;
35
+ })
36
+ .map(({ block }) => block);
37
+ }
38
+ // Apply token budget
39
+ let selectedBlocks = [];
40
+ let usedTokens = 0;
41
+ for (const block of blocks) {
42
+ if (selectedBlocks.length >= limit)
43
+ break;
44
+ if (tokenBudget && usedTokens + block.tokenEstimate > tokenBudget)
45
+ continue;
46
+ selectedBlocks.push(block);
47
+ usedTokens += block.tokenEstimate;
48
+ }
49
+ return selectedBlocks;
50
+ }
51
+ getBlock(blockId) {
52
+ const row = this.db.prepare('SELECT * FROM memory_blocks WHERE id = ? AND agent_name = ?').get(blockId, this.agentName);
53
+ return row ? this.rowToBlock(row) : null;
54
+ }
55
+ upsertBlock(blockType, content, blockId) {
56
+ const now = Date.now();
57
+ const tokenEstimate = Math.ceil(content.length / 4);
58
+ if (blockId) {
59
+ const existing = this.getBlock(blockId);
60
+ if (existing) {
61
+ this.db.prepare(`
62
+ UPDATE memory_blocks
63
+ SET content = ?, version = version + 1, token_estimate = ?, updated_at = ?
64
+ WHERE id = ?
65
+ `).run(content, tokenEstimate, now, blockId);
66
+ return { ...existing, content, version: existing.version + 1, tokenEstimate, updatedAt: now };
67
+ }
68
+ }
69
+ // Create new block
70
+ const id = blockId ?? generateId();
71
+ this.db.prepare(`
72
+ INSERT INTO memory_blocks (id, agent_name, block_type, content, version, token_estimate, updated_at, pinned, archived, tags)
73
+ VALUES (?, ?, ?, ?, 1, ?, ?, 0, 0, '[]')
74
+ `).run(id, this.agentName, blockType, content, tokenEstimate, now);
75
+ return {
76
+ id, blockType, content, version: 1,
77
+ tokenEstimate, updatedAt: now,
78
+ pinned: false, archived: false, tags: [],
79
+ };
80
+ }
81
+ deleteBlock(blockId) {
82
+ this.db.prepare('DELETE FROM memory_blocks WHERE id = ? AND agent_name = ?')
83
+ .run(blockId, this.agentName);
84
+ }
85
+ archiveBlock(blockId) {
86
+ this.db.prepare('UPDATE memory_blocks SET archived = 1 WHERE id = ? AND agent_name = ?')
87
+ .run(blockId, this.agentName);
88
+ }
89
+ pinBlock(blockId, pinned) {
90
+ this.db.prepare('UPDATE memory_blocks SET pinned = ? WHERE id = ? AND agent_name = ?')
91
+ .run(pinned ? 1 : 0, blockId, this.agentName);
92
+ }
93
+ listAll(includeArchived = false) {
94
+ const q = includeArchived
95
+ ? 'SELECT * FROM memory_blocks WHERE agent_name = ? ORDER BY pinned DESC, updated_at DESC'
96
+ : 'SELECT * FROM memory_blocks WHERE agent_name = ? AND archived = 0 ORDER BY pinned DESC, updated_at DESC';
97
+ const rows = this.db.prepare(q).all(this.agentName);
98
+ return rows.map(this.rowToBlock);
99
+ }
100
+ rowToBlock(row) {
101
+ return {
102
+ id: row.id,
103
+ blockType: row.block_type,
104
+ content: row.content,
105
+ version: row.version,
106
+ tokenEstimate: row.token_estimate,
107
+ updatedAt: row.updated_at,
108
+ pinned: row.pinned === 1,
109
+ archived: row.archived === 1,
110
+ tags: JSON.parse(row.tags),
111
+ };
112
+ }
113
+ }
114
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/memory/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { AgentConfig, SafetyVerdict } from '@nexagent-cli/shared';
2
+ import type { ToolRegistry } from '../tools/registry.js';
3
+ export declare class SafetyGate {
4
+ private registry;
5
+ private rateState;
6
+ private loopCounts;
7
+ constructor(registry: ToolRegistry);
8
+ /** Reset loop counter at the start of each turn */
9
+ resetLoopCounter(sessionId: string): void;
10
+ check(toolName: string, args: Record<string, unknown>, config: AgentConfig, sessionId?: string): Promise<SafetyVerdict>;
11
+ private validateSchema;
12
+ private checkScope;
13
+ }
14
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../../../src/safety/gate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAWzD,qBAAa,UAAU;IAIT,OAAO,CAAC,QAAQ;IAH5B,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,UAAU,CAA6B;gBAE3B,QAAQ,EAAE,YAAY;IAE1C,mDAAmD;IACnD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAInC,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,MAAM,EAAI,WAAW,EACrB,SAAS,SAAY,GACpB,OAAO,CAAC,aAAa,CAAC;IAoEzB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,UAAU;CAgBnB"}
@@ -0,0 +1,102 @@
1
+ // ============================================================
2
+ // Safety Gate — 8 sequential checks before any tool runs
3
+ // All checks MUST pass or the tool call is rejected.
4
+ // ============================================================
5
+ import { resolve, relative, isAbsolute } from 'node:path';
6
+ import { GLOBAL_SHELL_BLOCKLIST } from '@nexagent-cli/shared';
7
+ const MAX_CALLS_PER_MINUTE = 60;
8
+ const MAX_LOOP_DEPTH = 8; // max tool calls in one agent turn
9
+ export class SafetyGate {
10
+ registry;
11
+ rateState = new Map();
12
+ loopCounts = new Map(); // sessionId → calls this turn
13
+ constructor(registry) {
14
+ this.registry = registry;
15
+ }
16
+ /** Reset loop counter at the start of each turn */
17
+ resetLoopCounter(sessionId) {
18
+ this.loopCounts.set(sessionId, 0);
19
+ }
20
+ async check(toolName, args, config, sessionId = 'default') {
21
+ // ── Check 1: Tool exists ─────────────────────────────────
22
+ const tool = this.registry.get(toolName);
23
+ if (!tool) {
24
+ return reject('tool_exists', `Unknown tool: "${toolName}"`);
25
+ }
26
+ // ── Check 2: Tool enabled ────────────────────────────────
27
+ if (!tool.enabled) {
28
+ return reject('tool_enabled', `Tool "${toolName}" is currently disabled`);
29
+ }
30
+ // ── Check 3: JSON schema validation ─────────────────────
31
+ const schemaError = this.validateSchema(args, tool.parameters.required ?? []);
32
+ if (schemaError) {
33
+ return reject('schema_valid', schemaError);
34
+ }
35
+ // ── Check 4: Workspace scope (file tools) ────────────────
36
+ const pathArg = typeof args['path'] === 'string' ? args['path'] : undefined;
37
+ if (pathArg && tool.permissions.some(p => p.startsWith('fs:'))) {
38
+ const scopeError = this.checkScope(pathArg, config.workspaceDir);
39
+ if (scopeError) {
40
+ return reject('workspace_scope', scopeError);
41
+ }
42
+ }
43
+ // ── Check 5: Global blocklist (shell commands) ───────────
44
+ const commandArg = typeof args['command'] === 'string' ? args['command'] : undefined;
45
+ if (commandArg) {
46
+ for (const blocked of GLOBAL_SHELL_BLOCKLIST) {
47
+ if (commandArg.toLowerCase().includes(blocked.toLowerCase())) {
48
+ return reject('blocklist', `Command matches global blocklist pattern: "${blocked}"`);
49
+ }
50
+ }
51
+ }
52
+ // ── Check 6: Risk level vs config ────────────────────────
53
+ if (config.safetyLevel === 'strict' && (tool.riskLevel === 'high' || tool.riskLevel === 'critical')) {
54
+ return reject('risk_level', `Tool "${toolName}" has risk level "${tool.riskLevel}" which is not allowed in strict safety mode`);
55
+ }
56
+ // ── Check 7: Loop guard ───────────────────────────────────
57
+ const loopCount = (this.loopCounts.get(sessionId) ?? 0) + 1;
58
+ this.loopCounts.set(sessionId, loopCount);
59
+ if (loopCount > MAX_LOOP_DEPTH) {
60
+ return reject('loop_guard', `Too many tool calls in one turn (${loopCount}/${MAX_LOOP_DEPTH}). Summarise results before continuing.`);
61
+ }
62
+ // ── Check 8: Rate limit ──────────────────────────────────
63
+ const rate = this.rateState.get(sessionId) ?? { callsThisMinute: 0, windowStart: Date.now() };
64
+ const now = Date.now();
65
+ if (now - rate.windowStart > 60_000) {
66
+ rate.callsThisMinute = 0;
67
+ rate.windowStart = now;
68
+ }
69
+ rate.callsThisMinute++;
70
+ this.rateState.set(sessionId, rate);
71
+ if (rate.callsThisMinute > MAX_CALLS_PER_MINUTE) {
72
+ return reject('rate_limit', `Rate limit exceeded: ${rate.callsThisMinute} calls in 60s (max ${MAX_CALLS_PER_MINUTE})`);
73
+ }
74
+ return { allowed: true };
75
+ }
76
+ // ── Helpers ─────────────────────────────────────────────────
77
+ validateSchema(args, required) {
78
+ for (const field of required) {
79
+ if (!(field in args) || args[field] === null || args[field] === undefined) {
80
+ return `Missing required parameter: "${field}"`;
81
+ }
82
+ }
83
+ return null;
84
+ }
85
+ checkScope(filePath, workspaceDir) {
86
+ // Resolve against workspace to catch traversal attempts
87
+ const abs = resolve(workspaceDir, filePath);
88
+ const rel = relative(workspaceDir, abs);
89
+ if (rel.startsWith('..') || isAbsolute(rel)) {
90
+ return `Path traversal denied: "${filePath}" resolves outside workspace "${workspaceDir}"`;
91
+ }
92
+ // Block absolute paths unless they're inside workspace
93
+ if (isAbsolute(filePath) && !filePath.startsWith(workspaceDir)) {
94
+ return `Absolute path "${filePath}" is outside workspace "${workspaceDir}"`;
95
+ }
96
+ return null;
97
+ }
98
+ }
99
+ function reject(check, reason) {
100
+ return { allowed: false, reason, checkFailed: check };
101
+ }
102
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../../src/safety/gate.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,yDAAyD;AACzD,qDAAqD;AACrD,+DAA+D;AAE/D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAS9D,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,cAAc,GAAU,CAAC,CAAC,CAAC,mCAAmC;AAEpE,MAAM,OAAO,UAAU;IAID;IAHZ,SAAS,GAAI,IAAI,GAAG,EAAqB,CAAC;IAC1C,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,8BAA8B;IAE9E,YAAoB,QAAsB;QAAtB,aAAQ,GAAR,QAAQ,CAAc;IAAG,CAAC;IAE9C,mDAAmD;IACnD,gBAAgB,CAAC,SAAiB;QAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,KAAK,CACT,QAAgB,EAChB,IAAiC,EACjC,MAAqB,EACrB,SAAS,GAAG,SAAS;QAGrB,4DAA4D;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,MAAM,CAAC,aAAa,EAAE,kBAAkB,QAAQ,GAAG,CAAC,CAAC;QAC9D,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,MAAM,CAAC,cAAc,EAAE,SAAS,QAAQ,yBAAyB,CAAC,CAAC;QAC5E,CAAC;QAED,2DAA2D;QAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC9E,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAC7C,CAAC;QAED,4DAA4D;QAC5D,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,IAAI,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;YACjE,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrF,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,MAAM,OAAO,IAAI,sBAAsB,EAAE,CAAC;gBAC7C,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC7D,OAAO,MAAM,CAAC,WAAW,EAAE,8CAA8C,OAAO,GAAG,CAAC,CAAC;gBACvF,CAAC;YACH,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,IAAI,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,UAAU,CAAC,EAAE,CAAC;YACpG,OAAO,MAAM,CAAC,YAAY,EAAE,SAAS,QAAQ,qBAAqB,IAAI,CAAC,SAAS,8CAA8C,CAAC,CAAC;QAClI,CAAC;QAED,6DAA6D;QAC7D,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC1C,IAAI,SAAS,GAAG,cAAc,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,YAAY,EAAE,oCAAoC,SAAS,IAAI,cAAc,yCAAyC,CAAC,CAAC;QACxI,CAAC;QAED,4DAA4D;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC9F,MAAM,GAAG,GAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,GAAG,MAAM,EAAE,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,WAAW,GAAO,GAAG,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,eAAe,GAAG,oBAAoB,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC,YAAY,EAAE,wBAAwB,IAAI,CAAC,eAAe,sBAAsB,oBAAoB,GAAG,CAAC,CAAC;QACzH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,+DAA+D;IAEvD,cAAc,CAAC,IAA6B,EAAE,QAAkB;QACtE,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC1E,OAAO,gCAAgC,KAAK,GAAG,CAAC;YAClD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,UAAU,CAAC,QAAgB,EAAE,YAAoB;QACvD,wDAAwD;QACxD,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAExC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO,2BAA2B,QAAQ,iCAAiC,YAAY,GAAG,CAAC;QAC7F,CAAC;QAED,uDAAuD;QACvD,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/D,OAAO,kBAAkB,QAAQ,2BAA2B,YAAY,GAAG,CAAC;QAC9E,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,SAAS,MAAM,CAAC,KAAa,EAAE,MAAc;IAC3C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { AgentConfig, LLMProvider } from '@nexagent-cli/shared';
2
+ import type { MemoryManager } from '../memory/manager.js';
3
+ import type { SessionStore } from '../db/session-store.js';
4
+ import type { AgentEventEmitter } from '../agent/loop.js';
5
+ export declare class SubagentOrchestrator {
6
+ private llm;
7
+ private memory;
8
+ private sessions;
9
+ private events;
10
+ private config;
11
+ constructor(llm: LLMProvider, memory: MemoryManager, sessions: SessionStore, events: AgentEventEmitter, config: AgentConfig);
12
+ runPostSession(sessionId: string): Promise<void>;
13
+ /** Skill Scanner: detect new tools/patterns the agent should learn */
14
+ private runSkillScanner;
15
+ /** Prompt Improver: suggest better system prompt based on session */
16
+ private runPromptImprover;
17
+ /** Context Refiner: compress/archive old conversation summaries */
18
+ private runContextRefiner;
19
+ }
20
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../../src/subagents/orchestrator.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAQ,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAS,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;gBAJN,GAAG,EAAO,WAAW,EACrB,MAAM,EAAI,aAAa,EACvB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAI,iBAAiB,EAC3B,MAAM,EAAI,WAAW;IAGzB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCtD,sEAAsE;YACxD,eAAe;IAmC7B,qEAAqE;YACvD,iBAAiB;IAgD/B,mEAAmE;YACrD,iBAAiB;CA6BhC"}
@@ -0,0 +1,151 @@
1
+ // ============================================================
2
+ // Subagent Orchestrator — post-session background intelligence
3
+ // Runs: Skill Scanner, Prompt Improver, Context Refiner
4
+ // All operate on read-only memory snapshots.
5
+ // Writes go through proposal queue, NOT direct memory writes.
6
+ // ============================================================
7
+ export class SubagentOrchestrator {
8
+ llm;
9
+ memory;
10
+ sessions;
11
+ events;
12
+ config;
13
+ constructor(llm, memory, sessions, events, config) {
14
+ this.llm = llm;
15
+ this.memory = memory;
16
+ this.sessions = sessions;
17
+ this.events = events;
18
+ this.config = config;
19
+ }
20
+ async runPostSession(sessionId) {
21
+ const turns = this.sessions.getTurns(sessionId);
22
+ if (turns.length < 2)
23
+ return; // Not enough data to learn from
24
+ const conversationText = turns
25
+ .map(t => `${t.role.toUpperCase()}: ${t.content.slice(0, 500)}`)
26
+ .join('\n\n');
27
+ // Run subagents in parallel (read-only)
28
+ const [skillResult, improverResult, refinerResult] = await Promise.allSettled([
29
+ this.runSkillScanner(conversationText),
30
+ this.runPromptImprover(conversationText),
31
+ this.runContextRefiner(conversationText, sessionId),
32
+ ]);
33
+ // Log any errors silently (subagents must never crash the main flow)
34
+ for (const [name, result] of [
35
+ ['skill_scanner', skillResult],
36
+ ['prompt_improver', improverResult],
37
+ ['context_refiner', refinerResult],
38
+ ]) {
39
+ if (result.status === 'rejected') {
40
+ console.error(`[subagent:${name}] Error: ${String(result.reason)}`);
41
+ }
42
+ else {
43
+ this.events.emit('subagent:done', {
44
+ subagentType: name,
45
+ proposalCount: result.value,
46
+ });
47
+ }
48
+ }
49
+ }
50
+ /** Skill Scanner: detect new tools/patterns the agent should learn */
51
+ async runSkillScanner(conversationText) {
52
+ this.events.emit('subagent:spawn', {
53
+ subagentType: 'skill_scanner',
54
+ reason: 'Post-session skill analysis',
55
+ });
56
+ const prompt = [
57
+ 'You are a skill scanner analysing a conversation to identify reusable patterns.',
58
+ 'Review the conversation and identify:',
59
+ '1. Recurring task patterns that could be templated',
60
+ '2. User preferences revealed (coding style, file naming, etc.)',
61
+ '3. Domain knowledge demonstrated',
62
+ '',
63
+ 'Respond with a JSON object:',
64
+ '{ "patterns": [{ "type": "string", "description": "string", "example": "string" }] }',
65
+ '',
66
+ 'Conversation:',
67
+ conversationText.slice(0, 4000),
68
+ ].join('\n');
69
+ const response = await this.llm.complete({
70
+ model: this.config.model,
71
+ messages: [{ role: 'user', content: prompt }],
72
+ temperature: 0.3,
73
+ maxTokens: 512,
74
+ });
75
+ try {
76
+ const parsed = JSON.parse(response.content);
77
+ return parsed.patterns?.length ?? 0;
78
+ }
79
+ catch {
80
+ return 0;
81
+ }
82
+ }
83
+ /** Prompt Improver: suggest better system prompt based on session */
84
+ async runPromptImprover(conversationText) {
85
+ this.events.emit('subagent:spawn', {
86
+ subagentType: 'prompt_improver',
87
+ reason: 'Post-session prompt analysis',
88
+ });
89
+ const currentMemory = await this.memory.read({ limit: 5 });
90
+ const memoryText = currentMemory.map(b => `[${b.blockType}]: ${b.content.slice(0, 200)}`).join('\n');
91
+ const prompt = [
92
+ 'You are a prompt improver. Based on the conversation and current memory,',
93
+ 'identify if any memory blocks should be updated to better serve the user.',
94
+ '',
95
+ 'Current memory blocks:',
96
+ memoryText || '(empty)',
97
+ '',
98
+ 'Conversation excerpt:',
99
+ conversationText.slice(0, 2000),
100
+ '',
101
+ 'If you identify improvements, respond with JSON:',
102
+ '{ "updates": [{ "blockType": "string", "content": "string", "rationale": "string" }] }',
103
+ 'Otherwise respond with: { "updates": [] }',
104
+ ].join('\n');
105
+ const response = await this.llm.complete({
106
+ model: this.config.model,
107
+ messages: [{ role: 'user', content: prompt }],
108
+ temperature: 0.2,
109
+ maxTokens: 512,
110
+ });
111
+ try {
112
+ const parsed = JSON.parse(response.content);
113
+ // Queue proposals (don't write directly)
114
+ for (const update of parsed.updates ?? []) {
115
+ this.memory.upsertBlock(update.blockType, update.content);
116
+ }
117
+ return parsed.updates?.length ?? 0;
118
+ }
119
+ catch {
120
+ return 0;
121
+ }
122
+ }
123
+ /** Context Refiner: compress/archive old conversation summaries */
124
+ async runContextRefiner(conversationText, _sessionId) {
125
+ this.events.emit('subagent:spawn', {
126
+ subagentType: 'context_refiner',
127
+ reason: 'Post-session context compression',
128
+ });
129
+ const prompt = [
130
+ 'You are a context refiner. Summarise the key facts from this conversation',
131
+ 'that should be remembered for future sessions. Be concise (max 200 words).',
132
+ '',
133
+ 'Conversation:',
134
+ conversationText.slice(0, 3000),
135
+ '',
136
+ 'Respond with ONLY the summary text, no JSON.',
137
+ ].join('\n');
138
+ const response = await this.llm.complete({
139
+ model: this.config.model,
140
+ messages: [{ role: 'user', content: prompt }],
141
+ temperature: 0.2,
142
+ maxTokens: 300,
143
+ });
144
+ if (response.content.trim().length > 20) {
145
+ this.memory.upsertBlock('conversation_summary', response.content.trim());
146
+ return 1;
147
+ }
148
+ return 0;
149
+ }
150
+ }
151
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../../src/subagents/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Tool, ToolContext, ToolResult, JSONSchemaObject } from '@nexagent-cli/shared';
2
+ export declare class FileDeleteTool implements Tool {
3
+ name: string;
4
+ version: string;
5
+ description: string;
6
+ enabled: boolean;
7
+ riskLevel: "critical";
8
+ permissions: readonly ["fs:delete"];
9
+ parameters: JSONSchemaObject;
10
+ execute(args: unknown, ctx: ToolContext): Promise<ToolResult>;
11
+ dryRun(args: unknown, _ctx: ToolContext): Promise<string>;
12
+ private rmRecursive;
13
+ private resolveSafe;
14
+ }
15
+ //# sourceMappingURL=file-delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-delete.d.ts","sourceRoot":"","sources":["../../../../src/tools/file-delete.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG5F,qBAAa,cAAe,YAAW,IAAI;IACzC,IAAI,SAAwB;IAC5B,OAAO,SAAe;IACtB,WAAW,SAAqJ;IAChK,OAAO,UAAY;IACnB,SAAS,EAAK,UAAU,CAAU;IAClC,WAAW,yBAA0B;IAErC,UAAU,EAAE,gBAAgB,CAa1B;IAEI,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAwC7D,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;YAKjD,WAAW;IAgBzB,OAAO,CAAC,WAAW;CAQpB"}