@cnstra/devtools-server 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/index.cjs +998 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +995 -0
- package/dist/index.js.map +1 -0
- package/dist/start.d.ts +31 -0
- package/dist/start.d.ts.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/start.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { createServer, IncomingMessage, ServerResponse } from 'http';\nimport { readFileSync, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { createRequire } from 'module';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport { CNSDevToolsServer } from './index';\nimport type { ICNS, TCNSNeuron, CNSPersistOptionsRegistry, CNSCollateral } from '@cnstra/core';\n\n// createRequire from cwd works in both CJS (jest) and ESM (production)\nconst _require = createRequire(join(process.cwd(), 'package.json'));\n\n// ─── Locate panel UI static files ────────────────────────────────────────────\n\nfunction findPanelUIDir(): string | null {\n // Check if manually installed alongside devtools-server\n try {\n const pkg = _require.resolve('@cnstra/devtools-panel-ui/package.json');\n return join(dirname(pkg), 'dist');\n } catch {}\n // Monorepo fallback\n try {\n const here = dirname(_require.resolve('@cnstra/devtools-server/package.json'));\n const monorepoPath = join(here, '..', '..', 'devtools-panel-ui', 'dist');\n if (existsSync(join(monorepoPath, 'index.html'))) return monorepoPath;\n } catch {}\n return null;\n}\n\n// ─── Bridge: wrap CNS + registry into the shape devtools client expects ───────\n\nfunction makeCNSAdapter(\n cns: ICNS<TCNSNeuron<any, any>>,\n registry: CNSPersistOptionsRegistry\n) {\n return {\n addResponseListener: (l: (r: unknown) => void) => cns.addResponseListener(l as any),\n stimulate: (signal: unknown, opts: unknown) => cns.stimulate(signal as any, opts as any),\n getNeurons: () =>\n [...registry.getNamedNeurons().entries()].map(([name, n]) => ({\n name,\n axon: n.axon,\n dendrites: n.dendrites,\n })),\n getCollaterals: () => {\n const out: Array<{ name: string; createSignal: (p: unknown) => unknown }> = [];\n for (const [, n] of registry.getNamedNeurons()) {\n for (const [key, col] of Object.entries(n.axon)) {\n out.push({ name: key, createSignal: (p) => (col as CNSCollateral<unknown>).createSignal(p as any) });\n }\n }\n return out;\n },\n };\n}\n\n// ─── Static file handler ──────────────────────────────────────────────────────\n\nconst MIME: Record<string, string> = {\n html: 'text/html',\n js: 'application/javascript',\n css: 'text/css',\n svg: 'image/svg+xml',\n png: 'image/png',\n woff2:'font/woff2',\n};\n\nfunction serveStatic(panelUIDir: string) {\n return (_req: IncomingMessage, res: ServerResponse) => {\n const url = _req.url ?? '/';\n const safe = url.split('?')[0].replace(/\\.\\./g, '');\n const file = safe === '/' ? '/index.html' : safe;\n const full = join(panelUIDir, file);\n\n if (existsSync(full) && full.startsWith(panelUIDir)) {\n const ext = full.split('.').pop() ?? '';\n res.writeHead(200, { 'Content-Type': MIME[ext] ?? 'text/plain' });\n res.end(readFileSync(full));\n } else {\n const idx = join(panelUIDir, 'index.html');\n if (existsSync(idx)) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(readFileSync(idx));\n } else {\n res.writeHead(503);\n res.end('DevTools UI not built. Run: npm run build --workspace=@cnstra/devtools-panel-ui');\n }\n }\n };\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nexport type StartDevToolsOptions = {\n /** Port for both HTTP (UI) and WebSocket. Default: 3141 */\n port?: number;\n /** Automatically open browser. Default: true when running in a TTY */\n open?: boolean;\n /** App ID shown in DevTools. Default: 'app' */\n appId?: string;\n consoleLogEnabled?: boolean;\n};\n\nexport type DevToolsHandle = {\n /** URL of the DevTools UI */\n url: string;\n /** Stop the server */\n stop: () => void;\n};\n\n/**\n * Starts the CNStra DevTools UI and connects your CNS instance to it.\n * HTTP + WebSocket on the same port — open the URL in a browser to debug.\n *\n * @example\n * // dev.ts (excluded from prod entry point)\n * import { startDevTools } from '@cnstra/devtools-server';\n * import { cns } from './cns';\n * import { registry } from './neurons/registry';\n *\n * await startDevTools(cns, registry);\n * // → 🧠 CNStra DevTools: http://localhost:3141\n */\nexport async function startDevTools(\n cns: ICNS<TCNSNeuron<any, any>>,\n registry: CNSPersistOptionsRegistry,\n options: StartDevToolsOptions = {}\n): Promise<DevToolsHandle> {\n const port = options.port ?? 3141;\n const appId = options.appId ?? 'app';\n const logEnabled = options.consoleLogEnabled ?? false;\n const panelUIDir = findPanelUIDir();\n\n if (!panelUIDir) {\n console.warn(\n '\\n⚠️ CNStra DevTools UI not found.\\n' +\n ' WebSocket server will start but the UI will not be served.\\n' +\n ' Install @cnstra/devtools-panel-ui or build it from the monorepo.\\n'\n );\n }\n\n // HTTP + WebSocket on one port\n const httpServer = createServer(\n panelUIDir\n ? serveStatic(panelUIDir)\n : (_, res) => { res.writeHead(503); res.end('DevTools UI not available. See console for details.'); }\n );\n const wss = new WebSocketServer({ server: httpServer });\n\n const { CNSDevToolsServerRepositoryInMemory } = await import(\n '@cnstra/devtools-server-repository-in-memory'\n );\n const dtServer = new CNSDevToolsServer(\n new CNSDevToolsServerRepositoryInMemory(),\n { consoleLogEnabled: logEnabled }\n );\n\n const clients = new Set<WebSocket>();\n\n wss.on('connection', (ws) => {\n clients.add(ws);\n ws.on('message', async (data) => {\n try {\n const msg = JSON.parse(data.toString());\n const result = await dtServer.handleMessage(ws as any, msg);\n if (result) {\n const payload = JSON.stringify(result);\n clients.forEach(c => { if (c.readyState === WebSocket.OPEN) c.send(payload); });\n }\n } catch {}\n });\n ws.on('close', () => {\n clients.delete(ws);\n dtServer.handleDisconnect(ws as any);\n });\n });\n\n await new Promise<void>((resolve) => httpServer.listen(port, resolve));\n\n const url = `http://localhost:${port}`;\n\n // Connect client in-process\n const { CNSDevTools } = await import('@cnstra/devtools');\n const { CNSDevToolsTransportWs } = await import('@cnstra/devtools-transport-ws');\n\n const transport = new CNSDevToolsTransportWs({\n url: `ws://localhost:${port}`,\n });\n const devtools = new CNSDevTools(appId, transport as any, {\n devToolsInstanceName: appId,\n consoleLogEnabled: logEnabled,\n });\n devtools.registerCNS(makeCNSAdapter(cns, registry) as any, 'main');\n\n if (logEnabled || process.stdout.isTTY) {\n console.log(`\\n🧠 CNStra DevTools: ${url}\\n`);\n }\n\n const shouldOpen = options.open ?? process.stdout.isTTY;\n if (shouldOpen) {\n const { exec } = await import('child_process');\n const cmd = process.platform === 'darwin' ? 'open' :\n process.platform === 'win32' ? 'start' : 'xdg-open';\n exec(`${cmd} ${url}`);\n }\n\n return {\n url,\n stop: () => { wss.close(); httpServer.close(); },\n };\n}\n","import {\n DevToolsApp,\n InitMessage,\n NeuronResponseMessage,\n ResponseBatchMessage,\n AppsActiveMessage,\n AppDisconnectedMessage,\n StimulateCommand,\n StimulateAccepted,\n StimulateRejected,\n StimulationMessage,\n StimulationBatchMessage,\n Neuron,\n Collateral,\n Dendrite,\n StimulationResponse,\n} from '@cnstra/devtools-dto';\nimport { WebSocket } from 'ws';\n\n// Union type for all possible messages that can be broadcast\ntype BroadcastableMessage =\n | AppsActiveMessage\n | AppDisconnectedMessage\n | ResponseBatchMessage\n | StimulationBatchMessage\n | { type: 'app:added'; app: DevToolsApp }\n | {\n type: 'server:metrics';\n timestamp: number;\n rssMB: number;\n heapUsedMB: number;\n heapTotalMB: number;\n externalMB: number;\n cpuPercent: number;\n }\n | { type: 'apps:topology'; inits: InitMessage[] }\n | {\n type: 'apps:replays';\n appId: string;\n replays: Array<{ timestamp: number }>;\n }\n | { type: 'apps:export-stimulations'; stimulations: StimulationMessage[] }\n | {\n type: 'apps:snapshot';\n appId: string | null;\n topology: InitMessage[];\n stimulations: StimulationMessage[];\n responses: StimulationResponse[];\n createdAt: number;\n sizeBytes?: number;\n warning?: string;\n }\n | {\n type: 'cns:export-responses';\n cnsId: string;\n responses: StimulationResponse[];\n }\n | { type: 'apps:list'; apps: DevToolsApp[] }\n | {\n type: 'apps:cns';\n appId: string;\n cns: Array<{ cnsId: string; appId: string }>;\n }\n | {\n type: 'apps:responses';\n appId: string;\n responses: StimulationResponse[];\n total: number;\n offset: number;\n limit: number;\n }\n | {\n type: 'cns:responses';\n cnsId: string;\n responses: StimulationResponse[];\n };\n\nexport interface ICNSDevToolsServerRepository {\n // App management\n upsertApp(app: DevToolsApp): Promise<void> | void;\n listApps(): Promise<DevToolsApp[]> | DevToolsApp[];\n\n // Topology management\n upsertNeuron(neuron: Neuron): Promise<void> | void;\n upsertCollateral(collateral: Collateral): Promise<void> | void;\n upsertDendrite(dendrite: Dendrite): Promise<void> | void;\n removeNeuron?(neuronId: string): Promise<void> | void;\n removeCollateral?(collateralId: string): Promise<void> | void;\n removeDendrite?(dendriteId: string): Promise<void> | void;\n getNeuronsByCns(cnsId: string): Promise<Neuron[]> | Neuron[];\n getCollateralsByCns(cnsId: string): Promise<Collateral[]> | Collateral[];\n getDendritesByCns(cnsId: string): Promise<Dendrite[]> | Dendrite[];\n\n // Stimulation management\n saveStimulation(stimulation: StimulationMessage): Promise<void> | void;\n getStimulationsByApp(\n appId: string,\n filters?: {\n fromTimestamp?: number;\n toTimestamp?: number;\n limit?: number;\n offset?: number;\n hasError?: boolean;\n errorContains?: string;\n collateralName?: string;\n neuronId?: string;\n }\n ): Promise<StimulationMessage[]> | StimulationMessage[];\n\n // Response management\n saveResponse(response: StimulationResponse): Promise<void> | void;\n getResponsesByCns(\n cnsId: string,\n filters?: {\n fromTimestamp?: number;\n toTimestamp?: number;\n limit?: number;\n offset?: number;\n hasError?: boolean;\n errorContains?: string;\n neuronId?: string;\n collateralName?: string;\n }\n ): Promise<StimulationResponse[]> | StimulationResponse[];\n\n // Legacy message support\n saveMessage?(message: any): Promise<void> | void;\n\n // CNS management\n addCnsToApp(appId: string, cnsId: string): Promise<void> | void;\n removeCnsFromApp(appId: string, cnsId: string): Promise<void> | void;\n getCnsByApp(appId: string): Promise<string[]> | string[];\n findAppIdByCnsId(\n cnsId: string\n ): Promise<string | undefined> | string | undefined;\n\n // Replay management\n getReplaysByApp(\n appId: string,\n filters?: {\n fromTimestamp?: number;\n toTimestamp?: number;\n limit?: number;\n offset?: number;\n }\n ): Promise<Array<{ timestamp: number }>> | Array<{ timestamp: number }>;\n}\n\nexport class CNSDevToolsServer {\n private stopped = false;\n private appSockets = new Map<string, WebSocket>();\n private clientSockets = new Set<WebSocket>();\n private lastInitByApp = new Map<string, InitMessage>();\n private stimulationBuffer: StimulationMessage[] = [];\n // Track app connection times\n private appFirstSeenAt = new Map<string, number>();\n private appLastSeenAt = new Map<string, number>();\n private replaysByApp = new Map<\n string,\n Array<{\n stimulationCommandId: string;\n appId: string;\n cnsId?: string;\n collateralName?: string;\n payload?: unknown;\n contexts?: unknown;\n options?: unknown;\n timestamp: number;\n result?: 'accepted' | 'rejected';\n }>\n >();\n\n // server metrics sampling\n private lastCpuUsage = process.cpuUsage();\n private lastCpuTime = Date.now();\n private metricsTimer?: NodeJS.Timeout;\n\n private static sanitizeValue(\n value: unknown,\n depth: number = 0,\n limits: {\n maxDepth: number;\n maxString: number;\n maxArray: number;\n maxObjectKeys: number;\n } = {\n maxDepth: 5,\n maxString: 2000,\n maxArray: 200,\n maxObjectKeys: 200,\n }\n ): unknown {\n if (value === null || value === undefined) return value;\n if (depth >= limits.maxDepth) return '[MaxDepth]';\n const t = typeof value;\n if (t === 'string') {\n const s = value as string;\n return s.length > limits.maxString\n ? s.slice(0, limits.maxString) +\n `…[+${s.length - limits.maxString}]`\n : s;\n }\n if (\n t === 'number' ||\n t === 'boolean' ||\n t === 'bigint' ||\n t === 'symbol'\n )\n return value;\n if (t === 'function') return '[Function]';\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n }\n if (Array.isArray(value)) {\n const arr = value as unknown[];\n const slice = arr.slice(0, limits.maxArray);\n const mapped = slice.map(v =>\n this.sanitizeValue(v, depth + 1, limits)\n );\n if (arr.length > slice.length)\n mapped.push(`[…+${arr.length - slice.length} items]`);\n return mapped;\n }\n if (t === 'object') {\n const out: Record<string, unknown> = {};\n const entries = Object.entries(value as Record<string, unknown>);\n const slice = entries.slice(0, limits.maxObjectKeys);\n for (const [k, v] of slice) {\n out[k] = this.sanitizeValue(v, depth + 1, limits);\n }\n if (entries.length > slice.length) {\n out['…'] = `+${entries.length - slice.length} keys`;\n }\n return out;\n }\n return value;\n }\n\n constructor(\n private repository: ICNSDevToolsServerRepository,\n private readonly options: { consoleLogEnabled?: boolean } = {}\n ) {}\n\n private log(...args: unknown[]): void {\n if (this.options.consoleLogEnabled) {\n console.log(...args);\n }\n }\n\n private isNeuronResponseMessage(\n message: unknown\n ): message is NeuronResponseMessage {\n return (\n message !== null &&\n typeof message === 'object' &&\n 'stimulationId' in message &&\n 'neuronId' in message &&\n 'appId' in message &&\n 'collateralName' in message &&\n 'timestamp' in message &&\n typeof (message as any).stimulationId === 'string' &&\n typeof (message as any).neuronId === 'string' &&\n typeof (message as any).appId === 'string' &&\n typeof (message as any).collateralName === 'string' &&\n typeof (message as any).timestamp === 'number' &&\n !('type' in message)\n ); // No type field indicates raw NeuronResponseMessage\n }\n\n private isMessageWithType(message: unknown): message is { type: string } {\n return (\n message !== null &&\n typeof message === 'object' &&\n 'type' in message &&\n typeof (message as any).type === 'string'\n );\n }\n\n // Expose sockets map size for tests\n /** @internal */\n get connectedAppCount(): number {\n return this.appSockets.size;\n }\n\n private static applyWindowAndPaginate<T extends { timestamp: number }>(\n items: ReadonlyArray<T>,\n params: {\n fromTimestamp?: number;\n toTimestamp?: number;\n offset?: number;\n limit?: number;\n }\n ): T[] {\n const { fromTimestamp, toTimestamp } = params;\n const offset = Math.max(0, params.offset ?? 0);\n const limit =\n params.limit !== undefined && params.limit > 0\n ? params.limit\n : undefined;\n\n // Copy, filter by time window, sort ASC by timestamp\n const filtered = items\n .filter(\n item =>\n (fromTimestamp === undefined ||\n item.timestamp >= fromTimestamp) &&\n (toTimestamp === undefined || item.timestamp <= toTimestamp)\n )\n .slice() // avoid mutating original arrays\n .sort((a, b) => a.timestamp - b.timestamp);\n\n if (offset > 0 || limit !== undefined) {\n return filtered.slice(\n offset,\n limit !== undefined ? offset + limit : undefined\n );\n }\n return filtered;\n }\n\n async handleMessage(ws: WebSocket, message: unknown): Promise<unknown> {\n if (!this.isMessageWithType(message)) {\n if (this.options.consoleLogEnabled) {\n console.warn('Unknown message format:', message);\n }\n return null;\n }\n\n switch (message.type) {\n case 'devtools-client-connect':\n this.log('DevTools client connecting...');\n this.addClient(ws);\n // Start metrics loop if not already started\n if (!this.metricsTimer) {\n this.startMetricsLoop();\n }\n // Send response to client\n ws.send(JSON.stringify({ type: 'devtools-client-connected' }));\n this.log('DevTools client connected, total clients:', this.clientSockets.size);\n return { type: 'devtools-client-connected' };\n\n case 'init':\n return this.handleInit(ws, message as InitMessage);\n\n case 'batch':\n return this.handleBatch(\n ws,\n message as { type: string; items?: unknown[] }\n );\n\n case 'neuron-response-batch':\n case 'response-batch':\n return this.handleResponseBatch(\n ws,\n message as ResponseBatchMessage\n );\n\n case 'stimulate':\n return this.handleStimulate(ws, message as StimulateCommand);\n\n case 'stimulate-accepted':\n // Forward ack to clients\n try {\n const msg = message as StimulateAccepted;\n const cmdId = msg.stimulationCommandId;\n const appId = msg.appId;\n if (cmdId && appId) {\n const arr = this.replaysByApp.get(appId) || [];\n // Update latest matching replay by command id\n for (let i = arr.length - 1; i >= 0; i--) {\n if (arr[i].stimulationCommandId === cmdId) {\n arr[i].result = 'accepted';\n break;\n }\n }\n this.replaysByApp.set(appId, arr);\n }\n } catch {}\n return message as StimulateAccepted;\n\n case 'stimulate-rejected':\n // Forward nack to clients\n try {\n const msg = message as StimulateRejected;\n const cmdId = msg.stimulationCommandId;\n const appId = msg.appId;\n if (cmdId && appId) {\n const arr = this.replaysByApp.get(appId) || [];\n for (let i = arr.length - 1; i >= 0; i--) {\n if (arr[i].stimulationCommandId === cmdId) {\n arr[i].result = 'rejected';\n break;\n }\n }\n this.replaysByApp.set(appId, arr);\n }\n } catch {}\n return message as StimulateRejected;\n\n case 'stimulation':\n return this.handleStimulation(\n ws,\n message as StimulationMessage\n );\n\n case 'apps:get-topology': {\n const inits = Array.from(this.lastInitByApp.values());\n return { type: 'apps:topology', inits };\n }\n\n case 'apps:get-stimulations': {\n const msg = message as {\n appId?: string;\n limit?: number;\n fromTimestamp?: number;\n toTimestamp?: number;\n offset?: number;\n hasError?: boolean;\n errorContains?: string;\n collateralName?: string;\n neuronId?: string;\n };\n const {\n appId,\n limit,\n fromTimestamp,\n toTimestamp,\n offset,\n hasError,\n errorContains,\n collateralName,\n neuronId,\n } = msg;\n\n let stimulations: StimulationMessage[] = [];\n if (appId) {\n // Use normalized repository\n stimulations = await this.repository.getStimulationsByApp(\n appId,\n {\n fromTimestamp,\n toTimestamp,\n limit,\n offset,\n hasError,\n errorContains,\n collateralName,\n neuronId,\n }\n );\n } else {\n // Get all stimulations from all apps using repository\n const apps = await this.repository.listApps();\n for (const app of apps) {\n const appStimulations =\n await this.repository.getStimulationsByApp(\n app.appId,\n {\n fromTimestamp,\n toTimestamp,\n limit,\n offset,\n hasError,\n errorContains,\n collateralName,\n neuronId,\n }\n );\n stimulations = stimulations.concat(appStimulations);\n }\n // Filters and pagination are already applied in repository calls\n return {\n type: 'stimulation-batch',\n stimulations,\n } as StimulationBatchMessage;\n }\n\n // Filters and pagination are already applied in repository call\n return {\n type: 'stimulation-batch',\n stimulations,\n } as StimulationBatchMessage;\n }\n\n case 'apps:get-replays': {\n const msg = message as {\n appId?: string;\n limit?: number;\n fromTimestamp?: number;\n toTimestamp?: number;\n offset?: number;\n };\n const { appId, limit, fromTimestamp, toTimestamp, offset } =\n msg;\n if (!appId) {\n return { type: 'apps:replays', replays: [] };\n }\n let list = this.replaysByApp.get(appId) || [];\n\n // Apply filters\n if (fromTimestamp !== undefined) {\n list = list.filter(r => r.timestamp >= fromTimestamp);\n }\n if (toTimestamp !== undefined) {\n list = list.filter(r => r.timestamp <= toTimestamp);\n }\n\n // Sort by timestamp descending (most recent first)\n list = list.sort((a, b) => b.timestamp - a.timestamp);\n\n // Apply offset and limit\n if (offset !== undefined && offset > 0) {\n list = list.slice(offset);\n }\n if (limit !== undefined && limit > 0) {\n list = list.slice(0, limit);\n }\n\n return { type: 'apps:replays', appId, replays: list };\n }\n\n // Export endpoints (JSON export over WS)\n case 'apps:export-topology': {\n const { appId } = message as any;\n const inits = Array.from(this.lastInitByApp.values());\n if (appId) {\n const filtered = inits.filter(init => {\n const baseAppId =\n (init as any).appId ||\n (init as any).devToolsInstanceId;\n return baseAppId === appId;\n });\n return { type: 'apps:topology', inits: filtered } as any;\n }\n return { type: 'apps:topology', inits } as any;\n }\n\n case 'apps:export-stimulations': {\n const {\n appId,\n limit,\n fromTimestamp,\n toTimestamp,\n offset,\n hasError,\n errorContains,\n collateralName,\n neuronId,\n } = message as any;\n let stimulations: StimulationMessage[] = [];\n if (appId) {\n stimulations = await this.repository.getStimulationsByApp(\n appId,\n {\n fromTimestamp,\n toTimestamp,\n limit,\n offset,\n hasError,\n errorContains,\n collateralName,\n neuronId,\n }\n );\n } else {\n // Get all stimulations from all apps\n const apps = await this.repository.listApps();\n for (const app of apps) {\n const appStimulations =\n await this.repository.getStimulationsByApp(\n app.appId,\n {\n fromTimestamp,\n toTimestamp,\n limit,\n offset,\n hasError,\n errorContains,\n collateralName,\n neuronId,\n }\n );\n stimulations = stimulations.concat(appStimulations);\n }\n }\n // Filters and pagination are already applied in repository calls\n return {\n type: 'apps:export-stimulations',\n stimulations,\n } as any;\n }\n\n case 'apps:export-snapshot': {\n const { appId, limitResponses, limitStimulations } =\n message as any;\n const inits = Array.from(this.lastInitByApp.values());\n const topology = appId\n ? inits.filter(\n init =>\n ((init as any).appId ||\n (init as any).devToolsInstanceId) === appId\n )\n : inits;\n // Collect stimulations from repository\n let stimulations: StimulationMessage[] = [];\n if (appId) {\n stimulations = await this.repository.getStimulationsByApp(\n appId\n );\n } else {\n const apps = await this.repository.listApps();\n for (const app of apps) {\n const appStimulations =\n await this.repository.getStimulationsByApp(\n app.appId\n );\n stimulations = stimulations.concat(appStimulations);\n }\n }\n\n // Collect responses from repository\n const responses: StimulationResponse[] = [];\n if (appId) {\n // Get all CNS for this app\n const cnsIds = await this.repository.getCnsByApp(appId);\n for (const cnsId of cnsIds) {\n const cnsResponses =\n await this.repository.getResponsesByCns(cnsId);\n responses.push(...cnsResponses);\n }\n } else {\n // Get all responses from all CNS\n const apps = await this.repository.listApps();\n for (const app of apps) {\n const cnsIds = await this.repository.getCnsByApp(\n app.appId\n );\n for (const cnsId of cnsIds) {\n const cnsResponses =\n await this.repository.getResponsesByCns(cnsId);\n responses.push(...cnsResponses);\n }\n }\n }\n const tail = <T>(arr: T[], n?: number) =>\n typeof n === 'number' && n > 0\n ? arr.slice(Math.max(0, arr.length - n))\n : arr;\n const sanitizedStim = tail(stimulations, limitStimulations).map(\n s => ({\n ...s,\n payload: CNSDevToolsServer.sanitizeValue(\n (s as any).payload\n ),\n })\n );\n const sanitizedResp = tail(responses, limitResponses).map(\n r => ({\n ...r,\n payload: CNSDevToolsServer.sanitizeValue(\n (r as any).payload\n ),\n contexts: CNSDevToolsServer.sanitizeValue(\n (r as any).contexts\n ),\n })\n );\n const snapshot = {\n type: 'apps:snapshot',\n appId: appId || null,\n topology,\n stimulations: sanitizedStim,\n responses: sanitizedResp,\n createdAt: Date.now(),\n } as any;\n try {\n const sizeBytes = Buffer.byteLength(\n JSON.stringify(snapshot)\n );\n (snapshot as any).sizeBytes = sizeBytes;\n const maxBytes = 5 * 1024 * 1024; // 5MB\n if (sizeBytes > maxBytes) {\n (\n snapshot as any\n ).warning = `Snapshot size ${sizeBytes} bytes exceeds ${maxBytes} bytes; consider narrowing filters.`;\n }\n } catch {}\n return snapshot;\n }\n\n case 'cns:export-responses': {\n const {\n cnsId,\n limit,\n fromTimestamp,\n toTimestamp,\n offset,\n hasError,\n errorContains,\n neuronId,\n collateralName,\n } = message as any;\n const responsesAll = await this.repository.getResponsesByCns(\n cnsId,\n {\n fromTimestamp,\n toTimestamp,\n limit,\n offset,\n hasError,\n errorContains,\n neuronId,\n collateralName,\n }\n );\n // Filters and pagination are already applied in repository call\n return {\n type: 'cns:export-responses',\n cnsId,\n responses: responsesAll,\n } as any;\n }\n\n // REST-like over WS\n case 'apps:list': {\n const apps = await this.repository.listApps();\n return { type: 'apps:list', apps };\n }\n case 'apps:get-cns': {\n const { appId } = message as any;\n const cnsIds = await this.repository.getCnsByApp(appId);\n const cns = cnsIds.map(cnsId => ({ cnsId, appId }));\n return { type: 'apps:cns', appId, cns };\n }\n\n case 'apps:get-responses': {\n const {\n appId,\n limit,\n fromTimestamp,\n toTimestamp,\n offset,\n hasError,\n errorContains,\n neuronId,\n collateralName,\n } = message as any;\n\n // Get all responses from all CNS for the app\n let allResponses: StimulationResponse[] = [];\n if (appId) {\n const cnsIds = await this.repository.getCnsByApp(appId);\n for (const cnsId of cnsIds) {\n const responses =\n await this.repository.getResponsesByCns(cnsId, {\n fromTimestamp,\n toTimestamp,\n hasError,\n errorContains,\n neuronId,\n collateralName,\n });\n allResponses = allResponses.concat(responses);\n }\n } else {\n // Get all responses from all CNS\n const apps = await this.repository.listApps();\n for (const app of apps) {\n const cnsIds = await this.repository.getCnsByApp(\n app.appId\n );\n for (const cnsId of cnsIds) {\n const responses =\n await this.repository.getResponsesByCns(cnsId, {\n fromTimestamp,\n toTimestamp,\n hasError,\n errorContains,\n neuronId,\n collateralName,\n });\n allResponses = allResponses.concat(responses);\n }\n }\n }\n\n // Filters and pagination are already applied in repository calls\n\n // Sort by timestamp descending\n allResponses.sort((a, b) => b.timestamp - a.timestamp);\n\n const response = {\n type: 'apps:responses',\n appId: appId || 'all',\n responses: allResponses,\n total: allResponses.length,\n offset: offset || 0,\n limit: limit || allResponses.length,\n };\n\n // Send response to client\n ws.send(JSON.stringify(response));\n return response;\n }\n case 'cns:get-responses': {\n const msg = message as {\n cnsId?: string;\n limit?: number;\n fromTimestamp?: number;\n toTimestamp?: number;\n offset?: number;\n hasError?: boolean;\n errorContains?: string;\n neuronId?: string;\n collateralName?: string;\n };\n const {\n cnsId,\n limit,\n fromTimestamp,\n toTimestamp,\n offset,\n hasError,\n errorContains,\n neuronId,\n collateralName,\n } = msg;\n\n if (!cnsId) {\n return { type: 'cns:responses', cnsId: '', responses: [] };\n }\n\n // Use normalized repository\n const responses = await this.repository.getResponsesByCns(\n cnsId,\n {\n fromTimestamp,\n toTimestamp,\n limit,\n offset,\n hasError,\n errorContains,\n neuronId,\n collateralName,\n }\n );\n\n return { type: 'cns:responses', cnsId, responses };\n }\n\n default:\n this.log('Unknown message type:', message.type);\n return null;\n }\n }\n\n async handleInit(\n ws: WebSocket,\n message: InitMessage\n ): Promise<AppsActiveMessage> {\n // Prefer new clean fields from InitMessage\n const baseAppId = message.appId || message.devToolsInstanceId;\n const cnsId = message.cnsId || message.devToolsInstanceId;\n\n if (!baseAppId || !cnsId) {\n throw new Error('Invalid InitMessage: missing appId or cnsId');\n }\n\n this.lastInitByApp.set(cnsId, message);\n\n // Track connection times\n const now = Date.now();\n if (!this.appFirstSeenAt.has(baseAppId)) {\n this.appFirstSeenAt.set(baseAppId, now);\n }\n this.appLastSeenAt.set(baseAppId, now);\n\n const app: DevToolsApp = {\n appId: baseAppId,\n appName: message.appName,\n version: message.version!,\n firstSeenAt: this.appFirstSeenAt.get(baseAppId)!,\n lastSeenAt: now,\n };\n\n // Removed verbose logging\n await this.repository.upsertApp(app);\n\n this.appSockets.set(cnsId, ws);\n\n // Clean up old topology data for this CNS before storing new one\n // This ensures that if the app reconnects with different topology,\n // old neurons/collaterals/dendrites are removed\n const existingNeurons = await this.repository.getNeuronsByCns(cnsId);\n const existingCollaterals = await this.repository.getCollateralsByCns(\n cnsId\n );\n const existingDendrites = await this.repository.getDendritesByCns(\n cnsId\n );\n\n // Remove old topology from repository\n for (const neuron of existingNeurons) {\n if (this.repository.removeNeuron) {\n await this.repository.removeNeuron(neuron.id);\n }\n }\n for (const collateral of existingCollaterals) {\n if (this.repository.removeCollateral) {\n await this.repository.removeCollateral(collateral.id);\n }\n }\n for (const dendrite of existingDendrites) {\n if (this.repository.removeDendrite) {\n await this.repository.removeDendrite(dendrite.id);\n }\n }\n\n // Store new topology in normalized repository\n for (const neuron of message.neurons || []) {\n await this.repository.upsertNeuron(neuron);\n }\n for (const collateral of message.collaterals || []) {\n await this.repository.upsertCollateral(collateral);\n }\n for (const dendrite of message.dendrites || []) {\n await this.repository.upsertDendrite(dendrite);\n }\n\n await this.repository.addCnsToApp(app.appId, cnsId);\n\n this.log(`App connected: ${message.appName} (${message.devToolsInstanceId})`);\n this.log(`Topology: ${message.neurons.length} neurons, ${message.collaterals.length} collaterals, ${message.dendrites.length} dendrites`);\n\n // Return apps list to broadcast\n const apps = await this.repository.listApps();\n\n // Send app:added event to all connected clients\n this.broadcastToClients({\n type: 'app:added',\n app: app,\n });\n\n // Additionally broadcast the full apps:active list so late-joined devtools panels\n // can reliably refresh their app list even if they miss app:added for any reason\n this.log('Broadcasting apps:active to', this.clientSockets.size, 'clients:', {\n appsCount: apps.length,\n appIds: apps.map(a => a.appId),\n });\n this.broadcastToClients({\n type: 'apps:active',\n apps: apps,\n });\n\n return {\n type: 'apps:active',\n apps: apps,\n };\n }\n\n async handleBatch(\n ws: WebSocket,\n message: { type: string; items?: unknown[] }\n ): Promise<void> {\n this.log('Server handling batch with', message.items?.length || 0, 'items');\n\n if (!Array.isArray(message.items)) {\n if (this.options.consoleLogEnabled) {\n console.warn('Invalid batch message - no items array');\n }\n return;\n }\n\n // Group responses together (same logic as example-app)\n const responses: unknown[] = [];\n for (const item of message.items || []) {\n const actualMessage = (item as any).payload || item;\n if ((item as any).type === 'response') {\n responses.push(actualMessage);\n } else {\n // Handle non-response messages individually\n this.log('Batch item (non-response):', {\n type: (actualMessage as any)?.type,\n });\n await this.handleMessage(ws, actualMessage);\n }\n }\n\n // Send response batch if we have responses\n if (responses.length > 0) {\n this.log('Creating response-batch with', responses.length, 'responses');\n const responseBatch = {\n type: 'response-batch' as const,\n devToolsInstanceId:\n (responses[0] as any).cnsId ||\n (responses[0] as any).appId ||\n 'unknown',\n responses: responses as NeuronResponseMessage[],\n };\n await this.handleResponseBatch(\n ws,\n responseBatch as ResponseBatchMessage\n );\n }\n }\n\n async handleResponseBatch(\n ws: WebSocket,\n message: ResponseBatchMessage\n ): Promise<ResponseBatchMessage> {\n // Check for replay responses\n const replayResponses = (message.responses || []).filter(r => {\n const stimId = r.stimulationId || '';\n return typeof stimId === 'string' && stimId.includes('-replay-');\n });\n\n if (replayResponses.length > 0) {\n this.log('[Server] Received REPLAY response-batch:', {\n totalResponses: message.responses?.length || 0,\n replayResponsesCount: replayResponses.length,\n replayStimIds: replayResponses\n .slice(0, 3)\n .map(r => r.stimulationId),\n replayAppIds: replayResponses.slice(0, 3).map(r => r.appId),\n });\n }\n\n // Update lastSeenAt for the app\n if (message.responses && message.responses.length > 0) {\n const appId = message.responses[0].appId;\n if (appId) {\n this.appLastSeenAt.set(appId, Date.now());\n }\n }\n\n // Persist responses in normalized repository\n for (const response of message.responses) {\n await this.repository.saveResponse(response);\n }\n\n // Broadcast to all devtools clients\n this.broadcastToClients(message);\n\n // Forward to clients\n return message;\n }\n\n async handleStimulate(\n ws: WebSocket,\n message: StimulateCommand\n ): Promise<null> {\n // Removed verbose logging\n\n // Determine routing target: prefer cnsId, else appId, else broadcast\n const cnsIdFromCmd = (message as any).cnsId as string | undefined;\n const appIdFromCmd = (message as any).appId as string | undefined;\n\n try {\n // Persist replay intent for history (best effort)\n try {\n const entry = {\n stimulationCommandId: (message as any).stimulationCommandId,\n appId: (message as any).appId,\n cnsId: (message as any).cnsId,\n collateralName: (message as any).collateralName,\n payload: (message as any).payload,\n contexts: (message as any).contexts,\n options: (message as any).options,\n timestamp: Date.now(),\n };\n const arr = this.replaysByApp.get(entry.appId) || [];\n arr.push(entry);\n if (arr.length > 1000) arr.splice(0, arr.length - 1000);\n this.replaysByApp.set(entry.appId, arr);\n } catch {}\n\n if (cnsIdFromCmd) {\n const appWs = this.appSockets.get(cnsIdFromCmd);\n if (appWs && appWs.readyState === 1) {\n appWs.send(JSON.stringify(message));\n this.log(`Stimulate forwarded to cns ${cnsIdFromCmd}`);\n } else {\n if (this.options.consoleLogEnabled) {\n console.warn(`CNS socket not available for ${cnsIdFromCmd}`);\n }\n }\n } else if (appIdFromCmd) {\n const cnsIds = await this.repository.getCnsByApp(appIdFromCmd);\n let count = 0;\n for (const cnsId of cnsIds) {\n const appWs = this.appSockets.get(cnsId);\n if (appWs && appWs.readyState === 1) {\n appWs.send(JSON.stringify(message));\n count++;\n }\n }\n this.log(`Stimulate forwarded to ${count} CNS of app ${appIdFromCmd}`);\n } else {\n // Fallback: broadcast to all app sockets\n let count = 0;\n for (const [, appWs] of Array.from(this.appSockets.entries())) {\n if (appWs.readyState === 1) {\n appWs.send(JSON.stringify(message));\n count++;\n }\n }\n // Removed verbose logging\n }\n } catch (e) {\n if (this.options.consoleLogEnabled) {\n console.error('Failed to forward stimulate:', e);\n }\n }\n\n return null;\n }\n\n async handleDisconnect(ws: WebSocket): Promise<void> {\n // Remove from app sockets\n for (const [cnsId, socket] of Array.from(this.appSockets.entries())) {\n if (socket === ws) {\n this.appSockets.delete(cnsId);\n this.log(`CNS disconnected: ${cnsId}`);\n\n // Derive base appId from cnsId\n const sepIdx = cnsId.indexOf(':');\n const baseAppId = sepIdx > 0 ? cnsId.slice(0, sepIdx) : cnsId;\n\n // Remove per-CNS cached topology\n this.lastInitByApp.delete(cnsId);\n\n // Update cnsByApp mapping\n await this.repository.removeCnsFromApp(baseAppId, cnsId);\n break;\n }\n }\n\n // Remove from client sockets\n this.clientSockets.delete(ws);\n }\n\n addClient(ws: WebSocket): void {\n this.clientSockets.add(ws);\n // start metrics loop on first client\n if (!this.metricsTimer) {\n this.startMetricsLoop();\n }\n\n // Handle client disconnection when the socket implementation supports events.\n const eventedWs = ws as WebSocket & {\n on?: (event: string, listener: () => void) => void;\n addEventListener?: (event: string, listener: () => void) => void;\n };\n const remove = () => this.removeClient(ws);\n\n if (eventedWs.on) {\n eventedWs.on('close', remove);\n eventedWs.on('error', remove);\n } else if (eventedWs.addEventListener) {\n eventedWs.addEventListener('close', remove);\n eventedWs.addEventListener('error', remove);\n }\n }\n\n removeClient(ws: WebSocket): void {\n this.clientSockets.delete(ws);\n }\n\n async handleStimulation(\n ws: WebSocket,\n message: StimulationMessage\n ): Promise<void> {\n // Removed verbose logging - too frequent\n\n // Store stimulation in normalized repository\n await this.repository.saveStimulation(message);\n\n // Add to buffer for batch sending\n this.stimulationBuffer.push(message);\n\n // Send immediately to all connected devtools clients\n this.broadcastToClients({\n type: 'stimulation-batch',\n stimulations: [message],\n } as StimulationBatchMessage);\n }\n\n private broadcastToClients(message: BroadcastableMessage): void {\n const messageStr = JSON.stringify(message);\n let sentCount = 0;\n this.clientSockets.forEach(clientWs => {\n if (clientWs.readyState === 1) {\n // WebSocket.OPEN\n try {\n clientWs.send(messageStr);\n sentCount++;\n } catch (error) {\n if (this.options.consoleLogEnabled) {\n console.error('Failed to send message to client:', error);\n }\n }\n }\n });\n // Only log if not all clients received the message\n if (sentCount !== this.clientSockets.size && this.options.consoleLogEnabled) {\n console.warn(\n `Sent message to ${sentCount}/${this.clientSockets.size} clients`\n );\n }\n }\n\n private startMetricsLoop(): void {\n // Don't start if already running\n if (this.metricsTimer) {\n return;\n }\n\n this.lastCpuUsage = process.cpuUsage();\n this.lastCpuTime = Date.now();\n this.metricsTimer = setInterval(() => {\n if (this.stopped) {\n clearInterval(this.metricsTimer);\n this.metricsTimer = undefined;\n return;\n }\n try {\n const mem = process.memoryUsage();\n const now = Date.now();\n const cpu = process.cpuUsage(this.lastCpuUsage);\n const elapsedMs = Math.max(1, now - this.lastCpuTime);\n const userMs = cpu.user / 1000;\n const systemMs = cpu.system / 1000;\n const cpuPercent = Math.min(\n 100,\n Math.round(((userMs + systemMs) / elapsedMs) * 100)\n );\n this.lastCpuUsage = process.cpuUsage();\n this.lastCpuTime = now;\n\n const payload = {\n type: 'server:metrics',\n timestamp: now,\n rssMB: Math.round((mem.rss / 1024 / 1024) * 100) / 100,\n heapUsedMB:\n Math.round((mem.heapUsed / 1024 / 1024) * 100) / 100,\n heapTotalMB:\n Math.round((mem.heapTotal / 1024 / 1024) * 100) / 100,\n externalMB:\n Math.round((mem.external / 1024 / 1024) * 100) / 100,\n cpuPercent,\n } as any;\n this.broadcastToClients(payload);\n } catch {}\n }, 1000);\n }\n\n async getActiveApps(): Promise<DevToolsApp[]> {\n return await this.repository.listApps();\n }\n\n stop(): void {\n this.log('Stopping server.');\n this.stopped = true;\n // Clear metrics timer\n if (this.metricsTimer) {\n clearInterval(this.metricsTimer);\n this.metricsTimer = undefined;\n }\n\n // Close all app sockets\n for (const ws of Array.from(this.appSockets.values())) {\n ws.close();\n }\n this.appSockets.clear();\n\n // Close all client sockets\n for (const ws of Array.from(this.clientSockets)) {\n ws.close();\n }\n this.clientSockets.clear();\n\n // Clear all data\n this.lastInitByApp.clear();\n this.stimulationBuffer = [];\n this.appFirstSeenAt.clear();\n this.appLastSeenAt.clear();\n this.replaysByApp.clear();\n }\n}\n\nexport { startDevTools } from './start';\nexport type { StartDevToolsOptions, DevToolsHandle } from './start';\n"]}
|
package/dist/start.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ICNS, TCNSNeuron, CNSPersistOptionsRegistry } from '@cnstra/core';
|
|
2
|
+
export type StartDevToolsOptions = {
|
|
3
|
+
/** Port for both HTTP (UI) and WebSocket. Default: 3141 */
|
|
4
|
+
port?: number;
|
|
5
|
+
/** Automatically open browser. Default: true when running in a TTY */
|
|
6
|
+
open?: boolean;
|
|
7
|
+
/** App ID shown in DevTools. Default: 'app' */
|
|
8
|
+
appId?: string;
|
|
9
|
+
consoleLogEnabled?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type DevToolsHandle = {
|
|
12
|
+
/** URL of the DevTools UI */
|
|
13
|
+
url: string;
|
|
14
|
+
/** Stop the server */
|
|
15
|
+
stop: () => void;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Starts the CNStra DevTools UI and connects your CNS instance to it.
|
|
19
|
+
* HTTP + WebSocket on the same port — open the URL in a browser to debug.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // dev.ts (excluded from prod entry point)
|
|
23
|
+
* import { startDevTools } from '@cnstra/devtools-server';
|
|
24
|
+
* import { cns } from './cns';
|
|
25
|
+
* import { registry } from './neurons/registry';
|
|
26
|
+
*
|
|
27
|
+
* await startDevTools(cns, registry);
|
|
28
|
+
* // → 🧠 CNStra DevTools: http://localhost:3141
|
|
29
|
+
*/
|
|
30
|
+
export declare function startDevTools(cns: ICNS<TCNSNeuron<any, any>>, registry: CNSPersistOptionsRegistry, options?: StartDevToolsOptions): Promise<DevToolsHandle>;
|
|
31
|
+
//# sourceMappingURL=start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,yBAAyB,EAAiB,MAAM,cAAc,CAAC;AAsF/F,MAAM,MAAM,oBAAoB,GAAG;IAC/B,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IACzB,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,sBAAsB;IACtB,IAAI,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CAC/B,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAC/B,QAAQ,EAAE,yBAAyB,EACnC,OAAO,GAAE,oBAAyB,GACnC,OAAO,CAAC,cAAc,CAAC,CAmFzB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cnstra/devtools-server",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "CNStra DevTools server (WebSocket only for now)",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"cnstra",
|
|
7
|
+
"devtools",
|
|
8
|
+
"server",
|
|
9
|
+
"websocket"
|
|
10
|
+
],
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "./dist/index.cjs",
|
|
13
|
+
"module": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"sideEffects": false,
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js",
|
|
20
|
+
"require": "./dist/index.cjs"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"bin": {
|
|
24
|
+
"cnstra-devtools": "./dist/cli.js"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsup && tsc --emitDeclarationOnly",
|
|
28
|
+
"build:types": "tsc --emitDeclarationOnly",
|
|
29
|
+
"start": "node dist/index.js",
|
|
30
|
+
"prepublishOnly": "npm run test && npm run build",
|
|
31
|
+
"test": "jest"
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist"
|
|
35
|
+
],
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@cnstra/devtools-dto": "1.0.0",
|
|
38
|
+
"@cnstra/devtools-server-repository-in-memory": "1.1.0",
|
|
39
|
+
"ws": "^8.18.0"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@cnstra/core": "2.1.0",
|
|
43
|
+
"@cnstra/devtools": "^1.0.1",
|
|
44
|
+
"@cnstra/devtools-panel-ui": "^1.0.0",
|
|
45
|
+
"@cnstra/devtools-transport-ws": "^1.0.0"
|
|
46
|
+
},
|
|
47
|
+
"peerDependenciesMeta": {
|
|
48
|
+
"@cnstra/devtools-panel-ui": {
|
|
49
|
+
"optional": true
|
|
50
|
+
},
|
|
51
|
+
"@cnstra/devtools": {
|
|
52
|
+
"optional": true
|
|
53
|
+
},
|
|
54
|
+
"@cnstra/devtools-transport-ws": {
|
|
55
|
+
"optional": true
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/node": "^22.7.4",
|
|
60
|
+
"@types/ws": "^8.5.10",
|
|
61
|
+
"jest": "^29.7.0",
|
|
62
|
+
"ts-jest": "^29.1.2",
|
|
63
|
+
"tsup": "8.5.1",
|
|
64
|
+
"typescript": "^5.8.3"
|
|
65
|
+
},
|
|
66
|
+
"author": "Andrei Baikov <abaikov23@gmail.com>",
|
|
67
|
+
"license": "MIT",
|
|
68
|
+
"publishConfig": {
|
|
69
|
+
"access": "public"
|
|
70
|
+
}
|
|
71
|
+
}
|