@cecwxf/wtt 0.1.10 → 0.1.12

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 (105) hide show
  1. package/dist/channel.d.ts +280 -0
  2. package/dist/channel.d.ts.map +1 -0
  3. package/dist/channel.js +2803 -0
  4. package/dist/channel.js.map +1 -0
  5. package/dist/commands/account.d.ts +16 -0
  6. package/dist/commands/account.d.ts.map +1 -0
  7. package/dist/commands/account.js +37 -0
  8. package/dist/commands/account.js.map +1 -0
  9. package/dist/commands/bind.d.ts +3 -0
  10. package/dist/commands/bind.d.ts.map +1 -0
  11. package/dist/commands/bind.js +102 -0
  12. package/dist/commands/bind.js.map +1 -0
  13. package/dist/commands/config.d.ts +3 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +38 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/delegate.d.ts +7 -0
  18. package/dist/commands/delegate.d.ts.map +1 -0
  19. package/dist/commands/delegate.js +99 -0
  20. package/dist/commands/delegate.js.map +1 -0
  21. package/dist/commands/formatter.d.ts +8 -0
  22. package/dist/commands/formatter.d.ts.map +1 -0
  23. package/dist/commands/formatter.js +200 -0
  24. package/dist/commands/formatter.js.map +1 -0
  25. package/dist/commands/handlers.d.ts +3 -0
  26. package/dist/commands/handlers.d.ts.map +1 -0
  27. package/dist/commands/handlers.js +87 -0
  28. package/dist/commands/handlers.js.map +1 -0
  29. package/dist/commands/http.d.ts +26 -0
  30. package/dist/commands/http.d.ts.map +1 -0
  31. package/dist/commands/http.js +190 -0
  32. package/dist/commands/http.js.map +1 -0
  33. package/dist/commands/index.d.ts +3 -0
  34. package/dist/commands/index.d.ts.map +1 -0
  35. package/dist/commands/index.js +2 -0
  36. package/dist/commands/index.js.map +1 -0
  37. package/dist/commands/parser.d.ts +5 -0
  38. package/dist/commands/parser.d.ts.map +1 -0
  39. package/dist/commands/parser.js +333 -0
  40. package/dist/commands/parser.js.map +1 -0
  41. package/dist/commands/pipeline.d.ts +7 -0
  42. package/dist/commands/pipeline.d.ts.map +1 -0
  43. package/dist/commands/pipeline.js +99 -0
  44. package/dist/commands/pipeline.js.map +1 -0
  45. package/dist/commands/router.d.ts +18 -0
  46. package/dist/commands/router.d.ts.map +1 -0
  47. package/dist/commands/router.js +75 -0
  48. package/dist/commands/router.js.map +1 -0
  49. package/dist/commands/setup.d.ts +7 -0
  50. package/dist/commands/setup.d.ts.map +1 -0
  51. package/dist/commands/setup.js +89 -0
  52. package/dist/commands/setup.js.map +1 -0
  53. package/dist/commands/task.d.ts +26 -0
  54. package/dist/commands/task.d.ts.map +1 -0
  55. package/dist/commands/task.js +438 -0
  56. package/dist/commands/task.js.map +1 -0
  57. package/dist/commands/types.d.ts +175 -0
  58. package/dist/commands/types.d.ts.map +1 -0
  59. package/dist/commands/types.js +2 -0
  60. package/dist/commands/types.js.map +1 -0
  61. package/dist/e2e-crypto.d.ts +36 -0
  62. package/dist/e2e-crypto.d.ts.map +1 -0
  63. package/dist/e2e-crypto.js +166 -0
  64. package/dist/e2e-crypto.js.map +1 -0
  65. package/dist/index.d.ts +20 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +21 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/runtime/index.d.ts +13 -0
  70. package/dist/runtime/index.d.ts.map +1 -0
  71. package/dist/runtime/index.js +7 -0
  72. package/dist/runtime/index.js.map +1 -0
  73. package/dist/runtime/progress-ticker.d.ts +65 -0
  74. package/dist/runtime/progress-ticker.d.ts.map +1 -0
  75. package/dist/runtime/progress-ticker.js +116 -0
  76. package/dist/runtime/progress-ticker.js.map +1 -0
  77. package/dist/runtime/session-binding.d.ts +16 -0
  78. package/dist/runtime/session-binding.d.ts.map +1 -0
  79. package/dist/runtime/session-binding.js +20 -0
  80. package/dist/runtime/session-binding.js.map +1 -0
  81. package/dist/runtime/status-transition.d.ts +19 -0
  82. package/dist/runtime/status-transition.d.ts.map +1 -0
  83. package/dist/runtime/status-transition.js +95 -0
  84. package/dist/runtime/status-transition.js.map +1 -0
  85. package/dist/runtime/task-executor-persistence.d.ts +63 -0
  86. package/dist/runtime/task-executor-persistence.d.ts.map +1 -0
  87. package/dist/runtime/task-executor-persistence.js +201 -0
  88. package/dist/runtime/task-executor-persistence.js.map +1 -0
  89. package/dist/runtime/task-executor.d.ts +169 -0
  90. package/dist/runtime/task-executor.d.ts.map +1 -0
  91. package/dist/runtime/task-executor.js +1230 -0
  92. package/dist/runtime/task-executor.js.map +1 -0
  93. package/dist/runtime/task-status-handler.d.ts +28 -0
  94. package/dist/runtime/task-status-handler.d.ts.map +1 -0
  95. package/dist/runtime/task-status-handler.js +102 -0
  96. package/dist/runtime/task-status-handler.js.map +1 -0
  97. package/dist/types.d.ts +166 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +6 -0
  100. package/dist/types.js.map +1 -0
  101. package/dist/ws-client.d.ts +91 -0
  102. package/dist/ws-client.d.ts.map +1 -0
  103. package/dist/ws-client.js +386 -0
  104. package/dist/ws-client.js.map +1 -0
  105. package/package.json +3 -2
@@ -0,0 +1,116 @@
1
+ const DEFAULT_HEARTBEAT_SECONDS = 60;
2
+ function normalizeHeartbeatSeconds(raw) {
3
+ return Number.isFinite(raw)
4
+ ? Math.max(1, Math.floor(raw))
5
+ : DEFAULT_HEARTBEAT_SECONDS;
6
+ }
7
+ function normalizeText(raw, fallback) {
8
+ const value = raw.trim();
9
+ return value || fallback;
10
+ }
11
+ export function buildProgressHeartbeat(params) {
12
+ const heartbeatSeconds = normalizeHeartbeatSeconds(params.heartbeatSeconds);
13
+ const at = (params.now ?? new Date()).toISOString();
14
+ const status = normalizeText(params.status, "unknown");
15
+ const action = normalizeText(params.action, "(未提供动作描述)");
16
+ const elapsedSeconds = Number.isFinite(params.elapsedSeconds)
17
+ ? Math.max(0, Math.floor(params.elapsedSeconds))
18
+ : undefined;
19
+ const queueDepth = Number.isFinite(params.queueDepth)
20
+ ? Math.max(0, Math.floor(params.queueDepth))
21
+ : undefined;
22
+ const queueMode = typeof params.queueMode === "string" ? params.queueMode.trim() : "";
23
+ const source = typeof params.source === "string" ? params.source.trim() : "";
24
+ const sessionKey = typeof params.sessionKey === "string" ? params.sessionKey.trim() : "";
25
+ const inflight = typeof params.inflight === "boolean" ? params.inflight : undefined;
26
+ const parts = [`[${at}]`, `状态=${status}`, `动作=${action}`];
27
+ if (typeof elapsedSeconds === "number")
28
+ parts.push(`elapsed=${elapsedSeconds}s`);
29
+ if (typeof queueDepth === "number")
30
+ parts.push(`queue_depth=${queueDepth}`);
31
+ if (queueMode)
32
+ parts.push(`queue_mode=${queueMode}`);
33
+ if (source)
34
+ parts.push(`source=${source}`);
35
+ if (sessionKey)
36
+ parts.push(`session=${sessionKey}`);
37
+ if (typeof inflight === "boolean")
38
+ parts.push(`inflight=${inflight ? 1 : 0}`);
39
+ parts.push(`心跳=${heartbeatSeconds}s`);
40
+ const text = parts.join(" | ");
41
+ return {
42
+ kind: "task_progress_heartbeat",
43
+ taskId: params.taskId,
44
+ heartbeatSeconds,
45
+ at,
46
+ status,
47
+ action,
48
+ elapsedSeconds,
49
+ queueDepth,
50
+ queueMode: queueMode || undefined,
51
+ source: source || undefined,
52
+ sessionKey: sessionKey || undefined,
53
+ inflight,
54
+ text,
55
+ };
56
+ }
57
+ export function createProgressHeartbeatScheduler(params) {
58
+ const heartbeatSeconds = normalizeHeartbeatSeconds(params.heartbeatSeconds);
59
+ const nowFn = params.now ?? (() => new Date());
60
+ const setIntervalFn = params.setIntervalFn ?? setInterval;
61
+ const clearIntervalFn = params.clearIntervalFn ?? clearInterval;
62
+ let latestStatus = normalizeText(params.status, "unknown");
63
+ let latestAction = normalizeText(params.action, "(未提供动作描述)");
64
+ let timer = null;
65
+ const generated = [];
66
+ const emitNow = async (overrides) => {
67
+ if (typeof overrides?.status === "string") {
68
+ latestStatus = normalizeText(overrides.status, latestStatus);
69
+ }
70
+ if (typeof overrides?.action === "string") {
71
+ latestAction = normalizeText(overrides.action, latestAction);
72
+ }
73
+ const metrics = params.getMetrics ? await params.getMetrics() : undefined;
74
+ const payload = buildProgressHeartbeat({
75
+ taskId: params.taskId,
76
+ status: latestStatus,
77
+ action: latestAction,
78
+ heartbeatSeconds,
79
+ now: overrides?.now ?? nowFn(),
80
+ elapsedSeconds: metrics?.elapsedSeconds,
81
+ queueDepth: metrics?.queueDepth,
82
+ queueMode: metrics?.queueMode,
83
+ source: metrics?.source,
84
+ sessionKey: metrics?.sessionKey,
85
+ inflight: metrics?.inflight,
86
+ });
87
+ generated.push(payload);
88
+ if (params.publish) {
89
+ await params.publish(payload);
90
+ }
91
+ return payload;
92
+ };
93
+ const start = () => {
94
+ if (timer)
95
+ return;
96
+ timer = setIntervalFn(() => {
97
+ void emitNow().catch(() => {
98
+ // 由调用方(执行器)记录 publish 错误;定时触发不应中断执行队列
99
+ });
100
+ }, heartbeatSeconds * 1000);
101
+ };
102
+ const stop = () => {
103
+ if (!timer)
104
+ return;
105
+ clearIntervalFn(timer);
106
+ timer = null;
107
+ };
108
+ return {
109
+ start,
110
+ stop,
111
+ emitNow,
112
+ getGeneratedPayloads: () => [...generated],
113
+ getHeartbeatSeconds: () => heartbeatSeconds,
114
+ };
115
+ }
116
+ //# sourceMappingURL=progress-ticker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-ticker.js","sourceRoot":"","sources":["../../src/runtime/progress-ticker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface SessionBindingPlaceholder {
2
+ kind: "placeholder";
3
+ taskId: string;
4
+ accountId: string;
5
+ createdAt: string;
6
+ sessionsSpawnReady: false;
7
+ sessionsSendReady: false;
8
+ note: string;
9
+ }
10
+ export declare function createSessionBindingPlaceholder(params: {
11
+ taskId: string;
12
+ accountId: string;
13
+ now?: Date;
14
+ }): SessionBindingPlaceholder;
15
+ export declare function describeSessionBindingNextAction(binding: SessionBindingPlaceholder): string;
16
+ //# sourceMappingURL=session-binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-binding.d.ts","sourceRoot":"","sources":["../../src/runtime/session-binding.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,KAAK,CAAC;IAC1B,iBAAiB,EAAE,KAAK,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG,yBAAyB,CAU5B;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,yBAAyB,GAAG,MAAM,CAO3F"}
@@ -0,0 +1,20 @@
1
+ export function createSessionBindingPlaceholder(params) {
2
+ return {
3
+ kind: "placeholder",
4
+ taskId: params.taskId,
5
+ accountId: params.accountId,
6
+ createdAt: (params.now ?? new Date()).toISOString(),
7
+ sessionsSpawnReady: false,
8
+ sessionsSendReady: false,
9
+ note: "legacy sessions_* 依赖已移除;当前由插件内部执行器队列驱动。",
10
+ };
11
+ }
12
+ export function describeSessionBindingNextAction(binding) {
13
+ return [
14
+ `会话绑定: ${binding.kind}`,
15
+ `spawn: ${binding.sessionsSpawnReady ? "ready" : "n/a"}`,
16
+ `send: ${binding.sessionsSendReady ? "ready" : "n/a"}`,
17
+ "后续动作: 在内部执行器中接入真实执行体(保持 queue/heartbeat/summary 语义)。",
18
+ ].join(" | ");
19
+ }
20
+ //# sourceMappingURL=session-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-binding.js","sourceRoot":"","sources":["../../src/runtime/session-binding.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,+BAA+B,CAAC,MAI/C;IACC,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;QACnD,kBAAkB,EAAE,KAAK;QACzB,iBAAiB,EAAE,KAAK;QACxB,IAAI,EAAE,yCAAyC;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAkC;IACjF,OAAO;QACL,SAAS,OAAO,CAAC,IAAI,EAAE;QACvB,UAAU,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;QACxD,SAAS,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;QACtD,sDAAsD;KACvD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type RuntimeReviewAction = "approve" | "reject" | "block";
2
+ export type RuntimeTransitionIntent = {
3
+ kind: "run";
4
+ } | {
5
+ kind: "review";
6
+ action: RuntimeReviewAction;
7
+ };
8
+ export interface RuntimeTransitionResult {
9
+ allowed: boolean;
10
+ fromStatus: string;
11
+ toStatus: string;
12
+ reason: string;
13
+ nextAction: string;
14
+ }
15
+ export declare function validateTaskTransition(params: {
16
+ currentStatus?: string;
17
+ intent: RuntimeTransitionIntent;
18
+ }): RuntimeTransitionResult;
19
+ //# sourceMappingURL=status-transition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-transition.d.ts","sourceRoot":"","sources":["../../src/runtime/status-transition.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjE,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEpD,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAsCD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,uBAAuB,CAAC;CACjC,GAAG,uBAAuB,CAgE1B"}
@@ -0,0 +1,95 @@
1
+ const STATUS_ALIASES = {
2
+ open: "todo",
3
+ ready: "todo",
4
+ approved: "done",
5
+ rejected: "blocked",
6
+ };
7
+ const ALLOWED_TRANSITIONS = {
8
+ todo: new Set(["doing", "blocked", "cancelled"]),
9
+ doing: new Set(["review", "blocked", "todo", "cancelled", "done"]),
10
+ review: new Set(["done", "doing", "blocked", "cancelled"]),
11
+ blocked: new Set(["todo", "doing", "cancelled"]),
12
+ done: new Set(["doing"]),
13
+ cancelled: new Set(["todo"]),
14
+ };
15
+ function normalizeStatus(status) {
16
+ if (!status)
17
+ return "unknown";
18
+ const normalized = status.trim().toLowerCase();
19
+ if (!normalized)
20
+ return "unknown";
21
+ return STATUS_ALIASES[normalized] ?? normalized;
22
+ }
23
+ function reviewTargetStatus(action) {
24
+ if (action === "approve")
25
+ return "done";
26
+ if (action === "reject")
27
+ return "doing";
28
+ return "blocked";
29
+ }
30
+ function canTransition(fromStatus, toStatus) {
31
+ if (fromStatus === toStatus)
32
+ return true;
33
+ const allowed = ALLOWED_TRANSITIONS[fromStatus];
34
+ if (!allowed)
35
+ return false;
36
+ return allowed.has(toStatus);
37
+ }
38
+ export function validateTaskTransition(params) {
39
+ const fromStatus = normalizeStatus(params.currentStatus);
40
+ if (params.intent.kind === "run") {
41
+ const toStatus = "doing";
42
+ if (canTransition(fromStatus, toStatus)) {
43
+ return {
44
+ allowed: true,
45
+ fromStatus,
46
+ toStatus,
47
+ reason: `状态允许执行 run:${fromStatus} -> ${toStatus}`,
48
+ nextAction: "将任务推进为 doing,并由执行体持续上报进展。",
49
+ };
50
+ }
51
+ if (fromStatus === "unknown") {
52
+ return {
53
+ allowed: false,
54
+ fromStatus,
55
+ toStatus: fromStatus,
56
+ reason: "无法确认任务状态,禁止直接 run。",
57
+ nextAction: "先执行 @wtt task detail <task_id> 核对状态后再重试。",
58
+ };
59
+ }
60
+ return {
61
+ allowed: false,
62
+ fromStatus,
63
+ toStatus: fromStatus,
64
+ reason: `状态不允许 run:${fromStatus} -> ${toStatus}`,
65
+ nextAction: "请先通过任务系统调整状态后再执行 run。",
66
+ };
67
+ }
68
+ const toStatus = reviewTargetStatus(params.intent.action);
69
+ if (canTransition(fromStatus, toStatus)) {
70
+ return {
71
+ allowed: true,
72
+ fromStatus,
73
+ toStatus,
74
+ reason: `review 动作允许:${fromStatus} -> ${toStatus}`,
75
+ nextAction: "可继续调用 review API 落地审查结果。",
76
+ };
77
+ }
78
+ if (fromStatus === "unknown") {
79
+ return {
80
+ allowed: false,
81
+ fromStatus,
82
+ toStatus,
83
+ reason: "无法确认当前状态,禁止直接 review。",
84
+ nextAction: "先执行 @wtt task detail <task_id> 获取最新状态。",
85
+ };
86
+ }
87
+ return {
88
+ allowed: false,
89
+ fromStatus,
90
+ toStatus,
91
+ reason: `review 约束不满足:${fromStatus} -> ${toStatus}`,
92
+ nextAction: "将任务状态调整到允许区间后再执行 review。",
93
+ };
94
+ }
95
+ //# sourceMappingURL=status-transition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-transition.js","sourceRoot":"","sources":["../../src/runtime/status-transition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ export interface TaskRunIntentMetadata {
2
+ id: string;
3
+ title: string;
4
+ status: string;
5
+ priority: string;
6
+ ownerAgentId: string;
7
+ runnerAgentId: string;
8
+ pipelineId: string;
9
+ topicId: string;
10
+ description?: string;
11
+ taskType?: string;
12
+ execMode?: string;
13
+ }
14
+ export interface TaskRunApiContext {
15
+ cloudUrl: string;
16
+ token?: string;
17
+ timeoutMs?: number;
18
+ }
19
+ export interface TaskRunRecoveryMetadata {
20
+ retryCount: number;
21
+ maxRetryCount: number;
22
+ lastRecoveredAt?: string;
23
+ }
24
+ export interface TaskRunExecutorIntent {
25
+ taskId: string;
26
+ metadata: TaskRunIntentMetadata;
27
+ accountId: string;
28
+ triggerAgentId?: string;
29
+ runnerAgentId?: string;
30
+ note?: string;
31
+ heartbeatSeconds?: number;
32
+ apiContext?: TaskRunApiContext;
33
+ triggerContextKey?: string;
34
+ idempotencyKey?: string;
35
+ recovery?: TaskRunRecoveryMetadata;
36
+ }
37
+ export interface PersistedTaskRunQueueItem {
38
+ intent: TaskRunExecutorIntent;
39
+ enqueuedAt: string;
40
+ }
41
+ export interface PersistedTaskRunQueueState {
42
+ queued: PersistedTaskRunQueueItem[];
43
+ running?: PersistedTaskRunQueueItem;
44
+ }
45
+ export interface TaskRunExecutorPersistenceOptions {
46
+ enabled?: boolean;
47
+ dataDir?: string;
48
+ filePath?: string;
49
+ }
50
+ export interface ResolvedTaskRunExecutorPersistenceOptions {
51
+ enabled: boolean;
52
+ dataDir: string;
53
+ filePath: string;
54
+ }
55
+ export declare function resolveTaskRunExecutorPersistenceOptions(options?: TaskRunExecutorPersistenceOptions): ResolvedTaskRunExecutorPersistenceOptions;
56
+ export declare class TaskRunExecutorQueueStore {
57
+ private readonly filePath;
58
+ private writeChain;
59
+ constructor(filePath: string);
60
+ load(): Promise<PersistedTaskRunQueueState>;
61
+ save(state: PersistedTaskRunQueueState): Promise<void>;
62
+ }
63
+ //# sourceMappingURL=task-executor-persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-executor-persistence.d.ts","sourceRoot":"","sources":["../../src/runtime/task-executor-persistence.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,qBAAqB,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,uBAAuB,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,yBAAyB,EAAE,CAAC;IACpC,OAAO,CAAC,EAAE,yBAAyB,CAAC;CACrC;AAOD,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yCAAyC;IACxD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAqID,wBAAgB,wCAAwC,CACtD,OAAO,CAAC,EAAE,iCAAiC,GAC1C,yCAAyC,CAU3C;AAED,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,UAAU,CAAoC;gBAE1C,QAAQ,EAAE,MAAM;IAItB,IAAI,IAAI,OAAO,CAAC,0BAA0B,CAAC;IAiC3C,IAAI,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;CA8B7D"}
@@ -0,0 +1,201 @@
1
+ import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
2
+ import { fileURLToPath } from "node:url";
3
+ import path from "node:path";
4
+ const DEFAULT_RUNTIME_DATA_DIR = fileURLToPath(new URL("../../runtime-data", import.meta.url));
5
+ const DEFAULT_QUEUE_FILE_NAME = "task-executor-queue.json";
6
+ function asRecord(value) {
7
+ if (!value || typeof value !== "object" || Array.isArray(value))
8
+ return null;
9
+ return value;
10
+ }
11
+ function asString(value) {
12
+ if (typeof value !== "string")
13
+ return undefined;
14
+ const trimmed = value.trim();
15
+ return trimmed || undefined;
16
+ }
17
+ function asNumber(value) {
18
+ if (typeof value !== "number" || !Number.isFinite(value))
19
+ return undefined;
20
+ return value;
21
+ }
22
+ function asInt(value) {
23
+ const raw = asNumber(value);
24
+ if (raw === undefined)
25
+ return undefined;
26
+ const normalized = Math.floor(raw);
27
+ if (!Number.isFinite(normalized) || normalized < 0)
28
+ return undefined;
29
+ return normalized;
30
+ }
31
+ function parseMetadata(value) {
32
+ const raw = asRecord(value);
33
+ if (!raw)
34
+ return null;
35
+ const id = asString(raw.id);
36
+ const title = asString(raw.title);
37
+ const status = asString(raw.status);
38
+ const priority = asString(raw.priority);
39
+ const ownerAgentId = asString(raw.ownerAgentId);
40
+ const runnerAgentId = asString(raw.runnerAgentId);
41
+ const pipelineId = asString(raw.pipelineId);
42
+ const topicId = asString(raw.topicId);
43
+ const description = asString(raw.description);
44
+ const taskType = asString(raw.taskType);
45
+ const execMode = asString(raw.execMode);
46
+ if (!id || !title || !status || !priority || !ownerAgentId || !runnerAgentId || !pipelineId || !topicId) {
47
+ return null;
48
+ }
49
+ return {
50
+ id,
51
+ title,
52
+ status,
53
+ priority,
54
+ ownerAgentId,
55
+ runnerAgentId,
56
+ pipelineId,
57
+ topicId,
58
+ description,
59
+ taskType,
60
+ execMode,
61
+ };
62
+ }
63
+ function parseApiContext(value) {
64
+ const raw = asRecord(value);
65
+ if (!raw)
66
+ return undefined;
67
+ const cloudUrl = asString(raw.cloudUrl);
68
+ if (!cloudUrl)
69
+ return undefined;
70
+ const token = asString(raw.token);
71
+ const timeoutMs = asNumber(raw.timeoutMs);
72
+ return {
73
+ cloudUrl,
74
+ token,
75
+ timeoutMs,
76
+ };
77
+ }
78
+ function parseRecovery(value) {
79
+ const raw = asRecord(value);
80
+ if (!raw)
81
+ return undefined;
82
+ const retryCount = asInt(raw.retryCount);
83
+ const maxRetryCount = asInt(raw.maxRetryCount);
84
+ if (retryCount === undefined || maxRetryCount === undefined)
85
+ return undefined;
86
+ return {
87
+ retryCount,
88
+ maxRetryCount,
89
+ lastRecoveredAt: asString(raw.lastRecoveredAt),
90
+ };
91
+ }
92
+ function parseIntent(value) {
93
+ const raw = asRecord(value);
94
+ if (!raw)
95
+ return null;
96
+ const taskId = asString(raw.taskId);
97
+ const accountId = asString(raw.accountId);
98
+ const metadata = parseMetadata(raw.metadata);
99
+ if (!taskId || !accountId || !metadata)
100
+ return null;
101
+ return {
102
+ taskId,
103
+ metadata,
104
+ accountId,
105
+ triggerAgentId: asString(raw.triggerAgentId),
106
+ runnerAgentId: asString(raw.runnerAgentId),
107
+ note: asString(raw.note),
108
+ heartbeatSeconds: asNumber(raw.heartbeatSeconds),
109
+ apiContext: parseApiContext(raw.apiContext),
110
+ triggerContextKey: asString(raw.triggerContextKey),
111
+ idempotencyKey: asString(raw.idempotencyKey),
112
+ recovery: parseRecovery(raw.recovery),
113
+ };
114
+ }
115
+ function parseQueueItem(value) {
116
+ const raw = asRecord(value);
117
+ if (!raw)
118
+ return null;
119
+ const intent = parseIntent(raw.intent);
120
+ const enqueuedAt = asString(raw.enqueuedAt);
121
+ if (!intent || !enqueuedAt)
122
+ return null;
123
+ return { intent, enqueuedAt };
124
+ }
125
+ export function resolveTaskRunExecutorPersistenceOptions(options) {
126
+ const enabled = options?.enabled === true;
127
+ const dataDir = options?.dataDir
128
+ ? path.resolve(options.dataDir)
129
+ : DEFAULT_RUNTIME_DATA_DIR;
130
+ const filePath = options?.filePath
131
+ ? path.resolve(options.filePath)
132
+ : path.join(dataDir, DEFAULT_QUEUE_FILE_NAME);
133
+ return { enabled, dataDir, filePath };
134
+ }
135
+ export class TaskRunExecutorQueueStore {
136
+ filePath;
137
+ writeChain = Promise.resolve();
138
+ constructor(filePath) {
139
+ this.filePath = filePath;
140
+ }
141
+ async load() {
142
+ let rawText = "";
143
+ try {
144
+ rawText = await readFile(this.filePath, "utf8");
145
+ }
146
+ catch (error) {
147
+ const err = error;
148
+ if (err?.code === "ENOENT") {
149
+ return { queued: [] };
150
+ }
151
+ throw error;
152
+ }
153
+ if (!rawText.trim())
154
+ return { queued: [] };
155
+ const parsed = JSON.parse(rawText);
156
+ const payload = asRecord(parsed);
157
+ if (!payload)
158
+ return { queued: [] };
159
+ const queuedRaw = Array.isArray(payload.queued) ? payload.queued : [];
160
+ const queued = [];
161
+ for (const item of queuedRaw) {
162
+ const parsedItem = parseQueueItem(item);
163
+ if (parsedItem)
164
+ queued.push(parsedItem);
165
+ }
166
+ const running = parseQueueItem(payload.running);
167
+ return {
168
+ queued,
169
+ running: running ?? undefined,
170
+ };
171
+ }
172
+ async save(state) {
173
+ this.writeChain = this.writeChain.then(async () => {
174
+ const payload = {
175
+ version: 1,
176
+ updatedAt: new Date().toISOString(),
177
+ queued: state.queued,
178
+ running: state.running,
179
+ };
180
+ const dir = path.dirname(this.filePath);
181
+ await mkdir(dir, { recursive: true });
182
+ const tmpPath = `${this.filePath}.tmp-${process.pid}-${Date.now()}`;
183
+ const content = `${JSON.stringify(payload, null, 2)}\n`;
184
+ try {
185
+ await writeFile(tmpPath, content, "utf8");
186
+ await rename(tmpPath, this.filePath);
187
+ }
188
+ catch (error) {
189
+ try {
190
+ await unlink(tmpPath);
191
+ }
192
+ catch {
193
+ // ignore cleanup failure
194
+ }
195
+ throw error;
196
+ }
197
+ });
198
+ return this.writeChain;
199
+ }
200
+ }
201
+ //# sourceMappingURL=task-executor-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-executor-persistence.js","sourceRoot":"","sources":["../../src/runtime/task-executor-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAqE7B,MAAM,wBAAwB,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/F,MAAM,uBAAuB,GAAG,0BAA0B,CAAC;AAE3D,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACrE,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAExC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,IAAI,CAAC,aAAa,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE,CAAC;QACxG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,EAAE;QACF,KAAK;QACL,MAAM;QACN,QAAQ;QACR,YAAY;QACZ,aAAa;QACb,UAAU;QACV,OAAO;QACP,WAAW;QACX,QAAQ;QACR,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAE3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAE1C,OAAO;QACL,QAAQ;QACR,KAAK;QACL,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAE3B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE/C,IAAI,UAAU,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE9E,OAAO;QACL,UAAU;QACV,aAAa;QACb,eAAe,EAAE,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE7C,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEpD,OAAO;QACL,MAAM;QACN,QAAQ;QACR,SAAS;QACT,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC;QAC5C,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;QAC1C,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,gBAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAChD,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC;QAC3C,iBAAiB,EAAE,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAClD,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC;QAC5C,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE5C,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,wCAAwC,CACtD,OAA2C;IAE3C,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO;QAC9B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAC/B,CAAC,CAAC,wBAAwB,CAAC;IAC7B,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ;QAChC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QAChC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAEhD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,OAAO,yBAAyB;IACnB,QAAQ,CAAS;IAC1B,UAAU,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEtD,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAA8B,CAAC;YAC3C,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACxB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;QAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAEpC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,MAAM,MAAM,GAAgC,EAAE,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,UAAU;gBAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEhD,OAAO;YACL,MAAM;YACN,OAAO,EAAE,OAAO,IAAI,SAAS;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAiC;QAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAChD,MAAM,OAAO,GAA8B;gBACzC,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC;YAEF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtC,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,QAAQ,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACpE,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;YAExD,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC1C,MAAM,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;gBAAC,MAAM,CAAC;oBACP,yBAAyB;gBAC3B,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}