@farazirfan/costar-server-executor 1.7.0 → 1.7.2

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.
@@ -27,6 +27,11 @@ export type UpdateCheckResult = {
27
27
  export declare function compareSemverStrings(a: string | null, b: string | null): number | null;
28
28
  /**
29
29
  * Get current version from package.json
30
+ *
31
+ * Resolution order:
32
+ * 1. package.json relative to this module (works for global npm installs)
33
+ * 2. package.json in process.cwd() (works for local dev / npm start)
34
+ * 3. Falls back to "0.0.0"
30
35
  */
31
36
  export declare function getCurrentVersion(): Promise<string>;
32
37
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../../src/updates/checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAEtD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,aAAa,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,aAAa,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AA2HF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAWtF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAUzD;AAiCD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAqDpC;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACxD,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kDAAkD;IAClD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,0BAA0B,GAAG,IAAI,CA8B5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
1
+ {"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../../src/updates/checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAEtD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,aAAa,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,aAAa,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAqIF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAWtF;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAkBzD;AAiCD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAqDpC;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACxD,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kDAAkD;IAClD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,0BAA0B,GAAG,IAAI,CA8B5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
@@ -7,7 +7,7 @@ import path from "node:path";
7
7
  import os from "node:os";
8
8
  // Check for updates every 24 hours (OpenClaw pattern)
9
9
  const UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
10
- const NPM_PACKAGE_NAME = "costar-server-executor";
10
+ const NPM_PACKAGE_NAME = "@farazirfan/costar-server-executor";
11
11
  /**
12
12
  * Get state directory
13
13
  */
@@ -55,8 +55,16 @@ async function fetchNpmVersion(params) {
55
55
  const ctrl = new AbortController();
56
56
  const timeout = setTimeout(() => ctrl.abort(), timeoutMs);
57
57
  try {
58
- const url = `https://registry.npmjs.org/${NPM_PACKAGE_NAME}/${encodeURIComponent(npmTag)}`;
59
- const res = await fetch(url, { signal: ctrl.signal });
58
+ // Scoped package — encode the package name for the registry URL
59
+ const encodedPkg = NPM_PACKAGE_NAME.replace("/", "%2f");
60
+ const url = `https://registry.npmjs.org/${encodedPkg}/${encodeURIComponent(npmTag)}`;
61
+ // Private package — include auth token if available
62
+ const headers = {};
63
+ const npmToken = process.env.NPM_TOKEN;
64
+ if (npmToken) {
65
+ headers["Authorization"] = `Bearer ${npmToken}`;
66
+ }
67
+ const res = await fetch(url, { signal: ctrl.signal, headers });
60
68
  if (!res.ok) {
61
69
  return { version: null, error: `HTTP ${res.status}` };
62
70
  }
@@ -126,18 +134,32 @@ export function compareSemverStrings(a, b) {
126
134
  }
127
135
  /**
128
136
  * Get current version from package.json
137
+ *
138
+ * Resolution order:
139
+ * 1. package.json relative to this module (works for global npm installs)
140
+ * 2. package.json in process.cwd() (works for local dev / npm start)
141
+ * 3. Falls back to "0.0.0"
129
142
  */
130
143
  export async function getCurrentVersion() {
144
+ // 1. Try relative to this module's location (global npm install)
145
+ try {
146
+ const moduleDir = new URL("../../package.json", import.meta.url);
147
+ const raw = await fs.readFile(moduleDir, "utf-8");
148
+ const pkg = JSON.parse(raw);
149
+ if (pkg.version && pkg.version !== "0.0.0")
150
+ return pkg.version;
151
+ }
152
+ catch { /* continue */ }
153
+ // 2. Try process.cwd() (local dev)
131
154
  try {
132
- // Try to read from package.json in the module root
133
155
  const packageJsonPath = path.join(process.cwd(), "package.json");
134
156
  const raw = await fs.readFile(packageJsonPath, "utf-8");
135
157
  const pkg = JSON.parse(raw);
136
- return pkg.version || "0.0.0";
137
- }
138
- catch {
139
- return "0.0.0";
158
+ if (pkg.version)
159
+ return pkg.version;
140
160
  }
161
+ catch { /* continue */ }
162
+ return "0.0.0";
141
163
  }
142
164
  /**
143
165
  * Check if update check should run
@@ -248,6 +270,6 @@ export function scheduleUpdateCheck(params) {
248
270
  * Get update command for user
249
271
  */
250
272
  export function getUpdateCommand() {
251
- return "npm install -g costar-server-executor@latest";
273
+ return `npm install -g ${NPM_PACKAGE_NAME}@latest`;
252
274
  }
253
275
  //# sourceMappingURL=checker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checker.js","sourceRoot":"","sources":["../../src/updates/checker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checker.js","sourceRoot":"","sources":["../../src/updates/checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAuBzB,sDAAsD;AACtD,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACrD,MAAM,gBAAgB,GAAG,oCAAoC,CAAC;AAE9D;;GAEG;AACH,SAAS,WAAW;IAClB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,mBAAmB,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,SAAS;IACtB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;QACnD,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,UAAU,CAAC,KAAuB;IAC/C,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;IAC5C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,eAAe,CAAC,MAG9B;IACC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;IAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAE1D,IAAI,CAAC;YACH,gEAAgE;YAChE,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,8BAA8B,UAAU,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;YAErF,oDAAoD;YACpD,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;YACvC,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,QAAQ,EAAE,CAAC;YAClD,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAE/D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YACxD,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAC;YACzD,MAAM,OAAO,GAAG,OAAO,IAAI,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YAExE,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/C,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,OAAsB;IAC7C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ,CAAC;QACd;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,OAAsB;IAKzC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mCAAmC;IAC5F,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAE5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,CAAgB,EAAE,CAAgB;IACrE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAE1B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAE5B,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/D,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,iEAAiE;IACjE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACpD,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IAE1B,mCAAmC;IACnC,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACpD,IAAI,GAAG,CAAC,OAAO;YAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IAE1B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,qBAAqB,CAAC,MAGpC;IACC,mBAAmB;IACnB,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAElC,oBAAoB;IACpB,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC;QACjF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mDAAmD;IACnD,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEnF,IAAI,aAAa,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,GAAG,GAAG,aAAa,CAAC;QACpC,IAAI,OAAO,GAAG,wBAAwB,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC,CAAC,mBAAmB;QACnC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAKrC;IACC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;IAE3C,yBAAyB;IACzB,IAAI,CAAC,CAAC,MAAM,qBAAqB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAEjD,gCAAgC;IAChC,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAElE,oCAAoC;IACpC,MAAM,SAAS,GAAqB;QAClC,GAAG,KAAK;QACR,aAAa,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;KAC3C,CAAC;IAEF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,0BAA0B;QAC1B,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB;IACnB,MAAM,GAAG,GAAG,oBAAoB,CAAC,cAAc,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC;IAEhD,2DAA2D;IAC3D,MAAM,YAAY,GAChB,eAAe;QACf,CAAC,KAAK,CAAC,mBAAmB,KAAK,WAAW,CAAC,OAAO;YAChD,KAAK,CAAC,mBAAmB,KAAK,OAAO,CAAC,CAAC;IAE3C,IAAI,YAAY,EAAE,CAAC;QACjB,SAAS,CAAC,mBAAmB,GAAG,WAAW,CAAC,OAAO,CAAC;QACpD,SAAS,CAAC,mBAAmB,GAAG,OAAO,CAAC;IAC1C,CAAC;IAED,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAE5B,OAAO;QACL,eAAe;QACf,cAAc;QACd,aAAa,EAAE,WAAW,CAAC,OAAO;QAClC,OAAO;QACP,YAAY;KACb,CAAC;AACJ,CAAC;AAYD;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkC;IACpE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;IAEvC,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,KAAK,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;aACzD,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,IAAI,MAAM,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBACrC,wCAAwC;gBACxC,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBACpD,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBACnC,CAAC;gBAED,iCAAiC;gBACjC,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;oBAC7C,OAAO,CAAC,GAAG,CAAC,uDAAuD,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;oBAC3F,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,wDAAwD;QAC1D,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,kBAAkB;IAClB,QAAQ,EAAE,CAAC;IAEX,wBAAwB;IACxB,WAAW,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,kBAAkB,gBAAgB,SAAS,CAAC;AACrD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farazirfan/costar-server-executor",
3
- "version": "1.7.0",
3
+ "version": "1.7.2",
4
4
  "description": "CoStar Server Executor - 24/7 autonomous agent in TypeScript (cloned from OpenClaw)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/public/index.html CHANGED
@@ -93,6 +93,51 @@
93
93
  margin-top: 2px;
94
94
  }
95
95
 
96
+ .sidebar-logo .version span {
97
+ color: var(--accent);
98
+ font-family: var(--mono);
99
+ font-size: 10px;
100
+ }
101
+
102
+ .update-banner {
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: space-between;
106
+ background: var(--accent-dim);
107
+ border: 1px solid rgba(99,102,241,.3);
108
+ border-radius: var(--radius);
109
+ padding: 10px 14px;
110
+ margin-bottom: 16px;
111
+ }
112
+
113
+ .update-banner .update-info {
114
+ font-size: 13px;
115
+ color: var(--text-primary);
116
+ }
117
+
118
+ .update-banner .update-info small {
119
+ display: block;
120
+ color: var(--text-secondary);
121
+ font-size: 11px;
122
+ margin-top: 2px;
123
+ }
124
+
125
+ .update-btn {
126
+ background: var(--accent);
127
+ color: white;
128
+ border: none;
129
+ padding: 6px 14px;
130
+ border-radius: var(--radius);
131
+ font-size: 12px;
132
+ font-weight: 600;
133
+ cursor: pointer;
134
+ white-space: nowrap;
135
+ transition: background .15s;
136
+ }
137
+
138
+ .update-btn:hover { background: var(--accent-hover); }
139
+ .update-btn:disabled { opacity: .5; cursor: not-allowed; }
140
+
96
141
  .sidebar-nav {
97
142
  flex: 1;
98
143
  padding: 12px 10px;
@@ -751,7 +796,7 @@
751
796
  <div class="logo-icon">C</div>
752
797
  <div>
753
798
  <h1>CoStar</h1>
754
- <div class="version">Server Executor</div>
799
+ <div class="version">Server Executor <span id="sidebar-version"></span></div>
755
800
  </div>
756
801
  </div>
757
802
 
@@ -816,6 +861,7 @@
816
861
 
817
862
  <!-- ═══ Dashboard Page ═══ -->
818
863
  <div class="page active" id="page-dashboard">
864
+ <div id="update-banner-container"></div>
819
865
  <div class="stat-grid" id="stats-grid">
820
866
  <div class="stat-card">
821
867
  <div class="stat-label">Uptime</div>
@@ -1090,9 +1136,20 @@
1090
1136
  // ─── Dashboard ───────────────────────────────────
1091
1137
  async function loadDashboard() {
1092
1138
  try {
1093
- const status = await api('/api/status');
1139
+ const [status, versionInfo] = await Promise.all([
1140
+ api('/api/status'),
1141
+ api('/api/version').catch(() => null),
1142
+ ]);
1094
1143
  const a = status.agent;
1095
1144
 
1145
+ // Show version in sidebar
1146
+ if (versionInfo?.version) {
1147
+ document.getElementById('sidebar-version').textContent = `v${versionInfo.version}`;
1148
+ }
1149
+
1150
+ // Update banner — check for newer version on npm
1151
+ renderUpdateBanner(versionInfo);
1152
+
1096
1153
  // Stats
1097
1154
  const uptime = formatUptime(a.uptime);
1098
1155
  document.getElementById('stat-uptime').textContent = uptime;
@@ -1113,6 +1170,8 @@
1113
1170
  // System info
1114
1171
  const info = document.getElementById('system-info');
1115
1172
  info.innerHTML = [
1173
+ row('Version', versionInfo?.version ? `v${versionInfo.version}` : '--'),
1174
+ row('Auto-Update', versionInfo?.autoUpdateEnabled ? 'Enabled' : 'Disabled'),
1116
1175
  row('User ID', a.userId),
1117
1176
  row('Workspace', a.workspaceDir),
1118
1177
  row('Node', a.nodeVersion),
@@ -1126,6 +1185,61 @@
1126
1185
  }
1127
1186
  }
1128
1187
 
1188
+ // ─── Update Banner ────────────────────────────────
1189
+ async function renderUpdateBanner(versionInfo) {
1190
+ const container = document.getElementById('update-banner-container');
1191
+ if (!container) return;
1192
+
1193
+ // Always show version + manual update button
1194
+ if (!versionInfo) {
1195
+ container.innerHTML = '';
1196
+ return;
1197
+ }
1198
+
1199
+ const v = esc(versionInfo.version || 'unknown');
1200
+ const autoUpdate = versionInfo.autoUpdateEnabled;
1201
+ const updating = versionInfo.updateInProgress;
1202
+
1203
+ container.innerHTML = `
1204
+ <div class="update-banner">
1205
+ <div class="update-info">
1206
+ Running <strong>v${v}</strong>
1207
+ <small>${autoUpdate ? 'Auto-update enabled — checks every 24h' : 'Auto-update disabled'}</small>
1208
+ </div>
1209
+ <button class="update-btn" id="manual-update-btn" onclick="triggerManualUpdate()" ${updating ? 'disabled' : ''}>
1210
+ ${updating ? 'Updating...' : 'Update Now'}
1211
+ </button>
1212
+ </div>
1213
+ `;
1214
+ }
1215
+
1216
+ async function triggerManualUpdate() {
1217
+ const btn = document.getElementById('manual-update-btn');
1218
+ if (!btn) return;
1219
+
1220
+ btn.disabled = true;
1221
+ btn.textContent = 'Updating...';
1222
+
1223
+ try {
1224
+ const result = await api('/api/update', {
1225
+ method: 'POST',
1226
+ headers: { 'Content-Type': 'application/json' },
1227
+ body: JSON.stringify({ version: 'latest' }),
1228
+ });
1229
+ btn.textContent = 'Restarting...';
1230
+ // The server will restart, so the page will lose connection
1231
+ setTimeout(() => {
1232
+ btn.textContent = 'Reconnecting...';
1233
+ // Try to reload after a delay to reconnect to the new version
1234
+ setTimeout(() => location.reload(), 8000);
1235
+ }, 5000);
1236
+ } catch (err) {
1237
+ btn.disabled = false;
1238
+ btn.textContent = 'Update Failed — Retry';
1239
+ console.error('Update failed:', err);
1240
+ }
1241
+ }
1242
+
1129
1243
  function row(key, value) {
1130
1244
  return `<div class="config-row"><span class="config-key">${esc(key)}</span><span class="config-value">${esc(String(value || '--'))}</span></div>`;
1131
1245
  }