@cat-factory/local-server 0.153.2 → 0.154.0

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.
@@ -1,4 +1,4 @@
1
- import type { GuidedReviewJob, GuidedReviewRunner, Logger } from '@cat-factory/kernel';
1
+ import type { GuidedReviewJob, GuidedReviewJobProgress, GuidedReviewRunner, Logger } from '@cat-factory/kernel';
2
2
  import type { SqliteGuidedReviewQueue } from './sqlite/guidedReviewQueue.js';
3
3
  export interface SqliteGuidedReviewRunnerOptions {
4
4
  /** How long a claim holds before a later drain may take the job over (a crash). */
@@ -12,7 +12,7 @@ export interface SqliteGuidedReviewRunnerOptions {
12
12
  }
13
13
  /** The slice of `GuidedReviewService` the runner drives. */
14
14
  export interface GuidedReviewJobDriver {
15
- runJob(workspaceId: string, job: GuidedReviewJob): Promise<void>;
15
+ runJob(workspaceId: string, job: GuidedReviewJob): Promise<GuidedReviewJobProgress>;
16
16
  abandonJob(workspaceId: string, job: GuidedReviewJob, detail: string): Promise<void>;
17
17
  }
18
18
  /**
@@ -28,6 +28,7 @@ export declare class SqliteGuidedReviewRunner implements GuidedReviewRunner {
28
28
  private driver?;
29
29
  private readonly running;
30
30
  private sweepTimer?;
31
+ private wakeTimer?;
31
32
  private stopped;
32
33
  constructor(queue: SqliteGuidedReviewQueue, opts: SqliteGuidedReviewRunnerOptions, log: Logger, now?: () => number);
33
34
  /** Bind the service once the container exists, recover orphans and start the periodic drain. */
@@ -36,6 +37,12 @@ export declare class SqliteGuidedReviewRunner implements GuidedReviewRunner {
36
37
  start(workspaceId: string, job: GuidedReviewJob): Promise<void>;
37
38
  private drain;
38
39
  private drive;
40
+ /**
41
+ * Wake again when the earliest held job comes due. Computed from the queue rather than set per
42
+ * re-queue, because a timer runs on a monotonic clock while due times are wall-clock, so a timer
43
+ * for exactly the delay can fire a millisecond early and leave the job waiting for the sweep.
44
+ */
45
+ private wakeAtNextDue;
39
46
  /**
40
47
  * Settle a given-up job's row as failed, or the mothership keeps it live and its thread reads as
41
48
  * busy forever. The queue row goes only once that lands: the mothership being unreachable is the
@@ -1 +1 @@
1
- {"version":3,"file":"guidedReviewRunner.d.ts","sourceRoot":"","sources":["../src/guidedReviewRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEtF,OAAO,KAAK,EAA0B,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AAEpG,MAAM,WAAW,+BAA+B;IAC9C,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAA;IACf,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,sFAAsF;IACtF,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,4DAA4D;AAC5D,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChE,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrF;AAED;;;;GAIG;AACH,qBAAa,wBAAyB,YAAW,kBAAkB;IAO/D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IATtB,OAAO,CAAC,MAAM,CAAC,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,UAAU,CAAC,CAAgC;IACnD,OAAO,CAAC,OAAO,CAAQ;IAEvB,YACmB,KAAK,EAAE,uBAAuB,EAC9B,IAAI,EAAE,+BAA+B,EACrC,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAM,MAAiB,EAC3C;IAEJ,gGAAgG;IAChG,IAAI,CAAC,MAAM,EAAE,qBAAqB,GAAG,SAAS,GAAG,IAAI,CAWpD;IAED,IAAI,IAAI,IAAI,CAIX;IAEK,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpE;IAED,OAAO,CAAC,KAAK;YAwBC,KAAK;IAoBnB;;;;OAIG;YACW,OAAO;CAkBtB"}
1
+ {"version":3,"file":"guidedReviewRunner.d.ts","sourceRoot":"","sources":["../src/guidedReviewRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAClB,MAAM,EACP,MAAM,qBAAqB,CAAA;AAE5B,OAAO,KAAK,EAA0B,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AAEpG,MAAM,WAAW,+BAA+B;IAC9C,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAA;IACf,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,sFAAsF;IACtF,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,4DAA4D;AAC5D,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;IACnF,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrF;AAED;;;;GAIG;AACH,qBAAa,wBAAyB,YAAW,kBAAkB;IAQ/D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAVtB,OAAO,CAAC,MAAM,CAAC,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,UAAU,CAAC,CAAgC;IACnD,OAAO,CAAC,SAAS,CAAC,CAA+B;IACjD,OAAO,CAAC,OAAO,CAAQ;IAEvB,YACmB,KAAK,EAAE,uBAAuB,EAC9B,IAAI,EAAE,+BAA+B,EACrC,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAM,MAAiB,EAC3C;IAEJ,gGAAgG;IAChG,IAAI,CAAC,MAAM,EAAE,qBAAqB,GAAG,SAAS,GAAG,IAAI,CAWpD;IAED,IAAI,IAAI,IAAI,CAKX;IAEK,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpE;IAED,OAAO,CAAC,KAAK;YA2BC,KAAK;IAyBnB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAQrB;;;;OAIG;YACW,OAAO;CAkBtB"}
@@ -12,6 +12,7 @@ export class SqliteGuidedReviewRunner {
12
12
  driver;
13
13
  running = new Set();
14
14
  sweepTimer;
15
+ wakeTimer;
15
16
  stopped = false;
16
17
  constructor(queue, opts, log, now = Date.now) {
17
18
  this.queue = queue;
@@ -36,6 +37,8 @@ export class SqliteGuidedReviewRunner {
36
37
  }
37
38
  stop() {
38
39
  this.stopped = true;
40
+ if (this.wakeTimer)
41
+ clearTimeout(this.wakeTimer);
39
42
  if (this.sweepTimer)
40
43
  clearInterval(this.sweepTimer);
41
44
  this.sweepTimer = undefined;
@@ -59,16 +62,24 @@ export class SqliteGuidedReviewRunner {
59
62
  }
60
63
  while (this.running.size < this.opts.concurrency) {
61
64
  const claimed = this.queue.claim(this.now(), this.opts.leaseMs, this.running);
62
- if (!claimed)
65
+ if (!claimed) {
66
+ this.wakeAtNextDue();
63
67
  return;
68
+ }
64
69
  this.running.add(claimed.key);
65
70
  void this.drive(driver, claimed);
66
71
  }
67
72
  }
68
73
  async drive(driver, claimed) {
69
74
  try {
70
- await driver.runJob(claimed.workspaceId, claimed.job);
71
- this.queue.complete(claimed.key);
75
+ const progress = await driver.runJob(claimed.workspaceId, claimed.job);
76
+ if (progress.done) {
77
+ this.queue.complete(claimed.key);
78
+ }
79
+ else {
80
+ // A deep answer still working: re-queue it for its next poll rather than holding a slot.
81
+ this.queue.reschedule(claimed.key, this.now() + progress.pollAfterMs);
82
+ }
72
83
  }
73
84
  catch (error) {
74
85
  this.log.warn('guided-review job failed; retrying after backoff', {
@@ -83,6 +94,20 @@ export class SqliteGuidedReviewRunner {
83
94
  this.drain();
84
95
  }
85
96
  }
97
+ /**
98
+ * Wake again when the earliest held job comes due. Computed from the queue rather than set per
99
+ * re-queue, because a timer runs on a monotonic clock while due times are wall-clock, so a timer
100
+ * for exactly the delay can fire a millisecond early and leave the job waiting for the sweep.
101
+ */
102
+ wakeAtNextDue() {
103
+ const due = this.queue.nextDueAt();
104
+ if (due === null)
105
+ return;
106
+ if (this.wakeTimer)
107
+ clearTimeout(this.wakeTimer);
108
+ this.wakeTimer = setTimeout(() => this.drain(), Math.max(1, due - this.now() + 1));
109
+ this.wakeTimer.unref?.();
110
+ }
86
111
  /**
87
112
  * Settle a given-up job's row as failed, or the mothership keeps it live and its thread reads as
88
113
  * busy forever. The queue row goes only once that lands: the mothership being unreachable is the
@@ -1 +1 @@
1
- {"version":3,"file":"guidedReviewRunner.js","sourceRoot":"","sources":["../src/guidedReviewRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guidedReviewRunner.js","sourceRoot":"","sources":["../src/guidedReviewRunner.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,10 @@ export declare class SqliteGuidedReviewQueue {
22
22
  /** The drive finished: the job is settled on the mothership, so the intent is spent. */
23
23
  complete(key: string): void;
24
24
  /** The drive threw: hold the job off the queue until `notBefore` and count the failure. */
25
+ /** When the earliest held job becomes claimable, or null when none is waiting. */
26
+ nextDueAt(): number | null;
27
+ /** Hold a job that made progress until `notBefore`, clearing its failure count. */
28
+ reschedule(key: string, notBefore: number): void;
25
29
  deferFailure(key: string, notBefore: number): void;
26
30
  /**
27
31
  * Take the drivable jobs that failed `maxAttempts` times in a row off the drive path until
@@ -1 +1 @@
1
- {"version":3,"file":"guidedReviewQueue.d.ts","sourceRoot":"","sources":["../../src/sqlite/guidedReviewQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAuB9E,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,eAAe,CAAA;IACpB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAA;CACjB;AAkBD,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,EAAE;IAA/B,YAA6B,EAAE,EAAE,YAAY,EAAI;IAEjD,2EAA2E;IAC3E,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAQpE;IAED,sFAAsF;IACtF,YAAY,IAAI,MAAM,CAOrB;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,sBAAsB,GAAG,IAAI,CAc/F;IAED,wFAAwF;IACxF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE1B;IAED,2FAA2F;IAC3F,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAOjD;IAED;;;;OAIG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAgB3F;IAED,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CASxC;IAED,KAAK,IAAI,IAAI,CAEZ;CACF;AAED,kGAAkG;AAClG,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAE7E"}
1
+ {"version":3,"file":"guidedReviewQueue.d.ts","sourceRoot":"","sources":["../../src/sqlite/guidedReviewQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAuB9E,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,eAAe,CAAA;IACpB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAA;CACjB;AAkBD,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,EAAE;IAA/B,YAA6B,EAAE,EAAE,YAAY,EAAI;IAEjD,2EAA2E;IAC3E,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAQpE;IAED,sFAAsF;IACtF,YAAY,IAAI,MAAM,CAOrB;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,sBAAsB,GAAG,IAAI,CAc/F;IAED,wFAAwF;IACxF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE1B;IAED,2FAA2F;IAC3F,kFAAkF;IAClF,SAAS,IAAI,MAAM,GAAG,IAAI,CAMzB;IAED,mFAAmF;IACnF,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAO/C;IAED,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAOjD;IAED;;;;OAIG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAgB3F;IAED,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CASxC;IAED,KAAK,IAAI,IAAI,CAEZ;CACF;AAED,kGAAkG;AAClG,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAE7E"}
@@ -67,6 +67,18 @@ export class SqliteGuidedReviewQueue {
67
67
  this.db.prepare('DELETE FROM guided_review_queue WHERE job_key = ?').run(key);
68
68
  }
69
69
  /** The drive threw: hold the job off the queue until `notBefore` and count the failure. */
70
+ /** When the earliest held job becomes claimable, or null when none is waiting. */
71
+ nextDueAt() {
72
+ const row = queryOne(this.db, `SELECT MIN(lease_until) AS due FROM guided_review_queue WHERE state = 'active'`);
73
+ return row?.due ?? null;
74
+ }
75
+ /** Hold a job that made progress until `notBefore`, clearing its failure count. */
76
+ reschedule(key, notBefore) {
77
+ this.db
78
+ .prepare(`UPDATE guided_review_queue SET state = 'active', lease_until = ?, attempts = 0
79
+ WHERE job_key = ?`)
80
+ .run(notBefore, key);
81
+ }
70
82
  deferFailure(key, notBefore) {
71
83
  this.db
72
84
  .prepare(`UPDATE guided_review_queue SET state = 'active', lease_until = ?, attempts = attempts + 1
@@ -1 +1 @@
1
- {"version":3,"file":"guidedReviewQueue.js","sourceRoot":"","sources":["../../src/sqlite/guidedReviewQueue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guidedReviewQueue.js","sourceRoot":"","sources":["../../src/sqlite/guidedReviewQueue.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/local-server",
3
- "version": "0.153.2",
3
+ "version": "0.154.0",
4
4
  "description": "Local-mode runtime facade for the Agent Architecture Board: the @cat-factory/node-server stack with agent jobs run as local Docker/Podman containers and GitHub accessed via a personal access token — a developer can run the whole product on their own machine.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,24 +24,24 @@
24
24
  "access": "public"
25
25
  },
26
26
  "dependencies": {
27
- "@cat-factory/agents": "0.170.1",
28
- "@cat-factory/binary-generators": "0.3.61",
29
- "@cat-factory/contracts": "0.361.0",
27
+ "@cat-factory/agents": "0.171.0",
28
+ "@cat-factory/binary-generators": "0.3.62",
29
+ "@cat-factory/contracts": "0.362.0",
30
30
  "@cat-factory/executor-harness": "1.163.2",
31
- "@cat-factory/gitlab": "0.23.24",
32
- "@cat-factory/integrations": "0.174.10",
33
- "@cat-factory/kernel": "0.354.2",
34
- "@cat-factory/node-server": "0.235.2",
35
- "@cat-factory/orchestration": "0.318.0",
36
- "@cat-factory/prompt-fragments": "1.1.57",
37
- "@cat-factory/server": "0.330.0",
31
+ "@cat-factory/gitlab": "0.23.25",
32
+ "@cat-factory/integrations": "0.174.11",
33
+ "@cat-factory/kernel": "0.355.0",
34
+ "@cat-factory/node-server": "0.236.0",
35
+ "@cat-factory/orchestration": "0.319.0",
36
+ "@cat-factory/prompt-fragments": "1.1.58",
37
+ "@cat-factory/server": "0.331.0",
38
38
  "@hono/node-server": "^2.1.1",
39
39
  "drizzle-orm": "1.0.0-rc.4",
40
40
  "ws": "^8.22.0"
41
41
  },
42
42
  "devDependencies": {
43
- "@cat-factory/conformance": "0.62.2",
44
- "@cat-factory/gates": "0.11.61",
43
+ "@cat-factory/conformance": "0.63.0",
44
+ "@cat-factory/gates": "0.11.62",
45
45
  "@types/node": "^26.6.3",
46
46
  "@types/ws": "^8.18.1",
47
47
  "typescript": "7.0.2",