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.
Files changed (80) hide show
  1. package/README.en.md +36 -0
  2. package/README.md +216 -0
  3. package/dist/_virtual/_plugin-vue_export-helper.js +9 -0
  4. package/dist/ai-task/api/http.d.ts +6 -0
  5. package/dist/ai-task/api/http.d.ts.map +1 -0
  6. package/dist/ai-task/api/http.js +40 -0
  7. package/dist/ai-task/api/prompt.d.ts +11 -0
  8. package/dist/ai-task/api/prompt.d.ts.map +1 -0
  9. package/dist/ai-task/api/prompt.js +9 -0
  10. package/dist/ai-task/api/workflow.d.ts +51 -0
  11. package/dist/ai-task/api/workflow.d.ts.map +1 -0
  12. package/dist/ai-task/api/workflow.js +15 -0
  13. package/dist/ai-task/components/AiTaskPanel.css +1 -0
  14. package/dist/ai-task/components/AiTaskPanel.d.ts +4 -0
  15. package/dist/ai-task/components/AiTaskPanel.d.ts.map +1 -0
  16. package/dist/ai-task/components/AiTaskPanel.vue.js +7 -0
  17. package/dist/ai-task/components/AiTaskPanel.vue2.js +251 -0
  18. package/dist/ai-task/components/AiTaskProvider.d.ts +26 -0
  19. package/dist/ai-task/components/AiTaskProvider.d.ts.map +1 -0
  20. package/dist/ai-task/components/AiTaskProvider.vue.js +60 -0
  21. package/dist/ai-task/components/AiTaskProvider.vue2.js +4 -0
  22. package/dist/ai-task/components/AiUseDialog.css +1 -0
  23. package/dist/ai-task/components/AiUseDialog.d.ts +22 -0
  24. package/dist/ai-task/components/AiUseDialog.d.ts.map +1 -0
  25. package/dist/ai-task/components/AiUseDialog.vue.js +7 -0
  26. package/dist/ai-task/components/AiUseDialog.vue2.js +224 -0
  27. package/dist/ai-task/composables/useAiTask.d.ts +62 -0
  28. package/dist/ai-task/composables/useAiTask.d.ts.map +1 -0
  29. package/dist/ai-task/composables/useAiTask.js +11 -0
  30. package/dist/ai-task/config.d.ts +23 -0
  31. package/dist/ai-task/config.d.ts.map +1 -0
  32. package/dist/ai-task/config.js +23 -0
  33. package/dist/ai-task/context.d.ts +59 -0
  34. package/dist/ai-task/context.d.ts.map +1 -0
  35. package/dist/ai-task/context.js +42 -0
  36. package/dist/ai-task/dialog-state.d.ts +28 -0
  37. package/dist/ai-task/dialog-state.d.ts.map +1 -0
  38. package/dist/ai-task/dialog-state.js +28 -0
  39. package/dist/ai-task/index.d.ts +15 -0
  40. package/dist/ai-task/index.d.ts.map +1 -0
  41. package/dist/ai-task/index.js +24 -0
  42. package/dist/ai-task/inject.d.ts +307 -0
  43. package/dist/ai-task/inject.d.ts.map +1 -0
  44. package/dist/ai-task/inject.js +10 -0
  45. package/dist/ai-task/services/taskRunner.d.ts +11 -0
  46. package/dist/ai-task/services/taskRunner.d.ts.map +1 -0
  47. package/dist/ai-task/services/taskRunner.js +60 -0
  48. package/dist/ai-task/store/useAiTaskStore.d.ts +255 -0
  49. package/dist/ai-task/store/useAiTaskStore.d.ts.map +1 -0
  50. package/dist/ai-task/store/useAiTaskStore.js +230 -0
  51. package/dist/ai-task/style.css +3 -0
  52. package/dist/ai-task/types/index.d.ts +105 -0
  53. package/dist/ai-task/types/index.d.ts.map +1 -0
  54. package/dist/ai-task/useScopedStore.d.ts +255 -0
  55. package/dist/ai-task/useScopedStore.d.ts.map +1 -0
  56. package/dist/ai-task/useScopedStore.js +10 -0
  57. package/dist/ai-task/utils/runClientScript.d.ts +5 -0
  58. package/dist/ai-task/utils/runClientScript.d.ts.map +1 -0
  59. package/dist/ai-task/utils/runClientScript.js +26 -0
  60. package/dist/ai-task/utils/storage.d.ts +20 -0
  61. package/dist/ai-task/utils/storage.d.ts.map +1 -0
  62. package/dist/ai-task/utils/storage.js +45 -0
  63. package/dist/index.d.ts +6 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +31 -0
  66. package/dist/page-window/YcPageWindow.css +1 -0
  67. package/dist/page-window/YcPageWindow.d.ts +58 -0
  68. package/dist/page-window/YcPageWindow.d.ts.map +1 -0
  69. package/dist/page-window/YcPageWindow.vue.js +7 -0
  70. package/dist/page-window/YcPageWindow.vue2.js +230 -0
  71. package/dist/page-window/index.d.ts +5 -0
  72. package/dist/page-window/index.d.ts.map +1 -0
  73. package/dist/page-window/index.js +5 -0
  74. package/dist/page-window/style.css +1 -0
  75. package/dist/page-window/types.d.ts +32 -0
  76. package/dist/page-window/types.d.ts.map +1 -0
  77. package/dist/plugin.d.ts +14 -0
  78. package/dist/plugin.d.ts.map +1 -0
  79. package/dist/plugin.js +19 -0
  80. 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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"}