@gotcos/glasses-server 6.36.3 → 6.36.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/CHANGELOG.md CHANGED
@@ -2219,6 +2219,34 @@ unsaved capture, and makes batch status stop lying about finished work.
2219
2219
 
2220
2220
  # Changelog
2221
2221
 
2222
+ ## [6.36.4] - 2026-08-17
2223
+
2224
+ ### A cloned Codex conversation gets its own identity
2225
+
2226
+ Miles forked "Markt POS 2.0 build" into "POS Nation 3.0 build" and the fork never
2227
+ appeared in the sessions list. It had not failed to index -- it was indexed AS ITS
2228
+ PARENT. The list showed one `Markt POS 2.0 build` row whose modified time was the
2229
+ fork's activity: two conversations, one identity, and the newer one invisible.
2230
+
2231
+ Cloning copies the parent's `session_meta` record wholesale, so the new rollout carries
2232
+ the PARENT's id under its own filename. `listCodexSessions` keyed on `meta.id` and
2233
+ folded them together.
2234
+
2235
+ The filename is unique per rollout by construction; the meta record is content and can
2236
+ be a copy. **When they disagree, the filename now wins.** An ordinary session, where
2237
+ they agree, is untouched.
2238
+
2239
+ Verified against the real machine before and after: the fork's `session_meta.id` reads
2240
+ `019e0943…` (the parent) while its filename reads `01a0119c…`.
2241
+
2242
+ ### Also worth recording, not fixed here
2243
+
2244
+ That fork's rollout is **771,177,205 bytes** -- 735 MB, against other rollouts small
2245
+ enough not to register. The clone duplicated the entire parent transcript and Codex
2246
+ rewrites the whole file, which is past Node's 512 MB string limit; COS survives only
2247
+ because it reads bounded windows. Giving the fork its own identity does not shrink it,
2248
+ and a clone of a clone doubles again.
2249
+
2222
2250
  ## [6.36.3] - 2026-08-17
2223
2251
 
2224
2252
  ### The seeded query was being crowded out by the steps
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gotcos/glasses-server",
3
- "version": "6.36.3",
3
+ "version": "6.36.4",
4
4
  "description": "COS Glasses \u2014 self-hosted AI heads-up-display server for Even G2 smart glasses, powered by Claude Code, Codex, or Cursor Agent CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -899,7 +899,26 @@ export async function listCodexSessions(
899
899
  if (rows.length >= Math.max(0, limit)) break
900
900
  const meta = await peekCodexMeta(candidate.file)
901
901
  if (!meta || meta.subagent) continue
902
- const native = meta.id || candidate.name.slice(0, -6)
902
+ // THE FILENAME WINS WHEN THEY DISAGREE.
903
+ //
904
+ // A rollout's `session_meta.id` is normally its own id, and normally the filename
905
+ // agrees. A CLONED conversation breaks that: the clone copies the parent's
906
+ // `session_meta` record wholesale, so the new rollout carries the PARENT's id
907
+ // while its filename carries its own.
908
+ //
909
+ // Miles forked "Markt POS 2.0 build" into "POS Nation 3.0 build" and the fork
910
+ // never appeared in the session list. It had not failed to index -- it was indexed
911
+ // AS its parent, so the list showed one `Markt POS 2.0 build` row whose modified
912
+ // time was the fork's activity. Two conversations, one identity, and the newer one
913
+ // invisible.
914
+ //
915
+ // The filename is unique per rollout by construction; the meta record is content
916
+ // and can be a copy. So when they disagree, trust the filename.
917
+ const fileId = idFromCodexFilename(candidate.name)
918
+ const metaId = (meta.id || '').trim().toLowerCase()
919
+ const native = fileId && metaId && fileId !== metaId
920
+ ? fileId
921
+ : (meta.id || candidate.name.slice(0, -6))
903
922
  const title = names.get(native) || meta.title || 'Codex session'
904
923
  if (isKeepWarmSessionTitle(title)) continue
905
924
  const created = meta.created || createdFromCodexFilename(candidate.name) || isoFromMtime(candidate.birthtimeMs)