@mindmakr/reins 0.0.0-stage → 0.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/LICENSE +21 -0
- package/README.md +6 -2
- package/dist/adapters.d.ts +25 -0
- package/dist/adapters.js +24 -0
- package/dist/bridge/args.d.ts +15 -0
- package/dist/bridge/args.js +59 -0
- package/dist/bridge/audit.d.ts +13 -0
- package/dist/bridge/audit.js +13 -0
- package/dist/bridge/clipboard.d.ts +2 -0
- package/dist/bridge/clipboard.js +31 -0
- package/dist/bridge/hub.d.ts +56 -0
- package/dist/bridge/hub.js +162 -0
- package/dist/bridge/index.d.ts +11 -0
- package/dist/bridge/index.js +11 -0
- package/dist/bridge/mcp.d.ts +5 -0
- package/dist/bridge/mcp.js +22 -0
- package/dist/bridge/origin.d.ts +7 -0
- package/dist/bridge/origin.js +23 -0
- package/dist/bridge/report-cli.d.ts +13 -0
- package/dist/bridge/report-cli.js +82 -0
- package/dist/bridge/session.d.ts +24 -0
- package/dist/bridge/session.js +116 -0
- package/dist/bridge/snap.d.ts +28 -0
- package/dist/bridge/snap.js +65 -0
- package/dist/bridge/token.d.ts +10 -0
- package/dist/bridge/token.js +35 -0
- package/dist/bridge/tools.d.ts +18 -0
- package/dist/bridge/tools.js +174 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +67 -0
- package/dist/dom.d.ts +2 -0
- package/dist/dom.js +48 -0
- package/dist/env.d.ts +1 -0
- package/dist/env.js +6 -0
- package/dist/expo.d.ts +27 -0
- package/dist/expo.js +48 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.js +267 -0
- package/dist/metro.d.ts +16 -0
- package/dist/metro.js +45 -0
- package/dist/network.d.ts +14 -0
- package/dist/network.js +50 -0
- package/dist/next-token-route.d.ts +9 -0
- package/dist/next-token-route.js +17 -0
- package/dist/next.d.ts +13 -0
- package/dist/next.js +27 -0
- package/dist/node.d.ts +80 -0
- package/dist/node.js +414 -0
- package/dist/react.d.ts +281 -0
- package/dist/react.js +33 -0
- package/dist/record-stub.d.ts +18 -0
- package/dist/record-stub.js +6 -0
- package/dist/record.d.ts +28 -0
- package/dist/record.js +104 -0
- package/dist/redact.d.ts +7 -0
- package/dist/redact.js +30 -0
- package/dist/report.d.ts +121 -0
- package/dist/report.js +353 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.js +27 -0
- package/dist/stub.d.ts +88 -0
- package/dist/stub.js +38 -0
- package/dist/types.d.ts +248 -0
- package/dist/types.js +1 -0
- package/dist/verify-cli.d.ts +2 -0
- package/dist/verify-cli.js +3 -0
- package/dist/verify.d.ts +17 -0
- package/dist/verify.js +60 -0
- package/dist/vite.d.ts +32 -0
- package/dist/vite.js +33 -0
- package/dist/webmcp.d.ts +3 -0
- package/dist/webmcp.js +20 -0
- package/package.json +59 -4
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import { type Action } from '@mindmakr/reins';
|
|
3
|
+
/**
|
|
4
|
+
* Registers an action while the component is mounted.
|
|
5
|
+
* `run` always sees the latest props; re-registers only when `deps` change.
|
|
6
|
+
*/
|
|
7
|
+
export declare function useReinsAction<I = any, O = any>(def: Action<I, O>, deps?: unknown[]): void;
|
|
8
|
+
/** Exposes a state snapshot while the component is mounted. The getter always sees the latest render. */
|
|
9
|
+
export declare function useReinsState(name: string, get: () => unknown): void;
|
|
10
|
+
export interface ReinsPanelProps extends HTMLAttributes<HTMLDivElement> {
|
|
11
|
+
id: string;
|
|
12
|
+
children?: ReactNode;
|
|
13
|
+
}
|
|
14
|
+
/** A `<div data-reins={id}>` the agent can measure, inspect and snap. Other props go to the div. */
|
|
15
|
+
export declare function ReinsPanel({ id, children, ...rest }: ReinsPanelProps): import("react").DetailedReactHTMLElement<{
|
|
16
|
+
'data-reins': string;
|
|
17
|
+
defaultChecked?: boolean | undefined;
|
|
18
|
+
defaultValue?: string | number | readonly string[] | undefined;
|
|
19
|
+
suppressContentEditableWarning?: boolean | undefined;
|
|
20
|
+
suppressHydrationWarning?: boolean | undefined;
|
|
21
|
+
accessKey?: string | undefined;
|
|
22
|
+
autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {});
|
|
23
|
+
autoFocus?: boolean | undefined;
|
|
24
|
+
className?: string | undefined;
|
|
25
|
+
contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
|
|
26
|
+
contextMenu?: string | undefined;
|
|
27
|
+
dir?: string | undefined;
|
|
28
|
+
draggable?: (boolean | "true" | "false") | undefined;
|
|
29
|
+
enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
|
|
30
|
+
hidden?: boolean | undefined;
|
|
31
|
+
lang?: string | undefined;
|
|
32
|
+
nonce?: string | undefined;
|
|
33
|
+
slot?: string | undefined;
|
|
34
|
+
spellCheck?: (boolean | "true" | "false") | undefined;
|
|
35
|
+
style?: import("react").CSSProperties | undefined;
|
|
36
|
+
tabIndex?: number | undefined;
|
|
37
|
+
title?: string | undefined;
|
|
38
|
+
translate?: "yes" | "no" | undefined;
|
|
39
|
+
radioGroup?: string | undefined;
|
|
40
|
+
role?: import("react").AriaRole | undefined;
|
|
41
|
+
about?: string | undefined;
|
|
42
|
+
content?: string | undefined;
|
|
43
|
+
datatype?: string | undefined;
|
|
44
|
+
inlist?: any;
|
|
45
|
+
prefix?: string | undefined;
|
|
46
|
+
property?: string | undefined;
|
|
47
|
+
rel?: string | undefined;
|
|
48
|
+
resource?: string | undefined;
|
|
49
|
+
rev?: string | undefined;
|
|
50
|
+
typeof?: string | undefined;
|
|
51
|
+
vocab?: string | undefined;
|
|
52
|
+
autoCorrect?: string | undefined;
|
|
53
|
+
autoSave?: string | undefined;
|
|
54
|
+
color?: string | undefined;
|
|
55
|
+
itemProp?: string | undefined;
|
|
56
|
+
itemScope?: boolean | undefined;
|
|
57
|
+
itemType?: string | undefined;
|
|
58
|
+
itemID?: string | undefined;
|
|
59
|
+
itemRef?: string | undefined;
|
|
60
|
+
results?: number | undefined;
|
|
61
|
+
security?: string | undefined;
|
|
62
|
+
unselectable?: "on" | "off" | undefined;
|
|
63
|
+
inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined;
|
|
64
|
+
is?: string | undefined;
|
|
65
|
+
exportparts?: string | undefined;
|
|
66
|
+
part?: string | undefined;
|
|
67
|
+
"aria-activedescendant"?: string | undefined;
|
|
68
|
+
"aria-atomic"?: (boolean | "true" | "false") | undefined;
|
|
69
|
+
"aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined;
|
|
70
|
+
"aria-braillelabel"?: string | undefined;
|
|
71
|
+
"aria-brailleroledescription"?: string | undefined;
|
|
72
|
+
"aria-busy"?: (boolean | "true" | "false") | undefined;
|
|
73
|
+
"aria-checked"?: boolean | "false" | "mixed" | "true" | undefined;
|
|
74
|
+
"aria-colcount"?: number | undefined;
|
|
75
|
+
"aria-colindex"?: number | undefined;
|
|
76
|
+
"aria-colindextext"?: string | undefined;
|
|
77
|
+
"aria-colspan"?: number | undefined;
|
|
78
|
+
"aria-controls"?: string | undefined;
|
|
79
|
+
"aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined;
|
|
80
|
+
"aria-describedby"?: string | undefined;
|
|
81
|
+
"aria-description"?: string | undefined;
|
|
82
|
+
"aria-details"?: string | undefined;
|
|
83
|
+
"aria-disabled"?: (boolean | "true" | "false") | undefined;
|
|
84
|
+
"aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined;
|
|
85
|
+
"aria-errormessage"?: string | undefined;
|
|
86
|
+
"aria-expanded"?: (boolean | "true" | "false") | undefined;
|
|
87
|
+
"aria-flowto"?: string | undefined;
|
|
88
|
+
"aria-grabbed"?: (boolean | "true" | "false") | undefined;
|
|
89
|
+
"aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined;
|
|
90
|
+
"aria-hidden"?: (boolean | "true" | "false") | undefined;
|
|
91
|
+
"aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined;
|
|
92
|
+
"aria-keyshortcuts"?: string | undefined;
|
|
93
|
+
"aria-label"?: string | undefined;
|
|
94
|
+
"aria-labelledby"?: string | undefined;
|
|
95
|
+
"aria-level"?: number | undefined;
|
|
96
|
+
"aria-live"?: "off" | "assertive" | "polite" | undefined;
|
|
97
|
+
"aria-modal"?: (boolean | "true" | "false") | undefined;
|
|
98
|
+
"aria-multiline"?: (boolean | "true" | "false") | undefined;
|
|
99
|
+
"aria-multiselectable"?: (boolean | "true" | "false") | undefined;
|
|
100
|
+
"aria-orientation"?: "horizontal" | "vertical" | undefined;
|
|
101
|
+
"aria-owns"?: string | undefined;
|
|
102
|
+
"aria-placeholder"?: string | undefined;
|
|
103
|
+
"aria-posinset"?: number | undefined;
|
|
104
|
+
"aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined;
|
|
105
|
+
"aria-readonly"?: (boolean | "true" | "false") | undefined;
|
|
106
|
+
"aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined;
|
|
107
|
+
"aria-required"?: (boolean | "true" | "false") | undefined;
|
|
108
|
+
"aria-roledescription"?: string | undefined;
|
|
109
|
+
"aria-rowcount"?: number | undefined;
|
|
110
|
+
"aria-rowindex"?: number | undefined;
|
|
111
|
+
"aria-rowindextext"?: string | undefined;
|
|
112
|
+
"aria-rowspan"?: number | undefined;
|
|
113
|
+
"aria-selected"?: (boolean | "true" | "false") | undefined;
|
|
114
|
+
"aria-setsize"?: number | undefined;
|
|
115
|
+
"aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined;
|
|
116
|
+
"aria-valuemax"?: number | undefined;
|
|
117
|
+
"aria-valuemin"?: number | undefined;
|
|
118
|
+
"aria-valuenow"?: number | undefined;
|
|
119
|
+
"aria-valuetext"?: string | undefined;
|
|
120
|
+
dangerouslySetInnerHTML?: {
|
|
121
|
+
__html: string | TrustedHTML;
|
|
122
|
+
} | undefined;
|
|
123
|
+
onCopy?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
|
|
124
|
+
onCopyCapture?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
|
|
125
|
+
onCut?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
|
|
126
|
+
onCutCapture?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
|
|
127
|
+
onPaste?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
|
|
128
|
+
onPasteCapture?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
|
|
129
|
+
onCompositionEnd?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
|
|
130
|
+
onCompositionEndCapture?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
|
|
131
|
+
onCompositionStart?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
|
|
132
|
+
onCompositionStartCapture?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
|
|
133
|
+
onCompositionUpdate?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
|
|
134
|
+
onCompositionUpdateCapture?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
|
|
135
|
+
onFocus?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
|
|
136
|
+
onFocusCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
|
|
137
|
+
onBlur?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
|
|
138
|
+
onBlurCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
|
|
139
|
+
onChange?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
140
|
+
onChangeCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
141
|
+
onBeforeInput?: import("react").InputEventHandler<HTMLDivElement> | undefined;
|
|
142
|
+
onBeforeInputCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
143
|
+
onInput?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
144
|
+
onInputCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
145
|
+
onReset?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
146
|
+
onResetCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
147
|
+
onSubmit?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
148
|
+
onSubmitCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
149
|
+
onInvalid?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
150
|
+
onInvalidCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
151
|
+
onLoad?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
152
|
+
onLoadCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
153
|
+
onError?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
154
|
+
onErrorCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
155
|
+
onKeyDown?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
|
|
156
|
+
onKeyDownCapture?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
|
|
157
|
+
onKeyPress?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
|
|
158
|
+
onKeyPressCapture?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
|
|
159
|
+
onKeyUp?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
|
|
160
|
+
onKeyUpCapture?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
|
|
161
|
+
onAbort?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
162
|
+
onAbortCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
163
|
+
onCanPlay?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
164
|
+
onCanPlayCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
165
|
+
onCanPlayThrough?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
166
|
+
onCanPlayThroughCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
167
|
+
onDurationChange?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
168
|
+
onDurationChangeCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
169
|
+
onEmptied?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
170
|
+
onEmptiedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
171
|
+
onEncrypted?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
172
|
+
onEncryptedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
173
|
+
onEnded?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
174
|
+
onEndedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
175
|
+
onLoadedData?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
176
|
+
onLoadedDataCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
177
|
+
onLoadedMetadata?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
178
|
+
onLoadedMetadataCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
179
|
+
onLoadStart?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
180
|
+
onLoadStartCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
181
|
+
onPause?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
182
|
+
onPauseCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
183
|
+
onPlay?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
184
|
+
onPlayCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
185
|
+
onPlaying?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
186
|
+
onPlayingCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
187
|
+
onProgress?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
188
|
+
onProgressCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
189
|
+
onRateChange?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
190
|
+
onRateChangeCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
191
|
+
onSeeked?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
192
|
+
onSeekedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
193
|
+
onSeeking?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
194
|
+
onSeekingCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
195
|
+
onStalled?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
196
|
+
onStalledCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
197
|
+
onSuspend?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
198
|
+
onSuspendCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
199
|
+
onTimeUpdate?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
200
|
+
onTimeUpdateCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
201
|
+
onVolumeChange?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
202
|
+
onVolumeChangeCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
203
|
+
onWaiting?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
204
|
+
onWaitingCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
205
|
+
onAuxClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
206
|
+
onAuxClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
207
|
+
onClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
208
|
+
onClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
209
|
+
onContextMenu?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
210
|
+
onContextMenuCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
211
|
+
onDoubleClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
212
|
+
onDoubleClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
213
|
+
onDrag?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
214
|
+
onDragCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
215
|
+
onDragEnd?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
216
|
+
onDragEndCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
217
|
+
onDragEnter?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
218
|
+
onDragEnterCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
219
|
+
onDragExit?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
220
|
+
onDragExitCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
221
|
+
onDragLeave?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
222
|
+
onDragLeaveCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
223
|
+
onDragOver?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
224
|
+
onDragOverCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
225
|
+
onDragStart?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
226
|
+
onDragStartCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
227
|
+
onDrop?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
228
|
+
onDropCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
|
|
229
|
+
onMouseDown?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
230
|
+
onMouseDownCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
231
|
+
onMouseEnter?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
232
|
+
onMouseLeave?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
233
|
+
onMouseMove?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
234
|
+
onMouseMoveCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
235
|
+
onMouseOut?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
236
|
+
onMouseOutCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
237
|
+
onMouseOver?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
238
|
+
onMouseOverCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
239
|
+
onMouseUp?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
240
|
+
onMouseUpCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
|
|
241
|
+
onSelect?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
242
|
+
onSelectCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
243
|
+
onTouchCancel?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
|
|
244
|
+
onTouchCancelCapture?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
|
|
245
|
+
onTouchEnd?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
|
|
246
|
+
onTouchEndCapture?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
|
|
247
|
+
onTouchMove?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
|
|
248
|
+
onTouchMoveCapture?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
|
|
249
|
+
onTouchStart?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
|
|
250
|
+
onTouchStartCapture?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
|
|
251
|
+
onPointerDown?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
252
|
+
onPointerDownCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
253
|
+
onPointerMove?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
254
|
+
onPointerMoveCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
255
|
+
onPointerUp?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
256
|
+
onPointerUpCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
257
|
+
onPointerCancel?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
258
|
+
onPointerCancelCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
259
|
+
onPointerEnter?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
260
|
+
onPointerLeave?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
261
|
+
onPointerOver?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
262
|
+
onPointerOverCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
263
|
+
onPointerOut?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
264
|
+
onPointerOutCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
265
|
+
onGotPointerCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
266
|
+
onGotPointerCaptureCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
267
|
+
onLostPointerCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
268
|
+
onLostPointerCaptureCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
269
|
+
onScroll?: import("react").UIEventHandler<HTMLDivElement> | undefined;
|
|
270
|
+
onScrollCapture?: import("react").UIEventHandler<HTMLDivElement> | undefined;
|
|
271
|
+
onWheel?: import("react").WheelEventHandler<HTMLDivElement> | undefined;
|
|
272
|
+
onWheelCapture?: import("react").WheelEventHandler<HTMLDivElement> | undefined;
|
|
273
|
+
onAnimationStart?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
|
|
274
|
+
onAnimationStartCapture?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
|
|
275
|
+
onAnimationEnd?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
|
|
276
|
+
onAnimationEndCapture?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
|
|
277
|
+
onAnimationIteration?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
|
|
278
|
+
onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
|
|
279
|
+
onTransitionEnd?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
|
|
280
|
+
onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
|
|
281
|
+
}, HTMLElement>;
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createElement, useEffect, useRef } from 'react';
|
|
2
|
+
import { reins } from '@mindmakr/reins';
|
|
3
|
+
/**
|
|
4
|
+
* Registers an action while the component is mounted.
|
|
5
|
+
* `run` always sees the latest props; re-registers only when `deps` change.
|
|
6
|
+
*/
|
|
7
|
+
export function useReinsAction(def, deps = []) {
|
|
8
|
+
const latest = useRef(def);
|
|
9
|
+
latest.current = def;
|
|
10
|
+
useEffect(() => reins.action({
|
|
11
|
+
name: def.name,
|
|
12
|
+
description: def.description,
|
|
13
|
+
input: def.input,
|
|
14
|
+
consequential: def.consequential,
|
|
15
|
+
readOnly: def.readOnly,
|
|
16
|
+
run: (input) => latest.current.run(input),
|
|
17
|
+
}),
|
|
18
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
19
|
+
[def.name, def.consequential, def.readOnly, ...deps]);
|
|
20
|
+
}
|
|
21
|
+
/** Exposes a state snapshot while the component is mounted. The getter always sees the latest render. */
|
|
22
|
+
export function useReinsState(name, get) {
|
|
23
|
+
const latest = useRef(get);
|
|
24
|
+
latest.current = get;
|
|
25
|
+
useEffect(() => reins.state(name, () => latest.current()), [name]);
|
|
26
|
+
}
|
|
27
|
+
/** A `<div data-reins={id}>` the agent can measure, inspect and snap. Other props go to the div. */
|
|
28
|
+
export function ReinsPanel({ id, children, ...rest }) {
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
reins.markComponent(id);
|
|
31
|
+
});
|
|
32
|
+
return createElement('div', { ...rest, 'data-reins': id }, children);
|
|
33
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface RecordOptions {
|
|
2
|
+
allow?: Record<string, string[] | undefined>;
|
|
3
|
+
bufferSize?: number;
|
|
4
|
+
pill?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface ExportOptions {
|
|
7
|
+
format?: 'md' | 'json' | 'both';
|
|
8
|
+
title?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const startRecording: (_o?: RecordOptions) => boolean;
|
|
11
|
+
export declare const recordFromUrl: (_o?: RecordOptions) => boolean;
|
|
12
|
+
export declare const stopRecording: () => void;
|
|
13
|
+
export declare const isRecording: () => boolean;
|
|
14
|
+
export declare const collectSession: (_title?: string) => null;
|
|
15
|
+
export declare const exportSession: (_o?: ExportOptions) => {
|
|
16
|
+
session: null;
|
|
17
|
+
files: string[];
|
|
18
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const startRecording = (_o) => false;
|
|
2
|
+
export const recordFromUrl = (_o) => false;
|
|
3
|
+
export const stopRecording = () => { };
|
|
4
|
+
export const isRecording = () => false;
|
|
5
|
+
export const collectSession = (_title) => null;
|
|
6
|
+
export const exportSession = (_o) => ({ session: null, files: [] });
|
package/dist/record.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type Allow } from '@mindmakr/reins';
|
|
2
|
+
import { type SessionData } from './report.js';
|
|
3
|
+
export interface RecordOptions {
|
|
4
|
+
/** Keys shown as they are; everything sensitive is redacted, as in the core. */
|
|
5
|
+
allow?: Allow;
|
|
6
|
+
/** Size of the network and error buffers. Default 100. */
|
|
7
|
+
bufferSize?: number;
|
|
8
|
+
/** Show the "● Recording · Export" pill. Default true. */
|
|
9
|
+
pill?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ExportOptions {
|
|
12
|
+
format?: 'md' | 'json' | 'both';
|
|
13
|
+
title?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Starts record mode. Returns false (and does nothing) when reins is not enabled in this build. */
|
|
16
|
+
export declare function startRecording(o?: RecordOptions): boolean;
|
|
17
|
+
/** Starts record mode only when the page URL has `?reins=record`. */
|
|
18
|
+
export declare function recordFromUrl(o?: RecordOptions): boolean;
|
|
19
|
+
/** Stops record mode and removes the pill. */
|
|
20
|
+
export declare function stopRecording(): void;
|
|
21
|
+
export declare const isRecording: () => boolean;
|
|
22
|
+
/** Builds the session report from what record mode has collected so far. */
|
|
23
|
+
export declare function collectSession(title?: string): SessionData;
|
|
24
|
+
/** Downloads `reins-session-<time>.md` and/or `.json`. Returns the session and the file names. */
|
|
25
|
+
export declare function exportSession(o?: ExportOptions): {
|
|
26
|
+
session: SessionData;
|
|
27
|
+
files: string[];
|
|
28
|
+
};
|
package/dist/record.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// @mindmakr/reins/record: tester record mode. Browser only. Works without a bridge, but only in builds where reins
|
|
2
|
+
// is enabled (dev, or a private staging build with REINS_ENABLE=1) and only after the tester opts in
|
|
3
|
+
// (`?reins=record` in the URL via `recordFromUrl()`, or a button that calls `startRecording()`).
|
|
4
|
+
// Production builds swap this file for `@mindmakr/reins/record-stub`; it carries the dev marker so `reins verify` catches it.
|
|
5
|
+
import { devEnabled, reins, VERSION } from '@mindmakr/reins';
|
|
6
|
+
import { inspect } from './dom.js';
|
|
7
|
+
import { buildSession, renderMarkdown } from './report.js';
|
|
8
|
+
const MARKER = '__REINS_DEV_ONLY__';
|
|
9
|
+
let on = false;
|
|
10
|
+
let pill = null;
|
|
11
|
+
const doc = () => globalThis.document;
|
|
12
|
+
function showPill() {
|
|
13
|
+
const d = doc();
|
|
14
|
+
if (!d?.body || pill)
|
|
15
|
+
return;
|
|
16
|
+
const el = d.createElement('div');
|
|
17
|
+
el.setAttribute('data-reins-record', MARKER);
|
|
18
|
+
el.setAttribute('role', 'status');
|
|
19
|
+
el.style.cssText =
|
|
20
|
+
'position:fixed;right:12px;bottom:12px;z-index:2147483647;display:flex;gap:8px;align-items:center;padding:6px 10px;border-radius:999px;background:#111;color:#fff;font:12px/1.2 system-ui,sans-serif;box-shadow:0 2px 8px rgba(0,0,0,.3)';
|
|
21
|
+
const btn = (label, title, fn) => {
|
|
22
|
+
const b = d.createElement('button');
|
|
23
|
+
b.type = 'button';
|
|
24
|
+
b.textContent = label;
|
|
25
|
+
b.title = title;
|
|
26
|
+
b.style.cssText = 'all:unset;cursor:pointer;padding:2px 6px;border-radius:6px;background:#333';
|
|
27
|
+
b.onclick = fn;
|
|
28
|
+
return b;
|
|
29
|
+
};
|
|
30
|
+
const dot = d.createElement('span');
|
|
31
|
+
dot.textContent = '● Recording';
|
|
32
|
+
dot.style.color = '#ff5c5c';
|
|
33
|
+
el.append(dot, btn('Export', 'Download this session as Markdown and JSON', () => exportSession()), btn('×', 'Stop recording', stopRecording));
|
|
34
|
+
d.body.appendChild(el);
|
|
35
|
+
pill = el;
|
|
36
|
+
}
|
|
37
|
+
/** Starts record mode. Returns false (and does nothing) when reins is not enabled in this build. */
|
|
38
|
+
export function startRecording(o = {}) {
|
|
39
|
+
if (!devEnabled() || !reins.record({ allow: o.allow, bufferSize: o.bufferSize }))
|
|
40
|
+
return false;
|
|
41
|
+
on = true;
|
|
42
|
+
if (o.pill !== false)
|
|
43
|
+
showPill();
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
/** Starts record mode only when the page URL has `?reins=record`. */
|
|
47
|
+
export function recordFromUrl(o = {}) {
|
|
48
|
+
const q = '' + (globalThis.location?.search || '');
|
|
49
|
+
return /[?&]reins=record(&|$)/.test(q) && startRecording(o);
|
|
50
|
+
}
|
|
51
|
+
/** Stops record mode and removes the pill. */
|
|
52
|
+
export function stopRecording() {
|
|
53
|
+
on = false;
|
|
54
|
+
reins.record(false);
|
|
55
|
+
pill?.remove?.();
|
|
56
|
+
pill = null;
|
|
57
|
+
}
|
|
58
|
+
export const isRecording = () => on;
|
|
59
|
+
/** Builds the session report from what record mode has collected so far. */
|
|
60
|
+
export function collectSession(title = 'tester session') {
|
|
61
|
+
const dom = {};
|
|
62
|
+
for (const id of reins.panels())
|
|
63
|
+
dom[id] = inspect(globalThis, { panel: id, depth: 8, maxNodes: 400 });
|
|
64
|
+
let state = null;
|
|
65
|
+
try {
|
|
66
|
+
state = reins.snapshot();
|
|
67
|
+
}
|
|
68
|
+
catch { }
|
|
69
|
+
return buildSession({
|
|
70
|
+
title,
|
|
71
|
+
source: 'record',
|
|
72
|
+
reinsVersion: VERSION,
|
|
73
|
+
app: { url: state?.location, title: doc()?.title, platform: 'web' },
|
|
74
|
+
actions: reins.actions(),
|
|
75
|
+
state,
|
|
76
|
+
network: reins.network(),
|
|
77
|
+
errors: reins.errors(),
|
|
78
|
+
perf: reins.perf(),
|
|
79
|
+
dom,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function download(name, text, type) {
|
|
83
|
+
const d = doc();
|
|
84
|
+
const U = globalThis.URL;
|
|
85
|
+
const a = d.createElement('a');
|
|
86
|
+
a.href = U.createObjectURL(new Blob([text], { type }));
|
|
87
|
+
a.download = name;
|
|
88
|
+
d.body.appendChild(a);
|
|
89
|
+
a.click();
|
|
90
|
+
a.remove();
|
|
91
|
+
setTimeout(() => U.revokeObjectURL(a.href), 1000);
|
|
92
|
+
}
|
|
93
|
+
/** Downloads `reins-session-<time>.md` and/or `.json`. Returns the session and the file names. */
|
|
94
|
+
export function exportSession(o = {}) {
|
|
95
|
+
const session = collectSession(o.title);
|
|
96
|
+
const base = 'reins-session-' + session.createdAt.replace(/[:.]/g, '-');
|
|
97
|
+
const fmt = o.format || 'both';
|
|
98
|
+
const files = [];
|
|
99
|
+
if (fmt !== 'json')
|
|
100
|
+
download(files[files.push(base + '.md') - 1], renderMarkdown(session), 'text/markdown');
|
|
101
|
+
if (fmt !== 'md')
|
|
102
|
+
download(files[files.push(base + '.json') - 1], JSON.stringify(session, null, 2), 'application/json');
|
|
103
|
+
return { session, files };
|
|
104
|
+
}
|
package/dist/redact.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const REDACTED = "[redacted]";
|
|
2
|
+
export declare const isSensitive: (k: string) => boolean;
|
|
3
|
+
export declare const redactPairs: (pairs: Array<[string, string]>, allow?: string[]) => Record<string, string>;
|
|
4
|
+
export declare const redactHeaders: (h: Record<string, string>, allow?: string[]) => Record<string, string>;
|
|
5
|
+
export declare function redactBody(b?: string | null, keys?: string[]): unknown;
|
|
6
|
+
export declare function redactDeep(value: unknown, allow?: string[], seen?: WeakSet<object>): unknown;
|
|
7
|
+
export declare const redactUrl: (url: string, allow?: string[]) => string;
|
package/dist/redact.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const REDACTED = '[redacted]';
|
|
2
|
+
const SENSITIVE = /pass|secret|token|auth|cookie|session|api[-_]?key|credential|private|jwt|bearer|otp|signature|card|ssn/i;
|
|
3
|
+
const mapPairs = (a, fn) => Object.fromEntries(a.map(([k, v]) => [k, fn(k, v)]));
|
|
4
|
+
const mapObj = (o, fn) => mapPairs(Object.entries(o), fn);
|
|
5
|
+
const has = (l, k) => l?.some((x) => x.toLowerCase() == k.toLowerCase());
|
|
6
|
+
export const isSensitive = (k) => SENSITIVE.test(k);
|
|
7
|
+
export const redactPairs = (pairs, allow) => mapPairs(pairs, (k, v) => (has(allow, k) ? v : REDACTED));
|
|
8
|
+
export const redactHeaders = (h, allow = []) => redactPairs(Object.entries(h).map(([k, v]) => [k.toLowerCase(), v]), ['content-type', 'content-length', 'cache-control', 'etag', ...allow]);
|
|
9
|
+
export function redactBody(b, keys) {
|
|
10
|
+
if (!b)
|
|
11
|
+
return;
|
|
12
|
+
try {
|
|
13
|
+
const p = (v) => (Array.isArray(v) ? v.map(p) : v && typeof v == 'object' ? mapObj(v, (k, x) => (has(keys, k) ? x : p(x))) : REDACTED);
|
|
14
|
+
return keys?.length ? p(JSON.parse(b)) : REDACTED;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return REDACTED;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function redactDeep(value, allow, seen = new WeakSet()) {
|
|
21
|
+
const walk = (v) => typeof v == 'function'
|
|
22
|
+
? '[function]'
|
|
23
|
+
: !v || typeof v != 'object'
|
|
24
|
+
? v
|
|
25
|
+
: seen.has(v)
|
|
26
|
+
? '[cycle]'
|
|
27
|
+
: (seen.add(v), Array.isArray(v) ? v.map(walk) : mapObj(v, (k, x) => (isSensitive(k) && !has(allow, k) ? REDACTED : walk(x))));
|
|
28
|
+
return walk(value);
|
|
29
|
+
}
|
|
30
|
+
export const redactUrl = (url, allow) => url.replace(/([?&])([^=&#]+)=[^&#]*/g, (m, sep, k) => (isSensitive(k) && !has(allow, k) ? `${sep}${k}=${REDACTED}` : m));
|
package/dist/report.d.ts
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { ActionInfo, DomIssue, DomNode, ErrEntry, NetEntry, PerfReport, RouteStat, ServerReport, ServerRequest } from './types.js';
|
|
2
|
+
export declare const SCHEMA_VERSION = 1;
|
|
3
|
+
/** Thresholds behind the Findings section. */
|
|
4
|
+
export declare const LIMITS: {
|
|
5
|
+
apiMs: number;
|
|
6
|
+
renders: number;
|
|
7
|
+
fcpMs: number;
|
|
8
|
+
dupCalls: number;
|
|
9
|
+
dupWindowMs: number;
|
|
10
|
+
spanShare: number;
|
|
11
|
+
spanMinMs: number;
|
|
12
|
+
nPlusOne: number;
|
|
13
|
+
};
|
|
14
|
+
export interface DomIssueEntry {
|
|
15
|
+
panel: string;
|
|
16
|
+
tag: string;
|
|
17
|
+
id?: string;
|
|
18
|
+
text?: string;
|
|
19
|
+
issues: DomIssue[];
|
|
20
|
+
}
|
|
21
|
+
export interface PanelSummary {
|
|
22
|
+
id: string;
|
|
23
|
+
renders?: number;
|
|
24
|
+
mountedAtMs?: number;
|
|
25
|
+
lastRenderMs?: number;
|
|
26
|
+
nodes: number;
|
|
27
|
+
issues: number;
|
|
28
|
+
}
|
|
29
|
+
export interface AuditLine {
|
|
30
|
+
at?: string;
|
|
31
|
+
source?: string;
|
|
32
|
+
event?: string;
|
|
33
|
+
name?: string;
|
|
34
|
+
via?: string;
|
|
35
|
+
ok?: boolean;
|
|
36
|
+
error?: string;
|
|
37
|
+
ms?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface SessionData {
|
|
40
|
+
schemaVersion: 1;
|
|
41
|
+
title: string;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
reinsVersion: string;
|
|
44
|
+
source: 'bridge' | 'record';
|
|
45
|
+
app: {
|
|
46
|
+
url?: string;
|
|
47
|
+
title?: string;
|
|
48
|
+
platform?: string;
|
|
49
|
+
meta?: Record<string, string>;
|
|
50
|
+
};
|
|
51
|
+
actions: ActionInfo[];
|
|
52
|
+
state: Record<string, unknown> | null;
|
|
53
|
+
network: NetEntry[];
|
|
54
|
+
errors: ErrEntry[];
|
|
55
|
+
/** Always with `timeline`. */
|
|
56
|
+
perf: PerfReport | null;
|
|
57
|
+
panels: PanelSummary[];
|
|
58
|
+
domIssues: DomIssueEntry[];
|
|
59
|
+
server: ServerReport | null;
|
|
60
|
+
/** Project-relative paths of the snaps taken this session. */
|
|
61
|
+
snaps: string[];
|
|
62
|
+
audit: AuditLine[];
|
|
63
|
+
}
|
|
64
|
+
export interface Finding {
|
|
65
|
+
/** Stable id, used to tell new findings from resolved ones in a compare. */
|
|
66
|
+
key: string;
|
|
67
|
+
level: 'error' | 'warn';
|
|
68
|
+
text: string;
|
|
69
|
+
}
|
|
70
|
+
/** Per-route stats for server requests, slowest average first. */
|
|
71
|
+
export declare function routeStats(requests: ServerRequest[]): RouteStat[];
|
|
72
|
+
/** Merges the reports of several paired servers into one. */
|
|
73
|
+
export declare function mergeServers(reports: ServerReport[]): ServerReport | null;
|
|
74
|
+
/**
|
|
75
|
+
* Adds the unified timeline to a perf report: lifecycle marks, panel mounts, API calls and actions,
|
|
76
|
+
* plus the server half of each API call, joined by its `x-reins-trace` id. Calls are trimmed to timing fields.
|
|
77
|
+
*/
|
|
78
|
+
export declare function withTimeline(perf: PerfReport, server?: ServerRequest[] | null): PerfReport;
|
|
79
|
+
/** Flattens a `reins_dom` tree: node count and the nodes that have layout issues. */
|
|
80
|
+
export declare function summarizeDom(panel: string, root: DomNode | null): {
|
|
81
|
+
nodes: number;
|
|
82
|
+
issues: DomIssueEntry[];
|
|
83
|
+
};
|
|
84
|
+
export interface SessionParts {
|
|
85
|
+
title?: string;
|
|
86
|
+
source: 'bridge' | 'record';
|
|
87
|
+
reinsVersion: string;
|
|
88
|
+
createdAt?: string;
|
|
89
|
+
app?: SessionData['app'];
|
|
90
|
+
actions?: ActionInfo[];
|
|
91
|
+
state?: Record<string, unknown> | null;
|
|
92
|
+
network?: NetEntry[];
|
|
93
|
+
errors?: ErrEntry[];
|
|
94
|
+
perf?: PerfReport | null;
|
|
95
|
+
/** `reins_dom` tree per panel id. */
|
|
96
|
+
dom?: Record<string, DomNode | null>;
|
|
97
|
+
server?: ServerReport | null;
|
|
98
|
+
snaps?: string[];
|
|
99
|
+
audit?: AuditLine[];
|
|
100
|
+
}
|
|
101
|
+
/** Puts the gathered parts into one session record. */
|
|
102
|
+
export declare function buildSession(p: SessionParts): SessionData;
|
|
103
|
+
/** Plain-language flags computed by simple rules. See `LIMITS`. */
|
|
104
|
+
export declare function findings(s: SessionData): Finding[];
|
|
105
|
+
export interface RenderOptions {
|
|
106
|
+
/** Turns a project-relative snap path into a link. Default: as is. */
|
|
107
|
+
link?: (path: string) => string;
|
|
108
|
+
/** Rows kept in long tables. Default 60. */
|
|
109
|
+
maxRows?: number;
|
|
110
|
+
}
|
|
111
|
+
/** Renders a session as plain Markdown for models and people. */
|
|
112
|
+
export declare function renderMarkdown(s: SessionData, o?: RenderOptions): string;
|
|
113
|
+
/** A file-name-safe base: `2026-11-10T06-30-00-123Z-checkout-flow`. */
|
|
114
|
+
export declare function sessionBase(createdAt: string, title: string): string;
|
|
115
|
+
export interface CompareResult {
|
|
116
|
+
markdown: string;
|
|
117
|
+
newFindings: Finding[];
|
|
118
|
+
resolved: Finding[];
|
|
119
|
+
}
|
|
120
|
+
/** A Markdown diff of two sessions: metrics, API time per URL, panel renders, and findings. Lower is better for every metric. */
|
|
121
|
+
export declare function compareSessions(before: SessionData, after: SessionData): CompareResult;
|