@yiyi_zhang/reactflow-ui 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AiWorkflowIDE.d.ts +28 -0
- package/dist/WorkflowIDE.d.ts +30 -0
- package/dist/actions/fromDefinitions.d.ts +70 -0
- package/dist/actions/registry.d.ts +1 -0
- package/dist/actions/types.d.ts +26 -0
- package/dist/ai.d.ts +25 -0
- package/dist/components/AiNative/AiCommandCenter.d.ts +4 -0
- package/dist/components/business/ActionPickerModal.d.ts +25 -0
- package/dist/components/business/DataPillInput.d.ts +2 -0
- package/dist/components/business/DecisionBranchCard.d.ts +2 -0
- package/dist/components/business/ForkJoinCard.d.ts +2 -0
- package/dist/components/business/LibraryVersionBadge.d.ts +29 -0
- package/dist/components/business/LoopDoWhileCard.d.ts +2 -0
- package/dist/components/business/NestedControlStep.d.ts +22 -0
- package/dist/components/business/StepFlowEditor.d.ts +15 -0
- package/dist/components/business/StepListEditor.d.ts +29 -0
- package/dist/components/import/ApiImportDialog.d.ts +27 -0
- package/dist/components/onboarding/ModalShell.d.ts +15 -0
- package/dist/components/onboarding/OnboardingController.d.ts +67 -0
- package/dist/components/onboarding/OnboardingGuideCard.d.ts +10 -0
- package/dist/components/onboarding/OnboardingWizard.d.ts +42 -0
- package/dist/components/onboarding/PromotionPanel.d.ts +20 -0
- package/dist/components/onboarding/WorkflowNameBuilder.d.ts +19 -0
- package/dist/components/onboarding/index.d.ts +8 -0
- package/dist/components/onboarding/styles.d.ts +11 -0
- package/dist/components/onboarding/useOnboardingData.d.ts +17 -0
- package/dist/components/template/TemplateGallery.d.ts +2 -0
- package/dist/components/template/TemplateSetupWizard.d.ts +2 -0
- package/dist/import/buildAction.d.ts +23 -0
- package/dist/import/common.d.ts +17 -0
- package/dist/import/curl.d.ts +12 -0
- package/dist/import/detect.d.ts +9 -0
- package/dist/import/index.d.ts +10 -0
- package/dist/import/insert.d.ts +16 -0
- package/dist/import/openapi.d.ts +9 -0
- package/dist/import/postman.d.ts +9 -0
- package/dist/import/schema.d.ts +15 -0
- package/dist/import/sensitive.d.ts +18 -0
- package/dist/import/types.d.ts +62 -0
- package/dist/import/util.d.ts +23 -0
- package/dist/index.d.ts +23 -1
- package/dist/library/catalog.d.ts +93 -0
- package/dist/library/conductorProvider.d.ts +41 -0
- package/dist/library/diff.d.ts +62 -0
- package/dist/library/index.d.ts +16 -0
- package/dist/library/level.d.ts +6 -0
- package/dist/library/naming.d.ts +28 -0
- package/dist/library/projections.d.ts +53 -0
- package/dist/library/types.d.ts +58 -0
- package/dist/library/useLibraryCatalog.d.ts +9 -0
- package/dist/library/version.d.ts +17 -0
- package/dist/library/versionStatus.d.ts +44 -0
- package/dist/onboarding/index.d.ts +6 -0
- package/dist/onboarding/naming.d.ts +41 -0
- package/dist/onboarding/poll.d.ts +39 -0
- package/dist/onboarding/wizardState.d.ts +44 -0
- package/dist/product-launch.html +3 -3
- package/dist/providers/WorkflowIdeProvider.d.ts +23 -0
- package/dist/providers/resolve.d.ts +20 -0
- package/dist/providers/types.d.ts +65 -0
- package/dist/reactflow-ui-ai.es.js +18748 -10262
- package/dist/reactflow-ui.css +1 -1
- package/dist/reactflow-ui.es.js +12741 -8916
- package/dist/reactflow-ui.umd.js +38 -23
- package/dist/sample-imports/cmdb-openapi3.json +334 -0
- package/dist/sample-imports/cmdb-postman.json +100 -0
- package/dist/sample-imports/ticket-swagger2.json +231 -0
- package/dist/sample-workflows/library-capabilities-demo.json +66 -0
- package/dist/services/ai/agentRunner.d.ts +11 -0
- package/dist/services/ai/schemaRegistry.d.ts +7 -1
- package/dist/services/ai/systemPrompt.d.ts +11 -0
- package/dist/services/ai/toolExecutor.d.ts +12 -0
- package/dist/services/ai/workflowSynthesizer.d.ts +28 -3
- package/dist/stepmodel/compile.d.ts +6 -0
- package/dist/stepmodel/decompile.d.ts +5 -0
- package/dist/stepmodel/factory.d.ts +8 -0
- package/dist/stepmodel/types.d.ts +3 -0
- package/dist/store/ideStoresContext.d.ts +3 -0
- package/dist/store/sandboxRunObserver.d.ts +19 -0
- package/dist/store/workflowStore.d.ts +1 -0
- package/dist/telemetry/buffer.d.ts +37 -0
- package/dist/telemetry/once.d.ts +11 -0
- package/dist/telemetry/track.d.ts +17 -0
- package/dist/telemetry/types.d.ts +24 -0
- package/dist/telemetry/useTelemetry.d.ts +22 -0
- package/dist/types/conductor.d.ts +13 -8
- package/dist/types/workflow.d.ts +9 -0
- package/dist/types/workflowLibrary.d.ts +2 -0
- package/dist/utils/taskTypeMeta.d.ts +3 -3
- package/package.json +1 -1
- package/dist/components/AiNative/BusinessCanvas.d.ts +0 -15
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ActionDefinition } from '../actions/types';
|
|
2
|
+
import { type ActionExtension } from '../actions/fromDefinitions';
|
|
3
|
+
import type { SchemaDef } from '../types/conductor';
|
|
4
|
+
import type { WorkflowLevel, WorkflowLibraryItem } from '../types/workflowLibrary';
|
|
5
|
+
import type { TaskSchema } from '../services/ai/schemaRegistry';
|
|
6
|
+
import type { LibraryCatalog, LibraryEntry } from './catalog';
|
|
7
|
+
import type { LibraryExtension } from './types';
|
|
8
|
+
/** LibraryExtension → ActionExtension(extension.action 中的显式设置优先) */
|
|
9
|
+
export declare function toActionExtension(ext?: LibraryExtension): ActionExtension;
|
|
10
|
+
/**
|
|
11
|
+
* 目录 → 动作。只投影 Provider 提供的条目(静态 workflowLibrary 条目只有摘要,没有入参定义,
|
|
12
|
+
* 不进入业务模式动作库,以保持原有 `actions` 行为不变)。
|
|
13
|
+
* 已下线条目仍会生成动作(已引用的步骤需要照常显示与编译),但带 `deprecated` 标记,选择器会隐藏。
|
|
14
|
+
*/
|
|
15
|
+
export declare function toActions(catalog: LibraryCatalog): ActionDefinition[];
|
|
16
|
+
/** JSON Schema(Conductor SchemaDef)→ { 字段名: 类型串 };`enum` 输出为 `a|b`。无可解析的 properties 返回 undefined */
|
|
17
|
+
export declare function schemaToTypeStrings(schema?: SchemaDef): Record<string, string> | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* 目录 → 任务 Schema。
|
|
20
|
+
* - 有 inputSchema / outputSchema 时展开 properties;没有时退回 inputKeys / 工作流入参名 / outputKeys / outputParameters 的 key
|
|
21
|
+
* - 同名条目 Provider 优先于静态 `taskSchemas`;静态 Schema 在前,保持原有顺序
|
|
22
|
+
* - 已下线条目不输出(避免 AI 继续引用)
|
|
23
|
+
*/
|
|
24
|
+
export declare function toTaskSchemas(catalog: LibraryCatalog): TaskSchema[];
|
|
25
|
+
/**
|
|
26
|
+
* 目录 → 旧版 WorkflowLibraryItem。
|
|
27
|
+
* - 未标注层级的条目按 L1 处理(调用规则最保守:只能被同层及更高层引用)
|
|
28
|
+
* - `version` 为字符串以兼容旧类型:静态条目保持原样,Provider 条目输出整数版本(即步骤将固定的版本)
|
|
29
|
+
* - 已下线条目不输出
|
|
30
|
+
*/
|
|
31
|
+
export declare function toLibraryItems(catalog: LibraryCatalog): WorkflowLibraryItem[];
|
|
32
|
+
/** 目录条目 → 旧版 WorkflowLibraryItem(规则同 toLibraryItems;也用于服务端检索命中的转换) */
|
|
33
|
+
export declare function entriesToLibraryItems(entries: LibraryEntry[]): WorkflowLibraryItem[];
|
|
34
|
+
/**
|
|
35
|
+
* 动作选择器可见性过滤:
|
|
36
|
+
* - 已下线动作隐藏(已引用的步骤仍可通过 registry 正常显示与编译)
|
|
37
|
+
* - 提供 currentLevel 时,隐藏违反分层调用规则的流程库动作(L1 不显示 L2/L3,L2 不显示 L3);未提供则不按层级过滤
|
|
38
|
+
*/
|
|
39
|
+
export declare function filterPickableActions(actions: ActionDefinition[], opts?: {
|
|
40
|
+
currentLevel?: WorkflowLevel;
|
|
41
|
+
}): ActionDefinition[];
|
|
42
|
+
/** 没有业务域的流程库动作所属分组 */
|
|
43
|
+
export declare const OTHER_DOMAIN = "\u5176\u4ED6";
|
|
44
|
+
/**
|
|
45
|
+
* 动作所属的业务域分组:有 domain 取 domain;流程库动作(kind = workflow)无 domain 归入「其他」;
|
|
46
|
+
* 其余(内置 / 非流程库)返回 null,继续按原有分类分组。
|
|
47
|
+
*/
|
|
48
|
+
export declare function libraryDomainOf(action: ActionDefinition): string | null;
|
|
49
|
+
/**
|
|
50
|
+
* 收集动作中出现的业务域,按首次出现的顺序排列(顺序即目录顺序,不重新排序),「其他」固定最后。
|
|
51
|
+
* 没有任何动作带 domain 时返回空数组(选择器据此保持旧的分类分组)。
|
|
52
|
+
*/
|
|
53
|
+
export declare function collectLibraryDomains(actions: ActionDefinition[]): string[];
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { WorkflowDef } from '../types/conductor';
|
|
2
|
+
import type { WorkflowLevel } from '../types/workflowLibrary';
|
|
3
|
+
import type { ActionExtension, RegisteredTaskDef } from '../actions/fromDefinitions';
|
|
4
|
+
/**
|
|
5
|
+
* 流程库数据源(LibraryProvider)公共类型。
|
|
6
|
+
* 设计见 docs/design/流程库数据源-LibraryProvider设计.md。
|
|
7
|
+
*
|
|
8
|
+
* 原则:来源可换,数据只有一份(LibraryCatalog),消费方只读投影(projections)。
|
|
9
|
+
*/
|
|
10
|
+
/** Conductor 标准之外的补充字段(层级、分类、图标等由宿主决定来源) */
|
|
11
|
+
export interface LibraryExtension {
|
|
12
|
+
level?: WorkflowLevel;
|
|
13
|
+
category?: string;
|
|
14
|
+
/** 业务域展示名(如「通知协助」)。取值来自服务端的全局可调整列表,不在组件库内写死;缺省时尝试从流程名称解析 */
|
|
15
|
+
domain?: string;
|
|
16
|
+
icon?: string;
|
|
17
|
+
tags?: string[];
|
|
18
|
+
displayName?: string;
|
|
19
|
+
/** 已下线 / 不建议新引用(等价于 LibraryWorkflowRecord.deprecated,便于由 resolveExtension 一并给出) */
|
|
20
|
+
deprecated?: boolean;
|
|
21
|
+
/** 透传到 ActionExtension(字段级覆盖等) */
|
|
22
|
+
action?: ActionExtension;
|
|
23
|
+
}
|
|
24
|
+
export interface LibraryWorkflowRecord {
|
|
25
|
+
/** Conductor 标准 WorkflowDef(含 version: number) */
|
|
26
|
+
def: WorkflowDef;
|
|
27
|
+
extension?: LibraryExtension;
|
|
28
|
+
/** 宿主侧可读版本号(如 "1.2.0"),仅展示用 */
|
|
29
|
+
versionLabel?: string;
|
|
30
|
+
/** 已下线 / 不建议新引用 */
|
|
31
|
+
deprecated?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface LibraryTaskRecord {
|
|
34
|
+
/** Conductor 标准 TaskDef */
|
|
35
|
+
def: RegisteredTaskDef;
|
|
36
|
+
extension?: LibraryExtension;
|
|
37
|
+
}
|
|
38
|
+
export interface LibraryListResult {
|
|
39
|
+
/** 每个 name 只需最新版本;可只含摘要(tasks 可为空) */
|
|
40
|
+
workflows: LibraryWorkflowRecord[];
|
|
41
|
+
tasks?: LibraryTaskRecord[];
|
|
42
|
+
}
|
|
43
|
+
export interface LibrarySearchOptions {
|
|
44
|
+
level?: WorkflowLevel;
|
|
45
|
+
/** 按业务域过滤(与 LibraryExtension.domain 同一取值) */
|
|
46
|
+
domain?: string;
|
|
47
|
+
limit?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface LibraryProvider {
|
|
50
|
+
/** 列出目录(每个流程的最新发布版本) */
|
|
51
|
+
list(signal?: AbortSignal): Promise<LibraryListResult>;
|
|
52
|
+
/** 取指定版本的完整定义;version 缺省为最新。找不到返回 null(不抛错) */
|
|
53
|
+
get(name: string, version?: number, signal?: AbortSignal): Promise<LibraryWorkflowRecord | null>;
|
|
54
|
+
/** 可选:服务端检索,大目录时由 AI 工具与选择器使用 */
|
|
55
|
+
search?(query: string, opts?: LibrarySearchOptions, signal?: AbortSignal): Promise<LibraryWorkflowRecord[]>;
|
|
56
|
+
}
|
|
57
|
+
/** 目录加载状态 */
|
|
58
|
+
export type LibraryLoadStatus = 'idle' | 'loading' | 'ready' | 'error';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { LibraryCatalog, type LibraryCatalogSnapshot } from './catalog';
|
|
2
|
+
import type { LibraryProvider } from './types';
|
|
3
|
+
/** 订阅目录状态(catalog 为空时返回恒定的 idle 快照)。目录数据变化时返回新的快照引用。 */
|
|
4
|
+
export declare function useLibraryCatalogSnapshot(catalog: LibraryCatalog | undefined): LibraryCatalogSnapshot;
|
|
5
|
+
/**
|
|
6
|
+
* 让目录跟随 provider:provider 引用变化时重新加载;卸载 / 更换时 abort 进行中的请求。
|
|
7
|
+
* 每个 IDE 实例自己持有 catalog,这里只负责驱动它。
|
|
8
|
+
*/
|
|
9
|
+
export declare function useLibraryCatalogLoader(catalog: LibraryCatalog, provider: LibraryProvider | undefined): void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 版本号规范化:统一为整数(Conductor 的版本就是整数)。
|
|
3
|
+
*
|
|
4
|
+
* | 输入 | 结果 |
|
|
5
|
+
* |---|---|
|
|
6
|
+
* | 整数 | 原样 |
|
|
7
|
+
* | 静态 "3" | 3,label "3" |
|
|
8
|
+
* | 静态 "1.2.0" 等 | 取 parseInt 主版本号,label 保留原串,warn = true |
|
|
9
|
+
*/
|
|
10
|
+
export interface NormalizedVersion {
|
|
11
|
+
version: number;
|
|
12
|
+
/** 原始可读版本串(仅当输入是字符串,或无法原样用作整数时保留) */
|
|
13
|
+
label?: string;
|
|
14
|
+
/** 是否发生了有损转换(调用方据此告警一次) */
|
|
15
|
+
lossy: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function normalizeVersion(input: number | string | undefined | null): NormalizedVersion;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { LibraryLoadStatus } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 流程库能力徽标的状态(纯函数,便于单测)。
|
|
4
|
+
*
|
|
5
|
+
* | 场景 | 状态 |
|
|
6
|
+
* |---|---|
|
|
7
|
+
* | 步骤未记录版本 | unpinned:沿用原定义,不显示任何提示 |
|
|
8
|
+
* | 库中有更高版本 | upgradable:「⬆ 有新版本 vN」,由用户确认差异后手动升级 |
|
|
9
|
+
* | 固定版本在库中不存在 / 已下线 | unavailable:「⚠ 版本不可用」,保持原样编译,不自动改版本 |
|
|
10
|
+
* | 目录加载中 / 加载失败 | pinned:不显示新版本提示,不影响编辑与编译 |
|
|
11
|
+
*/
|
|
12
|
+
export type LibraryBadgeState = {
|
|
13
|
+
kind: 'unpinned';
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'pinned';
|
|
16
|
+
pinned: number;
|
|
17
|
+
} | {
|
|
18
|
+
kind: 'upgradable';
|
|
19
|
+
pinned: number;
|
|
20
|
+
latest: number;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'unavailable';
|
|
23
|
+
pinned: number;
|
|
24
|
+
reason: 'deprecated' | 'removed' | 'missing-version';
|
|
25
|
+
};
|
|
26
|
+
export interface LibraryBadgeInputs {
|
|
27
|
+
/** 步骤上记录的固定版本 */
|
|
28
|
+
pinned: number | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* 目录加载状态。`undefined` 表示没有流程库目录参与(仅有 `actions` prop),
|
|
31
|
+
* 此时沿用旧行为:只按动作上记录的最新版本提示升级,不判断「版本不可用」。
|
|
32
|
+
*/
|
|
33
|
+
catalogStatus: LibraryLoadStatus | undefined;
|
|
34
|
+
/** 库中(或动作上记录的)当前最新版本;不存在时为 undefined */
|
|
35
|
+
latest: {
|
|
36
|
+
version: number;
|
|
37
|
+
deprecated: boolean;
|
|
38
|
+
} | undefined;
|
|
39
|
+
/** 固定版本是否仍存在于库中(异步检查结果;undefined = 未知,按存在处理) */
|
|
40
|
+
pinnedExists: boolean | undefined;
|
|
41
|
+
}
|
|
42
|
+
export declare function resolveLibraryBadgeState(input: LibraryBadgeInputs): LibraryBadgeState;
|
|
43
|
+
/** 「版本不可用」的原因说明(用于徽标 tooltip) */
|
|
44
|
+
export declare function describeUnavailable(name: string, pinned: number, reason: 'deprecated' | 'removed' | 'missing-version'): string;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { buildWorkflowName, validateNameParts, suggestFuncSlug, promotionTargetName, isPromotableName, buildSkeletonWorkflow, } from './naming';
|
|
2
|
+
export type { WorkflowNameParts, PromotionTargetType, SkeletonInput } from './naming';
|
|
3
|
+
export { nextPollDelay, isTerminalPromotionState, buildPromotionTimeline, promotionStateLabel, pollPromotion, } from './poll';
|
|
4
|
+
export type { TimelineItem, PollOptions, PromotionState } from './poll';
|
|
5
|
+
export { WIZARD_STEPS, WIZARD_STEP_LABEL, createInitialDraft, validateProductName, productStepError, namingStepErrors, draftToNameParts, canAdvance, nextStep, prevStep, availableSources, } from './wizardState';
|
|
6
|
+
export type { WizardStep, WizardDraft, StartSource } from './wizardState';
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { WorkflowDef } from '../types/conductor';
|
|
2
|
+
import type { WorkflowLevel } from '../types/workflowLibrary';
|
|
3
|
+
import type { WorkflowNameType } from '../library/naming';
|
|
4
|
+
/**
|
|
5
|
+
* 自助接入的命名辅助:纯函数,不依赖 React,可直接单测。
|
|
6
|
+
* 命名规范:`类型-层级-业务域-产品-功能`(见 src/library/naming.ts)。
|
|
7
|
+
*/
|
|
8
|
+
/** 申请上线时可选的目标类型 */
|
|
9
|
+
export type PromotionTargetType = 'custom' | 'std';
|
|
10
|
+
/** 五段式名称的各段 */
|
|
11
|
+
export interface WorkflowNameParts {
|
|
12
|
+
type: WorkflowNameType;
|
|
13
|
+
level: WorkflowLevel;
|
|
14
|
+
domain: string;
|
|
15
|
+
product: string;
|
|
16
|
+
func: string;
|
|
17
|
+
}
|
|
18
|
+
/** 拼出完整流程名称。业务域 / 产品段会被去掉 `-`;功能段保持原样(仅去首尾空白,允许含 `-`) */
|
|
19
|
+
export declare function buildWorkflowName(parts: WorkflowNameParts): string;
|
|
20
|
+
/** 校验各段拼出的名称(空段会得到「xx不能为空」类错误),业务域白名单可选 */
|
|
21
|
+
export declare function validateNameParts(parts: WorkflowNameParts, allowedDomains?: string[]): string[];
|
|
22
|
+
/**
|
|
23
|
+
* 由用户输入的功能说明建议「功能」段:
|
|
24
|
+
* - 含中文:保持原样,仅去掉 `-`(避免破坏分段),空白折叠为 `_`;
|
|
25
|
+
* - 纯 ASCII:转小写 snake_case(驼峰拆词,连字符 / 空格 / 其他符号折叠为 `_`)。
|
|
26
|
+
*/
|
|
27
|
+
export declare function suggestFuncSlug(text: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* 申请上线后的正式名称:把类型段(第一段)替换为目标类型。
|
|
30
|
+
* 名称不符合五段规范时返回 null。
|
|
31
|
+
*/
|
|
32
|
+
export declare function promotionTargetName(tmpName: string, targetType: PromotionTargetType): string | null;
|
|
33
|
+
/** 当前流程名称是否是可申请上线的临时流程(类型段为 tmp) */
|
|
34
|
+
export declare function isPromotableName(name: string | undefined | null): boolean;
|
|
35
|
+
export interface SkeletonInput {
|
|
36
|
+
name: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
ownerEmail?: string;
|
|
39
|
+
}
|
|
40
|
+
/** 向导生成的骨架定义:version 1 / schemaVersion 2,空任务 */
|
|
41
|
+
export declare function buildSkeletonWorkflow(input: SkeletonInput): WorkflowDef;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { OnboardingProvider, PromotionStatus } from '../providers/types';
|
|
2
|
+
/** 上线申请轮询:初始间隔、封顶间隔(毫秒) */
|
|
3
|
+
export declare const POLL_BASE_MS = 2000;
|
|
4
|
+
export declare const POLL_MAX_MS = 30000;
|
|
5
|
+
/** 第 attempt 次(从 0 开始)等待的时长:指数退避 2s → 4s → 8s … 封顶 30s */
|
|
6
|
+
export declare function nextPollDelay(attempt: number): number;
|
|
7
|
+
export type PromotionState = PromotionStatus['state'];
|
|
8
|
+
/** 终态:不会再变化,轮询据此停止 */
|
|
9
|
+
export declare function isTerminalPromotionState(state: PromotionState): boolean;
|
|
10
|
+
export interface TimelineItem {
|
|
11
|
+
state: PromotionState;
|
|
12
|
+
label: string;
|
|
13
|
+
/** done 已完成 / current 进行中 / pending 未到 / failed 被驳回 */
|
|
14
|
+
status: 'done' | 'current' | 'pending' | 'failed';
|
|
15
|
+
}
|
|
16
|
+
export declare function promotionStateLabel(state: PromotionState): string;
|
|
17
|
+
/**
|
|
18
|
+
* 进度时间线。正常路径:已提交 → 审批中 → 审批通过 → 已同步到生产;
|
|
19
|
+
* 被驳回时第三项替换为「已驳回」(failed),之后不再展示「已同步」。
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildPromotionTimeline(state: PromotionState | null): TimelineItem[];
|
|
22
|
+
export declare function isAbortError(e: unknown): boolean;
|
|
23
|
+
/** 可被 AbortSignal 打断的等待 */
|
|
24
|
+
export declare function abortableSleep(ms: number, signal?: AbortSignal): Promise<void>;
|
|
25
|
+
export interface PollOptions {
|
|
26
|
+
provider: Pick<OnboardingProvider, 'getPromotion'>;
|
|
27
|
+
requestId: string;
|
|
28
|
+
signal?: AbortSignal;
|
|
29
|
+
/** 每次拿到状态时回调(含终态) */
|
|
30
|
+
onUpdate?: (status: PromotionStatus) => void;
|
|
31
|
+
/** 注入等待函数(测试用),默认 abortableSleep */
|
|
32
|
+
sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 轮询上线申请直到终态(APPROVED / REJECTED / SYNCED):先立即查一次,之后按 nextPollDelay 退避。
|
|
36
|
+
* APPROVED 视为终态(审批已有结论),轮询随之停止。
|
|
37
|
+
* 请求失败直接抛出(由界面显示「重试」);signal 中止时抛 AbortError。
|
|
38
|
+
*/
|
|
39
|
+
export declare function pollPromotion(opts: PollOptions): Promise<PromotionStatus>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { WorkflowLevel } from '../types/workflowLibrary';
|
|
2
|
+
import type { ProductInfo } from '../providers/types';
|
|
3
|
+
import type { WorkflowNameType } from '../library/naming';
|
|
4
|
+
import type { WorkflowNameParts } from './naming';
|
|
5
|
+
/** 向导步骤:产品 → 命名 → 起点 */
|
|
6
|
+
export type WizardStep = 'product' | 'naming' | 'start';
|
|
7
|
+
export declare const WIZARD_STEPS: readonly WizardStep[];
|
|
8
|
+
export declare const WIZARD_STEP_LABEL: Record<WizardStep, string>;
|
|
9
|
+
export type StartSource = 'blank' | 'template' | 'import';
|
|
10
|
+
export interface WizardDraft {
|
|
11
|
+
/** existing:选择已有产品;new:登记新产品(仅试用环境) */
|
|
12
|
+
productMode: 'existing' | 'new';
|
|
13
|
+
productName: string;
|
|
14
|
+
domain: string;
|
|
15
|
+
systemCode: string;
|
|
16
|
+
type: WorkflowNameType;
|
|
17
|
+
level: WorkflowLevel;
|
|
18
|
+
func: string;
|
|
19
|
+
description: string;
|
|
20
|
+
source: StartSource;
|
|
21
|
+
}
|
|
22
|
+
export interface WizardContextLite {
|
|
23
|
+
trial: boolean;
|
|
24
|
+
products: ProductInfo[];
|
|
25
|
+
}
|
|
26
|
+
/** 初始草稿:有产品时默认选第一个;没有产品时(试用环境)进入登记模式 */
|
|
27
|
+
export declare function createInitialDraft(ctx: WizardContextLite, level?: WorkflowLevel): WizardDraft;
|
|
28
|
+
/** 产品名规则:非空、不含 `-` 与空白(会破坏五段切分) */
|
|
29
|
+
export declare function validateProductName(name: string): string | null;
|
|
30
|
+
/** 第 1 步的校验错误(null = 可继续) */
|
|
31
|
+
export declare function productStepError(draft: WizardDraft, ctx: WizardContextLite, domains: string[]): string | null;
|
|
32
|
+
/** 草稿 → 五段名称 */
|
|
33
|
+
export declare function draftToNameParts(draft: WizardDraft, trial: boolean): WorkflowNameParts;
|
|
34
|
+
/** 第 2 步的校验错误列表 */
|
|
35
|
+
export declare function namingStepErrors(draft: WizardDraft, trial: boolean, domains: string[]): string[];
|
|
36
|
+
/** 当前步骤是否允许进入下一步 */
|
|
37
|
+
export declare function canAdvance(step: WizardStep, draft: WizardDraft, ctx: WizardContextLite, domains: string[]): boolean;
|
|
38
|
+
export declare function nextStep(step: WizardStep): WizardStep;
|
|
39
|
+
export declare function prevStep(step: WizardStep): WizardStep;
|
|
40
|
+
/** 可选的起点:未提供对应回调时隐藏该选项(空白始终可用) */
|
|
41
|
+
export declare function availableSources(opts: {
|
|
42
|
+
hasTemplate: boolean;
|
|
43
|
+
hasImport: boolean;
|
|
44
|
+
}): StartSource[];
|
package/dist/product-launch.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<link rel="icon" type="image/svg+xml" href="
|
|
6
|
+
<link rel="icon" type="image/svg+xml" href="./logo.svg" />
|
|
7
7
|
<title>[Product Launch] Conductor Workflow IDE v1.0 GA · 让工作流编排与联调从 4.5 小时缩短至 12 分钟</title>
|
|
8
8
|
<style>
|
|
9
9
|
/* ==========================================================================
|
|
@@ -738,7 +738,7 @@
|
|
|
738
738
|
<!-- Sticky Launch Bar -->
|
|
739
739
|
<header class="launch-nav">
|
|
740
740
|
<div class="nav-left">
|
|
741
|
-
<a href="
|
|
741
|
+
<a href="./" class="brand-logo">
|
|
742
742
|
<svg width="26" height="26" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg" style="flex-shrink:0;">
|
|
743
743
|
<defs>
|
|
744
744
|
<linearGradient id="nav-bg" x1="0" y1="0" x2="32" y2="32" gradientUnits="userSpaceOnUse">
|
|
@@ -772,7 +772,7 @@
|
|
|
772
772
|
<span style="color:var(--text-muted);">@yiyi_zhang/reactflow-ui · 下一代 AI 原生工作流编排与本地确定性沙箱 IDE</span>
|
|
773
773
|
</div>
|
|
774
774
|
<div class="nav-right">
|
|
775
|
-
<a href="
|
|
775
|
+
<a href="./app" class="ghost-btn">🎮 进入在线交互演练场</a>
|
|
776
776
|
<button class="cta-btn" onclick="document.getElementById('quickstart').scrollIntoView({behavior:'smooth'})">
|
|
777
777
|
30 秒极速接入 →
|
|
778
778
|
</button>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { IdeProviders } from './types';
|
|
3
|
+
export interface WorkflowIdeProviderProps {
|
|
4
|
+
providers: IdeProviders;
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 统一注册扩展点:宿主配置一次,其下所有 `WorkflowIDE` / `AiWorkflowIDE` 共用。
|
|
9
|
+
* `providers` 对象每次渲染重新创建也没关系——只有某个 provider 引用变化时才会通知下游。
|
|
10
|
+
*
|
|
11
|
+
* ```tsx
|
|
12
|
+
* <WorkflowIdeProvider providers={{ library, telemetry }}>
|
|
13
|
+
* <WorkflowIDE … />
|
|
14
|
+
* </WorkflowIdeProvider>
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function WorkflowIdeProvider({ providers, children }: WorkflowIdeProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
/** 读取外层 `WorkflowIdeProvider` 提供的扩展点;没有外层时返回空对象(不抛错) */
|
|
19
|
+
export declare function useIdeProviders(): IdeProviders;
|
|
20
|
+
/**
|
|
21
|
+
* IDE 内部使用:合并「专用 prop > 组件 providers prop > 外层 Provider」,结果按字段引用稳定。
|
|
22
|
+
*/
|
|
23
|
+
export declare function useResolvedProviders(componentProviders: IdeProviders | undefined, override?: Partial<IdeProviders>): IdeProviders;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { IdeProviders } from './types';
|
|
2
|
+
/** 各层来源,按优先级从高到低排列 */
|
|
3
|
+
export interface ProviderSources {
|
|
4
|
+
/** 组件上的专用 prop(如 `libraryProvider`),优先级最高 */
|
|
5
|
+
override?: Partial<IdeProviders>;
|
|
6
|
+
/** 组件的 `providers` prop */
|
|
7
|
+
component?: Partial<IdeProviders>;
|
|
8
|
+
/** 外层 `WorkflowIdeProvider` */
|
|
9
|
+
context?: Partial<IdeProviders>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 按字段解析:专用 prop > 组件 `providers` prop > 外层 `WorkflowIdeProvider` > 无。
|
|
13
|
+
* 某一层的字段为 undefined 时才落到下一层(不是整个对象覆盖)。纯函数,每次返回新对象。
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveProviders(sources?: ProviderSources): IdeProviders;
|
|
16
|
+
/**
|
|
17
|
+
* 稳定化:各字段引用都与 prev 相同时返回 prev 本身。
|
|
18
|
+
* 宿主每次渲染新建 `providers` 对象、但 provider 实例不变时,下游拿到的仍是同一个对象,不会触发目录重载。
|
|
19
|
+
*/
|
|
20
|
+
export declare function stabilizeProviders(prev: IdeProviders | undefined, next: IdeProviders): IdeProviders;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 扩展点注册:统一的 Provider 集合与自助接入(Onboarding)契约。
|
|
3
|
+
* 设计见 docs/design/v1.3.0-自助接入设计.md 第 2、3.2 节。
|
|
4
|
+
*/
|
|
5
|
+
import type { LibraryProvider } from '../library/types';
|
|
6
|
+
import type { TelemetrySink } from '../telemetry/types';
|
|
7
|
+
export interface OnboardingContext {
|
|
8
|
+
env: 'TEST' | 'PROD';
|
|
9
|
+
user: {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
};
|
|
13
|
+
/** 当前环境是否开放自助试用(生产为 false) */
|
|
14
|
+
trialEnabled: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface ProductInfo {
|
|
17
|
+
name: string;
|
|
18
|
+
domain: string;
|
|
19
|
+
status: 'PENDING' | 'ACTIVE';
|
|
20
|
+
role: 'OWNER' | 'MEMBER';
|
|
21
|
+
}
|
|
22
|
+
export type StartTrialResult = {
|
|
23
|
+
status: 'ok';
|
|
24
|
+
product: ProductInfo;
|
|
25
|
+
} | {
|
|
26
|
+
status: 'conflict';
|
|
27
|
+
owners: {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
}[];
|
|
31
|
+
};
|
|
32
|
+
export interface PromotionStatus {
|
|
33
|
+
requestId: string;
|
|
34
|
+
state: 'SUBMITTED' | 'REVIEWING' | 'APPROVED' | 'REJECTED' | 'SYNCED';
|
|
35
|
+
targetName?: string;
|
|
36
|
+
comment?: string;
|
|
37
|
+
updatedAt: string;
|
|
38
|
+
}
|
|
39
|
+
export interface OnboardingProvider {
|
|
40
|
+
getContext(signal?: AbortSignal): Promise<OnboardingContext>;
|
|
41
|
+
listDomains(signal?: AbortSignal): Promise<string[]>;
|
|
42
|
+
listMyProducts(signal?: AbortSignal): Promise<ProductInfo[]>;
|
|
43
|
+
startTrial(input: {
|
|
44
|
+
productName: string;
|
|
45
|
+
domain: string;
|
|
46
|
+
systemCode?: string;
|
|
47
|
+
}): Promise<StartTrialResult>;
|
|
48
|
+
requestPromotion(input: {
|
|
49
|
+
workflowName: string;
|
|
50
|
+
version: number;
|
|
51
|
+
targetType: 'custom' | 'std';
|
|
52
|
+
}): Promise<{
|
|
53
|
+
requestId: string;
|
|
54
|
+
}>;
|
|
55
|
+
getPromotion(requestId: string, signal?: AbortSignal): Promise<PromotionStatus>;
|
|
56
|
+
}
|
|
57
|
+
/** 宿主配置一次、页面内所有 IDE 共用的扩展点集合 */
|
|
58
|
+
export interface IdeProviders {
|
|
59
|
+
/** 流程库数据源(1.2.0 已有) */
|
|
60
|
+
library?: LibraryProvider;
|
|
61
|
+
/** 自助接入(1.3.0;B1 仅定义契约,界面在 B2) */
|
|
62
|
+
onboarding?: OnboardingProvider;
|
|
63
|
+
/** 接入埋点(1.3.0) */
|
|
64
|
+
telemetry?: TelemetrySink;
|
|
65
|
+
}
|