openxiangda 1.0.268 → 1.0.270
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -1
- package/lib/cli.js +417 -24
- package/lib/config.js +60 -56
- package/lib/design-gates.js +18 -0
- package/lib/migration-advice.js +19 -0
- package/lib/release-plan.js +2 -0
- package/lib/workspace-init.js +11 -4
- package/openxiangda-skills/SKILL.md +8 -0
- package/openxiangda-skills/references/architecture-patterns.md +218 -218
- package/openxiangda-skills/references/component-guide.md +122 -122
- package/openxiangda-skills/references/openxiangda-api.md +12 -0
- package/openxiangda-skills/references/platform-data-model.md +285 -285
- package/openxiangda-skills/references/resource-manifest-cheatsheet.md +32 -2
- package/openxiangda-skills/references/troubleshooting.md +224 -224
- package/openxiangda-skills/references/webhooks.md +213 -0
- package/openxiangda-skills/references/workspace-state.md +1 -1
- package/openxiangda-skills/skills/openxiangda-core/SKILL.md +1 -1
- package/openxiangda-skills/skills/openxiangda-workflow-automation/SKILL.md +3 -0
- package/package.json +26 -23
- package/packages/sdk/dist/{ProcessPreview-Cyk6uv-w.d.mts → ProcessPreview-DSUIJi5V.d.mts} +2 -3
- package/packages/sdk/dist/{ProcessPreview-Cyk6uv-w.d.ts → ProcessPreview-DSUIJi5V.d.ts} +2 -3
- package/packages/sdk/dist/components/index.d.mts +41 -42
- package/packages/sdk/dist/components/index.d.ts +41 -42
- package/packages/sdk/dist/{dataManagementApi-CE8Zyj3a.d.ts → dataManagementApi-Ro9itwm8.d.ts} +2 -2
- package/packages/sdk/dist/{dataManagementApi-4fSaCA5t.d.mts → dataManagementApi-p_HOhQnA.d.mts} +2 -2
- package/packages/sdk/dist/runtime/index.d.mts +3 -4
- package/packages/sdk/dist/runtime/index.d.ts +3 -4
- package/packages/sdk/dist/runtime/react.d.mts +5 -5
- package/packages/sdk/dist/runtime/react.d.ts +5 -5
- package/packages/sdk/src/build-source/scripts/utils/mime-types.mjs +70 -70
- package/packages/sdk/src/build-source/scripts/utils/oss-client.mjs +128 -128
- package/packages/sdk/src/build-source/scripts/utils/progress.mjs +57 -57
- package/templates/openxiangda-react-spa/.cursor/rules/openxiangda-resources.mdc +1 -0
- package/templates/openxiangda-react-spa/.cursor/rules/openxiangda.mdc +6 -0
- package/templates/openxiangda-react-spa/.qoder/rules/openxiangda-resources.md +1 -0
- package/templates/openxiangda-react-spa/.qoder/rules/openxiangda.md +6 -0
- package/templates/openxiangda-react-spa/AGENTS.md +8 -0
- package/templates/sy-lowcode-app-workspace/.cursor/rules/openxiangda-resources.mdc +2 -0
- package/templates/sy-lowcode-app-workspace/.cursor/rules/openxiangda.mdc +7 -1
- package/templates/sy-lowcode-app-workspace/.qoder/rules/openxiangda-resources.md +1 -0
- package/templates/sy-lowcode-app-workspace/.qoder/rules/openxiangda.md +7 -1
- package/templates/sy-lowcode-app-workspace/AGENTS.md +9 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Component Guide
|
|
2
|
-
|
|
3
|
-
> 面向 AI Agent 的组件使用策略:优先复用平台组件,按需基于 antd / antd-mobile 包装,绝不重造已存在的平台能力。
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
1
|
+
# Component Guide
|
|
2
|
+
|
|
3
|
+
> 面向 AI Agent 的组件使用策略:优先复用平台组件,按需基于 antd / antd-mobile 包装,绝不重造已存在的平台能力。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
7
|
## 1. 核心原则
|
|
8
8
|
|
|
9
9
|
1. **平台组件优先**:表单录入、平台数据选择、文件能力和数据管理默认先用 `openxiangda` 平台组件。它们已经接入组织架构、文件存储、权限、多端适配和平台数据格式,重写一遍 = 丢能力 + 后续无法维护。
|
|
@@ -52,23 +52,23 @@ AI 在实现成熟交互前必须先判断是否已有可靠组件或库:
|
|
|
52
52
|
5. 新增依赖或平台能力缺口后,通过 `openxiangda feedback submit --yes` 反馈选择原因或能力缺口。
|
|
53
53
|
|
|
54
54
|
---
|
|
55
|
-
|
|
56
|
-
## 2. 必须使用平台组件(重做即丢能力)
|
|
57
|
-
|
|
58
|
-
| 场景 | 平台组件 | 不重做的原因 | 自动接入的能力 |
|
|
59
|
-
| --- | --- | --- | --- |
|
|
60
|
-
| 选择人员 | `UserSelectField` | 直接接入组织架构 | 人员列表、搜索、按部门筛选、层级树 |
|
|
61
|
-
| 选择部门 | `DepartmentSelectField` | 直接接入组织架构 | 部门树、搜索、多选 |
|
|
55
|
+
|
|
56
|
+
## 2. 必须使用平台组件(重做即丢能力)
|
|
57
|
+
|
|
58
|
+
| 场景 | 平台组件 | 不重做的原因 | 自动接入的能力 |
|
|
59
|
+
| --- | --- | --- | --- |
|
|
60
|
+
| 选择人员 | `UserSelectField` | 直接接入组织架构 | 人员列表、搜索、按部门筛选、层级树 |
|
|
61
|
+
| 选择部门 | `DepartmentSelectField` | 直接接入组织架构 | 部门树、搜索、多选 |
|
|
62
62
|
| 上传附件 | `AttachmentField` | 接入平台存储或声明式 OSS 存储 | 上传、预览、下载、鉴权 URL 或真实 OSS URL |
|
|
63
|
-
| 上传图片 | `ImageField` | 接入平台存储 | 上传、压缩、缩略图、预览 |
|
|
64
|
-
| 富文本编辑 | `EditorField` | 含图片上传集成 | 完整工具栏、平台图床、粘贴清洗 |
|
|
65
|
-
| 数字签名 | `DigitalSignatureField` | 平台级签名 | 签名采集、验证、归档 |
|
|
66
|
-
| 地理位置 | `LocationField` | 接入地图服务 | 定位、地图选点、地址解析 |
|
|
63
|
+
| 上传图片 | `ImageField` | 接入平台存储 | 上传、压缩、缩略图、预览 |
|
|
64
|
+
| 富文本编辑 | `EditorField` | 含图片上传集成 | 完整工具栏、平台图床、粘贴清洗 |
|
|
65
|
+
| 数字签名 | `DigitalSignatureField` | 平台级签名 | 签名采集、验证、归档 |
|
|
66
|
+
| 地理位置 | `LocationField` | 接入地图服务 | 定位、地图选点、地址解析 |
|
|
67
67
|
| 数据管理列表 | `DataManagementList` | 接入数据查询 API | 分页、筛选、导出、批量操作、字段权限、后端 action summary 按钮控制 |
|
|
68
|
-
|
|
69
|
-
### 示例
|
|
70
|
-
|
|
71
|
-
```tsx
|
|
68
|
+
|
|
69
|
+
### 示例
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
72
|
import {
|
|
73
73
|
UserSelectField,
|
|
74
74
|
DepartmentSelectField,
|
|
@@ -113,7 +113,7 @@ form actions、`scope_policy` 或 App Function 服务端校验。
|
|
|
113
113
|
> ✅ 一句话原则:**这些场景看到了,直接抄上表,不要自己写。**
|
|
114
114
|
|
|
115
115
|
---
|
|
116
|
-
|
|
116
|
+
|
|
117
117
|
## 3. 推荐使用平台组件(可自定义但不建议从零重做)
|
|
118
118
|
|
|
119
119
|
| 场景 | 平台组件 | 何时考虑自定义 |
|
|
@@ -129,45 +129,45 @@ form actions、`scope_policy` 或 App Function 服务端校验。
|
|
|
129
129
|
| 表单容器 | `FormProvider` + `FormRenderer` | 需要极度定制布局(分栏、Tab 嵌套表单) |
|
|
130
130
|
| 审批时间线 | `ApprovalTimeline` | 需要自定义节点渲染(增加业务标签、跳转链接) |
|
|
131
131
|
| 摘要卡片 | `FormSummaryCard` | 需要高度自定义字段展示样式 |
|
|
132
|
-
|
|
133
|
-
自定义时仍应**包装**这些组件,而不是从 antd 从零实现一遍。
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## 4. 自定义组件开发规范
|
|
138
|
-
|
|
132
|
+
|
|
133
|
+
自定义时仍应**包装**这些组件,而不是从 antd 从零实现一遍。
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 4. 自定义组件开发规范
|
|
138
|
+
|
|
139
139
|
### 4.1 推荐:平台组件缺失时,基于 antd 包装 + 原生 Tailwind 类
|
|
140
140
|
|
|
141
141
|
先判断平台组件确实不能满足;如果是平台能力缺口,先用 `openxiangda feedback submit --yes` 反馈,再写本地包装作为临时方案。
|
|
142
|
-
|
|
143
|
-
```tsx
|
|
144
|
-
import { Select, SelectProps } from 'antd';
|
|
145
|
-
import clsx from 'clsx';
|
|
146
|
-
|
|
147
|
-
type Option = { label: string; value: string };
|
|
148
|
-
|
|
149
|
-
interface CustomSelectProps extends Omit<SelectProps, 'options'> {
|
|
150
|
-
options: Option[];
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export function CustomSelect({ options, className, ...rest }: CustomSelectProps) {
|
|
154
|
-
return (
|
|
142
|
+
|
|
143
|
+
```tsx
|
|
144
|
+
import { Select, SelectProps } from 'antd';
|
|
145
|
+
import clsx from 'clsx';
|
|
146
|
+
|
|
147
|
+
type Option = { label: string; value: string };
|
|
148
|
+
|
|
149
|
+
interface CustomSelectProps extends Omit<SelectProps, 'options'> {
|
|
150
|
+
options: Option[];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function CustomSelect({ options, className, ...rest }: CustomSelectProps) {
|
|
154
|
+
return (
|
|
155
155
|
<Select
|
|
156
156
|
className={clsx('w-full rounded-md', className)}
|
|
157
157
|
getPopupContainer={(trigger) => trigger.parentElement ?? document.body}
|
|
158
158
|
options={options}
|
|
159
159
|
{...rest}
|
|
160
|
-
/>
|
|
161
|
-
);
|
|
162
|
-
}
|
|
163
|
-
```
|
|
164
|
-
|
|
160
|
+
/>
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
165
|
要点:
|
|
166
166
|
- 透传 `...rest`,保留 antd 全部 API。
|
|
167
167
|
- `getPopupContainer` 解决弹层被裁切问题(详见第 7 节常见错误)。
|
|
168
168
|
- 默认 `cssIsolation: "none"` 时不要额外给弹层加 `sy-app-workspace`;只有 legacy `namespace/shadow` 页面才需要给弹层或容器补 namespace class。
|
|
169
169
|
- 使用 `w-full`、`rounded-md`、`text-slate-600`、`border-slate-200` 等 Tailwind 原生类作为默认基线;如果组件视觉需要精调,可以继续使用 Tailwind 任意值或局部 CSS。
|
|
170
|
-
|
|
170
|
+
|
|
171
171
|
### 4.2 错误:从头实现选择器或原生表单控件
|
|
172
172
|
|
|
173
173
|
```tsx
|
|
@@ -176,13 +176,13 @@ export function CustomSelect({ options, className, ...rest }: CustomSelectProps)
|
|
|
176
176
|
function BadSelect({ options }) {
|
|
177
177
|
return (
|
|
178
178
|
<div style={{ border: '1px solid #d9d9d9', borderRadius: '4px', padding: '4px 11px' }}>
|
|
179
|
-
{options.map((opt) => (
|
|
180
|
-
<div key={opt.value} onClick={() => /* ... */}>
|
|
181
|
-
{opt.label}
|
|
182
|
-
</div>
|
|
183
|
-
))}
|
|
184
|
-
</div>
|
|
185
|
-
);
|
|
179
|
+
{options.map((opt) => (
|
|
180
|
+
<div key={opt.value} onClick={() => /* ... */}>
|
|
181
|
+
{opt.label}
|
|
182
|
+
</div>
|
|
183
|
+
))}
|
|
184
|
+
</div>
|
|
185
|
+
);
|
|
186
186
|
}
|
|
187
187
|
```
|
|
188
188
|
|
|
@@ -199,89 +199,89 @@ function BadSelect({ options }) {
|
|
|
199
199
|
- 移动端无适配。
|
|
200
200
|
- 平台主题升级时不会跟随。
|
|
201
201
|
- 绕过平台表单 schema、字段权限、文件鉴权、组织架构和标准数据格式。
|
|
202
|
-
|
|
203
|
-
---
|
|
204
|
-
|
|
205
|
-
## 5. 平台组件的样式自定义
|
|
206
|
-
|
|
207
|
-
按推荐顺序由轻到重:
|
|
208
|
-
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## 5. 平台组件的样式自定义
|
|
206
|
+
|
|
207
|
+
按推荐顺序由轻到重:
|
|
208
|
+
|
|
209
209
|
1. **className 注入 Tailwind 原生类**
|
|
210
|
-
```tsx
|
|
211
|
-
<UserSelectField className="w-full max-w-md" />
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
2. **CSS 变量覆盖**
|
|
215
|
-
```css
|
|
216
|
-
/* src/index.css */
|
|
217
|
-
:root,
|
|
218
|
-
.sy-app-workspace {
|
|
219
|
-
/* 调整表单控件圆角和品牌色 */
|
|
220
|
-
--sy-radius-md: 8px;
|
|
221
|
-
--sy-color-primary: #2563eb;
|
|
222
|
-
}
|
|
223
|
-
```
|
|
224
|
-
|
|
210
|
+
```tsx
|
|
211
|
+
<UserSelectField className="w-full max-w-md" />
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
2. **CSS 变量覆盖**
|
|
215
|
+
```css
|
|
216
|
+
/* src/index.css */
|
|
217
|
+
:root,
|
|
218
|
+
.sy-app-workspace {
|
|
219
|
+
/* 调整表单控件圆角和品牌色 */
|
|
220
|
+
--sy-radius-md: 8px;
|
|
221
|
+
--sy-color-primary: #2563eb;
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
225
|
> 平台变量可用于统一主题或平台组件兼容,但业务页面不必为了使用 token 牺牲视觉效果。需要页面专属视觉时,可以新增页面级 CSS 变量,建议加业务前缀,避免与平台变量冲突。
|
|
226
|
-
|
|
227
|
-
3. **antd `ConfigProvider` 主题**
|
|
228
|
-
```tsx
|
|
229
|
-
<ConfigProvider theme={{ token: { colorPrimary: '#2563eb', borderRadius: 8 } }}>
|
|
230
|
-
<App />
|
|
231
|
-
</ConfigProvider>
|
|
232
|
-
```
|
|
233
|
-
|
|
226
|
+
|
|
227
|
+
3. **antd `ConfigProvider` 主题**
|
|
228
|
+
```tsx
|
|
229
|
+
<ConfigProvider theme={{ token: { colorPrimary: '#2563eb', borderRadius: 8 } }}>
|
|
230
|
+
<App />
|
|
231
|
+
</ConfigProvider>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
234
|
4. **谨慎**:直接覆盖组件内部 class(`.ant-select-selector { ... }`)属于私有 API,升级风险较高。确实需要时必须限定在页面根类下;legacy 页面也可以兼容限定在 `.sy-app-workspace` 下。优先考虑 `ConfigProvider`、`className`、组件 props 或 CSS 变量是否能解决。
|
|
235
|
-
|
|
236
|
-
---
|
|
237
|
-
|
|
238
|
-
## 6. 移动端组件策略
|
|
239
|
-
|
|
240
|
-
| 场景 | PC | Mobile |
|
|
241
|
-
| --- | --- | --- |
|
|
242
|
-
| 基础组件库 | `antd` | `antd-mobile` |
|
|
243
|
-
| 平台业务组件(如 `UserSelectField`) | ✅ 内置多端适配,**直接用** | ✅ 同左 |
|
|
244
|
-
| 自定义组件 | 自行 `useDeviceDetect` 分支或拆两份实现 | 同左 |
|
|
245
|
-
|
|
246
|
-
```tsx
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## 6. 移动端组件策略
|
|
239
|
+
|
|
240
|
+
| 场景 | PC | Mobile |
|
|
241
|
+
| --- | --- | --- |
|
|
242
|
+
| 基础组件库 | `antd` | `antd-mobile` |
|
|
243
|
+
| 平台业务组件(如 `UserSelectField`) | ✅ 内置多端适配,**直接用** | ✅ 同左 |
|
|
244
|
+
| 自定义组件 | 自行 `useDeviceDetect` 分支或拆两份实现 | 同左 |
|
|
245
|
+
|
|
246
|
+
```tsx
|
|
247
247
|
import { useDeviceDetect } from 'openxiangda';
|
|
248
|
-
import { Button as PcButton } from 'antd';
|
|
249
|
-
import { Button as MobileButton } from 'antd-mobile';
|
|
250
|
-
|
|
251
|
-
export function ActionButton(props) {
|
|
252
|
-
const { isMobile } = useDeviceDetect();
|
|
253
|
-
return isMobile ? <MobileButton {...props} /> : <PcButton {...props} />;
|
|
254
|
-
}
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
> 推荐:能用平台组件就别自己写多端分支;自定义组件且双端差异大时,按 `src/pages/pc` 与 `src/pages/mobile` 整体拆分(详见 `architecture-patterns.md`)。
|
|
258
|
-
|
|
259
|
-
---
|
|
260
|
-
|
|
261
|
-
## 7. 常见错误(AI Agent 高频踩坑)
|
|
262
|
-
|
|
248
|
+
import { Button as PcButton } from 'antd';
|
|
249
|
+
import { Button as MobileButton } from 'antd-mobile';
|
|
250
|
+
|
|
251
|
+
export function ActionButton(props) {
|
|
252
|
+
const { isMobile } = useDeviceDetect();
|
|
253
|
+
return isMobile ? <MobileButton {...props} /> : <PcButton {...props} />;
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
> 推荐:能用平台组件就别自己写多端分支;自定义组件且双端差异大时,按 `src/pages/pc` 与 `src/pages/mobile` 整体拆分(详见 `architecture-patterns.md`)。
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## 7. 常见错误(AI Agent 高频踩坑)
|
|
262
|
+
|
|
263
263
|
| 错误 | 正确做法 |
|
|
264
264
|
| --- | --- |
|
|
265
265
|
| 在 `src/forms/**` 或 `src/pages/**` 直接写 `<input>` / `<select>` / `<textarea>` | 用平台字段组件;平台没有时包装 antd / antd-mobile |
|
|
266
266
|
| 自己写人员选择器(搜员工 + 列表) | 用 `UserSelectField` |
|
|
267
267
|
| 自己实现部门树 | 用 `DepartmentSelectField` |
|
|
268
268
|
| 用 `<input type="file">` 上传 | 用 `AttachmentField` / `ImageField` |
|
|
269
|
-
| 用第三方富文本(TinyMCE 等) | 用 `EditorField` |
|
|
270
|
-
| 自己写列表 + 分页 + 导出 | 用 `DataManagementList` |
|
|
269
|
+
| 用第三方富文本(TinyMCE 等) | 用 `EditorField` |
|
|
270
|
+
| 自己写列表 + 分页 + 导出 | 用 `DataManagementList` |
|
|
271
271
|
| 常规组件大量写 `style={{ color: '#333', padding: 16 }}` | 优先 Tailwind 原生工具类、任意值或局部 CSS;动态值和少量精调 inline style 可接受 |
|
|
272
272
|
| Select / Date / Modal 弹层错位、被滚动容器裁切 | 默认加 `getPopupContainer={(trigger) => trigger.parentElement}`;legacy `namespace/shadow` 页面才额外使用 `sy-app-workspace` |
|
|
273
|
-
| 不分端,PC 组件直接放移动端 | 按端拆页 + 端内用对应 UI 库 |
|
|
273
|
+
| 不分端,PC 组件直接放移动端 | 按端拆页 + 端内用对应 UI 库 |
|
|
274
274
|
| 无作用域覆盖 `.ant-xxx` 内部 class | 优先用 `className`、CSS 变量或 `ConfigProvider` 主题;必要覆盖时限定到页面命名空间 |
|
|
275
|
-
| 在自定义组件中不透传 `...rest` / `ref` | 透传 props 与 `forwardRef`,保留底层组件全部能力 |
|
|
276
|
-
|
|
277
|
-
---
|
|
278
|
-
|
|
279
|
-
## 速查 Checklist(提交前自检)
|
|
280
|
-
|
|
275
|
+
| 在自定义组件中不透传 `...rest` / `ref` | 透传 props 与 `forwardRef`,保留底层组件全部能力 |
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## 速查 Checklist(提交前自检)
|
|
280
|
+
|
|
281
281
|
- [ ] 涉及人员 / 部门 / 文件 / 图片 / 富文本 / 签名 / 地图 / 列表 → 用了平台组件?
|
|
282
282
|
- [ ] 表单录入字段 → 优先使用了 `TextField` / `SelectField` / `DateField` 等平台字段,而不是 antd 或原生控件?
|
|
283
283
|
- [ ] 自定义组件 → 基于 antd / antd-mobile 包装并透传 props?
|
|
284
284
|
- [ ] app/workspace 源码 → 没有直接出现原生 `<input>` / `<select>` / `<textarea>` / file input / 手写 picker 或 uploader?
|
|
285
285
|
- [ ] 样式 → 默认用 Tailwind 原生类 / 任意值 / 局部 CSS;平台 token 只在主题兼容或平台组件需要时使用,且作用域收敛?
|
|
286
286
|
- [ ] 弹层 → 默认使用正常容器;只有 legacy 隔离页面才额外设置 `sy-app-workspace` 样式作用域?
|
|
287
|
-
- [ ] 多端 → PC 用 antd、Mobile 用 antd-mobile,业务逻辑共享?
|
|
287
|
+
- [ ] 多端 → PC 用 antd、Mobile 用 antd-mobile,业务逻辑共享?
|
|
@@ -969,3 +969,15 @@ Requires Bearer token. Creates a short-lived signed OSS upload URL for browser d
|
|
|
969
969
|
### POST `/apps/:appType/storage-configs/:code/objects/delete`
|
|
970
970
|
|
|
971
971
|
Requires Bearer token. Deletes an OSS object under the configured `pathPrefix`.
|
|
972
|
+
## Inbound Webhook
|
|
973
|
+
|
|
974
|
+
- Management: `GET|POST /openxiangda-api/v1/apps/:appType/webhooks`
|
|
975
|
+
- Detail/update/disable: `GET|POST|PUT|DELETE /openxiangda-api/v1/apps/:appType/webhooks/:code`
|
|
976
|
+
- Delivery list/detail: `GET /openxiangda-api/v1/apps/:appType/webhooks/:code/deliveries[/:deliveryId]`
|
|
977
|
+
- Public callback: `POST /openxiangda-webhooks/v1/:endpointId`
|
|
978
|
+
|
|
979
|
+
The public `endpointId` resolves tenant/application ownership and is never
|
|
980
|
+
replaced with `appType`. Management calls use normal profile authentication;
|
|
981
|
+
the public callback is unauthenticated at the platform edge and the target
|
|
982
|
+
Function must verify the provider signature from the exact raw body. See
|
|
983
|
+
`webhooks.md` for the declaration and runtime envelope.
|