@ai-matrx/summon 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.
Files changed (87) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +380 -2
  4. package/dist/closeBinding-C6raC3qJ.d.cts +20 -0
  5. package/dist/closeBinding-C6raC3qJ.d.ts +20 -0
  6. package/dist/dialog.cjs +60 -0
  7. package/dist/dialog.cjs.map +1 -0
  8. package/dist/dialog.d.cts +16 -0
  9. package/dist/dialog.d.ts +16 -0
  10. package/dist/dialog.js +38 -0
  11. package/dist/dialog.js.map +1 -0
  12. package/dist/errors-eJrKXq33.d.cts +30 -0
  13. package/dist/errors-eJrKXq33.d.ts +30 -0
  14. package/dist/handles.cjs +411 -0
  15. package/dist/handles.cjs.map +1 -0
  16. package/dist/handles.d.cts +166 -0
  17. package/dist/handles.d.ts +166 -0
  18. package/dist/handles.js +388 -0
  19. package/dist/handles.js.map +1 -0
  20. package/dist/index.cjs +2383 -0
  21. package/dist/index.cjs.map +1 -0
  22. package/dist/index.d.cts +1259 -0
  23. package/dist/index.d.ts +1259 -0
  24. package/dist/index.js +2363 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/lite.cjs +460 -0
  27. package/dist/lite.cjs.map +1 -0
  28. package/dist/lite.d.cts +56 -0
  29. package/dist/lite.d.ts +56 -0
  30. package/dist/lite.js +444 -0
  31. package/dist/lite.js.map +1 -0
  32. package/dist/next.cjs +61 -0
  33. package/dist/next.cjs.map +1 -0
  34. package/dist/next.d.cts +5 -0
  35. package/dist/next.d.ts +5 -0
  36. package/dist/next.js +39 -0
  37. package/dist/next.js.map +1 -0
  38. package/dist/persistence-data.cjs +143 -0
  39. package/dist/persistence-data.cjs.map +1 -0
  40. package/dist/persistence-data.d.cts +72 -0
  41. package/dist/persistence-data.d.ts +72 -0
  42. package/dist/persistence-data.js +120 -0
  43. package/dist/persistence-data.js.map +1 -0
  44. package/dist/persistence.cjs +1073 -0
  45. package/dist/persistence.cjs.map +1 -0
  46. package/dist/persistence.d.cts +236 -0
  47. package/dist/persistence.d.ts +236 -0
  48. package/dist/persistence.js +1077 -0
  49. package/dist/persistence.js.map +1 -0
  50. package/dist/react.cjs +733 -0
  51. package/dist/react.cjs.map +1 -0
  52. package/dist/react.d.cts +261 -0
  53. package/dist/react.d.ts +261 -0
  54. package/dist/react.js +718 -0
  55. package/dist/react.js.map +1 -0
  56. package/dist/sheet.cjs +71 -0
  57. package/dist/sheet.cjs.map +1 -0
  58. package/dist/sheet.d.cts +17 -0
  59. package/dist/sheet.d.ts +17 -0
  60. package/dist/sheet.js +49 -0
  61. package/dist/sheet.js.map +1 -0
  62. package/dist/styles.css +78 -0
  63. package/dist/testing.cjs +132 -0
  64. package/dist/testing.cjs.map +1 -0
  65. package/dist/testing.d.cts +44 -0
  66. package/dist/testing.d.ts +44 -0
  67. package/dist/testing.js +115 -0
  68. package/dist/testing.js.map +1 -0
  69. package/dist/url.cjs +362 -0
  70. package/dist/url.cjs.map +1 -0
  71. package/dist/url.d.cts +153 -0
  72. package/dist/url.d.ts +153 -0
  73. package/dist/url.js +352 -0
  74. package/dist/url.js.map +1 -0
  75. package/dist/window-host.cjs +123 -0
  76. package/dist/window-host.cjs.map +1 -0
  77. package/dist/window-host.d.cts +72 -0
  78. package/dist/window-host.d.ts +72 -0
  79. package/dist/window-host.js +104 -0
  80. package/dist/window-host.js.map +1 -0
  81. package/dist/window.cjs +3978 -0
  82. package/dist/window.cjs.map +1 -0
  83. package/dist/window.d.cts +796 -0
  84. package/dist/window.d.ts +796 -0
  85. package/dist/window.js +4003 -0
  86. package/dist/window.js.map +1 -0
  87. package/package.json +237 -4
@@ -0,0 +1,261 @@
1
+ import * as react from 'react';
2
+ import { ComponentType, ReactNode, Component, ErrorInfo } from 'react';
3
+ import * as _reduxjs_toolkit from '@reduxjs/toolkit';
4
+ import { Store, Dispatch, UnknownAction } from '@reduxjs/toolkit';
5
+ import { SummonPorts, SummonRootState, InstanceKey, OverlayRawData, AnyOverlayMeta, OverlayDefinitionMeta, OverlayId, OverlayDataOf, ErrorSinkPort } from '@ai-matrx/summon';
6
+ import { ReactReduxContextValue, UseDispatch, UseSelector, UseStore } from 'react-redux';
7
+
8
+ interface RenderModule<P> {
9
+ readonly default: ComponentType<P>;
10
+ }
11
+ type RenderLoader<P> = () => Promise<RenderModule<P>>;
12
+ /** The error a stalled import becomes, so the error boundary always fires. */
13
+ declare function chunkTimeoutError(key: string, timeoutMs: number): Error;
14
+
15
+ declare const SummonStoreContext: react.Context<ReactReduxContextValue<any, _reduxjs_toolkit.UnknownAction> | null>;
16
+ /** What every slot hands to `renderWrapper`, error extras and the fallbacks. */
17
+ interface OverlayRenderContext {
18
+ readonly overlayId: string;
19
+ readonly instanceId: string;
20
+ readonly instanceKey: string;
21
+ readonly label: string;
22
+ }
23
+ interface OverlayLoadingFallbackProps {
24
+ readonly overlayId: string;
25
+ readonly label: string;
26
+ }
27
+ interface OverlayErrorFallbackProps {
28
+ readonly overlayId: string;
29
+ readonly instanceId: string;
30
+ readonly label: string;
31
+ readonly error: unknown;
32
+ readonly componentStack: string | null;
33
+ /** Re-import the render module and mount again. */
34
+ readonly retry: () => void;
35
+ /** Close this instance (no reload). */
36
+ readonly close: () => void;
37
+ /** Host-provided extras (AI Matrx: "Copy for AI"), already rendered for this error. */
38
+ readonly extras: ReactNode;
39
+ }
40
+ interface OverlayErrorExtrasContext extends OverlayRenderContext {
41
+ readonly error: unknown;
42
+ readonly componentStack: string | null;
43
+ }
44
+
45
+ declare const DEFAULT_KEEP_ALIVE_LIMIT = 8;
46
+ declare const DEFAULT_IMPORT_TIMEOUT_MS = 12000;
47
+ declare const DEFAULT_STALL_WARN_MS = 10000;
48
+ interface SummonProviderProps {
49
+ /** The host's Redux store with `summonReducers` mounted at their root keys. Omit for a private store. */
50
+ readonly store?: Store<unknown>;
51
+ /** Host ports; anything omitted uses the working default. */
52
+ readonly ports?: Partial<SummonPorts>;
53
+ readonly fallbacks?: {
54
+ readonly loading?: ComponentType<OverlayLoadingFallbackProps>;
55
+ readonly error?: ComponentType<OverlayErrorFallbackProps>;
56
+ };
57
+ /** Extra controls in the default error card's footer (AI Matrx: "Copy for AI"). */
58
+ readonly errorReportExtras?: (context: OverlayErrorExtrasContext) => ReactNode;
59
+ /** Wrap every rendered overlay (AI Matrx: its surface layer boundary). */
60
+ readonly renderWrapper?: (node: ReactNode, context: OverlayRenderContext) => ReactNode;
61
+ /** Most closed-but-alive (`keepAlive: "hidden"`) instances kept mounted. Default 8. */
62
+ readonly keepAliveLimit?: number;
63
+ /** A render-module import that has not settled by then becomes a ChunkLoadError. Default 12 s. */
64
+ readonly importTimeoutMs?: number;
65
+ /** When the loading fallback reports a stall to the error port. Default 10 s. */
66
+ readonly stallWarnMs?: number;
67
+ readonly children?: ReactNode;
68
+ }
69
+ declare function SummonProvider({ store, ports, fallbacks, errorReportExtras, renderWrapper, keepAliveLimit, importTimeoutMs, stallWarnMs, children, }: SummonProviderProps): react.JSX.Element;
70
+
71
+ /** Dispatch as the React section uses it: plain actions (thunks are the host's business). */
72
+ type SummonReactDispatch = Dispatch<UnknownAction>;
73
+ /** The store as the React section sees it: the overlays slices at their root keys (a host store has more). */
74
+ type SummonReactStore = Store<SummonRootState>;
75
+ /** Select from the overlays store. */
76
+ declare const useSummonSelector: UseSelector<SummonRootState>;
77
+ /** The overlays store's dispatch. */
78
+ declare const useSummonDispatch: UseDispatch<SummonReactDispatch>;
79
+ /** The overlays store itself (for `getState()` inside callbacks). */
80
+ declare const useSummonStore: UseStore<SummonReactStore>;
81
+ /** The resolved ports of the nearest provider. */
82
+ declare function useSummonPorts(): SummonPorts;
83
+ /**
84
+ * The provider's ports, or the working defaults when no SummonProvider is above — for
85
+ * components that are usable page-local without the system (dialogs, sheets).
86
+ */
87
+ declare function useOptionalSummonPorts(): SummonPorts;
88
+
89
+ /** Event name → payload, declared once per overlay: `defineOverlay<Data, { uploaded: Result }>()`. */
90
+ type OverlayEventMap = Record<string, unknown>;
91
+ type OverlayHandlers<Events extends OverlayEventMap> = {
92
+ readonly [K in keyof Events]?: (payload: Events[K]) => void;
93
+ };
94
+
95
+ /** The props every overlay's render module receives. */
96
+ interface OverlayRenderProps<Data = OverlayRawData> {
97
+ readonly overlayId: string;
98
+ readonly instanceId: string;
99
+ /** The open data: raw (narrow it yourself) unless the definition declares `parse`. */
100
+ readonly data: Data;
101
+ readonly isOpen: true;
102
+ readonly close: () => void;
103
+ /** True while kept alive behind a close (`keepAlive: "hidden"`). */
104
+ readonly hidden: boolean;
105
+ }
106
+ /** What the host hands each instance — no data type, by design. */
107
+ interface InstanceBodyProps {
108
+ readonly instanceId: string;
109
+ readonly instanceKey: InstanceKey;
110
+ readonly data: OverlayRawData;
111
+ readonly hidden: boolean;
112
+ readonly close: () => void;
113
+ }
114
+
115
+ /** The open-data key that carries an overlay's event channel id (the old callback-group key). */
116
+ declare const CALLBACK_GROUP_KEY = "callbackGroupId";
117
+ interface OverlayHandle {
118
+ readonly overlayId: string;
119
+ readonly instanceId: string;
120
+ close(): void;
121
+ }
122
+ interface OverlayOpenOptions<Data, Events extends OverlayEventMap> {
123
+ readonly data?: Data;
124
+ /** Single-instance overlays ignore it unless given; multi-instance generate one when omitted. */
125
+ readonly instanceId?: string;
126
+ /** Plain functions; they reach the caller through an event channel owned by the instance. */
127
+ readonly handlers?: OverlayHandlers<Events>;
128
+ }
129
+ type OverlayOpener<Data, Events extends OverlayEventMap> = (options?: OverlayOpenOptions<Data, Events>) => OverlayHandle;
130
+ type OverlayControllerProps<Data, Events extends OverlayEventMap> = Data & {
131
+ readonly instanceId?: string;
132
+ readonly handlers?: OverlayHandlers<Events>;
133
+ };
134
+ type OverlayEmitter<Events extends OverlayEventMap> = <K extends keyof Events & string>(event: K, payload: Events[K]) => void;
135
+ /** What a definition file passes to `defineOverlay<Data>()(…)`. */
136
+ interface OverlaySpec<Id extends string, Data, Parsed> extends OverlayDefinitionMeta<Id, Data> {
137
+ /** The lazily loaded render module. Its default export receives `OverlayRenderProps<Parsed>`. */
138
+ readonly render: () => Promise<RenderModule<OverlayRenderProps<NoInfer<Parsed>>>>;
139
+ /** Narrow raw open data once. `null` = refuse: the instance is closed with a warning. */
140
+ readonly parse?: (raw: OverlayRawData) => Parsed | null;
141
+ }
142
+ /** The type-erased half the host renders; no data types cross this line. */
143
+ interface HostableOverlay {
144
+ readonly id: string;
145
+ readonly label: string;
146
+ readonly instance: "single" | "multi";
147
+ readonly keepAlive: "none" | "hidden" | "restore";
148
+ /** The metadata the core registry stores (links, window options, defaults…). */
149
+ readonly meta: AnyOverlayMeta;
150
+ readonly Body: ComponentType<InstanceBodyProps>;
151
+ }
152
+ interface OverlayDefinition<Id extends string, Data, Parsed, Events extends OverlayEventMap> extends Omit<OverlayDefinitionMeta<Id, Data>, "id" | "instance" | "keepAlive">, HostableOverlay {
153
+ readonly id: Id;
154
+ readonly render: () => Promise<RenderModule<OverlayRenderProps<Parsed>>>;
155
+ /** Imperative opener: `const open = def.useSummon(); open({ data })` → handle. */
156
+ useSummon(): OverlayOpener<Data, Events>;
157
+ /** Declarative form: opens on mount, closes on unmount, re-opens when its data changes. */
158
+ readonly Controller: (props: OverlayControllerProps<Data, Events>) => null;
159
+ useIsOpen(instanceId?: string): boolean;
160
+ /** `const close = def.useClose(); close(instanceId?)`. */
161
+ useClose(): (instanceId?: string) => void;
162
+ /** Inside the render tree: emit a declared event to the opener's handlers. */
163
+ useEmit(): OverlayEmitter<Events>;
164
+ }
165
+ /**
166
+ * Declare an overlay once. Curried so `Data` (and `Events`) are named while the id and the
167
+ * parsed-data type are inferred:
168
+ *
169
+ * export const notesWindow = defineOverlay<NotesWindowData>()({
170
+ * id: "notesWindow", label: "Notes", render: () => import("./notesWindow.render"),
171
+ * });
172
+ */
173
+ declare function defineOverlay<Data extends object = Record<string, never>, Events extends OverlayEventMap = Record<never, never>>(): <const Id extends string, Parsed = OverlayRawData>(spec: OverlaySpec<Id, Data, Parsed>) => OverlayDefinition<Id, Data, Parsed, Events>;
174
+
175
+ interface SummonHostProps {
176
+ /** Every overlay this host can render — the app's definition list, passed once. */
177
+ readonly definitions: readonly HostableOverlay[];
178
+ }
179
+ /** Close-on-navigation: on a pathname change, close every overlay bound to the page. */
180
+ declare function useCloseOnNavigation(): void;
181
+ declare function SummonHost({ definitions }: SummonHostProps): react.JSX.Element;
182
+
183
+ interface OverlayInstanceContextValue {
184
+ readonly overlayId: string;
185
+ readonly instanceId: string;
186
+ readonly instanceKey: InstanceKey;
187
+ readonly close: () => void;
188
+ readonly hidden: boolean;
189
+ /** The open data as it arrived (pre-parse); event emitters read their channel id from it. */
190
+ readonly rawData: OverlayRawData;
191
+ }
192
+ /** The open instance this component renders inside. Throws outside an overlay. */
193
+ declare function useOverlayInstance(): OverlayInstanceContextValue;
194
+ /** Same as `useOverlayInstance`, but `null` outside an overlay. */
195
+ declare function useOptionalOverlayInstance(): OverlayInstanceContextValue | null;
196
+ type OverlayStateSetter<T> = (next: T | ((previous: T) => T)) => void;
197
+ /**
198
+ * Saved state for the current overlay instance — `useState`, but kept in the overlays store under
199
+ * `overlayId:instanceId` so it survives `keepAlive: "restore"` close/reopen and is persisted when
200
+ * persistence is on. Any descendant of the overlay may call it; the same `name` reads the same
201
+ * value. Values must be serialisable.
202
+ */
203
+ declare function useOverlayState<T>(name: string, initial: T): [T, OverlayStateSetter<T>];
204
+
205
+ /** True while the instance is open. */
206
+ declare function useIsOverlayOpen(overlayId: OverlayId, instanceId?: string): boolean;
207
+ interface OpenOverlayOptions<Id extends OverlayId> {
208
+ readonly data?: OverlayDataOf<Id>;
209
+ readonly instanceId?: string;
210
+ }
211
+ /**
212
+ * Open an overlay by id. A multi-instance overlay (per its registered definition) gets a fresh
213
+ * instance id when none is given; a single-instance one opens "default".
214
+ */
215
+ declare function useOpenOverlay<Id extends OverlayId>(overlayId: Id): (options?: OpenOverlayOptions<Id>) => OverlayHandle;
216
+ /** A stable close function for one instance (pass straight to an `onClose` prop). */
217
+ declare function useCloseOverlay(overlayId: OverlayId, instanceId?: string): () => void;
218
+
219
+ interface OverlayErrorBoundaryProps {
220
+ readonly overlayId: string;
221
+ readonly instanceId: string;
222
+ readonly instanceKey: string;
223
+ readonly label: string;
224
+ readonly errors: ErrorSinkPort;
225
+ readonly fallback: ComponentType<OverlayErrorFallbackProps>;
226
+ readonly extras: ((context: OverlayErrorExtrasContext) => ReactNode) | null;
227
+ /** Swap in a fresh loader BEFORE the boundary clears, so the remount re-imports. */
228
+ readonly onRetry: () => void;
229
+ readonly onClose: () => void;
230
+ readonly children: ReactNode;
231
+ }
232
+ interface OverlayErrorBoundaryState {
233
+ readonly error: unknown;
234
+ readonly hasError: boolean;
235
+ readonly componentStack: string | null;
236
+ }
237
+ declare class OverlayErrorBoundary extends Component<OverlayErrorBoundaryProps, OverlayErrorBoundaryState> {
238
+ state: OverlayErrorBoundaryState;
239
+ static getDerivedStateFromError(error: unknown): Partial<OverlayErrorBoundaryState>;
240
+ componentDidCatch(error: unknown, info: ErrorInfo): void;
241
+ private readonly retry;
242
+ render(): ReactNode;
243
+ }
244
+
245
+ interface NormalizedOverlayError {
246
+ readonly name: string;
247
+ readonly message: string;
248
+ readonly stack: string | null;
249
+ readonly isChunkLoadError: boolean;
250
+ }
251
+ declare function normalizeOverlayError(error: unknown): NormalizedOverlayError;
252
+ /**
253
+ * Spinner while the render module is in flight. Never blank. At the stall threshold it reports
254
+ * once through the error port; the loader's import timeout (later) turns a hung import into a
255
+ * real error so the error fallback takes over.
256
+ */
257
+ declare function OverlayLoadingFallback({ overlayId, label }: OverlayLoadingFallbackProps): react.JSX.Element;
258
+ /** The error card: what failed, and a way out that never needs a page reload. */
259
+ declare function OverlayErrorFallback({ label, error, retry, close, extras }: OverlayErrorFallbackProps): react.JSX.Element;
260
+
261
+ export { CALLBACK_GROUP_KEY, DEFAULT_IMPORT_TIMEOUT_MS, DEFAULT_KEEP_ALIVE_LIMIT, DEFAULT_STALL_WARN_MS, type HostableOverlay, type NormalizedOverlayError, type OpenOverlayOptions, type OverlayControllerProps, type OverlayDefinition, type OverlayEmitter, OverlayErrorBoundary, type OverlayErrorBoundaryProps, type OverlayErrorExtrasContext, OverlayErrorFallback, type OverlayErrorFallbackProps, type OverlayEventMap, type OverlayHandle, type OverlayHandlers, type OverlayInstanceContextValue, OverlayLoadingFallback, type OverlayLoadingFallbackProps, type OverlayOpenOptions, type OverlayOpener, type OverlayRenderContext, type OverlayRenderProps, type OverlaySpec, type OverlayStateSetter, type RenderLoader, type RenderModule, SummonHost, type SummonHostProps, SummonProvider, type SummonProviderProps, type SummonReactDispatch, type SummonReactStore, SummonStoreContext, chunkTimeoutError, defineOverlay, normalizeOverlayError, useCloseOnNavigation, useCloseOverlay, useIsOverlayOpen, useOpenOverlay, useOptionalOverlayInstance, useOptionalSummonPorts, useOverlayInstance, useOverlayState, useSummonDispatch, useSummonPorts, useSummonSelector, useSummonStore };