openfox 2.0.113 → 2.0.114

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 (94) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/CHANGELOG.md +22 -0
  3. package/dist/agent-defaults/builder.agent.md +1 -0
  4. package/dist/agent-defaults/planner.agent.md +1 -0
  5. package/dist/{backend-P3GHHLHJ.js → backend-LVYHLGQJ.js} +2 -2
  6. package/dist/{chat-handler-PEK5JDHO.js → chat-handler-KWXRSWXZ.js} +31 -25
  7. package/dist/{chunk-HKD4IMOE.js → chunk-2XD65L7M.js} +2 -2
  8. package/dist/{chunk-AZFZE36I.js → chunk-3O77NT4T.js} +17 -7
  9. package/dist/{chunk-HGOTZWON.js → chunk-7GWARYQC.js} +60 -1064
  10. package/dist/{chunk-YHEQTVFV.js → chunk-AZHWLLPP.js} +1 -1
  11. package/dist/{chunk-6UPBZ2ZR.js → chunk-BZVW77PI.js} +4 -4
  12. package/dist/{chunk-YGPPFVLJ.js → chunk-FW4NDUBL.js} +15 -15
  13. package/dist/{chunk-O2YSYW2F.js → chunk-GUHHUDNL.js} +6 -6
  14. package/dist/{chunk-WWTYWLDM.js → chunk-HP5CIB66.js} +2 -2
  15. package/dist/{chunk-ONONXV3N.js → chunk-HV6IALXF.js} +4 -4
  16. package/dist/{chunk-4NMGX5F2.js → chunk-I7FY2LTR.js} +2 -2
  17. package/dist/{chunk-Y64PEWKP.js → chunk-JP7NM545.js} +2 -2
  18. package/dist/{chunk-CP44U7BT.js → chunk-JXLRL5JR.js} +5 -5
  19. package/dist/{chunk-5VYSKVZT.js → chunk-K733B5T2.js} +254 -20
  20. package/dist/{chunk-SNLLOXCM.js → chunk-L63Q4JQJ.js} +3 -3
  21. package/dist/{chunk-43M7QZMX.js → chunk-LXYPMFTH.js} +3 -3
  22. package/dist/{chunk-TCGWZBTS.js → chunk-MUSPWEBB.js} +3 -3
  23. package/dist/chunk-NCZRWCJN.js +7 -0
  24. package/dist/{chunk-JR54MDZI.js → chunk-NLO64UE3.js} +2 -2
  25. package/dist/{chunk-3R43CMLS.js → chunk-NWJLWLKF.js} +8 -8
  26. package/dist/chunk-OSXPQSLW.js +128 -0
  27. package/dist/chunk-OTYAEEX3.js +1081 -0
  28. package/dist/{chunk-V4664YKR.js → chunk-OXSTNSCF.js} +2 -2
  29. package/dist/{chunk-R2MTWC7C.js → chunk-P5UANBBX.js} +6 -4
  30. package/dist/{chunk-PWXBIUEY.js → chunk-PBW3YC3G.js} +85 -1
  31. package/dist/{chunk-TEQEDOWI.js → chunk-QD7MRMCH.js} +245 -289
  32. package/dist/{chunk-BNFGDTEU.js → chunk-SA34STZ6.js} +2 -2
  33. package/dist/{chunk-VGRVPYZ5.js → chunk-SBSUDHL4.js} +2 -2
  34. package/dist/{chunk-XQR76MQ5.js → chunk-SFZGMB2G.js} +2 -2
  35. package/dist/{chunk-EC5T5A6O.js → chunk-TKKP56QK.js} +3 -3
  36. package/dist/{chunk-BYSUSSSC.js → chunk-UPBWEHIL.js} +30 -148
  37. package/dist/{chunk-YB6WYVNY.js → chunk-UTIQ7OO5.js} +2 -2
  38. package/dist/{chunk-EMI3YYLP.js → chunk-VPVLO436.js} +4 -4
  39. package/dist/chunk-W77NBJAZ.js +957 -0
  40. package/dist/{chunk-BKCW3JLL.js → chunk-X25Q6RAV.js} +1 -1
  41. package/dist/{chunk-FF2EKUQO.js → chunk-YGJIK3CG.js} +4 -4
  42. package/dist/cli/dev.js +1 -1
  43. package/dist/cli/index.js +1 -1
  44. package/dist/{client-3LJGD6KY.js → client-EM7ISGUP.js} +6 -6
  45. package/dist/{compactor-ZBNKANHV.js → compactor-V3LR7APW.js} +13 -12
  46. package/dist/{dynamic-context-F2XTQJR5.js → dynamic-context-MVGOF5V2.js} +10 -9
  47. package/dist/{events-224IO5NJ.js → events-PI7IMPHT.js} +8 -7
  48. package/dist/{folding-YTTTVS56.js → folding-FO57K4JM.js} +6 -5
  49. package/dist/http-client-33EZ3BLR.js +11 -0
  50. package/dist/{inspect-proxy-B7LGGTM7.js → inspect-proxy-NHKQQ2CD.js} +4 -4
  51. package/dist/launch-L5ROVNI3.js +52 -0
  52. package/dist/{manager-4QGXI6WZ.js → manager-66YAEO7K.js} +5 -5
  53. package/dist/{model-overrides-OY2YKUNV.js → model-overrides-L53PZNZA.js} +4 -4
  54. package/dist/orchestrator-XK5K3RPL.js +63 -0
  55. package/dist/package.json +3 -3
  56. package/dist/{path-security-PFMZY7IA.js → path-security-RSEI3YKB.js} +12 -11
  57. package/dist/{platform-QNGCKX4L.js → platform-WA4GK5BO.js} +4 -4
  58. package/dist/{processor-NYPJ5PFA.js → processor-WDZSFBVO.js} +30 -24
  59. package/dist/{project-creator-AWP2JUFS.js → project-creator-676WQXVI.js} +3 -3
  60. package/dist/{projects-C4353IQK.js → projects-SSBWIYL4.js} +3 -3
  61. package/dist/{protocol-CBT1d98i.d.ts → protocol-BzHs024-.d.ts} +21 -3
  62. package/dist/{protocol-LZZ7C4VQ.js → protocol-RKSWKNXI.js} +3 -3
  63. package/dist/provider/index.d.ts +4 -4
  64. package/dist/{provider-PIRPN2CC.js → provider-PLIWRBCF.js} +7 -7
  65. package/dist/{provider-manager-GNEPR6UN.js → provider-manager-2QSJTPWS.js} +7 -7
  66. package/dist/{registry-VCKDSVKA.js → registry-ZP4TN2IN.js} +5 -4
  67. package/dist/{serve-6DRHQLCG.js → serve-MZ3BCCWC.js} +35 -32
  68. package/dist/server/index.d.ts +4 -4
  69. package/dist/server/index.js +34 -31
  70. package/dist/server-EPXODFMB.js +55 -0
  71. package/dist/service-54PGIPDQ.js +25 -0
  72. package/dist/{session-overrides-RNKV35MU.js → session-overrides-LXN6W7SA.js} +7 -6
  73. package/dist/{sessions-D5CEPQGU.js → sessions-CHPVUG6H.js} +6 -5
  74. package/dist/{settings-BNRNX6IW.js → settings-NEBM3GQX.js} +3 -3
  75. package/dist/shared/index.d.ts +3 -3
  76. package/dist/shared/index.js +1 -1
  77. package/dist/skill-defaults/workflows/SKILL.md +24 -6
  78. package/dist/tasks-TJXG2V3U.js +217 -0
  79. package/dist/{tools-2B363F7L.js → tools-CIM26IFB.js} +30 -22
  80. package/dist/{types-BAxh20ZL.d.ts → types-CMtHpDWT.d.ts} +74 -1
  81. package/dist/{types-cVfqOj6M.d.ts → types-CbggXFvR.d.ts} +1 -1
  82. package/dist/{update-IQMRYN7J.js → update-UZBBO42X.js} +2 -2
  83. package/dist/web/assets/{index-CjWC6EQ4.css → index-BmILAZrT.css} +1 -1
  84. package/dist/web/assets/index-rZHXkfMq.js +324 -0
  85. package/dist/web/index.html +2 -2
  86. package/dist/web/sw.js +1 -1
  87. package/dist/workflow-defaults/default.workflow.json +5 -3
  88. package/dist/{workspace-YUNHV4WS.js → workspace-2XODU4YJ.js} +4 -4
  89. package/package.json +3 -3
  90. package/dist/chunk-B2PHPBFU.js +0 -7
  91. package/dist/http-client-YC3UA5OZ.js +0 -11
  92. package/dist/orchestrator-JKBY7B3P.js +0 -57
  93. package/dist/server-HUHFJW7U.js +0 -48
  94. package/dist/web/assets/index-DBUtUSHK.js +0 -323
@@ -0,0 +1,217 @@
1
+ import {
2
+ getGateConfig,
3
+ getTaskSettings,
4
+ isTaskConflictError,
5
+ isTaskGateError
6
+ } from "./chunk-OTYAEEX3.js";
7
+ import {
8
+ getProject
9
+ } from "./chunk-SFZGMB2G.js";
10
+ import "./chunk-OSXPQSLW.js";
11
+ import "./chunk-MUSPWEBB.js";
12
+ import "./chunk-J2GP3J3X.js";
13
+ import "./chunk-LXYPMFTH.js";
14
+ import "./chunk-V4IE7HJY.js";
15
+ import "./chunk-AZHWLLPP.js";
16
+ import "./chunk-HNCM3D7Y.js";
17
+ import "./chunk-L737Y63F.js";
18
+ import "./chunk-OXSTNSCF.js";
19
+ import "./chunk-HP5CIB66.js";
20
+ import "./chunk-PBW3YC3G.js";
21
+ import "./chunk-K44MW7JJ.js";
22
+ import "./chunk-5WRI5ZAA.js";
23
+
24
+ // src/server/routes/tasks.ts
25
+ import "express";
26
+ function registerTaskRoutes(router, tasksService) {
27
+ const requireProject = (req, res) => {
28
+ const projectId = req.params["projectId"];
29
+ if (!getProject(projectId)) {
30
+ res.status(404).json({ error: "Project not found" });
31
+ return null;
32
+ }
33
+ return projectId;
34
+ };
35
+ const handleError = (res, error) => {
36
+ if (isTaskGateError(error)) {
37
+ return res.status(422).json({
38
+ error: error.message,
39
+ code: "GATE_BLOCKED",
40
+ missing: error.missing,
41
+ task: error.task
42
+ });
43
+ }
44
+ if (isTaskConflictError(error)) {
45
+ return res.status(409).json({ error: error.message, code: "CONFLICT", task: error.task });
46
+ }
47
+ return res.status(400).json({ error: error instanceof Error ? error.message : "Unknown error" });
48
+ };
49
+ const HUMAN = "human";
50
+ router.get("/projects/:projectId/tasks", (req, res) => {
51
+ const projectId = requireProject(req, res);
52
+ if (!projectId) return;
53
+ res.json(tasksService.snapshot(projectId));
54
+ });
55
+ router.get("/projects/:projectId/tasks/count", (req, res) => {
56
+ const projectId = requireProject(req, res);
57
+ if (!projectId) return;
58
+ res.json({ counts: tasksService.counts(projectId) });
59
+ });
60
+ router.get("/projects/:projectId/tasks/gates", (req, res) => {
61
+ const projectId = requireProject(req, res);
62
+ if (!projectId) return;
63
+ res.json({ gates: getGateConfig(projectId) });
64
+ });
65
+ router.put("/projects/:projectId/tasks/gates", (req, res) => {
66
+ const projectId = requireProject(req, res);
67
+ if (!projectId) return;
68
+ const { gates } = req.body;
69
+ if (!Array.isArray(gates)) {
70
+ return res.status(400).json({ error: "gates (array) is required" });
71
+ }
72
+ const normalized = gates.map(
73
+ (g, i) => ({
74
+ id: typeof g?.id === "string" && g.id ? g.id : `gate_${i}`,
75
+ name: typeof g?.name === "string" && g.name ? g.name : `Gate ${i + 1}`,
76
+ description: typeof g?.description === "string" ? g.description : "",
77
+ required: g?.required !== false,
78
+ variant: g?.variant === "ready" ? "ready" : "done"
79
+ })
80
+ );
81
+ res.json({ gates: tasksService.setGateConfig(projectId, normalized, { actor: HUMAN }) });
82
+ });
83
+ router.get("/projects/:projectId/tasks/settings", (req, res) => {
84
+ const projectId = requireProject(req, res);
85
+ if (!projectId) return;
86
+ res.json({ settings: getTaskSettings(projectId) });
87
+ });
88
+ router.put("/projects/:projectId/tasks/settings", (req, res) => {
89
+ const projectId = requireProject(req, res);
90
+ if (!projectId) return;
91
+ const { slotLimit, queuePaused } = req.body;
92
+ const settings = {};
93
+ if (typeof slotLimit === "number") {
94
+ if (!Number.isInteger(slotLimit) || slotLimit < 1 || slotLimit > 10) {
95
+ return res.status(400).json({ error: "slotLimit must be an integer between 1 and 10" });
96
+ }
97
+ settings.slotLimit = slotLimit;
98
+ }
99
+ if (typeof queuePaused === "boolean") settings.queuePaused = queuePaused;
100
+ if (Object.keys(settings).length === 0) {
101
+ return res.status(400).json({ error: "Provide slotLimit and/or queuePaused" });
102
+ }
103
+ tasksService.setSettings(projectId, settings).then((saved) => {
104
+ res.json({ settings: saved });
105
+ });
106
+ });
107
+ router.post("/projects/:projectId/tasks", (req, res) => {
108
+ const projectId = requireProject(req, res);
109
+ if (!projectId) return;
110
+ const { prompt, attachments, agentId, providerId, model } = req.body;
111
+ if (typeof prompt !== "string") {
112
+ return res.status(400).json({ error: "prompt (string) is required" });
113
+ }
114
+ try {
115
+ const task = tasksService.create(
116
+ projectId,
117
+ {
118
+ prompt,
119
+ ...Array.isArray(attachments) ? { attachments } : {},
120
+ ...typeof agentId === "string" ? { agentId } : {},
121
+ ...typeof providerId === "string" ? { providerId } : {},
122
+ ...typeof model === "string" ? { model } : {}
123
+ },
124
+ { actor: HUMAN }
125
+ );
126
+ res.status(201).json({ task });
127
+ } catch (error) {
128
+ handleError(res, error);
129
+ }
130
+ });
131
+ router.get("/projects/:projectId/tasks/:taskId", (req, res) => {
132
+ const projectId = requireProject(req, res);
133
+ if (!projectId) return;
134
+ const task = tasksService.get(projectId, req.params["taskId"]);
135
+ if (!task) return res.status(404).json({ error: "Task not found" });
136
+ res.json({ task });
137
+ });
138
+ router.put("/projects/:projectId/tasks/:taskId", (req, res) => {
139
+ const projectId = requireProject(req, res);
140
+ if (!projectId) return;
141
+ const { prompt, attachments, agentId, providerId, model, expectedVersion } = req.body;
142
+ const patch = {};
143
+ if (typeof prompt === "string") patch.prompt = prompt;
144
+ if (Array.isArray(attachments)) {
145
+ patch.attachments = attachments;
146
+ }
147
+ if (typeof agentId === "string" || agentId === null) patch.agentId = agentId;
148
+ if (typeof providerId === "string" || providerId === null) patch.providerId = providerId;
149
+ if (typeof model === "string" || model === null) patch.model = model;
150
+ if (Object.keys(patch).length === 0) {
151
+ return res.status(400).json({ error: "No updatable fields provided" });
152
+ }
153
+ tasksService.update(projectId, req.params["taskId"], patch, { actor: HUMAN }, expectedVersion).then(({ task }) => res.json({ task })).catch((error) => handleError(res, error));
154
+ });
155
+ router.delete("/projects/:projectId/tasks/:taskId", (req, res) => {
156
+ const projectId = requireProject(req, res);
157
+ if (!projectId) return;
158
+ tasksService.remove(projectId, req.params["taskId"], { actor: HUMAN }).then(() => res.status(204).end()).catch((error) => handleError(res, error));
159
+ });
160
+ router.post("/projects/:projectId/tasks/:taskId/duplicate", (req, res) => {
161
+ const projectId = requireProject(req, res);
162
+ if (!projectId) return;
163
+ try {
164
+ const task = tasksService.duplicate(projectId, req.params["taskId"], { actor: HUMAN });
165
+ res.status(201).json({ task });
166
+ } catch (error) {
167
+ handleError(res, error);
168
+ }
169
+ });
170
+ router.post("/projects/:projectId/tasks/:taskId/move", (req, res) => {
171
+ const projectId = requireProject(req, res);
172
+ if (!projectId) return;
173
+ const { to, reason, expectedVersion } = req.body;
174
+ if (!["todo", "in_progress", "done"].includes(to)) {
175
+ return res.status(400).json({ error: "to must be one of: todo, in_progress, done" });
176
+ }
177
+ tasksService.move(projectId, req.params["taskId"], to, {
178
+ actor: HUMAN,
179
+ ...typeof reason === "string" ? { reason } : {},
180
+ ...typeof expectedVersion === "number" ? { expectedVersion } : {}
181
+ }).then((result) => res.json(result)).catch((error) => handleError(res, error));
182
+ });
183
+ router.put("/projects/:projectId/tasks/:taskId/gate-values/:gateId", (req, res) => {
184
+ const projectId = requireProject(req, res);
185
+ if (!projectId) return;
186
+ const { value, expectedVersion } = req.body;
187
+ if (typeof value !== "string") {
188
+ return res.status(400).json({ error: "value (string) is required" });
189
+ }
190
+ tasksService.setGateValue(
191
+ projectId,
192
+ req.params["taskId"],
193
+ req.params["gateId"],
194
+ value,
195
+ { actor: HUMAN },
196
+ void 0,
197
+ expectedVersion
198
+ ).then(({ task }) => res.json({ task })).catch((error) => handleError(res, error));
199
+ });
200
+ router.post("/projects/:projectId/tasks/:taskId/reorder", (req, res) => {
201
+ const projectId = requireProject(req, res);
202
+ if (!projectId) return;
203
+ const { status, index } = req.body;
204
+ if (!["todo", "in_progress", "done"].includes(status) || typeof index !== "number") {
205
+ return res.status(400).json({ error: "status and index (number) are required" });
206
+ }
207
+ try {
208
+ res.json({ task: tasksService.reorder(projectId, req.params["taskId"], status, index) });
209
+ } catch (error) {
210
+ handleError(res, error);
211
+ }
212
+ });
213
+ }
214
+ export {
215
+ registerTaskRoutes
216
+ };
217
+ //# sourceMappingURL=tasks-TJXG2V3U.js.map
@@ -7,50 +7,57 @@ import {
7
7
  getToolRegistryForSubAgent,
8
8
  parseToolPermissions,
9
9
  setMcpTools,
10
+ setTasksService,
10
11
  stepDoneTool,
11
12
  validateToolAction
12
- } from "./chunk-5VYSKVZT.js";
13
- import "./chunk-FF2EKUQO.js";
14
- import "./chunk-JR54MDZI.js";
15
- import "./chunk-HKD4IMOE.js";
16
- import "./chunk-R2MTWC7C.js";
17
- import "./chunk-EC5T5A6O.js";
13
+ } from "./chunk-K733B5T2.js";
14
+ import "./chunk-YGJIK3CG.js";
15
+ import "./chunk-NLO64UE3.js";
16
+ import "./chunk-2XD65L7M.js";
17
+ import "./chunk-P5UANBBX.js";
18
+ import "./chunk-TKKP56QK.js";
18
19
  import "./chunk-I72ACQ6R.js";
19
20
  import "./chunk-JE7LW7Y6.js";
20
21
  import "./chunk-OAN4BXEW.js";
21
- import "./chunk-VGRVPYZ5.js";
22
+ import "./chunk-SBSUDHL4.js";
22
23
  import "./chunk-J7GAZGZT.js";
23
- import "./chunk-SNLLOXCM.js";
24
+ import "./chunk-OTYAEEX3.js";
25
+ import "./chunk-L63Q4JQJ.js";
24
26
  import {
25
27
  PathAccessDeniedError,
26
28
  cancelPathConfirmationsForSession,
27
29
  getConfirmationSessionId,
28
30
  providePathConfirmation,
29
31
  requestPathAccess
30
- } from "./chunk-6UPBZ2ZR.js";
31
- import "./chunk-CP44U7BT.js";
32
- import "./chunk-4NMGX5F2.js";
33
- import "./chunk-BNFGDTEU.js";
32
+ } from "./chunk-BZVW77PI.js";
33
+ import "./chunk-JXLRL5JR.js";
34
+ import "./chunk-I7FY2LTR.js";
35
+ import "./chunk-SA34STZ6.js";
34
36
  import {
35
37
  AskUserInterrupt,
36
38
  cancelQuestionsForSession,
37
39
  getPendingQuestionsForSession,
38
40
  provideAnswer
39
41
  } from "./chunk-JURM3RPZ.js";
40
- import "./chunk-Y64PEWKP.js";
41
- import "./chunk-XQR76MQ5.js";
42
- import "./chunk-YB6WYVNY.js";
42
+ import "./chunk-JP7NM545.js";
43
+ import "./chunk-SFZGMB2G.js";
44
+ import "./chunk-UTIQ7OO5.js";
43
45
  import "./chunk-LCLH6ZUL.js";
44
- import "./chunk-AZFZE36I.js";
45
- import "./chunk-BYSUSSSC.js";
46
+ import "./chunk-3O77NT4T.js";
47
+ import "./chunk-UPBWEHIL.js";
48
+ import "./chunk-OSXPQSLW.js";
49
+ import "./chunk-MUSPWEBB.js";
46
50
  import "./chunk-J2GP3J3X.js";
51
+ import "./chunk-LXYPMFTH.js";
47
52
  import "./chunk-V4IE7HJY.js";
48
- import "./chunk-YHEQTVFV.js";
53
+ import "./chunk-AZHWLLPP.js";
54
+ import "./chunk-HNCM3D7Y.js";
49
55
  import "./chunk-L737Y63F.js";
50
- import "./chunk-WWTYWLDM.js";
51
- import "./chunk-PWXBIUEY.js";
56
+ import "./chunk-OXSTNSCF.js";
57
+ import "./chunk-HP5CIB66.js";
58
+ import "./chunk-PBW3YC3G.js";
52
59
  import "./chunk-K44MW7JJ.js";
53
- import "./chunk-BKCW3JLL.js";
60
+ import "./chunk-X25Q6RAV.js";
54
61
  import "./chunk-KSXCOHHW.js";
55
62
  import "./chunk-CQGTEGKL.js";
56
63
  import "./chunk-5WRI5ZAA.js";
@@ -72,7 +79,8 @@ export {
72
79
  providePathConfirmation,
73
80
  requestPathAccess,
74
81
  setMcpTools,
82
+ setTasksService,
75
83
  stepDoneTool,
76
84
  validateToolAction
77
85
  };
78
- //# sourceMappingURL=tools-2B363F7L.js.map
86
+ //# sourceMappingURL=tools-CIM26IFB.js.map
@@ -52,6 +52,8 @@ interface WorkflowExecution {
52
52
  params: Record<string, string>;
53
53
  /** Available branches at a paused user step, if any. */
54
54
  pendingChoices?: UserStepChoice[];
55
+ /** Sub-group slice this run belongs to, when launched as a slice. */
56
+ subGroup?: string;
55
57
  createdAt: number;
56
58
  updatedAt: number;
57
59
  }
@@ -349,6 +351,77 @@ interface ToolResult {
349
351
  metadata?: Record<string, unknown>;
350
352
  }
351
353
  type ToolName = 'read_file' | 'write_file' | 'edit_file' | 'run_command' | 'glob' | 'grep' | 'ask_user' | 'session_metadata' | 'web_fetch';
354
+ type TaskStatus = 'todo' | 'in_progress' | 'done';
355
+ /** Active state of an in-progress task: launched (occupies a slot) or queued (waiting for a slot). */
356
+ type TaskRunState = 'running' | 'queued';
357
+ type TaskActor = 'human' | 'agent' | 'system';
358
+ /** Per-project gate (Definition of Done) configuration. */
359
+ interface TaskGateConfig {
360
+ id: string;
361
+ name: string;
362
+ /** Description of acceptable proof, e.g. "all green — every criterion passes with evidence". */
363
+ description: string;
364
+ /** Whether the gate blocks Done until satisfied. */
365
+ required: boolean;
366
+ /** 'done' = definition of done (blocks entering Done). 'ready' = definition of ready (off by default). */
367
+ variant: 'done' | 'ready';
368
+ }
369
+ /** A filled-in value for a gate field, recording who set it and when. */
370
+ interface TaskGateValue {
371
+ gateId: string;
372
+ value: string;
373
+ actor: TaskActor;
374
+ actorName?: string;
375
+ sessionId?: string;
376
+ timestamp: string;
377
+ }
378
+ interface TaskAuditEntry {
379
+ id: string;
380
+ timestamp: string;
381
+ actor: TaskActor;
382
+ actorName?: string;
383
+ action: string;
384
+ detail: string;
385
+ }
386
+ interface ProjectTask {
387
+ id: string;
388
+ projectId: string;
389
+ prompt: string;
390
+ attachments: Attachment[];
391
+ status: TaskStatus;
392
+ /** Present only while status is in_progress. */
393
+ runState?: TaskRunState;
394
+ /** 1-based queue position while queued. */
395
+ queuePosition?: number;
396
+ /** Ordering within the column (stable, used for drag-reorder). */
397
+ position: number;
398
+ /** Monotonic revision counter — bumped on every mutation. Optimistic concurrency guard. */
399
+ version: number;
400
+ agentId?: string;
401
+ providerId?: string;
402
+ model?: string;
403
+ /** Linked sessions, active working session first, then historical attempts. */
404
+ sessionIds: string[];
405
+ activeSessionId?: string;
406
+ gateValues: TaskGateValue[];
407
+ auditTrail: TaskAuditEntry[];
408
+ createdAt: string;
409
+ updatedAt: string;
410
+ }
411
+ interface ProjectTaskSettings {
412
+ slotLimit: number;
413
+ queuePaused: boolean;
414
+ }
415
+ interface ProjectTaskCounts {
416
+ open: number;
417
+ todo: number;
418
+ inProgress: number;
419
+ /** Actively running (occupying a slot). */
420
+ running: number;
421
+ /** Waiting for a slot to free. */
422
+ queued: number;
423
+ done: number;
424
+ }
352
425
  interface Criterion {
353
426
  id: string;
354
427
  description: string;
@@ -598,4 +671,4 @@ interface ElementData {
598
671
  attributes: Record<string, string>;
599
672
  }
600
673
 
601
- export type { Attachment as A, SessionSummary as B, CallStatsDataPoint as C, DangerLevel as D, EditContextEdit as E, FileReadEntry as F, StatsDataPoint as G, StatsIdentity as H, InjectedFile as I, Todo as J, ToolMode as K, LLMCallStats as L, ModelConfig as M, ToolName as N, ToolResult as O, PreparingToolCall as P, WorkflowExecutionStatus as Q, RecentUserPrompt as R, SessionStats as S, ToolCall as T, UserStepChoice as U, ValidationResult as V, WorkflowExecution as W, WorkflowLaunchScope as X, WorkflowParameter as Y, WorkflowScope as Z, Message as a, Config as b, ContextState as c, ContextWindow as d, Criterion as e, CriterionAttempt as f, CriterionStatus as g, CriterionValidation as h, Diagnostic as i, EditContextLine as j, EditContextRegion as k, ElementData as l, ExecutionState as m, LlmBackend as n, MessageRole as o, MessageSegment as p, MessageStats as q, MetadataEntry as r, ModelSessionStats as s, Project as t, Provider as u, ProviderBackend as v, Session as w, SessionMetadata as x, SessionMode as y, SessionPhase as z };
674
+ export type { ToolResult as $, Attachment as A, SessionMetadata as B, CallStatsDataPoint as C, DangerLevel as D, EditContextEdit as E, FileReadEntry as F, SessionMode as G, SessionPhase as H, InjectedFile as I, SessionSummary as J, StatsDataPoint as K, LLMCallStats as L, ModelConfig as M, StatsIdentity as N, TaskActor as O, PreparingToolCall as P, TaskAuditEntry as Q, RecentUserPrompt as R, SessionStats as S, ToolCall as T, TaskGateConfig as U, TaskGateValue as V, TaskRunState as W, TaskStatus as X, Todo as Y, ToolMode as Z, ToolName as _, Message as a, UserStepChoice as a0, ValidationResult as a1, WorkflowExecution as a2, WorkflowExecutionStatus as a3, WorkflowLaunchScope as a4, WorkflowParameter as a5, WorkflowScope as a6, Config as b, ContextState as c, ContextWindow as d, Criterion as e, CriterionAttempt as f, CriterionStatus as g, CriterionValidation as h, Diagnostic as i, EditContextLine as j, EditContextRegion as k, ElementData as l, ExecutionState as m, LlmBackend as n, MessageRole as o, MessageSegment as p, MessageStats as q, MetadataEntry as r, ModelSessionStats as s, Project as t, ProjectTask as u, ProjectTaskCounts as v, ProjectTaskSettings as w, Provider as x, ProviderBackend as y, Session as z };
@@ -1,4 +1,4 @@
1
- import { T as ToolCall, A as Attachment } from './types-BAxh20ZL.js';
1
+ import { T as ToolCall, A as Attachment } from './types-CMtHpDWT.js';
2
2
 
3
3
  interface LLMMessage {
4
4
  role: 'system' | 'user' | 'assistant' | 'tool';
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-B2PHPBFU.js";
3
+ } from "./chunk-NCZRWCJN.js";
4
4
  import "./chunk-5WRI5ZAA.js";
5
5
 
6
6
  // src/cli/update.ts
@@ -46,4 +46,4 @@ async function runUpdate(options = {}) {
46
46
  export {
47
47
  runUpdate
48
48
  };
49
- //# sourceMappingURL=update-IQMRYN7J.js.map
49
+ //# sourceMappingURL=update-UZBBO42X.js.map