@sagentlab/navarch-runtime 0.1.74 → 0.1.76
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/session.cjs +5 -0
- package/dist/update-coordinator.cjs +22 -2
- package/package.json +1 -1
package/dist/session.cjs
CHANGED
|
@@ -883,6 +883,11 @@ const REMEDIABLE_REJECTION_CODES = new Set([
|
|
|
883
883
|
"review_fix_required",
|
|
884
884
|
"review_fix_unavailable",
|
|
885
885
|
"pr_required",
|
|
886
|
+
// A plan session opened a PR the review loop will never adopt: a turn can
|
|
887
|
+
// close it and file the change with create_task on the same lease. A failed
|
|
888
|
+
// GitHub check is retried the same way.
|
|
889
|
+
"plan_pr_not_allowed",
|
|
890
|
+
"plan_pr_check_failed",
|
|
886
891
|
// A video-deliverable build that completed without registering its render:
|
|
887
892
|
// the file usually already exists in the worktree, so the remediation turn
|
|
888
893
|
// only has to call register_artifact and PUT the upload.
|
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RuntimeUpdateCoordinator = void 0;
|
|
3
|
+
exports.RuntimeUpdateCoordinator = exports.UPDATE_RETRY_MAX_MS = exports.UPDATE_RETRY_BASE_MS = void 0;
|
|
4
4
|
const logger_cjs_1 = require("./logger.cjs");
|
|
5
5
|
const update_installer_cjs_1 = require("./update-installer.cjs");
|
|
6
6
|
const version_cjs_1 = require("./version.cjs");
|
|
7
7
|
const supervisor_cjs_1 = require("./supervisor.cjs");
|
|
8
8
|
const log = (0, logger_cjs_1.createLogger)("update");
|
|
9
|
+
// A failed stage reports `failed`, which sends a heartbeat at once, whose
|
|
10
|
+
// response repeats the same directive. Without a pause that loop re-runs
|
|
11
|
+
// `npm pack` several times a second (seen while npm's CDN still served the
|
|
12
|
+
// pre-publish packument for a freshly rolled-out version).
|
|
13
|
+
exports.UPDATE_RETRY_BASE_MS = 30_000;
|
|
14
|
+
exports.UPDATE_RETRY_MAX_MS = 10 * 60_000;
|
|
15
|
+
function directiveKey(directive) {
|
|
16
|
+
return `${directive.target_version}\0${directive.integrity}`;
|
|
17
|
+
}
|
|
9
18
|
class RuntimeUpdateCoordinator {
|
|
10
19
|
options;
|
|
11
20
|
targetInProgress = null;
|
|
12
21
|
restartInProgress = null;
|
|
13
22
|
warnedUnsupervised = false;
|
|
23
|
+
lastFailure = null;
|
|
14
24
|
constructor(options) {
|
|
15
25
|
this.options = options;
|
|
16
26
|
}
|
|
@@ -26,6 +36,9 @@ class RuntimeUpdateCoordinator {
|
|
|
26
36
|
}
|
|
27
37
|
if (this.targetInProgress)
|
|
28
38
|
return;
|
|
39
|
+
const key = directiveKey(directive);
|
|
40
|
+
if (this.lastFailure?.key === key && this.now() < this.lastFailure.retryAt)
|
|
41
|
+
return;
|
|
29
42
|
this.targetInProgress = directive.target_version;
|
|
30
43
|
void this.apply(directive);
|
|
31
44
|
}
|
|
@@ -57,6 +70,9 @@ class RuntimeUpdateCoordinator {
|
|
|
57
70
|
this.restartInProgress = null;
|
|
58
71
|
}
|
|
59
72
|
}
|
|
73
|
+
now() {
|
|
74
|
+
return (this.options.now ?? Date.now)();
|
|
75
|
+
}
|
|
60
76
|
async apply(directive) {
|
|
61
77
|
const { config, heartbeat, claimLoop, capacity } = this.options;
|
|
62
78
|
try {
|
|
@@ -73,7 +89,11 @@ class RuntimeUpdateCoordinator {
|
|
|
73
89
|
}
|
|
74
90
|
catch (error) {
|
|
75
91
|
const message = error instanceof Error ? error.message : String(error);
|
|
76
|
-
|
|
92
|
+
const key = directiveKey(directive);
|
|
93
|
+
const failures = this.lastFailure?.key === key ? this.lastFailure.failures + 1 : 1;
|
|
94
|
+
const delayMs = Math.min(exports.UPDATE_RETRY_BASE_MS * 2 ** (failures - 1), exports.UPDATE_RETRY_MAX_MS);
|
|
95
|
+
this.lastFailure = { key, failures, retryAt: this.now() + delayMs };
|
|
96
|
+
log.error(`runtime update failed: ${message} (retrying ${directive.target_version} in ${Math.round(delayMs / 1000)}s)`);
|
|
77
97
|
heartbeat.setUpdateState("failed", message.slice(0, 500));
|
|
78
98
|
claimLoop.start();
|
|
79
99
|
this.targetInProgress = null;
|
package/package.json
CHANGED