@pentoshi/clai 3.8.49 → 3.8.51

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 (59) hide show
  1. package/dist/agent/responder-context.js +1 -1
  2. package/dist/agent/responder-context.js.map +1 -1
  3. package/dist/agent/runner.js +1 -1
  4. package/dist/agent/runner.js.map +1 -1
  5. package/dist/agent/tool-call-parser.js +2 -1
  6. package/dist/agent/tool-call-parser.js.map +1 -1
  7. package/dist/app/adapters/current-jobs-adapter.js +4 -0
  8. package/dist/app/adapters/current-jobs-adapter.js.map +1 -1
  9. package/dist/app/controllers/job-controller.d.ts +4 -0
  10. package/dist/app/controllers/job-controller.js +12 -0
  11. package/dist/app/controllers/job-controller.js.map +1 -1
  12. package/dist/app/controllers/plan-controller.d.ts +1 -0
  13. package/dist/app/controllers/plan-controller.js +15 -0
  14. package/dist/app/controllers/plan-controller.js.map +1 -1
  15. package/dist/app/controllers/session-controller.d.ts +2 -0
  16. package/dist/app/controllers/session-controller.js +32 -10
  17. package/dist/app/controllers/session-controller.js.map +1 -1
  18. package/dist/app/controllers/session-responder.d.ts +19 -23
  19. package/dist/app/controllers/session-responder.js +157 -262
  20. package/dist/app/controllers/session-responder.js.map +1 -1
  21. package/dist/app/ports/jobs-port.d.ts +4 -0
  22. package/dist/index.js +3 -3
  23. package/dist/index.js.map +1 -1
  24. package/dist/repl.js +14 -68
  25. package/dist/repl.js.map +1 -1
  26. package/dist/store/history-index.d.ts +43 -0
  27. package/dist/store/history-index.js +197 -0
  28. package/dist/store/history-index.js.map +1 -0
  29. package/dist/store/history.d.ts +6 -5
  30. package/dist/store/history.js +246 -205
  31. package/dist/store/history.js.map +1 -1
  32. package/dist/store/plan.d.ts +1 -1
  33. package/dist/store/plan.js +17 -8
  34. package/dist/store/plan.js.map +1 -1
  35. package/dist/store/responder-settlement.d.ts +3 -0
  36. package/dist/store/responder-settlement.js +60 -0
  37. package/dist/store/responder-settlement.js.map +1 -0
  38. package/dist/tools/definitions.js +16 -20
  39. package/dist/tools/definitions.js.map +1 -1
  40. package/dist/tools/jobs.d.ts +25 -6
  41. package/dist/tools/jobs.js +251 -51
  42. package/dist/tools/jobs.js.map +1 -1
  43. package/dist/tools/registry.js +18 -23
  44. package/dist/tools/registry.js.map +1 -1
  45. package/dist/tui-v2/app/commands/picker-commands.js +9 -10
  46. package/dist/tui-v2/app/commands/picker-commands.js.map +1 -1
  47. package/dist/tui-v2/bootstrap/composition-root.js +9 -0
  48. package/dist/tui-v2/bootstrap/composition-root.js.map +1 -1
  49. package/dist/tui-v2/components/jobs/jobs-panel.js +49 -26
  50. package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -1
  51. package/dist/tui-v2/components/status/status-line.d.ts +2 -0
  52. package/dist/tui-v2/components/status/status-line.js +23 -2
  53. package/dist/tui-v2/components/status/status-line.js.map +1 -1
  54. package/dist/tui-v2/state/transcript-hydrate.d.ts +8 -2
  55. package/dist/tui-v2/state/transcript-hydrate.js +99 -9
  56. package/dist/tui-v2/state/transcript-hydrate.js.map +1 -1
  57. package/dist/version.generated.d.ts +2 -2
  58. package/dist/version.generated.js +2 -2
  59. package/package.json +1 -1
@@ -1,15 +1,20 @@
1
- import { type AnyAppEvent } from "../events/app-event.js";
2
- import type { EventSequencer } from "../events/sequencer.js";
3
1
  import type { JobManagerChange, JobsPort } from "../ports/jobs-port.js";
4
2
  import type { PersistencePort } from "../ports/persistence-port.js";
5
3
  interface ResponderTurnResult {
6
4
  readonly status: "completed" | "aborted" | "error";
7
5
  }
6
+ export type ResponderListeningMode = "off" | "idle" | "listening";
7
+ export interface ResponderRuntimeState {
8
+ readonly mode: ResponderListeningMode;
9
+ readonly running: number;
10
+ readonly ready: number;
11
+ readonly delivered: number;
12
+ readonly archived: number;
13
+ readonly failed: number;
14
+ }
8
15
  interface SessionResponderDeps {
9
16
  readonly jobs: JobsPort;
10
17
  readonly persistence: PersistencePort;
11
- readonly sequencer: EventSequencer;
12
- readonly emit: (event: AnyAppEvent) => void;
13
18
  readonly sessionId: () => string;
14
19
  readonly isBusy: () => boolean;
15
20
  readonly hasQueuedWork: () => boolean;
@@ -20,30 +25,21 @@ interface SessionResponderDeps {
20
25
  }
21
26
  export declare class SessionResponder {
22
27
  private readonly deps;
28
+ private leaseId;
23
29
  private generation;
24
30
  private wakeRequested;
25
31
  private wakeDrain;
26
- private retryTimer;
27
- private readonly analysisCompleted;
28
- private readonly deliveryFailures;
29
- private readonly settlementFailures;
30
- private static readonly RETRY_MS;
31
- private static readonly MAX_DELIVERY_ATTEMPTS;
32
- private static readonly MAX_SETTLEMENT_ATTEMPTS;
33
32
  constructor(deps: SessionResponderDeps);
34
- handleChange(change: JobManagerChange): void;
35
- rebind(): void;
33
+ activate(): void;
34
+ deactivate(): void;
36
35
  invalidateWake(): void;
36
+ rebind(): void;
37
+ handleChange(change: JobManagerChange): void;
38
+ getState(): ResponderRuntimeState;
37
39
  scheduleWake(): void;
38
- private drainWakes;
39
- private taskSettlement;
40
- private syncTask;
41
- private syncTasks;
42
- private pending;
43
- private actionable;
44
- private settleAnalyzed;
45
- private runWake;
46
- private armRetry;
47
- private clearRetry;
40
+ private drainOne;
41
+ private hasDeliverable;
42
+ private preview;
43
+ private foregroundTask;
48
44
  }
49
45
  export {};
@@ -1,311 +1,206 @@
1
- import { isPlanSuccessful, isPlanTerminal } from "../../store/plan.js";
2
- import { asPlanId } from "../events/app-event.js";
1
+ const PREVIEW_BYTES = 4 * 1024;
2
+ const PREVIEW_LINES = 20;
3
3
  export class SessionResponder {
4
4
  deps;
5
+ leaseId;
5
6
  generation = 0;
6
7
  wakeRequested = false;
7
8
  wakeDrain;
8
- retryTimer;
9
- analysisCompleted = new Set();
10
- deliveryFailures = new Map();
11
- settlementFailures = new Map();
12
- static RETRY_MS = 750;
13
- static MAX_DELIVERY_ATTEMPTS = 3;
14
- static MAX_SETTLEMENT_ATTEMPTS = 8;
15
9
  constructor(deps) {
16
10
  this.deps = deps;
17
11
  }
18
- handleChange(change) {
12
+ activate() {
13
+ if (this.leaseId)
14
+ return;
15
+ this.leaseId = this.deps.jobs.activateResponderLease(this.deps.sessionId());
19
16
  this.deps.notifyState();
20
- if (change.type === "notification")
21
- this.scheduleWake();
22
- }
23
- rebind() {
24
- this.invalidateWake();
25
17
  this.scheduleWake();
26
18
  }
27
- invalidateWake() {
19
+ deactivate() {
20
+ const leaseId = this.leaseId;
21
+ this.leaseId = undefined;
28
22
  this.generation += 1;
29
23
  this.wakeRequested = false;
30
- this.analysisCompleted.clear();
31
- this.deliveryFailures.clear();
32
- this.settlementFailures.clear();
33
- this.clearRetry();
24
+ if (leaseId) {
25
+ this.deps.jobs.releaseResponderLease(this.deps.sessionId(), leaseId);
26
+ }
27
+ this.deps.notifyState();
28
+ }
29
+ invalidateWake() {
30
+ this.deactivate();
31
+ }
32
+ rebind() {
33
+ this.deactivate();
34
+ }
35
+ handleChange(change) {
36
+ this.deps.notifyState();
37
+ if (change.type === "notification")
38
+ this.scheduleWake();
39
+ }
40
+ getState() {
41
+ const sessionId = this.deps.sessionId();
42
+ const notifications = this.deps.jobs
43
+ .pendingNotifications(sessionId)
44
+ .filter((notification) => notification.responder);
45
+ const live = this.deps.jobs
46
+ .running(sessionId)
47
+ .filter((job) => job.responder);
48
+ const active = this.leaseId;
49
+ const current = notifications.filter((notification) => Boolean(active) &&
50
+ notification.responderLeaseId === active &&
51
+ !notification.archivedAt);
52
+ const ready = current.filter((notification) => !notification.deliveredAt && !notification.analyzedAt).length;
53
+ const delivered = current.filter((notification) => notification.deliveredAt && !notification.analyzedAt).length;
54
+ const archived = notifications.filter((notification) => Boolean(notification.archivedAt)).length;
55
+ const running = live.length;
56
+ const failed = notifications.filter((notification) => notification.status !== "exited").length;
57
+ return {
58
+ mode: !active
59
+ ? "off"
60
+ : running > 0 || ready > 0 || delivered > 0
61
+ ? "listening"
62
+ : "idle",
63
+ running,
64
+ ready,
65
+ delivered,
66
+ archived,
67
+ failed,
68
+ };
34
69
  }
35
70
  scheduleWake() {
71
+ if (!this.leaseId)
72
+ return;
36
73
  this.wakeRequested = true;
37
- if (this.wakeDrain)
74
+ if (this.deps.isBusy() || this.wakeDrain)
38
75
  return;
39
76
  const generation = this.generation;
40
77
  let drain;
41
78
  drain = Promise.resolve()
42
- .then(() => this.drainWakes(generation))
43
- .catch(() => {
44
- this.wakeRequested = false;
45
- this.armRetry();
46
- })
79
+ .then(() => this.drainOne(generation))
47
80
  .finally(() => {
48
81
  if (this.wakeDrain !== drain)
49
82
  return;
50
83
  this.wakeDrain = undefined;
51
- if (this.wakeRequested)
52
- this.scheduleWake();
84
+ if (this.wakeRequested &&
85
+ generation === this.generation &&
86
+ !this.deps.isBusy()) {
87
+ queueMicrotask(() => this.scheduleWake());
88
+ }
53
89
  });
54
90
  this.wakeDrain = drain;
55
91
  }
56
- async drainWakes(generation) {
57
- while (generation === this.generation && this.wakeRequested) {
92
+ async drainOne(generation) {
93
+ if (generation !== this.generation || !this.leaseId)
94
+ return;
95
+ if (this.deps.isBusy())
96
+ return;
97
+ if (this.deps.hasQueuedWork()) {
58
98
  this.wakeRequested = false;
59
- if (await this.runWake(generation)) {
60
- this.wakeRequested = false;
61
- return;
62
- }
99
+ await this.deps.continueQueue();
100
+ return;
63
101
  }
64
- }
65
- taskSettlement(notification) {
66
- const job = this.deps.jobs.get(notification.jobId);
67
- const authoritativeJob = job && ["exited", "failed", "killed", "lost"].includes(job.status)
68
- ? job
69
- : undefined;
70
- const status = authoritativeJob?.status ?? notification.status;
71
- const exitCode = authoritativeJob?.exitCode ?? notification.exitCode;
72
- const signal = authoritativeJob?.signal ?? notification.signal;
73
- const artifact = authoritativeJob
74
- ? authoritativeJob.artifacts.stdout.chunks.at(-1) ??
75
- authoritativeJob.stdoutArtifact
76
- : notification.stdoutArtifact.chunks.at(-1) ??
77
- notification.stdoutArtifact.path;
78
- const state = status === "exited" && exitCode === 0 ? "done" : "failed";
79
- return {
80
- state,
81
- note: `job=${notification.jobId} status=${status} ` +
82
- `exit=${exitCode ?? "?"}` +
83
- `${signal ? ` signal=${signal}` : ""} ` +
84
- `artifact=${artifact}`,
85
- fingerprint: `${status}\0${exitCode ?? "?"}\0${signal ?? ""}\0${artifact}`,
86
- };
87
- }
88
- async syncTask(notification) {
89
- if (notification.ownerSessionId !== this.deps.sessionId())
90
- return true;
91
- let plan;
102
+ this.wakeRequested = false;
103
+ const sessionId = this.deps.sessionId();
104
+ const leaseId = this.leaseId;
105
+ const notification = this.deps.jobs.claimNextResponderNotification(sessionId, leaseId);
106
+ if (!notification) {
107
+ this.deps.notifyState();
108
+ return;
109
+ }
110
+ this.deps.notifyState();
111
+ const preview = await this.preview(notification);
112
+ const foreground = await this.foregroundTask(sessionId);
113
+ this.deps.notifyDelivery?.(summarizeDelivery(notification));
114
+ let result;
92
115
  try {
93
- plan = await this.deps.persistence.loadPlan(notification.ownerSessionId);
116
+ result = await this.deps.runTurn(deliveryPrompt(notification, preview, foreground));
94
117
  }
95
118
  catch {
96
- return false;
97
- }
98
- if (!plan || this.deps.sessionId() !== notification.ownerSessionId)
99
- return true;
100
- const task = plan.tasks.find((candidate) => candidate.responderOwned && candidate.jobId === notification.jobId);
101
- if (!task)
102
- return true;
103
- const job = this.deps.jobs.get(notification.jobId);
104
- if (job &&
105
- (job.taskId !== task.id ||
106
- (task.parentTaskId !== undefined &&
107
- job.parentTaskId !== task.parentTaskId))) {
108
- const linked = this.deps.jobs.linkJob(notification.jobId, {
109
- taskId: task.id,
110
- ...(task.parentTaskId ? { parentTaskId: task.parentTaskId } : {}),
111
- responder: true,
112
- wakeOnCompletion: true,
113
- });
114
- if (!linked)
115
- return false;
119
+ result = { status: "error" };
116
120
  }
117
- const settlement = this.taskSettlement(notification);
118
- if (task.state === settlement.state && task.note === settlement.note) {
119
- return this.taskSettlement(notification).fingerprint === settlement.fingerprint;
121
+ if (result.status !== "completed" ||
122
+ generation !== this.generation ||
123
+ leaseId !== this.leaseId ||
124
+ sessionId !== this.deps.sessionId()) {
125
+ this.wakeRequested = false;
126
+ this.deps.notifyState();
127
+ return;
120
128
  }
121
- task.state = settlement.state;
122
- task.note = settlement.note;
123
- plan.version = (plan.version ?? 1) + 1;
124
- plan.updatedAt = new Date().toISOString();
125
- if (isPlanTerminal(plan)) {
126
- plan.status = isPlanSuccessful(plan) ? "completed" : "abandoned";
129
+ if (this.deps.jobs.markAnalyzed(notification.id)) {
130
+ this.deps.jobs.acknowledge(notification.id);
127
131
  }
128
- else if (plan.status !== "draft") {
129
- plan.status = "in_progress";
132
+ this.deps.notifyState();
133
+ if (this.hasDeliverable(sessionId, leaseId)) {
134
+ this.wakeRequested = true;
130
135
  }
136
+ }
137
+ hasDeliverable(sessionId, leaseId) {
138
+ return this.deps.jobs.pendingNotifications(sessionId).some((notification) => notification.responder &&
139
+ notification.responderLeaseId === leaseId &&
140
+ !notification.archivedAt &&
141
+ !notification.analyzedAt);
142
+ }
143
+ async preview(notification) {
131
144
  try {
132
- await this.deps.persistence.savePlan(plan);
145
+ const tailed = await this.deps.jobs.tail(notification.jobId, PREVIEW_BYTES);
146
+ return boundedPreview(tailed.output);
133
147
  }
134
148
  catch {
135
- return false;
136
- }
137
- if (this.taskSettlement(notification).fingerprint !== settlement.fingerprint) {
138
- return false;
139
- }
140
- if (this.deps.sessionId() !== notification.ownerSessionId)
141
- return true;
142
- this.deps.emit(this.deps.sequencer.build("plan-updated", { planId: asPlanId(plan.sessionId), plan }, undefined));
143
- return true;
144
- }
145
- async syncTasks(notifications, attempts) {
146
- const synced = new Set();
147
- let remaining = [...notifications];
148
- for (let attempt = 0; attempt < attempts && remaining.length > 0; attempt += 1) {
149
- const failed = [];
150
- for (const notification of remaining) {
151
- if (await this.syncTask(notification))
152
- synced.add(notification.id);
153
- else
154
- failed.push(notification);
155
- }
156
- remaining = failed;
157
- if (remaining.length > 0 && attempt + 1 < attempts) {
158
- await new Promise((resolve) => setTimeout(resolve, 25 * (attempt + 1)));
159
- }
149
+ return "[preview unavailable; use the durable artifact path if analysis needs more]";
160
150
  }
161
- return synced;
162
151
  }
163
- pending(sessionId) {
164
- return this.deps.jobs
165
- .pendingNotifications(sessionId)
166
- .filter((notification) => notification.wakeOnCompletion);
167
- }
168
- actionable(sessionId) {
169
- return this.pending(sessionId).filter((notification) => !notification.analyzedAt &&
170
- !this.analysisCompleted.has(notification.id) &&
171
- (this.deliveryFailures.get(notification.id) ?? 0) <
172
- SessionResponder.MAX_DELIVERY_ATTEMPTS);
173
- }
174
- async settleAnalyzed(sessionId) {
175
- const analyzed = this.pending(sessionId).filter((notification) => Boolean(notification.analyzedAt) ||
176
- this.analysisCompleted.has(notification.id));
177
- if (analyzed.length === 0)
178
- return false;
179
- const durable = analyzed.filter((notification) => Boolean(notification.analyzedAt) ||
180
- this.deps.jobs.markAnalyzed(notification.id));
181
- const synced = await this.syncTasks(durable, 3);
182
- let retry = false;
183
- for (const notification of analyzed) {
184
- let settled = false;
185
- if (synced.has(notification.id)) {
186
- settled = this.deps.jobs.acknowledge(notification.id);
187
- }
188
- if (settled) {
189
- this.analysisCompleted.delete(notification.id);
190
- this.deliveryFailures.delete(notification.id);
191
- this.settlementFailures.delete(notification.id);
192
- continue;
193
- }
194
- const failures = (this.settlementFailures.get(notification.id) ?? 0) + 1;
195
- this.settlementFailures.set(notification.id, failures);
196
- if (failures < SessionResponder.MAX_SETTLEMENT_ATTEMPTS)
197
- retry = true;
198
- }
199
- return retry;
200
- }
201
- async runWake(generation) {
202
- if (generation !== this.generation)
203
- return false;
204
- const sessionId = this.deps.sessionId();
205
- if (await this.settleAnalyzed(sessionId)) {
206
- this.armRetry();
207
- return true;
208
- }
209
- if (generation !== this.generation || sessionId !== this.deps.sessionId()) {
210
- return false;
211
- }
212
- const actionable = this.actionable(sessionId);
213
- if (actionable.length === 0) {
214
- this.clearRetry();
215
- return false;
216
- }
217
- if (this.deps.isBusy()) {
218
- this.armRetry();
219
- return true;
220
- }
221
- if (this.deps.hasQueuedWork()) {
222
- this.clearRetry();
223
- await this.deps.continueQueue();
224
- if (generation === this.generation && sessionId === this.deps.sessionId()) {
225
- this.wakeRequested = true;
226
- }
227
- return false;
228
- }
229
- await this.syncTasks(actionable, 1);
230
- if (generation !== this.generation ||
231
- sessionId !== this.deps.sessionId() ||
232
- this.deps.isBusy()) {
233
- this.armRetry();
234
- return true;
235
- }
236
- const current = new Map(this.actionable(sessionId).map((notification) => [notification.id, notification]));
237
- const delivered = actionable
238
- .map((notification) => current.get(notification.id))
239
- .filter((notification) => Boolean(notification))
240
- .filter((notification) => this.deps.jobs.markDelivered(notification.id));
241
- if (delivered.length === 0) {
242
- this.armRetry();
243
- return true;
244
- }
245
- this.clearRetry();
246
- this.deps.notifyDelivery?.(summarizeDelivery(delivered));
247
- const ids = delivered.map((notification) => notification.id).join(", ");
248
- let result;
152
+ async foregroundTask(sessionId) {
249
153
  try {
250
- result = await this.deps.runTurn(`Responder completion ready (${ids}). Analyze the durable job artifacts now. ` +
251
- "Do not rerun completed work. Add evidence-driven follow-up tasks only when the result requires them. " +
252
- "Responder task settlement is automatic from the authoritative job result: if the artifacts are satisfactory, report the findings and continue or stop; do not call task.update for the Responder-owned task.");
154
+ const plan = await this.deps.persistence.loadPlan(sessionId);
155
+ const task = plan?.tasks.find((candidate) => !candidate.responderOwned && candidate.state === "in_progress");
156
+ return task ? `[${task.id}] ${task.title}` : undefined;
253
157
  }
254
158
  catch {
255
- result = { status: "error" };
256
- }
257
- if (result.status !== "completed") {
258
- let retry = false;
259
- for (const notification of delivered) {
260
- const failures = (this.deliveryFailures.get(notification.id) ?? 0) + 1;
261
- this.deliveryFailures.set(notification.id, failures);
262
- if (failures < SessionResponder.MAX_DELIVERY_ATTEMPTS)
263
- retry = true;
264
- }
265
- if (retry)
266
- this.armRetry();
267
- return retry;
159
+ return undefined;
268
160
  }
269
- if (generation !== this.generation || sessionId !== this.deps.sessionId()) {
270
- return false;
271
- }
272
- for (const notification of delivered) {
273
- this.analysisCompleted.add(notification.id);
274
- this.deps.jobs.markAnalyzed(notification.id);
275
- }
276
- if (await this.settleAnalyzed(sessionId)) {
277
- this.armRetry();
278
- return true;
279
- }
280
- return false;
281
- }
282
- armRetry() {
283
- if (this.retryTimer)
284
- return;
285
- const timer = setTimeout(() => {
286
- this.retryTimer = undefined;
287
- this.scheduleWake();
288
- }, SessionResponder.RETRY_MS);
289
- timer.unref?.();
290
- this.retryTimer = timer;
291
- }
292
- clearRetry() {
293
- if (!this.retryTimer)
294
- return;
295
- clearTimeout(this.retryTimer);
296
- this.retryTimer = undefined;
297
161
  }
298
162
  }
299
- function summarizeDelivery(notifications) {
300
- if (notifications.length === 1) {
301
- const only = notifications[0];
302
- const label = (only.commandDisplay || only.jobId)
303
- .replace(/\s+/g, " ")
304
- .trim();
305
- const short = label.length > 64 ? `${label.slice(0, 63)}…` : label;
306
- const outcome = only.status === "exited" ? "result" : `${only.status} result`;
307
- return `Responder → model · ${short} ${outcome}`;
308
- }
309
- return `Responder → model · ${notifications.length} job results delivered`;
163
+ function boundedPreview(value) {
164
+ let text = value.replace(/\uFFFD/g, "").replace(/\r/g, "").split("\n").slice(0, PREVIEW_LINES).join("\n");
165
+ const bytes = Buffer.from(text, "utf8");
166
+ if (bytes.length <= PREVIEW_BYTES)
167
+ return text;
168
+ text = bytes
169
+ .subarray(0, PREVIEW_BYTES)
170
+ .toString("utf8")
171
+ .replace(/\uFFFD/g, "");
172
+ return `${text}\n[preview truncated]`;
173
+ }
174
+ function deliveryPrompt(notification, preview, foreground) {
175
+ const artifact = notification.stdoutArtifact.chunks.at(-1) ??
176
+ notification.stdoutArtifact.path;
177
+ const resume = foreground
178
+ ? `After handling this result, resume exactly the interrupted foreground task ${foreground}. Do not repeat its completed work.`
179
+ : "After handling this result, continue the next foreground task normally.";
180
+ return [
181
+ "Responder result arrived while the model was idle.",
182
+ `notification=${notification.id}`,
183
+ `job=${notification.jobId}`,
184
+ `status=${notification.status}`,
185
+ `durationMs=${Math.max(0, Date.parse(notification.endedAt) - Date.parse(notification.startedAt))}`,
186
+ `stdoutBytes=${notification.stdoutArtifact.bytes}`,
187
+ `stderrBytes=${notification.stderrArtifact.bytes}`,
188
+ `artifact=${artifact}`,
189
+ "Preview (maximum 20 lines / 4 KiB):",
190
+ preview,
191
+ "Review this compact result. If it reveals useful new surface, gather only the necessary evidence and append evidence-driven follow-up tasks when needed.",
192
+ "Do not rerun the completed responder command, poll it, or update its responder-owned task; settlement follows the authoritative process result independently.",
193
+ resume,
194
+ ].join("\n");
195
+ }
196
+ function summarizeDelivery(notification) {
197
+ const label = (notification.commandDisplay || notification.jobId)
198
+ .replace(/\s+/g, " ")
199
+ .trim();
200
+ const short = label.length > 64 ? `${label.slice(0, 63)}…` : label;
201
+ const outcome = notification.status === "exited"
202
+ ? "result"
203
+ : `${notification.status} result`;
204
+ return `Responder → model · ${short} ${outcome}`;
310
205
  }
311
206
  //# sourceMappingURL=session-responder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-responder.js","sourceRoot":"","sources":["../../../src/app/controllers/session-responder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-responder.js","sourceRoot":"","sources":["../../../src/app/controllers/session-responder.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,10 @@ export interface JobsPort {
10
10
  stop(id: string): Promise<ToolResult>;
11
11
  start(command: string, options?: StartJobOptions): Promise<ToolResult>;
12
12
  pendingNotifications(sessionId?: string): ResponderNotification[];
13
+ activateResponderLease(sessionId: string): string;
14
+ getResponderLeaseId(sessionId: string): string | undefined;
15
+ releaseResponderLease(sessionId: string, leaseId?: string): void;
16
+ claimNextResponderNotification(sessionId: string, leaseId: string): ResponderNotification | undefined;
13
17
  markDelivered(notificationId: string): boolean;
14
18
  markAnalyzed(notificationId: string): boolean;
15
19
  acknowledge(notificationId: string): boolean;
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ import { runDoctor } from "./commands/doctor.js";
11
11
  import { runUpdate, getCurrentVersion, } from "./commands/update.js";
12
12
  import { getConfig, getConfigPath, getProviderModel, setDefaultMode, setProviderModel, updateConfig, } from "./store/config.js";
13
13
  import { assertProvider } from "./llm/provider.js";
14
- import { listSessions, saveSession, getSession } from "./store/history.js";
14
+ import { listSessionSummaries, saveSession, getSession } from "./store/history.js";
15
15
  import { clearThinking, } from "./ui/thinking.js";
16
16
  import { canUseTui } from "./tui/can-use-tui.js";
17
17
  import { isBunRuntime, isOpenTuiFfiError, openTuiRuntimeHint, reexecWithBunIfNeeded, } from "./tui/runtime.js";
@@ -282,9 +282,9 @@ async function main() {
282
282
  console.log(JSON.stringify(session, null, 2));
283
283
  return;
284
284
  }
285
- const sessions = await listSessions();
285
+ const sessions = await listSessionSummaries();
286
286
  for (const session of sessions) {
287
- console.log(`${session.updatedAt} ${session.name ?? session.id} (${session.messages.length} messages) ${session.cwd}`);
287
+ console.log(`${session.updatedAt} ${session.name ?? session.id} (${session.messageCount} messages) ${session.cwd}`);
288
288
  }
289
289
  });
290
290
  program