@poolzin/pool-bot 2026.4.28 → 2026.4.30
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.
- package/dist/build-info.json +3 -3
- package/dist/config/types.agent-defaults.d.ts +2 -0
- package/dist/config/types.agent-defaults.d.ts.map +1 -1
- package/dist/config/types.telegram.d.ts +9 -0
- package/dist/config/types.telegram.d.ts.map +1 -1
- package/dist/control-ui/assets/{index-1DWuMa4l.js → index-CAx-3zc2.js} +532 -545
- package/dist/control-ui/assets/index-CAx-3zc2.js.map +1 -0
- package/dist/control-ui/index.html +1 -1
- package/dist/cron/types.d.ts +7 -0
- package/dist/cron/types.d.ts.map +1 -1
- package/dist/infra/heartbeat-runner.d.ts.map +1 -1
- package/dist/infra/heartbeat-runner.js +10 -2
- package/dist/infra/tasks/store.d.ts +33 -0
- package/dist/infra/tasks/store.d.ts.map +1 -0
- package/dist/infra/tasks/store.js +59 -0
- package/dist/process/command-queue.d.ts +7 -0
- package/dist/process/command-queue.d.ts.map +1 -1
- package/dist/process/command-queue.js +26 -1
- package/package.json +1 -1
- package/dist/control-ui/assets/index-1DWuMa4l.js.map +0 -1
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<title>Poolbot Control</title>
|
|
7
7
|
<meta name="color-scheme" content="dark light" />
|
|
8
8
|
<link rel="icon" href="./favicon.ico" sizes="any" />
|
|
9
|
-
<script type="module" crossorigin src="./assets/index-
|
|
9
|
+
<script type="module" crossorigin src="./assets/index-CAx-3zc2.js"></script>
|
|
10
10
|
<link rel="stylesheet" crossorigin href="./assets/index-Cm16MN6l.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
package/dist/cron/types.d.ts
CHANGED
|
@@ -114,6 +114,13 @@ export type CronJob = {
|
|
|
114
114
|
payload: CronPayload;
|
|
115
115
|
delivery?: CronDelivery;
|
|
116
116
|
onFailure?: CronFailureAlert;
|
|
117
|
+
/** Per-job tool allowlist — restricts which tools the agent can use. */
|
|
118
|
+
tools?: {
|
|
119
|
+
/** Tool names to allow (if set, only these tools are available). */
|
|
120
|
+
allow?: string[];
|
|
121
|
+
/** Tool names to deny. */
|
|
122
|
+
deny?: string[];
|
|
123
|
+
};
|
|
117
124
|
state: CronJobState;
|
|
118
125
|
};
|
|
119
126
|
export type CronStoreFile = {
|
package/dist/cron/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cron/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEN,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,MAAM,EAAE,CAAC;AACtF,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,KAAK,CAAC;AAEpD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAEtD,iFAAiF;AACjF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC;AAEvD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEN,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEN,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4FAA4F;IAC5F,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,aAAa,EAAE,iBAAiB,CAAC;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,KAAK,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,aAAa,GAAG,aAAa,GAAG,OAAO,CAAC,GAAG;IAC1F,KAAK,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,OAAO,CAChC,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC,CACrF,GAAG;IACF,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAC/B,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cron/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat-runner.d.ts","sourceRoot":"","sources":["../../src/infra/heartbeat-runner.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAYzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAK7E,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhE,OAAO,EAEL,iBAAiB,EAElB,MAAM,8BAA8B,CAAC;AAItC,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQ9D,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAC1C,oBAAoB,GAAG;IACrB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB,CAAC;AAKJ,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAEpD;AAED,KAAK,eAAe,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;AAMxD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAWF,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAU7B,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,YAAY,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;CAC5C,CAAC;AAOF,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAUxF;AAcD,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,aAAa,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,gBAAgB,CA2ClB;AAiBD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,aAAa,EAClB,aAAa,CAAC,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,eAAe,iBAwB5B;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,eAAe,UAErF;AA2TD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB,GAAG,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"heartbeat-runner.d.ts","sourceRoot":"","sources":["../../src/infra/heartbeat-runner.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAYzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAK7E,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhE,OAAO,EAEL,iBAAiB,EAElB,MAAM,8BAA8B,CAAC;AAItC,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQ9D,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAC1C,oBAAoB,GAAG;IACrB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB,CAAC;AAKJ,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAEpD;AAED,KAAK,eAAe,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;AAMxD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAWF,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAU7B,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,YAAY,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;CAC5C,CAAC;AAOF,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAUxF;AAcD,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,aAAa,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,gBAAgB,CA2ClB;AAiBD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,aAAa,EAClB,aAAa,CAAC,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,eAAe,iBAwB5B;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,eAAe,UAErF;AA2TD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuY9B;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,gBAAgB,CAAC;CACnC,GAAG,eAAe,CAqOlB"}
|
|
@@ -13,7 +13,7 @@ import { parseDurationMs } from "../cli/parse-duration.js";
|
|
|
13
13
|
import { loadConfig } from "../config/config.js";
|
|
14
14
|
import { canonicalizeMainSessionAlias, loadSessionStore, resolveAgentIdFromSessionKey, resolveAgentMainSessionKey, resolveSessionFilePath, resolveStorePath, saveSessionStore, updateSessionStore, } from "../config/sessions.js";
|
|
15
15
|
import { createSubsystemLogger } from "../logging/subsystem.js";
|
|
16
|
-
import { getQueueSize } from "../process/command-queue.js";
|
|
16
|
+
import { getQueueSize, pruneStuckTasks } from "../process/command-queue.js";
|
|
17
17
|
import { normalizeAgentId, toAgentStoreSessionKey } from "../routing/session-key.js";
|
|
18
18
|
import { defaultRuntime } from "../runtime.js";
|
|
19
19
|
import { escapeRegExp } from "../utils.js";
|
|
@@ -392,7 +392,15 @@ export async function runHeartbeatOnce(opts) {
|
|
|
392
392
|
}
|
|
393
393
|
const queueSize = (opts.deps?.getQueueSize ?? getQueueSize)("main" /* CommandLane.Main */);
|
|
394
394
|
if (queueSize > 0) {
|
|
395
|
-
|
|
395
|
+
// Prune stuck tasks (active > 15 min) that may permanently block the lane
|
|
396
|
+
const pruned = pruneStuckTasks();
|
|
397
|
+
if (pruned > 0) {
|
|
398
|
+
log.info(`heartbeat: pruned ${pruned} stuck task(s) from command lane`);
|
|
399
|
+
}
|
|
400
|
+
const queueSizeAfter = (opts.deps?.getQueueSize ?? getQueueSize)("main" /* CommandLane.Main */);
|
|
401
|
+
if (queueSizeAfter > 0) {
|
|
402
|
+
return { status: "skipped", reason: "requests-in-flight" };
|
|
403
|
+
}
|
|
396
404
|
}
|
|
397
405
|
// Preflight centralizes trigger classification, event inspection, and HEARTBEAT.md gating.
|
|
398
406
|
const preflight = await resolveHeartbeatPreflight({
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type TaskStatus = "created" | "running" | "completed" | "failed" | "cancelled";
|
|
2
|
+
export type TaskRecord = {
|
|
3
|
+
id: string;
|
|
4
|
+
status: TaskStatus;
|
|
5
|
+
description: string;
|
|
6
|
+
source: string;
|
|
7
|
+
sessionKey?: string;
|
|
8
|
+
createdAtMs: number;
|
|
9
|
+
updatedAtMs: number;
|
|
10
|
+
completedAtMs?: number;
|
|
11
|
+
error?: string;
|
|
12
|
+
};
|
|
13
|
+
export interface TaskStore {
|
|
14
|
+
create(task: Omit<TaskRecord, "createdAtMs" | "updatedAtMs">): TaskRecord;
|
|
15
|
+
update(id: string, patch: Partial<TaskRecord>): void;
|
|
16
|
+
get(id: string): TaskRecord | null;
|
|
17
|
+
list(status?: TaskStatus, limit?: number): TaskRecord[];
|
|
18
|
+
cleanup(olderThanMs: number): number;
|
|
19
|
+
}
|
|
20
|
+
/** In-memory fallback when SQLite is unavailable. */
|
|
21
|
+
export declare class InMemoryTaskStore implements TaskStore {
|
|
22
|
+
private tasks;
|
|
23
|
+
create(task: Omit<TaskRecord, "createdAtMs" | "updatedAtMs">): TaskRecord;
|
|
24
|
+
update(id: string, patch: Partial<TaskRecord>): void;
|
|
25
|
+
get(id: string): TaskRecord | null;
|
|
26
|
+
list(status?: TaskStatus, limit?: number): TaskRecord[];
|
|
27
|
+
cleanup(olderThanMs: number): number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the global task store. Creates an in-memory store on first call.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getTaskStore(): TaskStore;
|
|
33
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/infra/tasks/store.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEtF,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,GAAG,aAAa,CAAC,GAAG,UAAU,CAAC;IAC1E,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IACrD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAAC;IACxD,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;CACtC;AAED,qDAAqD;AACrD,qBAAa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,KAAK,CAAiC;IAE9C,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,GAAG,aAAa,CAAC,GAAG,UAAU;IAOzE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IAcpD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAIlC,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,SAAM,GAAG,UAAU,EAAE;IAMpD,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAUrC;AAID;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAMxC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal SQLite-backed background task registry.
|
|
3
|
+
* Tracks task lifecycle: created → running → completed/failed.
|
|
4
|
+
*/
|
|
5
|
+
import { createSubsystemLogger } from "../../logging/subsystem.js";
|
|
6
|
+
const log = createSubsystemLogger("tasks");
|
|
7
|
+
/** In-memory fallback when SQLite is unavailable. */
|
|
8
|
+
export class InMemoryTaskStore {
|
|
9
|
+
tasks = new Map();
|
|
10
|
+
create(task) {
|
|
11
|
+
const now = Date.now();
|
|
12
|
+
const record = { ...task, createdAtMs: now, updatedAtMs: now };
|
|
13
|
+
this.tasks.set(task.id, record);
|
|
14
|
+
return record;
|
|
15
|
+
}
|
|
16
|
+
update(id, patch) {
|
|
17
|
+
const existing = this.tasks.get(id);
|
|
18
|
+
if (!existing)
|
|
19
|
+
return;
|
|
20
|
+
const updated = {
|
|
21
|
+
...existing,
|
|
22
|
+
...patch,
|
|
23
|
+
updatedAtMs: Date.now(),
|
|
24
|
+
};
|
|
25
|
+
if (patch.status === "completed" || patch.status === "failed" || patch.status === "cancelled") {
|
|
26
|
+
updated.completedAtMs = updated.updatedAtMs;
|
|
27
|
+
}
|
|
28
|
+
this.tasks.set(id, updated);
|
|
29
|
+
}
|
|
30
|
+
get(id) {
|
|
31
|
+
return this.tasks.get(id) ?? null;
|
|
32
|
+
}
|
|
33
|
+
list(status, limit = 100) {
|
|
34
|
+
const items = [...this.tasks.values()];
|
|
35
|
+
const filtered = status ? items.filter((t) => t.status === status) : items;
|
|
36
|
+
return filtered.sort((a, b) => b.createdAtMs - a.createdAtMs).slice(0, limit);
|
|
37
|
+
}
|
|
38
|
+
cleanup(olderThanMs) {
|
|
39
|
+
let count = 0;
|
|
40
|
+
for (const [id, task] of this.tasks) {
|
|
41
|
+
if (task.completedAtMs && task.completedAtMs < olderThanMs) {
|
|
42
|
+
this.tasks.delete(id);
|
|
43
|
+
count++;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return count;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
let globalStore = null;
|
|
50
|
+
/**
|
|
51
|
+
* Get the global task store. Creates an in-memory store on first call.
|
|
52
|
+
*/
|
|
53
|
+
export function getTaskStore() {
|
|
54
|
+
if (!globalStore) {
|
|
55
|
+
globalStore = new InMemoryTaskStore();
|
|
56
|
+
log.info("Initialized in-memory task store");
|
|
57
|
+
}
|
|
58
|
+
return globalStore;
|
|
59
|
+
}
|
|
@@ -38,6 +38,13 @@ export declare function resetAllLanes(): void;
|
|
|
38
38
|
* (excludes queued-but-not-started entries).
|
|
39
39
|
*/
|
|
40
40
|
export declare function getActiveTaskCount(): number;
|
|
41
|
+
/**
|
|
42
|
+
* Prune stuck active tasks that have been running longer than `maxAgeMs`.
|
|
43
|
+
* This prevents permanently blocked lanes when a task promise never settles
|
|
44
|
+
* (e.g. LLM timeout that leaves the task in active state without completion).
|
|
45
|
+
* Returns the number of pruned tasks.
|
|
46
|
+
*/
|
|
47
|
+
export declare function pruneStuckTasks(maxAgeMs?: number): number;
|
|
41
48
|
/**
|
|
42
49
|
* Wait for all currently active tasks across all lanes to finish.
|
|
43
50
|
* Polls at a short interval; resolves when no tasks are active or
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-queue.d.ts","sourceRoot":"","sources":["../../src/process/command-queue.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,IAAI,CAAC,EAAE,MAAM;CAI1B;
|
|
1
|
+
{"version":3,"file":"command-queue.d.ts","sourceRoot":"","sources":["../../src/process/command-queue.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,IAAI,CAAC,EAAE,MAAM;CAI1B;AA+GD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAK5E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,IAAI,CAAC,EAAE;IACL,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACxD,GACA,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAED,wBAAgB,cAAc,CAAC,CAAC,EAC9B,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,IAAI,CAAC,EAAE;IACL,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACxD,GACA,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAyB,UAO3D;AAED,wBAAgB,iBAAiB,WAMhC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAyB,UAY/D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAcpC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAM3C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,SAAc,GAAG,MAAM,CAiB9D;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA2CnF"}
|
|
@@ -21,6 +21,7 @@ function getLaneState(lane) {
|
|
|
21
21
|
lane,
|
|
22
22
|
queue: [],
|
|
23
23
|
activeTaskIds: new Set(),
|
|
24
|
+
activeTaskStartTimes: new Map(),
|
|
24
25
|
maxConcurrent: 1,
|
|
25
26
|
draining: false,
|
|
26
27
|
generation: 0,
|
|
@@ -29,10 +30,11 @@ function getLaneState(lane) {
|
|
|
29
30
|
return created;
|
|
30
31
|
}
|
|
31
32
|
function completeTask(state, taskId, taskGeneration) {
|
|
32
|
-
if (
|
|
33
|
+
if (state.generation !== taskGeneration) {
|
|
33
34
|
return false;
|
|
34
35
|
}
|
|
35
36
|
state.activeTaskIds.delete(taskId);
|
|
37
|
+
state.activeTaskStartTimes.delete(taskId);
|
|
36
38
|
return true;
|
|
37
39
|
}
|
|
38
40
|
function drainLane(lane) {
|
|
@@ -53,6 +55,7 @@ function drainLane(lane) {
|
|
|
53
55
|
const taskId = nextTaskId++;
|
|
54
56
|
const taskGeneration = state.generation;
|
|
55
57
|
state.activeTaskIds.add(taskId);
|
|
58
|
+
state.activeTaskStartTimes.set(taskId, Date.now());
|
|
56
59
|
void (async () => {
|
|
57
60
|
const startTime = Date.now();
|
|
58
61
|
try {
|
|
@@ -175,6 +178,28 @@ export function getActiveTaskCount() {
|
|
|
175
178
|
}
|
|
176
179
|
return total;
|
|
177
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* Prune stuck active tasks that have been running longer than `maxAgeMs`.
|
|
183
|
+
* This prevents permanently blocked lanes when a task promise never settles
|
|
184
|
+
* (e.g. LLM timeout that leaves the task in active state without completion).
|
|
185
|
+
* Returns the number of pruned tasks.
|
|
186
|
+
*/
|
|
187
|
+
export function pruneStuckTasks(maxAgeMs = 15 * 60_000) {
|
|
188
|
+
const now = Date.now();
|
|
189
|
+
let pruned = 0;
|
|
190
|
+
for (const state of lanes.values()) {
|
|
191
|
+
for (const taskId of state.activeTaskIds) {
|
|
192
|
+
const startedAt = state.activeTaskStartTimes.get(taskId);
|
|
193
|
+
if (startedAt && now - startedAt > maxAgeMs) {
|
|
194
|
+
state.activeTaskIds.delete(taskId);
|
|
195
|
+
state.activeTaskStartTimes.delete(taskId);
|
|
196
|
+
pruned++;
|
|
197
|
+
diag.warn(`lane stuck task pruned: lane=${state.lane} taskId=${taskId} ageMs=${now - startedAt}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return pruned;
|
|
202
|
+
}
|
|
178
203
|
/**
|
|
179
204
|
* Wait for all currently active tasks across all lanes to finish.
|
|
180
205
|
* Polls at a short interval; resolves when no tasks are active or
|