remote-codex 0.1.1 → 0.1.3

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/README.md CHANGED
@@ -43,8 +43,8 @@ remote-codex stop
43
43
 
44
44
  The global CLI starts the production API and web service:
45
45
 
46
- - API: `http://127.0.0.1:8787`
47
- - Web: `http://127.0.0.1:4173`
46
+ - API: `http://127.0.0.1:45674`
47
+ - Web: `http://127.0.0.1:45673`
48
48
  - service logs/state: `~/.remote-codex/service/`
49
49
  - production database: `~/.remote-codex/supervisor.sqlite`
50
50
 
@@ -687,10 +687,10 @@ import os2 from "os";
687
687
  import path2 from "path";
688
688
  import Database from "better-sqlite3";
689
689
 
690
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/better-sqlite3/driver.js
690
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/better-sqlite3/driver.js
691
691
  import Client from "better-sqlite3";
692
692
 
693
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/entity.js
693
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/entity.js
694
694
  var entityKind = /* @__PURE__ */ Symbol.for("drizzle:entityKind");
695
695
  function is(value, type) {
696
696
  if (!value || typeof value !== "object") {
@@ -716,7 +716,7 @@ function is(value, type) {
716
716
  return false;
717
717
  }
718
718
 
719
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/logger.js
719
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/logger.js
720
720
  var ConsoleLogWriter = class {
721
721
  static [entityKind] = "ConsoleLogWriter";
722
722
  write(message) {
@@ -747,10 +747,10 @@ var NoopLogger = class {
747
747
  }
748
748
  };
749
749
 
750
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/table.utils.js
750
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/table.utils.js
751
751
  var TableName = /* @__PURE__ */ Symbol.for("drizzle:Name");
752
752
 
753
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/table.js
753
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/table.js
754
754
  var Schema = /* @__PURE__ */ Symbol.for("drizzle:Schema");
755
755
  var Columns = /* @__PURE__ */ Symbol.for("drizzle:Columns");
756
756
  var ExtraConfigColumns = /* @__PURE__ */ Symbol.for("drizzle:ExtraConfigColumns");
@@ -812,7 +812,7 @@ function getTableUniqueName(table) {
812
812
  return `${table[Schema] ?? "public"}.${table[TableName]}`;
813
813
  }
814
814
 
815
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/column.js
815
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/column.js
816
816
  var Column = class {
817
817
  constructor(table, config) {
818
818
  this.table = table;
@@ -863,7 +863,7 @@ var Column = class {
863
863
  }
864
864
  };
865
865
 
866
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/column-builder.js
866
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/column-builder.js
867
867
  var ColumnBuilder = class {
868
868
  static [entityKind] = "ColumnBuilder";
869
869
  config;
@@ -967,7 +967,7 @@ var ColumnBuilder = class {
967
967
  }
968
968
  };
969
969
 
970
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/pg-core/foreign-keys.js
970
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/pg-core/foreign-keys.js
971
971
  var ForeignKeyBuilder = class {
972
972
  static [entityKind] = "PgForeignKeyBuilder";
973
973
  /** @internal */
@@ -1024,12 +1024,12 @@ var ForeignKey = class {
1024
1024
  }
1025
1025
  };
1026
1026
 
1027
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/tracing-utils.js
1027
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/tracing-utils.js
1028
1028
  function iife(fn, ...args) {
1029
1029
  return fn(...args);
1030
1030
  }
1031
1031
 
1032
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/pg-core/unique-constraint.js
1032
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/pg-core/unique-constraint.js
1033
1033
  function uniqueKeyName(table, columns) {
1034
1034
  return `${table[TableName]}_${columns.join("_")}_unique`;
1035
1035
  }
@@ -1079,7 +1079,7 @@ var UniqueConstraint = class {
1079
1079
  }
1080
1080
  };
1081
1081
 
1082
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/pg-core/utils/array.js
1082
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/pg-core/utils/array.js
1083
1083
  function parsePgArrayValue(arrayString, startFrom, inQuotes) {
1084
1084
  for (let i = startFrom; i < arrayString.length; i++) {
1085
1085
  const char = arrayString[i];
@@ -1155,7 +1155,7 @@ function makePgArray(array) {
1155
1155
  }).join(",")}}`;
1156
1156
  }
1157
1157
 
1158
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/pg-core/columns/common.js
1158
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/pg-core/columns/common.js
1159
1159
  var PgColumnBuilder = class extends ColumnBuilder {
1160
1160
  foreignKeyConfigs = [];
1161
1161
  static [entityKind] = "PgColumnBuilder";
@@ -1340,7 +1340,7 @@ var PgArray = class _PgArray extends PgColumn {
1340
1340
  }
1341
1341
  };
1342
1342
 
1343
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/pg-core/columns/enum.js
1343
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/pg-core/columns/enum.js
1344
1344
  var PgEnumObjectColumnBuilder = class extends PgColumnBuilder {
1345
1345
  static [entityKind] = "PgEnumObjectColumnBuilder";
1346
1346
  constructor(name, enumInstance) {
@@ -1398,7 +1398,7 @@ var PgEnumColumn = class extends PgColumn {
1398
1398
  }
1399
1399
  };
1400
1400
 
1401
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/subquery.js
1401
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/subquery.js
1402
1402
  var Subquery = class {
1403
1403
  static [entityKind] = "Subquery";
1404
1404
  constructor(sql2, selection, alias, isWith = false) {
@@ -1418,10 +1418,10 @@ var WithSubquery = class extends Subquery {
1418
1418
  static [entityKind] = "WithSubquery";
1419
1419
  };
1420
1420
 
1421
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/version.js
1421
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/version.js
1422
1422
  var version = "0.43.1";
1423
1423
 
1424
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/tracing.js
1424
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/tracing.js
1425
1425
  var otel;
1426
1426
  var rawTracer;
1427
1427
  var tracer = {
@@ -1456,10 +1456,10 @@ var tracer = {
1456
1456
  }
1457
1457
  };
1458
1458
 
1459
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/view-common.js
1459
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/view-common.js
1460
1460
  var ViewBaseConfig = /* @__PURE__ */ Symbol.for("drizzle:ViewBaseConfig");
1461
1461
 
1462
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sql/sql.js
1462
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sql/sql.js
1463
1463
  var FakePrimitiveParam = class {
1464
1464
  static [entityKind] = "FakePrimitiveParam";
1465
1465
  };
@@ -1843,7 +1843,7 @@ Subquery.prototype.getSQL = function() {
1843
1843
  return new SQL([this]);
1844
1844
  };
1845
1845
 
1846
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/utils.js
1846
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/utils.js
1847
1847
  function mapResultRow(columns, row, joinsNotNullableMap) {
1848
1848
  const nullifyMap = {};
1849
1849
  const result = columns.reduce(
@@ -2001,7 +2001,7 @@ function isConfig(data) {
2001
2001
  return false;
2002
2002
  }
2003
2003
 
2004
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/pg-core/table.js
2004
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/pg-core/table.js
2005
2005
  var InlineForeignKeys = /* @__PURE__ */ Symbol.for("drizzle:PgInlineForeignKeys");
2006
2006
  var EnableRLS = /* @__PURE__ */ Symbol.for("drizzle:EnableRLS");
2007
2007
  var PgTable = class extends Table {
@@ -2021,7 +2021,7 @@ var PgTable = class extends Table {
2021
2021
  [Table.Symbol.ExtraConfigColumns] = {};
2022
2022
  };
2023
2023
 
2024
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/pg-core/primary-keys.js
2024
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/pg-core/primary-keys.js
2025
2025
  var PrimaryKeyBuilder = class {
2026
2026
  static [entityKind] = "PgPrimaryKeyBuilder";
2027
2027
  /** @internal */
@@ -2051,7 +2051,7 @@ var PrimaryKey = class {
2051
2051
  }
2052
2052
  };
2053
2053
 
2054
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sql/expressions/conditions.js
2054
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sql/expressions/conditions.js
2055
2055
  function bindIfParam(value, column) {
2056
2056
  if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {
2057
2057
  return new Param(value, column);
@@ -2166,7 +2166,7 @@ function notIlike(column, value) {
2166
2166
  return sql`${column} not ilike ${value}`;
2167
2167
  }
2168
2168
 
2169
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sql/expressions/select.js
2169
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sql/expressions/select.js
2170
2170
  function asc(column) {
2171
2171
  return sql`${column} asc`;
2172
2172
  }
@@ -2174,7 +2174,7 @@ function desc(column) {
2174
2174
  return sql`${column} desc`;
2175
2175
  }
2176
2176
 
2177
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/relations.js
2177
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/relations.js
2178
2178
  var Relation = class {
2179
2179
  constructor(sourceTable, referencedTable, relationName) {
2180
2180
  this.sourceTable = sourceTable;
@@ -2435,7 +2435,7 @@ function mapRelationalRow(tablesConfig, tableConfig, row, buildQueryResultSelect
2435
2435
  return result;
2436
2436
  }
2437
2437
 
2438
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/alias.js
2438
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/alias.js
2439
2439
  var ColumnAliasProxyHandler = class {
2440
2440
  constructor(table) {
2441
2441
  this.table = table;
@@ -2531,7 +2531,7 @@ function mapColumnsInSQLToAlias(query, alias) {
2531
2531
  }));
2532
2532
  }
2533
2533
 
2534
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/selection-proxy.js
2534
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/selection-proxy.js
2535
2535
  var SelectionProxyHandler = class _SelectionProxyHandler {
2536
2536
  static [entityKind] = "SelectionProxyHandler";
2537
2537
  config;
@@ -2599,7 +2599,7 @@ var SelectionProxyHandler = class _SelectionProxyHandler {
2599
2599
  }
2600
2600
  };
2601
2601
 
2602
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/query-promise.js
2602
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/query-promise.js
2603
2603
  var QueryPromise = class {
2604
2604
  static [entityKind] = "QueryPromise";
2605
2605
  [Symbol.toStringTag] = "QueryPromise";
@@ -2623,7 +2623,7 @@ var QueryPromise = class {
2623
2623
  }
2624
2624
  };
2625
2625
 
2626
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/foreign-keys.js
2626
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/foreign-keys.js
2627
2627
  var ForeignKeyBuilder2 = class {
2628
2628
  static [entityKind] = "SQLiteForeignKeyBuilder";
2629
2629
  /** @internal */
@@ -2680,7 +2680,7 @@ var ForeignKey2 = class {
2680
2680
  }
2681
2681
  };
2682
2682
 
2683
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/unique-constraint.js
2683
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/unique-constraint.js
2684
2684
  function uniqueKeyName2(table, columns) {
2685
2685
  return `${table[TableName]}_${columns.join("_")}_unique`;
2686
2686
  }
@@ -2722,7 +2722,7 @@ var UniqueConstraint2 = class {
2722
2722
  }
2723
2723
  };
2724
2724
 
2725
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/columns/common.js
2725
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/columns/common.js
2726
2726
  var SQLiteColumnBuilder = class extends ColumnBuilder {
2727
2727
  static [entityKind] = "SQLiteColumnBuilder";
2728
2728
  foreignKeyConfigs = [];
@@ -2773,7 +2773,7 @@ var SQLiteColumn = class extends Column {
2773
2773
  static [entityKind] = "SQLiteColumn";
2774
2774
  };
2775
2775
 
2776
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/columns/blob.js
2776
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/columns/blob.js
2777
2777
  var SQLiteBigIntBuilder = class extends SQLiteColumnBuilder {
2778
2778
  static [entityKind] = "SQLiteBigIntBuilder";
2779
2779
  constructor(name) {
@@ -2868,7 +2868,7 @@ function blob(a, b) {
2868
2868
  return new SQLiteBlobBufferBuilder(name);
2869
2869
  }
2870
2870
 
2871
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/columns/custom.js
2871
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/columns/custom.js
2872
2872
  var SQLiteCustomColumnBuilder = class extends SQLiteColumnBuilder {
2873
2873
  static [entityKind] = "SQLiteCustomColumnBuilder";
2874
2874
  constructor(name, fieldConfig, customTypeParams) {
@@ -2916,7 +2916,7 @@ function customType(customTypeParams) {
2916
2916
  };
2917
2917
  }
2918
2918
 
2919
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/columns/integer.js
2919
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/columns/integer.js
2920
2920
  var SQLiteBaseIntegerBuilder = class extends SQLiteColumnBuilder {
2921
2921
  static [entityKind] = "SQLiteBaseIntegerBuilder";
2922
2922
  constructor(name, dataType, columnType) {
@@ -3025,7 +3025,7 @@ function integer(a, b) {
3025
3025
  return new SQLiteIntegerBuilder(name);
3026
3026
  }
3027
3027
 
3028
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/columns/numeric.js
3028
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/columns/numeric.js
3029
3029
  var SQLiteNumericBuilder = class extends SQLiteColumnBuilder {
3030
3030
  static [entityKind] = "SQLiteNumericBuilder";
3031
3031
  constructor(name) {
@@ -3102,7 +3102,7 @@ function numeric(a, b) {
3102
3102
  return mode === "number" ? new SQLiteNumericNumberBuilder(name) : mode === "bigint" ? new SQLiteNumericBigIntBuilder(name) : new SQLiteNumericBuilder(name);
3103
3103
  }
3104
3104
 
3105
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/columns/real.js
3105
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/columns/real.js
3106
3106
  var SQLiteRealBuilder = class extends SQLiteColumnBuilder {
3107
3107
  static [entityKind] = "SQLiteRealBuilder";
3108
3108
  constructor(name) {
@@ -3123,7 +3123,7 @@ function real(name) {
3123
3123
  return new SQLiteRealBuilder(name ?? "");
3124
3124
  }
3125
3125
 
3126
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/columns/text.js
3126
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/columns/text.js
3127
3127
  var SQLiteTextBuilder = class extends SQLiteColumnBuilder {
3128
3128
  static [entityKind] = "SQLiteTextBuilder";
3129
3129
  constructor(name, config) {
@@ -3183,7 +3183,7 @@ function text(a, b = {}) {
3183
3183
  return new SQLiteTextBuilder(name, config);
3184
3184
  }
3185
3185
 
3186
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/columns/all.js
3186
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/columns/all.js
3187
3187
  function getSQLiteColumnBuilders() {
3188
3188
  return {
3189
3189
  blob,
@@ -3195,7 +3195,7 @@ function getSQLiteColumnBuilders() {
3195
3195
  };
3196
3196
  }
3197
3197
 
3198
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/table.js
3198
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/table.js
3199
3199
  var InlineForeignKeys2 = /* @__PURE__ */ Symbol.for("drizzle:SQLiteInlineForeignKeys");
3200
3200
  var SQLiteTable = class extends Table {
3201
3201
  static [entityKind] = "SQLiteTable";
@@ -3234,7 +3234,7 @@ var sqliteTable = (name, columns, extraConfig) => {
3234
3234
  return sqliteTableBase(name, columns, extraConfig);
3235
3235
  };
3236
3236
 
3237
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js
3237
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js
3238
3238
  var SQLiteDeleteBase = class extends QueryPromise {
3239
3239
  constructor(table, session, dialect, withList) {
3240
3240
  super();
@@ -3343,7 +3343,7 @@ var SQLiteDeleteBase = class extends QueryPromise {
3343
3343
  }
3344
3344
  };
3345
3345
 
3346
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/casing.js
3346
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/casing.js
3347
3347
  function toSnakeCase(input) {
3348
3348
  const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
3349
3349
  return words.map((word) => word.toLowerCase()).join("_");
@@ -3396,7 +3396,7 @@ var CasingCache = class {
3396
3396
  }
3397
3397
  };
3398
3398
 
3399
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/errors.js
3399
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/errors.js
3400
3400
  var DrizzleError = class extends Error {
3401
3401
  static [entityKind] = "DrizzleError";
3402
3402
  constructor({ message, cause }) {
@@ -3412,12 +3412,12 @@ var TransactionRollbackError = class extends DrizzleError {
3412
3412
  }
3413
3413
  };
3414
3414
 
3415
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/view-base.js
3415
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/view-base.js
3416
3416
  var SQLiteViewBase = class extends View {
3417
3417
  static [entityKind] = "SQLiteViewBase";
3418
3418
  };
3419
3419
 
3420
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/dialect.js
3420
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/dialect.js
3421
3421
  var SQLiteDialect = class {
3422
3422
  static [entityKind] = "SQLiteDialect";
3423
3423
  /** @internal */
@@ -4037,7 +4037,7 @@ var SQLiteAsyncDialect = class extends SQLiteDialect {
4037
4037
  }
4038
4038
  };
4039
4039
 
4040
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/query-builders/query-builder.js
4040
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/query-builders/query-builder.js
4041
4041
  var TypedQueryBuilder = class {
4042
4042
  static [entityKind] = "TypedQueryBuilder";
4043
4043
  /** @internal */
@@ -4046,7 +4046,7 @@ var TypedQueryBuilder = class {
4046
4046
  }
4047
4047
  };
4048
4048
 
4049
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/select.js
4049
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/select.js
4050
4050
  var SQLiteSelectBuilder = class {
4051
4051
  static [entityKind] = "SQLiteSelectBuilder";
4052
4052
  fields;
@@ -4687,7 +4687,7 @@ var unionAll = createSetOperator("union", true);
4687
4687
  var intersect = createSetOperator("intersect", false);
4688
4688
  var except = createSetOperator("except", false);
4689
4689
 
4690
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js
4690
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js
4691
4691
  var QueryBuilder = class {
4692
4692
  static [entityKind] = "SQLiteQueryBuilder";
4693
4693
  dialect;
@@ -4755,7 +4755,7 @@ var QueryBuilder = class {
4755
4755
  }
4756
4756
  };
4757
4757
 
4758
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js
4758
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js
4759
4759
  var SQLiteInsertBuilder = class {
4760
4760
  constructor(table, session, dialect, withList) {
4761
4761
  this.table = table;
@@ -4925,7 +4925,7 @@ var SQLiteInsertBase = class extends QueryPromise {
4925
4925
  }
4926
4926
  };
4927
4927
 
4928
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/update.js
4928
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/update.js
4929
4929
  var SQLiteUpdateBuilder = class {
4930
4930
  constructor(table, session, dialect, withList) {
4931
4931
  this.table = table;
@@ -5086,7 +5086,7 @@ var SQLiteUpdateBase = class extends QueryPromise {
5086
5086
  }
5087
5087
  };
5088
5088
 
5089
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/count.js
5089
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/count.js
5090
5090
  var SQLiteCountBuilder = class _SQLiteCountBuilder extends SQL {
5091
5091
  constructor(params) {
5092
5092
  super(_SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);
@@ -5130,7 +5130,7 @@ var SQLiteCountBuilder = class _SQLiteCountBuilder extends SQL {
5130
5130
  }
5131
5131
  };
5132
5132
 
5133
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/query.js
5133
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/query.js
5134
5134
  var RelationalQueryBuilder = class {
5135
5135
  constructor(mode, fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session) {
5136
5136
  this.mode = mode;
@@ -5274,7 +5274,7 @@ var SQLiteSyncRelationalQuery = class extends SQLiteRelationalQuery {
5274
5274
  }
5275
5275
  };
5276
5276
 
5277
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js
5277
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js
5278
5278
  var SQLiteRaw = class extends QueryPromise {
5279
5279
  constructor(execute, getSQL, action, dialect, mapBatchResult) {
5280
5280
  super();
@@ -5302,7 +5302,7 @@ var SQLiteRaw = class extends QueryPromise {
5302
5302
  }
5303
5303
  };
5304
5304
 
5305
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/db.js
5305
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/db.js
5306
5306
  var BaseSQLiteDatabase = class {
5307
5307
  constructor(resultKind, dialect, session, schema) {
5308
5308
  this.resultKind = resultKind;
@@ -5590,7 +5590,7 @@ var BaseSQLiteDatabase = class {
5590
5590
  }
5591
5591
  };
5592
5592
 
5593
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/indexes.js
5593
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/indexes.js
5594
5594
  var IndexBuilderOn = class {
5595
5595
  constructor(name, unique) {
5596
5596
  this.name = name;
@@ -5636,7 +5636,7 @@ function uniqueIndex(name) {
5636
5636
  return new IndexBuilderOn(name, true);
5637
5637
  }
5638
5638
 
5639
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/sqlite-core/session.js
5639
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/sqlite-core/session.js
5640
5640
  var ExecuteResultSync = class extends QueryPromise {
5641
5641
  constructor(resultCb) {
5642
5642
  super();
@@ -5749,7 +5749,7 @@ var SQLiteTransaction = class extends BaseSQLiteDatabase {
5749
5749
  }
5750
5750
  };
5751
5751
 
5752
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/better-sqlite3/session.js
5752
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/better-sqlite3/session.js
5753
5753
  var BetterSQLiteSession = class extends SQLiteSession {
5754
5754
  constructor(client, dialect, schema, options = {}) {
5755
5755
  super(dialect);
@@ -5848,7 +5848,7 @@ var PreparedQuery = class extends SQLitePreparedQuery {
5848
5848
  }
5849
5849
  };
5850
5850
 
5851
- // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@11.10.0/node_modules/drizzle-orm/better-sqlite3/driver.js
5851
+ // ../../node_modules/.pnpm/drizzle-orm@0.43.1_@types+better-sqlite3@7.6.13_better-sqlite3@12.10.0/node_modules/drizzle-orm/better-sqlite3/driver.js
5852
5852
  var BetterSQLite3Database = class extends BaseSQLiteDatabase {
5853
5853
  static [entityKind] = "BetterSQLite3Database";
5854
5854
  };
@@ -7034,7 +7034,7 @@ import path8 from "path";
7034
7034
 
7035
7035
  // src/exports/thread-pdf-export.ts
7036
7036
  import fs5 from "fs";
7037
- import puppeteer from "puppeteer";
7037
+ import puppeteer from "puppeteer-core";
7038
7038
  import { marked } from "marked";
7039
7039
  var MAX_TEXT_CHARS = 12e3;
7040
7040
  var MAX_COMMAND_OUTPUT_CHARS = 2400;
@@ -7046,6 +7046,7 @@ var EMBEDDED_CJK_FONT_CANDIDATES = [
7046
7046
  { path: "/mnt/c/Windows/Fonts/Deng.ttf", format: "truetype", weight: 400 },
7047
7047
  { path: "/mnt/c/Windows/Fonts/msyh.ttc", format: "truetype", weight: 400 }
7048
7048
  ];
7049
+ var PUPPETEER_CHANNEL = "chrome";
7049
7050
  var embeddedCjkFontCss = null;
7050
7051
  function escapeHtml(value) {
7051
7052
  return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
@@ -8073,10 +8074,7 @@ endobj
8073
8074
  `
8074
8075
  );
8075
8076
  }
8076
- const browser = await puppeteer.launch({
8077
- headless: true,
8078
- args: ["--no-sandbox", "--disable-setuid-sandbox", "--font-render-hinting=none"]
8079
- });
8077
+ const browser = await launchPdfBrowser();
8080
8078
  try {
8081
8079
  const page = await browser.newPage();
8082
8080
  await page.setContent(renderThreadExportHtml(snapshot), {
@@ -8093,6 +8091,25 @@ endobj
8093
8091
  await browser.close();
8094
8092
  }
8095
8093
  }
8094
+ async function launchPdfBrowser() {
8095
+ const launchOptions = {
8096
+ headless: true,
8097
+ args: ["--no-sandbox", "--disable-setuid-sandbox", "--font-render-hinting=none"]
8098
+ };
8099
+ if (process.env.PUPPETEER_EXECUTABLE_PATH) {
8100
+ launchOptions.executablePath = process.env.PUPPETEER_EXECUTABLE_PATH;
8101
+ } else {
8102
+ launchOptions.channel = PUPPETEER_CHANNEL;
8103
+ }
8104
+ try {
8105
+ return await puppeteer.launch(launchOptions);
8106
+ } catch (error) {
8107
+ const detail = error instanceof Error ? error.message : String(error);
8108
+ throw new Error(
8109
+ `PDF export requires a local Chrome installation. Install Google Chrome, or set PUPPETEER_EXECUTABLE_PATH to a Chromium-compatible browser executable. ${detail}`
8110
+ );
8111
+ }
8112
+ }
8096
8113
 
8097
8114
  // src/codex/codexHostConfig.ts
8098
8115
  import fs6 from "fs";
@@ -9,6 +9,11 @@ const binDir = path.dirname(fileURLToPath(import.meta.url));
9
9
  const packageRoot = path.resolve(binDir, '..');
10
10
  const packageJsonPath = path.join(packageRoot, 'package.json');
11
11
  const serviceManagerPath = path.join(packageRoot, 'scripts', 'service-manager.mjs');
12
+ const sourceCheckout =
13
+ fs.existsSync(path.join(packageRoot, 'pnpm-workspace.yaml')) &&
14
+ fs.existsSync(path.join(packageRoot, 'scripts', 'service-restart.mjs'));
15
+ const defaultServicePort = sourceCheckout ? 4173 : 45673;
16
+ const defaultApiPort = sourceCheckout ? 8787 : 45674;
12
17
 
13
18
  const aliases = new Map([
14
19
  ['service:start', 'start'],
@@ -84,9 +89,9 @@ Usage:
84
89
 
85
90
  Environment:
86
91
  SERVICE_HOST Web listen host, default 127.0.0.1
87
- SERVICE_PORT Web listen port, default 4173
92
+ SERVICE_PORT Web listen port, default ${defaultServicePort}
88
93
  SERVICE_API_HOST API listen host, default 127.0.0.1
89
- SERVICE_API_PORT API listen port, default 8787
94
+ SERVICE_API_PORT API listen port, default ${defaultApiPort}
90
95
  REMOTE_CODEX_SERVICE_DIR Service state and log directory, default ~/.remote-codex/service
91
96
  `);
92
97
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remote-codex",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Local web supervisor for Codex workspaces and threads.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -19,8 +19,7 @@
19
19
  "pnpm": {
20
20
  "onlyBuiltDependencies": [
21
21
  "better-sqlite3",
22
- "esbuild",
23
- "puppeteer"
22
+ "esbuild"
24
23
  ]
25
24
  },
26
25
  "engines": {
@@ -52,7 +51,7 @@
52
51
  "better-sqlite3": "^12.10.0",
53
52
  "fastify": "^5.2.1",
54
53
  "marked": "^18.0.3",
55
- "puppeteer": "^24.43.1",
54
+ "puppeteer-core": "^24.43.1",
56
55
  "zod": "^3.24.2"
57
56
  },
58
57
  "devDependencies": {
@@ -7,11 +7,16 @@ import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const scriptDir = path.dirname(fileURLToPath(import.meta.url));
9
9
  const repoRoot = path.resolve(scriptDir, '..');
10
+ const sourceCheckout =
11
+ fs.existsSync(path.join(repoRoot, 'pnpm-workspace.yaml')) &&
12
+ fs.existsSync(path.join(repoRoot, 'scripts', 'service-restart.mjs'));
13
+ const defaultServicePort = sourceCheckout ? 4173 : 45673;
14
+ const defaultApiPort = sourceCheckout ? 8787 : 45674;
10
15
 
11
16
  const serviceHost = process.env.SERVICE_HOST ?? '127.0.0.1';
12
- const servicePort = parsePort(process.env.SERVICE_PORT, 4173);
17
+ const servicePort = parsePort(process.env.SERVICE_PORT, defaultServicePort);
13
18
  const apiHost = process.env.SERVICE_API_HOST ?? '127.0.0.1';
14
- const apiPort = parsePort(process.env.SERVICE_API_PORT, 8787);
19
+ const apiPort = parsePort(process.env.SERVICE_API_PORT, defaultApiPort);
15
20
  const distDir = path.resolve(
16
21
  process.env.SERVICE_WEB_DIST_DIR ?? path.join(repoRoot, 'apps/supervisor-web/dist')
17
22
  );
@@ -4,6 +4,7 @@ import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { spawn } from 'node:child_process';
6
6
  import { fileURLToPath } from 'node:url';
7
+ import net from 'node:net';
7
8
 
8
9
  const scriptDir = path.dirname(fileURLToPath(import.meta.url));
9
10
  const repoRoot = path.resolve(scriptDir, '..');
@@ -17,11 +18,13 @@ const webIndex = path.join(repoRoot, 'apps', 'supervisor-web', 'dist', 'index.ht
17
18
  const supportsSourceRestart =
18
19
  fs.existsSync(path.join(repoRoot, 'pnpm-workspace.yaml')) &&
19
20
  fs.existsSync(path.join(repoRoot, 'scripts', 'service-restart.mjs'));
21
+ const defaultServicePort = supportsSourceRestart ? 4173 : 45673;
22
+ const defaultApiPort = supportsSourceRestart ? 8787 : 45674;
20
23
 
21
24
  const serviceHost = process.env.SERVICE_HOST ?? '127.0.0.1';
22
- const servicePort = parsePort(process.env.SERVICE_PORT, 4173);
25
+ const servicePort = parsePort(process.env.SERVICE_PORT, defaultServicePort);
23
26
  const apiHost = process.env.SERVICE_API_HOST ?? '127.0.0.1';
24
- const apiPort = parsePort(process.env.SERVICE_API_PORT, 8787);
27
+ const apiPort = parsePort(process.env.SERVICE_API_PORT, defaultApiPort);
25
28
 
26
29
  const command = process.argv[2];
27
30
 
@@ -58,6 +61,10 @@ async function startService() {
58
61
  const webLogPath = path.join(serviceDir, 'web.log');
59
62
  prepareLogFile(apiLogPath);
60
63
  prepareLogFile(webLogPath);
64
+
65
+ await assertTcpPortAvailable(apiHost, apiPort, 'API');
66
+ await assertTcpPortAvailable(serviceHost, servicePort, 'Web');
67
+
61
68
  const apiPid = spawnDetached(process.execPath, [apiEntry], apiLogPath, {
62
69
  NODE_ENV: 'production',
63
70
  HOST: apiHost,
@@ -73,7 +80,7 @@ async function startService() {
73
80
  await waitForHttp(`http://${apiHost}:${apiPort}/healthz`, apiPid, 15_000);
74
81
  } catch (error) {
75
82
  stopPid(apiPid);
76
- throw error;
83
+ throw appendLogTail(error, apiLogPath, 'API');
77
84
  }
78
85
 
79
86
  const webPid = spawnDetached(process.execPath, [webEntry], webLogPath, {
@@ -89,7 +96,7 @@ async function startService() {
89
96
  } catch (error) {
90
97
  stopPid(webPid);
91
98
  stopPid(apiPid);
92
- throw error;
99
+ throw appendLogTail(error, webLogPath, 'Web');
93
100
  }
94
101
 
95
102
  const state = {
@@ -214,6 +221,54 @@ async function waitForHttp(url, pid, timeoutMs) {
214
221
  throw new Error(`Timed out waiting for ${url}.`);
215
222
  }
216
223
 
224
+ async function assertTcpPortAvailable(host, port, label) {
225
+ await new Promise((resolve, reject) => {
226
+ const server = net.createServer();
227
+ server.unref();
228
+
229
+ server.once('error', (error) => {
230
+ const code = typeof error === 'object' && error !== null ? error.code : undefined;
231
+ if (code === 'EADDRINUSE') {
232
+ reject(
233
+ new Error(
234
+ `${label} port ${host}:${port} is already in use. Set ${label === 'API' ? 'SERVICE_API_PORT' : 'SERVICE_PORT'} to another port, or stop the process currently using it.`
235
+ )
236
+ );
237
+ return;
238
+ }
239
+
240
+ reject(error);
241
+ });
242
+
243
+ server.listen(port, host, () => {
244
+ server.close(resolve);
245
+ });
246
+ });
247
+ }
248
+
249
+ function appendLogTail(error, logPath, label) {
250
+ const message = error instanceof Error ? error.message : String(error);
251
+ const tail = readLogTail(logPath, 80);
252
+ if (!tail) {
253
+ return new Error(`${message}\n${label} log: ${logPath}`);
254
+ }
255
+
256
+ return new Error(`${message}\n${label} log: ${logPath}\n\nLast ${label} log lines:\n${tail}`);
257
+ }
258
+
259
+ function readLogTail(logPath, maxLines) {
260
+ try {
261
+ const content = fs.readFileSync(logPath, 'utf8').trimEnd();
262
+ if (!content) {
263
+ return '';
264
+ }
265
+
266
+ return content.split(/\r?\n/).slice(-maxLines).join('\n');
267
+ } catch {
268
+ return '';
269
+ }
270
+ }
271
+
217
272
  async function probeHttp(url) {
218
273
  try {
219
274
  const controller = new AbortController();