@yuihub/server 1.0.0-beta.10

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 (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/dist/api/text-process.d.ts +2 -0
  4. package/dist/api/text-process.d.ts.map +1 -0
  5. package/dist/api/text-process.js +48 -0
  6. package/dist/api/text-process.js.map +1 -0
  7. package/dist/auth.d.ts +30 -0
  8. package/dist/auth.d.ts.map +1 -0
  9. package/dist/auth.js +71 -0
  10. package/dist/auth.js.map +1 -0
  11. package/dist/cli/setup.d.ts +2 -0
  12. package/dist/cli/setup.d.ts.map +1 -0
  13. package/dist/cli/setup.js +120 -0
  14. package/dist/cli/setup.js.map +1 -0
  15. package/dist/config/schema.d.ts +334 -0
  16. package/dist/config/schema.d.ts.map +1 -0
  17. package/dist/config/schema.js +45 -0
  18. package/dist/config/schema.js.map +1 -0
  19. package/dist/config/service.d.ts +12 -0
  20. package/dist/config/service.d.ts.map +1 -0
  21. package/dist/config/service.js +81 -0
  22. package/dist/config/service.js.map +1 -0
  23. package/dist/engine/agent/context.d.ts +35 -0
  24. package/dist/engine/agent/context.d.ts.map +1 -0
  25. package/dist/engine/agent/context.js +72 -0
  26. package/dist/engine/agent/context.js.map +1 -0
  27. package/dist/engine/agent/core.d.ts +19 -0
  28. package/dist/engine/agent/core.d.ts.map +1 -0
  29. package/dist/engine/agent/core.js +67 -0
  30. package/dist/engine/agent/core.js.map +1 -0
  31. package/dist/engine/agent/live-context.d.ts +8 -0
  32. package/dist/engine/agent/live-context.d.ts.map +1 -0
  33. package/dist/engine/agent/live-context.js +19 -0
  34. package/dist/engine/agent/live-context.js.map +1 -0
  35. package/dist/engine/agent/tools/fs.d.ts +16 -0
  36. package/dist/engine/agent/tools/fs.d.ts.map +1 -0
  37. package/dist/engine/agent/tools/fs.js +78 -0
  38. package/dist/engine/agent/tools/fs.js.map +1 -0
  39. package/dist/engine/agent/tools/memory.d.ts +18 -0
  40. package/dist/engine/agent/tools/memory.d.ts.map +1 -0
  41. package/dist/engine/agent/tools/memory.js +51 -0
  42. package/dist/engine/agent/tools/memory.js.map +1 -0
  43. package/dist/engine/ai/local-genai-service.d.ts +22 -0
  44. package/dist/engine/ai/local-genai-service.d.ts.map +1 -0
  45. package/dist/engine/ai/local-genai-service.js +158 -0
  46. package/dist/engine/ai/local-genai-service.js.map +1 -0
  47. package/dist/engine/ai/registry.d.ts +16 -0
  48. package/dist/engine/ai/registry.d.ts.map +1 -0
  49. package/dist/engine/ai/registry.js +78 -0
  50. package/dist/engine/ai/registry.js.map +1 -0
  51. package/dist/engine/ai/tools.d.ts +7 -0
  52. package/dist/engine/ai/tools.d.ts.map +1 -0
  53. package/dist/engine/ai/tools.js +2 -0
  54. package/dist/engine/ai/tools.js.map +1 -0
  55. package/dist/engine/ai/types.d.ts +21 -0
  56. package/dist/engine/ai/types.d.ts.map +1 -0
  57. package/dist/engine/ai/types.js +2 -0
  58. package/dist/engine/ai/types.js.map +1 -0
  59. package/dist/engine/ai/vertex-genai-service.d.ts +13 -0
  60. package/dist/engine/ai/vertex-genai-service.d.ts.map +1 -0
  61. package/dist/engine/ai/vertex-genai-service.js +93 -0
  62. package/dist/engine/ai/vertex-genai-service.js.map +1 -0
  63. package/dist/engine/chunker.d.ts +19 -0
  64. package/dist/engine/chunker.d.ts.map +1 -0
  65. package/dist/engine/chunker.js +79 -0
  66. package/dist/engine/chunker.js.map +1 -0
  67. package/dist/engine/composite-vector-store.d.ts +21 -0
  68. package/dist/engine/composite-vector-store.d.ts.map +1 -0
  69. package/dist/engine/composite-vector-store.js +69 -0
  70. package/dist/engine/composite-vector-store.js.map +1 -0
  71. package/dist/engine/embeddings/local-service.d.ts +10 -0
  72. package/dist/engine/embeddings/local-service.d.ts.map +1 -0
  73. package/dist/engine/embeddings/local-service.js +37 -0
  74. package/dist/engine/embeddings/local-service.js.map +1 -0
  75. package/dist/engine/embeddings/types.d.ts +10 -0
  76. package/dist/engine/embeddings/types.d.ts.map +1 -0
  77. package/dist/engine/embeddings/types.js +2 -0
  78. package/dist/engine/embeddings/types.js.map +1 -0
  79. package/dist/engine/embeddings/vertex-service.d.ts +11 -0
  80. package/dist/engine/embeddings/vertex-service.d.ts.map +1 -0
  81. package/dist/engine/embeddings/vertex-service.js +45 -0
  82. package/dist/engine/embeddings/vertex-service.js.map +1 -0
  83. package/dist/engine/indexer.d.ts +12 -0
  84. package/dist/engine/indexer.d.ts.map +1 -0
  85. package/dist/engine/indexer.js +74 -0
  86. package/dist/engine/indexer.js.map +1 -0
  87. package/dist/engine/lock.d.ts +24 -0
  88. package/dist/engine/lock.d.ts.map +1 -0
  89. package/dist/engine/lock.js +58 -0
  90. package/dist/engine/lock.js.map +1 -0
  91. package/dist/engine/schema.d.ts +19 -0
  92. package/dist/engine/schema.d.ts.map +1 -0
  93. package/dist/engine/schema.js +18 -0
  94. package/dist/engine/schema.js.map +1 -0
  95. package/dist/engine/vector-store-types.d.ts +24 -0
  96. package/dist/engine/vector-store-types.d.ts.map +1 -0
  97. package/dist/engine/vector-store-types.js +2 -0
  98. package/dist/engine/vector-store-types.js.map +1 -0
  99. package/dist/engine/vector-store.d.ts +21 -0
  100. package/dist/engine/vector-store.d.ts.map +1 -0
  101. package/dist/engine/vector-store.js +105 -0
  102. package/dist/engine/vector-store.js.map +1 -0
  103. package/dist/engine/watcher.d.ts +16 -0
  104. package/dist/engine/watcher.d.ts.map +1 -0
  105. package/dist/engine/watcher.js +94 -0
  106. package/dist/engine/watcher.js.map +1 -0
  107. package/dist/server.d.ts +3 -0
  108. package/dist/server.d.ts.map +1 -0
  109. package/dist/server.js +361 -0
  110. package/dist/server.js.map +1 -0
  111. package/dist/sync/github-provider.d.ts +20 -0
  112. package/dist/sync/github-provider.d.ts.map +1 -0
  113. package/dist/sync/github-provider.js +80 -0
  114. package/dist/sync/github-provider.js.map +1 -0
  115. package/dist/sync/scheduler.d.ts +18 -0
  116. package/dist/sync/scheduler.d.ts.map +1 -0
  117. package/dist/sync/scheduler.js +67 -0
  118. package/dist/sync/scheduler.js.map +1 -0
  119. package/package.json +78 -0
@@ -0,0 +1,67 @@
1
+ import { FSTools, FSToolImplementations } from './tools/fs.js';
2
+ import { MemoryTools, MemoryToolImplementations } from './tools/memory.js';
3
+ import { AgentContext } from './context.js';
4
+ export class Agent {
5
+ genAI;
6
+ rootDir;
7
+ dataDir;
8
+ sessionId;
9
+ maxTurns = 10;
10
+ context = null;
11
+ constructor(config) {
12
+ this.genAI = config.genAI;
13
+ this.rootDir = config.rootDir;
14
+ this.dataDir = config.dataDir;
15
+ this.sessionId = config.sessionId || `agent-${Date.now()}`;
16
+ }
17
+ async run(prompt, contextStr) {
18
+ // Initialize AgentContext for this session
19
+ this.context = await AgentContext.loadOrCreate(this.sessionId, this.dataDir);
20
+ // Construct system prompt with tools and context
21
+ let messages = [
22
+ `System: You are YuiHub Autonomous Agent. You have access to the file system and memory tools.`,
23
+ `Context: ${contextStr || 'No additional context provided.'}`,
24
+ `User: ${prompt}`
25
+ ];
26
+ let currentPrompt = messages.join('\n\n');
27
+ const tools = [...FSTools, ...MemoryTools];
28
+ for (let i = 0; i < this.maxTurns; i++) {
29
+ console.log(`[Agent] Turn ${i + 1}/${this.maxTurns}`);
30
+ const result = await this.genAI.generate(currentPrompt, tools);
31
+ if (result.toolCalls && result.toolCalls.length > 0) {
32
+ // Execute tools
33
+ let toolOutputs = "";
34
+ for (const call of result.toolCalls) {
35
+ console.log(`[Agent] Tool Call: ${call.name}`);
36
+ const output = await this.executeTool(call);
37
+ toolOutputs += `\nTool Output (${call.name}): ${output}\n`;
38
+ }
39
+ // Append result text (thought) and tool outputs to prompt for next turn
40
+ currentPrompt += `\n${result.text || ''}\n${toolOutputs}`;
41
+ }
42
+ else {
43
+ // Final answer - save context before returning
44
+ await this.context.save();
45
+ return result.text;
46
+ }
47
+ }
48
+ // Save context even on max turns
49
+ await this.context.save();
50
+ return "Agent max turns reached.";
51
+ }
52
+ async executeTool(call) {
53
+ const { name, args } = call;
54
+ // FS Tools dispatch
55
+ if (name in FSToolImplementations) {
56
+ const fn = FSToolImplementations[name];
57
+ return fn(args, this.rootDir);
58
+ }
59
+ // Memory Tools dispatch - requires context
60
+ if (name in MemoryToolImplementations && this.context) {
61
+ const fn = MemoryToolImplementations[name];
62
+ return fn(args, this.context);
63
+ }
64
+ return `Error: Tool ${name} not found.`;
65
+ }
66
+ }
67
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/agent/core.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAiB,MAAM,cAAc,CAAC;AAa3D,MAAM,OAAO,KAAK;IACN,KAAK,CAAgB;IACrB,OAAO,CAAS;IAChB,OAAO,CAAS;IAChB,SAAS,CAAS;IAClB,QAAQ,GAAW,EAAE,CAAC;IACtB,OAAO,GAAyB,IAAI,CAAC;IAE7C,YAAY,MAAmB;QAC3B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,UAAmB;QACzC,2CAA2C;QAC3C,IAAI,CAAC,OAAO,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7E,iDAAiD;QACjD,IAAI,QAAQ,GAAG;YACX,+FAA+F;YAC/F,YAAY,UAAU,IAAI,iCAAiC,EAAE;YAC7D,SAAS,MAAM,EAAE;SACpB,CAAC;QAEF,IAAI,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAc,CAAC,GAAG,OAAO,EAAE,GAAG,WAAW,CAAC,CAAC;QAEtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAEpD,MAAM,MAAM,GAAgB,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YAE5E,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClD,gBAAgB;gBAChB,IAAI,WAAW,GAAG,EAAE,CAAC;gBACrB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBAClC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;oBAC5C,WAAW,IAAI,kBAAkB,IAAI,CAAC,IAAI,MAAM,MAAM,IAAI,CAAC;gBAC/D,CAAC;gBAED,wEAAwE;gBACxE,aAAa,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,KAAK,WAAW,EAAE,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACJ,+CAA+C;gBAC/C,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC1B,OAAO,MAAM,CAAC,IAAI,CAAC;YACvB,CAAC;QACL,CAAC;QAED,iCAAiC;QACjC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1B,OAAO,0BAA0B,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAc;QACpC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAE5B,oBAAoB;QACpB,IAAI,IAAI,IAAI,qBAAqB,EAAE,CAAC;YAChC,MAAM,EAAE,GAAI,qBAAyF,CAAC,IAAI,CAAC,CAAC;YAC5G,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAED,2CAA2C;QAC3C,IAAI,IAAI,IAAI,yBAAyB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACpD,MAAM,EAAE,GAAI,yBAAgG,CAAC,IAAI,CAAC,CAAC;YACnH,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,eAAe,IAAI,aAAa,CAAC;IAC5C,CAAC;CACJ"}
@@ -0,0 +1,8 @@
1
+ export declare class LiveContextService {
2
+ private events;
3
+ private maxEvents;
4
+ constructor();
5
+ addEvent(type: string, path: string): void;
6
+ getSnapshot(): string;
7
+ }
8
+ //# sourceMappingURL=live-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-context.d.ts","sourceRoot":"","sources":["../../../src/engine/agent/live-context.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,SAAS,CAAc;;IAI/B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IASnC,WAAW,IAAI,MAAM;CAIxB"}
@@ -0,0 +1,19 @@
1
+ export class LiveContextService {
2
+ events = [];
3
+ maxEvents = 50;
4
+ constructor() { }
5
+ addEvent(type, path) {
6
+ const timestamp = new Date().toISOString();
7
+ const event = `[${timestamp}] ${type}: ${path}`;
8
+ this.events.push(event);
9
+ if (this.events.length > this.maxEvents) {
10
+ this.events.shift();
11
+ }
12
+ }
13
+ getSnapshot() {
14
+ if (this.events.length === 0)
15
+ return "No recent file changes.";
16
+ return "Recent File Changes:\n" + this.events.join('\n');
17
+ }
18
+ }
19
+ //# sourceMappingURL=live-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-context.js","sourceRoot":"","sources":["../../../src/engine/agent/live-context.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAkB;IACnB,MAAM,GAAa,EAAE,CAAC;IACtB,SAAS,GAAW,EAAE,CAAC;IAE/B,gBAAe,CAAC;IAEhB,QAAQ,CAAC,IAAY,EAAE,IAAY;QAC/B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI,KAAK,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACL,CAAC;IAED,WAAW;QACP,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,yBAAyB,CAAC;QAC/D,OAAO,wBAAwB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;CACJ"}
@@ -0,0 +1,16 @@
1
+ import { ToolDef } from '../../ai/tools.js';
2
+ export declare const FSTools: ToolDef[];
3
+ export declare const FSToolImplementations: {
4
+ list_files: (args: {
5
+ path: string;
6
+ depth?: number;
7
+ }, rootDir: string) => Promise<string>;
8
+ read_file: (args: {
9
+ path: string;
10
+ }, rootDir: string) => Promise<string>;
11
+ grep_search: (args: {
12
+ query: string;
13
+ path?: string;
14
+ }, rootDir: string) => Promise<string>;
15
+ };
16
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../../src/engine/agent/tools/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAS5C,eAAO,MAAM,OAAO,EAAE,OAAO,EAwB5B,CAAC;AAEF,eAAO,MAAM,qBAAqB;uBACP;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,WAAW,MAAM;sBAgBlD;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,WAAW,MAAM;wBAa/B;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,WAAW,MAAM;CAe5E,CAAC"}
@@ -0,0 +1,78 @@
1
+ import z from 'zod';
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+ import { exec } from 'child_process';
5
+ import util from 'util';
6
+ const execAsync = util.promisify(exec);
7
+ export const FSTools = [
8
+ {
9
+ name: 'list_files',
10
+ description: 'List files in a directory recursively. Respects .gitignore via fd or find if possible, otherwise simple scan.',
11
+ parameters: z.object({
12
+ path: z.string().describe('Relative path to list from root'),
13
+ depth: z.number().optional().describe('Depth to traverse'),
14
+ }),
15
+ },
16
+ {
17
+ name: 'read_file',
18
+ description: 'Read the contents of a file.',
19
+ parameters: z.object({
20
+ path: z.string().describe('Path to the file to read'),
21
+ }),
22
+ },
23
+ {
24
+ name: 'grep_search',
25
+ description: 'Search for a string or pattern in files.',
26
+ parameters: z.object({
27
+ query: z.string().describe('Search query (regex or text)'),
28
+ path: z.string().optional().describe('Path to search in'),
29
+ }),
30
+ },
31
+ ];
32
+ export const FSToolImplementations = {
33
+ list_files: async (args, rootDir) => {
34
+ const targetPath = path.resolve(rootDir, args.path || '.');
35
+ // Security check
36
+ if (!targetPath.startsWith(rootDir)) {
37
+ throw new Error('Access denied: Path outside root');
38
+ }
39
+ // Quick implementation using fs readdir recursive or find
40
+ try {
41
+ const result = await execAsync(`find "${targetPath}" -maxdepth ${args.depth || 2} -not -path '*/.*'`);
42
+ return result.stdout;
43
+ }
44
+ catch (e) {
45
+ return `Error listing files: ${e.message}`;
46
+ }
47
+ },
48
+ read_file: async (args, rootDir) => {
49
+ const targetPath = path.resolve(rootDir, args.path);
50
+ if (!targetPath.startsWith(rootDir)) {
51
+ throw new Error('Access denied: Path outside root');
52
+ }
53
+ try {
54
+ const content = await fs.readFile(targetPath, 'utf-8');
55
+ return content;
56
+ }
57
+ catch (e) {
58
+ return `Error reading file: ${e.message}`;
59
+ }
60
+ },
61
+ grep_search: async (args, rootDir) => {
62
+ const targetPath = path.resolve(rootDir, args.path || '.');
63
+ if (!targetPath.startsWith(rootDir)) {
64
+ throw new Error('Access denied: Path outside root');
65
+ }
66
+ try {
67
+ // Simple grep
68
+ const command = `grep -r "${args.query}" "${targetPath}" | head -n 20`;
69
+ const result = await execAsync(command);
70
+ return result.stdout || 'No matches found';
71
+ }
72
+ catch (e) {
73
+ // grep returns non-zero if no matches
74
+ return 'No matches found';
75
+ }
76
+ }
77
+ };
78
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../../src/engine/agent/tools/fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { ToolDef } from '../../ai/tools.js';
2
+ import { IAgentContext } from '../context.js';
3
+ export declare const MemoryTools: ToolDef[];
4
+ export declare const MemoryToolImplementations: {
5
+ create_checkpoint: (args: {
6
+ summary: string;
7
+ intent: string;
8
+ }, context: IAgentContext) => Promise<string>;
9
+ upsert_intent: (args: {
10
+ intent: string;
11
+ }, context: IAgentContext) => Promise<string>;
12
+ update_working_memory: (args: {
13
+ key: string;
14
+ value: unknown;
15
+ }, context: IAgentContext) => Promise<string>;
16
+ get_current_packet: (_args: Record<string, never>, context: IAgentContext) => Promise<string>;
17
+ };
18
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../src/engine/agent/tools/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,eAAO,MAAM,WAAW,EAAE,OAAO,EA6BhC,CAAC;AAGF,eAAO,MAAM,yBAAyB;8BACF;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,WAAW,aAAa;0BAI/D;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,WAAW,aAAa;kCAIlC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,WAAW,aAAa;gCAIzD,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,aAAa;CAIlF,CAAC"}
@@ -0,0 +1,51 @@
1
+ import z from 'zod';
2
+ export const MemoryTools = [
3
+ {
4
+ name: 'create_checkpoint',
5
+ description: 'Create a decision anchor (checkpoint) to save the current state and intent.',
6
+ parameters: z.object({
7
+ summary: z.string().describe('Short summary of what was achieved'),
8
+ intent: z.string().describe('The intent or goal capable of being resumed later'),
9
+ }),
10
+ },
11
+ {
12
+ name: 'upsert_intent',
13
+ description: 'Update the current working intent or goal.',
14
+ parameters: z.object({
15
+ intent: z.string(),
16
+ }),
17
+ },
18
+ {
19
+ name: 'update_working_memory',
20
+ description: 'Update the short-term working memory (scratchpad).',
21
+ parameters: z.object({
22
+ key: z.string(),
23
+ value: z.any(),
24
+ })
25
+ },
26
+ {
27
+ name: 'get_current_packet',
28
+ description: 'Retrieve the full current context packet.',
29
+ parameters: z.object({}),
30
+ }
31
+ ];
32
+ // Memory tool implementations - require IAgentContext
33
+ export const MemoryToolImplementations = {
34
+ create_checkpoint: async (args, context) => {
35
+ const checkpoint = await context.createCheckpoint(args.summary, args.intent);
36
+ return `Checkpoint created: ${checkpoint.id} | Intent: ${args.intent}`;
37
+ },
38
+ upsert_intent: async (args, context) => {
39
+ context.setIntent(args.intent);
40
+ return `Intent updated to: ${args.intent}`;
41
+ },
42
+ update_working_memory: async (args, context) => {
43
+ context.setWorkingMemory(args.key, args.value);
44
+ return `Working memory updated: ${args.key} = ${JSON.stringify(args.value)}`;
45
+ },
46
+ get_current_packet: async (_args, context) => {
47
+ const packet = context.getPacket();
48
+ return JSON.stringify(packet, null, 2);
49
+ }
50
+ };
51
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../../src/engine/agent/tools/memory.ts"],"names":[],"mappings":"AACA,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB,MAAM,CAAC,MAAM,WAAW,GAAc;IACpC;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,6EAA6E;QAC1F,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YAClE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;SACjF,CAAC;KACH;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,4CAA4C;QACzD,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;SACnB,CAAC;KACH;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,oDAAoD;QACjE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACjB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;YACf,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE;SACjB,CAAC;KACH;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,2CAA2C;QACxD,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACzB;CACF,CAAC;AAEF,sDAAsD;AACtD,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACrC,iBAAiB,EAAE,KAAK,EAAE,IAAyC,EAAE,OAAsB,EAAE,EAAE;QAC3F,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7E,OAAO,uBAAuB,UAAU,CAAC,EAAE,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC;IAC3E,CAAC;IACD,aAAa,EAAE,KAAK,EAAE,IAAwB,EAAE,OAAsB,EAAE,EAAE;QACtE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,sBAAsB,IAAI,CAAC,MAAM,EAAE,CAAC;IAC/C,CAAC;IACD,qBAAqB,EAAE,KAAK,EAAE,IAAqC,EAAE,OAAsB,EAAE,EAAE;QAC3F,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,OAAO,2BAA2B,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACjF,CAAC;IACD,kBAAkB,EAAE,KAAK,EAAE,KAA4B,EAAE,OAAsB,EAAE,EAAE;QAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;CACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * LocalGenAIService - Ollama-based Local GenAI Service
3
+ * Implements IGenAIService interface for local model inference
4
+ */
5
+ import { IGenAIService, GenAIResult } from './types.js';
6
+ import { ToolDef } from './tools.js';
7
+ export declare class LocalGenAIService implements IGenAIService {
8
+ private baseUrl;
9
+ private modelName;
10
+ constructor(config?: {
11
+ baseUrl?: string;
12
+ model?: string;
13
+ });
14
+ init(): Promise<void>;
15
+ getModelName(): string;
16
+ generate(prompt: string, tools?: ToolDef[]): Promise<GenAIResult>;
17
+ stream(prompt: string, _tools?: ToolDef[]): AsyncGenerator<string>;
18
+ private zodToSimpleSchema;
19
+ private getZodType;
20
+ private getRequiredFields;
21
+ }
22
+ //# sourceMappingURL=local-genai-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-genai-service.d.ts","sourceRoot":"","sources":["../../../src/engine/ai/local-genai-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAqBrC,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO;IAKvD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,YAAY,IAAI,MAAM;IAIhB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAwDhE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC;IAuCzE,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,iBAAiB;CAe1B"}
@@ -0,0 +1,158 @@
1
+ export class LocalGenAIService {
2
+ baseUrl;
3
+ modelName;
4
+ constructor(config = {}) {
5
+ this.baseUrl = config.baseUrl || process.env.OLLAMA_BASE_URL || 'http://localhost:11434';
6
+ this.modelName = config.model || 'qwen2.5:7b';
7
+ }
8
+ async init() {
9
+ // Verify Ollama is available
10
+ try {
11
+ const response = await fetch(`${this.baseUrl}/api/tags`);
12
+ if (!response.ok) {
13
+ throw new Error(`Ollama not available at ${this.baseUrl}`);
14
+ }
15
+ console.log(`[LocalGenAI] Connected to Ollama at ${this.baseUrl}, using model: ${this.modelName}`);
16
+ }
17
+ catch (error) {
18
+ console.error(`[LocalGenAI] Failed to connect to Ollama:`, error);
19
+ throw new Error(`Ollama not available at ${this.baseUrl}. Make sure Ollama is running.`);
20
+ }
21
+ }
22
+ getModelName() {
23
+ return this.modelName;
24
+ }
25
+ async generate(prompt, tools) {
26
+ const messages = [{ role: 'user', content: prompt }];
27
+ const requestBody = {
28
+ model: this.modelName,
29
+ messages,
30
+ stream: false,
31
+ };
32
+ // Ollama tool calling support (if tools provided)
33
+ if (tools && tools.length > 0) {
34
+ // Ollama uses OpenAI-compatible tool format
35
+ requestBody.tools = tools.map(t => ({
36
+ type: 'function',
37
+ function: {
38
+ name: t.name,
39
+ description: t.description,
40
+ parameters: {
41
+ type: 'object',
42
+ properties: this.zodToSimpleSchema(t.parameters),
43
+ required: this.getRequiredFields(t.parameters),
44
+ },
45
+ },
46
+ }));
47
+ }
48
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
49
+ method: 'POST',
50
+ headers: { 'Content-Type': 'application/json' },
51
+ body: JSON.stringify(requestBody),
52
+ });
53
+ if (!response.ok) {
54
+ const errorText = await response.text();
55
+ throw new Error(`Ollama API error: ${response.status} - ${errorText}`);
56
+ }
57
+ const data = (await response.json());
58
+ const message = data.message;
59
+ const toolCalls = message.tool_calls?.map((tc, idx) => ({
60
+ name: tc.function.name,
61
+ args: tc.function.arguments,
62
+ id: `call_${idx}`,
63
+ }));
64
+ return {
65
+ text: message.content || '',
66
+ toolCalls: toolCalls && toolCalls.length > 0 ? toolCalls : undefined,
67
+ usage: {
68
+ promptTokens: data.prompt_eval_count || 0,
69
+ completionTokens: data.eval_count || 0,
70
+ },
71
+ };
72
+ }
73
+ async *stream(prompt, _tools) {
74
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
75
+ method: 'POST',
76
+ headers: { 'Content-Type': 'application/json' },
77
+ body: JSON.stringify({
78
+ model: this.modelName,
79
+ messages: [{ role: 'user', content: prompt }],
80
+ stream: true,
81
+ }),
82
+ });
83
+ if (!response.ok || !response.body) {
84
+ throw new Error(`Ollama streaming error: ${response.status}`);
85
+ }
86
+ const reader = response.body.getReader();
87
+ const decoder = new TextDecoder();
88
+ while (true) {
89
+ const { done, value } = await reader.read();
90
+ if (done)
91
+ break;
92
+ const chunk = decoder.decode(value, { stream: true });
93
+ const lines = chunk.split('\n').filter(line => line.trim());
94
+ for (const line of lines) {
95
+ try {
96
+ const parsed = JSON.parse(line);
97
+ if (parsed.message?.content) {
98
+ yield parsed.message.content;
99
+ }
100
+ }
101
+ catch {
102
+ // Skip malformed lines
103
+ }
104
+ }
105
+ }
106
+ }
107
+ // Simple Zod to JSON Schema converter for Ollama
108
+ zodToSimpleSchema(schema) {
109
+ if (!schema || !schema._def)
110
+ return {};
111
+ const shape = schema._def.shape?.();
112
+ if (!shape)
113
+ return {};
114
+ const properties = {};
115
+ for (const [key, value] of Object.entries(shape)) {
116
+ const fieldDef = value._def;
117
+ properties[key] = {
118
+ type: this.getZodType(fieldDef),
119
+ description: fieldDef.description || '',
120
+ };
121
+ }
122
+ return properties;
123
+ }
124
+ getZodType(def) {
125
+ if (!def)
126
+ return 'string';
127
+ const typeName = def.typeName;
128
+ if (typeName === 'ZodString')
129
+ return 'string';
130
+ if (typeName === 'ZodNumber')
131
+ return 'number';
132
+ if (typeName === 'ZodBoolean')
133
+ return 'boolean';
134
+ if (typeName === 'ZodArray')
135
+ return 'array';
136
+ if (typeName === 'ZodObject')
137
+ return 'object';
138
+ if (typeName === 'ZodOptional')
139
+ return this.getZodType(def.innerType?._def);
140
+ return 'string';
141
+ }
142
+ getRequiredFields(schema) {
143
+ if (!schema || !schema._def)
144
+ return [];
145
+ const shape = schema._def.shape?.();
146
+ if (!shape)
147
+ return [];
148
+ const required = [];
149
+ for (const [key, value] of Object.entries(shape)) {
150
+ const fieldDef = value._def;
151
+ if (fieldDef.typeName !== 'ZodOptional') {
152
+ required.push(key);
153
+ }
154
+ }
155
+ return required;
156
+ }
157
+ }
158
+ //# sourceMappingURL=local-genai-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-genai-service.js","sourceRoot":"","sources":["../../../src/engine/ai/local-genai-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { AppConfig } from '../../config/schema.js';
2
+ import { IEmbeddingService } from '../embeddings/types.js';
3
+ import { IGenAIService } from './types.js';
4
+ export declare class AIProviderRegistry {
5
+ private config;
6
+ private embeddingServices;
7
+ private genAIServices;
8
+ constructor(aiConfig: AppConfig['ai']);
9
+ getEmbeddingService(providerId?: string): Promise<IEmbeddingService>;
10
+ getAllEmbeddingServices(): Promise<{
11
+ id: string;
12
+ service: IEmbeddingService;
13
+ }[]>;
14
+ getGenAIService(providerId?: string): Promise<IGenAIService>;
15
+ }
16
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/engine/ai/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAM3C,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,iBAAiB,CAA6C;IACtE,OAAO,CAAC,aAAa,CAAyC;gBAElD,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC;IAI/B,mBAAmB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA2BpE,uBAAuB,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,iBAAiB,CAAA;KAAE,EAAE,CAAC;IAmBhF,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CA2BnE"}
@@ -0,0 +1,78 @@
1
+ import { VertexEmbeddingService } from '../embeddings/vertex-service.js';
2
+ import { LocalEmbeddingService } from '../embeddings/local-service.js';
3
+ import { VertexGenAIService } from './vertex-genai-service.js';
4
+ import { LocalGenAIService } from './local-genai-service.js';
5
+ export class AIProviderRegistry {
6
+ config;
7
+ embeddingServices = new Map();
8
+ genAIServices = new Map();
9
+ constructor(aiConfig) {
10
+ this.config = aiConfig;
11
+ }
12
+ async getEmbeddingService(providerId) {
13
+ const id = providerId || this.config.defaults.embedding[0] || 'local';
14
+ if (this.embeddingServices.has(id)) {
15
+ return this.embeddingServices.get(id);
16
+ }
17
+ const providerConfig = this.config.providers[id];
18
+ if (!providerConfig) {
19
+ throw new Error(`Provider config not found for id: ${id}`);
20
+ }
21
+ let service;
22
+ if (providerConfig.type === 'local') {
23
+ service = new LocalEmbeddingService(providerConfig.embeddingModel);
24
+ }
25
+ else if (providerConfig.type === 'vertex') {
26
+ service = new VertexEmbeddingService(providerConfig);
27
+ }
28
+ else {
29
+ throw new Error(`Unknown provider type: ${providerConfig.type}`);
30
+ }
31
+ await service.init();
32
+ this.embeddingServices.set(id, service);
33
+ return service;
34
+ }
35
+ async getAllEmbeddingServices() {
36
+ // 1. Identify all embedding providers from config
37
+ const embeddingProviderIds = this.config.defaults.embedding; // e.g. ['local', 'vertex']
38
+ const results = [];
39
+ for (const id of embeddingProviderIds) {
40
+ try {
41
+ const service = await this.getEmbeddingService(id);
42
+ results.push({ id, service });
43
+ }
44
+ catch (err) {
45
+ console.error(`[AI] Failed to initialize embedding provider '${id}':`, err);
46
+ // We continue to allow partial functionality?
47
+ // Or throw? Dual embedding implies redundancy, but if primary fails?
48
+ // Let's log and continue for now (Lazy / Partial support).
49
+ }
50
+ }
51
+ return results;
52
+ }
53
+ async getGenAIService(providerId) {
54
+ const id = providerId || this.config.defaults.agent;
55
+ if (this.genAIServices.has(id)) {
56
+ return this.genAIServices.get(id);
57
+ }
58
+ const providerConfig = this.config.providers[id];
59
+ if (!providerConfig) {
60
+ // Fallback for bootstrap or minimal config?
61
+ throw new Error(`Provider config not found for id: ${id}`);
62
+ }
63
+ let service;
64
+ if (providerConfig.type === 'local') {
65
+ service = new LocalGenAIService({});
66
+ }
67
+ else if (providerConfig.type === 'vertex') {
68
+ service = new VertexGenAIService(providerConfig);
69
+ }
70
+ else {
71
+ throw new Error(`Unknown provider type: ${providerConfig.type}`);
72
+ }
73
+ await service.init();
74
+ this.genAIServices.set(id, service);
75
+ return service;
76
+ }
77
+ }
78
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/engine/ai/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import z from 'zod';
2
+ export interface ToolDef {
3
+ name: string;
4
+ description: string;
5
+ parameters: z.ZodType<any>;
6
+ }
7
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/engine/ai/tools.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/engine/ai/tools.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { ToolDef } from './tools.js';
2
+ export interface ToolCall {
3
+ name: string;
4
+ args: Record<string, any>;
5
+ id?: string;
6
+ }
7
+ export interface GenAIResult {
8
+ text: string;
9
+ toolCalls?: ToolCall[];
10
+ usage?: {
11
+ promptTokens: number;
12
+ completionTokens: number;
13
+ };
14
+ }
15
+ export interface IGenAIService {
16
+ init(): Promise<void>;
17
+ generate(prompt: string, tools?: ToolDef[]): Promise<GenAIResult>;
18
+ stream(prompt: string, tools?: ToolDef[]): AsyncGenerator<string>;
19
+ getModelName(): string;
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map