cdx-manager 0.20.6 → 0.20.8
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 +2 -2
- package/VERSION +1 -1
- package/changelogs/CHANGELOGS_0_20_7.md +12 -0
- package/changelogs/CHANGELOGS_0_20_8.md +13 -0
- package/checksums/release-archives.json +22 -0
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/src/cli_helpers.py +21 -1
- package/src/commands/launch.py +1 -1
- package/src/run_usage.py +2 -1
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
<br clear="left"/>
|
|
6
6
|
|
|
7
|
-
[](LICENSE) ](LICENSE)  
|
|
8
8
|
|
|
9
9
|
**Stop guessing which AI account still has quota.** `cdx` tracks the rate-limit window of every Codex and Claude account you own, tells you which one is usable right now, and launches it with isolated auth — in one command.
|
|
10
10
|
|
|
@@ -106,7 +106,7 @@ The reason `cdx` exists: knowing, across every account you own, which one you ca
|
|
|
106
106
|
|
|
107
107
|
### Context handoff
|
|
108
108
|
|
|
109
|
-
- **Shared handoff context.** Keep a per-workspace Markdown context, or build one from a source session transcript, and install it into another assistant session before switching providers or accounts.
|
|
109
|
+
- **Shared handoff context.** Keep a per-workspace Markdown context, or build one from a source session transcript, and install it into another assistant session before switching providers or accounts. Source transcript selection prefers the current workspace when the provider transcript records one, then falls back to the newest source-session transcript.
|
|
110
110
|
- **Session transcript capture.** Every launch is recorded to a local log file via `script`, giving you a full terminal transcript for each session.
|
|
111
111
|
|
|
112
112
|
### Maintenance
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.20.
|
|
1
|
+
0.20.8
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# CDX Manager 0.20.7
|
|
2
|
+
|
|
3
|
+
## Fixes
|
|
4
|
+
|
|
5
|
+
- `cdx handoff <source> <target>` now prefers the source transcript from the
|
|
6
|
+
current workspace when Codex rollout metadata records one, avoiding stale or
|
|
7
|
+
unrelated context when the same account recently worked in another repository.
|
|
8
|
+
|
|
9
|
+
## Notes
|
|
10
|
+
|
|
11
|
+
- If provider metadata does not identify a workspace, handoff keeps the previous
|
|
12
|
+
newest-transcript fallback.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# CDX Manager 0.20.8
|
|
2
|
+
|
|
3
|
+
## Fixes
|
|
4
|
+
|
|
5
|
+
- Price `gpt-6-astra` usage in `cdx stats` at OpenAI's standard API list
|
|
6
|
+
rates, so Astra runs no longer appear as unpriced when provider transcripts
|
|
7
|
+
report the new model id.
|
|
8
|
+
|
|
9
|
+
## Notes
|
|
10
|
+
|
|
11
|
+
- Long-context Astra requests keep the existing conservative limitation:
|
|
12
|
+
`cdx` prices the run at standard rates because usage records do not split
|
|
13
|
+
tokens per request context tier.
|
|
@@ -375,6 +375,28 @@
|
|
|
375
375
|
"x86_64-pc-windows-msvc": "208064f2bfee19914ca72edb527966a9966154179d6d040f0dae4a647a61f9f4",
|
|
376
376
|
"x86_64-unknown-linux-musl": "9fa01d3b71daed98c9234ddb0cf7b6345b3d757edff910ece4e3bd9f5eb8eb6b"
|
|
377
377
|
}
|
|
378
|
+
},
|
|
379
|
+
"v0.20.6": {
|
|
380
|
+
"github_tarball_sha256": "5842d4e743b15c996a21c4f0ef9e58243335f6ac9c313f02e419ef2a772e1177",
|
|
381
|
+
"github_zip_sha256": "9d9d65832490ce515c2c9857159196d55c5ee5b95c02b0fa981c38b919979361",
|
|
382
|
+
"tray_assets": {
|
|
383
|
+
"aarch64-apple-darwin": "6ac68d8aa45b9a7e3256eb6eb0f62f00e738bc023483987d5066d33ce2e6602f",
|
|
384
|
+
"aarch64-unknown-linux-musl": "b77e185c61b8d7b99bbbd24f4d9c6f0fdb6df6ed0f29eda6e7a2443bb034e6c4",
|
|
385
|
+
"x86_64-apple-darwin": "813be88dedc64dfeff551a36ab9971d64b9a9f768d573cd1281334bb59437ff6",
|
|
386
|
+
"x86_64-pc-windows-msvc": "994a6a5767df705d6c6335bc11294990b2527fa1688e372d8a42c87c79cafa8c",
|
|
387
|
+
"x86_64-unknown-linux-musl": "c3c9b67befccff31c0c5090a09384d0788c59cb7be3c233dd61eb0118af50988"
|
|
388
|
+
}
|
|
389
|
+
},
|
|
390
|
+
"v0.20.7": {
|
|
391
|
+
"github_tarball_sha256": "98ac812a9a18da5083a2732c963eb2e6b5dcd4eba6ba3ce7096a00f53ddee7d5",
|
|
392
|
+
"github_zip_sha256": "843221898610af2e1caaf141fa66362937700fff9fa5fc49cdab0cb80200d4b4",
|
|
393
|
+
"tray_assets": {
|
|
394
|
+
"aarch64-apple-darwin": "91e2de5ded31963717d32a4ec2bf32c6cc0d64cffbbf8a44bffe996dc25112e5",
|
|
395
|
+
"aarch64-unknown-linux-musl": "6db77669f6e3ec1078460a96511caa84236e7ed3bd86df2fe82cea353d032a62",
|
|
396
|
+
"x86_64-apple-darwin": "1a9184d71a7bbdf70cb8ed0716fca79a3a707e1e6d13cc6dbb85d5865f03bcfa",
|
|
397
|
+
"x86_64-pc-windows-msvc": "532fcdabf7ff249eafaea6518668e7a175ae8763de1f23c5abc9bb2c5d4e5eac",
|
|
398
|
+
"x86_64-unknown-linux-musl": "224277ab55219bb5d94386f57fa00bc043537ad97ecf04fd68afd2a7986caa87"
|
|
399
|
+
}
|
|
378
400
|
}
|
|
379
401
|
}
|
|
380
402
|
}
|
package/package.json
CHANGED
package/pyproject.toml
CHANGED
package/src/cli_helpers.py
CHANGED
|
@@ -252,8 +252,28 @@ def _collect_native_handoff_transcript_paths(session):
|
|
|
252
252
|
return _sort_recent_paths(candidates)[:HANDOFF_NATIVE_TRANSCRIPT_CANDIDATES]
|
|
253
253
|
|
|
254
254
|
|
|
255
|
-
def
|
|
255
|
+
def _handoff_transcript_workspace(path):
|
|
256
|
+
if not path.endswith(".jsonl"):
|
|
257
|
+
return None
|
|
258
|
+
try:
|
|
259
|
+
with open(path, encoding="utf-8", errors="replace") as handle:
|
|
260
|
+
record = json.loads(handle.readline() or "{}")
|
|
261
|
+
except (OSError, json.JSONDecodeError):
|
|
262
|
+
return None
|
|
263
|
+
if record.get("type") != "session_meta":
|
|
264
|
+
return None
|
|
265
|
+
payload = record.get("payload") if isinstance(record.get("payload"), dict) else {}
|
|
266
|
+
cwd = payload.get("cwd")
|
|
267
|
+
return os.path.realpath(cwd) if isinstance(cwd, str) and cwd else None
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def _latest_handoff_transcript_path(session, cwd=None):
|
|
256
271
|
native_paths = _collect_native_handoff_transcript_paths(session)
|
|
272
|
+
if cwd:
|
|
273
|
+
workspace = os.path.realpath(cwd)
|
|
274
|
+
for path in native_paths:
|
|
275
|
+
if _handoff_transcript_workspace(path) == workspace:
|
|
276
|
+
return path
|
|
257
277
|
if native_paths:
|
|
258
278
|
return native_paths[0]
|
|
259
279
|
return _latest_launch_transcript_path(session)
|
package/src/commands/launch.py
CHANGED
|
@@ -430,7 +430,7 @@ def handle_handoff(rest, ctx):
|
|
|
430
430
|
target = ctx["service"]["get_session"](target_name)
|
|
431
431
|
if not target:
|
|
432
432
|
raise CdxError(f"Unknown session: {target_name}")
|
|
433
|
-
transcript_path = _latest_handoff_transcript_path(source)
|
|
433
|
+
transcript_path = _latest_handoff_transcript_path(source, ctx.get("cwd"))
|
|
434
434
|
if not transcript_path:
|
|
435
435
|
raise CdxError(f"No transcript found for session: {source_name}")
|
|
436
436
|
transcript, truncated = _read_handoff_transcript(transcript_path)
|
package/src/run_usage.py
CHANGED
|
@@ -180,6 +180,7 @@ DEFAULT_TOKEN_PRICES = {
|
|
|
180
180
|
"claude-haiku-4-5": {"input": 1.0, "output": 5.0},
|
|
181
181
|
"claude-haiku-4-5-20251001": {"input": 1.0, "output": 5.0},
|
|
182
182
|
# OpenAI
|
|
183
|
+
"gpt-6-astra": {"input": 10.0, "output": 50.0},
|
|
183
184
|
"gpt-5.6": {"input": 4.0, "output": 20.0},
|
|
184
185
|
"gpt-5.6-sol": {"input": 4.0, "output": 20.0},
|
|
185
186
|
"gpt-5.6-terra": {"input": 2.0, "output": 12.0},
|
|
@@ -194,7 +195,7 @@ DEFAULT_TOKEN_PRICES = {
|
|
|
194
195
|
"gpt-5.4-nano-2026-03-17": {"input": 0.2, "output": 1.25},
|
|
195
196
|
"gpt-5.3-codex": {"input": 1.75, "output": 14.0},
|
|
196
197
|
}
|
|
197
|
-
TOKEN_PRICES_REVIEWED = "2026-
|
|
198
|
+
TOKEN_PRICES_REVIEWED = "2026-09-05"
|
|
198
199
|
#: How long a review stays fresh before the staleness test asks for another.
|
|
199
200
|
TOKEN_PRICES_MAX_AGE_DAYS = 90
|
|
200
201
|
TOKEN_PRICES_ENV = "CDX_TOKEN_PRICES"
|