@gotcos/glasses-server 6.94.0 → 6.94.1

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,13 @@
1
+ ## 6.94.1 - Mac filing waits for a pipeline that can title a Mac recording
2
+
3
+ 2026-10-27. Pairs with COS operations `sync_meetings.py` on branch `claude/mac-library-cos` (the `mac_title: 1` capability). Works with COS Control 0.5.351; Control needs no change.
4
+
5
+ - **Why:** after 6.94.0 and COS d51abbff2 went live, every Mac import came back untitled. The pipeline's model prompt said the title was "ONLY for G2 source, null otherwise", and a Mac recording's prompt reads `Source: mac_system_audio`, so the model answered with no title. The pipeline then refused to write the import, so it stayed a staged copy under `personal/` with its review marker. On 2026-10-27 the hourly sync spent two Opus calls an hour on the same two recordings. The model step itself ran: it classified both as quilt.
6
+ - **What:** the server files a Mac recording only when `sync_meetings.py --capabilities` also reports `mac_title: 1` or later. That is the script whose prompt asks a Mac recording for its title. A server paired with the d51abbff2 script no longer spends three model calls per save on an import that cannot be written: the recording stays standalone and is filed later by the hourly sync or `mac_library_backfill.py` once the script is updated.
7
+ - **COS side (same branch):** the prompt asks a Mac recording for its title, and G2 and cloud prompts stay byte for byte the same. The hourly sync's Mac catch-up runs with the explicit save's model allowance (`COS_MEETING_LLM` off does not stop it; `--no-llm` or a missing model does), stages nothing in a run without a model, and counts an attempt only when the model is called. Attempts spent under the old prompt are not held against a recording.
8
+ - **Unchanged:** G2 saves (pinned by `server/routes/g2-filing-golden.test.ts`), the import itself, twins, and the 6.94.0 retry and catch-up budgets.
9
+ - **Publish order:** either order is safe. This server against the d51abbff2 script leaves Mac recordings standalone; the 6.94.0 server against the new script files them as before, now titled.
10
+
1
11
  ## 6.94.0 - Saved Mac recordings are filed into the COS meeting library
2
12
 
3
13
  2026-10-27. Pairs with COS operations `sync_meetings.py` on branch `claude/mac-library-cos` (the `--mac-import-file` import and `--capabilities`). Works with COS Control 0.5.351; Control needs no change.
package/README.md CHANGED
@@ -719,7 +719,7 @@ into `operations/{domain}/meetings/YYYY-MM/` after its standalone summary, throu
719
719
  `sync_meetings.py --mac-import-file`: the same summary, title and domain step as a
720
720
  glasses meeting, titled `... (Mac)`, never matched or blended into a Fireflies or
721
721
  Granola meeting. The server checks `sync_meetings.py --capabilities` first (it needs
722
- `mac_import` and `mac_twins` 2); an older script leaves Mac recordings standalone. A Mac
722
+ `mac_import`, `mac_twins` 2 and, from 6.94.1, `mac_title` 1); an older script leaves Mac recordings standalone. A Mac
723
723
  recording of a meeting the glasses or Fireflies also recorded is filed as a twin:
724
724
  searchable, but kept out of LightRAG, task scans and Work (`operations/scripts/mac_twins.py`). Recordings saved before 6.94.0 are filed with
725
725
  `operations/scripts/mac_library_backfill.py` (dry run by default, `--apply` to file).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gotcos/glasses-server",
3
- "version": "6.94.0",
3
+ "version": "6.94.1",
4
4
  "description": "COS Glasses: 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": {
@@ -398,6 +398,13 @@ export type CapabilityProbe = (pythonBin: string, syncScript: string, cwd: strin
398
398
  const CAPABILITY_PROBE_TIMEOUT_MS = 30_000
399
399
  /** sync_meetings.py `mac_twins` version the server needs: 2 = twins of G2 recordings AND cloud scribes. */
400
400
  export const MAC_TWINS_REQUIRED = 2
401
+ /**
402
+ * sync_meetings.py `mac_title` version the server needs: 1 = its model prompt asks a Mac recording
403
+ * for a title. The script that first shipped `mac_import` (COS d51abbff2) told the model the title
404
+ * was "ONLY for G2 source, null otherwise", so every Mac import came back untitled and was never
405
+ * written, after three model calls per save (2026-10-27).
406
+ */
407
+ export const MAC_TITLE_REQUIRED = 1
401
408
  const capabilityCache = new Map<string, SyncCapabilities>()
402
409
 
403
410
  function spawnCapabilityProbe(pythonBin: string, syncScript: string, cwd: string): Promise<CapabilityProbeResult> {
@@ -421,7 +428,7 @@ export function resetSyncCapabilitiesCache(): void {
421
428
 
422
429
  /**
423
430
  * What the installed sync_meetings.py can do, read from `--capabilities` rather than guessed.
424
- * Mac filing needs `mac_import: 1` and `mac_twins: 2` or later.
431
+ * Mac filing needs `mac_import: 1`, `mac_twins: 2` or later and `mac_title: 1` or later.
425
432
  *
426
433
  * Cached per python + script + mtime + size, so an upgraded script is probed again. A script
427
434
  * whose text never mentions `--capabilities` is an older one: it would take the sync lock
@@ -458,7 +465,9 @@ export async function readSyncCapabilities(
458
465
  // that keeps a Mac copy of an already-recorded meeting out of LightRAG and Work. A script with
459
466
  // the import but an older twin rule would file a Mac + Fireflies meeting twice.
460
467
  const caps = !!parsed && typeof parsed === 'object' ? parsed as Record<string, unknown> : {}
461
- const macImport = caps.mac_import === 1 && typeof caps.mac_twins === 'number' && caps.mac_twins >= MAC_TWINS_REQUIRED
468
+ const macImport = caps.mac_import === 1
469
+ && typeof caps.mac_twins === 'number' && caps.mac_twins >= MAC_TWINS_REQUIRED
470
+ && typeof caps.mac_title === 'number' && caps.mac_title >= MAC_TITLE_REQUIRED
462
471
  const result = { macImport, reason: macImport ? null : 'sync_script_upgrade_required' }
463
472
  capabilityCache.set(key, result)
464
473
  return result