@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 @@
1
+ {"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../../src/engine/vector-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Indexer } from './indexer.js';
2
+ export declare class SafeWatcher {
3
+ private watcher;
4
+ private indexer;
5
+ private debouncedHandlers;
6
+ constructor(indexer: Indexer);
7
+ start(paths: string | string[]): void;
8
+ private callbacks;
9
+ onActivity(cb: (path: string, type: 'change' | 'add' | 'unlink') => void): void;
10
+ private handleFileDelete;
11
+ private handleFileChange;
12
+ scan(dir: string): Promise<void>;
13
+ private getFiles;
14
+ close(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/engine/watcher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,iBAAiB,CAA4D;gBAEzE,OAAO,EAAE,OAAO;IAK5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAgB9B,OAAO,CAAC,SAAS,CAAqE;IAEtF,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,QAAQ,KAAK,IAAI;IAIxE,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,gBAAgB;IAqBlB,IAAI,CAAC,GAAG,EAAE,MAAM;YAqBR,QAAQ;IAShB,KAAK;CAKZ"}
@@ -0,0 +1,94 @@
1
+ import { watch } from 'chokidar';
2
+ import lodash from 'lodash';
3
+ export class SafeWatcher {
4
+ watcher = null;
5
+ indexer;
6
+ debouncedHandlers;
7
+ constructor(indexer) {
8
+ this.indexer = indexer;
9
+ this.debouncedHandlers = new Map();
10
+ }
11
+ start(paths) {
12
+ this.watcher = watch(paths, {
13
+ ignored: /(^|[\/\\])\../, // ignore dotfiles
14
+ persistent: true,
15
+ ignoreInitial: true // Don't queue initial scan to avoid storm? Or maybe allow it?
16
+ // For V1, maybe allow initial scan to build index. But let's keep it safe.
17
+ });
18
+ this.watcher
19
+ .on('add', this.handleFileChange.bind(this))
20
+ .on('change', this.handleFileChange.bind(this))
21
+ .on('unlink', this.handleFileDelete.bind(this));
22
+ console.log(`[Watcher] Started watching: ${paths}`);
23
+ }
24
+ callbacks = [];
25
+ onActivity(cb) {
26
+ this.callbacks.push(cb);
27
+ }
28
+ handleFileDelete(filePath) {
29
+ console.log(`[Watcher] File deleted: ${filePath}`);
30
+ this.callbacks.forEach(cb => cb(filePath, 'unlink'));
31
+ // Cancel any pending debounced handler for this file
32
+ const handler = this.debouncedHandlers.get(filePath);
33
+ if (handler) {
34
+ handler.cancel();
35
+ this.debouncedHandlers.delete(filePath);
36
+ }
37
+ // Enqueue delete job
38
+ this.indexer.enqueueDelete(filePath);
39
+ }
40
+ handleFileChange(filePath) {
41
+ // Notify listeners immediately (or debounced?)
42
+ // Live Context prefers immediate or distinct?
43
+ // Let's use debounced for indexing, but maybe immediate for "activity log"?
44
+ // The current logic debounces indexing.
45
+ // Let's notify listeners here (immediate activity).
46
+ this.callbacks.forEach(cb => cb(filePath, 'change'));
47
+ if (!this.debouncedHandlers.has(filePath)) {
48
+ // Create debounced handler per file
49
+ const handler = lodash.debounce((path) => {
50
+ console.log(`[Watcher] Change detected (stable): ${path}`);
51
+ this.indexer.enqueue(path);
52
+ }, 2000); // 2000ms debounce
53
+ this.debouncedHandlers.set(filePath, handler);
54
+ }
55
+ const handler = this.debouncedHandlers.get(filePath);
56
+ if (handler)
57
+ handler(filePath);
58
+ }
59
+ async scan(dir) {
60
+ console.log(`[Watcher] Scanning directory: ${dir}`);
61
+ try {
62
+ // Node 20+ supports recursive readdir. Assume Node 18+ or use manual walk?
63
+ // Let's use fs-extra readdir or custom walk if needed.
64
+ // fs.readdir(dir, { recursive: true }) is Node 20.
65
+ // Safe fallback: use chokidar instance if ready? No.
66
+ // Simple recursive walk:
67
+ const files = await this.getFiles(dir);
68
+ console.log(`[Watcher] Found ${files.length} files. Enqueuing...`);
69
+ for (const file of files) {
70
+ if (file.endsWith('.md')) {
71
+ this.indexer.enqueue(file);
72
+ }
73
+ }
74
+ }
75
+ catch (e) {
76
+ console.error('[Watcher] Scan failed:', e);
77
+ }
78
+ }
79
+ async getFiles(dir) {
80
+ const dirents = await import('fs').then(r => r.promises.readdir(dir, { withFileTypes: true }));
81
+ const files = await Promise.all(dirents.map((dirent) => {
82
+ const res = import('path').then(p => p.join(dir, dirent.name));
83
+ return dirent.isDirectory() ? res.then(p => this.getFiles(p)) : res;
84
+ }));
85
+ return Array.prototype.concat(...files);
86
+ }
87
+ async close() {
88
+ if (this.watcher)
89
+ await this.watcher.close();
90
+ this.debouncedHandlers.forEach(h => h.cancel());
91
+ this.debouncedHandlers.clear();
92
+ }
93
+ }
94
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/engine/watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,360 @@
1
+ import Fastify from 'fastify';
2
+ import { serializerCompiler, validatorCompiler } from 'fastify-type-provider-zod';
3
+ import rateLimit from '@fastify/rate-limit';
4
+ import bearerAuth from '@fastify/bearer-auth';
5
+ import z from 'zod';
6
+ import { LanceVectorStore } from './engine/vector-store.js';
7
+ import { CompositeVectorStore } from './engine/composite-vector-store.js';
8
+ import { Indexer } from './engine/indexer.js';
9
+ import { SafeWatcher } from './engine/watcher.js';
10
+ import { withWriteLock, withReadLock, withRetry } from './engine/lock.js';
11
+ import { extractTerms } from './api/text-process.js';
12
+ import { GitHubSyncProvider } from './sync/github-provider.js';
13
+ import { SyncScheduler } from './sync/scheduler.js';
14
+ import { ConfigService } from './config/service.js';
15
+ import { AppConfigUpdateSchema } from './config/schema.js';
16
+ import { AIProviderRegistry } from './engine/ai/registry.js';
17
+ import path from 'path';
18
+ import fs from 'fs-extra';
19
+ import { randomUUID } from 'crypto';
20
+ import os from 'os';
21
+ import { ulid } from 'ulid';
22
+ import { initAuth } from './auth.js';
23
+ const server = Fastify({
24
+ logger: true
25
+ }).withTypeProvider();
26
+ // Zod Type Provider Setup
27
+ server.setValidatorCompiler(validatorCompiler);
28
+ server.setSerializerCompiler(serializerCompiler);
29
+ // --- Config & Engine Setup ---
30
+ const workspaceRoot = path.resolve(process.cwd(), '../../../');
31
+ const DEFAULT_DATA_DIR = path.join(os.homedir(), '.yuihub');
32
+ const DATA_DIR = process.env.DATA_DIR || DEFAULT_DATA_DIR;
33
+ const STORAGE_VERSION = '1.0.0-rc1';
34
+ // 1. Initialize Config Service
35
+ const configService = new ConfigService(DATA_DIR);
36
+ let config = configService.get();
37
+ // 2. Initialize AI Registry & Services
38
+ const aiRegistry = new AIProviderRegistry(config.ai);
39
+ // Initialize Composite Vector Store (Dual Embedding)
40
+ const embeddingServices = await aiRegistry.getAllEmbeddingServices();
41
+ if (embeddingServices.length === 0) {
42
+ throw new Error('No embedding services configured or initialized.');
43
+ }
44
+ const stores = embeddingServices.map(({ id, service }) => {
45
+ // Store name = provider id (e.g. 'local', 'vertex')
46
+ // Table name defaults to `entries_${id}` inside LanceVectorStore
47
+ return new LanceVectorStore(DATA_DIR, service, id);
48
+ });
49
+ console.log(`[AI] Initialized ${stores.length} Vector Stores: ${stores.map(s => s.name).join(', ')}`);
50
+ const vectorStore = new CompositeVectorStore(stores);
51
+ await vectorStore.init(); // Init all underlying stores
52
+ const indexer = new Indexer(vectorStore);
53
+ const watcher = new SafeWatcher(indexer);
54
+ // 3. Sync Setup
55
+ const syncProvider = new GitHubSyncProvider(DATA_DIR);
56
+ const syncScheduler = new SyncScheduler(syncProvider, config.sync.interval);
57
+ // --- Security (File-based Handshake) ---
58
+ const authData = await initAuth(DATA_DIR);
59
+ const AUTH_TOKEN = process.env.YUIHUB_TOKEN || authData.token;
60
+ console.log(`[Auth] Token initialized (file-based handshake)`);
61
+ server.register(rateLimit, {
62
+ max: 100,
63
+ timeWindow: '1 minute'
64
+ });
65
+ server.register(bearerAuth, {
66
+ keys: new Set([AUTH_TOKEN]),
67
+ errorResponse: (err) => {
68
+ return { error: 'Unauthorized', message: err.message };
69
+ }
70
+ });
71
+ // --- API Schema ---
72
+ const SaveBodySchema = z.object({
73
+ entries: z.array(z.object({
74
+ id: z.string().optional(),
75
+ text: z.string(),
76
+ mode: z.enum(['private', 'public']),
77
+ tags: z.array(z.string()).optional(),
78
+ session_id: z.string().optional(),
79
+ source: z.string().optional()
80
+ }))
81
+ });
82
+ const SearchQuerySchema = z.object({
83
+ q: z.string(),
84
+ limit: z.coerce.number().optional().default(10),
85
+ tag: z.string().optional(),
86
+ session: z.string().optional()
87
+ });
88
+ const ExportQuerySchema = z.object({
89
+ q: z.string().optional(), // Intent
90
+ session: z.string().optional()
91
+ });
92
+ const ConfigUpdateSchema = AppConfigUpdateSchema;
93
+ // --- Lifecycle ---
94
+ server.addHook('onReady', async () => {
95
+ server.log.info({ config: configService.get() }, 'Initializing Engine with Config...');
96
+ // Storage Version Check
97
+ const versionPath = path.join(DATA_DIR, 'VERSION');
98
+ if (config.sync.enabled || await fs.pathExists(versionPath)) {
99
+ // If sync enabled or version file exists, check it.
100
+ if (await fs.pathExists(versionPath)) {
101
+ const version = (await fs.readFile(versionPath, 'utf-8')).trim();
102
+ if (version !== STORAGE_VERSION) {
103
+ server.log.warn(`⚠️ Storage Version Mismatch! Expected ${STORAGE_VERSION}, found ${version}. Compatibility issues may occur.`);
104
+ }
105
+ }
106
+ else {
107
+ // If no version file but data exists... write it? or warn?
108
+ // Write it for now to migrate.
109
+ await fs.writeFile(versionPath, STORAGE_VERSION);
110
+ }
111
+ }
112
+ await vectorStore.init();
113
+ server.log.info('Engine initialized.');
114
+ // Start Watcher
115
+ const notesDir = path.join(DATA_DIR, 'notes');
116
+ await fs.ensureDir(notesDir);
117
+ watcher.start(notesDir);
118
+ // Initialize & Start Sync if Enabled
119
+ if (config.sync.enabled) {
120
+ server.log.info('Initializing Sync...');
121
+ await syncProvider.init(config.sync.remoteUrl);
122
+ syncScheduler.start();
123
+ }
124
+ // Bootstrap Indexing: If DB empty but files exist, scan!
125
+ if (await vectorStore.isEmpty()) {
126
+ const hasFiles = await fs.pathExists(notesDir) && (await fs.readdir(notesDir)).length > 0;
127
+ if (hasFiles) {
128
+ server.log.info('🚀 Empty Index detected with existing notes. Starting Initial Scan...');
129
+ // Don't await scan fully to allow server start? Or await?
130
+ // Await is safer to ensure index is ready.
131
+ await watcher.scan(notesDir);
132
+ server.log.info('✅ Initial Scan queued.');
133
+ }
134
+ }
135
+ });
136
+ server.addHook('onClose', async () => {
137
+ server.log.info('Shutting down...');
138
+ await watcher.close();
139
+ syncScheduler.stop();
140
+ });
141
+ // --- Endpoints ---
142
+ server.get('/health', async () => {
143
+ return { status: 'ok', version: 'v1' };
144
+ });
145
+ // System API: Get Config
146
+ server.get('/system/config', async () => {
147
+ return { ok: true, config: configService.get() };
148
+ });
149
+ // System API: Update Config (Hot Reload-ish)
150
+ server.patch('/system/config', {
151
+ schema: {
152
+ body: ConfigUpdateSchema
153
+ }
154
+ }, async (req, reply) => {
155
+ try {
156
+ const body = req.body;
157
+ const newConfig = await configService.update(body);
158
+ config = newConfig; // Update local ref
159
+ // Apply specific changes dynamically
160
+ if (body.sync) {
161
+ if (newConfig.sync.enabled && !syncScheduler['isSchedulerActive']) {
162
+ // If enabled and not running, start
163
+ // Re-init provider if remote url changed?
164
+ if (body.sync.remoteUrl)
165
+ await syncProvider.init(newConfig.sync.remoteUrl);
166
+ syncScheduler.start();
167
+ }
168
+ else if (!newConfig.sync.enabled) {
169
+ syncScheduler.stop();
170
+ }
171
+ // Update interval if changed
172
+ if (body.sync.interval) {
173
+ syncScheduler.updateInterval(newConfig.sync.interval);
174
+ }
175
+ }
176
+ // Note: Deep reconfiguration (e.g. port change, model change) might require restart.
177
+ // For now we just return the new config.
178
+ return { ok: true, config: newConfig, message: 'Config updated. Some changes may require restart.' };
179
+ }
180
+ catch (err) {
181
+ server.log.error(err);
182
+ reply.code(500);
183
+ return { ok: false, error: err.message };
184
+ }
185
+ });
186
+ // 1. SAVE Endpoint
187
+ server.post('/save', {
188
+ schema: {
189
+ body: SaveBodySchema
190
+ }
191
+ }, async (req, reply) => {
192
+ const { entries } = req.body;
193
+ // Write Lock with Retry for LanceDB safety
194
+ try {
195
+ await withWriteLock(() => withRetry(async () => {
196
+ // Process each entry
197
+ for (const entry of entries) {
198
+ // Enhanced Logic: Japanese Terms Extraction
199
+ const extractedTerms = extractTerms(entry.text);
200
+ const tags = new Set([...(entry.tags || []), ...extractedTerms]);
201
+ const finalEntry = {
202
+ ...entry,
203
+ id: entry.id || randomUUID(), // Generate ID if atomic entry
204
+ tags: Array.from(tags),
205
+ date: new Date().toISOString()
206
+ };
207
+ // Physical Save (Markdown)
208
+ const filename = finalEntry.session_id ? `${finalEntry.session_id}.md` : `entry-${finalEntry.id}.md`;
209
+ const filePath = path.join(DATA_DIR, 'notes', filename);
210
+ const fileContent = `\n\n---\nid: ${finalEntry.id}\ndate: ${finalEntry.date}\ntags: [${finalEntry.tags.join(', ')}]\n---\n\n${finalEntry.text}`;
211
+ await fs.appendFile(filePath, fileContent);
212
+ }
213
+ }));
214
+ // Lock released, Watcher picks up changes.
215
+ return { ok: true, count: entries.length };
216
+ }
217
+ catch (err) {
218
+ server.log.error(err);
219
+ reply.code(500);
220
+ return { ok: false, error: 'Save failed' };
221
+ }
222
+ });
223
+ // 2. SEARCH Endpoint (Read Lock)
224
+ server.get('/search', {
225
+ schema: {
226
+ querystring: SearchQuerySchema
227
+ }
228
+ }, async (req, reply) => {
229
+ const { q, limit, tag, session } = req.query;
230
+ const results = await withReadLock(() => vectorStore.search(q, limit, { tag, session }));
231
+ return { ok: true, results };
232
+ });
233
+ // 3. TRIGGER Endpoint (Mock / Private Mode)
234
+ server.post('/trigger', async (req, reply) => {
235
+ // Logic: In Private Mode, we don't send to external agent actually.
236
+ // We just return OK.
237
+ return { ok: true, ref: 'mock-private-ref', status: 'ignored_in_private_mode' };
238
+ });
239
+ // --- MCP Support Endpoints ---
240
+ // 3.1 THREADS/NEW - Create new session
241
+ const ThreadsNewSchema = z.object({
242
+ title: z.string().optional()
243
+ });
244
+ server.post('/threads/new', {
245
+ schema: { body: ThreadsNewSchema }
246
+ }, async (req, reply) => {
247
+ const { title } = req.body;
248
+ const session = {
249
+ id: `th-${ulid()}`,
250
+ title: title || `Session ${new Date().toLocaleDateString()}`,
251
+ created_at: new Date().toISOString()
252
+ };
253
+ return { ok: true, session };
254
+ });
255
+ // 3.2 CHECKPOINTS - Create decision checkpoint
256
+ const CheckpointSchema = z.object({
257
+ session_id: z.string(),
258
+ summary: z.string(),
259
+ intent: z.string(),
260
+ working_memory: z.record(z.unknown()).optional(),
261
+ entry_ids: z.array(z.string()).optional()
262
+ });
263
+ server.post('/checkpoints', {
264
+ schema: { body: CheckpointSchema }
265
+ }, async (req, reply) => {
266
+ const { session_id, summary, intent, working_memory, entry_ids } = req.body;
267
+ const checkpoint = {
268
+ id: `cp-${ulid()}`,
269
+ session_id,
270
+ snapshot: {
271
+ working_memory: JSON.stringify(working_memory || {}),
272
+ decision_rationale: summary
273
+ },
274
+ intent,
275
+ entry_ids: entry_ids || [],
276
+ created_at: new Date().toISOString()
277
+ };
278
+ // Write Lock with Retry for file safety
279
+ await withWriteLock(() => withRetry(async () => {
280
+ const checkpointDir = path.join(DATA_DIR, 'checkpoints');
281
+ await fs.ensureDir(checkpointDir);
282
+ await fs.writeJson(path.join(checkpointDir, `${checkpoint.id}.json`), checkpoint, { spaces: 2 });
283
+ }));
284
+ return { ok: true, checkpoint };
285
+ });
286
+ server.get('/export/context', {
287
+ schema: {
288
+ querystring: ExportQuerySchema
289
+ }
290
+ }, async (req, reply) => {
291
+ const { q, session } = req.query;
292
+ // 1. Retrieve Recent Context
293
+ const longTermResults = q ? await vectorStore.search(q, 5) : [];
294
+ // Construct Context Packet
295
+ const packet = {
296
+ intent: q || 'No specific intent',
297
+ session_id: session,
298
+ working_memory: {
299
+ recent_summary: '...'
300
+ },
301
+ long_term_memory: longTermResults.map(r => ({
302
+ text: r.text,
303
+ relevance: r.score, // Use normalized score from Composite Store
304
+ source_store: r._source_store
305
+ })),
306
+ meta: {
307
+ mode: 'private'
308
+ }
309
+ };
310
+ return { ok: true, packet };
311
+ });
312
+ // 5. AGENT Endpoint
313
+ import { Agent } from './engine/agent/core.js';
314
+ import { LiveContextService } from './engine/agent/live-context.js';
315
+ const liveContextService = new LiveContextService();
316
+ watcher.onActivity((path, type) => liveContextService.addEvent(type, path));
317
+ const AgentPromptSchema = z.object({
318
+ prompt: z.string(),
319
+ context: z.string().optional()
320
+ });
321
+ server.post('/agent', {
322
+ schema: {
323
+ body: AgentPromptSchema
324
+ }
325
+ }, async (req, reply) => {
326
+ const { prompt, context } = req.body;
327
+ try {
328
+ const providerId = config.ai.defaults.agent;
329
+ const genAIService = await aiRegistry.getGenAIService(providerId);
330
+ const agent = new Agent({
331
+ genAI: genAIService,
332
+ rootDir: workspaceRoot,
333
+ dataDir: DATA_DIR
334
+ });
335
+ const fullContext = (context || '') + '\n\n' + liveContextService.getSnapshot();
336
+ const answer = await agent.run(prompt, fullContext);
337
+ return { ok: true, answer };
338
+ }
339
+ catch (err) {
340
+ server.log.error(err);
341
+ reply.code(500);
342
+ return { ok: false, error: err.message };
343
+ }
344
+ });
345
+ const start = async () => {
346
+ try {
347
+ const port = config.server.port;
348
+ const host = config.server.host;
349
+ await server.listen({ port, host });
350
+ console.log(`Server listening on ${host}:${port}`);
351
+ }
352
+ catch (err) {
353
+ server.log.error(err);
354
+ process.exit(1);
355
+ }
356
+ };
357
+ if (import.meta.url === `file://${process.argv[1]}`) {
358
+ start();
359
+ }
360
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { ISyncProvider } from '@yuihub/core';
2
+ export declare class GitHubSyncProvider implements ISyncProvider {
3
+ readonly name: "github";
4
+ private git;
5
+ private repoPath;
6
+ constructor(repoPath: string);
7
+ init(remoteUrl?: string): Promise<void>;
8
+ /**
9
+ * Exponential Backoff Retry Wrapper for Git Operations
10
+ */
11
+ private withRetry;
12
+ push(message?: string): Promise<void>;
13
+ pull(): Promise<void>;
14
+ status(): Promise<{
15
+ dirty: boolean;
16
+ ahead: number;
17
+ behind: number;
18
+ }>;
19
+ }
20
+ //# sourceMappingURL=github-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-provider.d.ts","sourceRoot":"","sources":["../../src/sync/github-provider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,qBAAa,kBAAmB,YAAW,aAAa;IACtD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAKtB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM;IAS7B;;OAEG;YACW,SAAS;IAsBjB,IAAI,CAAC,OAAO,GAAE,MAAkC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBhE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,MAAM;;;;;CAUb"}
@@ -0,0 +1,80 @@
1
+ import { simpleGit } from 'simple-git';
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+ export class GitHubSyncProvider {
5
+ name = 'github';
6
+ git;
7
+ repoPath;
8
+ constructor(repoPath) {
9
+ this.repoPath = repoPath;
10
+ this.git = simpleGit(repoPath);
11
+ }
12
+ async init(remoteUrl) {
13
+ if (!await fs.pathExists(path.join(this.repoPath, '.git'))) {
14
+ await this.git.init();
15
+ if (remoteUrl) {
16
+ await this.git.addRemote('origin', remoteUrl);
17
+ }
18
+ }
19
+ }
20
+ /**
21
+ * Exponential Backoff Retry Wrapper for Git Operations
22
+ */
23
+ async withRetry(operation, retries = 5, baseDelay = 1000) {
24
+ for (let i = 0; i < retries; i++) {
25
+ try {
26
+ return await operation();
27
+ }
28
+ catch (e) {
29
+ const isLockError = e.message?.includes('index.lock') || e.message?.includes('Unable to create');
30
+ if (isLockError && i < retries - 1) {
31
+ const delay = baseDelay * Math.pow(2, i); // 1s, 2s, 4s, 8s, 16s
32
+ console.warn(`[Sync] Git lock detected. Retrying in ${delay}ms... (Attempt ${i + 1}/${retries})`);
33
+ await new Promise(r => setTimeout(r, delay));
34
+ // Attempt to clean stale lock?
35
+ // CAUTION: Removing lock blindly is dangerous, but common in automated environments strictly controlled by one process.
36
+ // Here we are potentially competing with user. Better to just wait.
37
+ continue;
38
+ }
39
+ throw e;
40
+ }
41
+ }
42
+ throw new Error('Unreachable');
43
+ }
44
+ async push(message = 'chore: sync from yuihub') {
45
+ await this.withRetry(async () => {
46
+ // Check status first
47
+ const status = await this.git.status();
48
+ if (status.isClean())
49
+ return;
50
+ await this.git.add('.');
51
+ await this.git.commit(message);
52
+ // Check if remote exists before pushing
53
+ const remotes = await this.git.getRemotes();
54
+ if (remotes.some(r => r.name === 'origin')) {
55
+ // Pull with rebase first to avoid non-fast-forward?
56
+ // await this.git.pull('origin', 'main', { '--rebase': 'true' });
57
+ await this.git.push('origin', 'main');
58
+ }
59
+ });
60
+ }
61
+ async pull() {
62
+ await this.withRetry(async () => {
63
+ const remotes = await this.git.getRemotes();
64
+ if (remotes.some(r => r.name === 'origin')) {
65
+ await this.git.pull('origin', 'main');
66
+ }
67
+ });
68
+ }
69
+ async status() {
70
+ return this.withRetry(async () => {
71
+ const s = await this.git.status();
72
+ return {
73
+ dirty: !s.isClean(),
74
+ ahead: s.ahead,
75
+ behind: s.behind
76
+ };
77
+ });
78
+ }
79
+ }
80
+ //# sourceMappingURL=github-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-provider.js","sourceRoot":"","sources":["../../src/sync/github-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { ISyncProvider } from '@yuihub/core';
2
+ export declare class SyncScheduler {
3
+ private job;
4
+ private provider;
5
+ private isRunning;
6
+ private isSchedulerActive;
7
+ private cronExpression;
8
+ constructor(provider: ISyncProvider, cronExpression?: string);
9
+ private createJob;
10
+ start(): void;
11
+ stop(): void;
12
+ /**
13
+ * Update the sync interval dynamically (hot reload)
14
+ */
15
+ updateInterval(newCronExpression: string): void;
16
+ runSync(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=scheduler.d.ts.map