@cecwxf/wtt 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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +147 -0
  3. package/bin/openclaw-wtt-bootstrap.mjs +181 -0
  4. package/dist/channel.d.ts +275 -0
  5. package/dist/channel.d.ts.map +1 -0
  6. package/dist/channel.js +2088 -0
  7. package/dist/channel.js.map +1 -0
  8. package/dist/commands/account.d.ts +16 -0
  9. package/dist/commands/account.d.ts.map +1 -0
  10. package/dist/commands/account.js +37 -0
  11. package/dist/commands/account.js.map +1 -0
  12. package/dist/commands/bind.d.ts +3 -0
  13. package/dist/commands/bind.d.ts.map +1 -0
  14. package/dist/commands/bind.js +102 -0
  15. package/dist/commands/bind.js.map +1 -0
  16. package/dist/commands/config.d.ts +3 -0
  17. package/dist/commands/config.d.ts.map +1 -0
  18. package/dist/commands/config.js +38 -0
  19. package/dist/commands/config.js.map +1 -0
  20. package/dist/commands/delegate.d.ts +7 -0
  21. package/dist/commands/delegate.d.ts.map +1 -0
  22. package/dist/commands/delegate.js +99 -0
  23. package/dist/commands/delegate.js.map +1 -0
  24. package/dist/commands/formatter.d.ts +8 -0
  25. package/dist/commands/formatter.d.ts.map +1 -0
  26. package/dist/commands/formatter.js +198 -0
  27. package/dist/commands/formatter.js.map +1 -0
  28. package/dist/commands/handlers.d.ts +3 -0
  29. package/dist/commands/handlers.d.ts.map +1 -0
  30. package/dist/commands/handlers.js +79 -0
  31. package/dist/commands/handlers.js.map +1 -0
  32. package/dist/commands/http.d.ts +26 -0
  33. package/dist/commands/http.d.ts.map +1 -0
  34. package/dist/commands/http.js +190 -0
  35. package/dist/commands/http.js.map +1 -0
  36. package/dist/commands/index.d.ts +3 -0
  37. package/dist/commands/index.d.ts.map +1 -0
  38. package/dist/commands/index.js +2 -0
  39. package/dist/commands/index.js.map +1 -0
  40. package/dist/commands/parser.d.ts +5 -0
  41. package/dist/commands/parser.d.ts.map +1 -0
  42. package/dist/commands/parser.js +325 -0
  43. package/dist/commands/parser.js.map +1 -0
  44. package/dist/commands/pipeline.d.ts +7 -0
  45. package/dist/commands/pipeline.d.ts.map +1 -0
  46. package/dist/commands/pipeline.js +99 -0
  47. package/dist/commands/pipeline.js.map +1 -0
  48. package/dist/commands/router.d.ts +18 -0
  49. package/dist/commands/router.d.ts.map +1 -0
  50. package/dist/commands/router.js +74 -0
  51. package/dist/commands/router.js.map +1 -0
  52. package/dist/commands/setup.d.ts +7 -0
  53. package/dist/commands/setup.d.ts.map +1 -0
  54. package/dist/commands/setup.js +89 -0
  55. package/dist/commands/setup.js.map +1 -0
  56. package/dist/commands/task.d.ts +26 -0
  57. package/dist/commands/task.d.ts.map +1 -0
  58. package/dist/commands/task.js +438 -0
  59. package/dist/commands/task.js.map +1 -0
  60. package/dist/commands/types.d.ts +173 -0
  61. package/dist/commands/types.d.ts.map +1 -0
  62. package/dist/commands/types.js +2 -0
  63. package/dist/commands/types.js.map +1 -0
  64. package/dist/e2e-crypto.d.ts +36 -0
  65. package/dist/e2e-crypto.d.ts.map +1 -0
  66. package/dist/e2e-crypto.js +166 -0
  67. package/dist/e2e-crypto.js.map +1 -0
  68. package/dist/index.d.ts +20 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +21 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/plugin-config.d.ts +32 -0
  73. package/dist/plugin-config.d.ts.map +1 -0
  74. package/dist/plugin-config.js +268 -0
  75. package/dist/plugin-config.js.map +1 -0
  76. package/dist/runtime/index.d.ts +13 -0
  77. package/dist/runtime/index.d.ts.map +1 -0
  78. package/dist/runtime/index.js +7 -0
  79. package/dist/runtime/index.js.map +1 -0
  80. package/dist/runtime/progress-ticker.d.ts +65 -0
  81. package/dist/runtime/progress-ticker.d.ts.map +1 -0
  82. package/dist/runtime/progress-ticker.js +116 -0
  83. package/dist/runtime/progress-ticker.js.map +1 -0
  84. package/dist/runtime/session-binding.d.ts +16 -0
  85. package/dist/runtime/session-binding.d.ts.map +1 -0
  86. package/dist/runtime/session-binding.js +20 -0
  87. package/dist/runtime/session-binding.js.map +1 -0
  88. package/dist/runtime/status-transition.d.ts +19 -0
  89. package/dist/runtime/status-transition.d.ts.map +1 -0
  90. package/dist/runtime/status-transition.js +95 -0
  91. package/dist/runtime/status-transition.js.map +1 -0
  92. package/dist/runtime/task-executor-persistence.d.ts +63 -0
  93. package/dist/runtime/task-executor-persistence.d.ts.map +1 -0
  94. package/dist/runtime/task-executor-persistence.js +201 -0
  95. package/dist/runtime/task-executor-persistence.js.map +1 -0
  96. package/dist/runtime/task-executor.d.ts +169 -0
  97. package/dist/runtime/task-executor.d.ts.map +1 -0
  98. package/dist/runtime/task-executor.js +1230 -0
  99. package/dist/runtime/task-executor.js.map +1 -0
  100. package/dist/runtime/task-status-handler.d.ts +28 -0
  101. package/dist/runtime/task-status-handler.d.ts.map +1 -0
  102. package/dist/runtime/task-status-handler.js +102 -0
  103. package/dist/runtime/task-status-handler.js.map +1 -0
  104. package/dist/types.d.ts +159 -0
  105. package/dist/types.d.ts.map +1 -0
  106. package/dist/types.js +6 -0
  107. package/dist/types.js.map +1 -0
  108. package/dist/ws-client.d.ts +90 -0
  109. package/dist/ws-client.d.ts.map +1 -0
  110. package/dist/ws-client.js +385 -0
  111. package/dist/ws-client.js.map +1 -0
  112. package/index.ts +19 -0
  113. package/openclaw.plugin.json +49 -0
  114. package/package.json +62 -0
  115. package/scripts/install-bootstrap-cli.sh +54 -0
@@ -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":"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"}
@@ -0,0 +1,169 @@
1
+ import { type ProgressHeartbeatPayload } from "./progress-ticker.js";
2
+ import { type RuntimeTransitionResult } from "./status-transition.js";
3
+ import { type TaskRunExecutorIntent, type TaskRunExecutorPersistenceOptions, type TaskRunIntentMetadata, type TaskRunRecoveryMetadata } from "./task-executor-persistence.js";
4
+ type HttpMethod = "GET" | "POST" | "PATCH";
5
+ type RecoverySource = "queued" | "running";
6
+ type InflightState = "queued" | "running";
7
+ export interface TaskRuntimeMetadata extends TaskRunIntentMetadata {
8
+ }
9
+ export interface RuntimeApiRequest {
10
+ method: HttpMethod;
11
+ path: string;
12
+ body?: unknown;
13
+ }
14
+ export interface TaskRunDetailPayload {
15
+ id: string;
16
+ title: string;
17
+ description: string;
18
+ topicId: string;
19
+ taskType: string;
20
+ execMode: string;
21
+ status: string;
22
+ }
23
+ export interface TaskRunInferenceRequest {
24
+ taskId: string;
25
+ prompt: string;
26
+ task: TaskRunDetailPayload;
27
+ accountId: string;
28
+ }
29
+ export interface TaskRunInferenceUsage {
30
+ promptTokens?: number;
31
+ completionTokens?: number;
32
+ cacheReadTokens?: number;
33
+ cacheWriteTokens?: number;
34
+ totalTokens?: number;
35
+ source?: string;
36
+ provider?: string;
37
+ model?: string;
38
+ }
39
+ export interface TaskRunInferenceResult {
40
+ outputText: string;
41
+ provider?: string;
42
+ usage?: TaskRunInferenceUsage;
43
+ raw?: unknown;
44
+ }
45
+ export interface TaskRunSessionRuntimeMetrics {
46
+ source?: string;
47
+ queueDepth?: number;
48
+ queueMode?: string;
49
+ sessionKey?: string;
50
+ inflight?: boolean;
51
+ }
52
+ export interface TaskRunExecutorRequest extends TaskRunExecutorIntent {
53
+ now?: () => Date;
54
+ apiRequest: (request: RuntimeApiRequest) => Promise<unknown>;
55
+ publishHeartbeat?: (payload: ProgressHeartbeatPayload) => Promise<void> | void;
56
+ fetchTaskDetail?: () => Promise<unknown>;
57
+ invokeTaskInference?: (request: TaskRunInferenceRequest) => Promise<TaskRunInferenceResult>;
58
+ getSessionRuntimeMetrics?: () => Promise<TaskRunSessionRuntimeMetrics | undefined> | TaskRunSessionRuntimeMetrics | undefined;
59
+ }
60
+ export interface TaskRunSummaryPayload {
61
+ kind: "task_run_summary";
62
+ taskId: string;
63
+ at: string;
64
+ status: string;
65
+ action: string;
66
+ transitionApplied: "run_endpoint" | "patch_status" | "none";
67
+ notes: string[];
68
+ nextSteps: string[];
69
+ outputPreview?: string;
70
+ }
71
+ export interface TaskRunPersistenceAck {
72
+ enabled: boolean;
73
+ filePath?: string;
74
+ recoveredFrom?: RecoverySource;
75
+ }
76
+ export interface TaskRunIdempotencyDecision {
77
+ decision: "enqueued" | "deduplicated";
78
+ idempotencyKey: string;
79
+ triggerContextKey: string;
80
+ reason: string;
81
+ duplicateState?: InflightState;
82
+ duplicateTaskId?: string;
83
+ duplicateEnqueuedAt?: string;
84
+ }
85
+ export interface TaskRunExecutionResult {
86
+ deduplicated: false;
87
+ taskId: string;
88
+ accountId: string;
89
+ queue: {
90
+ enqueuedAt: string;
91
+ dequeuedAt: string;
92
+ finishedAt: string;
93
+ pendingAfterDequeue: number;
94
+ };
95
+ transition: RuntimeTransitionResult;
96
+ transitionApplied: "run_endpoint" | "patch_status" | "none";
97
+ endpointFallbackUsed: boolean;
98
+ fallbackMessage?: string;
99
+ finalStatus: string;
100
+ task: TaskRunDetailPayload;
101
+ inference: {
102
+ attempted: boolean;
103
+ succeeded: boolean;
104
+ provider: string;
105
+ outputText: string;
106
+ prompt: string;
107
+ usage?: TaskRunInferenceUsage;
108
+ error?: string;
109
+ };
110
+ heartbeatPayloads: ProgressHeartbeatPayload[];
111
+ heartbeatPublished: number;
112
+ heartbeatPublishErrors: string[];
113
+ summary: TaskRunSummaryPayload;
114
+ persistence: TaskRunPersistenceAck;
115
+ idempotency: TaskRunIdempotencyDecision;
116
+ recovery?: TaskRunRecoveryMetadata;
117
+ }
118
+ export interface TaskRunDedupResult {
119
+ deduplicated: true;
120
+ taskId: string;
121
+ accountId: string;
122
+ queueLength: number;
123
+ runningTaskId: string | null;
124
+ persistence: TaskRunPersistenceAck;
125
+ idempotency: TaskRunIdempotencyDecision;
126
+ }
127
+ export type TaskRunEnqueueResult = TaskRunExecutionResult | TaskRunDedupResult;
128
+ export interface TaskRunExecutorSnapshot {
129
+ queueLength: number;
130
+ runningTaskId: string | null;
131
+ processing: boolean;
132
+ stopping: boolean;
133
+ lastError: string | null;
134
+ persistenceEnabled: boolean;
135
+ persistenceFilePath?: string;
136
+ enqueueAccepted: number;
137
+ dedupHits: number;
138
+ recovery: {
139
+ loadedQueued: number;
140
+ loadedRunning: number;
141
+ requeued: number;
142
+ skippedTerminalOrReview: number;
143
+ skippedByRetryCap: number;
144
+ retryAttempts: number;
145
+ };
146
+ drainLockContention: number;
147
+ }
148
+ export interface TaskRunExecutorLoop {
149
+ enqueueRun: (request: TaskRunExecutorRequest) => Promise<TaskRunEnqueueResult>;
150
+ getQueueDepth: () => number;
151
+ isProcessing: () => boolean;
152
+ getSnapshot: () => TaskRunExecutorSnapshot;
153
+ getStatus: () => TaskRunExecutorSnapshot;
154
+ stopGracefully: () => Promise<void>;
155
+ }
156
+ export interface TaskRunExecutorLoopOptions {
157
+ persistence?: TaskRunExecutorPersistenceOptions;
158
+ createRecoveredApiRequest?: (intent: TaskRunExecutorIntent, source: RecoverySource) => TaskRunExecutorRequest["apiRequest"] | undefined;
159
+ onRecoveredExecutionResult?: (result: TaskRunEnqueueResult) => void;
160
+ onRecoveredExecutionError?: (error: unknown, intent: TaskRunExecutorIntent) => void;
161
+ maxRecoveryRetryCount?: number;
162
+ reviewPatchRetryDelaysMs?: number[];
163
+ compensatingReviewDelayMs?: number;
164
+ compensatingReviewRetryDelaysMs?: number[];
165
+ }
166
+ export declare function createTaskRunExecutorLoop(options?: TaskRunExecutorLoopOptions): TaskRunExecutorLoop;
167
+ export declare function getSharedTaskRunExecutor(): TaskRunExecutorLoop;
168
+ export {};
169
+ //# sourceMappingURL=task-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-executor.d.ts","sourceRoot":"","sources":["../../src/runtime/task-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAKL,KAAK,qBAAqB,EAC1B,KAAK,iCAAiC,EACtC,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC7B,MAAM,gCAAgC,CAAC;AAExC,KAAK,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAS3C,KAAK,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC3C,KAAK,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE1C,MAAM,WAAW,mBAAoB,SAAQ,qBAAqB;CAAG;AAErE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,UAAU,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/E,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC5F,wBAAwB,CAAC,EAAE,MAAM,OAAO,CAAC,4BAA4B,GAAG,SAAS,CAAC,GAAG,4BAA4B,GAAG,SAAS,CAAC;CAC/H;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,cAAc,GAAG,cAAc,GAAG,MAAM,CAAC;IAC5D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,UAAU,GAAG,cAAc,CAAC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,KAAK,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,UAAU,EAAE,uBAAuB,CAAC;IACpC,iBAAiB,EAAE,cAAc,GAAG,cAAc,GAAG,MAAM,CAAC;IAC5D,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,EAAE;QACT,SAAS,EAAE,OAAO,CAAC;QACnB,SAAS,EAAE,OAAO,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,qBAAqB,CAAC;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,iBAAiB,EAAE,wBAAwB,EAAE,CAAC;IAC9C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,WAAW,EAAE,qBAAqB,CAAC;IACnC,WAAW,EAAE,0BAA0B,CAAC;IACxC,QAAQ,CAAC,EAAE,uBAAuB,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,qBAAqB,CAAC;IACnC,WAAW,EAAE,0BAA0B,CAAC;CACzC;AAED,MAAM,MAAM,oBAAoB,GAAG,sBAAsB,GAAG,kBAAkB,CAAC;AAe/E,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,uBAAuB,EAAE,MAAM,CAAC;QAChC,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC/E,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B,WAAW,EAAE,MAAM,uBAAuB,CAAC;IAC3C,SAAS,EAAE,MAAM,uBAAuB,CAAC;IACzC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,iCAAiC,CAAC;IAChD,yBAAyB,CAAC,EAAE,CAC1B,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,cAAc,KACnB,sBAAsB,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IACtD,0BAA0B,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACpE,yBAAyB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACpF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,+BAA+B,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5C;AAm5CD,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,0BAA0B,GAAG,mBAAmB,CAEnG;AAMD,wBAAgB,wBAAwB,IAAI,mBAAmB,CAE9D"}