yc-component 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +36 -0
- package/README.md +216 -0
- package/dist/_virtual/_plugin-vue_export-helper.js +9 -0
- package/dist/ai-task/api/http.d.ts +6 -0
- package/dist/ai-task/api/http.d.ts.map +1 -0
- package/dist/ai-task/api/http.js +40 -0
- package/dist/ai-task/api/prompt.d.ts +11 -0
- package/dist/ai-task/api/prompt.d.ts.map +1 -0
- package/dist/ai-task/api/prompt.js +9 -0
- package/dist/ai-task/api/workflow.d.ts +51 -0
- package/dist/ai-task/api/workflow.d.ts.map +1 -0
- package/dist/ai-task/api/workflow.js +15 -0
- package/dist/ai-task/components/AiTaskPanel.css +1 -0
- package/dist/ai-task/components/AiTaskPanel.d.ts +4 -0
- package/dist/ai-task/components/AiTaskPanel.d.ts.map +1 -0
- package/dist/ai-task/components/AiTaskPanel.vue.js +7 -0
- package/dist/ai-task/components/AiTaskPanel.vue2.js +251 -0
- package/dist/ai-task/components/AiTaskProvider.d.ts +26 -0
- package/dist/ai-task/components/AiTaskProvider.d.ts.map +1 -0
- package/dist/ai-task/components/AiTaskProvider.vue.js +60 -0
- package/dist/ai-task/components/AiTaskProvider.vue2.js +4 -0
- package/dist/ai-task/components/AiUseDialog.css +1 -0
- package/dist/ai-task/components/AiUseDialog.d.ts +22 -0
- package/dist/ai-task/components/AiUseDialog.d.ts.map +1 -0
- package/dist/ai-task/components/AiUseDialog.vue.js +7 -0
- package/dist/ai-task/components/AiUseDialog.vue2.js +224 -0
- package/dist/ai-task/composables/useAiTask.d.ts +62 -0
- package/dist/ai-task/composables/useAiTask.d.ts.map +1 -0
- package/dist/ai-task/composables/useAiTask.js +11 -0
- package/dist/ai-task/config.d.ts +23 -0
- package/dist/ai-task/config.d.ts.map +1 -0
- package/dist/ai-task/config.js +23 -0
- package/dist/ai-task/context.d.ts +59 -0
- package/dist/ai-task/context.d.ts.map +1 -0
- package/dist/ai-task/context.js +42 -0
- package/dist/ai-task/dialog-state.d.ts +28 -0
- package/dist/ai-task/dialog-state.d.ts.map +1 -0
- package/dist/ai-task/dialog-state.js +28 -0
- package/dist/ai-task/index.d.ts +15 -0
- package/dist/ai-task/index.d.ts.map +1 -0
- package/dist/ai-task/index.js +24 -0
- package/dist/ai-task/inject.d.ts +307 -0
- package/dist/ai-task/inject.d.ts.map +1 -0
- package/dist/ai-task/inject.js +10 -0
- package/dist/ai-task/services/taskRunner.d.ts +11 -0
- package/dist/ai-task/services/taskRunner.d.ts.map +1 -0
- package/dist/ai-task/services/taskRunner.js +60 -0
- package/dist/ai-task/store/useAiTaskStore.d.ts +255 -0
- package/dist/ai-task/store/useAiTaskStore.d.ts.map +1 -0
- package/dist/ai-task/store/useAiTaskStore.js +230 -0
- package/dist/ai-task/style.css +3 -0
- package/dist/ai-task/types/index.d.ts +105 -0
- package/dist/ai-task/types/index.d.ts.map +1 -0
- package/dist/ai-task/useScopedStore.d.ts +255 -0
- package/dist/ai-task/useScopedStore.d.ts.map +1 -0
- package/dist/ai-task/useScopedStore.js +10 -0
- package/dist/ai-task/utils/runClientScript.d.ts +5 -0
- package/dist/ai-task/utils/runClientScript.d.ts.map +1 -0
- package/dist/ai-task/utils/runClientScript.js +26 -0
- package/dist/ai-task/utils/storage.d.ts +20 -0
- package/dist/ai-task/utils/storage.d.ts.map +1 -0
- package/dist/ai-task/utils/storage.js +45 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/page-window/YcPageWindow.css +1 -0
- package/dist/page-window/YcPageWindow.d.ts +58 -0
- package/dist/page-window/YcPageWindow.d.ts.map +1 -0
- package/dist/page-window/YcPageWindow.vue.js +7 -0
- package/dist/page-window/YcPageWindow.vue2.js +230 -0
- package/dist/page-window/index.d.ts +5 -0
- package/dist/page-window/index.d.ts.map +1 -0
- package/dist/page-window/index.js +5 -0
- package/dist/page-window/style.css +1 -0
- package/dist/page-window/types.d.ts +32 -0
- package/dist/page-window/types.d.ts.map +1 -0
- package/dist/plugin.d.ts +14 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +19 -0
- package/package.json +84 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { getProjectId as g } from "../config.js";
|
|
2
|
+
import { cancelWorkflowRun as w, getWorkflowRun as p, getWorkflowArtifact as o, continueClientScript as C, startWorkflowRun as D } from "../api/workflow.js";
|
|
3
|
+
import { runClientScript as S } from "../utils/runClientScript.js";
|
|
4
|
+
async function N(r) {
|
|
5
|
+
return (await D({
|
|
6
|
+
projectId: g(),
|
|
7
|
+
freeText: r.freeText,
|
|
8
|
+
promptId: r.promptId,
|
|
9
|
+
autoMatch: r.autoMatch
|
|
10
|
+
})).runId;
|
|
11
|
+
}
|
|
12
|
+
async function P(r, t) {
|
|
13
|
+
var e, u, f, s;
|
|
14
|
+
const n = await p(r);
|
|
15
|
+
if (n.status === "WAITING_CLIENT" && n.waitingStepKey && n.waitingClientScript) {
|
|
16
|
+
(e = t == null ? void 0 : t.onProgress) == null || e.call(t, 60, `执行脚本:${n.waitingStepKey}`);
|
|
17
|
+
let i = {};
|
|
18
|
+
n.waitingArtifactId && (i = await o(r, n.waitingArtifactId));
|
|
19
|
+
const E = S(n.waitingClientScript, i);
|
|
20
|
+
return await C(r, {
|
|
21
|
+
stepKey: n.waitingStepKey,
|
|
22
|
+
output: E ?? {}
|
|
23
|
+
}), null;
|
|
24
|
+
}
|
|
25
|
+
if (n.status === "SUCCEEDED") {
|
|
26
|
+
if (n.finalArtifactId) {
|
|
27
|
+
(u = t == null ? void 0 : t.onProgress) == null || u.call(t, 95, "加载结果…");
|
|
28
|
+
const i = await o(r, n.finalArtifactId);
|
|
29
|
+
return (f = t == null ? void 0 : t.onProgress) == null || f.call(t, 100, "已完成"), { phase: "SUCCEEDED", runId: r, result: i };
|
|
30
|
+
}
|
|
31
|
+
return { phase: "SUCCEEDED", runId: r, result: {} };
|
|
32
|
+
}
|
|
33
|
+
return n.status === "FAILED" ? { phase: "FAILED", runId: r, errorMessage: n.errorMessage || "工作流失败" } : n.status === "CANCELLED" ? { phase: "FAILED", runId: r, errorMessage: "已取消" } : ((s = t == null ? void 0 : t.onProgress) == null || s.call(t, A(n), I(n)), null);
|
|
34
|
+
}
|
|
35
|
+
async function R(r) {
|
|
36
|
+
const t = await p(r);
|
|
37
|
+
return t.status !== "SUCCEEDED" || !t.finalArtifactId ? null : await o(r, t.finalArtifactId);
|
|
38
|
+
}
|
|
39
|
+
async function M(r) {
|
|
40
|
+
await w(r);
|
|
41
|
+
}
|
|
42
|
+
function A(r) {
|
|
43
|
+
if (r.status === "PENDING") return 8;
|
|
44
|
+
const t = r.steps ?? [];
|
|
45
|
+
if (!t.length) return 35;
|
|
46
|
+
const n = t.filter((e) => e.status === "SUCCEEDED" || e.status === "SKIPPED").length;
|
|
47
|
+
return Math.min(90, Math.round(20 + n / t.length * 70));
|
|
48
|
+
}
|
|
49
|
+
function I(r) {
|
|
50
|
+
var n;
|
|
51
|
+
if (r.status === "PENDING") return "排队中…";
|
|
52
|
+
const t = (n = r.steps) == null ? void 0 : n.find((e) => e.status === "RUNNING");
|
|
53
|
+
return t ? `执行中:${t.stepKey}` : "后端处理中…";
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
M as cancelRunOnServer,
|
|
57
|
+
R as fetchRunResult,
|
|
58
|
+
N as startAiWorkflowRun,
|
|
59
|
+
P as syncWorkflowRunStatus
|
|
60
|
+
};
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { AiTaskFinishHandler, AiTaskItem, AiTaskSubmitOptions, AiUseDialogOptions } from '../types';
|
|
2
|
+
import { StoreDefinition } from 'pinia';
|
|
3
|
+
import { Ref, ComputedRef } from 'vue';
|
|
4
|
+
import { AiTaskStatus } from '..';
|
|
5
|
+
export declare const useAiTaskStore: StoreDefinition<"ycAiTask", Pick<{
|
|
6
|
+
tasks: Ref<{
|
|
7
|
+
id: string;
|
|
8
|
+
title: string;
|
|
9
|
+
freeText: string;
|
|
10
|
+
promptId?: number | undefined;
|
|
11
|
+
autoMatch?: boolean | undefined;
|
|
12
|
+
status: AiTaskStatus;
|
|
13
|
+
progress: number;
|
|
14
|
+
summary: string;
|
|
15
|
+
runId?: number | undefined;
|
|
16
|
+
result?: Record<string, unknown> | undefined;
|
|
17
|
+
errorMessage?: string | undefined;
|
|
18
|
+
createdAt: number;
|
|
19
|
+
finishedAt?: number | undefined;
|
|
20
|
+
logs: string[];
|
|
21
|
+
}[], AiTaskItem[] | {
|
|
22
|
+
id: string;
|
|
23
|
+
title: string;
|
|
24
|
+
freeText: string;
|
|
25
|
+
promptId?: number | undefined;
|
|
26
|
+
autoMatch?: boolean | undefined;
|
|
27
|
+
status: AiTaskStatus;
|
|
28
|
+
progress: number;
|
|
29
|
+
summary: string;
|
|
30
|
+
runId?: number | undefined;
|
|
31
|
+
result?: Record<string, unknown> | undefined;
|
|
32
|
+
errorMessage?: string | undefined;
|
|
33
|
+
createdAt: number;
|
|
34
|
+
finishedAt?: number | undefined;
|
|
35
|
+
logs: string[];
|
|
36
|
+
}[]>;
|
|
37
|
+
panelVisible: Ref<boolean, boolean>;
|
|
38
|
+
panelMinimized: Ref<boolean, boolean>;
|
|
39
|
+
dialogVisible: Ref<boolean, boolean>;
|
|
40
|
+
dialogOptions: Ref<{
|
|
41
|
+
title?: string | undefined;
|
|
42
|
+
freeText?: string | undefined;
|
|
43
|
+
promptId?: number | undefined;
|
|
44
|
+
autoMatch?: boolean | undefined;
|
|
45
|
+
prompts?: {
|
|
46
|
+
id: number;
|
|
47
|
+
name: string;
|
|
48
|
+
content?: string | undefined;
|
|
49
|
+
category?: string | undefined;
|
|
50
|
+
workflowDefinitionKey?: string | undefined;
|
|
51
|
+
}[] | undefined;
|
|
52
|
+
onSubmitted?: ((taskId: string) => void) | undefined;
|
|
53
|
+
onFinish?: AiTaskFinishHandler | undefined;
|
|
54
|
+
}, AiUseDialogOptions | {
|
|
55
|
+
title?: string | undefined;
|
|
56
|
+
freeText?: string | undefined;
|
|
57
|
+
promptId?: number | undefined;
|
|
58
|
+
autoMatch?: boolean | undefined;
|
|
59
|
+
prompts?: {
|
|
60
|
+
id: number;
|
|
61
|
+
name: string;
|
|
62
|
+
content?: string | undefined;
|
|
63
|
+
category?: string | undefined;
|
|
64
|
+
workflowDefinitionKey?: string | undefined;
|
|
65
|
+
}[] | undefined;
|
|
66
|
+
onSubmitted?: ((taskId: string) => void) | undefined;
|
|
67
|
+
onFinish?: AiTaskFinishHandler | undefined;
|
|
68
|
+
}>;
|
|
69
|
+
hydrated: Ref<boolean, boolean>;
|
|
70
|
+
runningCount: ComputedRef<number>;
|
|
71
|
+
activeCount: ComputedRef<number>;
|
|
72
|
+
panelTitle: ComputedRef<"AI 处理中" | "部分任务失败" | "AI 任务">;
|
|
73
|
+
panelSubtitle: ComputedRef<string>;
|
|
74
|
+
hydrate: () => Promise<void>;
|
|
75
|
+
showPanel: () => void;
|
|
76
|
+
hidePanel: () => void;
|
|
77
|
+
toggleMinimize: () => void;
|
|
78
|
+
openDialog: (options?: AiUseDialogOptions) => void;
|
|
79
|
+
closeDialog: () => void;
|
|
80
|
+
enqueue: (options: AiTaskSubmitOptions) => string;
|
|
81
|
+
onTaskFinish: (handler: AiTaskFinishHandler) => () => boolean;
|
|
82
|
+
refreshActiveTasks: () => Promise<void>;
|
|
83
|
+
loadTaskResult: (id: string) => Promise<Record<string, unknown> | null>;
|
|
84
|
+
cancelTask: (id: string) => Promise<void>;
|
|
85
|
+
cancelAll: () => void;
|
|
86
|
+
clearFinished: () => void;
|
|
87
|
+
removeTask: (id: string) => void;
|
|
88
|
+
}, "tasks" | "panelVisible" | "panelMinimized" | "dialogVisible" | "dialogOptions" | "hydrated">, Pick<{
|
|
89
|
+
tasks: Ref<{
|
|
90
|
+
id: string;
|
|
91
|
+
title: string;
|
|
92
|
+
freeText: string;
|
|
93
|
+
promptId?: number | undefined;
|
|
94
|
+
autoMatch?: boolean | undefined;
|
|
95
|
+
status: AiTaskStatus;
|
|
96
|
+
progress: number;
|
|
97
|
+
summary: string;
|
|
98
|
+
runId?: number | undefined;
|
|
99
|
+
result?: Record<string, unknown> | undefined;
|
|
100
|
+
errorMessage?: string | undefined;
|
|
101
|
+
createdAt: number;
|
|
102
|
+
finishedAt?: number | undefined;
|
|
103
|
+
logs: string[];
|
|
104
|
+
}[], AiTaskItem[] | {
|
|
105
|
+
id: string;
|
|
106
|
+
title: string;
|
|
107
|
+
freeText: string;
|
|
108
|
+
promptId?: number | undefined;
|
|
109
|
+
autoMatch?: boolean | undefined;
|
|
110
|
+
status: AiTaskStatus;
|
|
111
|
+
progress: number;
|
|
112
|
+
summary: string;
|
|
113
|
+
runId?: number | undefined;
|
|
114
|
+
result?: Record<string, unknown> | undefined;
|
|
115
|
+
errorMessage?: string | undefined;
|
|
116
|
+
createdAt: number;
|
|
117
|
+
finishedAt?: number | undefined;
|
|
118
|
+
logs: string[];
|
|
119
|
+
}[]>;
|
|
120
|
+
panelVisible: Ref<boolean, boolean>;
|
|
121
|
+
panelMinimized: Ref<boolean, boolean>;
|
|
122
|
+
dialogVisible: Ref<boolean, boolean>;
|
|
123
|
+
dialogOptions: Ref<{
|
|
124
|
+
title?: string | undefined;
|
|
125
|
+
freeText?: string | undefined;
|
|
126
|
+
promptId?: number | undefined;
|
|
127
|
+
autoMatch?: boolean | undefined;
|
|
128
|
+
prompts?: {
|
|
129
|
+
id: number;
|
|
130
|
+
name: string;
|
|
131
|
+
content?: string | undefined;
|
|
132
|
+
category?: string | undefined;
|
|
133
|
+
workflowDefinitionKey?: string | undefined;
|
|
134
|
+
}[] | undefined;
|
|
135
|
+
onSubmitted?: ((taskId: string) => void) | undefined;
|
|
136
|
+
onFinish?: AiTaskFinishHandler | undefined;
|
|
137
|
+
}, AiUseDialogOptions | {
|
|
138
|
+
title?: string | undefined;
|
|
139
|
+
freeText?: string | undefined;
|
|
140
|
+
promptId?: number | undefined;
|
|
141
|
+
autoMatch?: boolean | undefined;
|
|
142
|
+
prompts?: {
|
|
143
|
+
id: number;
|
|
144
|
+
name: string;
|
|
145
|
+
content?: string | undefined;
|
|
146
|
+
category?: string | undefined;
|
|
147
|
+
workflowDefinitionKey?: string | undefined;
|
|
148
|
+
}[] | undefined;
|
|
149
|
+
onSubmitted?: ((taskId: string) => void) | undefined;
|
|
150
|
+
onFinish?: AiTaskFinishHandler | undefined;
|
|
151
|
+
}>;
|
|
152
|
+
hydrated: Ref<boolean, boolean>;
|
|
153
|
+
runningCount: ComputedRef<number>;
|
|
154
|
+
activeCount: ComputedRef<number>;
|
|
155
|
+
panelTitle: ComputedRef<"AI 处理中" | "部分任务失败" | "AI 任务">;
|
|
156
|
+
panelSubtitle: ComputedRef<string>;
|
|
157
|
+
hydrate: () => Promise<void>;
|
|
158
|
+
showPanel: () => void;
|
|
159
|
+
hidePanel: () => void;
|
|
160
|
+
toggleMinimize: () => void;
|
|
161
|
+
openDialog: (options?: AiUseDialogOptions) => void;
|
|
162
|
+
closeDialog: () => void;
|
|
163
|
+
enqueue: (options: AiTaskSubmitOptions) => string;
|
|
164
|
+
onTaskFinish: (handler: AiTaskFinishHandler) => () => boolean;
|
|
165
|
+
refreshActiveTasks: () => Promise<void>;
|
|
166
|
+
loadTaskResult: (id: string) => Promise<Record<string, unknown> | null>;
|
|
167
|
+
cancelTask: (id: string) => Promise<void>;
|
|
168
|
+
cancelAll: () => void;
|
|
169
|
+
clearFinished: () => void;
|
|
170
|
+
removeTask: (id: string) => void;
|
|
171
|
+
}, "runningCount" | "activeCount" | "panelTitle" | "panelSubtitle">, Pick<{
|
|
172
|
+
tasks: Ref<{
|
|
173
|
+
id: string;
|
|
174
|
+
title: string;
|
|
175
|
+
freeText: string;
|
|
176
|
+
promptId?: number | undefined;
|
|
177
|
+
autoMatch?: boolean | undefined;
|
|
178
|
+
status: AiTaskStatus;
|
|
179
|
+
progress: number;
|
|
180
|
+
summary: string;
|
|
181
|
+
runId?: number | undefined;
|
|
182
|
+
result?: Record<string, unknown> | undefined;
|
|
183
|
+
errorMessage?: string | undefined;
|
|
184
|
+
createdAt: number;
|
|
185
|
+
finishedAt?: number | undefined;
|
|
186
|
+
logs: string[];
|
|
187
|
+
}[], AiTaskItem[] | {
|
|
188
|
+
id: string;
|
|
189
|
+
title: string;
|
|
190
|
+
freeText: string;
|
|
191
|
+
promptId?: number | undefined;
|
|
192
|
+
autoMatch?: boolean | undefined;
|
|
193
|
+
status: AiTaskStatus;
|
|
194
|
+
progress: number;
|
|
195
|
+
summary: string;
|
|
196
|
+
runId?: number | undefined;
|
|
197
|
+
result?: Record<string, unknown> | undefined;
|
|
198
|
+
errorMessage?: string | undefined;
|
|
199
|
+
createdAt: number;
|
|
200
|
+
finishedAt?: number | undefined;
|
|
201
|
+
logs: string[];
|
|
202
|
+
}[]>;
|
|
203
|
+
panelVisible: Ref<boolean, boolean>;
|
|
204
|
+
panelMinimized: Ref<boolean, boolean>;
|
|
205
|
+
dialogVisible: Ref<boolean, boolean>;
|
|
206
|
+
dialogOptions: Ref<{
|
|
207
|
+
title?: string | undefined;
|
|
208
|
+
freeText?: string | undefined;
|
|
209
|
+
promptId?: number | undefined;
|
|
210
|
+
autoMatch?: boolean | undefined;
|
|
211
|
+
prompts?: {
|
|
212
|
+
id: number;
|
|
213
|
+
name: string;
|
|
214
|
+
content?: string | undefined;
|
|
215
|
+
category?: string | undefined;
|
|
216
|
+
workflowDefinitionKey?: string | undefined;
|
|
217
|
+
}[] | undefined;
|
|
218
|
+
onSubmitted?: ((taskId: string) => void) | undefined;
|
|
219
|
+
onFinish?: AiTaskFinishHandler | undefined;
|
|
220
|
+
}, AiUseDialogOptions | {
|
|
221
|
+
title?: string | undefined;
|
|
222
|
+
freeText?: string | undefined;
|
|
223
|
+
promptId?: number | undefined;
|
|
224
|
+
autoMatch?: boolean | undefined;
|
|
225
|
+
prompts?: {
|
|
226
|
+
id: number;
|
|
227
|
+
name: string;
|
|
228
|
+
content?: string | undefined;
|
|
229
|
+
category?: string | undefined;
|
|
230
|
+
workflowDefinitionKey?: string | undefined;
|
|
231
|
+
}[] | undefined;
|
|
232
|
+
onSubmitted?: ((taskId: string) => void) | undefined;
|
|
233
|
+
onFinish?: AiTaskFinishHandler | undefined;
|
|
234
|
+
}>;
|
|
235
|
+
hydrated: Ref<boolean, boolean>;
|
|
236
|
+
runningCount: ComputedRef<number>;
|
|
237
|
+
activeCount: ComputedRef<number>;
|
|
238
|
+
panelTitle: ComputedRef<"AI 处理中" | "部分任务失败" | "AI 任务">;
|
|
239
|
+
panelSubtitle: ComputedRef<string>;
|
|
240
|
+
hydrate: () => Promise<void>;
|
|
241
|
+
showPanel: () => void;
|
|
242
|
+
hidePanel: () => void;
|
|
243
|
+
toggleMinimize: () => void;
|
|
244
|
+
openDialog: (options?: AiUseDialogOptions) => void;
|
|
245
|
+
closeDialog: () => void;
|
|
246
|
+
enqueue: (options: AiTaskSubmitOptions) => string;
|
|
247
|
+
onTaskFinish: (handler: AiTaskFinishHandler) => () => boolean;
|
|
248
|
+
refreshActiveTasks: () => Promise<void>;
|
|
249
|
+
loadTaskResult: (id: string) => Promise<Record<string, unknown> | null>;
|
|
250
|
+
cancelTask: (id: string) => Promise<void>;
|
|
251
|
+
cancelAll: () => void;
|
|
252
|
+
clearFinished: () => void;
|
|
253
|
+
removeTask: (id: string) => void;
|
|
254
|
+
}, "hydrate" | "showPanel" | "hidePanel" | "toggleMinimize" | "openDialog" | "closeDialog" | "enqueue" | "onTaskFinish" | "refreshActiveTasks" | "loadTaskResult" | "cancelTask" | "cancelAll" | "clearFinished" | "removeTask">>;
|
|
255
|
+
//# sourceMappingURL=useAiTaskStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAiTaskStore.d.ts","sourceRoot":"","sources":["../../../src/ai-task/store/useAiTaskStore.ts"],"names":[],"mappings":";;;AAQA,OAAO,KAAK,EACV,mBAAmB,EAEnB,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,UAAU,CAAA;AAuBjB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA2FI,kBAAkB;;uBAoGrB,mBAAmB,KAAG,MAAM;4BA7JvB,mBAAmB;;yBAyNhB,MAAM;qBAWV,MAAM;;;qBA+BZ,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA1MD,kBAAkB;;uBAoGrB,mBAAmB,KAAG,MAAM;4BA7JvB,mBAAmB;;yBAyNhB,MAAM;qBAWV,MAAM;;;qBA+BZ,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA1MD,kBAAkB;;uBAoGrB,mBAAmB,KAAG,MAAM;4BA7JvB,mBAAmB;;yBAyNhB,MAAM;qBAWV,MAAM;;;qBA+BZ,MAAM;iOAiC9B,CAAA"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { defineStore as H } from "pinia";
|
|
2
|
+
import { ref as l, computed as g } from "vue";
|
|
3
|
+
import { cancelRunOnServer as J, fetchRunResult as K, syncWorkflowRunStatus as Q, startAiWorkflowRun as X } from "../services/taskRunner.js";
|
|
4
|
+
import { hideAiDialog as Y, showAiDialog as Z } from "../dialog-state.js";
|
|
5
|
+
import { isActiveStatus as u, loadPersistedTasks as ee, toAiTaskItem as te, savePersistedTasks as ne } from "../utils/storage.js";
|
|
6
|
+
let M = 0, c = null;
|
|
7
|
+
const se = 5e3;
|
|
8
|
+
function re() {
|
|
9
|
+
return M += 1, `ai_task_${Date.now()}_${M}`;
|
|
10
|
+
}
|
|
11
|
+
function ie(s, o = 28) {
|
|
12
|
+
const i = s.trim();
|
|
13
|
+
return i.length <= o ? i : `${i.slice(0, o)}…`;
|
|
14
|
+
}
|
|
15
|
+
const ce = H("ycAiTask", () => {
|
|
16
|
+
const s = l([]), o = l(!1), i = l(!1), h = l(!1), P = l({}), p = l(!1), y = /* @__PURE__ */ new Set(), f = /* @__PURE__ */ new Map(), I = /* @__PURE__ */ new Set();
|
|
17
|
+
function b(e, n) {
|
|
18
|
+
return {
|
|
19
|
+
taskId: e.id,
|
|
20
|
+
runId: e.runId,
|
|
21
|
+
title: e.title,
|
|
22
|
+
freeText: e.freeText,
|
|
23
|
+
promptId: e.promptId,
|
|
24
|
+
result: n,
|
|
25
|
+
finishedAt: e.finishedAt ?? Date.now()
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function E(e, n) {
|
|
29
|
+
var m;
|
|
30
|
+
const t = s.value.find((D) => D.id === e);
|
|
31
|
+
if (!(t != null && t.runId)) return;
|
|
32
|
+
const r = b(t, n);
|
|
33
|
+
(m = f.get(e)) == null || m(r), f.delete(e), I.forEach((D) => D(r));
|
|
34
|
+
}
|
|
35
|
+
function L(e) {
|
|
36
|
+
return I.add(e), () => I.delete(e);
|
|
37
|
+
}
|
|
38
|
+
const d = g(
|
|
39
|
+
() => s.value.filter((e) => u(e.status)).length
|
|
40
|
+
), R = g(() => s.value.filter((e) => e.status === "running").length), C = g(() => d.value > 0 ? "AI 处理中" : s.value.some((e) => e.status === "failed") ? "部分任务失败" : "AI 任务"), _ = g(() => {
|
|
41
|
+
const e = s.value.length, n = d.value;
|
|
42
|
+
return e === 0 ? "暂无任务" : n > 0 ? `${n}/${e} 项任务进行中` : `${e} 项任务已完成`;
|
|
43
|
+
});
|
|
44
|
+
function v() {
|
|
45
|
+
ne(s.value);
|
|
46
|
+
}
|
|
47
|
+
function a(e, n) {
|
|
48
|
+
const t = s.value.findIndex((r) => r.id === e);
|
|
49
|
+
t >= 0 && (s.value[t] = { ...s.value[t], ...n }, v());
|
|
50
|
+
}
|
|
51
|
+
function S(e, n) {
|
|
52
|
+
const t = s.value.find((r) => r.id === e);
|
|
53
|
+
t && (t.logs.unshift(n), t.logs.length > 20 && t.logs.pop());
|
|
54
|
+
}
|
|
55
|
+
function x() {
|
|
56
|
+
o.value = !0, i.value = !1;
|
|
57
|
+
}
|
|
58
|
+
function k() {
|
|
59
|
+
o.value = !1;
|
|
60
|
+
}
|
|
61
|
+
function O() {
|
|
62
|
+
i.value = !i.value;
|
|
63
|
+
}
|
|
64
|
+
function V(e = {}) {
|
|
65
|
+
P.value = { ...e }, h.value = !0, Z(e);
|
|
66
|
+
}
|
|
67
|
+
function q() {
|
|
68
|
+
h.value = !1, Y();
|
|
69
|
+
}
|
|
70
|
+
function F() {
|
|
71
|
+
c || (c = setInterval(() => {
|
|
72
|
+
$();
|
|
73
|
+
}, se));
|
|
74
|
+
}
|
|
75
|
+
function T() {
|
|
76
|
+
d.value > 0 || c && (clearInterval(c), c = null);
|
|
77
|
+
}
|
|
78
|
+
async function $() {
|
|
79
|
+
const e = s.value.filter((n) => n.runId && u(n.status));
|
|
80
|
+
if (!e.length) {
|
|
81
|
+
T();
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
await Promise.all(e.map((n) => w(n.id)));
|
|
85
|
+
}
|
|
86
|
+
async function w(e) {
|
|
87
|
+
if (y.has(e)) return;
|
|
88
|
+
const n = s.value.find((t) => t.id === e);
|
|
89
|
+
if (!(!(n != null && n.runId) || !u(n.status))) {
|
|
90
|
+
y.add(e);
|
|
91
|
+
try {
|
|
92
|
+
const t = await Q(n.runId, {
|
|
93
|
+
onProgress: (r, m) => a(e, { progress: r, summary: m, status: "running" })
|
|
94
|
+
});
|
|
95
|
+
if (!t) return;
|
|
96
|
+
if (t.phase === "SUCCEEDED") {
|
|
97
|
+
const r = t.result ?? {};
|
|
98
|
+
a(e, {
|
|
99
|
+
status: "succeeded",
|
|
100
|
+
progress: 100,
|
|
101
|
+
summary: "已完成",
|
|
102
|
+
result: r,
|
|
103
|
+
runId: t.runId,
|
|
104
|
+
finishedAt: Date.now()
|
|
105
|
+
}), E(e, r);
|
|
106
|
+
} else
|
|
107
|
+
a(e, {
|
|
108
|
+
status: t.errorMessage === "已取消" ? "cancelled" : "failed",
|
|
109
|
+
progress: 100,
|
|
110
|
+
summary: t.errorMessage || "失败",
|
|
111
|
+
errorMessage: t.errorMessage,
|
|
112
|
+
runId: t.runId,
|
|
113
|
+
finishedAt: Date.now()
|
|
114
|
+
});
|
|
115
|
+
T();
|
|
116
|
+
} catch (t) {
|
|
117
|
+
const r = t instanceof Error ? t.message : "同步失败";
|
|
118
|
+
S(e, `✗ ${r}`);
|
|
119
|
+
} finally {
|
|
120
|
+
y.delete(e);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function z() {
|
|
125
|
+
if (p.value) return;
|
|
126
|
+
p.value = !0;
|
|
127
|
+
const e = ee();
|
|
128
|
+
e.length && (s.value = e.map(te), M = e.length);
|
|
129
|
+
const n = s.value.filter((t) => t.runId && u(t.status));
|
|
130
|
+
n.length && (await Promise.all(n.map((t) => w(t.id))), F());
|
|
131
|
+
for (const t of s.value)
|
|
132
|
+
t.status === "pending" && !t.runId && a(t.id, { status: "failed", summary: "页面刷新前未提交成功", finishedAt: Date.now() });
|
|
133
|
+
}
|
|
134
|
+
function B(e) {
|
|
135
|
+
const n = re(), t = {
|
|
136
|
+
id: n,
|
|
137
|
+
title: e.title ?? ie(e.freeText),
|
|
138
|
+
freeText: e.freeText.trim(),
|
|
139
|
+
promptId: e.promptId,
|
|
140
|
+
autoMatch: e.autoMatch,
|
|
141
|
+
status: "pending",
|
|
142
|
+
progress: 0,
|
|
143
|
+
summary: "正在提交…",
|
|
144
|
+
createdAt: Date.now(),
|
|
145
|
+
logs: []
|
|
146
|
+
};
|
|
147
|
+
return s.value.unshift(t), v(), e.onFinish && f.set(n, e.onFinish), e.showPanel !== !1 && x(), W(n), n;
|
|
148
|
+
}
|
|
149
|
+
async function W(e) {
|
|
150
|
+
const n = s.value.find((t) => t.id === e);
|
|
151
|
+
if (n)
|
|
152
|
+
try {
|
|
153
|
+
const t = await X({
|
|
154
|
+
freeText: n.freeText,
|
|
155
|
+
promptId: n.promptId,
|
|
156
|
+
autoMatch: n.autoMatch
|
|
157
|
+
});
|
|
158
|
+
a(e, {
|
|
159
|
+
runId: t,
|
|
160
|
+
status: "running",
|
|
161
|
+
progress: 10,
|
|
162
|
+
summary: "后端异步处理中…"
|
|
163
|
+
}), S(e, `▶ 已提交 runId=${t}`), F(), w(e);
|
|
164
|
+
} catch (t) {
|
|
165
|
+
const r = t instanceof Error ? t.message : "提交失败";
|
|
166
|
+
a(e, {
|
|
167
|
+
status: "failed",
|
|
168
|
+
progress: 100,
|
|
169
|
+
summary: r,
|
|
170
|
+
errorMessage: r,
|
|
171
|
+
finishedAt: Date.now()
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async function N(e) {
|
|
176
|
+
const n = s.value.find((r) => r.id === e);
|
|
177
|
+
if (!(n != null && n.runId)) return null;
|
|
178
|
+
if (n.result) return n.result;
|
|
179
|
+
const t = await K(n.runId);
|
|
180
|
+
return t && a(e, { result: t }), t;
|
|
181
|
+
}
|
|
182
|
+
async function A(e) {
|
|
183
|
+
const n = s.value.find((t) => t.id === e);
|
|
184
|
+
if (n != null && n.runId && u(n.status))
|
|
185
|
+
try {
|
|
186
|
+
await J(n.runId);
|
|
187
|
+
} catch {
|
|
188
|
+
}
|
|
189
|
+
n && u(n.status) && a(e, { status: "cancelled", summary: "已取消", finishedAt: Date.now() }), f.delete(e), T();
|
|
190
|
+
}
|
|
191
|
+
function U() {
|
|
192
|
+
for (const e of s.value)
|
|
193
|
+
u(e.status) && A(e.id);
|
|
194
|
+
}
|
|
195
|
+
function j() {
|
|
196
|
+
s.value = s.value.filter((e) => u(e.status)), v();
|
|
197
|
+
}
|
|
198
|
+
function G(e) {
|
|
199
|
+
A(e), f.delete(e), s.value = s.value.filter((n) => n.id !== e), v();
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
tasks: s,
|
|
203
|
+
panelVisible: o,
|
|
204
|
+
panelMinimized: i,
|
|
205
|
+
dialogVisible: h,
|
|
206
|
+
dialogOptions: P,
|
|
207
|
+
hydrated: p,
|
|
208
|
+
runningCount: d,
|
|
209
|
+
activeCount: R,
|
|
210
|
+
panelTitle: C,
|
|
211
|
+
panelSubtitle: _,
|
|
212
|
+
hydrate: z,
|
|
213
|
+
showPanel: x,
|
|
214
|
+
hidePanel: k,
|
|
215
|
+
toggleMinimize: O,
|
|
216
|
+
openDialog: V,
|
|
217
|
+
closeDialog: q,
|
|
218
|
+
enqueue: B,
|
|
219
|
+
onTaskFinish: L,
|
|
220
|
+
refreshActiveTasks: $,
|
|
221
|
+
loadTaskResult: N,
|
|
222
|
+
cancelTask: A,
|
|
223
|
+
cancelAll: U,
|
|
224
|
+
clearFinished: j,
|
|
225
|
+
removeTask: G
|
|
226
|
+
};
|
|
227
|
+
});
|
|
228
|
+
export {
|
|
229
|
+
ce as useAiTaskStore
|
|
230
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
.ai-task-panel[data-v-6f781fbd]{position:fixed;right:24px;bottom:24px;width:420px;max-height:min(520px,100vh - 48px);display:flex;flex-direction:column;background:var(--el-bg-color);border-radius:12px;box-shadow:0 8px 32px #0000001f;border:1px solid var(--el-border-color-lighter);z-index:3000;overflow:hidden}.ai-task-panel__header[data-v-6f781fbd]{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 16px 12px;border-bottom:1px solid var(--el-border-color-extra-light)}.ai-task-panel__header-left[data-v-6f781fbd]{display:flex;gap:12px;align-items:center;min-width:0}.ai-task-panel__icon[data-v-6f781fbd]{width:44px;height:44px;border-radius:50%;background:var(--el-color-primary-light-9);color:var(--el-color-primary);display:flex;align-items:center;justify-content:center;font-size:22px;flex-shrink:0}.ai-task-panel__subtitle[data-v-6f781fbd]{font-size:12px;color:var(--el-text-color-secondary)}.ai-task-panel__title[data-v-6f781fbd]{font-size:18px;font-weight:700;color:var(--el-text-color-primary);line-height:1.3}.ai-task-panel__header-actions[data-v-6f781fbd]{display:flex;align-items:center;gap:4px;flex-shrink:0}.ai-task-panel__body[data-v-6f781fbd]{flex:1;overflow:auto;padding:8px 0}.ai-task-list[data-v-6f781fbd]{display:flex;flex-direction:column}.ai-task-row[data-v-6f781fbd]{display:flex;align-items:flex-start;gap:12px;padding:12px 16px;border-bottom:1px solid var(--el-border-color-extra-light)}.ai-task-row[data-v-6f781fbd]:last-child{border-bottom:none}.ai-task-row__icon[data-v-6f781fbd]{width:40px;flex-shrink:0;display:flex;align-items:center;justify-content:center}.ai-task-row__icon .ok[data-v-6f781fbd]{color:var(--el-color-success);font-size:28px}.ai-task-row__icon .err[data-v-6f781fbd]{color:var(--el-color-danger);font-size:28px}.ai-task-row__icon .muted[data-v-6f781fbd]{color:var(--el-text-color-secondary);font-size:24px}.ai-task-row__main[data-v-6f781fbd]{flex:1;min-width:0}.ai-task-row__title[data-v-6f781fbd]{font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ai-task-row__meta[data-v-6f781fbd]{font-size:12px;color:var(--el-text-color-secondary);margin-top:2px}.ai-task-row__summary[data-v-6f781fbd]{font-size:12px;color:var(--el-text-color-regular);margin-top:4px;line-height:1.4}.ai-task-row__ops[data-v-6f781fbd]{flex-shrink:0;display:flex;flex-direction:column;align-items:flex-end;gap:2px}.ai-task-panel__footer[data-v-6f781fbd]{padding:8px 16px;border-top:1px solid var(--el-border-color-extra-light);text-align:center}.ai-task-panel-mini[data-v-6f781fbd]{position:fixed;right:24px;bottom:24px;z-index:3000;display:flex;align-items:center;gap:8px;padding:10px 16px;background:var(--el-bg-color);border-radius:24px;box-shadow:0 4px 16px #0000001f;border:1px solid var(--el-border-color-lighter);cursor:pointer;font-size:13px;color:var(--el-text-color-primary)}.ai-task-panel-mini[data-v-6f781fbd]:hover{border-color:var(--el-color-primary-light-5)}.spinning[data-v-6f781fbd]{animation:ai-spin-6f781fbd 1.2s linear infinite}@keyframes ai-spin-6f781fbd{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ai-panel-slide-enter-active[data-v-6f781fbd],.ai-panel-slide-leave-active[data-v-6f781fbd]{transition:all .25s ease}.ai-panel-slide-enter-from[data-v-6f781fbd],.ai-panel-slide-leave-to[data-v-6f781fbd]{opacity:0;transform:translateY(16px)}.result-pre[data-v-6f781fbd]{margin:0;max-height:420px;overflow:auto;font-size:12px;line-height:1.5;background:var(--el-fill-color-light);padding:12px;border-radius:8px;white-space:pre-wrap;word-break:break-all}.m-l-8[data-v-6f781fbd]{margin-left:8px}
|
|
2
|
+
|
|
3
|
+
.ai-use-dialog[data-v-ba49baf7] .el-overlay{z-index:4000}.ai-use-dialog[data-v-ba49baf7] .el-dialog{z-index:4001}.ai-use-dialog[data-v-ba49baf7] .el-dialog__body{padding-top:8px}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
export type WorkflowInvokePhase = 'WAITING_CLIENT' | 'SUCCEEDED' | 'FAILED' | 'OTHER';
|
|
2
|
+
export interface WorkflowInvokeResponse {
|
|
3
|
+
phase: WorkflowInvokePhase;
|
|
4
|
+
runId?: number;
|
|
5
|
+
stepKey?: string;
|
|
6
|
+
script?: string;
|
|
7
|
+
input?: Record<string, unknown>;
|
|
8
|
+
result?: Record<string, unknown>;
|
|
9
|
+
errorMessage?: string;
|
|
10
|
+
expiresAt?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface InvokeWorkflowStartParams {
|
|
13
|
+
freeText: string;
|
|
14
|
+
promptId?: number;
|
|
15
|
+
autoMatch?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export type AiTaskStatus = 'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled';
|
|
18
|
+
export interface AiTaskItem {
|
|
19
|
+
id: string;
|
|
20
|
+
title: string;
|
|
21
|
+
freeText: string;
|
|
22
|
+
promptId?: number;
|
|
23
|
+
autoMatch?: boolean;
|
|
24
|
+
status: AiTaskStatus;
|
|
25
|
+
progress: number;
|
|
26
|
+
summary: string;
|
|
27
|
+
runId?: number;
|
|
28
|
+
result?: Record<string, unknown>;
|
|
29
|
+
errorMessage?: string;
|
|
30
|
+
createdAt: number;
|
|
31
|
+
finishedAt?: number;
|
|
32
|
+
logs: string[];
|
|
33
|
+
}
|
|
34
|
+
export interface AiTaskSubmitOptions {
|
|
35
|
+
title?: string;
|
|
36
|
+
freeText: string;
|
|
37
|
+
promptId?: number;
|
|
38
|
+
autoMatch?: boolean;
|
|
39
|
+
showPanel?: boolean;
|
|
40
|
+
onFinish?: AiTaskFinishHandler;
|
|
41
|
+
}
|
|
42
|
+
/** 提示词下拉项(与接口 /yc-ai/ai/prompts 一致) */
|
|
43
|
+
export interface AiPromptOption {
|
|
44
|
+
id: number;
|
|
45
|
+
name: string;
|
|
46
|
+
content?: string;
|
|
47
|
+
category?: string;
|
|
48
|
+
workflowDefinitionKey?: string;
|
|
49
|
+
}
|
|
50
|
+
/** 弹窗组件 Props(挂载 Provider / 单独使用 AiUseDialog 均可配置) */
|
|
51
|
+
export interface AiUseDialogProps {
|
|
52
|
+
/** 弹窗标题 */
|
|
53
|
+
title?: string;
|
|
54
|
+
/** 默认需求描述 */
|
|
55
|
+
freeText?: string;
|
|
56
|
+
/** 默认选中的提示词 ID */
|
|
57
|
+
promptId?: number;
|
|
58
|
+
/** 默认是否开启自动匹配提示词 */
|
|
59
|
+
autoMatch?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* 提示词列表;传入后不再请求接口。
|
|
62
|
+
* 未传则走 listPrompts 或 installYcComponent 中的 listPrompts 配置。
|
|
63
|
+
*/
|
|
64
|
+
prompts?: AiPromptOption[];
|
|
65
|
+
/** 是否显示「自动匹配提示词」区域,默认 true */
|
|
66
|
+
showAutoMatch?: boolean;
|
|
67
|
+
/** 自动匹配区域标签 */
|
|
68
|
+
autoMatchLabel?: string;
|
|
69
|
+
/** 提示词表单项标签 */
|
|
70
|
+
promptLabel?: string;
|
|
71
|
+
/** 需求描述表单项标签 */
|
|
72
|
+
freeTextLabel?: string;
|
|
73
|
+
/** 需求描述输入框占位符 */
|
|
74
|
+
freeTextPlaceholder?: string;
|
|
75
|
+
/** 提交按钮文案 */
|
|
76
|
+
submitText?: string;
|
|
77
|
+
/** 弹窗宽度,默认 520px */
|
|
78
|
+
width?: string | number;
|
|
79
|
+
/** 受控显示弹窗;传入 v-model 时使用受控模式,未传时由 openUseDialog / openAiUseDialog 控制 */
|
|
80
|
+
modelValue?: boolean;
|
|
81
|
+
/** Provider 内置弹窗,默认 true;设为 false 时由页面自行挂载 YcAiUseDialog */
|
|
82
|
+
showDialog?: boolean;
|
|
83
|
+
}
|
|
84
|
+
export interface AiUseDialogOptions {
|
|
85
|
+
title?: string;
|
|
86
|
+
freeText?: string;
|
|
87
|
+
promptId?: number;
|
|
88
|
+
autoMatch?: boolean;
|
|
89
|
+
/** 本次打开时覆盖 props.prompts */
|
|
90
|
+
prompts?: AiPromptOption[];
|
|
91
|
+
onSubmitted?: (taskId: string) => void;
|
|
92
|
+
onFinish?: AiTaskFinishHandler;
|
|
93
|
+
}
|
|
94
|
+
export interface AiTaskFinishPayload {
|
|
95
|
+
taskId: string;
|
|
96
|
+
runId: number;
|
|
97
|
+
title: string;
|
|
98
|
+
freeText: string;
|
|
99
|
+
promptId?: number;
|
|
100
|
+
result: Record<string, unknown>;
|
|
101
|
+
finishedAt: number;
|
|
102
|
+
}
|
|
103
|
+
export type AiTaskFinishHandler = (data: AiTaskFinishPayload) => void;
|
|
104
|
+
export type AiTaskRunResult = WorkflowInvokeResponse;
|
|
105
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai-task/types/index.ts"],"names":[],"mappings":"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"}
|