dsh-codegraph-visualizer 0.1.0 → 0.3.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.
Files changed (58) hide show
  1. package/README.md +391 -223
  2. package/assets/icon-180.png +0 -0
  3. package/assets/icon.svg +30 -0
  4. package/cordis.patch.yml +22 -17
  5. package/dist/CodeGraphAdapter-C8JvcS7m.js +10 -0
  6. package/dist/CodeGraphAdapter-eyrhs0K0.js +422 -0
  7. package/dist/CodeGraphAdapter-eyrhs0K0.js.map +1 -0
  8. package/dist/FileSystemAdapter-CgasSGbB.js +524 -0
  9. package/dist/FileSystemAdapter-CgasSGbB.js.map +1 -0
  10. package/dist/LensAdapter-C9Saf_i_.js +89 -0
  11. package/dist/LensAdapter-C9Saf_i_.js.map +1 -0
  12. package/dist/Logger-DUIJSeNu.js +80 -0
  13. package/dist/Logger-DUIJSeNu.js.map +1 -0
  14. package/dist/TreeSitterAdapter-C-EWy8br.js +631 -0
  15. package/dist/TreeSitterAdapter-C-EWy8br.js.map +1 -0
  16. package/dist/TreeSitterAdapter-C6FcO2_s.js +8 -0
  17. package/dist/client/index.css +8900 -1777
  18. package/dist/client/index.css.map +1 -0
  19. package/dist/client/index.d.ts +634 -0
  20. package/dist/client/index.d.ts.map +1 -0
  21. package/dist/client/index.esm.js +57219 -20978
  22. package/dist/client/index.js.map +1 -0
  23. package/dist/client/{index.js → worker/layoutWorker.js} +7657 -8787
  24. package/dist/client.js +90067 -0
  25. package/dist/codeGraphDb-BT9nZCEO.js +357 -0
  26. package/dist/codeGraphDb-BT9nZCEO.js.map +1 -0
  27. package/dist/codeGraphDb-Bg7bWud2.js +9 -0
  28. package/dist/codeGraphRows-BhZX34uB.js +6 -0
  29. package/dist/codeGraphRows-C7hqu35E.js +246 -0
  30. package/dist/codeGraphRows-C7hqu35E.js.map +1 -0
  31. package/dist/constants-CQq93l3e.js +399 -0
  32. package/dist/constants-CQq93l3e.js.map +1 -0
  33. package/dist/graphFingerprint-CeARo7jG.js +4 -0
  34. package/dist/graphFingerprint-PuxORZUF.js +277 -0
  35. package/dist/graphFingerprint-PuxORZUF.js.map +1 -0
  36. package/dist/graphMetrics-C0F30730.js +555 -0
  37. package/dist/graphMetrics-C0F30730.js.map +1 -0
  38. package/dist/index.d.ts +572 -9
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +14734 -2003
  41. package/dist/index.js.map +1 -1
  42. package/dist/inheritanceEnhancer-Bi3UoYJS.js +291 -0
  43. package/dist/inheritanceEnhancer-Bi3UoYJS.js.map +1 -0
  44. package/dist/layerUtils-DDm-EsaD.js +72 -0
  45. package/dist/layerUtils-DDm-EsaD.js.map +1 -0
  46. package/dist/nativeIndex-Cx7RLXUp.js +5 -0
  47. package/dist/nativeIndex-DlSpD611.js +347 -0
  48. package/dist/nativeIndex-DlSpD611.js.map +1 -0
  49. package/dist/treeSitterExtractors-B1ybKNrC.js +394 -0
  50. package/dist/treeSitterExtractors-B1ybKNrC.js.map +1 -0
  51. package/dist/types-BUDxI_00.js +23 -0
  52. package/dist/types-BUDxI_00.js.map +1 -0
  53. package/locale/en.json +6 -0
  54. package/locale/zh-CN.json +6 -0
  55. package/locale/zh.json +6 -0
  56. package/package.json +101 -21
  57. package/dist/client-cjs/index.cjs +0 -44283
  58. package/dist/client-cjs/index.css +0 -2404
@@ -0,0 +1,634 @@
1
+ import * as _deepseek_ai_cordis1 from "@deepseek-ai/cordis";
2
+ import * as _deepseek_ai_cordis2 from "@deepseek-ai/cordis";
3
+ import { Context as Context$1 } from "@deepseek-ai/cordis";
4
+
5
+ //#region src/types/index.d.ts
6
+ type Branded<T, Brand> = T & {
7
+ __brand: Brand;
8
+ };
9
+ type RepoId = Branded<string, 'RepoId'>;
10
+ type NodeId = Branded<string, 'NodeId'>;
11
+ type EdgeId = Branded<string, 'EdgeId'>;
12
+ declare const RepoId: (id: string) => RepoId;
13
+ declare const NodeId: (id: string) => NodeId;
14
+ declare const EdgeId: (id: string) => EdgeId;
15
+ interface GraphNode {
16
+ id: NodeId;
17
+ label: string;
18
+ type: 'function' | 'class' | 'variable' | 'module' | 'interface' | 'type';
19
+ filePath: string;
20
+ lineNumber?: number;
21
+ properties: Record<string, unknown>;
22
+ parentId?: NodeId;
23
+ summary?: string;
24
+ tags?: string[];
25
+ complexity?: 'simple' | 'moderate' | 'complex';
26
+ layer?: string;
27
+ }
28
+ type EdgeDirection = 'forward' | 'backward' | 'bidirectional';
29
+ interface GraphEdge {
30
+ id: EdgeId;
31
+ source: NodeId;
32
+ target: NodeId;
33
+ type: 'call' | 'import' | 'extend' | 'implement' | 'dependency' | 'contains' | 'association' | 'aggregation' | 'composition';
34
+ direction?: EdgeDirection;
35
+ weight?: number;
36
+ properties: Record<string, unknown>;
37
+ }
38
+ interface GraphData {
39
+ nodes: GraphNode[];
40
+ edges: GraphEdge[];
41
+ metadata: {
42
+ repoId: RepoId;
43
+ timestamp: number;
44
+ nodeCount: number;
45
+ edgeCount: number;
46
+ truncated?: boolean;
47
+ totalNodeCount?: number;
48
+ totalEdgeCount?: number;
49
+ /**
50
+ * 璇玑图增量引擎健康面(cycle-122,XJ-11 消费端收口)。
51
+ *
52
+ * 缺口现场:`xuanjiPool.applyDelta(...)` 的返回值(`PoolDeltaResult`:
53
+ * applied / addedPaths / degradedRules / I4 不变量报告)在 `src/tools.ts`
54
+ * 曾被**完全丢弃**——降级信号生产了但没有消费面,「不可观测的降级等于
55
+ * 没有降级」(XJ-11 头注原文)。
56
+ *
57
+ * 字段在 `executeGraphData` 组装(增量分支才有;全量重建时为 undefined):
58
+ * 模型读 `graph_data` 返回值即可判断「这次合并走的是增量还是全量、有没有
59
+ * 规则被降级」——不再需要读源码才能知道引擎状态。
60
+ */
61
+ xuanji?: {
62
+ /** delta 是否真的被应用到缓存适配层(false = 全量重建 / 尚未装载)。 */
63
+ applied: boolean;
64
+ /** 本轮增量新增的物化路径数(增量引擎的真实产出,量化可观测)。 */
65
+ addedPaths?: number;
66
+ /** 因超出展开预算被降级重建的规则名(空数组 = 无降级)。 */
67
+ degradedRules?: readonly string[];
68
+ /** I4(stale 比例)判为不达标的规则名。 */
69
+ invariantViolations?: readonly string[];
70
+ };
71
+ /**
72
+ * 继承数据增强结果(cycle-123,研究报告 Phase 1 P0 数据质量缺口)。
73
+ *
74
+ * 上游索引对 `interface extends` 检出为 0(本仓 17 处源码 extends 只出
75
+ * 9 条 class→class)——AST 补扫在 merger 之后注入增强边。全量路径才有
76
+ * 此字段(增量轮的缓存已含上轮增强);`applied: false` = 不可用/零增量
77
+ * (宁缺勿造)。模型可据此向用户披露「继承视图的边含 AST 增补 N 条」。
78
+ */
79
+ inheritance?: {
80
+ applied: boolean;
81
+ extracted: number;
82
+ added: number;
83
+ ambiguous: number;
84
+ unresolved: number;
85
+ duplicates: number;
86
+ filesScanned: number;
87
+ durationMs: number;
88
+ };
89
+ /**
90
+ * 图层来源声明(cycle-127 · T3):本次合并数据来自哪条通道。
91
+ *
92
+ * - `'upstream'`:上游 dsh-codegraph 索引(SQLite)参与合并;
93
+ * - `'native'`:原生通道(目录结构 + TreeSitter 符号 + AST 边)——仅在
94
+ * auto 降级链第三级(上游与 lens 双缺席)启用;
95
+ * - `'empty'`:所有通道均无产出(headless / 工作区不可读),诚实空态。
96
+ *
97
+ * 「不可观测的降级等于没有降级」(XJ-11 家族):模型与客户端据此向用户
98
+ * 披露数据来源,而不是把空图当作「工作区没有代码」。
99
+ */
100
+ graphLayer?: 'upstream' | 'native' | 'empty';
101
+ /**
102
+ * 原生索引命中信息(cycle-128 · T2):`graphLayer === 'native'` 且索引库
103
+ * 命中时在场——模型/客户端可据此披露「毫秒级索引读取」vs「实时扫描」。
104
+ * 实时扫描路径(回写后)不带此字段(hit 语义仅指本次图来自库)。
105
+ */
106
+ nativeIndex?: {
107
+ hit: true;
108
+ indexedAt: number;
109
+ fingerprint: string;
110
+ };
111
+ };
112
+ layers?: Layer[];
113
+ }
114
+ interface Layer {
115
+ id: string;
116
+ name: string;
117
+ description?: string;
118
+ nodeIds: NodeId[];
119
+ color?: string;
120
+ }
121
+ /**
122
+ * 视图模式。前 9 项是图谱视图(结构层 + 行为层),`runtime` 是 cycle-88 新增的
123
+ * 运行时层(`docs/图谱按需加载.md:196-200` 的第三层:Trace / 日志 / 性能排查)。
124
+ *
125
+ * 运行时层刻意**不映射任何图谱装配器**:`src/client/diagram/index.ts` 的
126
+ * `assembleDiagram` 走 `macroAssemblerRegistry.get(viewMode)`,未注册即返回
127
+ * `null`,因此 `runtime` 天然得到空子图——这正是验收原文
128
+ * `docs/图谱按需加载.md:202`「切换层时替换子图,而不是追加节点」要的结果。
129
+ * 运行时层的数据面是进程内可观测数据(`Logger` 环形缓冲 +
130
+ * `PerformanceMonitor`),不是图节点。
131
+ */
132
+
133
+ /**
134
+ * Structural difference between two graph revisions (P2-21).
135
+ *
136
+ * Lives here rather than next to its producer so both the host diff engine and the client store can
137
+ * name it without importing each other; `shared/graphDelta.ts` re-exports it and owns the helpers.
138
+ */
139
+ interface GraphDelta {
140
+ addedNodes: GraphNode[];
141
+ removedNodes: GraphNode[];
142
+ modifiedNodes: GraphNode[];
143
+ addedEdges: GraphEdge[];
144
+ removedEdges: GraphEdge[];
145
+ modifiedEdges: GraphEdge[];
146
+ }
147
+ interface GraphUpdatedEvent {
148
+ repoId: RepoId;
149
+ nodeCount: number;
150
+ edgeCount: number;
151
+ timestamp: number;
152
+ /** P0-6 structural fingerprint; stable while graph content is unchanged. */
153
+ fingerprint?: string;
154
+ /** File paths that triggered an incremental re-scan, when the watcher drove the update. */
155
+ changedFiles?: string[];
156
+ /**
157
+ * P2-21: this update is followed by a `graph/delta` carrying the actual changes, so consumers that
158
+ * understand deltas must not re-fetch the whole graph in response to this event.
159
+ */
160
+ incremental?: boolean;
161
+ }
162
+ interface GraphDataEvent {
163
+ repoId: RepoId;
164
+ nodes: GraphNode[];
165
+ edges: GraphEdge[];
166
+ timestamp: number;
167
+ /** P0-6 structural fingerprint; stable while graph content is unchanged. */
168
+ fingerprint?: string;
169
+ /** File paths that triggered an incremental re-scan, when the watcher drove the update. */
170
+ changedFiles?: string[];
171
+ /**
172
+ * 璇玑图增量引擎健康信号(cycle-122):`executeGraphData` 组装、SSE 透传到
173
+ * 客户端 StatusBar(XJ-11 消费端收口)。增量分支才有;全量重建缺省。
174
+ */
175
+ xuanji?: {
176
+ applied: boolean;
177
+ addedPaths?: number;
178
+ degradedRules?: readonly string[];
179
+ invariantViolations?: readonly string[];
180
+ };
181
+ }
182
+ /**
183
+ * 原生索引被删除(cycle-141 管理面板)。
184
+ *
185
+ * 删除成功后 host 会失效 `scanCache` / `scanInFlightMap` 并广播本事件,客户端据此
186
+ * **丢弃陈旧状态**(清空图槽、重置 ETag 校验值)。只删文件不广播 = 用户看到一张死图。
187
+ */
188
+ interface GraphDeletedEvent {
189
+ repoId: RepoId;
190
+ path: string;
191
+ timestamp: number;
192
+ }
193
+ /**
194
+ * P2-21 targeted update: only the entries that actually changed since the consumer's revision.
195
+ *
196
+ * Consumers apply this with `applyGraphDelta()` and must check `canApplyGraphDelta()` first — a
197
+ * delta is only meaningful against the exact revision it was computed from.
198
+ */
199
+ interface GraphDeltaEvent {
200
+ repoId: RepoId;
201
+ delta: GraphDelta;
202
+ timestamp: number;
203
+ /** P0-6 structural fingerprint of the resulting graph. */
204
+ fingerprint?: string;
205
+ /** File paths that triggered this update. */
206
+ changedFiles?: string[];
207
+ }
208
+ interface RepoImportedEvent {
209
+ repoId: RepoId;
210
+ path: string;
211
+ timestamp: number;
212
+ }
213
+ interface RepoScannedEvent {
214
+ repoId: RepoId;
215
+ fileCount: number;
216
+ timestamp: number;
217
+ }
218
+ interface RepoRequestScanEvent {
219
+ path: string;
220
+ timestamp: number;
221
+ }
222
+ interface SourceOpenEvent {
223
+ filePath: string;
224
+ lineNumber: number;
225
+ }
226
+ /**
227
+ * 能力位变更事件。
228
+ *
229
+ * `astSource` / `graphSource` 是两个**不同**的能力(`docs/需求分析.md` §61.10):
230
+ * AST 分析通道存在 ≠ 能产出一张图。(cycle-118:`builtin` 兼容别名已移除,
231
+ * 事件载荷不再携带;监听方读 `astSource` / `graphSource`。)
232
+ */
233
+ interface PrerequisiteStatusEvent {
234
+ codegraph: boolean;
235
+ lens: boolean;
236
+ /** 内置 AST 分析通道是否可用(TreeSitter)。 */
237
+ astSource: boolean;
238
+ /** 内置图数据通道是否存在(manifest 依赖图)。 */
239
+ graphSource: boolean;
240
+ timestamp: number;
241
+ }
242
+ interface GraphInitEvent {
243
+ path: string;
244
+ timestamp: number;
245
+ }
246
+ interface GraphInitResultEvent {
247
+ success: boolean;
248
+ path: string;
249
+ message: string;
250
+ errorCode?: string;
251
+ timestamp: number;
252
+ }
253
+ interface WatchToggleEvent {
254
+ enabled: boolean;
255
+ path: string;
256
+ timestamp: number;
257
+ }
258
+ interface HealthScoreEvent {
259
+ repoId: RepoId;
260
+ score: HealthScore;
261
+ timestamp: number;
262
+ }
263
+ interface RuleViolationEvent {
264
+ violations: RuleViolation[];
265
+ timestamp: number;
266
+ }
267
+ interface PathFoundEvent {
268
+ path: PathResult;
269
+ timestamp: number;
270
+ }
271
+ interface FocusChangedEvent {
272
+ nodeId: NodeId | null;
273
+ depth: number;
274
+ timestamp: number;
275
+ }
276
+ interface HealthScore {
277
+ coupling: number;
278
+ cohesion: number;
279
+ cyclicDependencyRate: number;
280
+ modularity: number;
281
+ overall: number;
282
+ }
283
+ interface RuleViolation {
284
+ ruleId: string;
285
+ nodeId?: NodeId;
286
+ edgeId?: EdgeId;
287
+ message: string;
288
+ severity: 'error' | 'warning';
289
+ }
290
+ interface PathResult {
291
+ source: NodeId;
292
+ target: NodeId;
293
+ path: NodeId[];
294
+ length: number;
295
+ }
296
+ declare module '@deepseek-ai/cordis' {
297
+ interface Events {
298
+ /**
299
+ * @mode serial
300
+ * @param event Repository imported into the workspace
301
+ */
302
+ 'codegraph-visualizer/repo/imported'(event: RepoImportedEvent): void;
303
+ /**
304
+ * @mode serial
305
+ * @param event Repository scan completed with file count
306
+ */
307
+ 'codegraph-visualizer/repo/scanned'(event: RepoScannedEvent): void;
308
+ /**
309
+ * @mode serial
310
+ * @param event Request to scan a repository at the given path
311
+ */
312
+ 'codegraph-visualizer/repo/request-scan'(event: RepoRequestScanEvent): void;
313
+ /**
314
+ * @mode serial
315
+ * @param event Graph updated with new node/edge counts
316
+ */
317
+ 'codegraph-visualizer/graph/updated'(event: GraphUpdatedEvent): void;
318
+ /**
319
+ * @mode serial
320
+ * @param event Full graph data payload for rendering
321
+ */
322
+ 'codegraph-visualizer/graph/data'(event: GraphDataEvent): void;
323
+ /**
324
+ * @mode serial
325
+ * @param event Native index deleted; consumers must drop stale graph state
326
+ */
327
+ 'codegraph-visualizer/graph/deleted'(event: GraphDeletedEvent): void;
328
+ /**
329
+ * @mode serial
330
+ * @param event Targeted graph update carrying only the entries that changed (P2-21)
331
+ */
332
+ 'codegraph-visualizer/graph/delta'(event: GraphDeltaEvent): void;
333
+ /**
334
+ * @mode serial
335
+ * @param event Request to open a source file at a specific line
336
+ */
337
+ 'codegraph-visualizer/source/open'(event: SourceOpenEvent): void;
338
+ /**
339
+ * @mode serial
340
+ * @param event Prerequisite service availability status changed
341
+ */
342
+ 'codegraph-visualizer/prerequisite/status'(event: PrerequisiteStatusEvent): void;
343
+ /**
344
+ * @mode serial
345
+ * @param event Request prerequisite status check
346
+ */
347
+ 'codegraph-visualizer/prerequisite/request'(event: {
348
+ timestamp: number;
349
+ }): void;
350
+ /**
351
+ * @mode serial
352
+ * @param event Request to initialize graph for a repository path
353
+ */
354
+ 'codegraph-visualizer/graph/init'(event: GraphInitEvent): void;
355
+ /**
356
+ * @mode serial
357
+ * @param event Graph initialization result (success/failure)
358
+ */
359
+ 'codegraph-visualizer/graph/init-result'(event: GraphInitResultEvent): void;
360
+ /**
361
+ * @mode serial
362
+ * @param event File watcher toggle state changed
363
+ */
364
+ 'codegraph-visualizer/watch/toggle'(event: WatchToggleEvent): void;
365
+ /**
366
+ * @mode serial
367
+ * @param event File watcher error occurred
368
+ */
369
+ 'codegraph-visualizer/watch/error'(event: {
370
+ path: string;
371
+ message: string;
372
+ errorCode?: string;
373
+ timestamp: number;
374
+ }): void;
375
+ /**
376
+ * @mode serial
377
+ * @param event Architecture health score calculated
378
+ */
379
+ 'codegraph-visualizer/health/scored'(event: HealthScoreEvent): void;
380
+ /**
381
+ * @mode serial
382
+ * @param event Architecture rule violation detected
383
+ */
384
+ 'codegraph-visualizer/rules/violation'(event: RuleViolationEvent): void;
385
+ /**
386
+ * @mode serial
387
+ * @param event Shortest path found between two symbols
388
+ */
389
+ 'codegraph-visualizer/path/found'(event: PathFoundEvent): void;
390
+ /**
391
+ * @mode serial
392
+ * @param event Focus changed to a different node (or null to clear)
393
+ */
394
+ 'codegraph-visualizer/focus/changed'(event: FocusChangedEvent): void;
395
+ }
396
+ interface Context {
397
+ webServer: WebServerService;
398
+ effect(execute: () => (() => void) | void, label?: string): () => void;
399
+ emit<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): void;
400
+ on<K extends keyof Events>(name: K, listener: Events[K]): () => boolean;
401
+ get(name: string, strict?: boolean): unknown;
402
+ provide(name: string, service: unknown): () => void;
403
+ /**
404
+ * 响应式服务注入:**等到依赖到齐才跑回调**,且依赖被替换时会重跑
405
+ * (旧 scope 先卸载、再跑新回调)。
406
+ *
407
+ * 契约与真实 cordis 对齐(cycle-83 修正,此前这里错写成
408
+ * `callback: (injected: Map<string, unknown>) => void`,与实现不符):
409
+ *
410
+ * - `inject(deps: Inject, callback: Plugin.Function<void>): Fiber & PromiseLike<Fiber>`
411
+ * (`<A>\cordis\lib\types\registry.d.ts:111` 与 `:185`)
412
+ * - `interface Function<T> extends Base<T> { (ctx: Context, config: T): any }`
413
+ * (`registry.d.ts:71-73`)⇒ **回调首参是 `Context`**,不是 Map
414
+ * - JSDoc 逐字:「Run a callback once the requested services are available.
415
+ * Shorthand for `ctx.plugin({ inject, apply: callback })`: the callback is
416
+ * unloaded and re-run whenever a required service changes.」
417
+ *
418
+ * 返回值是**子 fiber**,随父 fiber 卸载自动释放,因此不需要手工 dispose。
419
+ * 依赖永不到齐时回调永不执行,且不阻塞父插件 apply(cordis 探针实验 1 实测)。
420
+ */
421
+ inject(deps: string[], callback: (scope: Context, config?: unknown) => void): _deepseek_ai_cordis1.Fiber & PromiseLike<_deepseek_ai_cordis2.Fiber>;
422
+ slots: {
423
+ inject(slotName: string, callback: () => void): (() => void) | void;
424
+ register(options: {
425
+ name: string;
426
+ id?: string;
427
+ key?: string;
428
+ order?: number;
429
+ label?: () => string;
430
+ inject?: (...args: unknown[]) => unknown;
431
+ }, component?: unknown): (() => void) | void;
432
+ };
433
+ betterSidebar?: {
434
+ version: string;
435
+ features: string[];
436
+ registerTab(descriptor: {
437
+ id: string;
438
+ title: string | (() => string);
439
+ description?: string | (() => string);
440
+ icon?: unknown;
441
+ order?: number;
442
+ single?: boolean;
443
+ hidden?: boolean;
444
+ badge?: () => string | number | null | undefined;
445
+ onOpen?: (tab: unknown, scope: unknown) => void;
446
+ onActivate?: (tab: unknown, scope: unknown) => void;
447
+ onClose?: (tab: unknown, scope: unknown) => void;
448
+ component: (props: {
449
+ ctx: Context;
450
+ store: unknown;
451
+ scope: unknown;
452
+ tab: {
453
+ id: string;
454
+ title: string;
455
+ path?: string;
456
+ };
457
+ visible: boolean;
458
+ expanded?: string[];
459
+ revealed?: string[];
460
+ }) => unknown;
461
+ }): (() => void) | void;
462
+ openTab(seed: {
463
+ type: string;
464
+ title?: string;
465
+ path?: string;
466
+ target?: 'right' | 'bottom';
467
+ }): void;
468
+ closeTab(tabId: string, scope?: unknown): void;
469
+ activateTab(tabId: string, scope?: unknown): void;
470
+ updateTab(tabId: string, patch: {
471
+ title?: string;
472
+ path?: string;
473
+ meta?: unknown;
474
+ }): void;
475
+ subscribe(listener: () => void): () => void;
476
+ subscribeState(listener: () => void): () => void;
477
+ getSnapshot(): {
478
+ sessionId: string | undefined;
479
+ state: {
480
+ activePane: string | null;
481
+ bottomOpen: boolean;
482
+ bottomHeight: number;
483
+ expanded: string[];
484
+ revealed: string[];
485
+ } | undefined;
486
+ prefs: unknown;
487
+ };
488
+ };
489
+ /**
490
+ * DSH 斜杠命令贡献面(`@deepseek-ai/dsh-client-ui-commands`)。
491
+ *
492
+ * 契约逐字来源:`lib/types/client/contract.d.ts:129`
493
+ * `register(contribution: CommandContribution): () => void`,JSDoc
494
+ * 「Register one client command contribution; effect disposer. Duplicate names throw
495
+ * at registration.」;`CommandContribution`(同文件 `:92-105`)必填
496
+ * `name` 与 `available(session)`;`ActionSpec`(`:75-82`)为
497
+ * `{ kind: 'action'; run(session): void }`。
498
+ *
499
+ * 本服务由 `Service` 基类 `super(ctx, 'commandUi')` 注册(gen2
500
+ * `dsh-client-ui-commands/lib/client.js:771`、gen1 同文件 `:737`),因此两代都在。
501
+ * 它替代了本项目 cycle-83 清除的 `spotlight` 幻影服务。
502
+ */
503
+ commandUi?: {
504
+ register(contribution: {
505
+ name: string;
506
+ label?: () => string;
507
+ description?: () => string;
508
+ icon?: unknown;
509
+ available: (session: unknown) => boolean;
510
+ ui: {
511
+ kind: 'action';
512
+ run: (session: unknown) => void;
513
+ };
514
+ }): (() => void) | void;
515
+ };
516
+ /**
517
+ * DSH 原生右侧栏的 tab 类型注册表(`@deepseek-ai/dsh-client-ui-sidebar-right`)。
518
+ *
519
+ * 形状逐字对齐 `lib/types/client/tab-registry.d.ts:75-120` 的
520
+ * `SidebarRightTabDefinition`:
521
+ * - `title: (address: string) => string` —— **必填**,且收 `address` 形参;
522
+ * 旧声明写成可选且无形参,是契约不精确。
523
+ * - `keepMounted?: boolean` —— 「Lazily keep a visited body mounted through hiding,
524
+ * Session changes and docking; default false」,图表面板需要它。
525
+ * - `multiple?: boolean` —— 缺省即「每个 pane 每 kind 一页」。
526
+ * - **没有 `order` 字段** —— 排序由 `priority` band 与 `RANKS`
527
+ * (`extension: 3 / builtin: 2 / fallback: 1`,见
528
+ * `dsh-client-ui-sidebar-right/lib/client.js:8619-8623`)决定,旧声明多写了 `order`。
529
+ */
530
+ sidebarRightTabs?: {
531
+ register(definition: {
532
+ id: string;
533
+ kind: string;
534
+ title: (address: string) => string;
535
+ multiple?: boolean;
536
+ keepMounted?: boolean;
537
+ patterns?: string[];
538
+ priority?: 'extension' | 'builtin' | 'fallback';
539
+ canOpen?: (address: string) => boolean;
540
+ guide?: readonly {
541
+ id: string;
542
+ [key: string]: unknown;
543
+ }[];
544
+ }): (() => void) | void;
545
+ };
546
+ workspaceRegistry?: {
547
+ list?(): Array<{
548
+ path?: string;
549
+ }>;
550
+ };
551
+ hostVersion?: string;
552
+ version?: string;
553
+ app?: {
554
+ version?: string;
555
+ };
556
+ runtime?: {
557
+ version?: string;
558
+ };
559
+ }
560
+ }
561
+ interface WebServerRoute {
562
+ kind: 'exact' | 'prefix';
563
+ path: string;
564
+ handler: (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;
565
+ }
566
+ interface WebServerService {
567
+ register(route: WebServerRoute): () => void;
568
+ registerFallback(handler: (req: IncomingMessage, res: ServerResponse) => void | Promise<void>): () => void;
569
+ }
570
+ interface IncomingMessage {
571
+ url?: string;
572
+ method?: string;
573
+ headers: Record<string, string | string[] | undefined>;
574
+ socket?: {
575
+ remoteAddress?: string;
576
+ };
577
+ on(event: 'data', handler: (chunk: Buffer) => void): void;
578
+ on(event: 'end', handler: () => void): void;
579
+ on(event: 'error', handler: (err: Error) => void): void;
580
+ on(event: 'close', handler: () => void): void;
581
+ destroy(): void;
582
+ }
583
+ interface ServerResponse {
584
+ writeHead(code: number, headers?: Record<string, string>): void;
585
+ write(data: string): boolean;
586
+ end(data?: string): void;
587
+ headersSent: boolean;
588
+ } //#endregion
589
+ //#region src/generated/version.d.ts
590
+
591
+ //# sourceMappingURL=index.d.ts.map
592
+ declare const PLUGIN_VERSION = "0.3.0";
593
+
594
+ //#endregion
595
+ //#region src/client/index.d.ts
596
+ //# sourceMappingURL=version.d.ts.map
597
+
598
+ declare const name = "dsh-codegraph-visualizer-client";
599
+ /**
600
+ * 只有 slot 系统是硬需求。
601
+ *
602
+ * `betterSidebar`(第三方 `dsh-better-sidebar`)与 `commandUi` 都是**可选**集成,各自的
603
+ * 集成函数在运行时用 `ctx.get()` 动态探测。若把它们写进静态 `inject`,Cordis 的 fiber
604
+ * 注入必须完全满足,插件会在缺失这些服务的最小宿主上被整体置为 INACTIVE —— 那是拿
605
+ * 「一个可选集成」换取「整个插件不加载」。
606
+ *
607
+ * 注意 `sidebarRightTabs` **不是** gen2 独有:`@deepseek-ai/dsh-client-ui-sidebar-right`
608
+ * 的 `ctx.reflect.provide("sidebarRightTabs", tabs)` 在 gen1 与 gen2 两套树里都存在,
609
+ * 因此它同样只需动态探测。
610
+ */
611
+ declare const inject: string[];
612
+ declare function init(container: HTMLElement, initialData?: GraphData): () => void;
613
+ /**
614
+ * 客户端半入口。
615
+ *
616
+ * 集成顺序即**优先级**:越靠前的通道越完整,先注册的会先占住席位并把
617
+ * `state.navButtonRegistered` 置真,后续通道据此让位(DSH 的 slot/tab 注册表对重复 id
618
+ * 是抛错语义,不是覆盖语义)。顺序:
619
+ *
620
+ * conversation.view(顶层标签,slot 系统)
621
+ * → sidebar.right.pane.tab(DSH 原生右侧栏)
622
+ * → better-sidebar tab(第三方侧边栏)
623
+ * → sidebar.footer.action(页脚按钮)
624
+ * → 浮动面板(兜底)
625
+ *
626
+ * `integrateCommandUi` 与集成通道正交:它贡献斜杠命令,不占席位,因此无条件尝试。
627
+ */
628
+ declare function apply(ctx: Context$1): void;
629
+
630
+ //#endregion
631
+ //# sourceMappingURL=index.d.ts.map
632
+
633
+ export { PLUGIN_VERSION, apply, init, inject, name };
634
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/types/index.ts","../../../src/generated/version.ts","../../../src/client/index.ts"],"sourcesContent":null,"mappings":"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"}