@pactor-app/app 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.
@@ -0,0 +1,278 @@
1
+ import { I18nMessages, PageDsl, Registry } from '@pactor-app/core';
2
+ import { OverlayManager, UiBridge, InteractionProviderProps, OverlayHostProps } from '@pactor-app/ui/interaction';
3
+ import { LayoutRegistry, AdminLayoutConfig } from '@pactor-app/ui/layout';
4
+ import { PermissionStore } from '@pactor-app/permission';
5
+ import { BootstrapResource, DslResourceLoader } from '@pactor-app/resource';
6
+ import { NavigationBridge, NavigationLocation, NavigationListener, MenuRegistry, RouteContext } from '@pactor-app/router';
7
+ import { PageRuntime, ActionHandler, ServiceHandler } from '@pactor-app/runtime';
8
+ import * as react from 'react';
9
+ import { ComponentType, ReactNode, Component, ErrorInfo } from 'react';
10
+
11
+ /** 认证令牌提供者:同步或异步返回 Bearer token(无令牌返回 undefined) */
12
+ type AuthTokenProvider = () => string | undefined | Promise<string | undefined>;
13
+ /** 路由配置(V1 支持 browser + basename;hash 预留) */
14
+ interface PactorRouterOptions {
15
+ /** 路由类型,缺省 'browser' */
16
+ type?: 'browser' | 'hash';
17
+ /** react-router basename(部署在子路径时配置) */
18
+ basename?: string;
19
+ }
20
+ /** createPactorApplication 配置(设计决策 D1) */
21
+ interface PactorApplicationOptions {
22
+ /** 应用 id(必填):app 上下文缺省 id、brand 缺省标题回退 */
23
+ appId: string;
24
+ /** DSL 资源 API 配置;未注入 loader 时按 baseURL 创建 HttpDslResourceLoader */
25
+ api?: {
26
+ baseURL?: string;
27
+ };
28
+ /** 资源加载器(优先于 api;测试/本地可注入 StaticDslLoader) */
29
+ loader?: DslResourceLoader;
30
+ /** 布局类型覆盖(优先级:options.layout > bootstrap.layout.type > 'admin') */
31
+ layout?: string;
32
+ /** 品牌区覆盖(缺省取 bootstrap.app.name,再回退 appId) */
33
+ brand?: {
34
+ title: string;
35
+ logo?: ReactNode;
36
+ };
37
+ /** 路由配置 */
38
+ router?: PactorRouterOptions;
39
+ /** 业务组件扩展(写入应用级共享 registry,可覆盖同名内置组件) */
40
+ components?: Record<string, unknown>;
41
+ /**
42
+ * UI 库切换(设计决策 D4,ui-kit-selection spec):组件注册表工厂,
43
+ * 缺省 createShadcnComponentRegistry(shadcn,@pactor-app/ui——唯一内置
44
+ * 实现);传入自定义工厂可整体替换。
45
+ * options.components 与运行期 registerComponent 叠加在所选注册表之上。
46
+ * 注意:默认路径需导入 `@pactor-app/ui/styles.css`。
47
+ */
48
+ componentRegistry?: () => Registry<unknown>;
49
+ /**
50
+ * UI 库切换(shell-ui-kit-selection spec):布局注册表工厂,
51
+ * 缺省 createShadcnLayoutRegistry(shadcn,@pactor-app/ui——唯一内置
52
+ * 实现);传入自定义工厂可整体替换外壳布局。
53
+ * bootstrap 的 layout.type 解析逻辑不变。
54
+ */
55
+ layoutRegistry?: () => LayoutRegistry;
56
+ /**
57
+ * UI 库切换(shell-ui-kit-selection spec):交互层组件对,
58
+ * 缺省 shadcn 版 ShadcnInteractionProvider / ShadcnOverlayHost
59
+ * (@pactor-app/ui——唯一内置实现);传入自定义组件对可替换
60
+ * overlay / message / confirm 链路。props 类型为
61
+ * @pactor-app/ui/interaction 的 InteractionProviderProps / OverlayHostProps。
62
+ */
63
+ interactionKit?: {
64
+ Provider: ComponentType<InteractionProviderProps>;
65
+ OverlayHost: ComponentType<OverlayHostProps>;
66
+ };
67
+ /**
68
+ * UI kit 预设(ui-kit-preset spec):一次性提供三个 UI 库切换槽位
69
+ * (内置预设为 @pactor-app/ui 的 shadcnUiKit)。
70
+ * 每个槽位独立合并,优先级:显式细粒度选项 > ui 预设 > 内置
71
+ * shadcn 默认。
72
+ */
73
+ ui?: UiKit;
74
+ /** 业务动作扩展(可覆盖同名内置/交互动作) */
75
+ actions?: Record<string, ActionHandler>;
76
+ /** 业务服务扩展 */
77
+ services?: Record<string, ServiceHandler>;
78
+ /** 业务能力扩展 */
79
+ capabilities?: Record<string, unknown>;
80
+ /**
81
+ * 应用级包装组件(Router 之内、InteractionKit 之外):业务
82
+ * ConfigProvider / 全局 Context 由此进入应用树(message / modal /
83
+ * overlay 均消费其上下文)。皮肤主题等运行时切换场景经此注入。
84
+ */
85
+ providers?: ComponentType<{
86
+ children?: ReactNode;
87
+ }>;
88
+ /** admin 布局头部右侧插槽(透传 AdminLayout headerExtra) */
89
+ headerExtra?: ReactNode;
90
+ /** 认证令牌:注入 DSL 资源请求与页面 HTTP 出口(Authorization: Bearer) */
91
+ authTokenProvider?: AuthTokenProvider;
92
+ /** 当前语言代码(优先级高于 bootstrap.locale 与浏览器语言) */
93
+ locale?: string;
94
+ /** 回退语言代码(缺省 'zh-CN') */
95
+ defaultLocale?: string;
96
+ /** 翻译消息表(优先级高于 bootstrap.messages) */
97
+ messages?: I18nMessages;
98
+ }
99
+ /**
100
+ * UI kit 预设对象(ui-kit-preset spec):三个槽位的字段类型直接复用
101
+ * PactorApplicationOptions 既有选项的类型(结构一致,天然向第三方 kit 开放)。
102
+ */
103
+ interface UiKit {
104
+ /** 组件注册表工厂(同 options.componentRegistry) */
105
+ componentRegistry?: PactorApplicationOptions['componentRegistry'];
106
+ /** 布局注册表工厂(同 options.layoutRegistry) */
107
+ layoutRegistry?: PactorApplicationOptions['layoutRegistry'];
108
+ /** 交互层组件对(同 options.interactionKit) */
109
+ interactionKit?: PactorApplicationOptions['interactionKit'];
110
+ }
111
+ /**
112
+ * bootstrap 会话(设计决策 D1/D2):启动编排的产物,
113
+ * React 组合层据以渲染布局、菜单与动态路由。
114
+ */
115
+ interface PactorAppSession {
116
+ /** 原始 bootstrap 资源 */
117
+ bootstrap: BootstrapResource;
118
+ /** 菜单注册表(bootstrap.menus,缺省 []) */
119
+ menuRegistry: MenuRegistry;
120
+ /** 解析后的布局类型 */
121
+ layoutType: string;
122
+ /** 布局区域开关(来自 bootstrap.layout,缺省交给布局组件自身缺省) */
123
+ layoutConfig: AdminLayoutConfig;
124
+ /** 品牌区 */
125
+ brand: {
126
+ title: string;
127
+ logo?: ReactNode;
128
+ };
129
+ /** 当前用户(注入页面运行时 user 作用域) */
130
+ user: Record<string, unknown>;
131
+ /** 应用信息({ id: appId, ...bootstrap.app },注入 app 作用域) */
132
+ app: Record<string, unknown>;
133
+ /** 当前语言代码 */
134
+ locale: string;
135
+ /** 回退语言代码 */
136
+ defaultLocale: string;
137
+ /** 翻译消息表 */
138
+ messages: I18nMessages;
139
+ }
140
+ /** 应用实例(设计决策 D4):mount/unmount 与扩展注册 API */
141
+ interface PactorApplication {
142
+ readonly appId: string;
143
+ /** 以 createRoot 渲染到 selector 匹配的元素;重复 mount 先 unmount */
144
+ mount(selector: string): void;
145
+ /** 卸载根(未挂载时 no-op) */
146
+ unmount(): void;
147
+ /** 注册业务组件到应用级共享 registry(同名覆盖;新创建/重建的页面即可用) */
148
+ registerComponent(name: string, component: unknown): void;
149
+ /** 注册业务动作(同名覆盖) */
150
+ registerAction(name: string, handler: ActionHandler): void;
151
+ /** 注册业务服务(同名覆盖) */
152
+ registerService(name: string, handler: ServiceHandler): void;
153
+ /** 注册业务能力(同名覆盖) */
154
+ registerCapability(name: string, capability: unknown): void;
155
+ /** 运行时切换语言:更新应用级 i18n 配置并触发页面重建 */
156
+ setLocale(locale: string, messages?: I18nMessages): void;
157
+ }
158
+ /**
159
+ * 内部句柄:Application 组件经 props 访问应用级单例与工厂。
160
+ * 不作为一站式 API 使用。
161
+ */
162
+ interface PactorApplicationHandle {
163
+ readonly appId: string;
164
+ readonly overlayManager: OverlayManager;
165
+ readonly uiBridge: UiBridge;
166
+ readonly permissionStore: PermissionStore;
167
+ readonly layoutRegistry: LayoutRegistry;
168
+ /** 交互层 UI kit(Provider / OverlayHost 组件对,缺省 shadcn 版) */
169
+ readonly interactionKit: {
170
+ Provider: ComponentType<InteractionProviderProps>;
171
+ OverlayHost: ComponentType<OverlayHostProps>;
172
+ };
173
+ readonly routerOptions: PactorRouterOptions;
174
+ /** 应用级包装组件(Router 之内、InteractionKit 之外;缺省不包装) */
175
+ readonly providers?: ComponentType<{
176
+ children?: ReactNode;
177
+ }>;
178
+ /** admin 布局头部右侧插槽(透传 AdminLayout headerExtra) */
179
+ readonly headerExtra?: ReactNode;
180
+ /** react-router 桥接绑定(RouterBridgeSync 挂载后委托到真实路由) */
181
+ readonly navigation: ReactRouterBinding;
182
+ /** 启动编排:加载 bootstrap 并组装会话(失败 reject,由组合层渲染重试页) */
183
+ loadSession(): Promise<PactorAppSession>;
184
+ /** 页面运行时工厂(设计决策 D2):注入共享 registries / adapters / route / user / app */
185
+ createPageRuntime(pageDsl: PageDsl, route: RouteContext): PageRuntime;
186
+ /** OverlayHost 的 page overlay 页面加载(loader.loadPage → PageDsl) */
187
+ resolvePage(pageId: string): Promise<PageDsl>;
188
+ }
189
+ /**
190
+ * react-router 桥接绑定(NavigationBridge 实现):
191
+ * RouterBridgeSync 挂载时绑定真实 react-router 桥接并同步初始 location,
192
+ * 之后每次 location 变化经 sync 通知订阅者(AdminLayout 页签/选中态、
193
+ * DSL navigate 动作均走此桥)。
194
+ */
195
+ declare class ReactRouterBinding implements NavigationBridge {
196
+ private delegate?;
197
+ private location;
198
+ private readonly listeners;
199
+ /** 绑定真实桥接与初始 location(RouterBridgeSync 挂载时调用) */
200
+ bind(delegate: NavigationBridge, initial: NavigationLocation): void;
201
+ /** location 变化同步并通知订阅者 */
202
+ sync(location: NavigationLocation): void;
203
+ getLocation(): NavigationLocation;
204
+ push(to: string): void;
205
+ replace(to: string): void;
206
+ subscribe(listener: NavigationListener): () => void;
207
+ }
208
+ /**
209
+ * 创建 Pactor 应用(设计文档第 86–88 节,决策 D1–D4):
210
+ *
211
+ * ```ts
212
+ * createPactorApplication({ appId: 'risk-admin', api: { baseURL: '/api/runtime' } })
213
+ * .mount('#root');
214
+ * ```
215
+ *
216
+ * - loader:options.loader 优先,否则按 api.baseURL(默认 '/api/runtime')
217
+ * 创建 HttpDslResourceLoader,authTokenProvider 注入 Authorization 头;
218
+ * - 应用级共享 registries:内置组件 + 交互动作(应用级 OverlayManager /
219
+ * UiBridge 单例)+ navigate 动作 + options 扩展,全部被页面运行时共享;
220
+ * - bootstrap 在 mount 后由组合层执行(失败渲染含重试的启动错误页);
221
+ * - 运行期 registerComponent/Action/Service/Capability 写入共享 registry,
222
+ * 新创建/重建的页面即可用(当前已创建页面下次重建后生效)。
223
+ */
224
+ declare function createPactorApplication(options: PactorApplicationOptions): PactorApplication;
225
+
226
+ /** Application props:app 为 createPactorApplication 的内部句柄 */
227
+ interface ApplicationProps {
228
+ app: PactorApplicationHandle;
229
+ }
230
+ /**
231
+ * Application(设计决策 D3):bootstrap 状态机 + React 组合。
232
+ *
233
+ * mount 后依次:加载 bootstrap(loading 态)→ 失败渲染含重试的启动错误页 →
234
+ * 成功渲染组合:Router → RouterBridgeSync → providers(可选应用级包装)→
235
+ * interactionKit.Provider → 布局(resolveLayout)→
236
+ * Routes path="*" → DynamicDslRoute(404/403)。
237
+ */
238
+ declare function Application({ app }: ApplicationProps): react.JSX.Element;
239
+
240
+ /** DslPageLoader props */
241
+ interface DslPageLoaderProps {
242
+ app: PactorApplicationHandle;
243
+ pageId: string;
244
+ route: RouteContext;
245
+ }
246
+ /**
247
+ * DslPageLoader(决策 D3):pageId → loadPage → createPageRuntime →
248
+ * PageRuntimeView。
249
+ *
250
+ * - 组件以 pageId + route.params/query 为 key(见 Application),
251
+ * key 变化即整体重建:旧运行时 destroy,新页面重新加载(V1 无 keepAlive);
252
+ * - 加载中渲染 loading 态;加载/校验失败渲染含重试的受控错误页;
253
+ * - PageRuntimeView 经 PageErrorBoundary 包裹,渲染异常不白屏;
254
+ * - OverlayHost(app.interactionKit 所选实现,缺省 shadcn 版)作为
255
+ * PageRuntimeView children(共享当前页面 Renderer 上下文;page overlay
256
+ * 经 resolvePage 接 loader,子运行时共享应用级 registries——由
257
+ * interaction host 内部实现)。
258
+ */
259
+ declare function DslPageLoader({ app, pageId, route }: DslPageLoaderProps): react.JSX.Element;
260
+
261
+ interface PageErrorBoundaryProps {
262
+ children?: ReactNode;
263
+ }
264
+ interface PageErrorBoundaryState {
265
+ error: Error | null;
266
+ }
267
+ /**
268
+ * PageErrorBoundary(决策 D3):捕获页面 DSL 渲染期异常,
269
+ * 显示受控错误页(可重试重新渲染),应用外壳不崩溃、不白屏。
270
+ */
271
+ declare class PageErrorBoundary extends Component<PageErrorBoundaryProps, PageErrorBoundaryState> {
272
+ state: PageErrorBoundaryState;
273
+ static getDerivedStateFromError(error: Error): PageErrorBoundaryState;
274
+ componentDidCatch(error: Error, info: ErrorInfo): void;
275
+ render(): ReactNode;
276
+ }
277
+
278
+ export { Application, type ApplicationProps, type AuthTokenProvider, DslPageLoader, type DslPageLoaderProps, type PactorAppSession, type PactorApplication, type PactorApplicationHandle, type PactorApplicationOptions, type PactorRouterOptions, PageErrorBoundary, ReactRouterBinding, type UiKit, createPactorApplication };
@@ -0,0 +1,278 @@
1
+ import { I18nMessages, PageDsl, Registry } from '@pactor-app/core';
2
+ import { OverlayManager, UiBridge, InteractionProviderProps, OverlayHostProps } from '@pactor-app/ui/interaction';
3
+ import { LayoutRegistry, AdminLayoutConfig } from '@pactor-app/ui/layout';
4
+ import { PermissionStore } from '@pactor-app/permission';
5
+ import { BootstrapResource, DslResourceLoader } from '@pactor-app/resource';
6
+ import { NavigationBridge, NavigationLocation, NavigationListener, MenuRegistry, RouteContext } from '@pactor-app/router';
7
+ import { PageRuntime, ActionHandler, ServiceHandler } from '@pactor-app/runtime';
8
+ import * as react from 'react';
9
+ import { ComponentType, ReactNode, Component, ErrorInfo } from 'react';
10
+
11
+ /** 认证令牌提供者:同步或异步返回 Bearer token(无令牌返回 undefined) */
12
+ type AuthTokenProvider = () => string | undefined | Promise<string | undefined>;
13
+ /** 路由配置(V1 支持 browser + basename;hash 预留) */
14
+ interface PactorRouterOptions {
15
+ /** 路由类型,缺省 'browser' */
16
+ type?: 'browser' | 'hash';
17
+ /** react-router basename(部署在子路径时配置) */
18
+ basename?: string;
19
+ }
20
+ /** createPactorApplication 配置(设计决策 D1) */
21
+ interface PactorApplicationOptions {
22
+ /** 应用 id(必填):app 上下文缺省 id、brand 缺省标题回退 */
23
+ appId: string;
24
+ /** DSL 资源 API 配置;未注入 loader 时按 baseURL 创建 HttpDslResourceLoader */
25
+ api?: {
26
+ baseURL?: string;
27
+ };
28
+ /** 资源加载器(优先于 api;测试/本地可注入 StaticDslLoader) */
29
+ loader?: DslResourceLoader;
30
+ /** 布局类型覆盖(优先级:options.layout > bootstrap.layout.type > 'admin') */
31
+ layout?: string;
32
+ /** 品牌区覆盖(缺省取 bootstrap.app.name,再回退 appId) */
33
+ brand?: {
34
+ title: string;
35
+ logo?: ReactNode;
36
+ };
37
+ /** 路由配置 */
38
+ router?: PactorRouterOptions;
39
+ /** 业务组件扩展(写入应用级共享 registry,可覆盖同名内置组件) */
40
+ components?: Record<string, unknown>;
41
+ /**
42
+ * UI 库切换(设计决策 D4,ui-kit-selection spec):组件注册表工厂,
43
+ * 缺省 createShadcnComponentRegistry(shadcn,@pactor-app/ui——唯一内置
44
+ * 实现);传入自定义工厂可整体替换。
45
+ * options.components 与运行期 registerComponent 叠加在所选注册表之上。
46
+ * 注意:默认路径需导入 `@pactor-app/ui/styles.css`。
47
+ */
48
+ componentRegistry?: () => Registry<unknown>;
49
+ /**
50
+ * UI 库切换(shell-ui-kit-selection spec):布局注册表工厂,
51
+ * 缺省 createShadcnLayoutRegistry(shadcn,@pactor-app/ui——唯一内置
52
+ * 实现);传入自定义工厂可整体替换外壳布局。
53
+ * bootstrap 的 layout.type 解析逻辑不变。
54
+ */
55
+ layoutRegistry?: () => LayoutRegistry;
56
+ /**
57
+ * UI 库切换(shell-ui-kit-selection spec):交互层组件对,
58
+ * 缺省 shadcn 版 ShadcnInteractionProvider / ShadcnOverlayHost
59
+ * (@pactor-app/ui——唯一内置实现);传入自定义组件对可替换
60
+ * overlay / message / confirm 链路。props 类型为
61
+ * @pactor-app/ui/interaction 的 InteractionProviderProps / OverlayHostProps。
62
+ */
63
+ interactionKit?: {
64
+ Provider: ComponentType<InteractionProviderProps>;
65
+ OverlayHost: ComponentType<OverlayHostProps>;
66
+ };
67
+ /**
68
+ * UI kit 预设(ui-kit-preset spec):一次性提供三个 UI 库切换槽位
69
+ * (内置预设为 @pactor-app/ui 的 shadcnUiKit)。
70
+ * 每个槽位独立合并,优先级:显式细粒度选项 > ui 预设 > 内置
71
+ * shadcn 默认。
72
+ */
73
+ ui?: UiKit;
74
+ /** 业务动作扩展(可覆盖同名内置/交互动作) */
75
+ actions?: Record<string, ActionHandler>;
76
+ /** 业务服务扩展 */
77
+ services?: Record<string, ServiceHandler>;
78
+ /** 业务能力扩展 */
79
+ capabilities?: Record<string, unknown>;
80
+ /**
81
+ * 应用级包装组件(Router 之内、InteractionKit 之外):业务
82
+ * ConfigProvider / 全局 Context 由此进入应用树(message / modal /
83
+ * overlay 均消费其上下文)。皮肤主题等运行时切换场景经此注入。
84
+ */
85
+ providers?: ComponentType<{
86
+ children?: ReactNode;
87
+ }>;
88
+ /** admin 布局头部右侧插槽(透传 AdminLayout headerExtra) */
89
+ headerExtra?: ReactNode;
90
+ /** 认证令牌:注入 DSL 资源请求与页面 HTTP 出口(Authorization: Bearer) */
91
+ authTokenProvider?: AuthTokenProvider;
92
+ /** 当前语言代码(优先级高于 bootstrap.locale 与浏览器语言) */
93
+ locale?: string;
94
+ /** 回退语言代码(缺省 'zh-CN') */
95
+ defaultLocale?: string;
96
+ /** 翻译消息表(优先级高于 bootstrap.messages) */
97
+ messages?: I18nMessages;
98
+ }
99
+ /**
100
+ * UI kit 预设对象(ui-kit-preset spec):三个槽位的字段类型直接复用
101
+ * PactorApplicationOptions 既有选项的类型(结构一致,天然向第三方 kit 开放)。
102
+ */
103
+ interface UiKit {
104
+ /** 组件注册表工厂(同 options.componentRegistry) */
105
+ componentRegistry?: PactorApplicationOptions['componentRegistry'];
106
+ /** 布局注册表工厂(同 options.layoutRegistry) */
107
+ layoutRegistry?: PactorApplicationOptions['layoutRegistry'];
108
+ /** 交互层组件对(同 options.interactionKit) */
109
+ interactionKit?: PactorApplicationOptions['interactionKit'];
110
+ }
111
+ /**
112
+ * bootstrap 会话(设计决策 D1/D2):启动编排的产物,
113
+ * React 组合层据以渲染布局、菜单与动态路由。
114
+ */
115
+ interface PactorAppSession {
116
+ /** 原始 bootstrap 资源 */
117
+ bootstrap: BootstrapResource;
118
+ /** 菜单注册表(bootstrap.menus,缺省 []) */
119
+ menuRegistry: MenuRegistry;
120
+ /** 解析后的布局类型 */
121
+ layoutType: string;
122
+ /** 布局区域开关(来自 bootstrap.layout,缺省交给布局组件自身缺省) */
123
+ layoutConfig: AdminLayoutConfig;
124
+ /** 品牌区 */
125
+ brand: {
126
+ title: string;
127
+ logo?: ReactNode;
128
+ };
129
+ /** 当前用户(注入页面运行时 user 作用域) */
130
+ user: Record<string, unknown>;
131
+ /** 应用信息({ id: appId, ...bootstrap.app },注入 app 作用域) */
132
+ app: Record<string, unknown>;
133
+ /** 当前语言代码 */
134
+ locale: string;
135
+ /** 回退语言代码 */
136
+ defaultLocale: string;
137
+ /** 翻译消息表 */
138
+ messages: I18nMessages;
139
+ }
140
+ /** 应用实例(设计决策 D4):mount/unmount 与扩展注册 API */
141
+ interface PactorApplication {
142
+ readonly appId: string;
143
+ /** 以 createRoot 渲染到 selector 匹配的元素;重复 mount 先 unmount */
144
+ mount(selector: string): void;
145
+ /** 卸载根(未挂载时 no-op) */
146
+ unmount(): void;
147
+ /** 注册业务组件到应用级共享 registry(同名覆盖;新创建/重建的页面即可用) */
148
+ registerComponent(name: string, component: unknown): void;
149
+ /** 注册业务动作(同名覆盖) */
150
+ registerAction(name: string, handler: ActionHandler): void;
151
+ /** 注册业务服务(同名覆盖) */
152
+ registerService(name: string, handler: ServiceHandler): void;
153
+ /** 注册业务能力(同名覆盖) */
154
+ registerCapability(name: string, capability: unknown): void;
155
+ /** 运行时切换语言:更新应用级 i18n 配置并触发页面重建 */
156
+ setLocale(locale: string, messages?: I18nMessages): void;
157
+ }
158
+ /**
159
+ * 内部句柄:Application 组件经 props 访问应用级单例与工厂。
160
+ * 不作为一站式 API 使用。
161
+ */
162
+ interface PactorApplicationHandle {
163
+ readonly appId: string;
164
+ readonly overlayManager: OverlayManager;
165
+ readonly uiBridge: UiBridge;
166
+ readonly permissionStore: PermissionStore;
167
+ readonly layoutRegistry: LayoutRegistry;
168
+ /** 交互层 UI kit(Provider / OverlayHost 组件对,缺省 shadcn 版) */
169
+ readonly interactionKit: {
170
+ Provider: ComponentType<InteractionProviderProps>;
171
+ OverlayHost: ComponentType<OverlayHostProps>;
172
+ };
173
+ readonly routerOptions: PactorRouterOptions;
174
+ /** 应用级包装组件(Router 之内、InteractionKit 之外;缺省不包装) */
175
+ readonly providers?: ComponentType<{
176
+ children?: ReactNode;
177
+ }>;
178
+ /** admin 布局头部右侧插槽(透传 AdminLayout headerExtra) */
179
+ readonly headerExtra?: ReactNode;
180
+ /** react-router 桥接绑定(RouterBridgeSync 挂载后委托到真实路由) */
181
+ readonly navigation: ReactRouterBinding;
182
+ /** 启动编排:加载 bootstrap 并组装会话(失败 reject,由组合层渲染重试页) */
183
+ loadSession(): Promise<PactorAppSession>;
184
+ /** 页面运行时工厂(设计决策 D2):注入共享 registries / adapters / route / user / app */
185
+ createPageRuntime(pageDsl: PageDsl, route: RouteContext): PageRuntime;
186
+ /** OverlayHost 的 page overlay 页面加载(loader.loadPage → PageDsl) */
187
+ resolvePage(pageId: string): Promise<PageDsl>;
188
+ }
189
+ /**
190
+ * react-router 桥接绑定(NavigationBridge 实现):
191
+ * RouterBridgeSync 挂载时绑定真实 react-router 桥接并同步初始 location,
192
+ * 之后每次 location 变化经 sync 通知订阅者(AdminLayout 页签/选中态、
193
+ * DSL navigate 动作均走此桥)。
194
+ */
195
+ declare class ReactRouterBinding implements NavigationBridge {
196
+ private delegate?;
197
+ private location;
198
+ private readonly listeners;
199
+ /** 绑定真实桥接与初始 location(RouterBridgeSync 挂载时调用) */
200
+ bind(delegate: NavigationBridge, initial: NavigationLocation): void;
201
+ /** location 变化同步并通知订阅者 */
202
+ sync(location: NavigationLocation): void;
203
+ getLocation(): NavigationLocation;
204
+ push(to: string): void;
205
+ replace(to: string): void;
206
+ subscribe(listener: NavigationListener): () => void;
207
+ }
208
+ /**
209
+ * 创建 Pactor 应用(设计文档第 86–88 节,决策 D1–D4):
210
+ *
211
+ * ```ts
212
+ * createPactorApplication({ appId: 'risk-admin', api: { baseURL: '/api/runtime' } })
213
+ * .mount('#root');
214
+ * ```
215
+ *
216
+ * - loader:options.loader 优先,否则按 api.baseURL(默认 '/api/runtime')
217
+ * 创建 HttpDslResourceLoader,authTokenProvider 注入 Authorization 头;
218
+ * - 应用级共享 registries:内置组件 + 交互动作(应用级 OverlayManager /
219
+ * UiBridge 单例)+ navigate 动作 + options 扩展,全部被页面运行时共享;
220
+ * - bootstrap 在 mount 后由组合层执行(失败渲染含重试的启动错误页);
221
+ * - 运行期 registerComponent/Action/Service/Capability 写入共享 registry,
222
+ * 新创建/重建的页面即可用(当前已创建页面下次重建后生效)。
223
+ */
224
+ declare function createPactorApplication(options: PactorApplicationOptions): PactorApplication;
225
+
226
+ /** Application props:app 为 createPactorApplication 的内部句柄 */
227
+ interface ApplicationProps {
228
+ app: PactorApplicationHandle;
229
+ }
230
+ /**
231
+ * Application(设计决策 D3):bootstrap 状态机 + React 组合。
232
+ *
233
+ * mount 后依次:加载 bootstrap(loading 态)→ 失败渲染含重试的启动错误页 →
234
+ * 成功渲染组合:Router → RouterBridgeSync → providers(可选应用级包装)→
235
+ * interactionKit.Provider → 布局(resolveLayout)→
236
+ * Routes path="*" → DynamicDslRoute(404/403)。
237
+ */
238
+ declare function Application({ app }: ApplicationProps): react.JSX.Element;
239
+
240
+ /** DslPageLoader props */
241
+ interface DslPageLoaderProps {
242
+ app: PactorApplicationHandle;
243
+ pageId: string;
244
+ route: RouteContext;
245
+ }
246
+ /**
247
+ * DslPageLoader(决策 D3):pageId → loadPage → createPageRuntime →
248
+ * PageRuntimeView。
249
+ *
250
+ * - 组件以 pageId + route.params/query 为 key(见 Application),
251
+ * key 变化即整体重建:旧运行时 destroy,新页面重新加载(V1 无 keepAlive);
252
+ * - 加载中渲染 loading 态;加载/校验失败渲染含重试的受控错误页;
253
+ * - PageRuntimeView 经 PageErrorBoundary 包裹,渲染异常不白屏;
254
+ * - OverlayHost(app.interactionKit 所选实现,缺省 shadcn 版)作为
255
+ * PageRuntimeView children(共享当前页面 Renderer 上下文;page overlay
256
+ * 经 resolvePage 接 loader,子运行时共享应用级 registries——由
257
+ * interaction host 内部实现)。
258
+ */
259
+ declare function DslPageLoader({ app, pageId, route }: DslPageLoaderProps): react.JSX.Element;
260
+
261
+ interface PageErrorBoundaryProps {
262
+ children?: ReactNode;
263
+ }
264
+ interface PageErrorBoundaryState {
265
+ error: Error | null;
266
+ }
267
+ /**
268
+ * PageErrorBoundary(决策 D3):捕获页面 DSL 渲染期异常,
269
+ * 显示受控错误页(可重试重新渲染),应用外壳不崩溃、不白屏。
270
+ */
271
+ declare class PageErrorBoundary extends Component<PageErrorBoundaryProps, PageErrorBoundaryState> {
272
+ state: PageErrorBoundaryState;
273
+ static getDerivedStateFromError(error: Error): PageErrorBoundaryState;
274
+ componentDidCatch(error: Error, info: ErrorInfo): void;
275
+ render(): ReactNode;
276
+ }
277
+
278
+ export { Application, type ApplicationProps, type AuthTokenProvider, DslPageLoader, type DslPageLoaderProps, type PactorAppSession, type PactorApplication, type PactorApplicationHandle, type PactorApplicationOptions, type PactorRouterOptions, PageErrorBoundary, ReactRouterBinding, type UiKit, createPactorApplication };