remote-codex 0.1.3 → 0.1.5

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.
@@ -6097,7 +6097,10 @@ function getDefaultHostRecord() {
6097
6097
  // ../../packages/db/src/migrate.ts
6098
6098
  import fs2 from "fs";
6099
6099
  import path3 from "path";
6100
- function resolveRepoRoot(start = process.cwd()) {
6100
+ function resolvePackageRoot(start = process.cwd()) {
6101
+ if (process.env.REMOTE_CODEX_PACKAGE_ROOT) {
6102
+ return path3.resolve(process.env.REMOTE_CODEX_PACKAGE_ROOT);
6103
+ }
6101
6104
  let current = path3.resolve(start);
6102
6105
  while (current !== path3.dirname(current)) {
6103
6106
  if (fs2.existsSync(path3.join(current, "pnpm-workspace.yaml"))) {
@@ -6105,10 +6108,10 @@ function resolveRepoRoot(start = process.cwd()) {
6105
6108
  }
6106
6109
  current = path3.dirname(current);
6107
6110
  }
6108
- throw new Error("Unable to locate repository root from current working directory.");
6111
+ throw new Error("Unable to locate package root from current working directory.");
6109
6112
  }
6110
6113
  function getMigrationsDir() {
6111
- return path3.join(resolveRepoRoot(), "packages", "db", "migrations");
6114
+ return path3.join(resolvePackageRoot(), "packages", "db", "migrations");
6112
6115
  }
6113
6116
  function runMigrations(databaseUrl) {
6114
6117
  const { sqlite } = createDatabase(databaseUrl);
@@ -8262,7 +8265,10 @@ import fs7 from "fs";
8262
8265
  import path7 from "path";
8263
8266
  var TOKEN_PRICE_DENOMINATOR = 1e6;
8264
8267
  var cachedPricingConfig = null;
8265
- function resolveRepoRoot2(start = process.cwd()) {
8268
+ function resolvePackageRoot2(start = process.cwd()) {
8269
+ if (process.env.REMOTE_CODEX_PACKAGE_ROOT) {
8270
+ return path7.resolve(process.env.REMOTE_CODEX_PACKAGE_ROOT);
8271
+ }
8266
8272
  let current = path7.resolve(start);
8267
8273
  while (current !== path7.dirname(current)) {
8268
8274
  if (fs7.existsSync(path7.join(current, "pnpm-workspace.yaml"))) {
@@ -8270,10 +8276,10 @@ function resolveRepoRoot2(start = process.cwd()) {
8270
8276
  }
8271
8277
  current = path7.dirname(current);
8272
8278
  }
8273
- throw new Error("Unable to locate repository root for Codex pricing config.");
8279
+ throw new Error("Unable to locate package root for Codex pricing config.");
8274
8280
  }
8275
8281
  function getPricingConfigPath() {
8276
- return path7.join(resolveRepoRoot2(), "config", "codex-model-pricing.json");
8282
+ return path7.join(resolvePackageRoot2(), "config", "codex-model-pricing.json");
8277
8283
  }
8278
8284
  function isPositiveNumber(value) {
8279
8285
  return typeof value === "number" && Number.isFinite(value) && value >= 0;
@@ -0,0 +1,57 @@
1
+ {
2
+ "currency": "USD",
3
+ "tiers": {
4
+ "standard": {
5
+ "multiplier": 1
6
+ },
7
+ "fast": {
8
+ "multiplier": 2
9
+ }
10
+ },
11
+ "models": {
12
+ "gpt-5.5": {
13
+ "inputUsdPerMillion": 5,
14
+ "cachedInputUsdPerMillion": 0.5,
15
+ "outputUsdPerMillion": 30,
16
+ "supportsFastMode": true,
17
+ "fastMultiplier": 2.5,
18
+ "contextWindowTokens": 272000
19
+ },
20
+ "gpt-5.3-codex": {
21
+ "inputUsdPerMillion": 1.75,
22
+ "cachedInputUsdPerMillion": 0.175,
23
+ "outputUsdPerMillion": 14,
24
+ "supportsFastMode": true
25
+ },
26
+ "gpt-5.4": {
27
+ "inputUsdPerMillion": 2.5,
28
+ "cachedInputUsdPerMillion": 0.25,
29
+ "outputUsdPerMillion": 15,
30
+ "supportsFastMode": true
31
+ },
32
+ "gpt-5.2-codex": {
33
+ "inputUsdPerMillion": 1.75,
34
+ "cachedInputUsdPerMillion": 0.175,
35
+ "outputUsdPerMillion": 14,
36
+ "supportsFastMode": false
37
+ },
38
+ "gpt-5.1-codex-max": {
39
+ "inputUsdPerMillion": 1.25,
40
+ "cachedInputUsdPerMillion": 0.125,
41
+ "outputUsdPerMillion": 10,
42
+ "supportsFastMode": false
43
+ },
44
+ "gpt-5.2": {
45
+ "inputUsdPerMillion": 1.75,
46
+ "cachedInputUsdPerMillion": 0.175,
47
+ "outputUsdPerMillion": 14,
48
+ "supportsFastMode": false
49
+ },
50
+ "gpt-5.1-codex-mini": {
51
+ "inputUsdPerMillion": 0.25,
52
+ "cachedInputUsdPerMillion": 0.025,
53
+ "outputUsdPerMillion": 2,
54
+ "supportsFastMode": false
55
+ }
56
+ }
57
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remote-codex",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Local web supervisor for Codex workspaces and threads.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -13,6 +13,8 @@
13
13
  "scripts/run-web-service.mjs",
14
14
  "apps/supervisor-api/dist/",
15
15
  "apps/supervisor-web/dist/",
16
+ "config/codex-model-pricing.json",
17
+ "packages/db/migrations/*.sql",
16
18
  "README.md"
17
19
  ],
18
20
  "packageManager": "pnpm@10.11.1",
@@ -0,0 +1,74 @@
1
+ CREATE TABLE IF NOT EXISTS hosts (
2
+ id TEXT PRIMARY KEY NOT NULL,
3
+ hostname TEXT NOT NULL,
4
+ platform TEXT NOT NULL,
5
+ tailscale_name TEXT,
6
+ created_at TEXT NOT NULL,
7
+ last_seen_at TEXT NOT NULL
8
+ );
9
+
10
+ CREATE TABLE IF NOT EXISTS workspaces (
11
+ id TEXT PRIMARY KEY NOT NULL,
12
+ host_id TEXT NOT NULL,
13
+ label TEXT NOT NULL,
14
+ abs_path TEXT NOT NULL UNIQUE,
15
+ is_favorite INTEGER NOT NULL DEFAULT 0,
16
+ created_at TEXT NOT NULL,
17
+ last_opened_at TEXT
18
+ );
19
+
20
+ CREATE TABLE IF NOT EXISTS threads (
21
+ id TEXT PRIMARY KEY NOT NULL,
22
+ workspace_id TEXT NOT NULL,
23
+ codex_thread_id TEXT,
24
+ title TEXT NOT NULL,
25
+ model TEXT,
26
+ approval_mode TEXT,
27
+ status TEXT,
28
+ created_at TEXT NOT NULL,
29
+ updated_at TEXT NOT NULL,
30
+ last_turn_started_at TEXT,
31
+ last_turn_completed_at TEXT,
32
+ last_viewed_at TEXT,
33
+ is_pinned INTEGER NOT NULL DEFAULT 0
34
+ );
35
+
36
+ CREATE TABLE IF NOT EXISTS shell_sessions (
37
+ id TEXT PRIMARY KEY NOT NULL,
38
+ workspace_id TEXT NOT NULL,
39
+ thread_id TEXT,
40
+ tmux_session_name TEXT,
41
+ cwd TEXT NOT NULL,
42
+ status TEXT,
43
+ created_at TEXT NOT NULL,
44
+ updated_at TEXT NOT NULL,
45
+ last_activity_at TEXT
46
+ );
47
+
48
+ CREATE TABLE IF NOT EXISTS viewer_sessions (
49
+ id TEXT PRIMARY KEY NOT NULL,
50
+ thread_id TEXT,
51
+ shell_id TEXT,
52
+ connected_at TEXT NOT NULL,
53
+ last_heartbeat_at TEXT,
54
+ active_tab TEXT
55
+ );
56
+
57
+ CREATE TABLE IF NOT EXISTS notifications (
58
+ id TEXT PRIMARY KEY NOT NULL,
59
+ thread_id TEXT,
60
+ kind TEXT NOT NULL,
61
+ severity TEXT NOT NULL,
62
+ title TEXT NOT NULL,
63
+ body TEXT NOT NULL,
64
+ is_read INTEGER NOT NULL DEFAULT 0,
65
+ created_at TEXT NOT NULL
66
+ );
67
+
68
+ CREATE TABLE IF NOT EXISTS policies (
69
+ id TEXT PRIMARY KEY NOT NULL,
70
+ key TEXT NOT NULL UNIQUE,
71
+ value_json TEXT NOT NULL,
72
+ created_at TEXT NOT NULL,
73
+ updated_at TEXT NOT NULL
74
+ );
@@ -0,0 +1,3 @@
1
+ ALTER TABLE threads ADD COLUMN codex_turn_id TEXT;
2
+ ALTER TABLE threads ADD COLUMN summary_text TEXT;
3
+ ALTER TABLE threads ADD COLUMN last_error TEXT;
@@ -0,0 +1 @@
1
+ ALTER TABLE threads ADD COLUMN source TEXT NOT NULL DEFAULT 'supervisor';
@@ -0,0 +1,2 @@
1
+ ALTER TABLE threads ADD COLUMN reasoning_effort TEXT;
2
+ ALTER TABLE threads ADD COLUMN collaboration_mode TEXT NOT NULL DEFAULT 'default';
@@ -0,0 +1 @@
1
+ ALTER TABLE threads ADD COLUMN is_connected INTEGER NOT NULL DEFAULT 1;
@@ -0,0 +1,13 @@
1
+ CREATE TABLE IF NOT EXISTS thread_turn_metadata (
2
+ id TEXT PRIMARY KEY NOT NULL,
3
+ thread_id TEXT NOT NULL,
4
+ turn_id TEXT NOT NULL,
5
+ model TEXT,
6
+ reasoning_effort TEXT,
7
+ reasoning_effort_available INTEGER,
8
+ created_at TEXT NOT NULL,
9
+ updated_at TEXT NOT NULL
10
+ );
11
+
12
+ CREATE UNIQUE INDEX IF NOT EXISTS thread_turn_metadata_thread_turn_idx
13
+ ON thread_turn_metadata(thread_id, turn_id);
@@ -0,0 +1 @@
1
+ ALTER TABLE threads ADD COLUMN sandbox_mode TEXT;
@@ -0,0 +1,13 @@
1
+ CREATE TABLE IF NOT EXISTS thread_pending_steers (
2
+ id TEXT PRIMARY KEY,
3
+ thread_id TEXT NOT NULL,
4
+ turn_id TEXT NOT NULL,
5
+ client_request_id TEXT,
6
+ display_prompt TEXT NOT NULL,
7
+ submitted_prompt TEXT NOT NULL,
8
+ created_at TEXT NOT NULL,
9
+ updated_at TEXT NOT NULL
10
+ );
11
+
12
+ CREATE INDEX IF NOT EXISTS thread_pending_steers_thread_created_idx
13
+ ON thread_pending_steers(thread_id, created_at);
@@ -0,0 +1,19 @@
1
+ ALTER TABLE threads
2
+ ADD COLUMN fast_mode INTEGER NOT NULL DEFAULT 0;
3
+
4
+ ALTER TABLE threads
5
+ ADD COLUMN fast_base_model TEXT;
6
+
7
+ ALTER TABLE threads
8
+ ADD COLUMN fast_base_reasoning_effort TEXT;
9
+
10
+ CREATE TABLE IF NOT EXISTS thread_activity_notes (
11
+ id TEXT PRIMARY KEY,
12
+ thread_id TEXT NOT NULL,
13
+ kind TEXT NOT NULL,
14
+ text TEXT NOT NULL,
15
+ created_at TEXT NOT NULL
16
+ );
17
+
18
+ CREATE INDEX IF NOT EXISTS thread_activity_notes_thread_created_idx
19
+ ON thread_activity_notes(thread_id, created_at);
@@ -0,0 +1,2 @@
1
+ ALTER TABLE thread_turn_metadata
2
+ ADD COLUMN token_usage_json TEXT;
@@ -0,0 +1,5 @@
1
+ ALTER TABLE thread_turn_metadata
2
+ ADD COLUMN pricing_model_key TEXT;
3
+
4
+ ALTER TABLE thread_turn_metadata
5
+ ADD COLUMN pricing_tier_key TEXT;
@@ -0,0 +1,8 @@
1
+ CREATE TABLE IF NOT EXISTS thread_forks (
2
+ id TEXT PRIMARY KEY NOT NULL,
3
+ source_thread_id TEXT NOT NULL,
4
+ source_turn_id TEXT,
5
+ source_turn_index INTEGER,
6
+ forked_thread_id TEXT NOT NULL,
7
+ created_at TEXT NOT NULL
8
+ );
@@ -0,0 +1,17 @@
1
+ CREATE TABLE IF NOT EXISTS thread_goals (
2
+ id TEXT PRIMARY KEY NOT NULL,
3
+ thread_id TEXT NOT NULL,
4
+ codex_thread_id TEXT NOT NULL,
5
+ objective TEXT NOT NULL,
6
+ status TEXT NOT NULL,
7
+ token_budget INTEGER,
8
+ tokens_used INTEGER NOT NULL DEFAULT 0,
9
+ time_used_seconds INTEGER NOT NULL DEFAULT 0,
10
+ started_at TEXT NOT NULL,
11
+ completed_at TEXT,
12
+ created_at TEXT NOT NULL,
13
+ updated_at TEXT NOT NULL
14
+ );
15
+
16
+ CREATE INDEX IF NOT EXISTS thread_goals_thread_updated_idx
17
+ ON thread_goals(thread_id, updated_at);
@@ -0,0 +1,2 @@
1
+ ALTER TABLE thread_activity_notes
2
+ ADD COLUMN anchor_turn_id TEXT;
@@ -116,6 +116,7 @@ async function startService() {
116
116
  console.log(`Web: http://${serviceHost}:${servicePort} (pid ${webPid})`);
117
117
  console.log(`API: http://${apiHost}:${apiPort} (pid ${apiPid})`);
118
118
  console.log(`Logs: ${serviceDir}`);
119
+ printTailscaleServeHint();
119
120
  }
120
121
 
121
122
  async function stopService() {
@@ -204,6 +205,21 @@ function prepareLogFile(logPath) {
204
205
  }
205
206
  }
206
207
 
208
+ function printTailscaleServeHint() {
209
+ const localWebUrl = `http://${serviceHost}:${servicePort}`;
210
+
211
+ console.log('');
212
+ console.log('To access it from another device, expose the web service with Tailscale:');
213
+ console.log('');
214
+ console.log(` tailscale serve --bg ${localWebUrl}`);
215
+ console.log('');
216
+ console.log('If Tailscale is not installed yet:');
217
+ console.log('');
218
+ console.log(' curl -fsSL https://tailscale.com/install.sh | sh');
219
+ console.log(' tailscale up');
220
+ console.log(` tailscale serve --bg ${localWebUrl}`);
221
+ }
222
+
207
223
  async function waitForHttp(url, pid, timeoutMs) {
208
224
  const startedAt = Date.now();
209
225
  while (Date.now() - startedAt < timeoutMs) {