@gotcos/glasses-server 6.44.15 → 6.44.16

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
@@ -1,3 +1,19 @@
1
+ ## 6.44.16
2
+
3
+ A G2 recording keeps its session id when its sidecar only exists in the server's own recordings folder.
4
+
5
+ - Chelsie and Queen, 2026-09-08: "Meetings to review is empty, and it says 3
6
+ recent meetings have no session id." On Miles's Mac the same three-row case
7
+ was three KC-week recordings whose markdown reached the operations tree
8
+ through git while the `.g2-chunks.json` sidecar, which is gitignored there,
9
+ did not; the row lost its session id and Speakers could not open it.
10
+ - `listCosOperationsMeetings` now reads the sidecar from the server's own
11
+ recordings root by the same stem when the copy beside the markdown is
12
+ missing (`recordingsRoot` option, default the data dir). The review lookup
13
+ already resolves a session through the standalone store, so the row opens.
14
+ A meeting with no sidecar anywhere still omits the field rather than
15
+ inventing one.
16
+
1
17
  ## 6.44.15
2
18
 
3
19
  Voice profiles named after a spoken sentence are repaired at load.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gotcos/glasses-server",
3
- "version": "6.44.15",
3
+ "version": "6.44.16",
4
4
  "description": "COS Glasses \u2014 self-hosted AI heads-up-display server for Even G2 smart glasses, powered by Claude Code, Codex, Cursor Agent CLI, or local Ollama",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,6 +19,7 @@ import { discoveredDomains, domainAbbreviation as deriveAbbr, isSafeDomainName a
19
19
  import type { MeetingDetail, MeetingMeta } from './meeting-store.js'
20
20
  import { MEETING_SOURCE_MAX_BYTES, meetingDayCountsFromNames, meetingListLimit } from './meeting-store.js'
21
21
  import { meetingVoiceReview, parseSidecarListHead } from './meeting-voice-review.js'
22
+ import { dataPath } from './data-dir.js'
22
23
 
23
24
  /**
24
25
  * The four domains of ONE user's COS. Retained as the documented example layout
@@ -528,9 +529,12 @@ export function listCosOperationsMeetings(options: {
528
529
  domain?: string
529
530
  month?: string
530
531
  day?: string
532
+ /** The server's own recordings root; tests point it at a temp dir. */
533
+ recordingsRoot?: string
531
534
  } = {}): CosOperationsMeetingMeta[] {
532
535
  const operationsDir = resolveCosOperationsDir()
533
536
  if (!operationsDir) return []
537
+ const recordingsRoot = options.recordingsRoot ?? dataPath('recordings')
534
538
 
535
539
  const scoped = Boolean(options.month || options.day)
536
540
  const limit = meetingListLimit(options.limit, scoped)
@@ -569,7 +573,17 @@ export function listCosOperationsMeetings(options: {
569
573
  meta.recordId = `ops:${domain}:${month}:${file}`
570
574
  meta.mutable = true
571
575
  meta.canonicalRecord = `operations/${domain}/meetings/${month}/${file}`
572
- const hints = sidecarListHints(monthDir, file)
576
+ // The sidecar is gitignored in the operations tree, so a G2 recording
577
+ // whose markdown arrived through git or iCloud (three of Miles's KC-week
578
+ // recordings, 2026-09-08) sits there without one and the row loses its
579
+ // session id, which reads as "cannot be reviewed". The server that saved
580
+ // it still holds the sidecar under its own recordings root by the same
581
+ // stem; read that one when the copy beside the markdown is missing.
582
+ let hints = sidecarListHints(monthDir, file)
583
+ if (!hints.sessionId && recordingsRoot) {
584
+ const fallbackDir = join(recordingsRoot, month)
585
+ if (existsSync(fallbackDir)) hints = sidecarListHints(fallbackDir, file)
586
+ }
573
587
  if (hints.sessionId) meta.sessionId = hints.sessionId
574
588
  if (hints.speakers.length > 0) {
575
589
  meta.voiceReview = meetingVoiceReview(hints.speakers, hints.sessionId)