@getvision/core 0.0.0 → 0.0.2-ae8b128-develop

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 (52) hide show
  1. package/dist/core.d.ts +98 -0
  2. package/dist/core.d.ts.map +1 -0
  3. package/dist/core.js +266 -0
  4. package/dist/index.d.ts +8 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +5 -14
  7. package/dist/logs/index.d.ts +3 -0
  8. package/dist/logs/index.d.ts.map +1 -0
  9. package/dist/logs/index.js +2 -0
  10. package/dist/logs/interceptor.d.ts +21 -0
  11. package/dist/logs/interceptor.d.ts.map +1 -0
  12. package/dist/logs/interceptor.js +72 -0
  13. package/dist/logs/store.d.ts +36 -0
  14. package/dist/logs/store.d.ts.map +1 -0
  15. package/dist/logs/store.js +72 -0
  16. package/dist/server/index.d.ts +3 -0
  17. package/dist/server/index.d.ts.map +1 -0
  18. package/dist/server/index.js +2 -0
  19. package/dist/server/jsonrpc.d.ts +21 -0
  20. package/dist/server/jsonrpc.d.ts.map +1 -0
  21. package/dist/server/jsonrpc.js +73 -0
  22. package/dist/server/static.d.ts +10 -0
  23. package/dist/server/static.d.ts.map +1 -0
  24. package/dist/server/static.js +54 -0
  25. package/dist/server/websocket.d.ts +36 -0
  26. package/dist/server/websocket.d.ts.map +1 -0
  27. package/dist/server/websocket.js +153 -0
  28. package/dist/tracing/index.d.ts +3 -0
  29. package/dist/tracing/index.d.ts.map +1 -0
  30. package/dist/tracing/index.js +2 -0
  31. package/dist/tracing/store.d.ts +52 -0
  32. package/dist/tracing/store.d.ts.map +1 -0
  33. package/dist/tracing/store.js +101 -0
  34. package/dist/tracing/tracer.d.ts +28 -0
  35. package/dist/tracing/tracer.d.ts.map +1 -0
  36. package/dist/tracing/tracer.js +64 -0
  37. package/dist/types/adapter-options.d.ts +69 -0
  38. package/dist/types/adapter-options.d.ts.map +1 -0
  39. package/dist/types/adapter-options.js +4 -0
  40. package/dist/types/index.d.ts +193 -0
  41. package/dist/types/index.d.ts.map +1 -0
  42. package/dist/types/index.js +5 -0
  43. package/dist/types/logs.d.ts +14 -0
  44. package/dist/types/logs.d.ts.map +1 -0
  45. package/dist/types/logs.js +1 -0
  46. package/dist/utils/service-detection.d.ts +43 -0
  47. package/dist/utils/service-detection.d.ts.map +1 -0
  48. package/dist/utils/service-detection.js +103 -0
  49. package/dist/utils/zod-utils.d.ts +7 -0
  50. package/dist/utils/zod-utils.d.ts.map +1 -0
  51. package/dist/utils/zod-utils.js +145 -0
  52. package/package.json +20 -8
package/dist/core.d.ts ADDED
@@ -0,0 +1,98 @@
1
+ import { VisionWebSocketServer } from './server';
2
+ import { TraceStore, Tracer } from './tracing';
3
+ import { LogStore } from './logs/store';
4
+ import type { VisionServerOptions, AppStatus, RouteMetadata, ServiceGroup, Trace, DashboardEvent, LogLevel, LogEntry } from './types/index';
5
+ /**
6
+ * VisionCore - Main orchestrator for the Vision Dashboard
7
+ */
8
+ export declare class VisionCore {
9
+ private server;
10
+ private traceStore;
11
+ private tracer;
12
+ private logStore;
13
+ private consoleInterceptor?;
14
+ private routes;
15
+ private services;
16
+ private appStatus;
17
+ constructor(options?: VisionServerOptions);
18
+ /**
19
+ * Register all JSON-RPC methods
20
+ */
21
+ private registerMethods;
22
+ /**
23
+ * Update app status
24
+ */
25
+ setAppStatus(status: Partial<AppStatus>): void;
26
+ /**
27
+ * Register routes from adapter
28
+ */
29
+ registerRoutes(routes: RouteMetadata[]): void;
30
+ /**
31
+ * Register grouped services
32
+ */
33
+ registerServices(services: ServiceGroup[]): void;
34
+ /**
35
+ * Create a new trace
36
+ */
37
+ createTrace(method: string, path: string): Trace;
38
+ /**
39
+ * Complete a trace
40
+ */
41
+ completeTrace(traceId: string, statusCode: number, duration: number): void;
42
+ /**
43
+ * Get tracer instance
44
+ */
45
+ getTracer(): Tracer;
46
+ /**
47
+ * Get WebSocket server instance (for registering JSON-RPC methods)
48
+ */
49
+ getServer(): VisionWebSocketServer;
50
+ /**
51
+ * Create a span helper for easy span creation
52
+ * @param traceId - Trace ID to attach spans to
53
+ * @returns A function that creates spans with automatic error handling
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * const withSpan = vision.createSpanHelper(traceId)
58
+ *
59
+ * const user = withSpan('db.select', { 'db.system': 'sqlite' }, () => {
60
+ * return db.select().from(users).get()
61
+ * })
62
+ * ```
63
+ */
64
+ createSpanHelper(traceId: string): <T>(name: string, attributes: Record<string, any> | undefined, fn: () => T) => T;
65
+ /**
66
+ * Get trace store
67
+ */
68
+ getTraceStore(): TraceStore;
69
+ /**
70
+ * Universal log API - can be called by any logger
71
+ */
72
+ log(level: LogLevel, message: string, meta?: Record<string, any>): LogEntry;
73
+ /**
74
+ * Get log store instance
75
+ */
76
+ getLogStore(): LogStore;
77
+ /**
78
+ * Broadcast event to all connected clients
79
+ */
80
+ broadcast(event: DashboardEvent): void;
81
+ /**
82
+ * Log stdout message
83
+ */
84
+ logStdout(message: string): void;
85
+ /**
86
+ * Log stderr message
87
+ */
88
+ logStderr(message: string): void;
89
+ /**
90
+ * Get number of connected dashboard clients
91
+ */
92
+ getClientCount(): number;
93
+ /**
94
+ * Close the Vision server
95
+ */
96
+ close(): Promise<void>;
97
+ }
98
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAEvC,OAAO,KAAK,EACV,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,YAAY,EACZ,KAAK,EACL,cAAc,EACd,QAAQ,EACR,QAAQ,EACT,MAAM,eAAe,CAAA;AAEtB;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,kBAAkB,CAAC,CAAoB;IAC/C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,SAAS,CAKhB;gBAEW,OAAO,GAAE,mBAAwB;IAwB7C;;OAEG;IACH,OAAO,CAAC,eAAe;IA0FvB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IAK9C;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAI7C;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI;IAIhD;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK;IAKhD;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAS1E;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,SAAS,IAAI,qBAAqB;IAIlC;;;;;;;;;;;;;OAaG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,IACtB,CAAC,EACP,MAAM,MAAM,EACZ,YAAY,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,YAAK,EACpC,IAAI,MAAM,CAAC,KACV,CAAC;IAqCN;;OAEG;IACH,aAAa,IAAI,UAAU;IAI3B;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,QAAQ;IAU3E;;OAEG;IACH,WAAW,IAAI,QAAQ;IAIvB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAItC;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOhC;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOhC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
package/dist/core.js ADDED
@@ -0,0 +1,266 @@
1
+ import { VisionWebSocketServer } from './server';
2
+ import { TraceStore, Tracer } from './tracing';
3
+ import { LogStore } from './logs/store';
4
+ import { ConsoleInterceptor } from './logs/interceptor';
5
+ /**
6
+ * VisionCore - Main orchestrator for the Vision Dashboard
7
+ */
8
+ export class VisionCore {
9
+ server;
10
+ traceStore;
11
+ tracer;
12
+ logStore;
13
+ consoleInterceptor;
14
+ routes = [];
15
+ services = [];
16
+ appStatus = {
17
+ name: 'Unknown',
18
+ version: '0.0.0',
19
+ environment: 'development',
20
+ running: false,
21
+ };
22
+ constructor(options = {}) {
23
+ this.server = new VisionWebSocketServer(options);
24
+ this.traceStore = new TraceStore(options.maxTraces);
25
+ this.tracer = new Tracer();
26
+ this.logStore = new LogStore(options.maxLogs);
27
+ // Optional console intercept
28
+ if (options.captureConsole !== false) {
29
+ this.consoleInterceptor = new ConsoleInterceptor(this.logStore, () => {
30
+ // Broadcast latest log entry to connected clients
31
+ this.broadcast({
32
+ type: 'log.entry',
33
+ data: this.logStore.getLogs({ limit: 1 })[0]
34
+ });
35
+ });
36
+ this.consoleInterceptor.start();
37
+ }
38
+ this.registerMethods();
39
+ }
40
+ /**
41
+ * Register all JSON-RPC methods
42
+ */
43
+ registerMethods() {
44
+ // App status
45
+ this.server.registerMethod('status', async () => {
46
+ return this.appStatus;
47
+ });
48
+ // List all traces
49
+ this.server.registerMethod('traces/list', async (params) => {
50
+ return this.traceStore.getTraces({
51
+ method: params?.method,
52
+ statusCode: params?.statusCode,
53
+ minDuration: params?.minDuration,
54
+ limit: params?.limit ?? 100,
55
+ });
56
+ });
57
+ // Get specific trace
58
+ this.server.registerMethod('traces/get', async (params) => {
59
+ if (!params?.traceId) {
60
+ throw new Error('traceId is required');
61
+ }
62
+ return this.traceStore.getTrace(params.traceId);
63
+ });
64
+ // Clear traces
65
+ this.server.registerMethod('traces/clear', async () => {
66
+ this.traceStore.clear();
67
+ return { success: true };
68
+ });
69
+ // Export traces
70
+ this.server.registerMethod('traces/export', async (params) => {
71
+ const format = params?.format || 'json';
72
+ const traces = this.traceStore.getAllTraces();
73
+ if (format === 'ndjson') {
74
+ return traces.map(t => JSON.stringify(t)).join('\n');
75
+ }
76
+ return JSON.stringify(traces, null, 2);
77
+ });
78
+ // Get routes
79
+ this.server.registerMethod('routes/list', async () => {
80
+ return this.routes;
81
+ });
82
+ // Get services (grouped routes)
83
+ this.server.registerMethod('services/list', async () => {
84
+ return this.services;
85
+ });
86
+ // Get version
87
+ this.server.registerMethod('version', async () => {
88
+ return {
89
+ version: '0.0.1',
90
+ name: 'Vision Dashboard',
91
+ };
92
+ });
93
+ // Logs methods
94
+ this.server.registerMethod('logs/list', async (params) => {
95
+ return this.logStore.getLogs({
96
+ level: params?.level,
97
+ search: params?.search,
98
+ limit: params?.limit ?? 100,
99
+ since: params?.since,
100
+ });
101
+ });
102
+ this.server.registerMethod('logs/clear', async () => {
103
+ this.logStore.clear();
104
+ return { success: true };
105
+ });
106
+ this.server.registerMethod('traces/addClientMetrics', async (params) => {
107
+ const { traceId, clientDuration } = params;
108
+ if (!traceId || typeof clientDuration !== 'number') {
109
+ throw new Error('traceId and clientDuration are required');
110
+ }
111
+ const trace = this.traceStore.getTrace(traceId);
112
+ if (trace) {
113
+ trace.metadata = { ...(trace.metadata || {}), clientDuration };
114
+ }
115
+ return { success: true };
116
+ });
117
+ }
118
+ /**
119
+ * Update app status
120
+ */
121
+ setAppStatus(status) {
122
+ this.appStatus = { ...this.appStatus, ...status };
123
+ this.broadcast({ type: 'app.started', data: this.appStatus });
124
+ }
125
+ /**
126
+ * Register routes from adapter
127
+ */
128
+ registerRoutes(routes) {
129
+ this.routes = routes;
130
+ }
131
+ /**
132
+ * Register grouped services
133
+ */
134
+ registerServices(services) {
135
+ this.services = services;
136
+ }
137
+ /**
138
+ * Create a new trace
139
+ */
140
+ createTrace(method, path) {
141
+ const trace = this.traceStore.createTrace(method, path);
142
+ return trace;
143
+ }
144
+ /**
145
+ * Complete a trace
146
+ */
147
+ completeTrace(traceId, statusCode, duration) {
148
+ this.traceStore.completeTrace(traceId, statusCode, duration);
149
+ const trace = this.traceStore.getTrace(traceId);
150
+ if (trace) {
151
+ this.broadcast({ type: 'trace.new', data: trace });
152
+ }
153
+ }
154
+ /**
155
+ * Get tracer instance
156
+ */
157
+ getTracer() {
158
+ return this.tracer;
159
+ }
160
+ /**
161
+ * Get WebSocket server instance (for registering JSON-RPC methods)
162
+ */
163
+ getServer() {
164
+ return this.server;
165
+ }
166
+ /**
167
+ * Create a span helper for easy span creation
168
+ * @param traceId - Trace ID to attach spans to
169
+ * @returns A function that creates spans with automatic error handling
170
+ *
171
+ * @example
172
+ * ```ts
173
+ * const withSpan = vision.createSpanHelper(traceId)
174
+ *
175
+ * const user = withSpan('db.select', { 'db.system': 'sqlite' }, () => {
176
+ * return db.select().from(users).get()
177
+ * })
178
+ * ```
179
+ */
180
+ createSpanHelper(traceId) {
181
+ return (name, attributes = {}, fn) => {
182
+ const span = this.tracer.startSpan(name, traceId);
183
+ // Add attributes
184
+ for (const [key, value] of Object.entries(attributes)) {
185
+ this.tracer.setAttribute(span.id, key, value);
186
+ }
187
+ try {
188
+ const result = fn();
189
+ const completedSpan = this.tracer.endSpan(span.id);
190
+ // Add span to trace store
191
+ if (completedSpan) {
192
+ this.traceStore.addSpan(traceId, completedSpan);
193
+ }
194
+ return result;
195
+ }
196
+ catch (error) {
197
+ this.tracer.setAttribute(span.id, 'error', true);
198
+ this.tracer.setAttribute(span.id, 'error.message', error instanceof Error ? error.message : String(error));
199
+ const completedSpan = this.tracer.endSpan(span.id);
200
+ // Add span to trace store even on error
201
+ if (completedSpan) {
202
+ this.traceStore.addSpan(traceId, completedSpan);
203
+ }
204
+ throw error;
205
+ }
206
+ };
207
+ }
208
+ /**
209
+ * Get trace store
210
+ */
211
+ getTraceStore() {
212
+ return this.traceStore;
213
+ }
214
+ /**
215
+ * Universal log API - can be called by any logger
216
+ */
217
+ log(level, message, meta) {
218
+ const args = meta ? [meta] : undefined;
219
+ const entry = this.logStore.addLog(level, message, args);
220
+ // Broadcast to connected clients
221
+ this.broadcast({ type: 'log.entry', data: entry });
222
+ return entry;
223
+ }
224
+ /**
225
+ * Get log store instance
226
+ */
227
+ getLogStore() {
228
+ return this.logStore;
229
+ }
230
+ /**
231
+ * Broadcast event to all connected clients
232
+ */
233
+ broadcast(event) {
234
+ this.server.broadcast(event);
235
+ }
236
+ /**
237
+ * Log stdout message
238
+ */
239
+ logStdout(message) {
240
+ this.broadcast({
241
+ type: 'log.stdout',
242
+ data: { message, timestamp: Date.now() },
243
+ });
244
+ }
245
+ /**
246
+ * Log stderr message
247
+ */
248
+ logStderr(message) {
249
+ this.broadcast({
250
+ type: 'log.stderr',
251
+ data: { message, timestamp: Date.now() },
252
+ });
253
+ }
254
+ /**
255
+ * Get number of connected dashboard clients
256
+ */
257
+ getClientCount() {
258
+ return this.server.getClientCount();
259
+ }
260
+ /**
261
+ * Close the Vision server
262
+ */
263
+ async close() {
264
+ await this.server.close();
265
+ }
266
+ }
@@ -0,0 +1,8 @@
1
+ export { VisionCore } from './core';
2
+ export { VisionWebSocketServer } from './server/index';
3
+ export { TraceStore, Tracer } from './tracing/index';
4
+ export { generateZodTemplate } from './utils/zod-utils';
5
+ export { autoDetectPackageInfo, autoDetectIntegrations, detectDrizzle, startDrizzleStudio, stopDrizzleStudio, } from './utils/service-detection';
6
+ export type { PackageInfo, IntegrationConfig, DrizzleInfo } from './utils/service-detection';
7
+ export type * from './types/index';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,2BAA2B,CAAA;AAClC,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC5F,mBAAmB,eAAe,CAAA"}