toolroll 0.9.60 → 0.9.62

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 (128) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/agent-board.d.ts +208 -0
  3. package/dist/agent-board.js +454 -0
  4. package/dist/agent-fence.d.ts +19 -0
  5. package/dist/agent-fence.js +100 -8
  6. package/dist/agent-pulse.d.ts +43 -0
  7. package/dist/agent-pulse.js +214 -0
  8. package/dist/agent-turns.d.ts +52 -0
  9. package/dist/agent-turns.js +137 -0
  10. package/dist/agents-board.d.ts +101 -0
  11. package/dist/agents-board.js +225 -0
  12. package/dist/assignment-adapters.d.ts +1 -0
  13. package/dist/assignment-status.d.ts +1 -1
  14. package/dist/assignment.d.ts +4 -0
  15. package/dist/assignment.js +8 -6
  16. package/dist/browser/workspace.css +1 -1
  17. package/dist/browser/workspace.js +29 -25
  18. package/dist/browser-crew.js +2 -0
  19. package/dist/browser-workspace.d.ts +79 -1
  20. package/dist/browser-workspace.js +1 -0
  21. package/dist/builder.d.ts +8 -0
  22. package/dist/builder.js +113 -13
  23. package/dist/chat-channel.js +9 -0
  24. package/dist/chat-core.d.ts +6 -0
  25. package/dist/chat-core.js +8 -0
  26. package/dist/chat-delivery.js +22 -0
  27. package/dist/chat-messages.js +8 -1
  28. package/dist/chat-quiet.js +1 -0
  29. package/dist/chat-voice.d.ts +2 -0
  30. package/dist/chat-voice.js +2 -0
  31. package/dist/checkout-cleanup.d.ts +3 -0
  32. package/dist/checkout-cleanup.js +11 -2
  33. package/dist/cli.js +28 -11
  34. package/dist/contracts/console-api.d.ts +3 -1
  35. package/dist/contracts/console-api.js +5 -1
  36. package/dist/contracts/lead-tools.d.ts +16 -2
  37. package/dist/contracts/lead-tools.js +5 -1
  38. package/dist/desktop-update.d.ts +1 -1
  39. package/dist/evidence-pack.js +1 -1
  40. package/dist/evidence.d.ts +6 -0
  41. package/dist/evidence.js +14 -3
  42. package/dist/exec.d.ts +32 -0
  43. package/dist/exec.js +229 -10
  44. package/dist/invoke.js +110 -18
  45. package/dist/landed-cleanup.d.ts +170 -0
  46. package/dist/landed-cleanup.js +814 -0
  47. package/dist/lead-cli.js +22 -19
  48. package/dist/lead-contract.d.ts +1 -1
  49. package/dist/lead-contract.js +4 -4
  50. package/dist/lead-doors.js +45 -1
  51. package/dist/lead-tools.js +40 -7
  52. package/dist/live-input.d.ts +68 -0
  53. package/dist/live-input.js +254 -0
  54. package/dist/live.d.ts +1 -1
  55. package/dist/live.js +4 -2
  56. package/dist/maintenance.d.ts +2 -0
  57. package/dist/maintenance.js +5 -2
  58. package/dist/operate-remote-arguments.js +5 -1
  59. package/dist/operate-remote.js +1 -1
  60. package/dist/operate.d.ts +1 -1
  61. package/dist/operate.js +249 -26
  62. package/dist/orphan-sweep.d.ts +2 -0
  63. package/dist/orphan-sweep.js +5 -3
  64. package/dist/project-admission.d.ts +10 -6
  65. package/dist/project-admission.js +33 -11
  66. package/dist/project-delete-ui.d.ts +12 -0
  67. package/dist/project-delete-ui.js +32 -2
  68. package/dist/project-tools.d.ts +7 -11
  69. package/dist/project-tools.js +13 -37
  70. package/dist/provider.d.ts +65 -8
  71. package/dist/provider.js +80 -21
  72. package/dist/remote-main.d.ts +57 -0
  73. package/dist/remote-main.js +179 -0
  74. package/dist/result-completion.d.ts +7 -0
  75. package/dist/result-completion.js +9 -0
  76. package/dist/runner.d.ts +4 -2
  77. package/dist/runner.js +3 -3
  78. package/dist/serve.js +19 -1
  79. package/dist/server/live.d.ts +3 -0
  80. package/dist/server/live.js +35 -2
  81. package/dist/server/pages.js +59 -35
  82. package/dist/server/render-chat.js +12 -0
  83. package/dist/server/render-tasks.d.ts +15 -2
  84. package/dist/server/render-tasks.js +30 -7
  85. package/dist/server/route-table.js +4 -1
  86. package/dist/server/settings.js +5 -3
  87. package/dist/server/task-views.js +11 -0
  88. package/dist/server/tasks.js +63 -0
  89. package/dist/shared-deps.d.ts +9 -4
  90. package/dist/shared-deps.js +89 -13
  91. package/dist/staged-runtimes.d.ts +16 -4
  92. package/dist/staged-runtimes.js +160 -38
  93. package/dist/steer-live.d.ts +19 -0
  94. package/dist/steer-live.js +93 -0
  95. package/dist/steer-status.d.ts +8 -2
  96. package/dist/steer-status.js +19 -5
  97. package/dist/storage-sweep-child.d.ts +1 -0
  98. package/dist/storage-sweep-child.js +76 -0
  99. package/dist/storage-sweep-process.d.ts +48 -0
  100. package/dist/storage-sweep-process.js +204 -0
  101. package/dist/storage-sweep-schedule.d.ts +30 -0
  102. package/dist/storage-sweep-schedule.js +164 -0
  103. package/dist/storage-sweep.d.ts +31 -6
  104. package/dist/storage-sweep.js +165 -39
  105. package/dist/storage-ui.d.ts +4 -0
  106. package/dist/storage-ui.js +22 -7
  107. package/dist/storage.d.ts +6 -0
  108. package/dist/storage.js +35 -0
  109. package/dist/store.d.ts +200 -3
  110. package/dist/store.js +443 -17
  111. package/dist/surface.js +8 -4
  112. package/dist/sweep-quarantine.d.ts +28 -0
  113. package/dist/sweep-quarantine.js +153 -0
  114. package/dist/task-base.d.ts +35 -0
  115. package/dist/task-base.js +51 -0
  116. package/dist/task-status.d.ts +2 -0
  117. package/dist/task-status.js +5 -1
  118. package/dist/test-temp.d.ts +6 -3
  119. package/dist/test-temp.js +15 -9
  120. package/dist/toolroll-update.js +4 -2
  121. package/dist/work-index.d.ts +1 -0
  122. package/dist/work-index.js +32 -12
  123. package/dist/work-summary.d.ts +2 -2
  124. package/dist/workspace-revision.js +3 -1
  125. package/dist/worktree.d.ts +57 -3
  126. package/dist/worktree.js +201 -23
  127. package/package.json +1 -1
  128. package/scripts/provider-canary.mjs +235 -147
package/dist/store.d.ts CHANGED
@@ -78,6 +78,20 @@ export declare const FLOW_SEND_SCHEMA = "\nCREATE TABLE IF NOT EXISTS flow_send
78
78
  * vocabulary and when — never text, tool names or arguments. Display state, not evidence;
79
79
  * a finished run's row goes with the live log's own retention (sweepRunActivity). */
80
80
  export declare const RUN_ACTIVITY_SCHEMA = "\nCREATE TABLE IF NOT EXISTS run_activity (\n run INTEGER PRIMARY KEY REFERENCES run(id) ON DELETE CASCADE,\n kind TEXT NOT NULL CHECK (kind IN ('session','message','edit','command','read','search','lookup','plan','delegate','tool')),\n at TEXT NOT NULL\n);\n";
81
+ /** A task branch moved to current main before an attempt (fresh base; v122, a new table: additive only): the branch
82
+ * had no commits of its own and no changes, so it started over from `to_rev`. `after_run` is the newest run id when it
83
+ * moved: the branch's whole-task diff runs from the first builder base recorded after it (firstBuilderBase), never from
84
+ * the older main it left. */
85
+ export declare const BRANCH_BASE_MOVE_SCHEMA = "\nCREATE TABLE IF NOT EXISTS branch_base_move (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_ref INTEGER NOT NULL REFERENCES task_ref(id) ON DELETE CASCADE,\n branch TEXT NOT NULL,\n from_rev TEXT NOT NULL,\n to_rev TEXT NOT NULL,\n after_run INTEGER NOT NULL,\n moved_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS branch_base_move_branch ON branch_base_move (task_ref, branch, id);\n";
86
+ /** Pausing a running Claude build (live steering, v121: additive only). A person's Pause asks the build to
87
+ * stop its current turn and keep its session: one row per request, bound to the exact run it was asked of, under the
88
+ * request id the asker chose (a repeated request is the same request). `note` is the steering note a Pause and steer
89
+ * sends right after the interrupt. The builder's dispatcher stamps sent_at when the interrupt is written, paused_at when
90
+ * the turn stopped, resumed_at when a later note continued the session, and ended_at when the run stopped taking input
91
+ * first. Never a stop: nothing here ends, holds or reclaims an attempt (run_stop does that). A person's Resume (run_resume)
92
+ * continues a paused build with a short continue frame and no note: one row per request, bound to the exact paused run;
93
+ * sent_at when the frame was written, ended_at when the run was no longer paused to take it. */
94
+ export declare const LIVE_STEER_SCHEMA = "\nCREATE TABLE IF NOT EXISTS run_pause (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run INTEGER NOT NULL REFERENCES run(id) ON DELETE CASCADE,\n task_ref INTEGER NOT NULL REFERENCES task_ref(id) ON DELETE CASCADE,\n request_id TEXT NOT NULL UNIQUE,\n requested_by TEXT NOT NULL,\n requested_via TEXT NOT NULL CHECK (requested_via IN ('cli','web','chat')),\n requested_at TEXT NOT NULL,\n note INTEGER REFERENCES task_steer(id) ON DELETE SET NULL,\n sent_at TEXT,\n paused_at TEXT,\n resumed_at TEXT,\n ended_at TEXT\n);\nCREATE INDEX IF NOT EXISTS run_pause_by_run ON run_pause (run, id);\nCREATE TABLE IF NOT EXISTS run_resume (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run INTEGER NOT NULL REFERENCES run(id) ON DELETE CASCADE,\n task_ref INTEGER NOT NULL REFERENCES task_ref(id) ON DELETE CASCADE,\n request_id TEXT NOT NULL UNIQUE,\n requested_by TEXT NOT NULL,\n requested_via TEXT NOT NULL CHECK (requested_via IN ('cli','web','chat')),\n requested_at TEXT NOT NULL,\n sent_at TEXT,\n ended_at TEXT\n);\nCREATE INDEX IF NOT EXISTS run_resume_by_run ON run_resume (run, id);\n";
81
95
  export declare const CHAT_APPROVAL_SCHEMA = "\nCREATE TABLE IF NOT EXISTS chat_approval_setting (\n approver TEXT NOT NULL,\n scope TEXT NOT NULL,\n enabled INTEGER NOT NULL CHECK (enabled IN (0,1)),\n full_access INTEGER NOT NULL DEFAULT 0 CHECK (full_access IN (0,1)),\n attempt_cap_microusd INTEGER CHECK (attempt_cap_microusd IS NULL OR attempt_cap_microusd >= 0),\n generation INTEGER NOT NULL,\n digest TEXT NOT NULL,\n updated_by TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (approver, scope)\n);\n";
82
96
  export declare const CHAT_DECIDE_SCHEMA = "\nCREATE TABLE IF NOT EXISTS chat_decide_action (\n token TEXT PRIMARY KEY,\n channel TEXT NOT NULL,\n binding INTEGER NOT NULL,\n chat TEXT NOT NULL,\n message TEXT,\n act TEXT NOT NULL CHECK (act IN ('accept','changes','retry','approve','not-now','merge')),\n phase TEXT NOT NULL CHECK (phase IN ('offer','yes','cancel')),\n task_id TEXT NOT NULL,\n run INTEGER,\n digest TEXT NOT NULL,\n created_at TEXT NOT NULL,\n expires_at TEXT NOT NULL,\n consumed_at TEXT\n);\nCREATE INDEX IF NOT EXISTS chat_decide_action_message ON chat_decide_action (channel, chat, message);\nCREATE TABLE IF NOT EXISTS chat_decide_prompt (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n channel TEXT NOT NULL,\n binding INTEGER NOT NULL,\n chat TEXT NOT NULL,\n task_id TEXT NOT NULL,\n run INTEGER NOT NULL,\n digest TEXT NOT NULL,\n message TEXT,\n created_at TEXT NOT NULL,\n expires_at TEXT NOT NULL,\n consumed_at TEXT\n);\nCREATE INDEX IF NOT EXISTS chat_decide_prompt_open ON chat_decide_prompt (channel, binding, consumed_at);\n";
83
97
  export type LeadAsk = {
@@ -152,7 +166,7 @@ export type SealedLedgerEntry = LedgerEntry & {
152
166
  hash: string;
153
167
  } | null;
154
168
  };
155
- export declare const SCHEMA_VERSION = 120;
169
+ export declare const SCHEMA_VERSION = 122;
156
170
  /** v118: the tables merged into `credential`, in the order they move (a person's API tokens keep their ids first). */
157
171
  export declare const V118_MERGED_TABLES: Readonly<Record<string, CredentialKind>>;
158
172
  /**
@@ -210,7 +224,10 @@ export declare const V115_DROPPED_TABLES: readonly string[];
210
224
  * before the old tables drop, and the references that named them name credential in place, their rows untouched. v119 only adds four columns
211
225
  * (planning_generation on task_ref, run and plan_revision, defaulting to 0, and decision.superseded_reason, null);
212
226
  * the rehearsal checks every saved row reads the declared default (HISTORY_RULES' added columns). v120 only adds
213
- * three nullable task_steer columns (the running build's steering folder), checked the same way.
227
+ * three nullable task_steer columns (the running build's steering folder), checked the same way. v121 only adds
228
+ * new tables and the columns in V121_ADDED_COLUMNS (null, or no sends), checked the same way. v122 only adds a new
229
+ * table (branch_base_move) and the nullable column in V122_ADDED_COLUMNS (a project's recorded remote), checked the
230
+ * same way.
214
231
  */
215
232
  export declare const UPDATE_SAFE_MIGRATIONS: readonly number[];
216
233
  /** v119: the columns it adds, by table, with the value every row saved before it reads (toolroll-update's HISTORY_RULES). */
@@ -223,6 +240,29 @@ export declare const V120_ADDED_COLUMNS: Readonly<Record<string, Readonly<Record
223
240
  definition: string;
224
241
  saved: string;
225
242
  }>>>>;
243
+ /**
244
+ * Live steering's added columns (v121), with the value every row saved before them reads. A note carries the identity
245
+ * its stdin copy is sent under (live_uuid, minted when it is filed), how many times it was sent to the running build
246
+ * and when last, and when it was given up on as not picked up.
247
+ * A run says when its stdin session opened and closed: only then can a note reach it in seconds, or a Pause stop a turn;
248
+ * and how long a paused session may wait before it ends (the idle limit; none under a wall-clock limit).
249
+ */
250
+ export declare const LIVE_STEER_COLUMNS: Readonly<Record<string, Readonly<Record<string, {
251
+ definition: string;
252
+ saved: string;
253
+ }>>>>;
254
+ /** v121: the columns it adds, by table, with the value every row saved before it reads: live steering's, and a run's
255
+ * attempt key (the Agents board; runs admitted before it read none). Its new tables carry no saved rows. */
256
+ export declare const V121_ADDED_COLUMNS: Readonly<Record<string, Readonly<Record<string, {
257
+ definition: string;
258
+ saved: string;
259
+ }>>>>;
260
+ /** v122: the column it adds, with the value every row saved before it reads: the remote URL an owner's project add
261
+ * recorded (projects added before it read none, until `repos add <project> --remote <url>` records one). */
262
+ export declare const V122_ADDED_COLUMNS: Readonly<Record<string, Readonly<Record<string, {
263
+ definition: string;
264
+ saved: string;
265
+ }>>>>;
226
266
  /** Whether a database settled at `version` reaches this build's schema through update-safe migrations alone. */
227
267
  export declare function updateSafeSchema(version: number | null): boolean;
228
268
  export type OAuthClientRow = {
@@ -1163,6 +1203,54 @@ export type SteerNote = {
1163
1203
  mailedRun: number | null;
1164
1204
  mailedAt: string | null;
1165
1205
  ackedAt: string | null;
1206
+ /** Live steering: the identity its stdin copy is sent under, how often and when last it was sent to the running
1207
+ * build, and when it was given up on as not picked up. Null/0 on notes filed before live steering. */
1208
+ liveUuid: string | null;
1209
+ liveSends: number;
1210
+ liveSentAt: string | null;
1211
+ liveMissedAt: string | null;
1212
+ };
1213
+ /** Who asked for a pause, and through which door. */
1214
+ export type PauseVia = "cli" | "web" | "chat";
1215
+ /** One Pause (or Pause and steer) asked of an exact running build (LIVE_STEER_SCHEMA). */
1216
+ export type RunPause = {
1217
+ id: number;
1218
+ run: number;
1219
+ taskRef: number;
1220
+ requestId: string;
1221
+ requestedBy: string;
1222
+ requestedVia: PauseVia;
1223
+ requestedAt: string;
1224
+ note: number | null;
1225
+ sentAt: string | null;
1226
+ pausedAt: string | null;
1227
+ resumedAt: string | null;
1228
+ endedAt: string | null;
1229
+ };
1230
+ /** Where a run's latest pause stands, and how long a paused build may wait before it ends (null: no idle limit). */
1231
+ export type LivePauseState = {
1232
+ state: "pausing" | "paused";
1233
+ pausedAt: string | null;
1234
+ limitMs: number | null;
1235
+ };
1236
+ export type ResumeRequestResult = {
1237
+ ok: true;
1238
+ resume: number;
1239
+ duplicate: boolean;
1240
+ } | {
1241
+ ok: false;
1242
+ reason: "invalid-request" | "duplicate" | "unknown-task" | "task-finished" | "stale" | "not-paused";
1243
+ detail: string;
1244
+ };
1245
+ export type PauseRequestResult = {
1246
+ ok: true;
1247
+ pause: number;
1248
+ note: number | null;
1249
+ duplicate: boolean;
1250
+ } | {
1251
+ ok: false;
1252
+ reason: "invalid-request" | "duplicate" | "unknown-task" | "task-finished" | "stale" | "invalid-note";
1253
+ detail: string;
1166
1254
  };
1167
1255
  /** One phone enrollment for web push (arc 3, v23). A row per ACTIVATION —
1168
1256
  * retirement is history, never deletion. */
@@ -4275,6 +4363,20 @@ export declare class Store {
4275
4363
  * legacy first-attempt behavior, unchanged byte-for-byte.
4276
4364
  */
4277
4365
  firstBuilderBase(taskRef: number, branch: string): string | null;
4366
+ /** Where a task branch's attempts start now: a builder branch's pinned base, or the newest base any other attempt on
4367
+ * it recorded (a planner never commits). Null before any attempt on the branch recorded one, or after a move to
4368
+ * current main until the next attempt records its base. */
4369
+ recordedBranchBase(taskRef: number, branch: string): string | null;
4370
+ /** Record a task branch's move to current main, before git moves it: a move that then fails leaves the next
4371
+ * attempt's own base (still the old one) as the branch's origin, which is exactly right. */
4372
+ recordBranchBaseMove(taskRef: number, branch: string, from: string, to: string, now: Date): void;
4373
+ /** The newest move of a task branch to current main, or null. */
4374
+ latestBranchBaseMove(taskRef: number, branch: string): {
4375
+ from: string;
4376
+ to: string;
4377
+ afterRun: number;
4378
+ movedAt: string;
4379
+ } | null;
4278
4380
  finishRun(id: number, result: {
4279
4381
  outcome: "built" | "failed" | "refused" | "parked" | "no-change" | "interrupted";
4280
4382
  reason?: string;
@@ -4666,6 +4768,9 @@ export declare class Store {
4666
4768
  reason: "unknown-task" | "task-finished" | "invalid-note";
4667
4769
  problem?: string;
4668
4770
  };
4771
+ /** One verified note, with the identity a running build's stdin copy is sent under: filing it is also what queues
4772
+ * its live delivery, in the same transaction (the builder's dispatcher sends whatever is filed and unsent). */
4773
+ private insertSteerNote;
4669
4774
  /** Every steering note of a task, filing order, delivery state included. */
4670
4775
  listSteerNotes(taskRef: number): SteerNote[];
4671
4776
  /** Undelivered, unsuperseded notes. */
@@ -4715,6 +4820,86 @@ export declare class Store {
4715
4820
  * task already ended, or mailed to another run since, is left alone.
4716
4821
  */
4717
4822
  ackSteerNote(noteId: number, runId: number, now: Date): boolean;
4823
+ /**
4824
+ * The task's build that takes live input right now (live steering): the steering build (steeringLiveBuild) whose
4825
+ * Claude session reads stdin. Only this run can take a note in seconds, or a Pause. Null otherwise.
4826
+ */
4827
+ liveInputRun(taskRef: number, now: Date): number | null;
4828
+ /** This run's Claude session reads stdin now (live steering), and how long a paused session may wait (null: no idle limit). */
4829
+ markLiveInputOpened(runId: number, now: Date, pauseLimitMs?: number | null): void;
4830
+ /** This run's stdin is closed (live steering): notes reach it only through its folder, and a Pause is over. */
4831
+ markLiveInputClosed(runId: number, now: Date): void;
4832
+ /** One steering note by id. */
4833
+ steerNote(noteId: number): SteerNote | null;
4834
+ /**
4835
+ * The note's copy was written to this run's stdin (live steering): one more send, stamped. Sending is not reading —
4836
+ * only the agent moving its file to handled/ is (ackSteerNote). Refused once the note is read, ended, given up on,
4837
+ * or mailed to another run.
4838
+ */
4839
+ recordLiveSend(noteId: number, runId: number, now: Date): boolean;
4840
+ /** The running build was sent this note every time it is owed and never moved it to handled/: Not picked up. A later
4841
+ * acknowledgement still reads it (ackSteerNote ignores this), and an attempt that ends returns it to the next brief. */
4842
+ markLiveMissed(noteId: number, runId: number, now: Date): boolean;
4843
+ /**
4844
+ * Pause a running Claude build, or Pause and steer it (live steering): asked of the exact run the person saw, under
4845
+ * their request id. In one transaction the note (when there is one) is filed — Ruling 11's verified author — and the
4846
+ * pause is queued ahead of it, so the dispatcher writes the interrupt before the note. A repeated request id is the
4847
+ * same request; a run that no longer takes live input is stale. Pause never stops, holds or reclaims the attempt.
4848
+ */
4849
+ requestPause(request: {
4850
+ taskId: string;
4851
+ runId: number;
4852
+ by: VerifiedAuthor;
4853
+ via: PauseVia;
4854
+ requestId: string;
4855
+ note?: string;
4856
+ }, now: Date): PauseRequestResult;
4857
+ /** The pauses this run has not yet written to stdin, in request order (the dispatcher writes these first). */
4858
+ unsentPauses(runId: number): RunPause[];
4859
+ /** The interrupt for this pause was written to the run's stdin. */
4860
+ markPauseSent(pauseId: number, now: Date): void;
4861
+ /** The run's current turn stopped: every pause sent and still waiting reads paused. */
4862
+ markRunPaused(runId: number, now: Date): void;
4863
+ /** A note continued the paused session: its pauses are over. */
4864
+ markRunResumed(runId: number, now: Date): void;
4865
+ /** The run could not take this pause (its stdin closed first). */
4866
+ endPause(pauseId: number, now: Date): void;
4867
+ /** Where this run's latest pause stands: asked and not yet stopped (pausing), stopped (paused), or none. */
4868
+ pauseStateOf(runId: number): "pausing" | "paused" | null;
4869
+ /** This run's latest pause, when it paused, and how long a paused build may wait before it ends; null with none. */
4870
+ livePauseOf(runId: number): LivePauseState | null;
4871
+ /**
4872
+ * Resume a paused Claude build (live steering): asked of the exact run the person saw, under their request id, and
4873
+ * only while that run is paused. The dispatcher sends a short continue frame — never a note, so nothing is filed.
4874
+ * A repeated request id is the same request; a run that no longer takes live input is stale.
4875
+ */
4876
+ requestResume(request: {
4877
+ taskId: string;
4878
+ runId: number;
4879
+ by: VerifiedAuthor;
4880
+ via: PauseVia;
4881
+ requestId: string;
4882
+ }, now: Date): ResumeRequestResult;
4883
+ /** The resumes this run has not yet sent, in request order. */
4884
+ unsentResumes(runId: number): {
4885
+ id: number;
4886
+ requestId: string;
4887
+ }[];
4888
+ /** The continue frame was written: the resume is sent, and the run's pauses are over. */
4889
+ markResumeSent(resumeId: number, runId: number, now: Date): void;
4890
+ /** The run was no longer paused (a note continued it first) or stopped taking input: nothing to send. */
4891
+ endResume(resumeId: number, now: Date): void;
4892
+ /** Every resume of a task, newest first (history and tests). */
4893
+ resumesForTask(taskRef: number): {
4894
+ id: number;
4895
+ run: number;
4896
+ requestId: string;
4897
+ requestedVia: PauseVia;
4898
+ sentAt: string | null;
4899
+ endedAt: string | null;
4900
+ }[];
4901
+ /** Every pause of a task, newest first (history and tests). */
4902
+ pausesForTask(taskRef: number): RunPause[];
4718
4903
  /** A finished task's pending notes settle superseded — shown, typed, done. */
4719
4904
  supersedeSteerNotes(taskRef: number, now: Date): number;
4720
4905
  /** The answers a run was given, exactly as it was given them. */
@@ -5846,7 +6031,15 @@ export declare class Store {
5846
6031
  leadStepsOf(leadTurn: number): ChatTurn[];
5847
6032
  /** Remember a project was opened. Upsert keeps added_at; recency always moves.
5848
6033
  * A project added for the first time starts on Quick checks. */
5849
- upsertProject(path: string, name: string, now: Date): void;
6034
+ upsertProject(path: string, name: string, now: Date, admission?: {
6035
+ remoteUrl: string | null;
6036
+ }): void;
6037
+ /** Includes removed/legacy projects, so deleting a row never makes build-writable config authoritative again. */
6038
+ projectAdmissionKnown(path: string): boolean;
6039
+ /** Full structured URL audit, without the generic ledger's display-text truncation. */
6040
+ recordProjectRemote(actor: string, repo: string, previous: string | null, remoteUrl: string, now: Date): void;
6041
+ /** The remote URL captured on admission or explicitly supplied by the owner; null when none was (or the project was removed). */
6042
+ projectRemote(path: string): string | null;
5850
6043
  /** A project removed from the lists (project-admission.ts): only its row goes; its tasks, results and settings stay. */
5851
6044
  forgetProject(path: string): void;
5852
6045
  /** Most recently opened first — the opener page's order. */
@@ -5855,6 +6048,7 @@ export declare class Store {
5855
6048
  name: string;
5856
6049
  addedAt: string;
5857
6050
  lastOpenedAt: string;
6051
+ remoteUrl: string | null;
5858
6052
  }[];
5859
6053
  /**
5860
6054
  * Tasks whose scope waits on a person's yes: proposed, not approved (or
@@ -6535,6 +6729,9 @@ export declare class Store {
6535
6729
  * mark. The outbox's delivered_at is deliberately not consulted.
6536
6730
  */
6537
6731
  seedPushPairs(now: Date): number;
6732
+ /** A pending pair about a run its person is watching waits for the watch to lapse; one about a finished run they have
6733
+ * since seen retires unsent (agent-board.ts watchedPing). False when the pair must not be sent now. */
6734
+ private settleWatchedPush;
6538
6735
  /**
6539
6736
  * Claim due pairs: pending (respecting next_attempt_at) or claimed-but-
6540
6737
  * expired (reclaim bumps the generation — the old owner loses every