openfox 2.0.112 → 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 (97) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +1 -0
  3. package/dist/CHANGELOG.md +49 -0
  4. package/dist/agent-defaults/builder.agent.md +1 -0
  5. package/dist/agent-defaults/planner.agent.md +1 -0
  6. package/dist/{backend-P3GHHLHJ.js → backend-LVYHLGQJ.js} +2 -2
  7. package/dist/{chat-handler-BYXZIIV3.js → chat-handler-KWXRSWXZ.js} +32 -26
  8. package/dist/{chunk-XWNCKIPO.js → chunk-2XD65L7M.js} +2 -2
  9. package/dist/{chunk-C5NQF2K4.js → chunk-3O77NT4T.js} +29 -10
  10. package/dist/{chunk-XCK5IBO4.js → chunk-7GWARYQC.js} +60 -1042
  11. package/dist/{chunk-YHEQTVFV.js → chunk-AZHWLLPP.js} +1 -1
  12. package/dist/{chunk-FFPCVN5M.js → chunk-BZVW77PI.js} +4 -4
  13. package/dist/{chunk-SDGNV45R.js → chunk-FW4NDUBL.js} +15 -15
  14. package/dist/{chunk-Z56SEG4Z.js → chunk-GUHHUDNL.js} +6 -6
  15. package/dist/{chunk-RT2A2RRL.js → chunk-HP5CIB66.js} +2 -2
  16. package/dist/{chunk-UAF2FOI5.js → chunk-HV6IALXF.js} +7 -7
  17. package/dist/{chunk-SYJMUIRC.js → chunk-I7FY2LTR.js} +2 -2
  18. package/dist/{chunk-RISQXU32.js → chunk-JP7NM545.js} +2 -2
  19. package/dist/{chunk-NB2D6I64.js → chunk-JXLRL5JR.js} +5 -5
  20. package/dist/{chunk-RAKPI4OE.js → chunk-K733B5T2.js} +264 -27
  21. package/dist/{chunk-C372UH7N.js → chunk-KSXCOHHW.js} +18 -20
  22. package/dist/{chunk-JDT63SSP.js → chunk-L63Q4JQJ.js} +3 -3
  23. package/dist/{chunk-ERYUSG5C.js → chunk-LXYPMFTH.js} +3 -3
  24. package/dist/{chunk-FSYRANYR.js → chunk-MUSPWEBB.js} +4 -5
  25. package/dist/chunk-NCZRWCJN.js +7 -0
  26. package/dist/{chunk-JR54MDZI.js → chunk-NLO64UE3.js} +2 -2
  27. package/dist/{chunk-3UILDGOO.js → chunk-NWJLWLKF.js} +8 -8
  28. package/dist/chunk-OSXPQSLW.js +128 -0
  29. package/dist/chunk-OTYAEEX3.js +1081 -0
  30. package/dist/{chunk-PCC4DBPF.js → chunk-OXSTNSCF.js} +2 -2
  31. package/dist/{chunk-33Q7LCVD.js → chunk-P5UANBBX.js} +6 -4
  32. package/dist/{chunk-LCQ5AN6Y.js → chunk-PBW3YC3G.js} +89 -1
  33. package/dist/{chunk-IYTDCPEQ.js → chunk-QD7MRMCH.js} +352 -333
  34. package/dist/{chunk-N4RTAGFY.js → chunk-SA34STZ6.js} +2 -2
  35. package/dist/{chunk-FR5LUTLQ.js → chunk-SBSUDHL4.js} +10 -6
  36. package/dist/{chunk-6FPGJR7O.js → chunk-SFZGMB2G.js} +2 -2
  37. package/dist/{chunk-SVJFMZ2Q.js → chunk-TKKP56QK.js} +11 -4
  38. package/dist/{chunk-JNHKKUGJ.js → chunk-UPBWEHIL.js} +30 -148
  39. package/dist/{chunk-QGXLZZBS.js → chunk-UTIQ7OO5.js} +2 -2
  40. package/dist/{chunk-RKMP74BB.js → chunk-VPVLO436.js} +4 -4
  41. package/dist/chunk-W77NBJAZ.js +957 -0
  42. package/dist/{chunk-P45RJGOT.js → chunk-X25Q6RAV.js} +1 -1
  43. package/dist/{chunk-BOSKQI62.js → chunk-YGJIK3CG.js} +4 -4
  44. package/dist/cli/dev.js +1 -1
  45. package/dist/cli/index.js +1 -1
  46. package/dist/{client-QNQTX5EA.js → client-EM7ISGUP.js} +6 -6
  47. package/dist/{compactor-X2KZ3XFU.js → compactor-V3LR7APW.js} +13 -12
  48. package/dist/{config-TW5FHQEM.js → config-EAB3V4QK.js} +2 -2
  49. package/dist/{dynamic-context-ZRQO2FJN.js → dynamic-context-MVGOF5V2.js} +10 -9
  50. package/dist/{events-Y6XXQYFG.js → events-PI7IMPHT.js} +8 -7
  51. package/dist/{folding-Z4GNWRC3.js → folding-FO57K4JM.js} +6 -5
  52. package/dist/http-client-33EZ3BLR.js +11 -0
  53. package/dist/{inspect-proxy-N42Z5TOG.js → inspect-proxy-NHKQQ2CD.js} +4 -4
  54. package/dist/launch-L5ROVNI3.js +52 -0
  55. package/dist/{manager-HCMDFEQH.js → manager-66YAEO7K.js} +5 -5
  56. package/dist/{model-overrides-O3ZYKFP7.js → model-overrides-L53PZNZA.js} +4 -4
  57. package/dist/orchestrator-XK5K3RPL.js +63 -0
  58. package/dist/package.json +7 -6
  59. package/dist/{path-security-525YLND3.js → path-security-RSEI3YKB.js} +12 -11
  60. package/dist/{platform-MEQUWG6U.js → platform-WA4GK5BO.js} +4 -4
  61. package/dist/{processor-UN4H4V7F.js → processor-WDZSFBVO.js} +31 -25
  62. package/dist/{project-creator-BVA55HY6.js → project-creator-676WQXVI.js} +3 -3
  63. package/dist/{projects-PQXME5S4.js → projects-SSBWIYL4.js} +3 -3
  64. package/dist/{protocol-D6MISQyz.d.ts → protocol-BzHs024-.d.ts} +23 -3
  65. package/dist/{protocol-FTHAR2YL.js → protocol-RKSWKNXI.js} +3 -3
  66. package/dist/provider/index.d.ts +4 -4
  67. package/dist/{provider-3R4X62LW.js → provider-PLIWRBCF.js} +9 -9
  68. package/dist/{provider-manager-W5N4XRE5.js → provider-manager-2QSJTPWS.js} +7 -7
  69. package/dist/{registry-74KPZ5NV.js → registry-ZP4TN2IN.js} +5 -4
  70. package/dist/{serve-WHFUNQ6Z.js → serve-MZ3BCCWC.js} +36 -33
  71. package/dist/server/index.d.ts +8 -5
  72. package/dist/server/index.js +35 -32
  73. package/dist/server-EPXODFMB.js +55 -0
  74. package/dist/service-54PGIPDQ.js +25 -0
  75. package/dist/{session-overrides-XH6I3COP.js → session-overrides-LXN6W7SA.js} +7 -6
  76. package/dist/{sessions-D772YTWL.js → sessions-CHPVUG6H.js} +8 -5
  77. package/dist/{settings-KO6DSJLD.js → settings-NEBM3GQX.js} +3 -3
  78. package/dist/shared/index.d.ts +3 -3
  79. package/dist/shared/index.js +1 -1
  80. package/dist/skill-defaults/workflows/SKILL.md +517 -0
  81. package/dist/tasks-TJXG2V3U.js +217 -0
  82. package/dist/{tools-HTUTYMKI.js → tools-CIM26IFB.js} +31 -23
  83. package/dist/{types-BMEOlLT0.d.ts → types-CMtHpDWT.d.ts} +81 -1
  84. package/dist/{types-D0TgGL3t.d.ts → types-CbggXFvR.d.ts} +1 -1
  85. package/dist/{update-BRUFGGTW.js → update-UZBBO42X.js} +2 -2
  86. package/dist/web/assets/{index-nS1p0g8O.css → index-BmILAZrT.css} +1 -1
  87. package/dist/web/assets/index-rZHXkfMq.js +324 -0
  88. package/dist/web/index.html +2 -2
  89. package/dist/web/sw.js +1 -1
  90. package/dist/workflow-defaults/default.workflow.json +45 -5
  91. package/dist/{workspace-YDUQZ3HC.js → workspace-2XODU4YJ.js} +4 -4
  92. package/package.json +7 -6
  93. package/dist/chunk-P5AA7OYJ.js +0 -7
  94. package/dist/http-client-2GDKHZIG.js +0 -11
  95. package/dist/orchestrator-P5EUMC7E.js +0 -57
  96. package/dist/server-7MOOJR2N.js +0 -48
  97. package/dist/web/assets/index-Dukvfqm-.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,51 +7,58 @@ import {
7
7
  getToolRegistryForSubAgent,
8
8
  parseToolPermissions,
9
9
  setMcpTools,
10
+ setTasksService,
10
11
  stepDoneTool,
11
12
  validateToolAction
12
- } from "./chunk-RAKPI4OE.js";
13
- import "./chunk-BOSKQI62.js";
14
- import "./chunk-JR54MDZI.js";
15
- import "./chunk-XWNCKIPO.js";
16
- import "./chunk-33Q7LCVD.js";
17
- import "./chunk-SVJFMZ2Q.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-FR5LUTLQ.js";
22
+ import "./chunk-SBSUDHL4.js";
22
23
  import "./chunk-J7GAZGZT.js";
23
- import "./chunk-JDT63SSP.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-FFPCVN5M.js";
31
- import "./chunk-NB2D6I64.js";
32
- import "./chunk-SYJMUIRC.js";
33
- import "./chunk-N4RTAGFY.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-RISQXU32.js";
41
- import "./chunk-6FPGJR7O.js";
42
- import "./chunk-QGXLZZBS.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-C5NQF2K4.js";
45
- import "./chunk-JNHKKUGJ.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-RT2A2RRL.js";
51
- import "./chunk-LCQ5AN6Y.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-P45RJGOT.js";
54
- import "./chunk-C372UH7N.js";
60
+ import "./chunk-X25Q6RAV.js";
61
+ import "./chunk-KSXCOHHW.js";
55
62
  import "./chunk-CQGTEGKL.js";
56
63
  import "./chunk-5WRI5ZAA.js";
57
64
  export {
@@ -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-HTUTYMKI.js.map
86
+ //# sourceMappingURL=tools-CIM26IFB.js.map
@@ -23,6 +23,10 @@ interface WorkflowParameter {
23
23
  position?: number;
24
24
  required?: boolean;
25
25
  }
26
+ /** Where a workflow definition lives: bundled defaults, global config, or the project's .openfox/. */
27
+ type WorkflowScope = 'builtin' | 'user' | 'project';
28
+ /** Launch scope: an explicit bucket to resolve from, or 'auto' for server precedence (project > user > builtin). */
29
+ type WorkflowLaunchScope = WorkflowScope | 'auto';
26
30
  type WorkflowExecutionStatus = 'running' | 'waiting' | 'completed' | 'cancelled' | 'blocked';
27
31
  /** A selectable branch presented to the user at a paused user step. */
28
32
  interface UserStepChoice {
@@ -32,6 +36,8 @@ interface UserStepChoice {
32
36
  label: string;
33
37
  /** Target step the choice routes to. */
34
38
  goto: string;
39
+ /** Display name of the target step, when it resolves to a step in the workflow. */
40
+ nextStepName?: string;
35
41
  }
36
42
  interface WorkflowExecution {
37
43
  id: string;
@@ -46,6 +52,8 @@ interface WorkflowExecution {
46
52
  params: Record<string, string>;
47
53
  /** Available branches at a paused user step, if any. */
48
54
  pendingChoices?: UserStepChoice[];
55
+ /** Sub-group slice this run belongs to, when launched as a slice. */
56
+ subGroup?: string;
49
57
  createdAt: number;
50
58
  updatedAt: number;
51
59
  }
@@ -104,6 +112,7 @@ interface SessionSummary {
104
112
  mode: SessionMode;
105
113
  phase: SessionPhase;
106
114
  isRunning: boolean;
115
+ isFavorite: boolean;
107
116
  providerId?: string | null;
108
117
  providerModel?: string | null;
109
118
  createdAt: string;
@@ -342,6 +351,77 @@ interface ToolResult {
342
351
  metadata?: Record<string, unknown>;
343
352
  }
344
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
+ }
345
425
  interface Criterion {
346
426
  id: string;
347
427
  description: string;
@@ -591,4 +671,4 @@ interface ElementData {
591
671
  attributes: Record<string, string>;
592
672
  }
593
673
 
594
- 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, WorkflowParameter as X, 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-BMEOlLT0.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-P5AA7OYJ.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-BRUFGGTW.js.map
49
+ //# sourceMappingURL=update-UZBBO42X.js.map