toolroll 0.9.85 → 0.9.87

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 (220) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/dist/agent-fence.d.ts +6 -2
  3. package/dist/agent-fence.js +3 -2
  4. package/dist/agents-board.d.ts +12 -0
  5. package/dist/agents-board.js +26 -0
  6. package/dist/approval-rules-ui.d.ts +4 -1
  7. package/dist/approval-rules-ui.js +31 -15
  8. package/dist/assignment-ui.js +1 -1
  9. package/dist/assignment.js +4 -3
  10. package/dist/backup-ui.d.ts +5 -4
  11. package/dist/backup-ui.js +65 -32
  12. package/dist/browser/terminal.css +1 -1
  13. package/dist/browser/terminal.js +57 -54
  14. package/dist/browser/workspace.css +2 -2
  15. package/dist/browser/workspace.js +35 -68
  16. package/dist/browser-crew.js +1 -1
  17. package/dist/browser-workspace.d.ts +363 -177
  18. package/dist/browser-workspace.js +10 -9
  19. package/dist/chat-actions.d.ts +11 -1
  20. package/dist/chat-actions.js +53 -1
  21. package/dist/chat-channel.js +1 -0
  22. package/dist/chat-controls.d.ts +1 -1
  23. package/dist/chat-controls.js +1 -1
  24. package/dist/chat-quiet.js +3 -2
  25. package/dist/chat-settings-page.d.ts +29 -9
  26. package/dist/chat-settings-page.js +59 -28
  27. package/dist/check-levels-ui.d.ts +2 -1
  28. package/dist/check-levels-ui.js +67 -58
  29. package/dist/claim.d.ts +3 -0
  30. package/dist/claim.js +4 -1
  31. package/dist/contracts/chat-actions.d.ts +9 -0
  32. package/dist/contracts/chat-actions.js +3 -0
  33. package/dist/contracts/cli.d.ts +43 -0
  34. package/dist/contracts/cli.js +4 -0
  35. package/dist/contracts/console-api.d.ts +4 -1
  36. package/dist/contracts/console-api.js +4 -1
  37. package/dist/contracts/flow-propose.d.ts +4 -1
  38. package/dist/contracts/flow-propose.js +1 -1
  39. package/dist/contracts/flow.d.ts +41 -0
  40. package/dist/contracts/flow.js +4 -2
  41. package/dist/contracts/lead-tools.d.ts +21 -0
  42. package/dist/contracts/lead-tools.js +2 -0
  43. package/dist/contracts/store-json.d.ts +2 -0
  44. package/dist/contracts/trigger-payloads.d.ts +20 -0
  45. package/dist/contracts/trigger-payloads.js +4 -0
  46. package/dist/coordinator.js +1 -0
  47. package/dist/credentials-ui.d.ts +5 -3
  48. package/dist/credentials-ui.js +58 -31
  49. package/dist/deploy-gate.js +4 -0
  50. package/dist/design/kit.css +685 -0
  51. package/dist/design/kit.d.ts +208 -0
  52. package/dist/design/kit.js +177 -0
  53. package/dist/design/tokens.css +19 -1
  54. package/dist/discord-settings.js +8 -4
  55. package/dist/dispatch.d.ts +3 -0
  56. package/dist/dispatch.js +4 -1
  57. package/dist/export-ui.d.ts +6 -4
  58. package/dist/export-ui.js +18 -8
  59. package/dist/flow-browser.d.ts +103 -0
  60. package/dist/flow-browser.js +204 -0
  61. package/dist/flow-changed.d.ts +14 -0
  62. package/dist/flow-changed.js +53 -0
  63. package/dist/flow-code.d.ts +5 -1
  64. package/dist/flow-code.js +4 -1
  65. package/dist/flow-engine.js +16 -0
  66. package/dist/flow-gallery-ui.d.ts +41 -4
  67. package/dist/flow-gallery-ui.js +95 -63
  68. package/dist/flow-live.js +9 -1
  69. package/dist/flow-pull-request.js +15 -7
  70. package/dist/flow-share.js +3 -1
  71. package/dist/flow-starters-ui.d.ts +3 -9
  72. package/dist/flow-starters-ui.js +12 -23
  73. package/dist/flow-steps.d.ts +9 -1
  74. package/dist/flow-steps.js +55 -5
  75. package/dist/flow-triggers.js +55 -0
  76. package/dist/flow-unattended-words.d.ts +20 -0
  77. package/dist/flow-unattended-words.js +24 -0
  78. package/dist/flow-unattended.d.ts +9 -5
  79. package/dist/flow-unattended.js +45 -23
  80. package/dist/flows-cli.d.ts +19 -0
  81. package/dist/flows-cli.js +54 -5
  82. package/dist/flows-ui.d.ts +12 -6
  83. package/dist/flows-ui.js +152 -32
  84. package/dist/flows.js +5 -2
  85. package/dist/integrations-ui.d.ts +6 -4
  86. package/dist/integrations-ui.js +34 -40
  87. package/dist/integrations.d.ts +2 -2
  88. package/dist/integrations.js +4 -4
  89. package/dist/kits-ui.d.ts +8 -10
  90. package/dist/kits-ui.js +29 -33
  91. package/dist/kits.js +1 -1
  92. package/dist/knowledge-ui.js +76 -19
  93. package/dist/lead-tools.js +35 -6
  94. package/dist/lead-voice.js +16 -5
  95. package/dist/ledger-view.d.ts +2 -0
  96. package/dist/ledger-view.js +41 -38
  97. package/dist/models-ui.d.ts +8 -3
  98. package/dist/models-ui.js +82 -59
  99. package/dist/monitoring-ui.d.ts +4 -2
  100. package/dist/monitoring-ui.js +44 -13
  101. package/dist/needs-you.d.ts +1 -1
  102. package/dist/needs-you.js +8 -0
  103. package/dist/operate-remote-arguments.js +1 -0
  104. package/dist/operate-remote.js +1 -1
  105. package/dist/operate.d.ts +1 -1
  106. package/dist/operate.js +249 -6
  107. package/dist/passwordless.d.ts +1 -1
  108. package/dist/passwordless.js +1 -1
  109. package/dist/people-audit-ui.d.ts +2 -1
  110. package/dist/people-audit-ui.js +25 -23
  111. package/dist/policy-ui.d.ts +3 -2
  112. package/dist/policy-ui.js +27 -21
  113. package/dist/policy.d.ts +3 -0
  114. package/dist/policy.js +14 -1
  115. package/dist/project-delete-ui.d.ts +4 -2
  116. package/dist/project-delete-ui.js +135 -126
  117. package/dist/project-delete.js +7 -3
  118. package/dist/project-knowledge.d.ts +10 -10
  119. package/dist/publish.d.ts +11 -0
  120. package/dist/publish.js +16 -3
  121. package/dist/pull-request-flow.js +35 -4
  122. package/dist/pull-request-ui.d.ts +2 -1
  123. package/dist/pull-request-ui.js +39 -28
  124. package/dist/recipe-ui.d.ts +4 -2
  125. package/dist/recipe-ui.js +14 -4
  126. package/dist/release-adapters.d.ts +3 -0
  127. package/dist/release-adapters.js +22 -2
  128. package/dist/release-cli.js +81 -9
  129. package/dist/release.d.ts +21 -0
  130. package/dist/release.js +40 -4
  131. package/dist/releases.js +1 -1
  132. package/dist/request-budget-ui.d.ts +4 -2
  133. package/dist/request-budget-ui.js +30 -19
  134. package/dist/result-follow-ups.js +4 -0
  135. package/dist/retention-ui.d.ts +4 -3
  136. package/dist/retention-ui.js +15 -12
  137. package/dist/scope.d.ts +8 -0
  138. package/dist/scope.js +13 -0
  139. package/dist/serve.d.ts +0 -1
  140. package/dist/serve.js +51 -7
  141. package/dist/server/agents-computers.d.ts +9 -0
  142. package/dist/server/agents-computers.js +67 -0
  143. package/dist/server/chat.js +20 -18
  144. package/dist/server/chrome.d.ts +1 -1
  145. package/dist/server/chrome.js +19 -9
  146. package/dist/server/console.css +31 -2
  147. package/dist/server/flows.js +79 -36
  148. package/dist/server/home.d.ts +35 -0
  149. package/dist/server/home.js +104 -0
  150. package/dist/server/http.d.ts +3 -0
  151. package/dist/server/http.js +5 -0
  152. package/dist/server/kit-standalone.d.ts +22 -0
  153. package/dist/server/kit-standalone.js +69 -0
  154. package/dist/server/kit.d.ts +405 -0
  155. package/dist/server/kit.js +361 -0
  156. package/dist/server/pages.d.ts +2 -1
  157. package/dist/server/pages.js +213 -174
  158. package/dist/server/people-tokens.js +26 -85
  159. package/dist/server/render-history.d.ts +51 -0
  160. package/dist/server/render-history.js +228 -0
  161. package/dist/server/render-new-task.d.ts +29 -0
  162. package/dist/server/render-new-task.js +96 -0
  163. package/dist/server/render-next.d.ts +63 -0
  164. package/dist/server/render-next.js +109 -0
  165. package/dist/server/render-pages.d.ts +35 -190
  166. package/dist/server/render-pages.js +154 -563
  167. package/dist/server/render-people.d.ts +24 -3
  168. package/dist/server/render-people.js +93 -72
  169. package/dist/server/render-projects.d.ts +103 -0
  170. package/dist/server/render-projects.js +247 -0
  171. package/dist/server/render-results.d.ts +5 -24
  172. package/dist/server/render-results.js +48 -185
  173. package/dist/server/render-settings.d.ts +5 -74
  174. package/dist/server/render-settings.js +102 -493
  175. package/dist/server/render-tasks.d.ts +43 -5
  176. package/dist/server/render-tasks.js +131 -91
  177. package/dist/server/route-table.js +31 -5
  178. package/dist/server/settings.js +276 -255
  179. package/dist/server/task-views.d.ts +8 -0
  180. package/dist/server/task-views.js +90 -2
  181. package/dist/server/tasks.d.ts +18 -0
  182. package/dist/server/tasks.js +148 -41
  183. package/dist/server/terminals.js +1 -1
  184. package/dist/server/welcome.d.ts +22 -0
  185. package/dist/server/welcome.js +69 -0
  186. package/dist/settings-groups-ui.d.ts +279 -0
  187. package/dist/settings-groups-ui.js +615 -0
  188. package/dist/settings-kit.d.ts +42 -6
  189. package/dist/settings-kit.js +69 -7
  190. package/dist/settings-proofs.js +1 -0
  191. package/dist/setup-guide.d.ts +2 -2
  192. package/dist/skills-ui.js +59 -7
  193. package/dist/slack-settings.js +12 -5
  194. package/dist/spend-ui.d.ts +45 -26
  195. package/dist/spend-ui.js +124 -56
  196. package/dist/sso-ui.d.ts +5 -2
  197. package/dist/sso-ui.js +63 -31
  198. package/dist/storage-ui.d.ts +3 -2
  199. package/dist/storage-ui.js +56 -50
  200. package/dist/store.d.ts +182 -5
  201. package/dist/store.js +512 -38
  202. package/dist/surface.js +23 -3
  203. package/dist/task-archive.d.ts +10 -0
  204. package/dist/task-archive.js +16 -0
  205. package/dist/task-control.d.ts +1 -1
  206. package/dist/teams-settings.d.ts +2 -1
  207. package/dist/teams-settings.js +24 -41
  208. package/dist/telegram-settings.d.ts +0 -4
  209. package/dist/telegram-settings.js +52 -25
  210. package/dist/tidy.d.ts +130 -0
  211. package/dist/tidy.js +503 -0
  212. package/dist/toolroll-update-ui.d.ts +8 -4
  213. package/dist/toolroll-update-ui.js +55 -45
  214. package/dist/tools-ui.d.ts +5 -3
  215. package/dist/tools-ui.js +107 -42
  216. package/dist/work-index.d.ts +24 -0
  217. package/dist/work-index.js +56 -30
  218. package/dist/workspace-ui.d.ts +1 -1
  219. package/dist/workspace-ui.js +8 -4
  220. package/package.json +1 -1
@@ -12,7 +12,7 @@ export function browserWorkActionHref(item) {
12
12
  if (action.code === 'inspect-decisions')
13
13
  return '/';
14
14
  if (action.code === 'sign-in')
15
- return '/settings#providers';
15
+ return '/settings/agents#providers';
16
16
  if (action.code === 'answer-agent' && runId !== null)
17
17
  return `/agents?run=${runId}`;
18
18
  if (action.code === 'confirm-stopped')
@@ -4,7 +4,6 @@
4
4
  import { type DisplayState, type StateCounts } from './agent-state-words.js';
5
5
  import type { TeamSnapshot } from './team-contract.js';
6
6
  import type { RunActivity } from './activity-line.js';
7
- import type { BrandIconId } from './brand-icons.js';
8
7
  import type { AssignmentSnapshot } from './assignment.js';
9
8
  export { browserCrewFromIndex, browserWorkActionHref } from './browser-crew.js';
10
9
  import type { Store } from './store.js';
@@ -166,11 +165,29 @@ export type BrowserLink = {
166
165
  };
167
166
  export type BrowserTasksView = {
168
167
  kind: 'tasks';
168
+ /** List (rows under group headings) or Board (the same index as columns). */
169
+ layout: 'list' | 'board';
170
+ /** The status filters (All, Needs you, Running, Queued, Finished), as addresses with their counts. */
169
171
  tabs: (BrowserLink & {
172
+ key?: string;
170
173
  count: number;
171
174
  active: boolean;
172
175
  })[];
173
- /** Tasks waiting on a person in this view's scope ("3 need you" beside the title). */
176
+ /** The project filter: All and each project in view (null with one project). */
177
+ projects?: {
178
+ key: string;
179
+ label: string;
180
+ href: string;
181
+ active: boolean;
182
+ }[] | null;
183
+ /** The List and Board addresses for this same filter. */
184
+ layouts: {
185
+ list: string;
186
+ board: string;
187
+ };
188
+ /** The scope the counts cover, in words ("in payments-api", "across all your projects"). */
189
+ scope?: string;
190
+ /** Tasks waiting on a person in this view's scope. */
174
191
  needsYou: number;
175
192
  /** All and Needs you list their rows in these groups, in this order (empty ones left out); null: one plain list. */
176
193
  groups: {
@@ -178,27 +195,21 @@ export type BrowserTasksView = {
178
195
  label: string;
179
196
  count: number;
180
197
  }[] | null;
181
- rows: {
182
- id: string;
183
- title: string;
198
+ rows: BrowserTaskRow[];
199
+ /** The Board view's columns (Needs you, Queued, Running, Finished); null in the List view. */
200
+ board?: {
201
+ key: 'needs' | 'queued' | 'running' | 'finished';
202
+ label: string;
203
+ count: number;
184
204
  href: string;
185
- project: string | null;
186
- age: string;
187
- status: {
188
- label: string;
189
- tone: StatusTone;
190
- token: string;
191
- };
192
- /** What a Needs you row asks: its group. */
193
- ask: Ask | null;
194
- /** The row's chip under its group: the specific ask (Plan, Result, Mismatch, Plan changed, Failed, Builder offline), or none. */
195
- chip: AskChip | null;
196
- group: BrowserTaskGroup;
197
- action: BrowserLink | null;
198
- detail: string | null;
199
- problem: string | null;
200
- notes: string[];
201
- }[];
205
+ empty: string;
206
+ rows: BrowserTaskRow[];
207
+ }[] | null;
208
+ /** Archived tasks, offered at the foot of Finished (and current in Archived). */
209
+ archived?: (BrowserLink & {
210
+ count: number;
211
+ active: boolean;
212
+ }) | null;
202
213
  empty: {
203
214
  text: string;
204
215
  action: BrowserLink | null;
@@ -209,6 +220,8 @@ export type BrowserTasksView = {
209
220
  };
210
221
  tools: BrowserLink[];
211
222
  newTask: BrowserLink;
223
+ /** Put away old tasks (an approver's): the preview page. */
224
+ putAway?: BrowserLink | null;
212
225
  /** v105: subscription windows and monthly budgets, one tile each (an instance operator's; null when there are none). */
213
226
  limits: BrowserLimits | null;
214
227
  /** The stored-state filter (Any state, Queued, Running, Done, Failed, Cancelled), each a real link starting on page one. */
@@ -216,6 +229,40 @@ export type BrowserTasksView = {
216
229
  active: boolean;
217
230
  })[];
218
231
  };
232
+ export type BrowserTaskRow = {
233
+ id: string;
234
+ title: string;
235
+ href: string;
236
+ project: string | null;
237
+ age: string;
238
+ status: {
239
+ label: string;
240
+ tone: StatusTone;
241
+ token: string;
242
+ };
243
+ /** The row's chip word and tone (src/design/KIT.md): the ask under Needs you, else the headline. */
244
+ word: {
245
+ word: string;
246
+ tone: '' | 'needs' | 'ask' | 'live' | 'done' | 'failed';
247
+ };
248
+ /** What a Needs you row asks: its group. */
249
+ ask: Ask | null;
250
+ /** The row's chip under its group: the specific ask (Plan, Result, Mismatch, Plan changed, Failed, Builder offline), or none. */
251
+ chip: AskChip | null;
252
+ group: BrowserTaskGroup;
253
+ /** The status rank: 0 waits on a person, 1 runs, 2 queued or waiting, 3 finished, 4 stopped or put away. */
254
+ rank: number;
255
+ action: BrowserLink | null;
256
+ detail: string | null;
257
+ problem: string | null;
258
+ notes: string[];
259
+ /** Put away, or Restore in Archived (task-tidy.md): a POST to the task's own route; null for a viewer or live work. */
260
+ tidy?: {
261
+ action: string;
262
+ label: 'Put away' | 'Restore';
263
+ returnTo: string;
264
+ } | null;
265
+ };
219
266
  /** One limit: a plan's usage window ("Claude · 5-hour, 48%") or a monthly budget ("shop · Budget, $4.20 of $10"). */
220
267
  export type BrowserTaskGroup = WorkIndexGroup;
221
268
  export type BrowserLimitTile = {
@@ -242,135 +289,6 @@ export type BrowserUsageChip = {
242
289
  href: string;
243
290
  title: string;
244
291
  };
245
- export type BrowserSettingsView = {
246
- kind: 'settings';
247
- said: string | null;
248
- /** Using it from a phone, under Chat apps (approvers only). */
249
- phone?: BrowserPhoneCard;
250
- /** The settings destinations under short headings; a chat app's tile says whether it is connected and gets alerts. */
251
- groups: BrowserSettingsGroup[];
252
- theme: 'system' | 'light' | 'dark';
253
- /** The signal colour chosen for this browser (Settings → Appearance), "#rrggbb"; chart magenta by default. */
254
- accent: string;
255
- accentPresets: {
256
- id: string;
257
- name: string;
258
- year: number | null;
259
- hex: string;
260
- }[];
261
- permission: {
262
- mode: string;
263
- canManage: boolean;
264
- changed: string | null;
265
- } | null;
266
- quality: {
267
- mode: string;
268
- canManage: boolean;
269
- changed: string | null;
270
- } | null;
271
- providers: {
272
- provider: string;
273
- name: string;
274
- tone: 'ok' | 'warn' | 'off' | 'neutral';
275
- words: string;
276
- connection: {
277
- words: string;
278
- facts: string;
279
- checkAction: string;
280
- } | null;
281
- usage: string;
282
- envName: string;
283
- subscriptionCapable: boolean;
284
- mode: 'subscription' | 'api-key';
285
- set: boolean;
286
- }[] | null;
287
- legacyWebhookWarning?: string;
288
- services: {
289
- configured: string[];
290
- channel: string | null;
291
- implicit: boolean;
292
- } | null;
293
- push: {
294
- available: boolean;
295
- devices: {
296
- id: number;
297
- words: string;
298
- state: string;
299
- removable: boolean;
300
- }[];
301
- } | null;
302
- /** Quiet chat: how chats reach this person, and their evening digest time (null: off). */
303
- chat?: {
304
- mode: 'quiet' | 'all';
305
- digestAt: string | null;
306
- /** Whether a result's saved screenshots follow its chat message: off, the first one, or up to 4. */
307
- screenshots?: 'off' | 'first' | 'all';
308
- /** Each project this person can see; a muted one sends no pings but stays in Tasks and the digest. */
309
- projects?: {
310
- repo: string;
311
- name: string;
312
- muted: boolean;
313
- }[];
314
- } | null;
315
- digest: {
316
- every: string;
317
- held: string | null;
318
- } | null;
319
- telegram: {
320
- state: string;
321
- current: string;
322
- /** v98: how the bot's messages reach Toolroll (pushed, or asked for), in words. */
323
- delivery?: string | null;
324
- };
325
- /** Each worker: how many tasks it runs at once, and what it is running now. */
326
- workers?: {
327
- name: string;
328
- tone: 'ok' | 'warn' | 'off';
329
- state: string;
330
- capacity: number;
331
- busy: number;
332
- running: {
333
- taskId: string;
334
- title: string;
335
- href: string;
336
- project: string | null;
337
- }[];
338
- }[] | null;
339
- /** v87: the mail server Send email steps use (approvers only); the password is never shown back. */
340
- email?: {
341
- set: boolean;
342
- host: string;
343
- port: number;
344
- secure: boolean;
345
- user: string;
346
- from: string;
347
- /** v89: where Email inbox triggers read (IMAP), and a Google account connected instead of a mail server (`redirect`: the address to register with Google, when this page's address can take one). */
348
- imapHost: string;
349
- imapPort: number;
350
- google: {
351
- connected: string | null;
352
- clientId: string;
353
- redirect: string | null;
354
- };
355
- } | null;
356
- /** The installation's first Ready result, in words ("first result in 7 min"); null before it arrives. */
357
- firstResult?: string | null;
358
- /** Settings → Updates: this version, the latest known one and its notes, how to update, the daily-check switch, and each worker's version. */
359
- updates?: BrowserUpdates | null;
360
- };
361
- /** A tile's `brand` is a chat app's logo (brand-mark.ts), drawn in place of its icon. */
362
- export type BrowserSettingsGroup = {
363
- title: string;
364
- tiles: {
365
- href: string;
366
- label: string;
367
- brand?: BrandIconId;
368
- status?: {
369
- tone: 'ok' | 'warn' | 'off';
370
- words: string;
371
- };
372
- }[];
373
- };
374
292
  export type BrowserUpdates = {
375
293
  current: string;
376
294
  /** The latest release the last check found; null before any check has worked. */
@@ -449,6 +367,15 @@ export type BrowserTaskView = {
449
367
  label: string;
450
368
  current: BrowserLink;
451
369
  } | null;
370
+ /** Put away (task-tidy.md): "Archived by tidy: <why>", when, and Restore for an approver. */
371
+ archived?: {
372
+ words: string;
373
+ at: string;
374
+ restore: {
375
+ action: string;
376
+ returnTo: string;
377
+ } | null;
378
+ } | null;
452
379
  /** The status card; `statusHtml` stands in when no assignment projection exists. */
453
380
  status: AssignmentCard | null;
454
381
  statusHtml: string;
@@ -573,10 +500,61 @@ export type BrowserTaskView = {
573
500
  } | null;
574
501
  /** Where the approval sits: under the header when it is the thing to do now, else at the top of the Plan tab. */
575
502
  approvalPlacement?: "lead" | "plan";
503
+ /** The kit approval box (src/design/KIT.md): the act's form and the facts that decide password, one click or none;
504
+ * `planHtml` is what it signs, for the Plan tab. Null when nothing waits on this person's approval here. */
505
+ approve?: {
506
+ action: string;
507
+ fields: Record<string, string>;
508
+ label: string;
509
+ heading: string;
510
+ text: string;
511
+ kind: import("./design/kit.js").ApprovalKind;
512
+ facts: {
513
+ passwordless: boolean;
514
+ remembered: boolean;
515
+ automatic?: boolean;
516
+ };
517
+ /** When a remembered password stops counting (ISO); the page words it in the viewer's zone. */
518
+ rememberedUntil: string | null;
519
+ planHtml: string;
520
+ } | null;
521
+ /** Ship: the pull request's checks, each on one time axis (task ship's twin). Null: no checks read yet. */
522
+ ship?: {
523
+ pr: number;
524
+ head: string;
525
+ state: "running" | "passed" | "failed" | "none";
526
+ rows: import("./design/kit.js").TimingRow[];
527
+ summary: string;
528
+ observedAt: string;
529
+ } | null;
530
+ /** A release's own steps (release status's twin). Null: this task is no release, or nothing recorded. */
531
+ release?: {
532
+ tag: string;
533
+ version: string;
534
+ pr: number | null;
535
+ state: "running" | "waiting" | "failed" | "done";
536
+ rows: import("./design/kit.js").TimingRow[];
537
+ headline: string;
538
+ stopped: {
539
+ step: string;
540
+ message: string;
541
+ at: string;
542
+ } | null;
543
+ startedAt: string;
544
+ } | null;
545
+ /** How the plan was approved: by whom and how, or the rule that approved it automatically. */
546
+ approved?: {
547
+ by: string;
548
+ at: string;
549
+ automatic: boolean;
550
+ rule: string | null;
551
+ how: string;
552
+ version: string;
553
+ } | null;
576
554
  /** ⋯ More actions: the task's secondary acts, the same order on the task and agent pages, destructive last. */
577
555
  more?: BrowserTaskMore[];
578
556
  };
579
- export type BrowserTaskTab = "activity" | "result" | "plan";
557
+ export type BrowserTaskTab = "activity" | "result" | "plan" | "attempts";
580
558
  /** One ⋯ item: a plain link, a copy of this page's address, a one-click POST (never a ceremony), or a go-to that switches
581
559
  * to the tab holding the item's own form, opens it and focuses it (`target`: that element's id). */
582
560
  export type BrowserTaskMore = {
@@ -601,44 +579,34 @@ export type BrowserProjectRow = {
601
579
  name: string;
602
580
  path: string;
603
581
  shortPath: string;
582
+ /** The project's own page (/projects/<name>). */
583
+ href: string;
584
+ /** The session's open project. */
604
585
  open: boolean;
605
586
  /** When it was last opened here; null for a project only seen in the queue. */
606
587
  openedAt: string | null;
607
- knowledgeHref: string;
608
- /** Settings → Projects → Pull requests for this project, and whether they are on. */
609
- pullRequests?: {
610
- href: string;
611
- on: boolean;
612
- };
613
- /** Settings → Projects → Checks for this project, and its level in words. */
614
- checks?: {
615
- href: string;
616
- level: string;
617
- };
618
- /** What waits, runs, queues or finished today; null when not scanned. */
619
- peek: {
620
- label: string;
621
- href: string;
622
- tone: 'attention' | 'info' | 'neutral' | 'success';
623
- }[] | null;
588
+ /** The row's chip: something waits on this person, or runs; null for neither. */
589
+ status: 'needs' | 'running' | null;
590
+ /** Its counts in words ("2 need you · 1 running"); null when not scanned. */
591
+ summary: string | null;
624
592
  };
625
593
  export type BrowserProjectsView = {
626
594
  kind: 'projects';
627
- activity?: {
628
- project: string;
629
- report: import('./project-outcomes.js').ProjectOutcomes | null;
630
- };
631
595
  /** Arrived from New task: choosing where the task belongs. */
632
596
  choosing: boolean;
597
+ /** A refusal that belongs to the page, not to one form (already says what didn't change). */
633
598
  problem: string | null;
599
+ /** A neutral line (a finished clone). */
600
+ said: string | null;
634
601
  returnTo: string;
635
602
  recent: BrowserProjectRow[];
636
603
  available: BrowserProjectRow[];
637
- /** The add roads; `html` carries the server's GitHub-link and exact-path forms. */
604
+ /** The add ways (the server's forms), the clone review a preview minted, and whether the drawer opens at once
605
+ * (a refused GitHub link, shown next to its field). */
638
606
  add: {
639
- browse: string | null;
640
- github: string | null;
641
607
  html: string;
608
+ review: string | null;
609
+ openOnLoad: boolean;
642
610
  };
643
611
  };
644
612
  export type BrowserResultTab = 'summary' | 'changes' | 'checks';
@@ -977,6 +945,8 @@ export type BrowserFlowStage = {
977
945
  }[] | undefined;
978
946
  /** A Build zone in another project: its path. */
979
947
  repo?: string | undefined;
948
+ /** v144: a script zone that starts a browser (Playwright's Chromium); it runs only once a person allows browser use for the flow. */
949
+ browser?: true | undefined;
980
950
  next: string | null;
981
951
  onFail: string | null;
982
952
  };
@@ -1000,6 +970,8 @@ export type BrowserFlowCard = {
1000
970
  stage: string;
1001
971
  state: "active" | "done" | "cancelled";
1002
972
  waiting: string | null;
973
+ /** It waits because browser use isn't allowed for the flow (flow-browser.ts): the card offers Allow browser. */
974
+ browserWait?: true;
1003
975
  task: {
1004
976
  id: string;
1005
977
  href: string;
@@ -1251,6 +1223,8 @@ export type BrowserFlowView = {
1251
1223
  body: string;
1252
1224
  timeoutMinutes: number;
1253
1225
  version: number;
1226
+ /** The content digest the panel showed: an approval of a held script carries it back. */
1227
+ digest: string;
1254
1228
  savedBy: string;
1255
1229
  savedAt: string;
1256
1230
  usedHere: string[];
@@ -1293,7 +1267,31 @@ export type BrowserFlowView = {
1293
1267
  optional: string | null;
1294
1268
  }[];
1295
1269
  schedulesDigest: string;
1270
+ /** The latest grant a change ended early (flow-unattended.ts unattendedViewOf): why and when. */
1271
+ ended?: {
1272
+ why: string;
1273
+ at: string;
1274
+ } | null;
1296
1275
  };
1276
+ /** Browser use (flow-browser.ts browserViewOf): null when no zone says it starts a browser. */
1277
+ browser: {
1278
+ status: "allowed" | "ended" | "none";
1279
+ words: string;
1280
+ signedBy: string | null;
1281
+ signedAt: string | null;
1282
+ zones: {
1283
+ zone: string;
1284
+ title: string;
1285
+ script: string;
1286
+ version: number;
1287
+ digest: string;
1288
+ }[];
1289
+ terms: string[];
1290
+ digest: string | null;
1291
+ problem: string | null;
1292
+ /** Whether this person may allow it here: an approver whose account reaches every project (as the route requires). */
1293
+ canApprove: boolean;
1294
+ } | null;
1297
1295
  approvers: string[];
1298
1296
  /** The projects a Build zone may work in: the flow's own first, then others the viewer can reach. */
1299
1297
  projects?: {
@@ -1458,9 +1456,107 @@ export type BrowserAgentsView = {
1458
1456
  empty: string | null;
1459
1457
  /** The Live grid (?view=live): every running agent's live output, watching only. */
1460
1458
  live?: boolean;
1459
+ /** The Finished group's window (?window=), 24 hours unless the address says otherwise. */
1460
+ window?: AgentLaneWindow;
1461
+ /** The computers that build (what /fleet showed), for a person with access to the whole installation; null otherwise. */
1462
+ computers?: BrowserComputers | null;
1463
+ /** Which model runs each phase (what /system showed), for a person with access to the whole installation. */
1464
+ phases?: BrowserAgentPhase[] | null;
1465
+ /** The rest of what /system showed: workspaces, the background service, notifications and external work. */
1466
+ system?: BrowserAgentsSystem | null;
1467
+ /** This person may open terminals (an installation-wide operator in a browser). */
1468
+ terminals?: boolean;
1469
+ /** What a computer act said, in fixed words (a retired computer, by the name the store knows). */
1470
+ computerSaid?: {
1471
+ tone: 'info' | 'error';
1472
+ text: string;
1473
+ } | null;
1461
1474
  };
1462
- export type BrowserView = BrowserTasksView | BrowserSettingsView | BrowserTaskView | BrowserProjectsView | BrowserResultView | BrowserFlowView | BrowserAgentsView;
1475
+ /** One computer that builds (a registered runner): what it is doing and what waits for it. */
1476
+ export type BrowserComputer = {
1477
+ name: string;
1478
+ host: string;
1479
+ state: 'building' | 'idle' | 'offline';
1480
+ capacity: number;
1481
+ /** Retired, listed only while tasks are still reserved for it. */
1482
+ retired: boolean;
1483
+ /** Its live builds this person may see; `hidden` counts the ones in projects they can't. */
1484
+ building: {
1485
+ taskId: string;
1486
+ title: string;
1487
+ href: string;
1488
+ project: string | null;
1489
+ }[];
1490
+ hidden: number;
1491
+ heardAt: string;
1492
+ registeredAt: string;
1493
+ /** The projects it takes work from, that this person may see. */
1494
+ projects: string[];
1495
+ /** The operator's note on its queue (display only). */
1496
+ note: string | null;
1497
+ /** Queued tasks reserved for it, that this person may see. */
1498
+ reserved: {
1499
+ id: string;
1500
+ title: string;
1501
+ href: string;
1502
+ project: string | null;
1503
+ taken: boolean;
1504
+ }[];
1505
+ };
1506
+ export type BrowserComputers = {
1507
+ list: BrowserComputer[];
1508
+ /** Register, retire, move reserved work and notes: an approver in a browser session. */
1509
+ manage: boolean;
1510
+ /** The queue's revision, for a move (POST /queue/move). */
1511
+ queueRevision: number;
1512
+ /** Queued tasks no computer is reserved for. */
1513
+ shared: number;
1514
+ };
1515
+ export type BrowserAgentPhase = {
1516
+ phase: 'plan' | 'build' | 'repair' | 'review';
1517
+ /** The provider and model in words; null when it can't be worked out (`problem` says why). */
1518
+ model: string | null;
1519
+ problem: string | null;
1520
+ /** Where the choice comes from, in words ("Set for the whole installation by alex"). */
1521
+ source: string;
1522
+ /** This provider reports tokens, not dollars. */
1523
+ noDollars: boolean;
1524
+ };
1525
+ export type BrowserAgentsSystem = {
1526
+ workspaces: {
1527
+ name: string;
1528
+ branch: string;
1529
+ state: 'building' | 'free' | 'needs review';
1530
+ }[];
1531
+ /** The background service's latest run on the open project: running since `at`, or ended at `at`. */
1532
+ service: {
1533
+ running: boolean;
1534
+ at: string;
1535
+ built: number;
1536
+ broke: number;
1537
+ } | null;
1538
+ outbox: number;
1539
+ external: {
1540
+ repo: string;
1541
+ state: string;
1542
+ }[];
1543
+ };
1544
+ export type BrowserView = BrowserTasksView | BrowserTaskView | BrowserProjectsView | BrowserResultView | BrowserFlowView | BrowserAgentsView | BrowserHomeView | BrowserSearchView;
1463
1545
  export type BrowserWorkspace = {
1546
+ /** The one Needs-you count (tasks only) with its scope: the Tasks list's own count for the project in view (`scope`,
1547
+ * a project path) or every project (null), its words ("5 need you in payments-api") and the list it opens. */
1548
+ needsYou?: {
1549
+ count: number;
1550
+ saturated: boolean;
1551
+ scope: string | null;
1552
+ label: string;
1553
+ href: string;
1554
+ };
1555
+ /** The same Needs-you count for each project (`path` null: work with no project), from the same work index totals. */
1556
+ needsYouByProject?: {
1557
+ path: string | null;
1558
+ count: number;
1559
+ }[];
1464
1560
  version: 1;
1465
1561
  path: string;
1466
1562
  title: string;
@@ -1533,6 +1629,96 @@ export type BrowserWorkspace = {
1533
1629
  /** The Chat landing's live view: who is working now, four counts, and Catch up in tabs. */
1534
1630
  home?: BrowserHome | null;
1535
1631
  };
1632
+ /** Home ("/"): one sentence that answers "what needs me?", four counts that agree with the Tasks filters they open,
1633
+ * what waits on this person grouped by what it asks, what is running, and the selected item answered in place. */
1634
+ export type BrowserHomeView = {
1635
+ kind: 'home';
1636
+ /** "7 need you across 2 projects.", derived from the same counts as the figures. */
1637
+ say: string;
1638
+ /** The project in view (a path) or every project (null), and the scope links (null with one project). */
1639
+ project: string | null;
1640
+ scopes: {
1641
+ key: string;
1642
+ label: string;
1643
+ href: string;
1644
+ active: boolean;
1645
+ }[] | null;
1646
+ counts: {
1647
+ key: 'needs' | 'running' | 'queued' | 'finished';
1648
+ label: string;
1649
+ value: number;
1650
+ href: string;
1651
+ }[];
1652
+ groups: {
1653
+ key: 'decide' | 'review' | 'unblock' | 'running';
1654
+ label: string;
1655
+ rows: BrowserHomeRow[];
1656
+ }[];
1657
+ /** More waits than the list shows: open them all in Tasks. */
1658
+ more: {
1659
+ count: number;
1660
+ href: string;
1661
+ } | null;
1662
+ newTask: string;
1663
+ /** The lead's message box, where chat is allowed for this person: a POST to /chat in this scope. */
1664
+ ask: {
1665
+ project: string | null;
1666
+ placeholder: string;
1667
+ } | null;
1668
+ empty: {
1669
+ title: string;
1670
+ text: string;
1671
+ } | null;
1672
+ };
1673
+ export type BrowserHomeRow = {
1674
+ id: string;
1675
+ title: string;
1676
+ href: string;
1677
+ project: string | null;
1678
+ age: string;
1679
+ chip: {
1680
+ word: string;
1681
+ tone: '' | 'needs' | 'ask' | 'live' | 'done' | 'failed';
1682
+ };
1683
+ /** One line: what it asks, or what the agent is doing now. */
1684
+ line: string | null;
1685
+ /** The one act that resolves it (a link), or null. */
1686
+ action: {
1687
+ label: string;
1688
+ href: string;
1689
+ } | null;
1690
+ /** An agent's question, answered in place (POST /d/<id>/answer, one click); null when it must be answered on its page. */
1691
+ question: {
1692
+ id: number;
1693
+ text: string;
1694
+ recap: string;
1695
+ options: {
1696
+ id: string;
1697
+ label: string;
1698
+ consequence: string;
1699
+ recommended: boolean;
1700
+ }[];
1701
+ } | null;
1702
+ };
1703
+ /** Search ("/search"): the places and the tasks in view that match the words; the ⌘K menu's "See all results". */
1704
+ export type BrowserSearchView = {
1705
+ kind: 'search';
1706
+ q: string;
1707
+ tasks: {
1708
+ id: string;
1709
+ title: string;
1710
+ href: string;
1711
+ project: string | null;
1712
+ age: string;
1713
+ chip: {
1714
+ word: string;
1715
+ tone: '' | 'needs' | 'ask' | 'live' | 'done' | 'failed';
1716
+ };
1717
+ archived: boolean;
1718
+ }[];
1719
+ /** More tasks exist than were read: the Tasks list has them all. */
1720
+ truncated: boolean;
1721
+ };
1536
1722
  /** One agent at work now: its task and the machine's own phase, in words. */
1537
1723
  export type BrowserHomeAgent = {
1538
1724
  runId: number;