dsh-watcher 0.5.1 → 0.7.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.
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { createHash } from "node:crypto";
3
3
  //#region src/insights/engine.mjs
4
- /** Read-only DSH 0.1.5-rc.3 log fold. No prompt, reasoning or tool body is retained. */
4
+ /** Read-only DSH 0.2.0-rc.2 log fold. No prompt, reasoning or tool body is retained. */
5
5
  const record = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
6
6
  const count = (v) => Number.isSafeInteger(v) && v >= 0;
7
7
  const elapsed = (start, end) => start === null ? 0 : Math.max(0, end - start);
@@ -0,0 +1,18 @@
1
+ import type { InsightsView } from '../insights/projection.ts';
2
+ type Evidence = {
3
+ turn: number;
4
+ steps: number[];
5
+ seqs: number[];
6
+ };
7
+ export declare function SessionInsights({ value, now, running, waiting, onEvidence }: {
8
+ value: InsightsView | undefined;
9
+ now: number;
10
+ running: boolean;
11
+ waiting: boolean;
12
+ onEvidence: (e: Evidence) => void;
13
+ }): import("react").JSX.Element | null;
14
+ export declare function InsightsSettings(props: {
15
+ remote?: any;
16
+ }): import("react").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=Insights.d.ts.map
@@ -0,0 +1,7 @@
1
+ import type { InsightsView } from '../insights/projection.ts';
2
+ export declare function TimingPanel({ stats, scope, tokensPerSecond, }: {
3
+ stats: InsightsView['totals'];
4
+ scope: 'turn' | 'session';
5
+ tokensPerSecond?: number | null;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=TimingPanel.d.ts.map
@@ -0,0 +1,9 @@
1
+ import type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
2
+ import type { CompleteHistoryResult } from '../hub/history.ts';
3
+ export interface WatcherInjected {
4
+ loadAllHistory: (signal: AbortSignal) => Promise<CompleteHistoryResult>;
5
+ }
6
+ export type WatcherProps = PropsRuntime<'conversation.session.header.utilities'> & WatcherInjected;
7
+ /** Native session-header utility: exact work picture, typed evidence, no steering. */
8
+ export declare function Watcher(props: WatcherProps): import("react").JSX.Element;
9
+ //# sourceMappingURL=Watcher.d.ts.map
@@ -0,0 +1,22 @@
1
+ export type DisclosureDepth = 'overview' | 'detail';
2
+ export type DisclosureLayer = 'phase' | 'step' | 'cluster' | 'model' | 'reasoning';
3
+ type LayerOverrides = Readonly<Record<DisclosureLayer, Readonly<Record<string, boolean>>>>;
4
+ export interface DisclosureState {
5
+ readonly depth: DisclosureDepth;
6
+ readonly turns: Readonly<Record<number, boolean>>;
7
+ readonly layers: LayerOverrides;
8
+ }
9
+ export declare function createDisclosureState(depth?: DisclosureDepth): DisclosureState;
10
+ /** Overview keeps the automatic Turn policy; detail opens every Turn by default. */
11
+ export declare function turnDisclosureOpen(state: DisclosureState, turn: number, overviewDefaultOpen: boolean): boolean;
12
+ /** Overview stops at phase headers; detail opens every nested level by default. */
13
+ export declare function layerDisclosureOpen(state: DisclosureState, layer: DisclosureLayer, key: string): boolean;
14
+ export declare function setLayerDisclosure(state: DisclosureState, layer: DisclosureLayer, key: string, open: boolean): DisclosureState;
15
+ export declare function toggleTurnDisclosure(state: DisclosureState, turn: number, overviewDefaultOpen: boolean): DisclosureState;
16
+ export declare function toggleLayerDisclosure(state: DisclosureState, layer: DisclosureLayer, key: string): DisclosureState;
17
+ /** Choosing a depth applies it immediately instead of inheriting stale manual folds. */
18
+ export declare function chooseDisclosureDepth(depth: DisclosureDepth): DisclosureState;
19
+ /** Session-specific ids may change, while the user's chosen depth remains useful. */
20
+ export declare function resetDisclosureOverrides(state: DisclosureState): DisclosureState;
21
+ export {};
22
+ //# sourceMappingURL=disclosure-depth.d.ts.map
@@ -0,0 +1,9 @@
1
+ import type { Context as ClientContext } from '@deepseek-ai/cordis';
2
+ export declare const name = "dsh-watcher-client";
3
+ export declare const inject: string[];
4
+ /**
5
+ * Native session-header utility. Order 50 sits after Session log (0)
6
+ * and before the files-panel toggle (110). No overlay glyph.
7
+ */
8
+ export declare function apply(ctx: ClientContext): void;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,11 @@
1
+ import type { Context as ClientContext } from '@deepseek-ai/cordis';
2
+ import { type ModelStepTrace } from '../observation/model-trace.ts';
3
+ declare module '@deepseek-ai/dsh-client-ui-conversation/client' {
4
+ interface ConversationStepDataMap {
5
+ /** Provider-exposed model activity retained for one Step. */
6
+ 'dsh-watcher-model-stage': ModelStepTrace;
7
+ }
8
+ }
9
+ /** Register the Step-scoped, read-only model-stage projection. */
10
+ export declare function registerModelTraceDefinition(ctx: ClientContext): void;
11
+ //# sourceMappingURL=model-trace-definition.d.ts.map
@@ -0,0 +1,15 @@
1
+ import type { WorkItem, WorkStep } from '../observation/fold.ts';
2
+ import type { ModelStepTrace } from '../observation/model-trace.ts';
3
+ type StepTimelineOccurrence = {
4
+ readonly kind: 'occurrence';
5
+ readonly item: WorkItem;
6
+ readonly occurrenceIndex: number;
7
+ };
8
+ export type StepTimelineEntry = StepTimelineOccurrence | {
9
+ readonly kind: 'model';
10
+ readonly trace: ModelStepTrace;
11
+ };
12
+ /** Compose the visible rows owned by one authoritative DSH Step. */
13
+ export declare function stepTimelineEntries(step: Pick<WorkStep, 'items' | 'model'>): readonly StepTimelineEntry[];
14
+ export {};
15
+ //# sourceMappingURL=step-timeline.d.ts.map
@@ -0,0 +1,6 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ export declare const name = "dsh-watcher";
3
+ export declare const inject: string[];
4
+ /** Host-owned replayable statistics; no new transport or model-facing writes. */
5
+ export declare function apply(ctx: Context): void;
6
+ //# sourceMappingURL=dsh-watcher.d.ts.map
@@ -0,0 +1,40 @@
1
+ import type { WorkItem, WorkStatus } from '../observation/fold.ts';
2
+ export type WorkClusterBasis = 'mutable-target' | 'shared-target' | 'exact-call' | 'single';
3
+ export interface WorkStatusCounts {
4
+ running: number;
5
+ waiting: number;
6
+ success: number;
7
+ failure: number;
8
+ returned: number;
9
+ interrupted: number;
10
+ unknown: number;
11
+ }
12
+ export type NonEmptyWorkItems = readonly [WorkItem, ...WorkItem[]];
13
+ /** A reversible analysis projection. `items` always retains the source records. */
14
+ export interface WorkCluster {
15
+ id: string;
16
+ basis: WorkClusterBasis;
17
+ title: string;
18
+ items: NonEmptyWorkItems;
19
+ executionCount: number;
20
+ stepCount: number;
21
+ retryCount: number;
22
+ iterationCount: number;
23
+ latestStatus: WorkStatus;
24
+ statusCounts: Readonly<WorkStatusCounts>;
25
+ }
26
+ /**
27
+ * Group one phase for analysis without changing evidence identity or order.
28
+ *
29
+ * - Mutable calls may group by operation + target so changed inputs remain
30
+ * comparable as iterations.
31
+ * - Reads may group by one exact file target so different line windows stay
32
+ * comparable.
33
+ * - Search, Glob, Grep, Bash, and every other tool require exact normalized
34
+ * arguments. Sharing a cwd, broad path, tool name, or translated title is
35
+ * never enough.
36
+ * - Messages and otherwise unsigned records remain singletons.
37
+ */
38
+ export declare function clusterWorkItems(items: readonly WorkItem[]): readonly WorkCluster[];
39
+ export declare function clusterOutcomeSummary(cluster: WorkCluster): string;
40
+ //# sourceMappingURL=aggregation.d.ts.map
@@ -0,0 +1,29 @@
1
+ import type { WorkPicture } from '../observation/fold.ts';
2
+ export interface FollowSnapshot {
3
+ follow: boolean;
4
+ unread: number;
5
+ selectedId: string | null;
6
+ }
7
+ export interface RailScrollState {
8
+ atBottom: boolean;
9
+ }
10
+ /**
11
+ * Follow versus pin state for the work rail.
12
+ *
13
+ * The rail follows the newest recorded occurrence by default. Selecting
14
+ * history or scrolling away pins the viewport; later occurrences and result
15
+ * updates increment `unread` without yanking the reader away from evidence.
16
+ */
17
+ export declare function createFollow(): {
18
+ snapshot: () => FollowSnapshot;
19
+ /** Counts appended occurrences or a settled live result while pinned. */
20
+ onPicture(picture: Pick<WorkPicture, "nodes">): FollowSnapshot;
21
+ onSelect(id: string): FollowSnapshot;
22
+ onScroll({ atBottom }: RailScrollState): FollowSnapshot;
23
+ setFollow(next: boolean): FollowSnapshot;
24
+ backToLatest(): FollowSnapshot;
25
+ /** Drop a pinned selection without re-arming follow: closing the inspector keeps the rail where the user left it. */
26
+ clearSelection(): FollowSnapshot;
27
+ reset(): FollowSnapshot;
28
+ };
29
+ //# sourceMappingURL=follow.d.ts.map
@@ -0,0 +1,30 @@
1
+ /** Minimal public facts needed to page one shared RC8 Session window. */
2
+ export interface HistoryWindowState {
3
+ hasMore: boolean;
4
+ loadingOlder: boolean;
5
+ headKey: string;
6
+ }
7
+ export type CompleteHistoryResult = {
8
+ kind: 'complete';
9
+ pages: number;
10
+ } | {
11
+ kind: 'cancelled';
12
+ pages: number;
13
+ } | {
14
+ kind: 'blocked';
15
+ pages: number;
16
+ reason: 'busy' | 'no-progress' | 'page-limit';
17
+ };
18
+ export interface CompleteHistoryOptions {
19
+ read: () => HistoryWindowState;
20
+ loadOlder: () => Promise<void>;
21
+ signal: AbortSignal;
22
+ maxPages?: number;
23
+ }
24
+ /**
25
+ * Pull every older RC8 page in order. The Session remains the sole owner of
26
+ * history continuity; this helper only repeats its public, read-only paging
27
+ * verb and fails closed if one request does not advance the visible head.
28
+ */
29
+ export declare function loadCompleteHistory({ read, loadOlder, signal, maxPages, }: CompleteHistoryOptions): Promise<CompleteHistoryResult>;
30
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1,10 @@
1
+ import type { WorkGroup, WorkStatus, WorkTurn } from '../observation/fold.ts';
2
+ /** Overview progress is deliberately separate from execution evidence status. */
3
+ export type OverviewState = 'active' | 'current' | 'waiting' | 'failure' | 'interrupted' | 'settled' | 'partial';
4
+ export declare const OVERVIEW_STATE_LABEL: Readonly<Record<OverviewState, string>>;
5
+ /** Project evidence status into the one question overview markers answer: where should the user look? */
6
+ export declare function overviewStateOf(status: WorkStatus, isLatest: boolean): OverviewState;
7
+ export declare function groupOverviewSummary(group: WorkGroup): string;
8
+ export declare function turnOverviewSummary(turn: WorkTurn): string;
9
+ export declare function turnNeedsDefaultDisclosure(state: OverviewState, isLatest: boolean): boolean;
10
+ //# sourceMappingURL=overview.d.ts.map
@@ -0,0 +1,4 @@
1
+ /** Stable model entry for consumers that need Watcher's truthful work picture. */
2
+ export { EMPTY_PICTURE, foldEvents, foldSnapshot, normalizedSignature, pairTools, parseJsonl, } from '../observation/fold.ts';
3
+ export type { WorkGroup, WorkItem, WorkPhase, WorkPicture, WorkPresentation, WorkStatus, WorkStep, WorkTurn, } from '../observation/fold.ts';
4
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1,263 @@
1
+ import { z } from 'zod';
2
+ import type { Context } from '@deepseek-ai/cordis';
3
+ export declare const viewSchema: z.ZodObject<{
4
+ version: z.ZodLiteral<1>;
5
+ sessionId: z.ZodString;
6
+ seq: z.ZodNumber;
7
+ updatedAt: z.ZodNumber;
8
+ totals: z.ZodObject<{
9
+ calls: z.ZodNumber;
10
+ reported: z.ZodNumber;
11
+ exactTotals: z.ZodNumber;
12
+ tokens: z.ZodNumber;
13
+ input: z.ZodNumber;
14
+ output: z.ZodNumber;
15
+ cacheRead: z.ZodNumber;
16
+ cacheWrite: z.ZodNumber;
17
+ reasoning: z.ZodNumber;
18
+ reasoningReports: z.ZodNumber;
19
+ modelMs: z.ZodNumber;
20
+ timedCalls: z.ZodNumber;
21
+ firstMs: z.ZodNumber;
22
+ firstSamples: z.ZodNumber;
23
+ reasoningMs: z.ZodNumber;
24
+ tools: z.ZodNumber;
25
+ toolErrors: z.ZodNumber;
26
+ toolMs: z.ZodNumber;
27
+ bashMs: z.ZodOptional<z.ZodNumber>;
28
+ retries: z.ZodNumber;
29
+ }, z.core.$strip>;
30
+ models: z.ZodArray<z.ZodObject<{
31
+ calls: z.ZodNumber;
32
+ reported: z.ZodNumber;
33
+ exactTotals: z.ZodNumber;
34
+ tokens: z.ZodNumber;
35
+ input: z.ZodNumber;
36
+ output: z.ZodNumber;
37
+ cacheRead: z.ZodNumber;
38
+ cacheWrite: z.ZodNumber;
39
+ reasoning: z.ZodNumber;
40
+ reasoningReports: z.ZodNumber;
41
+ modelMs: z.ZodNumber;
42
+ timedCalls: z.ZodNumber;
43
+ firstMs: z.ZodNumber;
44
+ firstSamples: z.ZodNumber;
45
+ reasoningMs: z.ZodNumber;
46
+ tools: z.ZodNumber;
47
+ toolErrors: z.ZodNumber;
48
+ toolMs: z.ZodNumber;
49
+ bashMs: z.ZodOptional<z.ZodNumber>;
50
+ retries: z.ZodNumber;
51
+ provider: z.ZodString;
52
+ model: z.ZodString;
53
+ effort: z.ZodOptional<z.ZodString>;
54
+ }, z.core.$strip>>;
55
+ turn: z.ZodNullable<z.ZodObject<{
56
+ number: z.ZodNumber;
57
+ startedAt: z.ZodNumber;
58
+ endedAt: z.ZodNullable<z.ZodNumber>;
59
+ steps: z.ZodNumber;
60
+ stats: z.ZodObject<{
61
+ calls: z.ZodNumber;
62
+ reported: z.ZodNumber;
63
+ exactTotals: z.ZodNumber;
64
+ tokens: z.ZodNumber;
65
+ input: z.ZodNumber;
66
+ output: z.ZodNumber;
67
+ cacheRead: z.ZodNumber;
68
+ cacheWrite: z.ZodNumber;
69
+ reasoning: z.ZodNumber;
70
+ reasoningReports: z.ZodNumber;
71
+ modelMs: z.ZodNumber;
72
+ timedCalls: z.ZodNumber;
73
+ firstMs: z.ZodNumber;
74
+ firstSamples: z.ZodNumber;
75
+ reasoningMs: z.ZodNumber;
76
+ tools: z.ZodNumber;
77
+ toolErrors: z.ZodNumber;
78
+ toolMs: z.ZodNumber;
79
+ bashMs: z.ZodOptional<z.ZodNumber>;
80
+ retries: z.ZodNumber;
81
+ }, z.core.$strip>;
82
+ route: z.ZodOptional<z.ZodObject<{
83
+ provider: z.ZodString;
84
+ model: z.ZodString;
85
+ effort: z.ZodOptional<z.ZodNullable<z.ZodString>>;
86
+ }, z.core.$strip>>;
87
+ }, z.core.$strip>>;
88
+ pending: z.ZodNullable<z.ZodObject<{
89
+ turn: z.ZodNumber;
90
+ step: z.ZodNumber;
91
+ start: z.ZodNullable<z.ZodNumber>;
92
+ reasoningFirst: z.ZodNullable<z.ZodNumber>;
93
+ reasoningLast: z.ZodNullable<z.ZodNumber>;
94
+ lastContentAt: z.ZodNullable<z.ZodNumber>;
95
+ }, z.core.$strip>>;
96
+ findings: z.ZodArray<z.ZodObject<{
97
+ id: z.ZodString;
98
+ kind: z.ZodString;
99
+ turn: z.ZodNumber;
100
+ seqs: z.ZodArray<z.ZodNumber>;
101
+ steps: z.ZodArray<z.ZodNumber>;
102
+ title: z.ZodString;
103
+ detail: z.ZodString;
104
+ }, z.core.$strip>>;
105
+ findingCount: z.ZodNumber;
106
+ }, z.core.$strip>;
107
+ declare const stateSchema: z.ZodObject<{
108
+ version: z.ZodLiteral<1>;
109
+ sessionId: z.ZodString;
110
+ skip: z.ZodNumber;
111
+ seq: z.ZodNumber;
112
+ updatedAt: z.ZodNumber;
113
+ route: z.ZodObject<{
114
+ provider: z.ZodString;
115
+ model: z.ZodString;
116
+ effort: z.ZodOptional<z.ZodNullable<z.ZodString>>;
117
+ }, z.core.$strip>;
118
+ totals: z.ZodObject<{
119
+ calls: z.ZodNumber;
120
+ reported: z.ZodNumber;
121
+ exactTotals: z.ZodNumber;
122
+ tokens: z.ZodNumber;
123
+ input: z.ZodNumber;
124
+ output: z.ZodNumber;
125
+ cacheRead: z.ZodNumber;
126
+ cacheWrite: z.ZodNumber;
127
+ reasoning: z.ZodNumber;
128
+ reasoningReports: z.ZodNumber;
129
+ modelMs: z.ZodNumber;
130
+ timedCalls: z.ZodNumber;
131
+ firstMs: z.ZodNumber;
132
+ firstSamples: z.ZodNumber;
133
+ reasoningMs: z.ZodNumber;
134
+ tools: z.ZodNumber;
135
+ toolErrors: z.ZodNumber;
136
+ toolMs: z.ZodNumber;
137
+ bashMs: z.ZodOptional<z.ZodNumber>;
138
+ retries: z.ZodNumber;
139
+ }, z.core.$strip>;
140
+ models: z.ZodArray<z.ZodObject<{
141
+ calls: z.ZodNumber;
142
+ reported: z.ZodNumber;
143
+ exactTotals: z.ZodNumber;
144
+ tokens: z.ZodNumber;
145
+ input: z.ZodNumber;
146
+ output: z.ZodNumber;
147
+ cacheRead: z.ZodNumber;
148
+ cacheWrite: z.ZodNumber;
149
+ reasoning: z.ZodNumber;
150
+ reasoningReports: z.ZodNumber;
151
+ modelMs: z.ZodNumber;
152
+ timedCalls: z.ZodNumber;
153
+ firstMs: z.ZodNumber;
154
+ firstSamples: z.ZodNumber;
155
+ reasoningMs: z.ZodNumber;
156
+ tools: z.ZodNumber;
157
+ toolErrors: z.ZodNumber;
158
+ toolMs: z.ZodNumber;
159
+ bashMs: z.ZodOptional<z.ZodNumber>;
160
+ retries: z.ZodNumber;
161
+ provider: z.ZodString;
162
+ model: z.ZodString;
163
+ }, z.core.$strip>>;
164
+ turn: z.ZodNullable<z.ZodObject<{
165
+ number: z.ZodNumber;
166
+ startedAt: z.ZodNumber;
167
+ endedAt: z.ZodNullable<z.ZodNumber>;
168
+ steps: z.ZodNumber;
169
+ stats: z.ZodObject<{
170
+ calls: z.ZodNumber;
171
+ reported: z.ZodNumber;
172
+ exactTotals: z.ZodNumber;
173
+ tokens: z.ZodNumber;
174
+ input: z.ZodNumber;
175
+ output: z.ZodNumber;
176
+ cacheRead: z.ZodNumber;
177
+ cacheWrite: z.ZodNumber;
178
+ reasoning: z.ZodNumber;
179
+ reasoningReports: z.ZodNumber;
180
+ modelMs: z.ZodNumber;
181
+ timedCalls: z.ZodNumber;
182
+ firstMs: z.ZodNumber;
183
+ firstSamples: z.ZodNumber;
184
+ reasoningMs: z.ZodNumber;
185
+ tools: z.ZodNumber;
186
+ toolErrors: z.ZodNumber;
187
+ toolMs: z.ZodNumber;
188
+ bashMs: z.ZodOptional<z.ZodNumber>;
189
+ retries: z.ZodNumber;
190
+ }, z.core.$strip>;
191
+ route: z.ZodOptional<z.ZodObject<{
192
+ provider: z.ZodString;
193
+ model: z.ZodString;
194
+ effort: z.ZodOptional<z.ZodNullable<z.ZodString>>;
195
+ }, z.core.$strip>>;
196
+ }, z.core.$strip>>;
197
+ open: z.ZodNullable<z.ZodObject<{
198
+ turn: z.ZodNumber;
199
+ step: z.ZodNumber;
200
+ start: z.ZodNullable<z.ZodNumber>;
201
+ first: z.ZodNullable<z.ZodNumber>;
202
+ reasoningFirst: z.ZodNullable<z.ZodNumber>;
203
+ reasoningLast: z.ZodNullable<z.ZodNumber>;
204
+ lastContentAt: z.ZodNullable<z.ZodNumber>;
205
+ usage: z.ZodNullable<z.ZodObject<{
206
+ input: z.ZodNumber;
207
+ output: z.ZodNumber;
208
+ cacheRead: z.ZodNumber;
209
+ cacheWrite: z.ZodNumber;
210
+ reasoning: z.ZodNullable<z.ZodNumber>;
211
+ tokens: z.ZodNumber;
212
+ exact: z.ZodBoolean;
213
+ }, z.core.$strip>>;
214
+ route: z.ZodObject<{
215
+ provider: z.ZodString;
216
+ model: z.ZodString;
217
+ effort: z.ZodOptional<z.ZodNullable<z.ZodString>>;
218
+ }, z.core.$strip>;
219
+ }, z.core.$strip>>;
220
+ tools: z.ZodArray<z.ZodObject<{
221
+ id: z.ZodString;
222
+ name: z.ZodString;
223
+ start: z.ZodNumber;
224
+ seq: z.ZodNumber;
225
+ step: z.ZodNumber;
226
+ route: z.ZodObject<{
227
+ provider: z.ZodString;
228
+ model: z.ZodString;
229
+ effort: z.ZodOptional<z.ZodNullable<z.ZodString>>;
230
+ }, z.core.$strip>;
231
+ signature: z.ZodNullable<z.ZodString>;
232
+ }, z.core.$strip>>;
233
+ previousFailure: z.ZodNullable<z.ZodObject<{
234
+ signature: z.ZodString;
235
+ resultHash: z.ZodString;
236
+ turn: z.ZodNumber;
237
+ seqs: z.ZodArray<z.ZodNumber>;
238
+ steps: z.ZodArray<z.ZodNumber>;
239
+ }, z.core.$strip>>;
240
+ findings: z.ZodArray<z.ZodObject<{
241
+ id: z.ZodString;
242
+ kind: z.ZodString;
243
+ turn: z.ZodNumber;
244
+ seqs: z.ZodArray<z.ZodNumber>;
245
+ steps: z.ZodArray<z.ZodNumber>;
246
+ title: z.ZodString;
247
+ detail: z.ZodString;
248
+ }, z.core.$strip>>;
249
+ findingCount: z.ZodNumber;
250
+ }, z.core.$strip>;
251
+ export type InsightsView = z.infer<typeof viewSchema>;
252
+ type InsightsState = z.infer<typeof stateSchema>;
253
+ declare module '@deepseek-ai/dsh-session-projection/types' {
254
+ interface SessionProjectionStateMap {
255
+ watcherInsights: InsightsState;
256
+ }
257
+ interface SessionProjectionMap {
258
+ watcherInsights: InsightsView;
259
+ }
260
+ }
261
+ export declare function installProjection(ctx: Context): void;
262
+ export {};
263
+ //# sourceMappingURL=projection.d.ts.map