foldkit 0.109.0 → 0.111.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/devTools/historyQuery.d.ts +85 -0
- package/dist/devTools/historyQuery.d.ts.map +1 -0
- package/dist/devTools/historyQuery.js +123 -0
- package/dist/devTools/overlay.d.ts.map +1 -1
- package/dist/devTools/overlay.js +2 -5
- package/dist/devTools/protocol.d.ts +128 -2
- package/dist/devTools/protocol.d.ts.map +1 -1
- package/dist/devTools/protocol.js +50 -3
- package/dist/devTools/public.d.ts +1 -1
- package/dist/devTools/public.d.ts.map +1 -1
- package/dist/devTools/public.js +1 -1
- package/dist/devTools/store.d.ts +5 -0
- package/dist/devTools/store.d.ts.map +1 -1
- package/dist/devTools/store.js +16 -4
- package/dist/devTools/webSocketBridge.d.ts.map +1 -1
- package/dist/devTools/webSocketBridge.js +89 -14
- package/dist/html/index.d.ts +33 -0
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +73 -1
- package/dist/route/parser.d.ts +47 -9
- package/dist/route/parser.d.ts.map +1 -1
- package/dist/route/parser.js +64 -14
- package/dist/route/public.d.ts +2 -2
- package/dist/route/public.d.ts.map +1 -1
- package/dist/route/public.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Option, Order } from 'effect';
|
|
2
|
+
import type { MessageTagCount } from './protocol.js';
|
|
3
|
+
import { type HistoryEntry, type StoreState } from './store.js';
|
|
4
|
+
/**
|
|
5
|
+
* Test a diff path against a dot-string pattern. Segments compare pairwise
|
|
6
|
+
* for the length of the shorter list; `*` in the pattern matches any single
|
|
7
|
+
* segment. Because the comparison stops at the shorter list, a pattern
|
|
8
|
+
* matches changes below it (`root.grid` matches a change at `root.grid.5.3`)
|
|
9
|
+
* and above it (`root.grid.5.3` matches a wholesale replacement recorded at
|
|
10
|
+
* `root.grid`).
|
|
11
|
+
*/
|
|
12
|
+
export declare const matchesPathPattern: (path: string, pattern: string) => boolean;
|
|
13
|
+
/** Test a diff path against every pattern, succeeding on the first match. */
|
|
14
|
+
export declare const matchesAnyPathPattern: (path: string, patterns: ReadonlyArray<string>) => boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Find the first pattern that can never match a diff path: one whose first
|
|
17
|
+
* segment is neither `root` nor `*`. Diff paths are always anchored at
|
|
18
|
+
* `root`, so accepting such a pattern would silently return no results.
|
|
19
|
+
*/
|
|
20
|
+
export declare const findUnanchoredPattern: (patterns: ReadonlyArray<string>) => Option.Option<string>;
|
|
21
|
+
/** A retained history entry paired with its absolute history index. */
|
|
22
|
+
export type IndexedEntry = Readonly<{
|
|
23
|
+
entry: HistoryEntry;
|
|
24
|
+
index: number;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Materialize the retained history entries with their absolute indices,
|
|
28
|
+
* dropping entries before `maybeSinceIndex` and entries whose `changedPaths`
|
|
29
|
+
* match none of the patterns. `Some([])` is treated as no filter so callers
|
|
30
|
+
* never have to special-case an empty pattern list. Entries that did not
|
|
31
|
+
* change the Model have no changed paths and never match a pattern filter.
|
|
32
|
+
*/
|
|
33
|
+
export declare const collectMatchingEntries: (state: StoreState, maybeSinceIndex: Option.Option<number>, maybeChangedPathsMatch: Option.Option<ReadonlyArray<string>>) => ReadonlyArray<IndexedEntry>;
|
|
34
|
+
/** One page of matching history entries plus the cursor for the next page. */
|
|
35
|
+
export type MessagesPage = Readonly<{
|
|
36
|
+
page: ReadonlyArray<IndexedEntry>;
|
|
37
|
+
maybeNextIndex: Option.Option<number>;
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Page a filtered candidate list. Forward pages take the first `limit`
|
|
41
|
+
* candidates and report the absolute index of the next matching entry, which
|
|
42
|
+
* a follow-up call passes back as the since index. Tail pages (`isFromEnd`)
|
|
43
|
+
* take the final `limit` candidates, still in chronological order, and never
|
|
44
|
+
* have a next index.
|
|
45
|
+
*/
|
|
46
|
+
export declare const pageMatchingEntries: (candidates: ReadonlyArray<IndexedEntry>, limit: number, isFromEnd: boolean) => MessagesPage;
|
|
47
|
+
/**
|
|
48
|
+
* Count entries by Message tag, sorted by count descending then tag ascending
|
|
49
|
+
* so the noisiest Messages surface first.
|
|
50
|
+
*/
|
|
51
|
+
export declare const countEntriesByTag: (entries: ReadonlyArray<IndexedEntry>) => ReadonlyArray<MessageTagCount>;
|
|
52
|
+
/**
|
|
53
|
+
* The oldest non-init index `getModelAtIndex` can answer. The keyframe
|
|
54
|
+
* stored at `startIndex` is the Model right after entry `startIndex - 1`, so
|
|
55
|
+
* the index one before the oldest retained entry is still readable even
|
|
56
|
+
* though its entry was evicted.
|
|
57
|
+
*/
|
|
58
|
+
export declare const oldestReadableIndex: (state: StoreState) => number;
|
|
59
|
+
/**
|
|
60
|
+
* Whether `getModelAtIndex` can answer for this index: `INIT_INDEX` once the
|
|
61
|
+
* init Model is recorded, otherwise an index between `oldestReadableIndex`
|
|
62
|
+
* and the latest entry. Indices outside this range have been evicted (or
|
|
63
|
+
* have not happened yet) and must be rejected rather than silently replayed
|
|
64
|
+
* from the wrong keyframe.
|
|
65
|
+
*/
|
|
66
|
+
export declare const isIndexReadable: (state: StoreState, index: number) => boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Format a clear error for an index `isIndexReadable` rejected, listing the
|
|
69
|
+
* index ranges the runtime can still answer for.
|
|
70
|
+
*/
|
|
71
|
+
export declare const formatIndexNotReadable: (state: StoreState, index: number) => string;
|
|
72
|
+
/**
|
|
73
|
+
* Order diff paths for readability: segments compare pairwise, numeric
|
|
74
|
+
* segments compare as numbers so `root.items.2` sorts before
|
|
75
|
+
* `root.items.10`, and a path that is a prefix of another sorts first.
|
|
76
|
+
*/
|
|
77
|
+
export declare const pathOrder: Order.Order<string>;
|
|
78
|
+
/**
|
|
79
|
+
* Read the summarized value at a diff path on a Model snapshot. `None` when
|
|
80
|
+
* the path does not exist on this side of the diff (a key or element that was
|
|
81
|
+
* added or removed). Resolution happens on the `toInspectableValue` transform
|
|
82
|
+
* of the Model, the same tree the diff handler walks.
|
|
83
|
+
*/
|
|
84
|
+
export declare const readSummarizedValueAt: (model: unknown, path: string) => Option.Option<unknown>;
|
|
85
|
+
//# sourceMappingURL=historyQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historyQuery.d.ts","sourceRoot":"","sources":["../../src/devTools/historyQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,MAAM,EAAE,KAAK,EAAgB,MAAM,QAAQ,CAAA;AAE3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,UAAU,EAEhB,MAAM,YAAY,CAAA;AAOnB;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,OAOhE,CAAA;AAEH,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,GAChC,MAAM,MAAM,EACZ,UAAU,aAAa,CAAC,MAAM,CAAC,KAC9B,OAA6E,CAAA;AAEhF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,UAAU,aAAa,CAAC,MAAM,CAAC,KAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAQpB,CAAA;AAcH,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,KAAK,EAAE,YAAY,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd,CAAC,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GACjC,OAAO,UAAU,EACjB,iBAAiB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACtC,wBAAwB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAC3D,aAAa,CAAC,YAAY,CAoB5B,CAAA;AAED,8EAA8E;AAC9E,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IACjC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;CACtC,CAAC,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,YAAY,aAAa,CAAC,YAAY,CAAC,EACvC,OAAO,MAAM,EACb,WAAW,OAAO,KACjB,YAYI,CAAA;AAOP;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,SAAS,aAAa,CAAC,YAAY,CAAC,KACnC,aAAa,CAAC,eAAe,CAO7B,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,UAAU,KAAG,MACrB,CAAA;AAEnC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,UAAU,EAAE,OAAO,MAAM,KAAG,OAGU,CAAA;AAE7E;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GACjC,OAAO,UAAU,EACjB,OAAO,MAAM,KACZ,MAcF,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAgBxC,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,OAAO,EACd,MAAM,MAAM,KACX,MAAM,CAAC,MAAM,CAAC,OAAO,CAIrB,CAAA"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { Array, HashSet, Match, Option, Order, Record, pipe } from 'effect';
|
|
2
|
+
import { toInspectableValue } from './serialize.js';
|
|
3
|
+
import { INIT_INDEX, latestEntryIndex, } from './store.js';
|
|
4
|
+
import { resolvePath, summarizeValue } from './summarize.js';
|
|
5
|
+
const ROOT = 'root';
|
|
6
|
+
const PATH_SEPARATOR = '.';
|
|
7
|
+
const WILDCARD = '*';
|
|
8
|
+
/**
|
|
9
|
+
* Test a diff path against a dot-string pattern. Segments compare pairwise
|
|
10
|
+
* for the length of the shorter list; `*` in the pattern matches any single
|
|
11
|
+
* segment. Because the comparison stops at the shorter list, a pattern
|
|
12
|
+
* matches changes below it (`root.grid` matches a change at `root.grid.5.3`)
|
|
13
|
+
* and above it (`root.grid.5.3` matches a wholesale replacement recorded at
|
|
14
|
+
* `root.grid`).
|
|
15
|
+
*/
|
|
16
|
+
export const matchesPathPattern = (path, pattern) => pipe(Array.zip(path.split(PATH_SEPARATOR), pattern.split(PATH_SEPARATOR)), Array.every(([pathSegment, patternSegment]) => patternSegment === WILDCARD || patternSegment === pathSegment));
|
|
17
|
+
/** Test a diff path against every pattern, succeeding on the first match. */
|
|
18
|
+
export const matchesAnyPathPattern = (path, patterns) => Array.some(patterns, pattern => matchesPathPattern(path, pattern));
|
|
19
|
+
/**
|
|
20
|
+
* Find the first pattern that can never match a diff path: one whose first
|
|
21
|
+
* segment is neither `root` nor `*`. Diff paths are always anchored at
|
|
22
|
+
* `root`, so accepting such a pattern would silently return no results.
|
|
23
|
+
*/
|
|
24
|
+
export const findUnanchoredPattern = (patterns) => Array.findFirst(patterns, pattern => !Option.exists(Array.head(pattern.split(PATH_SEPARATOR)), firstSegment => firstSegment === ROOT || firstSegment === WILDCARD));
|
|
25
|
+
const entryMatchesPatterns = (entry, maybePatterns) => Option.match(maybePatterns, {
|
|
26
|
+
onNone: () => true,
|
|
27
|
+
onSome: patterns => HashSet.some(entry.diff.changedPaths, path => matchesAnyPathPattern(path, patterns)),
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* Materialize the retained history entries with their absolute indices,
|
|
31
|
+
* dropping entries before `maybeSinceIndex` and entries whose `changedPaths`
|
|
32
|
+
* match none of the patterns. `Some([])` is treated as no filter so callers
|
|
33
|
+
* never have to special-case an empty pattern list. Entries that did not
|
|
34
|
+
* change the Model have no changed paths and never match a pattern filter.
|
|
35
|
+
*/
|
|
36
|
+
export const collectMatchingEntries = (state, maybeSinceIndex, maybeChangedPathsMatch) => {
|
|
37
|
+
const maybePatterns = Option.filter(maybeChangedPathsMatch, Array.isReadonlyArrayNonEmpty);
|
|
38
|
+
const startAbsolute = Option.getOrElse(maybeSinceIndex, () => state.startIndex);
|
|
39
|
+
const startRelative = Math.max(0, startAbsolute - state.startIndex);
|
|
40
|
+
return pipe(state.entries, Array.map((entry, relativeIndex) => ({
|
|
41
|
+
entry,
|
|
42
|
+
index: state.startIndex + relativeIndex,
|
|
43
|
+
})), Array.drop(startRelative), Array.filter(({ entry }) => entryMatchesPatterns(entry, maybePatterns)));
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Page a filtered candidate list. Forward pages take the first `limit`
|
|
47
|
+
* candidates and report the absolute index of the next matching entry, which
|
|
48
|
+
* a follow-up call passes back as the since index. Tail pages (`isFromEnd`)
|
|
49
|
+
* take the final `limit` candidates, still in chronological order, and never
|
|
50
|
+
* have a next index.
|
|
51
|
+
*/
|
|
52
|
+
export const pageMatchingEntries = (candidates, limit, isFromEnd) => isFromEnd
|
|
53
|
+
? {
|
|
54
|
+
page: Array.takeRight(candidates, limit),
|
|
55
|
+
maybeNextIndex: Option.none(),
|
|
56
|
+
}
|
|
57
|
+
: {
|
|
58
|
+
page: Array.take(candidates, limit),
|
|
59
|
+
maybeNextIndex: Option.map(Array.get(candidates, limit), ({ index }) => index),
|
|
60
|
+
};
|
|
61
|
+
const tagCountOrder = Order.combine(Order.mapInput(Order.flip(Order.Number), ({ count }) => count), Order.mapInput(Order.String, ({ tag }) => tag));
|
|
62
|
+
/**
|
|
63
|
+
* Count entries by Message tag, sorted by count descending then tag ascending
|
|
64
|
+
* so the noisiest Messages surface first.
|
|
65
|
+
*/
|
|
66
|
+
export const countEntriesByTag = (entries) => pipe(entries, Array.groupBy(({ entry }) => entry.tag), Record.toEntries, Array.map(([tag, group]) => ({ tag, count: group.length })), Array.sort(tagCountOrder));
|
|
67
|
+
/**
|
|
68
|
+
* The oldest non-init index `getModelAtIndex` can answer. The keyframe
|
|
69
|
+
* stored at `startIndex` is the Model right after entry `startIndex - 1`, so
|
|
70
|
+
* the index one before the oldest retained entry is still readable even
|
|
71
|
+
* though its entry was evicted.
|
|
72
|
+
*/
|
|
73
|
+
export const oldestReadableIndex = (state) => Math.max(0, state.startIndex - 1);
|
|
74
|
+
/**
|
|
75
|
+
* Whether `getModelAtIndex` can answer for this index: `INIT_INDEX` once the
|
|
76
|
+
* init Model is recorded, otherwise an index between `oldestReadableIndex`
|
|
77
|
+
* and the latest entry. Indices outside this range have been evicted (or
|
|
78
|
+
* have not happened yet) and must be rejected rather than silently replayed
|
|
79
|
+
* from the wrong keyframe.
|
|
80
|
+
*/
|
|
81
|
+
export const isIndexReadable = (state, index) => index === INIT_INDEX
|
|
82
|
+
? Option.isSome(state.maybeInitModel)
|
|
83
|
+
: index >= oldestReadableIndex(state) && index <= latestEntryIndex(state);
|
|
84
|
+
/**
|
|
85
|
+
* Format a clear error for an index `isIndexReadable` rejected, listing the
|
|
86
|
+
* index ranges the runtime can still answer for.
|
|
87
|
+
*/
|
|
88
|
+
export const formatIndexNotReadable = (state, index) => {
|
|
89
|
+
const latest = latestEntryIndex(state);
|
|
90
|
+
const initRange = Option.isSome(state.maybeInitModel) ? ['-1 (init)'] : [];
|
|
91
|
+
const entryRange = latest >= state.startIndex
|
|
92
|
+
? [`${oldestReadableIndex(state)} to ${latest}`]
|
|
93
|
+
: [];
|
|
94
|
+
const ranges = [...initRange, ...entryRange];
|
|
95
|
+
return Array.match(ranges, {
|
|
96
|
+
onEmpty: () => `No Model at index ${index}: the runtime has not recorded init yet.`,
|
|
97
|
+
onNonEmpty: nonEmptyRanges => `No Model at index ${index}. Readable indices: ${nonEmptyRanges.join(' and ')}. Indices outside this range were either evicted from the rolling history buffer or have not been recorded yet.`,
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
const isArrayIndexSegment = (segment) => /^\d+$/.test(segment);
|
|
101
|
+
/**
|
|
102
|
+
* Order diff paths for readability: segments compare pairwise, numeric
|
|
103
|
+
* segments compare as numbers so `root.items.2` sorts before
|
|
104
|
+
* `root.items.10`, and a path that is a prefix of another sorts first.
|
|
105
|
+
*/
|
|
106
|
+
export const pathOrder = Order.make((self, that) => {
|
|
107
|
+
const selfSegments = self.split(PATH_SEPARATOR);
|
|
108
|
+
const thatSegments = that.split(PATH_SEPARATOR);
|
|
109
|
+
const maybeFirstDifference = pipe(Array.zip(selfSegments, thatSegments), Array.findFirst(([selfSegment, thatSegment]) => selfSegment !== thatSegment));
|
|
110
|
+
return Option.match(maybeFirstDifference, {
|
|
111
|
+
onNone: () => Order.Number(selfSegments.length, thatSegments.length),
|
|
112
|
+
onSome: ([selfSegment, thatSegment]) => isArrayIndexSegment(selfSegment) && isArrayIndexSegment(thatSegment)
|
|
113
|
+
? Order.Number(Number(selfSegment), Number(thatSegment))
|
|
114
|
+
: Order.String(selfSegment, thatSegment),
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
/**
|
|
118
|
+
* Read the summarized value at a diff path on a Model snapshot. `None` when
|
|
119
|
+
* the path does not exist on this side of the diff (a key or element that was
|
|
120
|
+
* added or removed). Resolution happens on the `toInspectableValue` transform
|
|
121
|
+
* of the Model, the same tree the diff handler walks.
|
|
122
|
+
*/
|
|
123
|
+
export const readSummarizedValueAt = (model, path) => Match.value(resolvePath(toInspectableValue(model), path)).pipe(Match.tag('Found', ({ value }) => Option.some(summarizeValue(value))), Match.orElse(() => Option.none()));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/devTools/overlay.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EACP,MAAM,EAGN,OAAO,EAGP,MAAM,EAKN,MAAM,IAAI,CAAC,EAGX,eAAe,EAEhB,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAA;AAa9C,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAQ3E,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAElB,KAAK,WAAW,EAChB,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/devTools/overlay.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EACP,MAAM,EAGN,OAAO,EAGP,MAAM,EAKN,MAAM,IAAI,CAAC,EAGX,eAAe,EAEhB,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAA;AAa9C,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAQ3E,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAElB,KAAK,WAAW,EAChB,KAAK,UAAU,EAEhB,MAAM,YAAY,CAAA;;oFAgbT,CAAF;;;;;;;;;;;;;;AAtIR,cAAM,YAAa,SAAQ,iBAE1B;CAAG;;AAEJ,cAAM,iBAAkB,SAAQ,sBAGC;CAAG;AAEpC,eAAO,MAAM,UAAU;;iBAGsB,CAAA;AAE7C,eAAO,MAAM,YAAY;;iBAGwB,CAAA;AAWjD,eAAO,MAAM,MAAM;;;;wBAUlB,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;wBAIqB,CAAA;AAE9C,eAAO,MAAM,aAAa;;;;;;wBASzB,CAAA;AAED,eAAO,MAAM,MAAM;;wBASlB,CAAA;AAED,eAAO,MAAM,KAAK;;wBASjB,CAAA;AAED,eAAO,MAAM,WAAW;;6BAYvB,CAAA;AA+rDD,eAAO,MAAM,aAAa,GACxB,OAAO,aAAa,EACpB,UAAU,gBAAgB,EAC1B,MAAM,YAAY,EAClB,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,6DAuEhC,CAAA"}
|
package/dist/devTools/overlay.js
CHANGED
|
@@ -13,7 +13,7 @@ import * as Slider from '../ui/slider/public.js';
|
|
|
13
13
|
import * as Tabs from '../ui/tabs/public.js';
|
|
14
14
|
import { overlayStyles } from './overlay-styles.js';
|
|
15
15
|
import { toInspectableValue } from './serialize.js';
|
|
16
|
-
import { INIT_INDEX, } from './store.js';
|
|
16
|
+
import { INIT_INDEX, latestEntryIndex, } from './store.js';
|
|
17
17
|
import { GOT_MESSAGE_PATTERN, extractSubmodelInfo, isTagged, } from './submodelPath.js';
|
|
18
18
|
const SubmodelFilterListbox = Listbox.create();
|
|
19
19
|
// MODEL
|
|
@@ -250,10 +250,7 @@ export const InspectState = Command.define('InspectState', { index: S.Number },
|
|
|
250
250
|
export const InspectLatest = Command.define('InspectLatest', ReceivedInspectedState)(Effect.gen(function* () {
|
|
251
251
|
const store = yield* StoreService;
|
|
252
252
|
const state = yield* SubscriptionRef.get(store.stateRef);
|
|
253
|
-
|
|
254
|
-
? INIT_INDEX
|
|
255
|
-
: state.startIndex + state.entries.length - 1;
|
|
256
|
-
return yield* buildInspectionEffect(latestIndex);
|
|
253
|
+
return yield* buildInspectionEffect(latestEntryIndex(state));
|
|
257
254
|
}));
|
|
258
255
|
export const Resume = Command.define('Resume', CompletedResume)(Effect.gen(function* () {
|
|
259
256
|
const store = yield* StoreService;
|
|
@@ -64,10 +64,23 @@ export declare const RequestGetModelAt: import("../schema/index.js").CallableTag
|
|
|
64
64
|
maybePath: S.OptionFromNullOr<S.String>;
|
|
65
65
|
expand: S.Boolean;
|
|
66
66
|
}>;
|
|
67
|
-
/** Request recent history entries,
|
|
67
|
+
/** Request recent history entries. `maybeSinceIndex` starts the page at an absolute index; `fromEnd` returns the final entries instead (the two are mutually exclusive). `maybeChangedPathsMatch` filters entries server-side to those whose `changedPaths` match at least one dot-string pattern: segments compare pairwise for the length of the shorter list and `*` matches any single segment, so `root.grid` matches changes anywhere inside the grid subtree and `root.grid.5.3` also matches a wholesale replacement recorded at `root.grid`. The two newer fields decode with defaults when absent, so requests from an older MCP server keep working against a newer runtime. */
|
|
68
68
|
export declare const RequestListMessages: import("../schema/index.js").CallableTaggedStruct<"RequestListMessages", {
|
|
69
69
|
limit: S.Number;
|
|
70
70
|
maybeSinceIndex: S.OptionFromNullOr<S.Number>;
|
|
71
|
+
maybeChangedPathsMatch: S.withDecodingDefault<S.OptionFromNullOr<S.$Array<S.String>>, never>;
|
|
72
|
+
fromEnd: S.withDecodingDefault<S.Boolean, never>;
|
|
73
|
+
}>;
|
|
74
|
+
/** Request a histogram of retained history entries by Message tag. Accepts the same `maybeSinceIndex` / `maybeChangedPathsMatch` filters as `RequestListMessages` but returns only counts, so the response stays small regardless of history size. */
|
|
75
|
+
export declare const RequestCountMessagesByTag: import("../schema/index.js").CallableTaggedStruct<"RequestCountMessagesByTag", {
|
|
76
|
+
maybeSinceIndex: S.OptionFromNullOr<S.Number>;
|
|
77
|
+
maybeChangedPathsMatch: S.OptionFromNullOr<S.$Array<S.String>>;
|
|
78
|
+
}>;
|
|
79
|
+
/** Request a path-level diff between the Models at two absolute history indices. Each index follows `RequestGetModelAt` semantics (the Model right after that entry was applied; -1 is the initial Model). `maybeChangedPathsMatch` narrows the reported changes with the same pattern semantics as `RequestListMessages`. */
|
|
80
|
+
export declare const RequestDiffModels: import("../schema/index.js").CallableTaggedStruct<"RequestDiffModels", {
|
|
81
|
+
fromIndex: S.Number;
|
|
82
|
+
toIndex: S.Number;
|
|
83
|
+
maybeChangedPathsMatch: S.OptionFromNullOr<S.$Array<S.String>>;
|
|
71
84
|
}>;
|
|
72
85
|
/** Request a single history entry by index. To inspect the Model around the entry, call `RequestGetModelAt` with `index - 1` (before) and `index` (after). */
|
|
73
86
|
export declare const RequestGetMessage: import("../schema/index.js").CallableTaggedStruct<"RequestGetMessage", {
|
|
@@ -106,6 +119,15 @@ export declare const Request: S.Union<readonly [import("../schema/index.js").Cal
|
|
|
106
119
|
}>, import("../schema/index.js").CallableTaggedStruct<"RequestListMessages", {
|
|
107
120
|
limit: S.Number;
|
|
108
121
|
maybeSinceIndex: S.OptionFromNullOr<S.Number>;
|
|
122
|
+
maybeChangedPathsMatch: S.withDecodingDefault<S.OptionFromNullOr<S.$Array<S.String>>, never>;
|
|
123
|
+
fromEnd: S.withDecodingDefault<S.Boolean, never>;
|
|
124
|
+
}>, import("../schema/index.js").CallableTaggedStruct<"RequestCountMessagesByTag", {
|
|
125
|
+
maybeSinceIndex: S.OptionFromNullOr<S.Number>;
|
|
126
|
+
maybeChangedPathsMatch: S.OptionFromNullOr<S.$Array<S.String>>;
|
|
127
|
+
}>, import("../schema/index.js").CallableTaggedStruct<"RequestDiffModels", {
|
|
128
|
+
fromIndex: S.Number;
|
|
129
|
+
toIndex: S.Number;
|
|
130
|
+
maybeChangedPathsMatch: S.OptionFromNullOr<S.$Array<S.String>>;
|
|
109
131
|
}>, import("../schema/index.js").CallableTaggedStruct<"RequestGetMessage", {
|
|
110
132
|
index: S.Number;
|
|
111
133
|
}>, import("../schema/index.js").CallableTaggedStruct<"RequestListKeyframes", {}>, import("../schema/index.js").CallableTaggedStruct<"RequestReplayToKeyframe", {
|
|
@@ -123,7 +145,7 @@ export declare const ResponseModel: import("../schema/index.js").CallableTaggedS
|
|
|
123
145
|
atPath: S.String;
|
|
124
146
|
summarized: S.Boolean;
|
|
125
147
|
}>;
|
|
126
|
-
/** Response carrying a page of history entries. `maybeNextIndex` is `Some`
|
|
148
|
+
/** Response carrying a page of history entries. For forward reads, `maybeNextIndex` is `Some` of the absolute index of the next entry matching the request's filters (pass it as `RequestListMessages.maybeSinceIndex` to fetch the next page) and `None` when the page reaches the end of matching history. Tail reads (`fromEnd`) always carry `None`. */
|
|
127
149
|
export declare const ResponseMessages: import("../schema/index.js").CallableTaggedStruct<"ResponseMessages", {
|
|
128
150
|
entries: S.$Array<S.Struct<{
|
|
129
151
|
readonly index: S.Number;
|
|
@@ -176,6 +198,61 @@ export declare const ResponseMessage: import("../schema/index.js").CallableTagge
|
|
|
176
198
|
readonly maybeLeafTag: S.OptionFromNullOr<S.String>;
|
|
177
199
|
}>;
|
|
178
200
|
}>;
|
|
201
|
+
/** One row of a Message-tag histogram. */
|
|
202
|
+
export declare const MessageTagCount: S.Struct<{
|
|
203
|
+
readonly tag: S.String;
|
|
204
|
+
readonly count: S.Number;
|
|
205
|
+
}>;
|
|
206
|
+
/** One row of a Message-tag histogram. */
|
|
207
|
+
export type MessageTagCount = typeof MessageTagCount.Type;
|
|
208
|
+
/** Response carrying a Message-tag histogram, sorted by count descending then tag ascending. `totalCount` is the number of entries counted after filters. `scannedFromIndex` / `scannedToIndex` bound the absolute index range scanned (`scannedToIndex` is -1 when no entries are retained), so callers learn the live history bounds without a separate runtime-state call. */
|
|
209
|
+
export declare const ResponseMessageCounts: import("../schema/index.js").CallableTaggedStruct<"ResponseMessageCounts", {
|
|
210
|
+
counts: S.$Array<S.Struct<{
|
|
211
|
+
readonly tag: S.String;
|
|
212
|
+
readonly count: S.Number;
|
|
213
|
+
}>>;
|
|
214
|
+
totalCount: S.Number;
|
|
215
|
+
scannedFromIndex: S.Number;
|
|
216
|
+
scannedToIndex: S.Number;
|
|
217
|
+
}>;
|
|
218
|
+
/** The value on one side of a Model diff path: `Present` carries the summarized value; `Absent` means the path does not exist on that side (an added or removed key or element). The tagged shape is deliberate: a nullable encoding could not distinguish an absent path from a path whose value is literally `null`. `undefined`, which JSON cannot represent, is reported as `null`. */
|
|
219
|
+
export declare const DiffValueAbsent: import("../schema/index.js").CallableTaggedStruct<"Absent", {}>;
|
|
220
|
+
/** The value on one side of a Model diff path. See `DiffValue`. */
|
|
221
|
+
export declare const DiffValuePresent: import("../schema/index.js").CallableTaggedStruct<"Present", {
|
|
222
|
+
value: S.Unknown;
|
|
223
|
+
}>;
|
|
224
|
+
/** The value on one side of a Model diff path. */
|
|
225
|
+
export declare const DiffValue: S.Union<readonly [import("../schema/index.js").CallableTaggedStruct<"Absent", {}>, import("../schema/index.js").CallableTaggedStruct<"Present", {
|
|
226
|
+
value: S.Unknown;
|
|
227
|
+
}>]>;
|
|
228
|
+
/** The value on one side of a Model diff path. */
|
|
229
|
+
export type DiffValue = typeof DiffValue.Type;
|
|
230
|
+
/** One changed path in a Model diff. `before` is the value at `fromIndex`, `after` the value at `toIndex`. */
|
|
231
|
+
export declare const ModelDiffChange: S.Struct<{
|
|
232
|
+
readonly path: S.String;
|
|
233
|
+
readonly before: S.Union<readonly [import("../schema/index.js").CallableTaggedStruct<"Absent", {}>, import("../schema/index.js").CallableTaggedStruct<"Present", {
|
|
234
|
+
value: S.Unknown;
|
|
235
|
+
}>]>;
|
|
236
|
+
readonly after: S.Union<readonly [import("../schema/index.js").CallableTaggedStruct<"Absent", {}>, import("../schema/index.js").CallableTaggedStruct<"Present", {
|
|
237
|
+
value: S.Unknown;
|
|
238
|
+
}>]>;
|
|
239
|
+
}>;
|
|
240
|
+
/** One changed path in a Model diff. */
|
|
241
|
+
export type ModelDiffChange = typeof ModelDiffChange.Type;
|
|
242
|
+
/** Response carrying a path-level Model diff between two history indices. Changes list the leaf paths where the Models differ, sorted by path with numeric segments in numeric order; values are summarized with the same rules `ResponseModel` applies when `expand` is false. */
|
|
243
|
+
export declare const ResponseModelDiff: import("../schema/index.js").CallableTaggedStruct<"ResponseModelDiff", {
|
|
244
|
+
fromIndex: S.Number;
|
|
245
|
+
toIndex: S.Number;
|
|
246
|
+
changes: S.$Array<S.Struct<{
|
|
247
|
+
readonly path: S.String;
|
|
248
|
+
readonly before: S.Union<readonly [import("../schema/index.js").CallableTaggedStruct<"Absent", {}>, import("../schema/index.js").CallableTaggedStruct<"Present", {
|
|
249
|
+
value: S.Unknown;
|
|
250
|
+
}>]>;
|
|
251
|
+
readonly after: S.Union<readonly [import("../schema/index.js").CallableTaggedStruct<"Absent", {}>, import("../schema/index.js").CallableTaggedStruct<"Present", {
|
|
252
|
+
value: S.Unknown;
|
|
253
|
+
}>]>;
|
|
254
|
+
}>>;
|
|
255
|
+
}>;
|
|
179
256
|
/** Response carrying the list of available keyframes. */
|
|
180
257
|
export declare const ResponseKeyframes: import("../schema/index.js").CallableTaggedStruct<"ResponseKeyframes", {
|
|
181
258
|
keyframes: S.$Array<S.Struct<{
|
|
@@ -338,6 +415,26 @@ export declare const Response: S.Union<readonly [import("../schema/index.js").Ca
|
|
|
338
415
|
readonly submodelPath: S.$Array<S.String>;
|
|
339
416
|
readonly maybeLeafTag: S.OptionFromNullOr<S.String>;
|
|
340
417
|
}>;
|
|
418
|
+
}>, import("../schema/index.js").CallableTaggedStruct<"ResponseMessageCounts", {
|
|
419
|
+
counts: S.$Array<S.Struct<{
|
|
420
|
+
readonly tag: S.String;
|
|
421
|
+
readonly count: S.Number;
|
|
422
|
+
}>>;
|
|
423
|
+
totalCount: S.Number;
|
|
424
|
+
scannedFromIndex: S.Number;
|
|
425
|
+
scannedToIndex: S.Number;
|
|
426
|
+
}>, import("../schema/index.js").CallableTaggedStruct<"ResponseModelDiff", {
|
|
427
|
+
fromIndex: S.Number;
|
|
428
|
+
toIndex: S.Number;
|
|
429
|
+
changes: S.$Array<S.Struct<{
|
|
430
|
+
readonly path: S.String;
|
|
431
|
+
readonly before: S.Union<readonly [import("../schema/index.js").CallableTaggedStruct<"Absent", {}>, import("../schema/index.js").CallableTaggedStruct<"Present", {
|
|
432
|
+
value: S.Unknown;
|
|
433
|
+
}>]>;
|
|
434
|
+
readonly after: S.Union<readonly [import("../schema/index.js").CallableTaggedStruct<"Absent", {}>, import("../schema/index.js").CallableTaggedStruct<"Present", {
|
|
435
|
+
value: S.Unknown;
|
|
436
|
+
}>]>;
|
|
437
|
+
}>>;
|
|
341
438
|
}>, import("../schema/index.js").CallableTaggedStruct<"ResponseKeyframes", {
|
|
342
439
|
keyframes: S.$Array<S.Struct<{
|
|
343
440
|
readonly index: S.Number;
|
|
@@ -424,6 +521,15 @@ export declare const RequestFrame: S.Struct<{
|
|
|
424
521
|
}>, import("../schema/index.js").CallableTaggedStruct<"RequestListMessages", {
|
|
425
522
|
limit: S.Number;
|
|
426
523
|
maybeSinceIndex: S.OptionFromNullOr<S.Number>;
|
|
524
|
+
maybeChangedPathsMatch: S.withDecodingDefault<S.OptionFromNullOr<S.$Array<S.String>>, never>;
|
|
525
|
+
fromEnd: S.withDecodingDefault<S.Boolean, never>;
|
|
526
|
+
}>, import("../schema/index.js").CallableTaggedStruct<"RequestCountMessagesByTag", {
|
|
527
|
+
maybeSinceIndex: S.OptionFromNullOr<S.Number>;
|
|
528
|
+
maybeChangedPathsMatch: S.OptionFromNullOr<S.$Array<S.String>>;
|
|
529
|
+
}>, import("../schema/index.js").CallableTaggedStruct<"RequestDiffModels", {
|
|
530
|
+
fromIndex: S.Number;
|
|
531
|
+
toIndex: S.Number;
|
|
532
|
+
maybeChangedPathsMatch: S.OptionFromNullOr<S.$Array<S.String>>;
|
|
427
533
|
}>, import("../schema/index.js").CallableTaggedStruct<"RequestGetMessage", {
|
|
428
534
|
index: S.Number;
|
|
429
535
|
}>, import("../schema/index.js").CallableTaggedStruct<"RequestListKeyframes", {}>, import("../schema/index.js").CallableTaggedStruct<"RequestReplayToKeyframe", {
|
|
@@ -492,6 +598,26 @@ export declare const ResponseFrame: S.Struct<{
|
|
|
492
598
|
readonly submodelPath: S.$Array<S.String>;
|
|
493
599
|
readonly maybeLeafTag: S.OptionFromNullOr<S.String>;
|
|
494
600
|
}>;
|
|
601
|
+
}>, import("../schema/index.js").CallableTaggedStruct<"ResponseMessageCounts", {
|
|
602
|
+
counts: S.$Array<S.Struct<{
|
|
603
|
+
readonly tag: S.String;
|
|
604
|
+
readonly count: S.Number;
|
|
605
|
+
}>>;
|
|
606
|
+
totalCount: S.Number;
|
|
607
|
+
scannedFromIndex: S.Number;
|
|
608
|
+
scannedToIndex: S.Number;
|
|
609
|
+
}>, import("../schema/index.js").CallableTaggedStruct<"ResponseModelDiff", {
|
|
610
|
+
fromIndex: S.Number;
|
|
611
|
+
toIndex: S.Number;
|
|
612
|
+
changes: S.$Array<S.Struct<{
|
|
613
|
+
readonly path: S.String;
|
|
614
|
+
readonly before: S.Union<readonly [import("../schema/index.js").CallableTaggedStruct<"Absent", {}>, import("../schema/index.js").CallableTaggedStruct<"Present", {
|
|
615
|
+
value: S.Unknown;
|
|
616
|
+
}>]>;
|
|
617
|
+
readonly after: S.Union<readonly [import("../schema/index.js").CallableTaggedStruct<"Absent", {}>, import("../schema/index.js").CallableTaggedStruct<"Present", {
|
|
618
|
+
value: S.Unknown;
|
|
619
|
+
}>]>;
|
|
620
|
+
}>>;
|
|
495
621
|
}>, import("../schema/index.js").CallableTaggedStruct<"ResponseKeyframes", {
|
|
496
622
|
keyframes: S.$Array<S.Struct<{
|
|
497
623
|
readonly index: S.Number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/devTools/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/devTools/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Schema as S } from 'effect';
|
|
1
|
+
import { Effect, Schema as S } from 'effect';
|
|
2
2
|
import { ts } from '../schema/index.js';
|
|
3
3
|
// SHARED
|
|
4
4
|
/** A serialized Command produced during a Message dispatch (or `init`). `args` is `Some` when the Command's definition declared an args record, and carries the runtime values used to construct the Command instance. */
|
|
@@ -48,10 +48,23 @@ export const RequestGetModelAt = ts('RequestGetModelAt', {
|
|
|
48
48
|
maybePath: S.OptionFromNullOr(S.String),
|
|
49
49
|
expand: S.Boolean,
|
|
50
50
|
});
|
|
51
|
-
/** Request recent history entries,
|
|
51
|
+
/** Request recent history entries. `maybeSinceIndex` starts the page at an absolute index; `fromEnd` returns the final entries instead (the two are mutually exclusive). `maybeChangedPathsMatch` filters entries server-side to those whose `changedPaths` match at least one dot-string pattern: segments compare pairwise for the length of the shorter list and `*` matches any single segment, so `root.grid` matches changes anywhere inside the grid subtree and `root.grid.5.3` also matches a wholesale replacement recorded at `root.grid`. The two newer fields decode with defaults when absent, so requests from an older MCP server keep working against a newer runtime. */
|
|
52
52
|
export const RequestListMessages = ts('RequestListMessages', {
|
|
53
53
|
limit: S.Number,
|
|
54
54
|
maybeSinceIndex: S.OptionFromNullOr(S.Number),
|
|
55
|
+
maybeChangedPathsMatch: S.OptionFromNullOr(S.Array(S.String)).pipe(S.withDecodingDefault(Effect.succeed(null))),
|
|
56
|
+
fromEnd: S.Boolean.pipe(S.withDecodingDefault(Effect.succeed(false))),
|
|
57
|
+
});
|
|
58
|
+
/** Request a histogram of retained history entries by Message tag. Accepts the same `maybeSinceIndex` / `maybeChangedPathsMatch` filters as `RequestListMessages` but returns only counts, so the response stays small regardless of history size. */
|
|
59
|
+
export const RequestCountMessagesByTag = ts('RequestCountMessagesByTag', {
|
|
60
|
+
maybeSinceIndex: S.OptionFromNullOr(S.Number),
|
|
61
|
+
maybeChangedPathsMatch: S.OptionFromNullOr(S.Array(S.String)),
|
|
62
|
+
});
|
|
63
|
+
/** Request a path-level diff between the Models at two absolute history indices. Each index follows `RequestGetModelAt` semantics (the Model right after that entry was applied; -1 is the initial Model). `maybeChangedPathsMatch` narrows the reported changes with the same pattern semantics as `RequestListMessages`. */
|
|
64
|
+
export const RequestDiffModels = ts('RequestDiffModels', {
|
|
65
|
+
fromIndex: S.Number,
|
|
66
|
+
toIndex: S.Number,
|
|
67
|
+
maybeChangedPathsMatch: S.OptionFromNullOr(S.Array(S.String)),
|
|
55
68
|
});
|
|
56
69
|
/** Request a single history entry by index. To inspect the Model around the entry, call `RequestGetModelAt` with `index - 1` (before) and `index` (after). */
|
|
57
70
|
export const RequestGetMessage = ts('RequestGetMessage', {
|
|
@@ -84,6 +97,8 @@ export const Request = S.Union([
|
|
|
84
97
|
RequestGetModel,
|
|
85
98
|
RequestGetModelAt,
|
|
86
99
|
RequestListMessages,
|
|
100
|
+
RequestCountMessagesByTag,
|
|
101
|
+
RequestDiffModels,
|
|
87
102
|
RequestGetMessage,
|
|
88
103
|
RequestListKeyframes,
|
|
89
104
|
RequestReplayToKeyframe,
|
|
@@ -101,7 +116,7 @@ export const ResponseModel = ts('ResponseModel', {
|
|
|
101
116
|
atPath: S.String,
|
|
102
117
|
summarized: S.Boolean,
|
|
103
118
|
});
|
|
104
|
-
/** Response carrying a page of history entries. `maybeNextIndex` is `Some`
|
|
119
|
+
/** Response carrying a page of history entries. For forward reads, `maybeNextIndex` is `Some` of the absolute index of the next entry matching the request's filters (pass it as `RequestListMessages.maybeSinceIndex` to fetch the next page) and `None` when the page reaches the end of matching history. Tail reads (`fromEnd`) always carry `None`. */
|
|
105
120
|
export const ResponseMessages = ts('ResponseMessages', {
|
|
106
121
|
entries: S.Array(SerializedEntry),
|
|
107
122
|
maybeNextIndex: S.OptionFromNullOr(S.Number),
|
|
@@ -110,6 +125,36 @@ export const ResponseMessages = ts('ResponseMessages', {
|
|
|
110
125
|
export const ResponseMessage = ts('ResponseMessage', {
|
|
111
126
|
entry: SerializedEntry,
|
|
112
127
|
});
|
|
128
|
+
/** One row of a Message-tag histogram. */
|
|
129
|
+
export const MessageTagCount = S.Struct({
|
|
130
|
+
tag: S.String,
|
|
131
|
+
count: S.Number,
|
|
132
|
+
});
|
|
133
|
+
/** Response carrying a Message-tag histogram, sorted by count descending then tag ascending. `totalCount` is the number of entries counted after filters. `scannedFromIndex` / `scannedToIndex` bound the absolute index range scanned (`scannedToIndex` is -1 when no entries are retained), so callers learn the live history bounds without a separate runtime-state call. */
|
|
134
|
+
export const ResponseMessageCounts = ts('ResponseMessageCounts', {
|
|
135
|
+
counts: S.Array(MessageTagCount),
|
|
136
|
+
totalCount: S.Number,
|
|
137
|
+
scannedFromIndex: S.Number,
|
|
138
|
+
scannedToIndex: S.Number,
|
|
139
|
+
});
|
|
140
|
+
/** The value on one side of a Model diff path: `Present` carries the summarized value; `Absent` means the path does not exist on that side (an added or removed key or element). The tagged shape is deliberate: a nullable encoding could not distinguish an absent path from a path whose value is literally `null`. `undefined`, which JSON cannot represent, is reported as `null`. */
|
|
141
|
+
export const DiffValueAbsent = ts('Absent');
|
|
142
|
+
/** The value on one side of a Model diff path. See `DiffValue`. */
|
|
143
|
+
export const DiffValuePresent = ts('Present', { value: S.Unknown });
|
|
144
|
+
/** The value on one side of a Model diff path. */
|
|
145
|
+
export const DiffValue = S.Union([DiffValueAbsent, DiffValuePresent]);
|
|
146
|
+
/** One changed path in a Model diff. `before` is the value at `fromIndex`, `after` the value at `toIndex`. */
|
|
147
|
+
export const ModelDiffChange = S.Struct({
|
|
148
|
+
path: S.String,
|
|
149
|
+
before: DiffValue,
|
|
150
|
+
after: DiffValue,
|
|
151
|
+
});
|
|
152
|
+
/** Response carrying a path-level Model diff between two history indices. Changes list the leaf paths where the Models differ, sorted by path with numeric segments in numeric order; values are summarized with the same rules `ResponseModel` applies when `expand` is false. */
|
|
153
|
+
export const ResponseModelDiff = ts('ResponseModelDiff', {
|
|
154
|
+
fromIndex: S.Number,
|
|
155
|
+
toIndex: S.Number,
|
|
156
|
+
changes: S.Array(ModelDiffChange),
|
|
157
|
+
});
|
|
113
158
|
/** Response carrying the list of available keyframes. */
|
|
114
159
|
export const ResponseKeyframes = ts('ResponseKeyframes', {
|
|
115
160
|
keyframes: S.Array(KeyframeInfo),
|
|
@@ -178,6 +223,8 @@ export const Response = S.Union([
|
|
|
178
223
|
ResponseModel,
|
|
179
224
|
ResponseMessages,
|
|
180
225
|
ResponseMessage,
|
|
226
|
+
ResponseMessageCounts,
|
|
227
|
+
ResponseModelDiff,
|
|
181
228
|
ResponseKeyframes,
|
|
182
229
|
ResponseReplayed,
|
|
183
230
|
ResponseResumed,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { EventConnected, EventDisconnected, EventFrame, Event, KeyframeInfo, RequestDispatchMessage, RequestFrame, RequestGetInit, RequestGetMessage, RequestGetMessageSchema, RequestGetModel, RequestGetModelAt, RequestGetRuntimeState, RequestListKeyframes, RequestListMessages, RequestListRuntimes, RequestReplayToKeyframe, RequestResume, Request, ResponseDispatched, ResponseError, ResponseFrame, ResponseInit, ResponseKeyframes, ResponseMessage, ResponseMessages, ResponseMessageSchema, ResponseModel, ResponseReplayed, ResponseResumed, ResponseRuntimes, ResponseRuntimeState, Response, RuntimeInfo, SerializedEntry, } from './protocol.js';
|
|
1
|
+
export { EventConnected, EventDisconnected, EventFrame, Event, KeyframeInfo, DiffValue, DiffValueAbsent, DiffValuePresent, MessageTagCount, ModelDiffChange, RequestCountMessagesByTag, RequestDiffModels, RequestDispatchMessage, RequestFrame, RequestGetInit, RequestGetMessage, RequestGetMessageSchema, RequestGetModel, RequestGetModelAt, RequestGetRuntimeState, RequestListKeyframes, RequestListMessages, RequestListRuntimes, RequestReplayToKeyframe, RequestResume, Request, ResponseDispatched, ResponseError, ResponseFrame, ResponseInit, ResponseKeyframes, ResponseMessage, ResponseMessageCounts, ResponseMessages, ResponseMessageSchema, ResponseModel, ResponseModelDiff, ResponseReplayed, ResponseResumed, ResponseRuntimes, ResponseRuntimeState, Response, RuntimeInfo, SerializedEntry, } from './protocol.js';
|
|
2
2
|
//# sourceMappingURL=public.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/devTools/public.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,KAAK,EACL,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,aAAa,EACb,OAAO,EACP,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,QAAQ,EACR,WAAW,EACX,eAAe,GAChB,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/devTools/public.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,KAAK,EACL,YAAY,EACZ,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,sBAAsB,EACtB,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,aAAa,EACb,OAAO,EACP,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,QAAQ,EACR,WAAW,EACX,eAAe,GAChB,MAAM,eAAe,CAAA"}
|
package/dist/devTools/public.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { EventConnected, EventDisconnected, EventFrame, Event, KeyframeInfo, RequestDispatchMessage, RequestFrame, RequestGetInit, RequestGetMessage, RequestGetMessageSchema, RequestGetModel, RequestGetModelAt, RequestGetRuntimeState, RequestListKeyframes, RequestListMessages, RequestListRuntimes, RequestReplayToKeyframe, RequestResume, Request, ResponseDispatched, ResponseError, ResponseFrame, ResponseInit, ResponseKeyframes, ResponseMessage, ResponseMessages, ResponseMessageSchema, ResponseModel, ResponseReplayed, ResponseResumed, ResponseRuntimes, ResponseRuntimeState, Response, RuntimeInfo, SerializedEntry, } from './protocol.js';
|
|
1
|
+
export { EventConnected, EventDisconnected, EventFrame, Event, KeyframeInfo, DiffValue, DiffValueAbsent, DiffValuePresent, MessageTagCount, ModelDiffChange, RequestCountMessagesByTag, RequestDiffModels, RequestDispatchMessage, RequestFrame, RequestGetInit, RequestGetMessage, RequestGetMessageSchema, RequestGetModel, RequestGetModelAt, RequestGetRuntimeState, RequestListKeyframes, RequestListMessages, RequestListRuntimes, RequestReplayToKeyframe, RequestResume, Request, ResponseDispatched, ResponseError, ResponseFrame, ResponseInit, ResponseKeyframes, ResponseMessage, ResponseMessageCounts, ResponseMessages, ResponseMessageSchema, ResponseModel, ResponseModelDiff, ResponseReplayed, ResponseResumed, ResponseRuntimes, ResponseRuntimeState, Response, RuntimeInfo, SerializedEntry, } from './protocol.js';
|
package/dist/devTools/store.d.ts
CHANGED
|
@@ -40,6 +40,11 @@ export type Bridge = Readonly<{
|
|
|
40
40
|
render: (model: unknown) => Effect.Effect<void>;
|
|
41
41
|
markRenderPending: Effect.Effect<void>;
|
|
42
42
|
}>;
|
|
43
|
+
/**
|
|
44
|
+
* The absolute index of the most recently recorded entry, or `INIT_INDEX`
|
|
45
|
+
* when no Messages have been recorded yet.
|
|
46
|
+
*/
|
|
47
|
+
export declare const latestEntryIndex: (state: StoreState) => number;
|
|
43
48
|
/**
|
|
44
49
|
* Options for `createDevToolsStore`.
|
|
45
50
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/devTools/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,EACN,OAAO,EACP,OAAO,EAEP,MAAM,EAIN,eAAe,EAEhB,MAAM,QAAQ,CAAA;AAIf,eAAO,MAAM,UAAU,KAAK,CAAA;AAM5B,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACrC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;CACvC,CAAC,CAAA;AAEF,eAAO,MAAM,SAAS,EAAE,UAGvB,CAAA;AAID,eAAO,MAAM,WAAW,GACtB,UAAU,OAAO,EACjB,SAAS,OAAO,KACf,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/devTools/store.ts"],"names":[],"mappings":"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"}
|