@askexenow/exe-os 0.9.243 → 0.9.244

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.
@@ -38,7 +38,12 @@ ingress:
38
38
  # Gateway (WhatsApp, webhooks, pairing)
39
39
  - hostname: gateway.CHANGEME_DOMAIN
40
40
  service: http://exe-gateway:3100
41
- # Monitor
41
+ # Monitor — /_/ admin panel blocked; only the API and UI are exposed publicly.
42
+ # The PocketBase superadmin UI must be accessed via SSH tunnel:
43
+ # ssh -L 8090:127.0.0.1:8090 <vps> then open http://localhost:8090/_/
44
+ - hostname: monitor.CHANGEME_DOMAIN
45
+ path: /_/*
46
+ service: http_status:404
42
47
  - hostname: monitor.CHANGEME_DOMAIN
43
48
  service: http://exe-monitor-hub:8090
44
49
  # Auth (GoTrue)
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  registryProxyOptionsFromEnv,
4
4
  runRegistryProxy
5
- } from "../chunk-SVXDCELZ.js";
5
+ } from "../chunk-SHN5O73O.js";
6
6
  import {
7
7
  isMainModule
8
8
  } from "../chunk-6Y4B3QF6.js";
@@ -10,7 +10,7 @@ import {
10
10
  loadStackManifest,
11
11
  patchEnv,
12
12
  runStackUpdate
13
- } from "../chunk-ITZVPCBQ.js";
13
+ } from "../chunk-BYCNUKII.js";
14
14
  import {
15
15
  runVerifyStack
16
16
  } from "../chunk-IRHNV4GY.js";
@@ -20,7 +20,7 @@ import {
20
20
  import {
21
21
  logResult,
22
22
  runHealthGate
23
- } from "../chunk-UIRWDGMB.js";
23
+ } from "../chunk-TD5CADZ5.js";
24
24
  import "../chunk-MOZ2YQ54.js";
25
25
  import "../chunk-VXIMSRTO.js";
26
26
  import "../chunk-LYH5HE24.js";
@@ -562,8 +562,32 @@ function printHostReport(report) {
562
562
  if (report.envRemainingPlaceholders.length > 0) console.log(` Remaining placeholders: ${report.envRemainingPlaceholders.join(", ")}`);
563
563
  console.log("");
564
564
  }
565
+ function readKeyFromEnvFile(envFile, key) {
566
+ try {
567
+ const raw = readFileSync2(envFile, "utf8");
568
+ for (const line of raw.split(/\r?\n/)) {
569
+ const trimmed = line.trim();
570
+ if (trimmed.startsWith("#") || !trimmed) continue;
571
+ const idx = trimmed.indexOf("=");
572
+ if (idx <= 0) continue;
573
+ if (trimmed.slice(0, idx).trim() === key) {
574
+ const value = trimmed.slice(idx + 1).trim();
575
+ return value && !/CHANGEME/.test(value) ? value : void 0;
576
+ }
577
+ }
578
+ } catch {
579
+ }
580
+ return void 0;
581
+ }
565
582
  async function main(args = process.argv.slice(2)) {
566
583
  const opts = parseArgs(args);
584
+ if (!opts.licenseKey && existsSync2(opts.envFile)) {
585
+ const stackLicense = readKeyFromEnvFile(opts.envFile, "EXE_LICENSE_KEY");
586
+ if (stackLicense) {
587
+ opts.licenseKey = stackLicense;
588
+ if (!opts.manifestAuthToken) opts.manifestAuthToken = stackLicense;
589
+ }
590
+ }
567
591
  let usingPackagedCheckTemplates = false;
568
592
  if (opts.check && !opts.noBootstrap && !existsForCli(opts.composeFile) && !existsForCli(opts.envFile)) {
569
593
  const packageRoot = path2.resolve(new URL("../..", import.meta.url).pathname);
@@ -8,7 +8,7 @@ import {
8
8
  logResult,
9
9
  main,
10
10
  runHealthGate
11
- } from "../chunk-UIRWDGMB.js";
11
+ } from "../chunk-TD5CADZ5.js";
12
12
  import "../chunk-MLKGABMK.js";
13
13
  export {
14
14
  checkCRM,
@@ -711,6 +711,20 @@ async function runStackUpdate(options) {
711
711
  }
712
712
  }
713
713
  }
714
+ if (!creds) {
715
+ const sampleImage = Object.values(plan.release.services)[0]?.image ?? "";
716
+ if (sampleImage.startsWith("update.askexe.com")) {
717
+ const stackEnvPullTokensRaw = process.env.EXE_REGISTRY_PROXY_PULL_TOKENS || (existsSync(options.envFile) ? (() => {
718
+ const envMap = parseEnv(readFileSync(options.envFile, "utf8"));
719
+ return envMap.get("EXE_REGISTRY_PROXY_PULL_TOKENS") ?? "";
720
+ })() : "");
721
+ const firstPullToken = stackEnvPullTokensRaw.split(/[\n,]/).map((s) => s.trim()).find(Boolean);
722
+ if (firstPullToken) {
723
+ creds = { registry: "update.askexe.com", username: "token", password: firstPullToken };
724
+ console.log("[stack-update] Using EXE_REGISTRY_PROXY_PULL_TOKENS for update.askexe.com registry auth.");
725
+ }
726
+ }
727
+ }
714
728
  if (!creds) {
715
729
  const sampleImage = Object.values(plan.release.services)[0]?.image ?? "";
716
730
  if (sampleImage.startsWith("update.askexe.com")) {
@@ -14,19 +14,39 @@ function registryProxyOptionsFromEnv(env = process.env) {
14
14
  upstreamUsername: env.EXE_REGISTRY_PROXY_UPSTREAM_USERNAME || env.GHCR_USERNAME || "askexe",
15
15
  upstreamToken,
16
16
  pullTokens,
17
- allowedNamespace: env.EXE_REGISTRY_PROXY_ALLOWED_NAMESPACE || "askexe"
17
+ allowedNamespace: env.EXE_REGISTRY_PROXY_ALLOWED_NAMESPACE || "askexe",
18
+ licenseValidatorUrl: env.EXE_REGISTRY_PROXY_LICENSE_VALIDATOR_URL || ""
18
19
  };
19
20
  }
20
21
  function assertRegistryProxyConfig(options) {
21
22
  if (!options.upstreamToken) throw new Error("EXE_REGISTRY_PROXY_UPSTREAM_TOKEN or GHCR_TOKEN is required");
22
- if (options.pullTokens.length === 0) throw new Error("EXE_REGISTRY_PROXY_PULL_TOKENS is required");
23
- if (!options.allowedNamespace || !/^[a-z0-9._-]+$/i.test(options.allowedNamespace)) {
23
+ if (options.pullTokens.length === 0 && !options.licenseValidatorUrl) {
24
+ throw new Error("EXE_REGISTRY_PROXY_PULL_TOKENS or EXE_REGISTRY_PROXY_LICENSE_VALIDATOR_URL is required");
25
+ }
26
+ const namespace = options.allowedNamespace ?? "askexe";
27
+ if (!/^[a-z0-9._-]+$/i.test(namespace)) {
24
28
  throw new Error("EXE_REGISTRY_PROXY_ALLOWED_NAMESPACE must be a registry-safe namespace");
25
29
  }
26
30
  }
27
31
  function timingSafeIncludes(values, candidate) {
28
32
  return values.some((value) => value === candidate);
29
33
  }
34
+ function isLicenseKeyFormat(value) {
35
+ return value.startsWith("exe_sk_") || value.startsWith("exe_lk_");
36
+ }
37
+ async function validateLicenseKey(licenseKey, validatorUrl) {
38
+ try {
39
+ const res = await fetch(validatorUrl, {
40
+ method: "POST",
41
+ headers: { "content-type": "application/json" },
42
+ body: JSON.stringify({ licenseKey }),
43
+ signal: AbortSignal.timeout(5e3)
44
+ });
45
+ return res.ok;
46
+ } catch {
47
+ return false;
48
+ }
49
+ }
30
50
  function parseBasicAuth(header) {
31
51
  if (!header?.startsWith("Basic ")) return null;
32
52
  try {
@@ -112,10 +132,18 @@ function createRegistryProxyServer(options) {
112
132
  return;
113
133
  }
114
134
  const auth = parseBasicAuth(req.headers.authorization);
115
- if (!auth || !timingSafeIncludes(options.pullTokens, auth.password)) {
135
+ if (!auth) {
116
136
  unauthorized(res);
117
137
  return;
118
138
  }
139
+ const isPullToken = timingSafeIncludes(options.pullTokens, auth.password);
140
+ if (!isPullToken) {
141
+ const licenseOk = options.licenseValidatorUrl && isLicenseKeyFormat(auth.password) ? await validateLicenseKey(auth.password, options.licenseValidatorUrl) : false;
142
+ if (!licenseOk) {
143
+ unauthorized(res);
144
+ return;
145
+ }
146
+ }
119
147
  const upstreamUrl = new URL(requestUrl.pathname + requestUrl.search, upstream.origin);
120
148
  const headers = new Headers();
121
149
  for (const [key, value] of Object.entries(req.headers)) {
@@ -204,7 +204,7 @@ async function main(args) {
204
204
  console.log("[health-gate] Starting rollback...");
205
205
  restorePreDeployBackup();
206
206
  try {
207
- const { rollbackStackUpdate, defaultStackPaths } = await import("./stack-update-JIWJGGLX.js");
207
+ const { rollbackStackUpdate, defaultStackPaths } = await import("./stack-update-7F2E2MBJ.js");
208
208
  const paths = defaultStackPaths();
209
209
  await rollbackStackUpdate({
210
210
  manifestRef: paths.manifestRef,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-06-09T10:58:51.886Z",
3
+ "generatedAt": "2026-06-09T11:17:57.737Z",
4
4
  "hashes": {
5
5
  "bug-report-worker.js": "a6039ded4fe88f726e8abee1943ab0b3eb041caadf6b31c62fdf26cc4b44ed15",
6
6
  "codex-stop-task-finalizer.js": "14c012358cec82d3e45631d8fbf680b5801300dbcacfc518f6db5865160fd8f9",
@@ -4,7 +4,7 @@ import {
4
4
  parsePullTokens,
5
5
  registryProxyOptionsFromEnv,
6
6
  runRegistryProxy
7
- } from "../chunk-SVXDCELZ.js";
7
+ } from "../chunk-SHN5O73O.js";
8
8
  import "../chunk-MLKGABMK.js";
9
9
  export {
10
10
  assertRegistryProxyConfig,
@@ -20,7 +20,7 @@ import {
20
20
  runStackUpdate,
21
21
  verifyReleaseHealth,
22
22
  verifyStackManifestSignature
23
- } from "./chunk-ITZVPCBQ.js";
23
+ } from "./chunk-BYCNUKII.js";
24
24
  import "./chunk-MOZ2YQ54.js";
25
25
  import "./chunk-VXIMSRTO.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.243",
3
+ "version": "0.9.244",
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",
@@ -1,6 +1,106 @@
1
1
  {
2
- "current": "0.9.243",
2
+ "current": "0.9.244",
3
3
  "notes": {
4
+ "0.9.244": {
5
+ "version": "0.9.244",
6
+ "date": "2026-06-09",
7
+ "features": [
8
+ "Entity Profile UI — knowledge graph explorer + entity detail view",
9
+ "log MCP session open/close to stderr for docker logs visibility",
10
+ "Graph→PostgreSQL sync timer — automatic SQLite→exe-db projection",
11
+ "project GraphRAG data to PostgreSQL during cloud sync pull",
12
+ "add behavior effectiveness tracking — attribution, conflicts, scoring, load",
13
+ "close the reinforcement loop — dreaming reads investigation data",
14
+ "add reviews to Cloudflare support system — separate from bugs/features",
15
+ "self-improvement auto-merges simple fixes, notifies on failures",
16
+ "automatic investigation record system for debugging cycle tracking",
17
+ "smoke test + Playwright E2E + self-improvement cron",
18
+ "P0 procedures — verify your own fix + confidence decay",
19
+ "boot output as formatted table with box-drawing characters",
20
+ "show auto-fix cycle status in exe-os boot",
21
+ "graceful daemon restart — persist MCP sessions for transparent recovery",
22
+ "default to keyword+graph search, embeddings opt-in",
23
+ "server-side telemetry storage + admin insights endpoint",
24
+ "enrich telemetry payload with usage counters and auto-insights",
25
+ "add telemetry auto-insight computation engine",
26
+ "auto-calibration in dreaming cycle + telemetry integration",
27
+ "first-class time estimation on tasks — auto-tracked, queryable",
28
+ "add agent assertion system — confidence tracking on task lifecycle",
29
+ "auto-run dreaming cycle on session end — zero-touch self-improvement",
30
+ "add dreaming system + structured handoffs to platform procedures",
31
+ "add snapshot + boot to platform procedures and operating procedures",
32
+ "add `exe-os boot --project X` CLI command for project boot verification"
33
+ ],
34
+ "fixes": [
35
+ "registry proxy accepts license keys + stack-update reads .env license",
36
+ "stack-release uses defaultBranch per repo (wiki uses master)",
37
+ "prevent stale task intercom prompts",
38
+ "v0.9.241 — 13 more bug fixes (28 total this session)",
39
+ "sync lockfile for Docker build — npm ci --omit=dev works again",
40
+ "keep review notifications session-local and test-safe",
41
+ "CI Dockerfile reference — Dockerfile.exed → Dockerfile.exe-os",
42
+ "v0.9.240 — 15 bug fixes across HYGO, Jack, platform (stack v0.9.15)",
43
+ "keep daemon memory recall FTS bounded",
44
+ "keep daemon cloud sync off CRDT heap path",
45
+ "suppress ENOBUFS in reapers + skip boot-time sync execution",
46
+ "MCP health probe in prompt hook + Docker image build tolerance",
47
+ "plug MCP session memory leak — zombie McpServer instances accumulated",
48
+ "lower RSS watchdog to 1.5/2.5GB + add GC after heavy operations",
49
+ "snapshot crash — daemon fallback + dreaming scope binding",
50
+ "skip duplicate initStore in WS client — prevents 2-8s event loop block",
51
+ "add session scope imports to dreaming, project-boot, telemetry-upload",
52
+ "resolve typecheck errors for npm publish",
53
+ "add setImmediate yields to Graph→PG sync — prevent event loop blocking",
54
+ "convert SQLite short hex IDs to valid UUIDs for PostgreSQL projection",
55
+ "delay initial graph sync tick to 60s + add debug logging",
56
+ "share DB init state between MCP HTTP and timer ticks",
57
+ "allow VPS daemon to run in PostgreSQL-only mode (no encryption key)",
58
+ "detect response body failures — build pass ≠ feature works",
59
+ "coordinators see all tasks cross-session by default"
60
+ ],
61
+ "security": [
62
+ "fix shell injection, SSRF, socket leaks, backup validation",
63
+ "bump v0.9.139 — 2 CRITICAL security fixes, 14 bug fixes, 6 features, customer config preservation",
64
+ "fix 2 CRITICAL + 1 HIGH from post-fix audit",
65
+ "validate X-Agent-Role against roster — prevent privilege escalation",
66
+ "release: stack v0.9.8 — security hardening + Hygo bug fixes",
67
+ "add webhook HMAC-SHA256 validation + disable query param auth in prod",
68
+ "pin GitHub Actions to SHAs, update jose to 6.2.3",
69
+ "harden support intake against abuse and data leakage",
70
+ "bump to v0.9.22 — Codex MCP parity + customer bug fixes + security audit remediation",
71
+ "audit: pre-hygo exe-gateway security report",
72
+ "add SECURITY.md — trust document for pre-install security evaluation",
73
+ "fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
74
+ ],
75
+ "other": [
76
+ "bump v0.9.244",
77
+ "cover registry proxy license auth fallbacks",
78
+ "update release notes for v0.9.243",
79
+ "stack release v0.9.16",
80
+ "bump v0.9.243 for stack release",
81
+ "bump v0.9.242 for stack release",
82
+ "add STACK-RELEASE.md — full release process documentation",
83
+ "claurst competitive analysis — npm distribution + free-tier mode",
84
+ "bump stack.release.json to v0.9.240 for CI image build",
85
+ "update release notes for v0.9.238-239",
86
+ "release: stack v0.9.14 — gateway audit fixes",
87
+ "release: stack v0.9.13 — HYGO deployment readiness",
88
+ "incremental Graph→PG sync — 86K rows → deltas only",
89
+ "batch Graph→PG sync — 500 rows per INSERT instead of row-by-row",
90
+ "consolidate daemon timers into unified orchestration tick (#78)",
91
+ "revise GLiNER — Haiku API now, GLiNER when cost matters",
92
+ "capture GLiNER entity extraction in ARCHITECTURE.md",
93
+ "detailed design system structure + Phase 2 component list",
94
+ "exe-os-design-system — unified design system for all products",
95
+ "GoTrue JWT unified auth architecture — founder directive 2026-06-08",
96
+ "Thread + Graph Discovery architecture — unified knowledge view",
97
+ "move heavy jobs to 9 PM — GraphRAG, skill sweep, backup",
98
+ "Mode 3 Client-Side RAG architecture — memories never leave device",
99
+ "bump to v0.9.230 — P0 WAL backup corruption fix for Jack",
100
+ "bump to v0.9.225"
101
+ ],
102
+ "migration_notes": []
103
+ },
4
104
  "0.9.243": {
5
105
  "version": "0.9.243",
6
106
  "date": "2026-06-09",
@@ -232,34 +332,6 @@
232
332
  "bump to v0.9.230 — P0 WAL backup corruption fix for Jack"
233
333
  ],
234
334
  "migration_notes": []
235
- },
236
- "0.9.228": {
237
- "version": "0.9.228",
238
- "date": "2026-06-08",
239
- "features": [
240
- "default to keyword+graph search, embeddings opt-in",
241
- "server-side telemetry storage + admin insights endpoint",
242
- "enrich telemetry payload with usage counters and auto-insights",
243
- "add telemetry auto-insight computation engine",
244
- "auto-calibration in dreaming cycle + telemetry integration",
245
- "first-class time estimation on tasks — auto-tracked, queryable",
246
- "add agent assertion system — confidence tracking on task lifecycle",
247
- "auto-run dreaming cycle on session end — zero-touch self-improvement",
248
- "add dreaming system + structured handoffs to platform procedures"
249
- ],
250
- "fixes": [
251
- "harden install for first-time VPS users — 5 fragility fixes",
252
- "resolveDataDir finds exe-os install regardless of which user runs it",
253
- "health check uses SUDO_USER home, not /root",
254
- "auto-sudo on Linux when global node_modules needs root",
255
- "improve setup wizard UX — boxed team display, remove Dashboard mode",
256
- "show full license key with --show-full, auto-select default model"
257
- ],
258
- "security": [],
259
- "other": [
260
- "bump to v0.9.225"
261
- ],
262
- "migration_notes": []
263
335
  }
264
336
  }
265
337
  }