@yuihub/server 1.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/LICENSE +21 -0
  2. package/dist/api/text-process.d.ts +2 -0
  3. package/dist/api/text-process.d.ts.map +1 -0
  4. package/dist/api/text-process.js +48 -0
  5. package/dist/api/text-process.js.map +1 -0
  6. package/dist/auth.d.ts +30 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +71 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/cli/setup.d.ts +2 -0
  11. package/dist/cli/setup.d.ts.map +1 -0
  12. package/dist/cli/setup.js +120 -0
  13. package/dist/cli/setup.js.map +1 -0
  14. package/dist/config/schema.d.ts +334 -0
  15. package/dist/config/schema.d.ts.map +1 -0
  16. package/dist/config/schema.js +45 -0
  17. package/dist/config/schema.js.map +1 -0
  18. package/dist/config/service.d.ts +12 -0
  19. package/dist/config/service.d.ts.map +1 -0
  20. package/dist/config/service.js +81 -0
  21. package/dist/config/service.js.map +1 -0
  22. package/dist/engine/agent/context.d.ts +35 -0
  23. package/dist/engine/agent/context.d.ts.map +1 -0
  24. package/dist/engine/agent/context.js +72 -0
  25. package/dist/engine/agent/context.js.map +1 -0
  26. package/dist/engine/agent/core.d.ts +19 -0
  27. package/dist/engine/agent/core.d.ts.map +1 -0
  28. package/dist/engine/agent/core.js +67 -0
  29. package/dist/engine/agent/core.js.map +1 -0
  30. package/dist/engine/agent/live-context.d.ts +8 -0
  31. package/dist/engine/agent/live-context.d.ts.map +1 -0
  32. package/dist/engine/agent/live-context.js +19 -0
  33. package/dist/engine/agent/live-context.js.map +1 -0
  34. package/dist/engine/agent/tools/fs.d.ts +16 -0
  35. package/dist/engine/agent/tools/fs.d.ts.map +1 -0
  36. package/dist/engine/agent/tools/fs.js +78 -0
  37. package/dist/engine/agent/tools/fs.js.map +1 -0
  38. package/dist/engine/agent/tools/memory.d.ts +18 -0
  39. package/dist/engine/agent/tools/memory.d.ts.map +1 -0
  40. package/dist/engine/agent/tools/memory.js +51 -0
  41. package/dist/engine/agent/tools/memory.js.map +1 -0
  42. package/dist/engine/ai/local-genai-service.d.ts +22 -0
  43. package/dist/engine/ai/local-genai-service.d.ts.map +1 -0
  44. package/dist/engine/ai/local-genai-service.js +158 -0
  45. package/dist/engine/ai/local-genai-service.js.map +1 -0
  46. package/dist/engine/ai/registry.d.ts +16 -0
  47. package/dist/engine/ai/registry.d.ts.map +1 -0
  48. package/dist/engine/ai/registry.js +78 -0
  49. package/dist/engine/ai/registry.js.map +1 -0
  50. package/dist/engine/ai/tools.d.ts +7 -0
  51. package/dist/engine/ai/tools.d.ts.map +1 -0
  52. package/dist/engine/ai/tools.js +2 -0
  53. package/dist/engine/ai/tools.js.map +1 -0
  54. package/dist/engine/ai/types.d.ts +21 -0
  55. package/dist/engine/ai/types.d.ts.map +1 -0
  56. package/dist/engine/ai/types.js +2 -0
  57. package/dist/engine/ai/types.js.map +1 -0
  58. package/dist/engine/ai/vertex-genai-service.d.ts +13 -0
  59. package/dist/engine/ai/vertex-genai-service.d.ts.map +1 -0
  60. package/dist/engine/ai/vertex-genai-service.js +93 -0
  61. package/dist/engine/ai/vertex-genai-service.js.map +1 -0
  62. package/dist/engine/chunker.d.ts +19 -0
  63. package/dist/engine/chunker.d.ts.map +1 -0
  64. package/dist/engine/chunker.js +79 -0
  65. package/dist/engine/chunker.js.map +1 -0
  66. package/dist/engine/composite-vector-store.d.ts +21 -0
  67. package/dist/engine/composite-vector-store.d.ts.map +1 -0
  68. package/dist/engine/composite-vector-store.js +69 -0
  69. package/dist/engine/composite-vector-store.js.map +1 -0
  70. package/dist/engine/embeddings/local-service.d.ts +10 -0
  71. package/dist/engine/embeddings/local-service.d.ts.map +1 -0
  72. package/dist/engine/embeddings/local-service.js +37 -0
  73. package/dist/engine/embeddings/local-service.js.map +1 -0
  74. package/dist/engine/embeddings/types.d.ts +10 -0
  75. package/dist/engine/embeddings/types.d.ts.map +1 -0
  76. package/dist/engine/embeddings/types.js +2 -0
  77. package/dist/engine/embeddings/types.js.map +1 -0
  78. package/dist/engine/embeddings/vertex-service.d.ts +11 -0
  79. package/dist/engine/embeddings/vertex-service.d.ts.map +1 -0
  80. package/dist/engine/embeddings/vertex-service.js +45 -0
  81. package/dist/engine/embeddings/vertex-service.js.map +1 -0
  82. package/dist/engine/indexer.d.ts +12 -0
  83. package/dist/engine/indexer.d.ts.map +1 -0
  84. package/dist/engine/indexer.js +74 -0
  85. package/dist/engine/indexer.js.map +1 -0
  86. package/dist/engine/lock.d.ts +24 -0
  87. package/dist/engine/lock.d.ts.map +1 -0
  88. package/dist/engine/lock.js +58 -0
  89. package/dist/engine/lock.js.map +1 -0
  90. package/dist/engine/schema.d.ts +19 -0
  91. package/dist/engine/schema.d.ts.map +1 -0
  92. package/dist/engine/schema.js +18 -0
  93. package/dist/engine/schema.js.map +1 -0
  94. package/dist/engine/vector-store-types.d.ts +24 -0
  95. package/dist/engine/vector-store-types.d.ts.map +1 -0
  96. package/dist/engine/vector-store-types.js +2 -0
  97. package/dist/engine/vector-store-types.js.map +1 -0
  98. package/dist/engine/vector-store.d.ts +21 -0
  99. package/dist/engine/vector-store.d.ts.map +1 -0
  100. package/dist/engine/vector-store.js +105 -0
  101. package/dist/engine/vector-store.js.map +1 -0
  102. package/dist/engine/watcher.d.ts +16 -0
  103. package/dist/engine/watcher.d.ts.map +1 -0
  104. package/dist/engine/watcher.js +94 -0
  105. package/dist/engine/watcher.js.map +1 -0
  106. package/dist/server.d.ts +2 -0
  107. package/dist/server.d.ts.map +1 -0
  108. package/dist/server.js +360 -0
  109. package/dist/server.js.map +1 -0
  110. package/dist/sync/github-provider.d.ts +20 -0
  111. package/dist/sync/github-provider.d.ts.map +1 -0
  112. package/dist/sync/github-provider.js +80 -0
  113. package/dist/sync/github-provider.js.map +1 -0
  114. package/dist/sync/scheduler.d.ts +18 -0
  115. package/dist/sync/scheduler.d.ts.map +1 -0
  116. package/dist/sync/scheduler.js +67 -0
  117. package/dist/sync/scheduler.js.map +1 -0
  118. package/package.json +78 -0
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/engine/ai/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAClE,YAAY,IAAI,MAAM,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/engine/ai/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { IGenAIService, GenAIResult } from './types.js';
2
+ import { ToolDef } from './tools.js';
3
+ export declare class VertexGenAIService implements IGenAIService {
4
+ private config;
5
+ private client;
6
+ private model;
7
+ constructor(config: any);
8
+ init(): Promise<void>;
9
+ getModelName(): string;
10
+ generate(prompt: string, tools?: ToolDef[]): Promise<GenAIResult>;
11
+ stream(prompt: string, tools?: ToolDef[]): AsyncGenerator<string>;
12
+ }
13
+ //# sourceMappingURL=vertex-genai-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertex-genai-service.d.ts","sourceRoot":"","sources":["../../../src/engine/ai/vertex-genai-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAIrC,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,KAAK,CAAgC;gBAEjC,MAAM,EAAE,GAAG;IAIjB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,YAAY,IAAI,MAAM;IAIhB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA6DhE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC;CAYzE"}
@@ -0,0 +1,93 @@
1
+ import { VertexAI } from '@google-cloud/vertexai';
2
+ import { zodToJsonSchema } from 'zod-to-json-schema';
3
+ export class VertexGenAIService {
4
+ config; // VertexProviderConfig
5
+ client = null;
6
+ model = null;
7
+ constructor(config) {
8
+ this.config = config;
9
+ }
10
+ async init() {
11
+ if (!this.config.projectId || !this.config.location) {
12
+ console.warn("[Vertex] projectId or location missing in config. Attempting default or might fail.");
13
+ if (!this.config.projectId)
14
+ throw new Error("Vertex AI projectId missing");
15
+ if (!this.config.location)
16
+ throw new Error("Vertex AI location missing");
17
+ }
18
+ this.client = new VertexAI({
19
+ project: this.config.projectId,
20
+ location: this.config.location,
21
+ });
22
+ const modelName = this.getModelName();
23
+ this.model = this.client.getGenerativeModel({ model: modelName });
24
+ console.log(`[Vertex] Initializing GenAI Service: ${modelName}`);
25
+ }
26
+ getModelName() {
27
+ return this.config.chatModel || 'gemini-2.5-flash';
28
+ }
29
+ async generate(prompt, tools) {
30
+ if (!this.model)
31
+ await this.init();
32
+ const request = {
33
+ contents: [{ role: 'user', parts: [{ text: prompt }] }],
34
+ };
35
+ if (tools && tools.length > 0) {
36
+ // Map ToolDef to Vertex AI FunctionDeclaration
37
+ // Vertex AI expects { functionDeclarations: [...] } inside 'tools'
38
+ const functionDeclarations = tools.map(t => {
39
+ // Cast to any to avoid TypeScript infinite type instantiation error
40
+ const jsonSchema = zodToJsonSchema(t.parameters);
41
+ // Clean up schema for Vertex (remove $schema property)
42
+ delete jsonSchema.$schema;
43
+ return {
44
+ name: t.name,
45
+ description: t.description,
46
+ parameters: jsonSchema,
47
+ };
48
+ });
49
+ request.tools = [{ functionDeclarations }];
50
+ }
51
+ const result = await this.model.generateContent(request);
52
+ const response = result.response;
53
+ const candidate = response.candidates?.[0];
54
+ const content = candidate?.content;
55
+ let text = '';
56
+ const toolCalls = [];
57
+ if (content?.parts) {
58
+ for (const part of content.parts) {
59
+ if (part.text) {
60
+ text += part.text;
61
+ }
62
+ if (part.functionCall) {
63
+ toolCalls.push({
64
+ name: part.functionCall.name,
65
+ args: part.functionCall.args,
66
+ id: 'call_' + Math.random().toString(36).substr(2, 9) // Vertex doesn't consistently give IDs for single turn?
67
+ });
68
+ }
69
+ }
70
+ }
71
+ const usage = response.usageMetadata;
72
+ return {
73
+ text,
74
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
75
+ usage: {
76
+ promptTokens: usage?.promptTokenCount || 0,
77
+ completionTokens: usage?.candidatesTokenCount || 0
78
+ }
79
+ };
80
+ }
81
+ async *stream(prompt, tools) {
82
+ if (!this.model)
83
+ await this.init();
84
+ const resultStream = await this.model.generateContentStream(prompt);
85
+ for await (const chunk of resultStream.stream) {
86
+ const text = chunk.candidates?.[0].content.parts[0]?.text;
87
+ if (text) {
88
+ yield text;
89
+ }
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=vertex-genai-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertex-genai-service.js","sourceRoot":"","sources":["../../../src/engine/ai/vertex-genai-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface Chunk {
2
+ text: string;
3
+ metadata: {
4
+ type: string;
5
+ name?: string;
6
+ startLine: number;
7
+ endLine: number;
8
+ scope?: string;
9
+ };
10
+ }
11
+ export declare class SemanticChunker {
12
+ private parser;
13
+ constructor();
14
+ /**
15
+ * Parse code and extract semantic chunks (classes, functions, methods)
16
+ */
17
+ chunk(code: string, lang: 'javascript' | 'typescript' | 'tsx'): Promise<Chunk[]>;
18
+ }
19
+ //# sourceMappingURL=chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/engine/chunker.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;;IAMvB;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,YAAY,GAAG,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;CA4DvF"}
@@ -0,0 +1,79 @@
1
+ import Parser from 'tree-sitter';
2
+ import Javascript from 'tree-sitter-javascript';
3
+ // TypeScript definitions need checking, often generic 'tree-sitter-typescript' package
4
+ // exports both typescript and tsx.
5
+ // For now, assuming standard CommonJS interoperability via default import or requires usually works in Node.
6
+ import { createRequire } from 'module';
7
+ const require = createRequire(import.meta.url);
8
+ const Typescript = require('tree-sitter-typescript').typescript;
9
+ const TSX = require('tree-sitter-typescript').tsx;
10
+ export class SemanticChunker {
11
+ parser;
12
+ constructor() {
13
+ this.parser = new Parser();
14
+ }
15
+ /**
16
+ * Parse code and extract semantic chunks (classes, functions, methods)
17
+ */
18
+ async chunk(code, lang) {
19
+ switch (lang) {
20
+ case 'javascript':
21
+ this.parser.setLanguage(Javascript);
22
+ break;
23
+ case 'typescript':
24
+ this.parser.setLanguage(Typescript);
25
+ break;
26
+ case 'tsx':
27
+ this.parser.setLanguage(TSX);
28
+ break;
29
+ default: throw new Error(`Unsupported language: ${lang}`);
30
+ }
31
+ const tree = this.parser.parse(code);
32
+ const chunks = [];
33
+ // Simple query to find definitions
34
+ // Note: Query syntax depends on grammar.
35
+ // Need to handle errors if query fails.
36
+ try {
37
+ const query = new Parser.Query(this.parser.getLanguage(), `
38
+ (function_declaration name: (identifier) @name) @def
39
+ (class_declaration name: (identifier) @name) @def
40
+ (method_definition name: (property_identifier) @name) @def
41
+ (arrow_function) @def
42
+ `);
43
+ const matches = query.matches(tree.rootNode);
44
+ for (const match of matches) {
45
+ const defNode = match.captures.find(c => c.name === 'def')?.node;
46
+ const nameNode = match.captures.find(c => c.name === 'name')?.node;
47
+ if (defNode) {
48
+ chunks.push({
49
+ text: defNode.text,
50
+ metadata: {
51
+ type: defNode.type,
52
+ name: nameNode?.text || 'anonymous',
53
+ startLine: defNode.startPosition.row + 1,
54
+ endLine: defNode.endPosition.row + 1
55
+ }
56
+ });
57
+ }
58
+ }
59
+ }
60
+ catch (e) {
61
+ console.warn('Query failed or grammar mismatch:', e);
62
+ // Fallback: entire file? or split by lines?
63
+ // For now, return whole as one chunk if parsing fails semantically.
64
+ chunks.push({
65
+ text: code,
66
+ metadata: { type: 'file', startLine: 1, endLine: code.split('\n').length }
67
+ });
68
+ }
69
+ // Safety: If no chunks found (e.g. simple script without functions), add whole content
70
+ if (chunks.length === 0 && code.trim().length > 0) {
71
+ chunks.push({
72
+ text: code,
73
+ metadata: { type: 'script', startLine: 1, endLine: code.split('\n').length }
74
+ });
75
+ }
76
+ return chunks;
77
+ }
78
+ }
79
+ //# sourceMappingURL=chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/engine/chunker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Entry } from '@yuihub/core';
2
+ import { IVectorStore, SearchResult } from './vector-store-types.js';
3
+ /**
4
+ * CompositeVectorStore
5
+ * Manages multiple VectorStore instances (Dual Embedding).
6
+ * - Writes to ALL stores (Fan-out).
7
+ * - Searches from ALL stores and merges using RRF.
8
+ */
9
+ export declare class CompositeVectorStore implements IVectorStore {
10
+ private stores;
11
+ constructor(stores: IVectorStore[]);
12
+ init(): Promise<void>;
13
+ add(entries: Entry[]): Promise<void>;
14
+ isEmpty(): Promise<boolean>;
15
+ deleteBySource(source: string): Promise<number>;
16
+ search(query: string, limit?: number, filter?: {
17
+ tag?: string;
18
+ session?: string;
19
+ }): Promise<SearchResult[]>;
20
+ }
21
+ //# sourceMappingURL=composite-vector-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite-vector-store.d.ts","sourceRoot":"","sources":["../../src/engine/composite-vector-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAErE;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,YAAY,EAAE;IAI5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAM3B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM/C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,MAAM,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CA8BtH"}