@askexenow/exe-os 0.9.190 → 0.9.192
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/bin/stack-update.js +4 -1
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{chunk-IBLPRLO3.js → chunk-2OX3F2UQ.js} +16 -3
- package/dist/{chunk-VKUOC7AR.js → chunk-A6Z2S653.js} +12 -1
- package/dist/lib/exe-daemon.js +3 -3
- package/dist/lib/ws-client.js +20 -3
- package/dist/mcp/register-tools.js +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/{stack-update-VN5SBY4U.js → stack-update-L4JGJZ7E.js} +1 -1
- package/package.json +1 -1
package/dist/bin/stack-update.js
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
patchEnv,
|
|
12
12
|
readCurrentStackVersion,
|
|
13
13
|
runStackUpdate
|
|
14
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-A6Z2S653.js";
|
|
15
15
|
import "../chunk-MVMMULOJ.js";
|
|
16
16
|
import "../chunk-4GXRETYL.js";
|
|
17
17
|
import "../chunk-LYH5HE24.js";
|
|
@@ -70,6 +70,8 @@ function parseArgs(args) {
|
|
|
70
70
|
else if (arg.startsWith("--device-id=")) opts.deviceId = arg.split("=").slice(1).join("=");
|
|
71
71
|
else if (arg === "--license-key") opts.licenseKey = next();
|
|
72
72
|
else if (arg.startsWith("--license-key=")) opts.licenseKey = arg.split("=").slice(1).join("=");
|
|
73
|
+
else if (arg === "--registry-credentials") opts.registryCredentials = next();
|
|
74
|
+
else if (arg.startsWith("--registry-credentials=")) opts.registryCredentials = arg.split("=").slice(1).join("=");
|
|
73
75
|
else if (arg === "--rollback") opts.rollback = true;
|
|
74
76
|
else if (arg === "--deployment-persona") {
|
|
75
77
|
const value = next();
|
|
@@ -124,6 +126,7 @@ Options:
|
|
|
124
126
|
--audit-url <url> Deploy-audit endpoint (default: EXE_STACK_AUDIT_URL/update.askexe.com)
|
|
125
127
|
--image-credentials-url <url> Registry credential broker endpoint
|
|
126
128
|
--no-image-credentials Skip registry credential broker / Docker login
|
|
129
|
+
--registry-credentials <user:token> Manual GHCR credentials when broker is down (or EXE_REGISTRY_CREDENTIALS env)
|
|
127
130
|
--device-id <id> Device ID to include in deploy audit
|
|
128
131
|
--license-key <key> License key to include in deploy audit
|
|
129
132
|
--rollback Restore latest backed-up .env and restart stack
|
|
@@ -207,7 +207,7 @@ async function main(args) {
|
|
|
207
207
|
console.log("[health-gate] Starting rollback...");
|
|
208
208
|
restorePreDeployBackup();
|
|
209
209
|
try {
|
|
210
|
-
const { rollbackStackUpdate, defaultStackPaths } = await import("../stack-update-
|
|
210
|
+
const { rollbackStackUpdate, defaultStackPaths } = await import("../stack-update-L4JGJZ7E.js");
|
|
211
211
|
const paths = defaultStackPaths();
|
|
212
212
|
await rollbackStackUpdate({
|
|
213
213
|
manifestRef: paths.manifestRef,
|
|
@@ -10172,22 +10172,35 @@ function registerCreateFeatureRequest(server) {
|
|
|
10172
10172
|
file_paths: null
|
|
10173
10173
|
});
|
|
10174
10174
|
await flushBatch();
|
|
10175
|
-
const
|
|
10175
|
+
const upstreamPayload = {
|
|
10176
10176
|
id,
|
|
10177
10177
|
title,
|
|
10178
10178
|
category,
|
|
10179
10179
|
priority,
|
|
10180
10180
|
product: resolvedProduct,
|
|
10181
|
+
summary: description,
|
|
10182
|
+
// Worker requires 'summary', not 'description'
|
|
10181
10183
|
description,
|
|
10182
10184
|
use_case,
|
|
10185
|
+
useCase: use_case,
|
|
10183
10186
|
current_workaround,
|
|
10187
|
+
currentWorkaround: current_workaround,
|
|
10184
10188
|
proposed_solution,
|
|
10189
|
+
proposedSolution: proposed_solution,
|
|
10185
10190
|
business_impact,
|
|
10191
|
+
businessImpact: business_impact,
|
|
10186
10192
|
package_version: version,
|
|
10193
|
+
packageVersion: version,
|
|
10187
10194
|
project_name,
|
|
10195
|
+
projectName: project_name,
|
|
10188
10196
|
agent_id: agentId,
|
|
10189
|
-
|
|
10190
|
-
|
|
10197
|
+
source: "mcp-tool",
|
|
10198
|
+
markdown
|
|
10199
|
+
};
|
|
10200
|
+
for (const key of Object.keys(upstreamPayload)) {
|
|
10201
|
+
if (upstreamPayload[key] === void 0) delete upstreamPayload[key];
|
|
10202
|
+
}
|
|
10203
|
+
const upstreamStatus = send_upstream ? await maybeSendUpstream2(upstreamPayload) : "skipped";
|
|
10191
10204
|
return {
|
|
10192
10205
|
content: [
|
|
10193
10206
|
{
|
|
@@ -620,7 +620,18 @@ async function runStackUpdate(options) {
|
|
|
620
620
|
const composeArgs = ["compose", "--file", options.composeFile, "--env-file", options.envFile];
|
|
621
621
|
let registryForLogout;
|
|
622
622
|
try {
|
|
623
|
-
|
|
623
|
+
let creds = await fetchImageCredentials(options);
|
|
624
|
+
if (!creds) {
|
|
625
|
+
const manual = options.registryCredentials || process.env.EXE_REGISTRY_CREDENTIALS;
|
|
626
|
+
if (manual) {
|
|
627
|
+
const [username, ...rest] = manual.split(":");
|
|
628
|
+
const password = rest.join(":");
|
|
629
|
+
if (username && password) {
|
|
630
|
+
creds = { registry: "ghcr.io", username, password };
|
|
631
|
+
console.log("[stack-update] Using manual registry credentials (--registry-credentials).");
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
624
635
|
if (creds) {
|
|
625
636
|
(options.dockerLogin ?? defaultDockerLogin)(creds);
|
|
626
637
|
registryForLogout = creds.registry;
|
package/dist/lib/exe-daemon.js
CHANGED
|
@@ -1495,9 +1495,9 @@ async function startMcpHttpServer() {
|
|
|
1495
1495
|
const heapPressure = heapLimit > 0 && mem.heapUsed > heapLimit * 0.7;
|
|
1496
1496
|
if ((rssPressure || heapPressure) && transports.size > 1) {
|
|
1497
1497
|
const sorted = [...sessionLastSeen.entries()].sort((a, b) => a[1] - b[1]);
|
|
1498
|
-
|
|
1499
|
-
closeMcpSession2(sorted[
|
|
1500
|
-
process.stderr.write(`[exed] MCP pressure eviction: closed session ${sorted[
|
|
1498
|
+
if (sorted.length > 0) {
|
|
1499
|
+
closeMcpSession2(sorted[0][0], rssPressure ? "rss_pressure_evict" : "heap_pressure_evict");
|
|
1500
|
+
process.stderr.write(`[exed] MCP pressure eviction: closed 1 session ${sorted[0][0].slice(0, 8)} (${transports.size} remaining; rss=${Math.round(mem.rss / 1024 / 1024)}MB heap=${Math.round(mem.heapUsed / 1024 / 1024)}MB)
|
|
1501
1501
|
`);
|
|
1502
1502
|
}
|
|
1503
1503
|
global.gc?.();
|
package/dist/lib/ws-client.js
CHANGED
|
@@ -5,9 +5,10 @@ import "../chunk-MLKGABMK.js";
|
|
|
5
5
|
|
|
6
6
|
// src/lib/ws-client.ts
|
|
7
7
|
var MIN_RECONNECT_MS = 1e3;
|
|
8
|
-
var MAX_RECONNECT_MS =
|
|
8
|
+
var MAX_RECONNECT_MS = 5 * 60 * 1e3;
|
|
9
9
|
var HEARTBEAT_INTERVAL_MS = 3e4;
|
|
10
10
|
var MAX_RECONNECT_ATTEMPTS = 10;
|
|
11
|
+
var MAX_CONSECUTIVE_1006 = 3;
|
|
11
12
|
function createWsClient(config, handlers) {
|
|
12
13
|
assertSecureWsUrl(config.endpoint);
|
|
13
14
|
let ws = null;
|
|
@@ -15,12 +16,14 @@ function createWsClient(config, handlers) {
|
|
|
15
16
|
let closed = false;
|
|
16
17
|
let reconnectDelay = MIN_RECONNECT_MS;
|
|
17
18
|
let reconnectAttempts = 0;
|
|
19
|
+
let consecutive1006 = 0;
|
|
20
|
+
let wsDisabledByServer = false;
|
|
18
21
|
let reconnectTimer = null;
|
|
19
22
|
let heartbeatTimer = null;
|
|
20
23
|
let currentAgents = [];
|
|
21
24
|
let currentProjects = [];
|
|
22
25
|
function connect() {
|
|
23
|
-
if (closed) return;
|
|
26
|
+
if (closed || wsDisabledByServer) return;
|
|
24
27
|
if (ws) {
|
|
25
28
|
try {
|
|
26
29
|
ws.onopen = ws.onmessage = ws.onclose = ws.onerror = null;
|
|
@@ -40,6 +43,7 @@ function createWsClient(config, handlers) {
|
|
|
40
43
|
connected = true;
|
|
41
44
|
reconnectDelay = MIN_RECONNECT_MS;
|
|
42
45
|
reconnectAttempts = 0;
|
|
46
|
+
consecutive1006 = 0;
|
|
43
47
|
handlers.onConnect();
|
|
44
48
|
sendRaw({
|
|
45
49
|
type: "register",
|
|
@@ -77,13 +81,26 @@ function createWsClient(config, handlers) {
|
|
|
77
81
|
clearInterval(heartbeatTimer);
|
|
78
82
|
heartbeatTimer = null;
|
|
79
83
|
}
|
|
80
|
-
const code = event.code ??
|
|
84
|
+
const code = event.code ?? 0;
|
|
81
85
|
const reason = event.reason || "(none)";
|
|
82
86
|
process.stderr.write(
|
|
83
87
|
`[ws-client] Disconnected: code=${code} reason=${reason}
|
|
84
88
|
`
|
|
85
89
|
);
|
|
86
90
|
handlers.onDisconnect();
|
|
91
|
+
if (code === 1006) {
|
|
92
|
+
consecutive1006++;
|
|
93
|
+
if (consecutive1006 >= MAX_CONSECUTIVE_1006) {
|
|
94
|
+
wsDisabledByServer = true;
|
|
95
|
+
process.stderr.write(
|
|
96
|
+
`[ws-client] Cloud WebSocket not available \u2014 disabling real-time sync after ${consecutive1006} consecutive 1006 errors. HTTP polling sync continues normally.
|
|
97
|
+
`
|
|
98
|
+
);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
} else {
|
|
102
|
+
consecutive1006 = 0;
|
|
103
|
+
}
|
|
87
104
|
scheduleReconnect();
|
|
88
105
|
};
|
|
89
106
|
ws.onerror = (event) => {
|
package/dist/mcp/server.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askexenow/exe-os",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.192",
|
|
4
4
|
"description": "AI employee operating system — persistent memory, task management, and multi-agent coordination for Claude Code.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"type": "module",
|