cdx-manager 0.26.3 → 0.26.4
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 +1 -1
- package/VERSION +1 -1
- package/changelogs/CHANGELOGS_0_26_4.md +17 -0
- package/checksums/release-archives.json +11 -0
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/src/conversation.py +25 -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
|
**The right AI coding account, when you need it.** CDX Manager keeps your Codex and Claude accounts in separate profiles, shows which ones have quota, and helps you pick the next usable session from your terminal.
|
|
10
10
|
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.26.
|
|
1
|
+
0.26.4
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# CDX Manager 0.26.4
|
|
2
|
+
|
|
3
|
+
Release date: 2026-11-05
|
|
4
|
+
|
|
5
|
+
## Fixes
|
|
6
|
+
|
|
7
|
+
- Show Claude messages typed while the agent is working in conversation pages
|
|
8
|
+
(#112, `7baa22a4604317b5c6fffa1eb8ddb7c8726c283d`). Render human queued
|
|
9
|
+
messages as user entries, including text accompanying pasted images and
|
|
10
|
+
oversized attachments, while keeping image bodies out of conversation output.
|
|
11
|
+
|
|
12
|
+
## Maintenance
|
|
13
|
+
|
|
14
|
+
- Record tray companion checksums for v0.26.3
|
|
15
|
+
(`c3e861fb6a216ec0c721cff8bb07043921891457`).
|
|
16
|
+
- Record release archive checksums for v0.26.3
|
|
17
|
+
(`da760da0f3b859b017a68d2f4bdde71c38ca883f`).
|
|
@@ -826,6 +826,17 @@
|
|
|
826
826
|
"x86_64-pc-windows-msvc": "7846a4b56ec3006428b9778cbee3e0c1fabea8f279ca9183cf34abb460bb4c29",
|
|
827
827
|
"x86_64-unknown-linux-musl": "d761aa0bbda8661c842f0b18e438c047ec023d30ed733d0044d1663ddd480355"
|
|
828
828
|
}
|
|
829
|
+
},
|
|
830
|
+
"v0.26.3": {
|
|
831
|
+
"github_tarball_sha256": "19f55a4b7ccc2de8a05aeee23039749f782214460368de5ce2aa90ee051c5c7e",
|
|
832
|
+
"github_zip_sha256": "67042371673a27de37f6accd5c4cea9128d4a2a8bdd382173a56ffb3bbb34e53",
|
|
833
|
+
"tray_assets": {
|
|
834
|
+
"aarch64-apple-darwin": "520b94d699dce57b381b6efb16f6afd5bf162218437bdaedfe3c152cbf95f42d",
|
|
835
|
+
"aarch64-unknown-linux-musl": "fdd710a5eeba7fbc545518b011f81acbb72087e201c8c577c2eff629bb2130ff",
|
|
836
|
+
"x86_64-apple-darwin": "082c8ea57b34295f24ecbad701d81df37860f25f645f1c3c59382407ff94e865",
|
|
837
|
+
"x86_64-pc-windows-msvc": "7b9d9fc24dd5d4285a5cac7e746614654deaebe197ab38fa6e1c302da34e0358",
|
|
838
|
+
"x86_64-unknown-linux-musl": "51ea6902917697f5d16ef994bb01d0d0c6293b60c8f26b3735cb08925b3af616"
|
|
839
|
+
}
|
|
829
840
|
}
|
|
830
841
|
}
|
|
831
842
|
}
|
package/package.json
CHANGED
package/pyproject.toml
CHANGED
package/src/conversation.py
CHANGED
|
@@ -50,7 +50,16 @@ def _tool_name(message, names, result=False):
|
|
|
50
50
|
|
|
51
51
|
def _conversation_record(provider, kind):
|
|
52
52
|
# Provider bookkeeping can carry the same text as real conversation records.
|
|
53
|
-
|
|
53
|
+
# Claude Code records messages typed while the agent works as queued_command attachments.
|
|
54
|
+
return kind == "response_item" if provider == "codex" else kind in ("user", "assistant", "attachment")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _queued_prompt(record):
|
|
58
|
+
attachment = record.get("attachment")
|
|
59
|
+
if (not isinstance(attachment, dict) or attachment.get("type") != "queued_command"
|
|
60
|
+
or (attachment.get("origin") or {}).get("kind") != "human"):
|
|
61
|
+
return None
|
|
62
|
+
return attachment.get("prompt")
|
|
54
63
|
|
|
55
64
|
|
|
56
65
|
_CLAUDE_HARNESS = re.compile(
|
|
@@ -97,6 +106,9 @@ def _entries(provider, record, names):
|
|
|
97
106
|
stamp = None
|
|
98
107
|
if provider == "codex":
|
|
99
108
|
message = record.get("payload")
|
|
109
|
+
elif record.get("type") == "attachment":
|
|
110
|
+
prompt = _queued_prompt(record)
|
|
111
|
+
message = {"role": "user", "content": prompt} if isinstance(prompt, (str, list)) else None
|
|
100
112
|
else:
|
|
101
113
|
message = record.get("message")
|
|
102
114
|
if not isinstance(message, dict):
|
|
@@ -180,6 +192,18 @@ def _oversized_entry(provider, prefix):
|
|
|
180
192
|
value = None
|
|
181
193
|
if not _conversation_record(provider, value):
|
|
182
194
|
return None
|
|
195
|
+
if value == "attachment":
|
|
196
|
+
# An oversized queued message carries a pasted image; keep its leading text when readable.
|
|
197
|
+
attachment = _field_start(prefix, "attachment")
|
|
198
|
+
if attachment is None or '"queued_command"' not in prefix[attachment:attachment + 200]:
|
|
199
|
+
return None
|
|
200
|
+
text = _field_start(prefix, "text", prefix.find("{", prefix.find('"prompt"', attachment)))
|
|
201
|
+
try:
|
|
202
|
+
text, _ = json.JSONDecoder().raw_decode(prefix, text) if text is not None else ("", 0)
|
|
203
|
+
except (ValueError, RecursionError):
|
|
204
|
+
text = ""
|
|
205
|
+
blocks = _claude_user_content([{"type": "text", "text": text}]) if isinstance(text, str) else []
|
|
206
|
+
return _entry("user", blocks[0]["text"] if blocks else "")
|
|
183
207
|
message = _field_start(prefix, "payload" if provider == "codex" else "message")
|
|
184
208
|
if message is None or prefix[message:message + 1] != "{":
|
|
185
209
|
return None
|