@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.
@@ -11,7 +11,7 @@ import {
11
11
  patchEnv,
12
12
  readCurrentStackVersion,
13
13
  runStackUpdate
14
- } from "../chunk-VKUOC7AR.js";
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-VN5SBY4U.js");
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 upstreamStatus = send_upstream ? await maybeSendUpstream2({
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
- agent_role: agentRole
10190
- }) : "skipped";
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
- const creds = await fetchImageCredentials(options);
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;
@@ -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
- for (let i = 0; i < sorted.length - 1; i++) {
1499
- closeMcpSession2(sorted[i][0], rssPressure ? "rss_pressure_evict" : "heap_pressure_evict");
1500
- process.stderr.write(`[exed] MCP pressure eviction: closed session ${sorted[i][0].slice(0, 8)} (${transports.size} remaining; rss=${Math.round(mem.rss / 1024 / 1024)}MB heap=${Math.round(mem.heapUsed / 1024 / 1024)}MB)
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?.();
@@ -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 = 3e4;
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 ?? "unknown";
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) => {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  registerAllTools
3
- } from "../chunk-IBLPRLO3.js";
3
+ } from "../chunk-2OX3F2UQ.js";
4
4
  import "../chunk-PLNYW6PA.js";
5
5
  import "../chunk-AFJWUI3Y.js";
6
6
  import "../chunk-OK5U45GK.js";
@@ -3,7 +3,7 @@ import {
3
3
  } from "../chunk-V4TZI6EO.js";
4
4
  import {
5
5
  registerAllTools
6
- } from "../chunk-IBLPRLO3.js";
6
+ } from "../chunk-2OX3F2UQ.js";
7
7
  import {
8
8
  initLicenseGate
9
9
  } from "../chunk-PLNYW6PA.js";
@@ -20,7 +20,7 @@ import {
20
20
  runStackUpdate,
21
21
  verifyReleaseHealth,
22
22
  verifyStackManifestSignature
23
- } from "./chunk-VKUOC7AR.js";
23
+ } from "./chunk-A6Z2S653.js";
24
24
  import "./chunk-MVMMULOJ.js";
25
25
  import "./chunk-4GXRETYL.js";
26
26
  import "./chunk-LYH5HE24.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askexenow/exe-os",
3
- "version": "0.9.190",
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",