@proteus-vue/devtools 0.1.0 → 0.1.1-beta.3

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 (3) hide show
  1. package/LICENSE +218 -0
  2. package/dist/panel.js +611 -121
  3. package/package.json +8 -8
package/dist/panel.js CHANGED
@@ -2640,9 +2640,9 @@ var ProteusDevtools = (() => {
2640
2640
  fgControls.appendChild(recBtn);
2641
2641
  function restoreAt(index) {
2642
2642
  const out = [];
2643
- for (const [id, history] of storePatchHistory) {
2643
+ for (const [id, history2] of storePatchHistory) {
2644
2644
  let state = null;
2645
- for (const h of history) {
2645
+ for (const h of history2) {
2646
2646
  if (h.stepIndex <= index) state = h.state;
2647
2647
  else break;
2648
2648
  }
@@ -3437,7 +3437,7 @@ ${summary}
3437
3437
  };
3438
3438
  }
3439
3439
 
3440
- // ../render-backend/dist/index.js
3440
+ // ../render-backend/src/headless.ts
3441
3441
  function toPlainTree(root) {
3442
3442
  return {
3443
3443
  id: root.id,
@@ -3463,8 +3463,8 @@ ${summary}
3463
3463
  "ui.input": "input",
3464
3464
  "ui.list": "list",
3465
3465
  "ui.nav": "nav",
3466
- "capability.scan-qr": "scan-qr",
3467
- "capability.pick-photo": "pick-photo",
3466
+ "capability.qr-code": "scan-qr",
3467
+ "capability.camera": "pick-photo",
3468
3468
  "capability.location": "location",
3469
3469
  // ★G-32 B1:新增 implemented 语义(与 component-ir SEMANTIC_BACKEND_MAP headless 列同源)
3470
3470
  "layout.inline": "inline",
@@ -3503,7 +3503,18 @@ ${summary}
3503
3503
  "engineering.router-link": "router-link",
3504
3504
  // ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
3505
3505
  "engineering.transition": "transition",
3506
- "engineering.animate": "animate"
3506
+ "engineering.share-element": "share-element",
3507
+ "engineering.animate": "animate",
3508
+ // ★能力颗粒度对齐 C2
3509
+ "ui.progress": "progress",
3510
+ "ui.label": "label",
3511
+ "shell.page-container": "page-container",
3512
+ "ui.selection": "selection",
3513
+ "shell.keyboard-accessory": "keyboard-accessory",
3514
+ "ui.camera": "camera",
3515
+ "shell.webview": "webview",
3516
+ "shell.ad": "ad",
3517
+ "ui.map": "map"
3507
3518
  };
3508
3519
  var HEADLESS_CAPABILITIES = {
3509
3520
  layout: "none",
@@ -3582,6 +3593,8 @@ ${summary}
3582
3593
  }
3583
3594
  };
3584
3595
  }
3596
+
3597
+ // ../render-backend/src/flutter.ts
3585
3598
  var WIDGET_MAP = {
3586
3599
  view: "Container",
3587
3600
  text: "Text",
@@ -3615,8 +3628,8 @@ ${summary}
3615
3628
  "ui.input": "TextField",
3616
3629
  "ui.list": "ListView",
3617
3630
  "ui.nav": "Navigator",
3618
- "capability.scan-qr": "scanQR",
3619
- "capability.pick-photo": "pickPhoto",
3631
+ "capability.qr-code": "scanQR",
3632
+ "capability.camera": "pickPhoto",
3620
3633
  "capability.location": "getLocation",
3621
3634
  // ★G-32 B1:新增 implemented 语义
3622
3635
  "layout.inline": "InlineSpan",
@@ -3655,7 +3668,19 @@ ${summary}
3655
3668
  "engineering.router-link": "TextButton",
3656
3669
  // ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
3657
3670
  "engineering.transition": "AnimatedOpacity",
3658
- "engineering.animate": "AnimationController"
3671
+ "engineering.share-element": "Hero",
3672
+ // Flutter Hero 即共享元素
3673
+ "engineering.animate": "AnimationController",
3674
+ // ★能力颗粒度对齐 C2
3675
+ "ui.progress": "LinearProgressIndicator",
3676
+ "ui.label": "Text.label",
3677
+ "shell.page-container": "showModalBottomSheet",
3678
+ "ui.selection": "SelectableText",
3679
+ "shell.keyboard-accessory": "KeyboardAccessoryView",
3680
+ "ui.camera": "CameraPreview",
3681
+ "shell.webview": "WebView",
3682
+ "shell.ad": "AdWidget",
3683
+ "ui.map": "GoogleMap"
3659
3684
  };
3660
3685
  function mapWidgetType(type) {
3661
3686
  return WIDGET_MAP[type] ?? type;
@@ -3749,13 +3774,15 @@ ${summary}
3749
3774
  }
3750
3775
  };
3751
3776
  }
3777
+
3778
+ // ../component-ir/src/schema.ts
3752
3779
  var TAG_SEMANTIC_MAP = {
3753
3780
  // G-32 ① 布局原语(12)
3754
3781
  "p-box": "layout.box",
3755
3782
  "p-inline": "layout.inline",
3756
3783
  "p-stack": "layout.stack",
3757
3784
  "p-grid": "layout.grid",
3758
- "p-fluid": "layout.fluid",
3785
+ // ★Skyline 线收口:'p-fluid' 移除——layout.fluid 是 v-p-fluid **指令**语义(非标签),登记为标签会让 <p-fluid> 静默不渲染
3759
3786
  "p-adaptive": "layout.adaptive",
3760
3787
  "p-fit": "layout.fit",
3761
3788
  "p-spacer": "layout.spacer",
@@ -3804,11 +3831,17 @@ ${summary}
3804
3831
  // ★E18 组件形态(p- 前缀产 C-IR)
3805
3832
  "router-link": "engineering.router-link",
3806
3833
  // ★兼容别名(Vue Router 风格 <router-link> 标签;非 catalog 条目——p-view 先例 G-31 B4)
3834
+ "p-share-element": "engineering.share-element",
3835
+ // ★批次 8:页面间共享元素转场(≠ p-transition 页内过渡)
3807
3836
  "p-transition": "engineering.transition",
3808
3837
  "p-animate": "engineering.animate",
3809
3838
  // G-31 能力入口
3810
- "p-scan-qr": "capability.scan-qr",
3811
- "p-pick-photo": "capability.pick-photo",
3839
+ // ★2026-09-18 语义去重:原 capability.scan-qr / capability.pick-photo 是**重复名**——
3840
+ // 两个组件的实现分别调用 useQRCode() / useCamera(),对应真实能力即 C42 capability.qr-code /
3841
+ // C1 capability.camera(其 mpEquiv 与 hook 完全一致)。故**退役重复名、重指向真实能力**,
3842
+ // 并按 E8 双形态在两行补 tag(而非新建语义)。
3843
+ "p-scan-qr": "capability.qr-code",
3844
+ "p-pick-photo": "capability.camera",
3812
3845
  "p-location": "capability.location",
3813
3846
  // ★G-31 B4 现有组件对齐(src/components 实际标签 → L1 语义)
3814
3847
  "p-view": "layout.box",
@@ -3817,37 +3850,77 @@ ${summary}
3817
3850
  "p-nav-bar": "ui.nav",
3818
3851
  // ★G-31 B4 Fluid 体系扩展语义(有明确系统原生对应——原则 #10.8)
3819
3852
  "p-safe": "layout.safe",
3820
- "p-sidebar": "layout.sidebar"
3853
+ "p-sidebar": "layout.sidebar",
3854
+ // ★#405 语义登记批:剩余 10 组件全量入图(EXTRA_KIND 文档兑底退役)——
3855
+ // 9 个新语义(catalog planned L2:语义层待多端映射)+ p-scroll-view 复用 layout.scroll
3856
+ // (★2026-09-18 修正原文「p-view 先例」:显式 multi-tag 别名先例是上一行的 `router-link`
3857
+ // ——同一语义由两个标签提供;本条与 p-view 是并列的别名情形,非「先例」关系)
3858
+ "p-aspect": "layout.aspect",
3859
+ "p-zone": "layout.zone",
3860
+ "p-loading": "ui.loading",
3861
+ "p-scale": "ui.scale",
3862
+ "p-skeleton": "ui.skeleton",
3863
+ "p-mask": "shell.mask",
3864
+ "p-popup": "shell.popup",
3865
+ "p-toolbar": "shell.toolbar",
3866
+ "p-scroll-view": "layout.scroll",
3867
+ // 滚动容器 = p-scroll 角色
3868
+ "p-error-boundary": "engineering.error-boundary",
3869
+ // E8 原语组件形态(useErrorBoundary API 形态并存)
3870
+ // ★能力颗粒度对齐 C2:新增真实组件
3871
+ "p-progress": "ui.progress",
3872
+ "p-label": "ui.label",
3873
+ "p-page-container": "shell.page-container",
3874
+ // ★权威标尺批 H:选区 / 键盘工具栏
3875
+ "p-selection": "ui.selection",
3876
+ "p-keyboard-accessory": "shell.keyboard-accessory",
3877
+ // ★权威标尺批 I:相机
3878
+ "p-camera": "ui.camera",
3879
+ // ★权威标尺批 J:内嵌网页 / 广告位
3880
+ "p-webview": "shell.webview",
3881
+ "p-ad": "shell.ad",
3882
+ "p-map": "ui.map"
3821
3883
  };
3884
+
3885
+ // ../component-ir/src/to-ir.ts
3822
3886
  function toComponentIR(tag, props = {}, children = []) {
3823
3887
  if (!tag.startsWith("p-")) return null;
3824
3888
  const semantic = TAG_SEMANTIC_MAP[tag];
3825
3889
  if (!semantic) return null;
3826
3890
  return { tag, semantic, props: { ...props }, children };
3827
3891
  }
3892
+
3893
+ // ../component-ir/src/primitives.ts
3828
3894
  var LAYOUT = [
3829
- { id: "L1", kind: "layout", semantic: "layout.box", tag: "p-box", props: ["aspectRatio", "overflow"], mpEquiv: "<view>", tier: "L1", status: "implemented" },
3895
+ { id: "L1", kind: "layout", semantic: "layout.box", tag: "p-box", props: ["aspectRatio", "overflow", "hoverClass", "hoverStopPropagation", "hoverStartTime", "hoverStayTime"], mpEquiv: "<view>", tier: "L1", status: "implemented" },
3830
3896
  { id: "L2", kind: "layout", semantic: "layout.inline", tag: "p-inline", props: ["wrap"], mpEquiv: "<text> \u5185\u8054", tier: "L1", status: "implemented" },
3831
3897
  { id: "L3", kind: "layout", semantic: "layout.stack", tag: "p-stack", props: ["direction", "gap", "align", "wrap", "snap", "loop"], mpEquiv: "flex + scroll-view + swiper", tier: "L1", status: "implemented" },
3832
3898
  { id: "L4", kind: "layout", semantic: "layout.grid", tag: "p-grid", props: ["minColWidth", "maxCols", "gap", "autoFlow"], mpEquiv: "<view> + CSS Grid", tier: "L1", status: "implemented" },
3833
- { id: "L5", kind: "layout", semantic: "layout.fluid", tag: "p-fluid", props: ["breakpoints", "minItemWidth"], mpEquiv: "\u54CD\u5E94\u5F0F CSS", tier: "L1", status: "implemented" },
3899
+ // ★Skyline 线收口:layout.fluid v-p-fluid **指令**承载(非标签)——无 tag,避免 <p-fluid> 幽灵
3900
+ { id: "L5", kind: "layout", semantic: "layout.fluid", props: ["breakpoints", "minItemWidth"], mpEquiv: "\u54CD\u5E94\u5F0F CSS\uFF08v-p-fluid \u6307\u4EE4\uFF09", tier: "L1", status: "implemented" },
3834
3901
  { id: "L6", kind: "layout", semantic: "layout.adaptive", tag: "p-adaptive", props: ["sheet", "dialog", "popover", "drawer"], mpEquiv: "\u65E0\uFF08\u5BB9\u5668\u5BBD\u5EA6\u8BED\u4E49\u65AD\u70B9\uFF09", tier: "L1", status: "implemented" },
3835
3902
  { id: "L7", kind: "layout", semantic: "layout.fit", tag: "p-fit", props: ["mode"], mpEquiv: "fit-content", tier: "L1", status: "implemented" },
3836
3903
  { id: "L8", kind: "layout", semantic: "layout.spacer", tag: "p-spacer", props: ["grow", "shrink"], mpEquiv: "flex:1", tier: "L1", status: "implemented" },
3837
3904
  { id: "L9", kind: "layout", semantic: "layout.divider", tag: "p-divider", props: ["orientation", "inset"], mpEquiv: "<view> + border", tier: "L1", status: "implemented" },
3838
- { id: "L10", kind: "layout", semantic: "layout.scroll", tag: "p-scroll", props: ["axis", "paging", "refresh", "indicator"], mpEquiv: "<scroll-view>", tier: "L1", status: "implemented" },
3905
+ { id: "L10", kind: "layout", semantic: "layout.scroll", tag: "p-scroll", props: ["axis", "paging", "refresh", "indicator", "upperThreshold", "lowerThreshold", "scrollIntoView", "scrollWithAnimation", "enableBackToTop", "enablePassive", "refresherEnabled", "refresherTriggered", "enhanced", "bounces", "scrollAnchoring", "padding"], mpEquiv: "<scroll-view>", tier: "L1", status: "implemented" },
3839
3906
  { id: "L11", kind: "layout", semantic: "layout.virtual-list", tag: "p-virtual-list", props: ["itemSize", "buffer", "direction"], mpEquiv: "<scroll-view> + \u624B\u52A8\u56DE\u6536", tier: "L1", status: "implemented" },
3840
- { id: "L12", kind: "layout", semantic: "layout.masonry", tag: "p-masonry", props: ["colCount", "gap"], mpEquiv: "\u7B2C\u4E09\u65B9\u7011\u5E03\u6D41", tier: "L1", status: "implemented" }
3907
+ { id: "L12", kind: "layout", semantic: "layout.masonry", tag: "p-masonry", props: ["colCount", "gap"], mpEquiv: "\u7B2C\u4E09\u65B9\u7011\u5E03\u6D41", tier: "L1", status: "implemented" },
3908
+ // ★#405 语义登记批:Fluid 体系剩余组件(语义层待多端映射 → planned L2——G-31.4 不足 3 端降级)
3909
+ { id: "L13", kind: "layout", semantic: "layout.aspect", tag: "p-aspect", props: ["ratio", "maxWidth"], mpEquiv: "\u65E0\uFF08\u7EB5\u6A2A\u6BD4\u5BB9\u5668\uFF09", tier: "L2", status: "planned" },
3910
+ { id: "L14", kind: "layout", semantic: "layout.zone", tag: "p-zone", props: ["designWidth"], mpEquiv: "\u65E0\uFF08\u5BB9\u5668\u65AD\u70B9\u5206\u533A\uFF09", tier: "L2", status: "planned" },
3911
+ // ★批次 7(2026-09-18)未登记组件补登记:安全区(刘海/折叠屏/降级)+ 侧边导航容器
3912
+ { id: "L15", kind: "layout", semantic: "layout.safe", tag: "p-safe", props: ["area", "fold", "fallback"], mpEquiv: "\u65E0\uFF08\u5B89\u5168\u533A\u8BED\u4E49\u5BB9\u5668\uFF09", tier: "L1", status: "implemented" },
3913
+ { id: "L16", kind: "layout", semantic: "layout.sidebar", tag: "p-sidebar", props: ["minSidebarWidth", "navWidth", "designWidth", "toggleLabel"], mpEquiv: "\u65E0\uFF08\u5BB9\u5668\u65AD\u70B9\u4FA7\u680F\uFF09", tier: "L1", status: "implemented" }
3841
3914
  ];
3842
3915
  var UI = [
3843
- { id: "U1", kind: "ui", semantic: "ui.text", tag: "p-text", props: ["content", "selectable", "truncate", "align"], mpEquiv: "<text>", tier: "L1", status: "implemented" },
3916
+ { id: "U1", kind: "ui", semantic: "ui.text", tag: "p-text", props: ["content", "selectable", "truncate", "align", "userSelect", "overflow", "maxLines", "selectOnGesture", "space", "decode"], mpEquiv: "<text>", tier: "L1", status: "implemented" },
3844
3917
  { id: "U2", kind: "ui", semantic: "ui.heading", tag: "p-heading", props: ["level"], mpEquiv: "<h1>-<h6>", tier: "L1", status: "implemented" },
3845
- { id: "U3", kind: "ui", semantic: "ui.rich-text", tag: "p-rich-text", props: ["source", "schema"], mpEquiv: "<rich-text>", tier: "L1", status: "implemented" },
3846
- { id: "U4", kind: "ui", semantic: "ui.icon", tag: "p-icon", props: ["name", "size", "color", "spin"], mpEquiv: "<icon>", tier: "L1", status: "implemented" },
3847
- { id: "U5", kind: "ui", semantic: "ui.image", tag: "p-image", props: ["src", "fit", "placeholder", "lazy"], mpEquiv: "<image>", tier: "L1", status: "implemented" },
3918
+ { id: "U3", kind: "ui", semantic: "ui.rich-text", tag: "p-rich-text", props: ["nodes", "space", "userSelect", "mode", "source"], mpEquiv: "<rich-text>", tier: "L1", status: "implemented" },
3919
+ { id: "U4", kind: "ui", semantic: "ui.icon", tag: "p-icon", props: ["name", "type", "size", "color", "spin"], mpEquiv: "<icon>", tier: "L1", status: "implemented" },
3920
+ { id: "U5", kind: "ui", semantic: "ui.image", tag: "p-image", props: ["src", "fit", "placeholder", "lazy", "showMenuByLongpress", "fadeIn", "preload", "webp", "referrerPolicy"], mpEquiv: "<image>", tier: "L1", status: "implemented" },
3848
3921
  { id: "U6", kind: "ui", semantic: "ui.avatar", tag: "p-avatar", props: ["src", "shape", "size", "fallback"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
3849
- { id: "U7", kind: "ui", semantic: "ui.media", tag: "p-media", props: ["kind", "controls", "autoplay", "poster", "loop", "muted", "pictureInPicture"], mpEquiv: "<video>+<audio>", tier: "L1", status: "implemented" },
3850
- { id: "U8", kind: "ui", semantic: "ui.canvas", tag: "p-canvas", props: ["engine", "resolution"], mpEquiv: "<canvas>", tier: "L1", status: "implemented" },
3922
+ { id: "U7", kind: "ui", semantic: "ui.media", tag: "p-media", props: ["kind", "src", "duration", "controls", "autoplay", "loop", "muted", "initialTime", "poster", "objectFit", "title", "playBtnPosition", "direction", "showProgress", "showFullscreenBtn", "showPlayBtn", "showCenterPlayBtn", "showMuteBtn", "showBottomProgress", "enableProgressGesture", "enablePlayGesture", "pageGesture", "vslideGesture", "vslideGestureInFullscreen", "autoPauseIfNavigate", "autoPauseIfOpenNative", "danmuList", "danmuBtn", "enableDanmu", "pictureInPicture"], mpEquiv: "<video>+<audio>", tier: "L1", status: "implemented" },
3923
+ { id: "U8", kind: "ui", semantic: "ui.canvas", tag: "p-canvas", props: ["engine", "canvasId", "disableScroll", "resolution"], mpEquiv: "<canvas>", tier: "L1", status: "implemented" },
3851
3924
  { id: "U9", kind: "ui", semantic: "ui.svg", tag: "p-svg", props: ["path", "viewbox"], mpEquiv: "\u65E0", tier: "L1", status: "implemented" },
3852
3925
  { id: "U10", kind: "ui", semantic: "ui.input", tag: "p-input", props: ["type", "mask", "validation", "clearable"], mpEquiv: "<input>", tier: "L1", status: "implemented" },
3853
3926
  { id: "U11", kind: "ui", semantic: "ui.textarea", tag: "p-textarea", props: ["autosize", "maxLength", "count"], mpEquiv: "<textarea>", tier: "L1", status: "implemented" },
@@ -3856,12 +3929,32 @@ ${summary}
3856
3929
  { id: "U14", kind: "ui", semantic: "ui.radio", tag: "p-radio", props: ["value", "group"], mpEquiv: "<radio>", tier: "L1", status: "implemented" },
3857
3930
  { id: "U15", kind: "ui", semantic: "ui.switch", tag: "p-switch", props: ["checked", "loading"], mpEquiv: "<switch>", tier: "L1", status: "implemented" },
3858
3931
  { id: "U16", kind: "ui", semantic: "ui.slider", tag: "p-slider", props: ["min", "max", "step", "range"], mpEquiv: "<slider>", tier: "L1", status: "implemented" },
3859
- { id: "U17", kind: "ui", semantic: "ui.picker", tag: "p-picker", props: ["mode", "start", "end"], mpEquiv: "<picker>", tier: "L1", status: "implemented" },
3860
- { id: "U18", kind: "ui", semantic: "ui.form", tag: "p-form", props: ["model", "rules", "layout"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" }
3932
+ { id: "U17", kind: "ui", semantic: "ui.picker", tag: "p-picker", props: ["mode", "start", "end", "indicatorStyle", "indicatorClass", "maskClass", "maskStyle", "immediateChange"], mpEquiv: "<picker>", tier: "L1", status: "implemented" },
3933
+ { id: "U18", kind: "ui", semantic: "ui.form", tag: "p-form", props: ["model", "rules", "layout"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
3934
+ // ★#405 语义登记批:反馈/状态类组件
3935
+ { id: "U19", kind: "ui", semantic: "ui.loading", tag: "p-loading", props: ["size", "text"], mpEquiv: "wx.showLoading \u90E8\u5206", tier: "L2", status: "planned" },
3936
+ { id: "U20", kind: "ui", semantic: "ui.scale", tag: "p-scale", props: ["level", "density", "baseSize"], mpEquiv: "\u65E0\uFF08\u65E0\u969C\u788D\u6863\u4F4D\uFF09", tier: "L2", status: "planned" },
3937
+ { id: "U21", kind: "ui", semantic: "ui.skeleton", tag: "p-skeleton", props: ["rows", "avatar", "animated"], mpEquiv: "\u65E0", tier: "L2", status: "planned" },
3938
+ // ★能力颗粒度对齐 C2:进度条 / 表单标签
3939
+ { id: "U22", kind: "ui", semantic: "ui.progress", tag: "p-progress", props: ["percent", "status", "type", "strokeWidth", "showInfo"], mpEquiv: "<progress>", tier: "L1", status: "implemented" },
3940
+ { id: "U23", kind: "ui", semantic: "ui.label", tag: "p-label", props: ["for", "block"], mpEquiv: "<label>", tier: "L1", status: "implemented" },
3941
+ // ★权威标尺批 H:局部文本选区
3942
+ { id: "U24", kind: "ui", semantic: "ui.selection", tag: "p-selection", props: ["disableContextMenu", "selectable"], mpEquiv: "<selection>", tier: "L1", status: "implemented" },
3943
+ // ★权威标尺批 I:相机
3944
+ { id: "U25", kind: "ui", semantic: "ui.camera", tag: "p-camera", props: ["mode", "resolution", "devicePosition", "flash", "frameSize", "aspectRatio"], mpEquiv: "<camera>", tier: "L1", status: "implemented" },
3945
+ // ★权威标尺批 J:地图
3946
+ { id: "U26", kind: "ui", semantic: "ui.map", tag: "p-map", props: ["latitude", "longitude", "scale", "minScale", "maxScale", "markers", "polyline", "circles", "polygons", "includePoints", "showLocation", "layerStyle", "rotate", "skew", "showCompass", "showScale", "enableZoom", "enableScroll", "enableRotate", "enableSatellite", "enableTraffic", "enablePoi", "enableBuilding", "enableOverlooking", "setting"], mpEquiv: "<map>", tier: "L1", status: "implemented" },
3947
+ // ★批次 7(2026-09-18)未登记组件补登记:这 3 个组件此前**只存在于 TAG_SEMANTIC_MAP**(编译器能解析、
3948
+ // 组件能渲染),但不在 SSOT catalog → C1 不变量(catalog tag ↔ TAG_SEMANTIC_MAP 双向)单向成立、
3949
+ // catalog 查询类 API(primitiveByTag / componentPrimitives)查不到它们。
3950
+ // ★p-button 尤其反讽:它是**端对齐全流程的参考实现**(21/21、SOP v2 范式),却不在语义清单里。
3951
+ { id: "U27", kind: "ui", semantic: "ui.button", tag: "p-button", props: ["disabled", "loading", "throttle", "size", "type", "plain", "formType", "openType", "hoverClass", "theme", "hoverStopPropagation", "hoverStartTime", "hoverStayTime", "lang", "sessionFrom", "sendMessageTitle", "sendMessagePath", "sendMessageImg", "appParameter", "showMessageCard", "phoneNumberNoQuotaToast", "needShowEntrance", "entrancePath"], mpEquiv: "<button>", tier: "L1", status: "implemented" },
3952
+ { id: "U28", kind: "ui", semantic: "ui.list", tag: "p-list-view", props: ["items", "itemHeight", "height", "bufferSize", "virtual", "lazy", "padding"], mpEquiv: "<list-view>\uFF08\u865A\u62DF\u6EDA\u52A8\uFF09", tier: "L1", status: "implemented" },
3953
+ { id: "U29", kind: "ui", semantic: "ui.nav", tag: "p-nav-bar", props: ["title", "back", "fixed", "loading", "frontColor", "backgroundColor", "colorAnimationDuration", "colorAnimationTimingFunc"], mpEquiv: "<navigation-bar>\uFF08\u81EA\u7ED8\uFF09", tier: "L1", status: "implemented" }
3861
3954
  ];
3862
3955
  var SHELL = [
3863
3956
  { id: "S1", kind: "shell", semantic: "shell.page", tag: "p-page", props: ["title", "statusBar", "pullRefresh"], mpEquiv: "<page>", tier: "L1", status: "implemented" },
3864
- { id: "S2", kind: "shell", semantic: "shell.nav", tag: "p-nav", props: ["title", "transparent"], mpEquiv: "\u5BFC\u822A\u680F\u914D\u7F6E", tier: "L1", status: "implemented" },
3957
+ { id: "S2", kind: "shell", semantic: "shell.nav", tag: "p-nav", props: ["title", "transparent", "loading", "frontColor", "backgroundColor", "colorAnimationDuration", "colorAnimationTimingFunc"], mpEquiv: "\u5BFC\u822A\u680F\u914D\u7F6E", tier: "L1", status: "implemented" },
3865
3958
  { id: "S3", kind: "shell", semantic: "shell.tabbar", tag: "p-tabbar", props: ["tabs", "active", "badge"], mpEquiv: "<tabbar>", tier: "L1", status: "implemented" },
3866
3959
  { id: "S4", kind: "shell", semantic: "shell.segment", tag: "p-segment", props: ["options", "active"], mpEquiv: "<segment>", tier: "L1", status: "implemented" },
3867
3960
  { id: "S5", kind: "shell", semantic: "shell.drawer", tag: "p-drawer", props: ["side", "width", "overlay"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
@@ -3869,18 +3962,33 @@ ${summary}
3869
3962
  { id: "S7", kind: "shell", semantic: "shell.popover", tag: "p-popover", props: ["trigger", "placement"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
3870
3963
  { id: "S8", kind: "shell", semantic: "shell.toast", tag: "p-toast", props: ["message", "duration", "type"], mpEquiv: "wx.showToast", tier: "L1", status: "planned" },
3871
3964
  { id: "S9", kind: "shell", semantic: "shell.action-sheet", tag: "p-action-sheet", props: ["actions", "cancel"], mpEquiv: "wx.showActionSheet", tier: "L1", status: "implemented" },
3872
- { id: "S10", kind: "shell", semantic: "layout.split", tag: "p-split", props: ["breakpoint", "ratio", "collapse"], mpEquiv: "\u65E0\uFF08\u5206\u680F\u5E03\u5C40\uFF09", tier: "L1", status: "implemented" }
3965
+ { id: "S10", kind: "shell", semantic: "layout.split", tag: "p-split", props: ["breakpoint", "ratio", "collapse"], mpEquiv: "\u65E0\uFF08\u5206\u680F\u5E03\u5C40\uFF09", tier: "L1", status: "implemented" },
3873
3966
  // ★已落地绑定:分栏语义由 layout.split 承载(G-32 文档为 shell.split——机器事实以实现为准)
3967
+ // ★#405 语义登记批:弹层/工具栏组件
3968
+ { id: "S11", kind: "shell", semantic: "shell.mask", tag: "p-mask", props: ["visible", "transparent"], mpEquiv: "\u7EC4\u5408\uFF08\u906E\u7F69\u5C42\uFF09", tier: "L2", status: "planned" },
3969
+ { id: "S12", kind: "shell", semantic: "shell.popup", tag: "p-popup", props: ["position", "round", "overlay"], mpEquiv: "\u7EC4\u5408\uFF08\u5F39\u5C42\uFF09", tier: "L2", status: "planned" },
3970
+ { id: "S13", kind: "shell", semantic: "shell.toolbar", tag: "p-toolbar", props: ["items", "itemWidth", "moreWidth"], mpEquiv: "\u65E0\uFF08\u6EA2\u51FA\u6298\u53E0\uFF09", tier: "L2", status: "planned" },
3971
+ // ★能力颗粒度对齐 C2:页面容器(对齐小程序 <page-container>)
3972
+ { id: "S14", kind: "shell", semantic: "shell.page-container", tag: "p-page-container", props: ["show", "position", "overlay", "closeOnClickOverlay", "duration", "zIndex", "closeOnSlideDown", "overlayStyle", "customStyle"], mpEquiv: "<page-container>", tier: "L1", status: "implemented" },
3973
+ // ★权威标尺批 H:键盘上方工具栏
3974
+ { id: "S15", kind: "shell", semantic: "shell.keyboard-accessory", tag: "p-keyboard-accessory", props: ["visible", "maxHeight", "background"], mpEquiv: "<keyboard-accessory>", tier: "L1", status: "implemented" },
3975
+ // ★权威标尺批 J:内嵌网页 / 广告位
3976
+ { id: "S16", kind: "shell", semantic: "shell.webview", tag: "p-webview", props: ["src", "height", "sandbox"], mpEquiv: "<web-view>", tier: "L1", status: "implemented" },
3977
+ { id: "S17", kind: "shell", semantic: "shell.ad", tag: "p-ad", props: ["unitId", "adIntervals", "adType", "adTheme", "height"], mpEquiv: "<ad>", tier: "L1", status: "implemented" }
3874
3978
  ];
3875
3979
  var GESTURE = [
3876
- { id: "G1", kind: "gesture", semantic: "gesture.tap", api: "v-gesture:tap", props: ["count"], mpEquiv: "bindtap", tier: "L1", status: "planned" },
3877
- { id: "G2", kind: "gesture", semantic: "gesture.longpress", api: "v-gesture:longpress", props: ["duration", "onEnd"], mpEquiv: "bindlongpress", tier: "L1", status: "planned" },
3878
- { id: "G3", kind: "gesture", semantic: "gesture.swipe", api: "v-gesture:swipe", props: ["direction", "threshold"], mpEquiv: "bindswipe", tier: "L1", status: "planned" },
3879
- { id: "G4", kind: "gesture", semantic: "gesture.pan", api: "v-gesture:pan", props: ["axis", "bounds"], mpEquiv: "bindtouchmove", tier: "L1", status: "planned" },
3880
- { id: "G5", kind: "gesture", semantic: "gesture.pinch", api: "v-gesture:pinch", props: ["scale", "onChange"], mpEquiv: "touchstart/move \u7EC4\u5408", tier: "L1", status: "planned" },
3881
- { id: "G6", kind: "gesture", semantic: "gesture.rotate", api: "v-gesture:rotate", props: ["angle"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "planned" },
3882
- { id: "G7", kind: "gesture", semantic: "gesture.press", api: "v-gesture:press", props: ["force"], mpEquiv: "3D Touch", tier: "L1", status: "planned" },
3883
- { id: "G8", kind: "gesture", semantic: "gesture.draggable", tag: "p-draggable", props: ["ghost", "snapToGrid", "onDrop"], mpEquiv: "movable-view", tier: "L1", status: "implemented" },
3980
+ // ★2026-09-18:G1/G2 planned implemented——`v-gesture:tap|longpress` 已双端落地
3981
+ // (编译器新增 `directive/v-gesture` 规则:MP 映射 bindtap/bindlongpress;Web Pointer 识别器)。
3982
+ // ★G3–G7 **保持 planned**:MP 端无事件对等(官方用 worklet 手势处理器<组件>,框架未生成),
3983
+ // mpEquiv 已改为**如实描述**(原值 bindswipe/bindtouchmove/组合/3D Touch 多为不准确表述)。
3984
+ { id: "G1", kind: "gesture", semantic: "gesture.tap", api: "v-gesture:tap", props: ["count"], mpEquiv: "bindtap\uFF08\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u7F16\u8BD1\u5668\u76F4\u6620\u5C04\uFF09", tier: "L1", status: "implemented" },
3985
+ { id: "G2", kind: "gesture", semantic: "gesture.longpress", api: "v-gesture:longpress", props: ["duration", "onEnd"], mpEquiv: "bindlongpress\uFF08\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u7F16\u8BD1\u5668\u76F4\u6620\u5C04\uFF09", tier: "L1", status: "implemented" },
3986
+ { id: "G3", kind: "gesture", semantic: "gesture.swipe", api: "v-gesture:swipe", props: ["direction", "threshold"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u9700 @touchstart/@touchend \u81EA\u884C\u5224\u5B9A\u65B9\u5411", tier: "L1", status: "planned" },
3987
+ { id: "G4", kind: "gesture", semantic: "gesture.pan", api: "v-gesture:pan", props: ["axis", "bounds"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u5B98\u65B9 <pan-gesture-handler>\uFF08worklet\uFF09\u6216 touch \u65CF\u81EA\u884C\u5224\u5B9A", tier: "L1", status: "planned" },
3988
+ { id: "G5", kind: "gesture", semantic: "gesture.pinch", api: "v-gesture:pinch", props: ["scale", "onChange"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u5B98\u65B9 <scale-gesture-handler>\uFF08worklet\uFF09", tier: "L1", status: "planned" },
3989
+ { id: "G6", kind: "gesture", semantic: "gesture.rotate", api: "v-gesture:rotate", props: ["angle"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\uFF08MP \u65E0 rotate \u624B\u52BF\u5904\u7406\u5668\uFF09", tier: "L1", status: "planned" },
3990
+ { id: "G7", kind: "gesture", semantic: "gesture.press", api: "v-gesture:press", props: ["force"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u5B98\u65B9 <force-press-gesture-handler>\uFF08worklet\uFF0C\u9700 3D Touch \u8BBE\u5907\uFF09", tier: "L1", status: "planned" },
3991
+ { id: "G8", kind: "gesture", semantic: "gesture.draggable", tag: "p-draggable", props: ["direction", "inertia", "outOfBounds", "x", "y", "damping", "friction", "disabled", "scaleEnabled", "scaleMin", "scaleMax", "scaleValue", "animation", "scaleArea", "ghost", "snapToGrid", "onDrop"], mpEquiv: "movable-view", tier: "L1", status: "implemented" },
3884
3992
  { id: "G9", kind: "gesture", semantic: "gesture.scrollable", tag: "p-scrollable", props: ["bounce", "refresh", "loadMore"], mpEquiv: "<scroll-view>", tier: "L1", status: "implemented" },
3885
3993
  { id: "G10", kind: "gesture", semantic: "gesture.use-gesture", api: "useGesture()", props: ["recognizers", "simultaneous"], mpEquiv: "\u65E0", tier: "L1", status: "planned" }
3886
3994
  ];
@@ -3889,9 +3997,10 @@ ${summary}
3889
3997
  }
3890
3998
  var CAPABILITY = [
3891
3999
  // 7.1 设备/硬件(15)
3892
- cap("C1", "camera", "useCamera()", "wx.createCameraContext", "Result<Media>"),
4000
+ // ★2026-09-18 双形态(E8 先例):能力入口组件 p-pick-photo 即 useCamera() 的声明式入口
4001
+ { id: "C1", kind: "capability", semantic: "capability.camera", api: "useCamera()", tag: "p-pick-photo", props: ["Result<Media>"], mpEquiv: "wx.createCameraContext", tier: "L1", status: "implemented" },
3893
4002
  cap("C2", "microphone", "useMicrophone()", "RecorderManager", "Result<AudioBuffer>"),
3894
- { id: "C3", kind: "capability", semantic: "capability.location", api: "useLocation()", props: ["Result<Coords>"], mpEquiv: "wx.getLocation", tier: "L1", status: "implemented" },
4003
+ { id: "C3", kind: "capability", semantic: "capability.location", api: "useLocation()", tag: "p-location", props: ["Result<Coords>"], mpEquiv: "wx.getLocation", tier: "L1", status: "implemented" },
3895
4004
  cap("C4", "map", "useMap()", "wx.createMapContext", "MapController"),
3896
4005
  cap("C5", "sensor", "useSensor()", "onAccelerometer/onCompass/onGyroscope", "SensorStream"),
3897
4006
  cap("C6", "vibrate", "useVibrate()", "wx.vibrateShort/Long", "void"),
@@ -3933,7 +4042,8 @@ ${summary}
3933
4042
  cap("C39", "face-id", "useFaceID()", "\u7EC4\u5408", "Result<boolean>"),
3934
4043
  cap("C40", "payment", "usePayment()", "wx.requestPayment", "Result<PayResult>"),
3935
4044
  cap("C41", "login", "useLogin()", "wx.login", "Result<Token>"),
3936
- cap("C42", "qr-code", "useQRCode()", "wx.scanCode + canvas", "Result<string>"),
4045
+ // ★2026-09-18 双形态(E8 先例):能力入口组件 p-scan-qr useQRCode() 的声明式入口
4046
+ { id: "C42", kind: "capability", semantic: "capability.qr-code", api: "useQRCode()", tag: "p-scan-qr", props: ["Result<string>"], mpEquiv: "wx.scanCode + canvas", tier: "L1", status: "implemented" },
3937
4047
  cap("C43", "file-system", "useFileSystem()", "wx.getFileSystemManager", "FSAdapter"),
3938
4048
  cap("C44", "archive", "useArchive()", "wx.compressFile", "Result<void>"),
3939
4049
  cap("C45", "shortcut", "useShortcut()", "wx.addToDesktop", "Result<void>"),
@@ -3942,7 +4052,49 @@ ${summary}
3942
4052
  { id: "C47", kind: "capability", semantic: "capability.mini-program", api: "useMiniProgram()", props: ["MPContext"], mpEquiv: "wx.navigateToMiniProgram", tier: "L1", status: "planned" },
3943
4053
  { id: "C48", kind: "capability", semantic: "capability.embedded", api: "useEmbedded()", props: ["HostContext"], mpEquiv: "\u65E0\uFF08\u88AB\u5BBF\u4E3B\u5D4C\u5165\uFF09", tier: "L1", status: "planned" },
3944
4054
  { id: "C49", kind: "capability", semantic: "capability.live", api: "useLive()", props: ["LiveRoom"], mpEquiv: "wx...\uFF08\u76F4\u64AD\u7EC4\u4EF6\uFF09", tier: "L1", status: "planned" },
3945
- { id: "C50", kind: "capability", semantic: "capability.extension", api: "useExtension()", props: ["ExtensionAPI"], mpEquiv: "\u65E0\uFF08\u63D2\u4EF6/\u6269\u5C55\u70B9 G-21\uFF09", tier: "L1", status: "planned" }
4055
+ { id: "C50", kind: "capability", semantic: "capability.extension", api: "useExtension()", props: ["ExtensionAPI"], mpEquiv: "\u65E0\uFF08\u63D2\u4EF6/\u6269\u5C55\u70B9 G-21\uFF09", tier: "L1", status: "planned" },
4056
+ // ★颗粒度对齐 C(2026-09-11):C51 小程序热更新(wx.getUpdateManager)
4057
+ { id: "C51", kind: "capability", semantic: "capability.update", api: "useUpdate()", props: ["UpdateManagerAPI"], mpEquiv: "wx.getUpdateManager", tier: "L1", status: "planned" },
4058
+ // ★颗粒度对齐 C3(2026-09-11):相册 / Worker(对齐小程序媒体与多线程 API——纯 Hook,无 C-IR 节点 → planned)
4059
+ { id: "C52", kind: "capability", semantic: "capability.album", api: "useAlbum()", props: ["AlbumAPI"], mpEquiv: "wx.chooseMedia/saveImageToPhotosAlbum/previewMedia", tier: "L1", status: "planned" },
4060
+ { id: "C53", kind: "capability", semantic: "capability.worker", api: "useWorker()", props: ["WorkerHandle"], mpEquiv: "wx.createWorker", tier: "L1", status: "planned" },
4061
+ // ★颗粒度对齐 C3 批 2:收货地址 / WiFi / 微信运动(对齐小程序系统 API——纯 Hook → planned)
4062
+ { id: "C54", kind: "capability", semantic: "capability.address", api: "useAddress()", props: ["ShippingAddress"], mpEquiv: "wx.chooseAddress", tier: "L1", status: "planned" },
4063
+ { id: "C55", kind: "capability", semantic: "capability.wifi", api: "useWifi()", props: ["WifiAPI"], mpEquiv: "wx.getConnectedWifi/getWifiList/connectWifi", tier: "L1", status: "planned" },
4064
+ { id: "C56", kind: "capability", semantic: "capability.we-run", api: "useWeRun()", props: ["WeRunData"], mpEquiv: "wx.getWeRunData", tier: "L1", status: "planned" },
4065
+ // ★组件实例 API 对齐(2026-09-12):画布组件实例(wx.createCanvasContext/SelectorQuery node/canvasToTempFilePath/OffscreenCanvas;纯 Hook → planned)
4066
+ { id: "C57", kind: "capability", semantic: "capability.canvas", api: "useCanvas()", props: ["CanvasController"], mpEquiv: "wx.createCanvasContext/canvasToTempFilePath/createOffscreenCanvas", tier: "L1", status: "planned" },
4067
+ // ★组件实例 API 对齐(2026-09-12):元素查询 / 交叉观察 / 媒体查询(wx SelectorQuery/IntersectionObserver/MediaQueryObserver)
4068
+ { id: "C58", kind: "capability", semantic: "capability.element-query", api: "useElement()", props: ["ElementQuery"], mpEquiv: "wx.createSelectorQuery", tier: "L1", status: "planned" },
4069
+ { id: "C59", kind: "capability", semantic: "capability.intersection", api: "useIntersection()", props: ["IntersectionHandle"], mpEquiv: "wx.createIntersectionObserver", tier: "L1", status: "planned" },
4070
+ { id: "C60", kind: "capability", semantic: "capability.media-query", api: "useMediaQuery()", props: ["MediaQueryObserver"], mpEquiv: "wx.createMediaQueryObserver", tier: "L1", status: "planned" },
4071
+ // ★组件实例 API 对齐(2026-09-12):媒体组件实例 + 广告(wx VideoContext/InnerAudioContext/LivePusherContext + 广告联盟)
4072
+ { id: "C61", kind: "capability", semantic: "capability.video", api: "useVideo()", props: ["VideoController"], mpEquiv: "wx.createVideoContext", tier: "L1", status: "planned" },
4073
+ { id: "C62", kind: "capability", semantic: "capability.audio", api: "useAudio()", props: ["AudioController"], mpEquiv: "wx.createInnerAudioContext", tier: "L1", status: "planned" },
4074
+ { id: "C63", kind: "capability", semantic: "capability.live-pusher", api: "useLivePusher()", props: ["LivePusherController"], mpEquiv: "wx.createLivePusherContext", tier: "L1", status: "planned" },
4075
+ { id: "C64", kind: "capability", semantic: "capability.ad", api: "useAd()", props: ["AdAPI"], mpEquiv: "wx.createRewardedVideoAd/createInterstitialAd/createBannerAd", tier: "L1", status: "planned" },
4076
+ // ★权威标尺缺口补齐(2026-09-12):隐私协议(wx.getPrivacySetting/openPrivacyContract/requirePrivacyAuthorize——合规刚需)
4077
+ { id: "C65", kind: "capability", semantic: "capability.privacy", api: "usePrivacy()", props: ["PrivacyAPI"], mpEquiv: "wx.getPrivacySetting/openPrivacyContract/requirePrivacyAuthorize", tier: "L1", status: "planned" },
4078
+ // ★权威标尺缺口补齐批 D(2026-09-12):性能 / 预加载 / 图像编辑(通用能力,无资质门槛)
4079
+ { id: "C66", kind: "capability", semantic: "capability.performance", api: "usePerformance()", props: ["PerformanceAPI"], mpEquiv: "wx.getPerformance/reportPerformance", tier: "L1", status: "planned" },
4080
+ { id: "C67", kind: "capability", semantic: "capability.preload", api: "usePreload()", props: ["PreloadAPI"], mpEquiv: "wx.preloadAssets/preloadSkylineView/preloadWebview/preDownloadSubpackage", tier: "L1", status: "planned" },
4081
+ { id: "C68", kind: "capability", semantic: "capability.image-edit", api: "useImageEdit()", props: ["ImageEditAPI"], mpEquiv: "wx.cropImage/editImage", tier: "L1", status: "planned" },
4082
+ // ★权威标尺缺口补齐批 E(2026-09-12):网络底层 / 媒体高级
4083
+ { id: "C69", kind: "capability", semantic: "capability.socket", api: "useSocket()", props: ["UDPSocketHandle / TCPSocketHandle"], mpEquiv: "wx.createUDPSocket/createTCPSocket", tier: "L1", status: "planned" },
4084
+ { id: "C70", kind: "capability", semantic: "capability.media-processing", api: "useMediaProcessing()", props: ["MediaProcessingAPI"], mpEquiv: "wx.createMediaContainer/createVideoDecoder/createMediaAudioPlayer", tier: "L1", status: "planned" },
4085
+ // ★权威标尺缺口补齐批 F(2026-09-12):录屏/缓存/空闲/窗口/导航拦截
4086
+ { id: "C71", kind: "capability", semantic: "capability.screen-capture", api: "useScreenCapture()", props: ["ScreenCaptureAPI"], mpEquiv: "wx.getScreenRecordingState/onScreenRecordingStateChanged/onUserCaptureScreen/checkIsPictureInPictureActive", tier: "L1", status: "planned" },
4087
+ { id: "C72", kind: "capability", semantic: "capability.cache-manager", api: "useCacheManager()", props: ["CacheManagerHandle"], mpEquiv: "wx.createCacheManager", tier: "L1", status: "planned" },
4088
+ { id: "C73", kind: "capability", semantic: "capability.idle", api: "useIdle()", props: ["IdleAPI"], mpEquiv: "wx.requestIdleCallback/cancelIdleCallback", tier: "L1", status: "planned" },
4089
+ { id: "C74", kind: "capability", semantic: "capability.window", api: "useWindow()", props: ["WindowAPI"], mpEquiv: "wx.setWindowSize", tier: "L1", status: "planned" },
4090
+ { id: "C75", kind: "capability", semantic: "capability.navigation-guard", api: "useNavigationGuard()", props: ["NavigationGuardAPI"], mpEquiv: "wx.enableAlertBeforeUnload/disableAlertBeforeUnload", tier: "L1", status: "planned" },
4091
+ // ★权威标尺缺口补齐批 G(2026-09-12):AR/XR / iBeacon / 局域网 / 翻译 / 海报 / 设备探测
4092
+ { id: "C76", kind: "capability", semantic: "capability.ar", api: "useAR()", props: ["ARAPI"], mpEquiv: "wx.createVKSession/isVKSupport", tier: "L1", status: "planned" },
4093
+ { id: "C77", kind: "capability", semantic: "capability.beacon", api: "useBeacon()", props: ["BeaconAPI"], mpEquiv: "wx.onBeaconServiceChange/onBeaconUpdate", tier: "L1", status: "planned" },
4094
+ { id: "C78", kind: "capability", semantic: "capability.local-service", api: "useLocalService()", props: ["LocalServiceAPI"], mpEquiv: "wx.onLocalServiceFound/Lost/ResolveFail/DiscoveryStop", tier: "L1", status: "planned" },
4095
+ { id: "C79", kind: "capability", semantic: "capability.translation", api: "useTranslation()", props: ["TranslationAPI"], mpEquiv: "wx.onUserTriggerTranslation/onUserOffTranslation", tier: "L1", status: "planned" },
4096
+ { id: "C80", kind: "capability", semantic: "capability.poster", api: "usePoster()", props: ["PosterAPI"], mpEquiv: "wx.onGeneratePoster", tier: "L1", status: "planned" },
4097
+ { id: "C81", kind: "capability", semantic: "capability.device-capability", api: "useDeviceCapability()", props: ["DeviceCapabilityAPI"], mpEquiv: "wx.checkDeviceSupportHevc", tier: "L1", status: "planned" }
3946
4098
  ];
3947
4099
  var ENGINEERING = [
3948
4100
  { id: "E1", kind: "engineering", semantic: "engineering.state", api: "useState()", mpEquiv: "data", tier: "L1", status: "planned" },
@@ -3952,7 +4104,8 @@ ${summary}
3952
4104
  { id: "E5", kind: "engineering", semantic: "engineering.provide-inject", api: "useProvide()/useInject()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
3953
4105
  { id: "E6", kind: "engineering", semantic: "engineering.lifecycle", api: "useLifecycle()", mpEquiv: "onLoad/onShow/onHide/onUnload", tier: "L1", status: "planned" },
3954
4106
  { id: "E7", kind: "engineering", semantic: "engineering.ready", api: "useReady()", mpEquiv: "onReady", tier: "L1", status: "planned" },
3955
- { id: "E8", kind: "engineering", semantic: "engineering.error-boundary", api: "useErrorBoundary()", mpEquiv: "onError", tier: "L1", status: "planned" },
4107
+ { id: "E8", kind: "engineering", semantic: "engineering.error-boundary", api: "useErrorBoundary()", tag: "p-error-boundary", mpEquiv: "onError", tier: "L1", status: "planned" },
4108
+ // ★#405:组件形态补登(双形态:Hook + p- 标签)
3956
4109
  { id: "E9", kind: "engineering", semantic: "engineering.page-param", api: "usePageParam()", mpEquiv: "onLoad(options)", tier: "L1", status: "planned" },
3957
4110
  { id: "E10", kind: "engineering", semantic: "engineering.route", api: "useRoute()", mpEquiv: "getCurrentPages()", tier: "L1", status: "planned" },
3958
4111
  { id: "E11", kind: "engineering", semantic: "engineering.router-push", api: "router.push()", mpEquiv: "wx.navigateTo", tier: "L1", status: "planned" },
@@ -3962,7 +4115,7 @@ ${summary}
3962
4115
  { id: "E15", kind: "engineering", semantic: "engineering.router-relaunch", api: "router.reLaunch()", mpEquiv: "wx.reLaunch", tier: "L1", status: "planned" },
3963
4116
  { id: "E16", kind: "engineering", semantic: "engineering.router-before-each", api: "router.beforeEach()", mpEquiv: "onLaunch \u624B\u52A8", tier: "L1", status: "planned" },
3964
4117
  { id: "E17", kind: "engineering", semantic: "engineering.router-after-each", api: "router.afterEach()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
3965
- { id: "E18", kind: "engineering", semantic: "engineering.router-link", tag: "p-router-link", props: ["to", "replace", "switchTab"], mpEquiv: "<navigator>", tier: "L1", status: "implemented" },
4118
+ { id: "E18", kind: "engineering", semantic: "engineering.router-link", tag: "p-router-link", props: ["to", "replace", "switchTab", "target", "url", "openType", "delta", "appId", "path", "extraData", "version", "shortLink", "hoverClass", "hoverStopPropagation", "hoverStartTime", "hoverStayTime"], mpEquiv: "<navigator>", tier: "L1", status: "implemented" },
3966
4119
  { id: "E19", kind: "engineering", semantic: "engineering.transition", tag: "p-transition", props: ["name", "mode"], mpEquiv: "transition CSS", tier: "L1", status: "implemented" },
3967
4120
  { id: "E20", kind: "engineering", semantic: "engineering.animate", tag: "p-animate", props: ["keyframes", "duration"], mpEquiv: "animation CSS", tier: "L1", status: "implemented" },
3968
4121
  { id: "E21", kind: "engineering", semantic: "engineering.animation", api: "useAnimation()", mpEquiv: "wx.createAnimation", tier: "L1", status: "planned" },
@@ -3972,9 +4125,22 @@ ${summary}
3972
4125
  { id: "E25", kind: "engineering", semantic: "engineering.inspector", api: "useInspector()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
3973
4126
  { id: "E26", kind: "engineering", semantic: "engineering.performance", api: "usePerformance()", mpEquiv: "wx.reportPerformance", tier: "L1", status: "planned" },
3974
4127
  { id: "E27", kind: "engineering", semantic: "engineering.define-component", api: "defineComponent()", mpEquiv: "Component()", tier: "L1", status: "planned" },
3975
- { id: "E28", kind: "engineering", semantic: "engineering.define-capability", api: "defineCapability()", mpEquiv: "\u65E0", tier: "L1", status: "planned" }
4128
+ { id: "E28", kind: "engineering", semantic: "engineering.define-capability", api: "defineCapability()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
4129
+ // ★批次 8(2026-09-18):共享元素转场(官方 <share-element> 对齐)——能力由宿主提供,框架只声明语义
4130
+ { id: "E29", kind: "engineering", semantic: "engineering.share-element", tag: "p-share-element", props: ["shuttleKey", "animate", "duration", "easingFunction", "transitionOnGesture", "shuttleOnPush", "shuttleOnPop", "rectTweenType"], mpEquiv: "<share-element>\uFF08\u5BBF\u4E3B\u8DE8\u9875\u98DE\u884C\u52A8\u753B\uFF09", tier: "L1", status: "implemented" },
4131
+ // ★E30(2026-09-19):WebMCP 接入——把**能力面**暴露为浏览器内 agent 可调用工具。
4132
+ // 规范面:`document.modelContext.registerTool(...)`(★非 navigator)+ signal 注销(规范无 unregisterTool);
4133
+ // 灵感来自 VueUse v15 `useWebMCP`(document 命名空间 / signal 注销 / 方法可调用探测 / 三元组返回)。
4134
+ // 框架差异化:能力面统一 `CapResult<T>` 契约(G-32.4)→ 能力可**自动**派生为工具、响应归一不必逐个手写。
4135
+ // ★状态口径(与 E1-E28 / C15 / C26 等同款,非本轮新引入):hook 形态原语无**渲染后端映射**,
4136
+ // 故按 catalog 既有约定记 `planned`——该字段反映「已在 SEMANTIC_BACKEND_MAP 登记 ≥3 端」,
4137
+ // 不等于「代码未实现」(本原语已实现于 `packages/api/src/mcp.ts`)。
4138
+ // `mpEquiv: 无`:WebMCP 是浏览器侧 agent 通道,小程序无 `document.modelContext` → 如实降级(isSupported=false)。
4139
+ { id: "E30", kind: "engineering", semantic: "engineering.mcp", api: "useMCP()", props: ["tools", "capabilities", "prefix"], mpEquiv: "\u65E0\uFF08\u6D4F\u89C8\u5668\u4FA7 agent \u901A\u9053\uFF1BMP \u7AEF isSupported=false \u8BDA\u5B9E\u964D\u7EA7\uFF09", tier: "L1", status: "planned" }
3976
4140
  ];
3977
4141
  var PRIMITIVE_CATALOG = [...LAYOUT, ...UI, ...SHELL, ...GESTURE, ...CAPABILITY, ...ENGINEERING];
4142
+
4143
+ // ../component-ir/src/audit.ts
3978
4144
  var MP_COMPONENTS = [
3979
4145
  { mp: "<view>", proteus: "layout.box / layout.stack", status: "ok", group: "component" },
3980
4146
  { mp: "<text>", proteus: "ui.text / ui.heading", status: "ok", group: "component" },
@@ -3984,10 +4150,10 @@ ${summary}
3984
4150
  { mp: "<swiper-item>", proteus: "layout.stack \u5B50\u9879", status: "ok", group: "component" },
3985
4151
  { mp: "<movable-area>", proteus: "gesture.scrollable \u5BB9\u5668", status: "ok", group: "component" },
3986
4152
  { mp: "<movable-view>", proteus: "gesture.draggable", status: "ok", group: "component" },
3987
- { mp: "<cover-view>", proteus: "p-overlay (L2)", status: "compat", group: "component" },
3988
- { mp: "<cover-image>", proteus: "p-overlay + ui.image", status: "compat", group: "component" },
4153
+ { mp: "<cover-view>", proteus: "layout.box\uFF08Skyline \u540C\u5C42\u6E32\u67D3\u540E view \u5373\u53EF\u8986\u76D6\u2014\u2014\u5B98\u65B9\u5EFA\u8BAE\u66FF\u4EE3\uFF09", status: "ok", group: "component" },
4154
+ { mp: "<cover-image>", proteus: "ui.image\uFF08\u540C\u5C42\u6E32\u67D3\u540E image \u5373\u53EF\u8986\u76D6\uFF09", status: "ok", group: "component" },
3989
4155
  { mp: "<icon>", proteus: "ui.icon", status: "ok", group: "component" },
3990
- { mp: "<progress>", proteus: "p-progress (L2)", status: "compat", group: "component" },
4156
+ { mp: "<progress>", proteus: "ui.progress", status: "ok", group: "component" },
3991
4157
  { mp: "<rich-text>", proteus: "ui.rich-text", status: "ok", group: "component" },
3992
4158
  { mp: "<button>", proteus: "ui.button", status: "ok", group: "component" },
3993
4159
  { mp: "<form>", proteus: "ui.form", status: "ok", group: "component" },
@@ -3999,58 +4165,211 @@ ${summary}
3999
4165
  { mp: "<picker-view>", proteus: "ui.picker mode=wheel", status: "ok", group: "component" },
4000
4166
  { mp: "<slider>", proteus: "ui.slider", status: "ok", group: "component" },
4001
4167
  { mp: "<switch>", proteus: "ui.switch", status: "ok", group: "component" },
4002
- { mp: "<label>", proteus: "p-label (L2)", status: "compat", group: "component" },
4168
+ { mp: "<label>", proteus: "ui.label", status: "ok", group: "component" },
4003
4169
  { mp: "<navigator>", proteus: "engineering.router-link / router.*", status: "ok", group: "component" },
4004
4170
  { mp: "<audio>", proteus: "ui.media kind=audio\uFF08\u6D88\u706D\u4E3A\u5C5E\u6027\uFF09", status: "ok", group: "component" },
4005
4171
  { mp: "<video>", proteus: "ui.media kind=video\uFF08\u6D88\u706D\u4E3A\u5C5E\u6027\uFF09", status: "ok", group: "component" },
4006
- { mp: "<camera>", proteus: "p-camera (L2) + capability.camera", status: "ok", group: "component" },
4172
+ { mp: "<camera>", proteus: "ui.camera\uFF08p-camera\uFF09+ useCamera", status: "ok", group: "component" },
4007
4173
  { mp: "<live-player>", proteus: "ui.media kind=live\uFF08\u6D88\u706D\u4E3A\u5C5E\u6027\uFF09", status: "ok", group: "component" },
4008
4174
  { mp: "<live-pusher>", proteus: "ui.media kind=live mode=push", status: "ok", group: "component" },
4009
4175
  { mp: "<canvas>", proteus: "ui.canvas", status: "ok", group: "component" },
4010
- { mp: "<map>", proteus: "p-map (L2) + capability.map", status: "ok", group: "component" },
4011
- { mp: "<web-view>", proteus: "p-webview (L2)", status: "compat", group: "component" },
4176
+ { mp: "<map>", proteus: "ui.map\uFF08p-map\uFF09+ useMap", status: "ok", group: "component" },
4177
+ { mp: "<web-view>", proteus: "shell.webview\uFF08p-webview\uFF09+ \u5BBF\u4E3B\u6865", status: "ok", group: "component" },
4012
4178
  { mp: "<editor>", proteus: "ui.rich-text editable", status: "ok", group: "component" },
4013
- { mp: "<ad>", proteus: "p-ad (L2)", status: "compat", group: "component" },
4014
- { mp: "<official-account>", proteus: "capability.mini-program\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", status: "private", group: "component" },
4015
- { mp: "<open-data>", proteus: "capability.mini-program\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", status: "private", group: "component" },
4016
- { mp: "<share-element>", proteus: "p-share-element (L2)", status: "compat", group: "component" },
4017
- { mp: "<aria-component>", proteus: "p-aria (L2)", status: "compat", group: "component" },
4018
- { mp: "<page-container>", proteus: "p-page-container (L2)", status: "compat", group: "component" },
4019
- { mp: "<voip-room>", proteus: "capability.mini-program\uFF08\u5FAE\u4FE1 VOIP\uFF09", status: "private", group: "component" },
4020
- { mp: "<guild-room>", proteus: "capability.mini-program\uFF08\u5FAE\u4FE1\u6E38\u620F\uFF09", status: "private", group: "component" }
4179
+ { mp: "<ad>", proteus: "shell.ad\uFF08p-ad\uFF09", status: "ok", group: "component" },
4180
+ { mp: "<official-account>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", status: "private", group: "component" },
4181
+ { mp: "<open-data>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", status: "private", group: "component" },
4182
+ { mp: "<share-element>", proteus: "engineering.share-element\uFF08p-share-element\uFF09", status: "ok", group: "component" },
4183
+ { mp: "<aria-component>", proteus: "aria-* \u5C5E\u6027\uFF08\u5404\u7EC4\u4EF6 ariaLabel\uFF1B\u4E24\u7AEF\u539F\u751F\u652F\u6301\uFF09", status: "ok", group: "component" },
4184
+ { mp: "<page-container>", proteus: "shell.page-container", status: "ok", group: "component" },
4185
+ { mp: "<voip-room>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1 VOIP\uFF09", status: "private", group: "component" },
4186
+ { mp: "<guild-room>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1\u6E38\u620F\uFF09", status: "private", group: "component" },
4187
+ // ★2026-09-11 补齐:此前矩阵漏列的真实微信内置组件(Skyline 族为主)——有等价能力标 ok/compat,无则 missing
4188
+ { mp: "<match-media>", proteus: "p-adaptive / p-zone\uFF08\u5BB9\u5668\u65AD\u70B9\u66FF\u4EE3\uFF09", status: "ok", group: "component" },
4189
+ { mp: "<navigation-bar>", proteus: "shell.nav\uFF08p-nav-bar \u81EA\u7ED8\uFF09", status: "ok", group: "component" },
4190
+ { mp: "<keyframe-animation>", proteus: "engineering.animate / engineering.transition", status: "ok", group: "component" },
4191
+ { mp: "<list-view>", proteus: "layout.virtual-list\uFF08p-list-view \u56DE\u6536\uFF09", status: "ok", group: "component" },
4192
+ { mp: "<grid-view>", proteus: "layout.grid / layout.virtual-list", status: "ok", group: "component" },
4193
+ { mp: "<snapshot>", proteus: "ui.canvas\uFF08\u622A\u56FE\u7ECF OffscreenCanvas\uFF09", status: "compat", group: "component" },
4194
+ { mp: "<page-meta>", proteus: "shell.page\uFF08\u9875\u9762\u914D\u7F6E\u5C5E\u6027\uFF09", status: "compat", group: "component" },
4195
+ { mp: "<root-portal>", proteus: "engineering.transition\uFF08teleport\u2192root-portal \u7F16\u8BD1\u671F\uFF09", status: "ok", group: "component" },
4196
+ { mp: "<sticky-header>", proteus: "layout.scroll + sticky\uFF08CSS\uFF09", status: "compat", group: "component" },
4197
+ { mp: "<sticky-section>", proteus: "layout.scroll + sticky\uFF08CSS\uFF09", status: "compat", group: "component" },
4198
+ { mp: "<double-tap-gesture>", proteus: "gesture.draggable\uFF08p-draggable \u624B\u52BF\u8BC6\u522B\u5668\uFF09", status: "ok", group: "component" },
4199
+ { mp: "<functional-page-navigator>", proteus: "\u2014\uFF08\u5FAE\u4FE1\u63D2\u4EF6\u9875\u4E13\u5C5E\uFF0C\u975E\u76EE\u6807\uFF09", status: "private", group: "component" },
4200
+ { mp: "<open-container>", proteus: "\u2014\uFF08\u5FAE\u4FE1\u5F00\u5C4F\u5BB9\u5668\uFF0C\u79C1\u6709\uFF09", status: "private", group: "component" },
4201
+ // ★权威标尺批 H:局部文本选区 / 键盘上方工具栏(全端真实落地)
4202
+ { mp: "<selection>", proteus: "ui.selection\uFF08p-selection\uFF09", status: "ok", group: "component" },
4203
+ { mp: "<keyboard-accessory>", proteus: "shell.keyboard-accessory\uFF08p-keyboard-accessory\uFF09", status: "ok", group: "component" }
4021
4204
  ];
4022
4205
  var MP_API_GROUPS = [
4023
- { mp: "wx.request/upload/download/websocket\uFF08\u7F51\u7EDC\uFF09", proteus: "capability.fetch/upload/download/websocket", status: "ok", group: "api" },
4024
- { mp: "wx.requestPayment", proteus: "capability.payment", status: "ok", group: "api" },
4025
- { mp: "wx.chooseImage/chooseMedia/previewImage\uFF08\u5A92\u4F53\uFF09", proteus: "capability.camera + ui.image preview", status: "ok", group: "api" },
4026
- { mp: "wx.startRecord/RecorderManager\uFF08\u5F55\u97F3\uFF09", proteus: "capability.microphone", status: "ok", group: "api" },
4027
- { mp: "wx.createVideoContext/CameraContext", proteus: "capability.media + ui.media", status: "ok", group: "api" },
4028
- { mp: "wx.scanCode", proteus: "capability.qr-code / capability.scan-qr", status: "ok", group: "api" },
4029
- { mp: "wx.saveImageToPhotosAlbum", proteus: "capability.album (L2)", status: "compat", group: "api" },
4030
- { mp: "wx.getFileSystemManager/*\uFF08\u6587\u4EF6 30+\uFF09", proteus: "capability.file-system", status: "ok", group: "api" },
4031
- { mp: "wx.compressFile/unzip", proteus: "capability.archive", status: "ok", group: "api" },
4032
- { mp: "wx.set/get/remove/clearStorage(+Sync)", proteus: "capability.storage", status: "ok", group: "api" },
4033
- { mp: "wx.getLocation/chooseLocation/openLocation", proteus: "capability.location", status: "ok", group: "api" },
4034
- { mp: "wx.createMapContext", proteus: "capability.map", status: "ok", group: "api" },
4035
- { mp: "wx.getSystemInfo\uFF08\u8BBE\u5907/\u5C4F\u5E55/\u7F51\u7EDC/\u7535\u91CF/\u4EAE\u5EA6/\u65B9\u5411/\u9707\u52A8/\u4F20\u611F\u5668/\u526A\u8D34\u677F/\u7535\u8BDD\uFF09", proteus: "capability.device/screen/network/battery/brightness/orientation/vibrate/sensor/clipboard/phone-call", status: "ok", group: "api" },
4036
- { mp: "wx.openBluetoothAdapter\uFF08\u84DD\u7259 20+\uFF09", proteus: "capability.bluetooth", status: "ok", group: "api" },
4037
- { mp: "wx.getHCEState\uFF08NFC\uFF09", proteus: "capability.nfc", status: "ok", group: "api" },
4038
- { mp: "wx.checkIsSupportFingerPrint/FaceID", proteus: "capability.biometric / face-id", status: "ok", group: "api" },
4039
- { mp: "wx.showToast/showLoading/showModal/showActionSheet", proteus: "shell.toast + capability.toast/loading + shell.modal + shell.action-sheet", status: "ok", group: "api" },
4206
+ { mp: "wx.request/upload/download/websocket\uFF08\u7F51\u7EDC\uFF09", proteus: "useFetch / useUpload / useDownload / useWebSocket / useSocketTask", status: "ok", group: "api" },
4207
+ { mp: "wx.requestPayment", proteus: "usePayment", status: "ok", group: "api" },
4208
+ { mp: "wx.chooseImage/chooseMedia/previewImage\uFF08\u5A92\u4F53\uFF09", proteus: "useAlbum / useCamera + ui.image", status: "ok", group: "api" },
4209
+ { mp: "wx.startRecord/RecorderManager\uFF08\u5F55\u97F3\uFF09", proteus: "useMicrophone / useRecorder", status: "ok", group: "api" },
4210
+ { mp: "wx.createVideoContext/CameraContext", proteus: "ui.media + createCameraContext\uFF08ui.canvas \u627F\u63A5\uFF09", status: "ok", group: "api" },
4211
+ { mp: "wx.scanCode", proteus: "useQRCode / p-scan-qr", status: "ok", group: "api" },
4212
+ { mp: "wx.saveImageToPhotosAlbum/saveVideoToPhotosAlbum", proteus: "useAlbum\uFF08saveImage/saveVideo\uFF09", status: "ok", group: "api" },
4213
+ { mp: "wx.createWorker\uFF08\u591A\u7EBF\u7A0B\uFF09", proteus: "useWorker", status: "ok", group: "api" },
4214
+ { mp: "wx.chooseAddress\uFF08\u6536\u8D27\u5730\u5740\uFF09", proteus: "useAddress", status: "ok", group: "api" },
4215
+ { mp: "wx.getConnectedWifi/getWifiList/connectWifi\uFF08WiFi\uFF09", proteus: "useWifi", status: "ok", group: "api" },
4216
+ { mp: "wx.getWeRunData\uFF08\u5FAE\u4FE1\u8FD0\u52A8\uFF09", proteus: "useWeRun", status: "ok", group: "api" },
4217
+ // ★组件实例 API 对齐(2026-09-12):Canvas/查询/媒体组件实例(此前矩阵误标 useElement/useIntersection/useMedia——均为幽灵引用)
4218
+ { mp: "wx.createCanvasContext / canvasToTempFilePath / createOffscreenCanvas\uFF08Canvas \u7EC4\u4EF6\u5B9E\u4F8B\uFF09", proteus: "useCanvas", status: "ok", group: "api" },
4219
+ { mp: "wx.createSelectorQuery\uFF08\u5143\u7D20\u51E0\u4F55\u67E5\u8BE2\uFF09", proteus: "useElement", status: "ok", group: "api" },
4220
+ { mp: "wx.createIntersectionObserver\uFF08\u4EA4\u53C9\u89C2\u5BDF\uFF09", proteus: "useIntersection", status: "ok", group: "api" },
4221
+ { mp: "wx.createMediaQueryObserver\uFF08\u5A92\u4F53\u67E5\u8BE2\uFF09", proteus: "useMediaQuery", status: "ok", group: "api" },
4222
+ { mp: "wx.createVideoContext\uFF08\u89C6\u9891\u7EC4\u4EF6\u5B9E\u4F8B\uFF09", proteus: "useVideo", status: "ok", group: "api" },
4223
+ { mp: "wx.createInnerAudioContext\uFF08\u97F3\u9891\u5B9E\u4F8B\uFF09", proteus: "useAudio", status: "ok", group: "api" },
4224
+ { mp: "wx.createLivePusherContext\uFF08\u76F4\u64AD\u63A8\u6D41\u5B9E\u4F8B\uFF09", proteus: "useLivePusher", status: "ok", group: "api" },
4225
+ { mp: "wx.createRewardedVideoAd/createInterstitialAd/createBannerAd\uFF08\u5E7F\u544A\uFF09", proteus: "useAd", status: "ok", group: "api" },
4226
+ { mp: "wx.getPrivacySetting/openPrivacyContract/requirePrivacyAuthorize\uFF08\u9690\u79C1\u534F\u8BAE\uFF09", proteus: "usePrivacy", status: "ok", group: "api" },
4227
+ { mp: "wx.getPerformance/reportPerformance\uFF08\u6027\u80FD\uFF09", proteus: "usePerformance", status: "ok", group: "api" },
4228
+ { mp: "wx.preloadAssets/preloadSkylineView/preloadWebview/preDownloadSubpackage\uFF08\u9884\u52A0\u8F7D\uFF09", proteus: "usePreload", status: "ok", group: "api" },
4229
+ { mp: "wx.cropImage/editImage\uFF08\u56FE\u50CF\u7F16\u8F91\uFF09", proteus: "useImageEdit", status: "ok", group: "api" },
4230
+ { mp: "wx.createUDPSocket/createTCPSocket\uFF08\u7F51\u7EDC\u5E95\u5C42 Socket\uFF09", proteus: "useSocket", status: "ok", group: "api" },
4231
+ { mp: "wx.createMediaContainer/createVideoDecoder/createMediaAudioPlayer\uFF08\u5A92\u4F53\u9AD8\u7EA7\uFF09", proteus: "useMediaProcessing", status: "ok", group: "api" },
4232
+ { mp: "wx.getScreenRecordingState/onScreenRecordingStateChanged/onUserCaptureScreen/checkIsPictureInPictureActive\uFF08\u5F55\u5C4F/\u622A\u5C4F\uFF09", proteus: "useScreenCapture", status: "ok", group: "api" },
4233
+ { mp: "wx.createCacheManager\uFF08\u8BF7\u6C42\u7F13\u5B58\u7BA1\u7406\uFF09", proteus: "useCacheManager", status: "ok", group: "api" },
4234
+ { mp: "wx.requestIdleCallback/cancelIdleCallback\uFF08\u7A7A\u95F2\u8C03\u5EA6\uFF09", proteus: "useIdle", status: "ok", group: "api" },
4235
+ { mp: "wx.setWindowSize\uFF08PC \u7A97\u53E3\uFF09", proteus: "useWindow", status: "ok", group: "api" },
4236
+ { mp: "wx.enableAlertBeforeUnload/disableAlertBeforeUnload\uFF08\u5378\u8F7D\u62E6\u622A\uFF09", proteus: "useNavigationGuard", status: "ok", group: "api" },
4237
+ { mp: "wx.createVKSession/isVKSupport\uFF08AR/XR \u89C6\u89C9\u7B97\u6CD5\uFF09", proteus: "useAR", status: "ok", group: "api" },
4238
+ { mp: "wx.onBeaconServiceChange/onBeaconUpdate\uFF08iBeacon\uFF09", proteus: "useBeacon", status: "ok", group: "api" },
4239
+ { mp: "wx.onLocalServiceFound/Lost/ResolveFail/DiscoveryStop\uFF08\u5C40\u57DF\u7F51 mDNS\uFF09", proteus: "useLocalService", status: "ok", group: "api" },
4240
+ { mp: "wx.onUserTriggerTranslation/onUserOffTranslation\uFF08\u7FFB\u8BD1\uFF09", proteus: "useTranslation", status: "ok", group: "api" },
4241
+ { mp: "wx.onGeneratePoster\uFF08\u5206\u4EAB\u6D77\u62A5\uFF09", proteus: "usePoster", status: "ok", group: "api" },
4242
+ { mp: "wx.checkDeviceSupportHevc\uFF08\u8BBE\u5907\u80FD\u529B\u63A2\u6D4B\uFF09", proteus: "useDeviceCapability", status: "ok", group: "api" },
4243
+ { mp: "wx.getFileSystemManager/*\uFF08\u6587\u4EF6 30+\uFF09", proteus: "useFileSystem", status: "ok", group: "api" },
4244
+ { mp: "wx.compressFile/unzip", proteus: "useArchive", status: "ok", group: "api" },
4245
+ { mp: "wx.set/get/remove/clearStorage(+Sync)", proteus: "useStorage", status: "ok", group: "api" },
4246
+ { mp: "wx.getLocation/chooseLocation/openLocation", proteus: "useLocation / p-location", status: "ok", group: "api" },
4247
+ { mp: "wx.createMapContext", proteus: "useMap", status: "ok", group: "api" },
4248
+ { mp: "wx.getSystemInfo\uFF08\u8BBE\u5907/\u5C4F\u5E55/\u7F51\u7EDC/\u7535\u91CF/\u4EAE\u5EA6/\u65B9\u5411/\u9707\u52A8/\u4F20\u611F\u5668/\u526A\u8D34\u677F/\u7535\u8BDD\uFF09", proteus: "useDevice / useScreen / useNetwork / useBattery / useBrightness / useOrientation / useVibrate / useSensor / useClipboard / usePhoneCall", status: "ok", group: "api" },
4249
+ { mp: "wx.openBluetoothAdapter\uFF08\u84DD\u7259 20+\uFF09", proteus: "useBluetooth", status: "ok", group: "api" },
4250
+ { mp: "wx.getHCEState\uFF08NFC\uFF09", proteus: "useNFC", status: "ok", group: "api" },
4251
+ { mp: "wx.checkIsSupportFingerPrint/FaceID", proteus: "useBiometric / useFaceID", status: "ok", group: "api" },
4252
+ { mp: "wx.showToast/showLoading/showModal/showActionSheet", proteus: "shell.toast + ui.loading + shell.modal + shell.action-sheet", status: "ok", group: "api" },
4040
4253
  { mp: "wx.setNavigationBarTitle/Color", proteus: "shell.nav", status: "ok", group: "api" },
4041
4254
  { mp: "wx.setTabBarItem/Style/hide/show", proteus: "shell.tabbar", status: "ok", group: "api" },
4042
- { mp: "wx.pageScrollTo", proteus: "capability.page-scroll", status: "ok", group: "api" },
4043
- { mp: "wx.createAnimation", proteus: "engineering.animation", status: "ok", group: "api" },
4044
- { mp: "wx.createSelectorQuery/IntersectionObserver", proteus: "capability.element / intersection", status: "ok", group: "api" },
4045
- { mp: "wx.navigateTo/redirectTo/navigateBack/switchTab/reLaunch", proteus: "engineering.router-push/replace/back/switch-tab/relaunch", status: "ok", group: "api" },
4046
- { mp: "wx.getCurrentPages", proteus: "engineering.route", status: "ok", group: "api" },
4047
- { mp: "App()/Page() \u751F\u547D\u5468\u671F/getApp()", proteus: "engineering.lifecycle + capability.app-lifecycle/page-lifecycle", status: "ok", group: "api" },
4048
- { mp: "wx.shareAppMessage/requestSubscribeMessage", proteus: "capability.share / notification", status: "ok", group: "api" },
4049
- { mp: "wx.login/checkSession/getUserInfo/authorize", proteus: "capability.login / auth / permission", status: "ok", group: "api" },
4050
- { mp: "wx.getUpdateManager", proteus: "capability.update (L2)", status: "compat", group: "api" },
4051
- { mp: "wx.requestWeChatPay/navigateToMiniProgram/\u6A21\u677F\u6D88\u606F/\u5BA2\u670D\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", proteus: "capability.mini-program", status: "private", group: "api" }
4255
+ { mp: "wx.pageScrollTo", proteus: "layout.scroll\uFF08p-scroll-view\uFF09", status: "ok", group: "api" },
4256
+ { mp: "wx.createAnimation", proteus: "engineering.animate / engineering.transition", status: "ok", group: "api" },
4257
+ { mp: "wx.createSelectorQuery/IntersectionObserver", proteus: "engineering.router-link + layout.scroll\uFF08\u5B9E\u6D4B\u80FD\u529B\uFF09", status: "ok", group: "api" },
4258
+ { mp: "wx.navigateTo/redirectTo/navigateBack/switchTab/reLaunch", proteus: "engineering.router-link + router.* API", status: "ok", group: "api" },
4259
+ { mp: "wx.getCurrentPages", proteus: "engineering.router-link + shared adapter", status: "ok", group: "api" },
4260
+ { mp: "App()/Page() \u751F\u547D\u5468\u671F/getApp()", proteus: "useAppLifecycle / usePageLifecycle", status: "ok", group: "api" },
4261
+ { mp: "wx.shareAppMessage/requestSubscribeMessage", proteus: "useShare / useNotification", status: "ok", group: "api" },
4262
+ { mp: "wx.login/checkSession/getUserInfo/authorize", proteus: "useLogin / useAuth / usePermission", status: "ok", group: "api" },
4263
+ { mp: "wx.getUpdateManager", proteus: "useUpdate", status: "ok", group: "api" },
4264
+ { mp: "wx.requestWeChatPay/navigateToMiniProgram/\u6A21\u677F\u6D88\u606F/\u5BA2\u670D\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", proteus: "useMiniProgram", status: "private", group: "api" }
4052
4265
  ];
4053
4266
  var MP_MAPPING_MATRIX = [...MP_COMPONENTS, ...MP_API_GROUPS];
4267
+
4268
+ // ../component-ir/src/degradation.ts
4269
+ var PRIVATE_WEB_FALLBACK = {
4270
+ openType: "Web \u89E6\u53D1\u540C\u540D\u4E8B\u4EF6\uFF08\u5982 @contact\uFF09+ console \u63D0\u793A\u81EA\u5B9A\u4E49\u5BF9\u5E94\u4EA4\u4E92\uFF08\u53C2\u8003 Web p-button open-type\uFF09",
4271
+ appId: "Web \u65E0\u8DE8\u5E94\u7528\u8DF3\u8F6C\u80FD\u529B\uFF0C\u4EC5\u56DE\u663E\u53C2\u6570\u5E76\u63D0\u793A",
4272
+ shortLink: "Web \u65E0\u77ED\u94FE\u8DF3\u8F6C\u80FD\u529B\uFF0C\u4EC5\u56DE\u663E\u53C2\u6570\u5E76\u63D0\u793A",
4273
+ unitId: "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\u4F4D\uFF0C\u6E32\u67D3\u5360\u4F4D\u5E76\u63D0\u793A\uFF08\u4E0D\u9759\u9ED8\uFF09",
4274
+ adType: "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\u7C7B\u578B\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4275
+ adTheme: "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\u4E3B\u9898\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4276
+ adIntervals: "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\u81EA\u52A8\u5237\u65B0\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A"
4277
+ };
4278
+ var STYLE_WEB_FALLBACK = {
4279
+ hoverClass: "\u6620\u5C04 CSS :active/:hover \u7C7B\uFF08\u6846\u67B6\u9ED8\u8BA4\u7C7B\u6052\u5728\uFF0C\u81EA\u5B9A\u4E49\u7C7B\u4F5C\u9644\u52A0\u2014\u2014T3\uFF09",
4280
+ hoverStartTime: "Web \u7528 CSS transition-delay \u8FD1\u4F3C\u6309\u538B\u8D77\u59CB\u5EF6\u65F6",
4281
+ hoverStayTime: "Web \u7528 CSS transition-duration \u8FD1\u4F3C\u6309\u538B\u505C\u7559\u65F6\u957F",
4282
+ hoverStopPropagation: "Web \u7528 CSS pointer-events \u963B\u65AD\u5B50\u7EA7\u53CD\u9988\u8FD1\u4F3C"
4283
+ };
4284
+ var MP_HOST_WEB_FALLBACK = {
4285
+ alwaysEmbed: "Web \u65E0\u540C\u5C42/\u975E\u540C\u5C42\u5207\u6362\u6982\u5FF5\uFF08input \u59CB\u7EC8\u5728\u6587\u6863\u6D41\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4286
+ confirmHold: "Web \u65E0\u6CD5\u63A7\u5236\u8F6F\u952E\u76D8\u6536\u8D77\u65F6\u673A\uFF08\u7531\u6D4F\u89C8\u5668/\u7CFB\u7EDF\u51B3\u5B9A\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4287
+ adjustPosition: "Web \u7531\u6D4F\u89C8\u5668\u81EA\u8EAB\u5904\u7406\u952E\u76D8\u5F39\u8D77\u65F6\u7684\u89C6\u53E3\u6EDA\u52A8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4288
+ holdKeyboard: "Web \u65E0\u6CD5\u5728\u5931\u7126\u70B9\u51FB\u65F6\u4FDD\u6301\u952E\u76D8\uFF08\u6D4F\u89C8\u5668\u884C\u4E3A\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4289
+ cursorColor: "Web \u8FD1\u4F3C\uFF1ACSS caret-color\uFF08\u5F53\u524D\u672A\u63A5\u7EBF\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF09",
4290
+ selectionStart: "Web \u8FD1\u4F3C\uFF1AsetSelectionRange\uFF08\u5F53\u524D\u672A\u63A5\u7EBF\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF09",
4291
+ selectionEnd: "Web \u8FD1\u4F3C\uFF1AsetSelectionRange\uFF08\u5F53\u524D\u672A\u63A5\u7EBF\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF09",
4292
+ placeholderClass: "Web \u65E0\u300C\u5360\u4F4D\u7B26\u4E13\u7528\u7C7B\u540D\u300D\u901A\u9053\uFF08::placeholder \u4E0D\u53EF\u627F\u63A5\u4EFB\u610F\u7C7B\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4293
+ safePasswordCertPath: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF08\u5BBF\u4E3B\u7EA7\u52A0\u5BC6\u952E\u76D8\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4294
+ safePasswordLength: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4295
+ safePasswordTimeStamp: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4296
+ safePasswordNonce: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4297
+ safePasswordSalt: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4298
+ safePasswordCustomHash: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
4299
+ reportSubmit: "formId \u662F\u5C0F\u7A0B\u5E8F\u6A21\u677F\u6D88\u606F\u5BBF\u4E3B\u80FD\u529B\uFF0CWeb \u65E0\u5BF9\u5E94 \u2192 \u5FFD\u7565\u5E76\u63D0\u793A",
4300
+ reportSubmitTimeout: "formId \u662F\u5C0F\u7A0B\u5E8F\u6A21\u677F\u6D88\u606F\u5BBF\u4E3B\u80FD\u529B\uFF0CWeb \u65E0\u5BF9\u5E94 \u2192 \u5FFD\u7565\u5E76\u63D0\u793A"
4301
+ };
4302
+ var HOST_TAGS = {
4303
+ "p-map": "Web \u6A21\u62DF\u5C42\u6E32\u67D3\u9759\u6001\u5360\u4F4D\u5BB9\u5668\uFF0C\u5FFD\u7565\u8BE5\u5730\u56FE\u663E\u793A\u53C2\u6570\u5E76\u63D0\u793A",
4304
+ "p-media": "Web \u7528\u539F\u751F <video>\uFF0C\u5FFD\u7565\u8BE5\u64AD\u653E\u5668\u5916\u89C2/\u4E13\u6709\u53C2\u6570\u5E76\u63D0\u793A",
4305
+ "p-camera": "Web \u65E0\u6444\u50CF\u5934\u5BBF\u4E3B\uFF0C\u5FFD\u7565\u8BE5\u91C7\u96C6\u53C2\u6570\u5E76\u63D0\u793A\uFF08\u53EF\u9000\u5316 getUserMedia \u65F6\u53E6\u884C\u5B9E\u73B0\uFF09",
4306
+ "p-ad": "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\uFF0C\u5FFD\u7565\u8BE5\u5E7F\u544A\u53C2\u6570\u5E76\u63D0\u793A",
4307
+ "p-canvas": "Web \u7528 HTMLCanvasElement\uFF0C\u5FFD\u7565\u8BE5\u5C0F\u7A0B\u5E8F\u6E32\u67D3\u4E0A\u4E0B\u6587\u4E13\u6709\u53C2\u6570\u5E76\u63D0\u793A",
4308
+ "p-webview": "Web \u7528 <iframe>\uFF0C\u5FFD\u7565\u8BE5\u5C0F\u7A0B\u5E8F web-view \u4E13\u6709\u53C2\u6570\u5E76\u63D0\u793A"
4309
+ };
4310
+ var WEB_EXTENSION_MP_FALLBACK = {
4311
+ density: "\u5C0F\u7A0B\u5E8F\u65E0 DPI \u5BC6\u5EA6\u6982\u5FF5\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF08rpx \u5DF2\u6309\u8BBE\u8BA1\u7A3F\u5BBD\u5EA6\u6362\u7B97\uFF09",
4312
+ designWidth: "\u5C0F\u7A0B\u5E8F\u7528 rpx \u57FA\u51C6\uFF08750\uFF09\uFF0C\u8BE5 Web \u4E13\u7528\u57FA\u51C6\u5FFD\u7565\u5E76\u63D0\u793A",
4313
+ searchable: "\u5C0F\u7A0B\u5E8F\u65E0\u5185\u5EFA\u641C\u7D22\u8BED\u4E49\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF08\u7531\u4E1A\u52A1\u4FA7\u81EA\u7ED8\uFF09"
4314
+ };
4315
+ var TAG_PROP_MP_FALLBACK = {
4316
+ "p-stack": {
4317
+ snap: "\u5C0F\u7A0B\u5E8F view \u4E0D\u6EDA\u52A8\uFF08Skyline \u65E0 CSS overflow \u6EDA\u52A8\uFF0CS14 \u5B9E\u6D4B\uFF09\u2192 \u5438\u9644\u65E0\u8F7D\u4F53\uFF0C\u964D\u7EA7\u4E3A\u666E\u901A\u6392\u5217 + \u53EF\u89C2\u5BDF\u63D0\u793A\uFF1B\u9700\u7FFB\u9875\u8BF7\u7528 p-scroll-view \u7684 paging-enabled",
4318
+ loop: "\u56DE\u73AF\u4F9D\u8D56\u5438\u9644\u5BB9\u5668\uFF0C\u800C\u5C0F\u7A0B\u5E8F view \u4E0D\u6EDA\u52A8\uFF08S14\uFF09\u2192 \u4E00\u5E76\u964D\u7EA7\u4E3A\u666E\u901A\u6392\u5217 + \u53EF\u89C2\u5BDF\u63D0\u793A"
4319
+ }
4320
+ };
4321
+ var RULE_REGISTERED_PROPS = [
4322
+ ...Object.keys(PRIVATE_WEB_FALLBACK),
4323
+ ...Object.keys(STYLE_WEB_FALLBACK),
4324
+ ...Object.keys(WEB_EXTENSION_MP_FALLBACK),
4325
+ ...Object.keys(MP_HOST_WEB_FALLBACK),
4326
+ ...Object.values(TAG_PROP_MP_FALLBACK).flatMap((m) => Object.keys(m))
4327
+ ];
4328
+ var HOST_FALLBACK_TAGS = Object.keys(HOST_TAGS);
4329
+ function degradeProp(tag, prop) {
4330
+ const style = STYLE_WEB_FALLBACK[prop];
4331
+ if (style) return { mp: "supported", web: "fallback", behavior: style };
4332
+ const priv = PRIVATE_WEB_FALLBACK[prop];
4333
+ if (priv) return { mp: "supported", web: "fallback", behavior: priv };
4334
+ const mpHost = MP_HOST_WEB_FALLBACK[prop];
4335
+ if (mpHost) return { mp: "supported", web: "fallback", behavior: mpHost };
4336
+ if (tag && HOST_TAGS[tag]) {
4337
+ return { mp: "supported", web: "fallback", behavior: HOST_TAGS[tag] };
4338
+ }
4339
+ const tagProp = tag ? TAG_PROP_MP_FALLBACK[tag] : void 0;
4340
+ const tagPropBehavior = tagProp ? tagProp[prop] : void 0;
4341
+ if (tagPropBehavior) return { mp: "fallback", web: "supported", behavior: tagPropBehavior };
4342
+ const webExt = WEB_EXTENSION_MP_FALLBACK[prop];
4343
+ if (webExt) return { mp: "fallback", web: "supported", behavior: webExt };
4344
+ return { mp: "supported", web: "supported" };
4345
+ }
4346
+ function degradationOf(prim) {
4347
+ const out = {};
4348
+ for (const p of prim.props ?? []) out[p] = degradeProp(prim.tag, p);
4349
+ return out;
4350
+ }
4351
+ var DEGRADATION_TABLE = (() => {
4352
+ const out = {};
4353
+ for (const prim of PRIMITIVE_CATALOG) {
4354
+ if (!prim.tag) continue;
4355
+ out[prim.tag] = degradationOf(prim);
4356
+ }
4357
+ return out;
4358
+ })();
4359
+ var MP_UNSUPPORTED_PROPS = (() => {
4360
+ const kebab = (s) => s.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
4361
+ const out = {};
4362
+ for (const [tag, table] of Object.entries(DEGRADATION_TABLE)) {
4363
+ const set = /* @__PURE__ */ new Set();
4364
+ for (const [prop, entry] of Object.entries(table)) {
4365
+ if (entry.mp === "unsupported") set.add(kebab(prop));
4366
+ }
4367
+ if (set.size) out[tag] = set;
4368
+ }
4369
+ return out;
4370
+ })();
4371
+
4372
+ // ../render-backend/src/dispatcher.ts
4054
4373
  var DispatcherError = class extends Error {
4055
4374
  constructor(code, detail) {
4056
4375
  super(`unknown primitive tag: ${detail.type}\uFF08\u987B\u5728 G-32 \u539F\u8BED\u8868\u5185\uFF0C\u7F16\u8BD1\u671F\u62E6\u622A\uFF1B\u8FD0\u884C\u671F\u515C\u5E95\uFF09`);
@@ -4068,6 +4387,8 @@ ${summary}
4068
4387
  }
4069
4388
  return root;
4070
4389
  }
4390
+
4391
+ // ../render-backend/src/host-conformance.ts
4071
4392
  function createHostRuntimeStub() {
4072
4393
  const rt = {
4073
4394
  id: "terminal",
@@ -4276,11 +4597,15 @@ ${summary}
4276
4597
  r.destroy();
4277
4598
  assert(r.state === "destroyed", "destroy \u540E\u72B6\u6001\u5E94\u4E3A destroyed");
4278
4599
  });
4600
+
4601
+ // ../render-backend/src/container-spi.ts
4279
4602
  var DEFAULT_STACK_POLICY = {
4280
4603
  maxDepth: 10,
4281
4604
  overflowStrategy: "destroy-oldest",
4282
4605
  keepAlive: { maxCount: 3, memoryBudgetBytes: 64 * 1024 * 1024 }
4283
4606
  };
4607
+
4608
+ // ../render-backend/src/ownership.ts
4284
4609
  var OwnershipGraph = class {
4285
4610
  constructor(opts = {}) {
4286
4611
  this.nodes = /* @__PURE__ */ new Map();
@@ -4379,6 +4704,8 @@ ${summary}
4379
4704
  if (!singletonGraph) singletonGraph = new OwnershipGraph();
4380
4705
  return singletonGraph;
4381
4706
  }
4707
+
4708
+ // ../render-backend/src/container-conformance.ts
4382
4709
  var FORK_SIGNATURES = [
4383
4710
  /packages\/core\/src\//,
4384
4711
  // 框架源码副本
@@ -4609,6 +4936,8 @@ ${summary}
4609
4936
  const hits = scanRepoForFork({ "host/vendor/core.js": "import x from '@proteus/core/internal/diff';" });
4610
4937
  assert2(hits.length > 0, "fork \u4ED3\u5E93\u5E94\u88AB\u68C0\u51FA");
4611
4938
  });
4939
+
4940
+ // ../render-backend/src/superapp-container.ts
4612
4941
  var DEFAULT_SUPERAPP_POLICY = {
4613
4942
  maxDepth: 10,
4614
4943
  overflowStrategy: "destroy-oldest",
@@ -4617,6 +4946,8 @@ ${summary}
4617
4946
  crash: { isolationLevel: 2, autoRestart: true, maxRestartCount: 3 },
4618
4947
  security: { requireSignature: true, capabilityWhitelist: ["camera", "location", "storage"] }
4619
4948
  };
4949
+
4950
+ // ../render-backend/src/ownership-observability.ts
4620
4951
  function createOwnershipHistory(graph, opts = {}) {
4621
4952
  const limit = opts.limit ?? 2e3;
4622
4953
  let records = [];
@@ -4644,7 +4975,7 @@ ${summary}
4644
4975
  push({ ts: m.ts, kind: k === "borrows" ? "borrow" : k, from: m.edge.from, to: m.edge.to });
4645
4976
  }
4646
4977
  });
4647
- const history = {
4978
+ const history2 = {
4648
4979
  get records() {
4649
4980
  return records;
4650
4981
  },
@@ -4666,7 +4997,7 @@ ${summary}
4666
4997
  records = [];
4667
4998
  }
4668
4999
  };
4669
- return history;
5000
+ return history2;
4670
5001
  }
4671
5002
  function createOwnershipCounters(graph) {
4672
5003
  let alive = 0;
@@ -4757,10 +5088,10 @@ ${summary}
4757
5088
  }
4758
5089
  return { aliveNodes: stats.alive, totalNodes: stats.total, orphans, leaks, longBorrows, crossPageRefs };
4759
5090
  }
4760
- function buildOwnershipTimeline(history, graph) {
5091
+ function buildOwnershipTimeline(history2, graph) {
4761
5092
  const events = [];
4762
5093
  const allocById = /* @__PURE__ */ new Map();
4763
- for (const rec of history.records) {
5094
+ for (const rec of history2.records) {
4764
5095
  if (rec.kind === "alloc" && rec.id) {
4765
5096
  allocById.set(rec.id, rec);
4766
5097
  events.push(rec);
@@ -4781,7 +5112,7 @@ ${summary}
4781
5112
  function createOwnershipTracer(options = {}) {
4782
5113
  const graph = options.graph ?? getProteusOwnershipGraph();
4783
5114
  const counters = createOwnershipCounters(graph);
4784
- const history = options.history ?? createOwnershipHistory(graph);
5115
+ const history2 = options.history ?? createOwnershipHistory(graph);
4785
5116
  let disposed = false;
4786
5117
  function collect() {
4787
5118
  if (disposed) {
@@ -4794,10 +5125,10 @@ ${summary}
4794
5125
  }
4795
5126
  const diagnosis = diagnoseOwnershipIssues(graph);
4796
5127
  const seenAllocIds = /* @__PURE__ */ new Set();
4797
- for (const r of history.records) {
5128
+ for (const r of history2.records) {
4798
5129
  if (r.kind === "alloc" && r.id) seenAllocIds.add(r.id);
4799
5130
  }
4800
- const merged = [...history.records];
5131
+ const merged = [...history2.records];
4801
5132
  for (const n of graph.nodes.values()) {
4802
5133
  if (!seenAllocIds.has(n.id)) {
4803
5134
  merged.push({ ts: n.createdAt, kind: "alloc", id: n.id, owner: n.owner, type: n.type, byteSize: n.byteSize, sourceLocation: n.sourceLocation });
@@ -4842,7 +5173,7 @@ ${summary}
4842
5173
  collect,
4843
5174
  dispose() {
4844
5175
  disposed = true;
4845
- history.dispose();
5176
+ history2.dispose();
4846
5177
  }
4847
5178
  };
4848
5179
  }
@@ -4920,7 +5251,7 @@ ${summary}
4920
5251
  };
4921
5252
  }
4922
5253
 
4923
- // ../../node_modules/@vue/devtools-shared/dist/index.js
5254
+ // ../../node_modules/.pnpm/@vue+devtools-shared@8.2.1/node_modules/@vue/devtools-shared/dist/index.js
4924
5255
  var __create = Object.create;
4925
5256
  var __defProp2 = Object.defineProperty;
4926
5257
  var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
@@ -5101,7 +5432,7 @@ ${summary}
5101
5432
  }
5102
5433
  var deepClone = (0, import_rfdc.default)({ circles: true });
5103
5434
 
5104
- // ../../node_modules/perfect-debounce/dist/index.mjs
5435
+ // ../../node_modules/.pnpm/perfect-debounce@2.1.0/node_modules/perfect-debounce/dist/index.mjs
5105
5436
  var DEBOUNCE_DEFAULTS = { trailing: true };
5106
5437
  function debounce(fn, wait = 25, options = {}) {
5107
5438
  options = {
@@ -5170,7 +5501,7 @@ ${summary}
5170
5501
  return await fn.apply(_this, args);
5171
5502
  }
5172
5503
 
5173
- // ../../node_modules/hookable/dist/index.mjs
5504
+ // ../../node_modules/.pnpm/hookable@5.5.3/node_modules/hookable/dist/index.mjs
5174
5505
  function flatHooks(configHooks, hooks2 = {}, parentName) {
5175
5506
  for (const key in configHooks) {
5176
5507
  const subHook = configHooks[key];
@@ -5375,7 +5706,7 @@ ${summary}
5375
5706
  return new Hookable();
5376
5707
  }
5377
5708
 
5378
- // ../../node_modules/@vue/devtools-kit/dist/index.js
5709
+ // ../../node_modules/.pnpm/@vue+devtools-kit@8.2.1/node_modules/@vue/devtools-kit/dist/index.js
5379
5710
  var __create2 = Object.create;
5380
5711
  var __defProp3 = Object.defineProperty;
5381
5712
  var __getOwnPropDesc3 = Object.getOwnPropertyDescriptor;
@@ -8652,6 +8983,166 @@ ${summary}
8652
8983
  target.__VUE_DEVTOOLS_KIT_BROADCAST_RPC_SERVER__ ??= null;
8653
8984
  var MAX_SERIALIZED_SIZE = 2 * 1024 * 1024;
8654
8985
 
8986
+ // ../shared/src/platform/mp-adapter.ts
8987
+ function norm(p) {
8988
+ return { route: p.route || p.__route__ || "", setData: p.setData?.bind(p) };
8989
+ }
8990
+ function normalizeRect(rect) {
8991
+ if (!rect || typeof rect.left !== "number" || typeof rect.top !== "number") return null;
8992
+ return {
8993
+ top: rect.top,
8994
+ left: rect.left,
8995
+ right: typeof rect.right === "number" ? rect.right : rect.left,
8996
+ bottom: typeof rect.bottom === "number" ? rect.bottom : rect.top,
8997
+ width: typeof rect.width === "number" ? rect.width : rect.right - rect.left,
8998
+ height: typeof rect.height === "number" ? rect.height : rect.bottom - rect.top
8999
+ };
9000
+ }
9001
+ function createMpAdapter() {
9002
+ return {
9003
+ isMP: true,
9004
+ getCurrentPages: () => {
9005
+ if (typeof wx === "undefined" || typeof getCurrentPages !== "function") return [];
9006
+ return getCurrentPages().map(norm);
9007
+ },
9008
+ navigateTo: (opts) => new Promise((resolve) => {
9009
+ wx.navigateTo({ url: opts.url, success: () => resolve(), fail: () => resolve() });
9010
+ }),
9011
+ redirectTo: (opts) => new Promise((resolve) => {
9012
+ wx.redirectTo({ url: opts.url, success: () => resolve(), fail: () => resolve() });
9013
+ }),
9014
+ reLaunch: (opts) => new Promise((resolve) => {
9015
+ wx.reLaunch({ url: opts.url, success: () => resolve(), fail: () => resolve() });
9016
+ }),
9017
+ switchTab: (opts) => new Promise((resolve) => {
9018
+ wx.switchTab({ url: opts.url, success: () => resolve(), fail: () => resolve() });
9019
+ }),
9020
+ navigateBack: ({ delta }) => {
9021
+ wx.navigateBack({ delta });
9022
+ },
9023
+ measureRect: (selector, scope) => (
9024
+ // ★平台层许可直接碰 wx.*(no-platform-api 审计 allow: platforms/**/packages/api/**);组件经此 L2 抽象消费
9025
+ new Promise((resolve) => {
9026
+ if (typeof wx === "undefined" || typeof wx.createSelectorQuery !== "function") return resolve(null);
9027
+ const scopeQ = scope;
9028
+ const inQuery = scopeQ && typeof scopeQ.createSelectorQuery === "function" ? scopeQ.createSelectorQuery() : wx.createSelectorQuery();
9029
+ inQuery.select(selector).boundingClientRect((rect) => resolve(normalizeRect(rect))).exec();
9030
+ })
9031
+ )
9032
+ };
9033
+ }
9034
+
9035
+ // ../shared/src/platform/web-adapter.ts
9036
+ function parseQuery(url) {
9037
+ const q = url.split("?")[1] || "";
9038
+ const out = {};
9039
+ for (const seg of q.split("&").filter(Boolean)) {
9040
+ const [k, v] = seg.split("=");
9041
+ if (k) out[decodeURIComponent(k)] = decodeURIComponent(v || "");
9042
+ }
9043
+ return out;
9044
+ }
9045
+ function createWebAdapter() {
9046
+ const listeners = [];
9047
+ const hasBrowserEnv = typeof location !== "undefined" && typeof history !== "undefined";
9048
+ let current = { route: hasBrowserEnv ? location.pathname.replace(/^\//, "") : "" };
9049
+ let historyIndex = hasBrowserEnv ? history.state?.proteusIndex ?? 0 : 0;
9050
+ const emit = (url, routeType, nav = "forward") => {
9051
+ current = { route: url.split("?")[0].replace(/^\//, ""), routeType };
9052
+ listeners.forEach((l) => l(current.route, parseQuery(url), routeType, nav));
9053
+ };
9054
+ if (hasBrowserEnv) {
9055
+ window.addEventListener("popstate", (e) => {
9056
+ const stateIndex = e.state?.proteusIndex;
9057
+ let nav = "forward";
9058
+ if (typeof stateIndex === "number") {
9059
+ nav = stateIndex < historyIndex ? "back" : "forward";
9060
+ historyIndex = stateIndex;
9061
+ }
9062
+ emit(location.pathname + location.search, void 0, nav);
9063
+ });
9064
+ document.addEventListener("click", (e) => {
9065
+ if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
9066
+ const target2 = e.target;
9067
+ const anchor = target2?.closest?.("a[href]");
9068
+ if (!anchor) return;
9069
+ const href = anchor.getAttribute("href") || "";
9070
+ if (anchor.target === "_blank" || !href.startsWith("/")) return;
9071
+ e.preventDefault();
9072
+ const routeType = anchor.getAttribute("route-type") || void 0;
9073
+ historyIndex += 1;
9074
+ history.pushState({ proteusIndex: historyIndex }, "", href);
9075
+ emit(href, routeType, "forward");
9076
+ });
9077
+ }
9078
+ return {
9079
+ isMP: false,
9080
+ getCurrentPages: () => [current],
9081
+ navigateTo: async ({ url, routeType }) => {
9082
+ historyIndex += 1;
9083
+ history.pushState({ proteusIndex: historyIndex }, "", url);
9084
+ emit(url, routeType, "forward");
9085
+ },
9086
+ redirectTo: async ({ url }) => {
9087
+ history.replaceState({ proteusIndex: historyIndex }, "", url);
9088
+ emit(url, void 0, "replace");
9089
+ },
9090
+ reLaunch: async ({ url }) => {
9091
+ history.replaceState({ proteusIndex: historyIndex }, "", url);
9092
+ emit(url, void 0, "reLaunch");
9093
+ },
9094
+ switchTab: async ({ url }) => {
9095
+ history.replaceState({ proteusIndex: historyIndex }, "", url);
9096
+ emit(url, void 0, "switchTab");
9097
+ },
9098
+ navigateBack: ({ delta }) => {
9099
+ history.go(-delta);
9100
+ },
9101
+ measureRect: (selector, scope) => new Promise((resolve) => {
9102
+ if (typeof document === "undefined" || typeof document.querySelector !== "function") return resolve(null);
9103
+ const root = scope && typeof scope.querySelector === "function" ? scope : document;
9104
+ const el = root.querySelector(selector);
9105
+ if (!el || typeof el.getBoundingClientRect !== "function") return resolve(null);
9106
+ const r = el.getBoundingClientRect();
9107
+ resolve({
9108
+ top: r.top,
9109
+ left: r.left,
9110
+ right: r.right,
9111
+ bottom: r.bottom,
9112
+ width: r.width,
9113
+ height: r.height
9114
+ });
9115
+ }),
9116
+ onPageLoad: (cb) => {
9117
+ listeners.push(cb);
9118
+ }
9119
+ };
9120
+ }
9121
+
9122
+ // ../shared/src/platform/index.ts
9123
+ var import_meta = {};
9124
+ function detectMPRuntime() {
9125
+ if (typeof window !== "undefined") return false;
9126
+ try {
9127
+ return typeof wx !== "undefined" && (typeof wx.getSystemInfoSync === "function" || typeof wx.getWindowInfo === "function");
9128
+ } catch (e) {
9129
+ return false;
9130
+ }
9131
+ }
9132
+ var modeMP = import_meta.env?.MODE === "mp-weixin";
9133
+ var isMP = modeMP || detectMPRuntime();
9134
+ var adapter = isMP ? createMpAdapter() : createWebAdapter();
9135
+
9136
+ // ../shared/src/platform/runtime.ts
9137
+ function detectRuntime() {
9138
+ if (typeof window !== "undefined") return "web";
9139
+ try {
9140
+ if (typeof wx !== "undefined" && wx) return "mp";
9141
+ } catch {
9142
+ }
9143
+ return "web";
9144
+ }
9145
+
8655
9146
  // ../capabilities/src/adapter.ts
8656
9147
  var CapabilityRegistry = class {
8657
9148
  constructor() {
@@ -8703,20 +9194,20 @@ ${summary}
8703
9194
  return this.requireds.get(capability) ?? false;
8704
9195
  }
8705
9196
  /** 注册 adapter(同 capability+platform 重复 → 报错,编译期约束 §7;按 priority 降序排序) */
8706
- register(adapter) {
8707
- const list = this.adapters.get(adapter.capability) ?? [];
8708
- if (list.some((a) => a.platform === adapter.platform)) {
8709
- throw new Error(`[proteus-capabilities] \u80FD\u529B "${adapter.capability}" \u7684 "${adapter.platform}" \u5E73\u53F0\u91CD\u590D\u6CE8\u518C adapter\uFF08\u7F16\u8BD1\u671F\u7EA6\u675F\uFF1A\u540C capability+platform \u552F\u4E00\uFF09`);
9197
+ register(adapter2) {
9198
+ const list = this.adapters.get(adapter2.capability) ?? [];
9199
+ if (list.some((a) => a.platform === adapter2.platform)) {
9200
+ throw new Error(`[proteus-capabilities] \u80FD\u529B "${adapter2.capability}" \u7684 "${adapter2.platform}" \u5E73\u53F0\u91CD\u590D\u6CE8\u518C adapter\uFF08\u7F16\u8BD1\u671F\u7EA6\u675F\uFF1A\u540C capability+platform \u552F\u4E00\uFF09`);
8710
9201
  }
8711
- list.push(adapter);
9202
+ list.push(adapter2);
8712
9203
  list.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
8713
- this.adapters.set(adapter.capability, list);
9204
+ this.adapters.set(adapter2.capability, list);
8714
9205
  }
8715
9206
  /** 批量注册(幂等语义:已存在同 id+platform 则跳过——scan 场景) */
8716
- registerIdempotent(adapter) {
8717
- const list = this.adapters.get(adapter.capability) ?? [];
8718
- if (list.some((a) => a.platform === adapter.platform)) return;
8719
- this.register(adapter);
9207
+ registerIdempotent(adapter2) {
9208
+ const list = this.adapters.get(adapter2.capability) ?? [];
9209
+ if (list.some((a) => a.platform === adapter2.platform)) return;
9210
+ this.register(adapter2);
8720
9211
  }
8721
9212
  /** 能力是否已注册任何 adapter */
8722
9213
  has(capability) {
@@ -8735,10 +9226,10 @@ ${summary}
8735
9226
  async resolve(id, platform = detectPlatform()) {
8736
9227
  const list = this.adapters.get(id) ?? [];
8737
9228
  const candidates = platform ? list.filter((a) => a.platform === platform) : list;
8738
- for (const adapter of candidates) {
9229
+ for (const adapter2 of candidates) {
8739
9230
  try {
8740
- if (await adapter.isSupported()) {
8741
- return this.wrap(adapter, platform);
9231
+ if (await adapter2.isSupported()) {
9232
+ return this.wrap(adapter2, platform);
8742
9233
  }
8743
9234
  } catch {
8744
9235
  }
@@ -8756,10 +9247,10 @@ ${summary}
8756
9247
  /** 同步解析(isSupported 为同步时可用;异步探测的 adapter 返回 undefined) */
8757
9248
  resolveSync(id, platform = detectPlatform()) {
8758
9249
  const list = this.adapters.get(id) ?? [];
8759
- for (const adapter of list.filter((a) => a.platform === platform)) {
9250
+ for (const adapter2 of list.filter((a) => a.platform === platform)) {
8760
9251
  try {
8761
- const supported = adapter.isSupported();
8762
- if (typeof supported === "boolean" && supported) return this.wrap(adapter, platform);
9252
+ const supported = adapter2.isSupported();
9253
+ if (typeof supported === "boolean" && supported) return this.wrap(adapter2, platform);
8763
9254
  } catch {
8764
9255
  }
8765
9256
  }
@@ -8773,23 +9264,23 @@ ${summary}
8773
9264
  this.emitDetect(id, platform, false);
8774
9265
  return void 0;
8775
9266
  }
8776
- wrap(adapter, platform) {
8777
- const api = adapter.create();
9267
+ wrap(adapter2, platform) {
9268
+ const api = adapter2.create();
8778
9269
  const cap2 = {
8779
- meta: { id: adapter.capability, tier: 2, name: adapter.capability },
9270
+ meta: { id: adapter2.capability, tier: 2, name: adapter2.capability },
8780
9271
  api,
8781
- isSupported: () => adapter.isSupported()
9272
+ isSupported: () => adapter2.isSupported()
8782
9273
  };
8783
- const fb = this.fallbacks.get(adapter.capability);
9274
+ const fb = this.fallbacks.get(adapter2.capability);
8784
9275
  let fallbackId;
8785
- if (fb && fb !== adapter.capability) {
9276
+ if (fb && fb !== adapter2.capability) {
8786
9277
  const fbCap = this.resolveSync(fb, platform);
8787
9278
  if (fbCap) {
8788
9279
  cap2.fallback = fbCap;
8789
9280
  fallbackId = fb;
8790
9281
  }
8791
9282
  }
8792
- this.emitDetect(adapter.capability, platform, true, fallbackId);
9283
+ this.emitDetect(adapter2.capability, platform, true, fallbackId);
8793
9284
  return cap2;
8794
9285
  }
8795
9286
  /** 已注册的(capability, platform)集合(审计/DevTools) */
@@ -8814,8 +9305,7 @@ ${summary}
8814
9305
  }
8815
9306
  };
8816
9307
  function detectPlatform() {
8817
- const wxGlobal = globalThis.wx;
8818
- return typeof wxGlobal !== "undefined" ? "skyline" : "web";
9308
+ return detectRuntime() === "mp" ? "skyline" : "web";
8819
9309
  }
8820
9310
 
8821
9311
  // ../capabilities/src/index.ts