@mentra/sdk 2.1.29-beta.1 → 2.1.30-beta.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.
Files changed (37) hide show
  1. package/dist/app/session/events.d.ts +9 -0
  2. package/dist/app/session/events.d.ts.map +1 -1
  3. package/dist/app/session/index.d.ts +8 -2
  4. package/dist/app/session/index.d.ts.map +1 -1
  5. package/dist/display-utils/helpers/DisplayHelpers.d.ts +165 -0
  6. package/dist/display-utils/helpers/DisplayHelpers.d.ts.map +1 -0
  7. package/dist/display-utils/helpers/ScrollView.d.ts +183 -0
  8. package/dist/display-utils/helpers/ScrollView.d.ts.map +1 -0
  9. package/dist/display-utils/helpers/index.d.ts +11 -0
  10. package/dist/display-utils/helpers/index.d.ts.map +1 -0
  11. package/dist/display-utils/index.d.ts +108 -0
  12. package/dist/display-utils/index.d.ts.map +1 -0
  13. package/dist/display-utils/measurer/TextMeasurer.d.ts +160 -0
  14. package/dist/display-utils/measurer/TextMeasurer.d.ts.map +1 -0
  15. package/dist/display-utils/measurer/index.d.ts +10 -0
  16. package/dist/display-utils/measurer/index.d.ts.map +1 -0
  17. package/dist/display-utils/measurer/script-detection.d.ts +53 -0
  18. package/dist/display-utils/measurer/script-detection.d.ts.map +1 -0
  19. package/dist/display-utils/profiles/g1.d.ts +33 -0
  20. package/dist/display-utils/profiles/g1.d.ts.map +1 -0
  21. package/dist/display-utils/profiles/index.d.ts +9 -0
  22. package/dist/display-utils/profiles/index.d.ts.map +1 -0
  23. package/dist/display-utils/profiles/types.d.ts +95 -0
  24. package/dist/display-utils/profiles/types.d.ts.map +1 -0
  25. package/dist/display-utils/wrapper/TextWrapper.d.ts +94 -0
  26. package/dist/display-utils/wrapper/TextWrapper.d.ts.map +1 -0
  27. package/dist/display-utils/wrapper/index.d.ts +12 -0
  28. package/dist/display-utils/wrapper/index.d.ts.map +1 -0
  29. package/dist/display-utils/wrapper/types.d.ts +71 -0
  30. package/dist/display-utils/wrapper/types.d.ts.map +1 -0
  31. package/dist/display-utils.d.ts +27 -986
  32. package/dist/display-utils.d.ts.map +1 -1
  33. package/dist/display-utils.js +9 -9
  34. package/dist/display-utils.js.map +2 -2
  35. package/dist/index.js +47 -30
  36. package/dist/index.js.map +4 -4
  37. package/package.json +4 -10
@@ -1 +1 @@
1
- {"version":3,"file":"display-utils.d.ts","sourceRoot":"","sources":["../src/display-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EAGjB,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EAGb,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,oBAAoB,EAGpB,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,IAAI,EACT,KAAK,KAAK,EAGV,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,cAAc,EAGnB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,GACtB,MAAM,uBAAuB,CAAA"}
1
+ {"version":3,"file":"display-utils.d.ts","sourceRoot":"","sources":["../src/display-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EAGjB,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EAGb,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,oBAAoB,EAGpB,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,IAAI,EACT,KAAK,KAAK,EAGV,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,cAAc,EAGnB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,GACtB,MAAM,uBAAuB,CAAA"}
@@ -29,7 +29,7 @@ var __export = (target, all) => {
29
29
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
30
30
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
31
31
 
32
- // ../display-utils/src/profiles/g1.ts
32
+ // src/display-utils/profiles/g1.ts
33
33
  var G1_GLYPH_WIDTHS = {
34
34
  " ": 2,
35
35
  "!": 1,
@@ -187,7 +187,7 @@ var G1_PROFILE_LEGACY = {
187
187
  };
188
188
  var G1_HYPHEN_WIDTH_PX = 10;
189
189
  var G1_SPACE_WIDTH_PX = 6;
190
- // ../display-utils/src/measurer/script-detection.ts
190
+ // src/display-utils/measurer/script-detection.ts
191
191
  var SCRIPT_RANGES = {
192
192
  cjk: [
193
193
  [19968, 40959],
@@ -310,7 +310,7 @@ function needsHyphenForBreak(charBefore, charAfter) {
310
310
  return true;
311
311
  }
312
312
 
313
- // ../display-utils/src/measurer/TextMeasurer.ts
313
+ // src/display-utils/measurer/TextMeasurer.ts
314
314
  class TextMeasurer {
315
315
  profile;
316
316
  charCache = new Map;
@@ -465,7 +465,7 @@ class TextMeasurer {
465
465
  this.buildCharCache();
466
466
  }
467
467
  }
468
- // ../display-utils/src/wrapper/types.ts
468
+ // src/display-utils/wrapper/types.ts
469
469
  var DEFAULT_WRAP_OPTIONS = {
470
470
  breakMode: "character",
471
471
  hyphenChar: "-",
@@ -474,7 +474,7 @@ var DEFAULT_WRAP_OPTIONS = {
474
474
  preserveNewlines: true
475
475
  };
476
476
 
477
- // ../display-utils/src/wrapper/TextWrapper.ts
477
+ // src/display-utils/wrapper/TextWrapper.ts
478
478
  class TextWrapper {
479
479
  measurer;
480
480
  defaultOptions;
@@ -804,7 +804,7 @@ class TextWrapper {
804
804
  };
805
805
  }
806
806
  }
807
- // ../display-utils/src/helpers/DisplayHelpers.ts
807
+ // src/display-utils/helpers/DisplayHelpers.ts
808
808
  class DisplayHelpers {
809
809
  measurer;
810
810
  wrapper;
@@ -1009,7 +1009,7 @@ class DisplayHelpers {
1009
1009
  return this.profile;
1010
1010
  }
1011
1011
  }
1012
- // ../display-utils/src/helpers/ScrollView.ts
1012
+ // src/display-utils/helpers/ScrollView.ts
1013
1013
  class ScrollView {
1014
1014
  measurer;
1015
1015
  wrapper;
@@ -1146,7 +1146,7 @@ class ScrollView {
1146
1146
  return this.profile;
1147
1147
  }
1148
1148
  }
1149
- // ../display-utils/src/index.ts
1149
+ // src/display-utils/index.ts
1150
1150
  function createDisplayToolkit(profile = G1_PROFILE, wrapOptions) {
1151
1151
  const measurer = new TextMeasurer(profile);
1152
1152
  const wrapper = new TextWrapper(measurer, wrapOptions);
@@ -1194,4 +1194,4 @@ export {
1194
1194
  DEFAULT_WRAP_OPTIONS
1195
1195
  };
1196
1196
 
1197
- //# debugId=5DD60770487F882B64756E2164756E21
1197
+ //# debugId=7A9C99D0B00FC7CF64756E2164756E21
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../display-utils/src/profiles/g1.ts", "../../display-utils/src/measurer/script-detection.ts", "../../display-utils/src/measurer/TextMeasurer.ts", "../../display-utils/src/wrapper/types.ts", "../../display-utils/src/wrapper/TextWrapper.ts", "../../display-utils/src/helpers/DisplayHelpers.ts", "../../display-utils/src/helpers/ScrollView.ts", "../../display-utils/src/index.ts"],
3
+ "sources": ["../src/display-utils/profiles/g1.ts", "../src/display-utils/measurer/script-detection.ts", "../src/display-utils/measurer/TextMeasurer.ts", "../src/display-utils/wrapper/types.ts", "../src/display-utils/wrapper/TextWrapper.ts", "../src/display-utils/helpers/DisplayHelpers.ts", "../src/display-utils/helpers/ScrollView.ts", "../src/display-utils/index.ts"],
4
4
  "sourcesContent": [
5
5
  "import {DisplayProfile} from \"./types\"\n\n/**\n * Complete G1 glyph widths from G1FontLoaderKt\n * These are GLYPH widths - multiply using renderFormula to get rendered pixels.\n * Rendered width = (glyphWidth + 1) * 2\n */\nconst G1_GLYPH_WIDTHS: Record<string, number> = {\n // Punctuation & Symbols\n \" \": 2,\n \"!\": 1,\n '\"': 2,\n \"#\": 6,\n \"$\": 5,\n \"%\": 6,\n \"&\": 7,\n \"'\": 1,\n \"(\": 2,\n \")\": 2,\n \"*\": 3,\n \"+\": 4,\n \",\": 1,\n \"-\": 4, // Hyphen: 4px glyph → 10px rendered (CRITICAL for breaking!)\n \".\": 1,\n \"/\": 3,\n\n // Numbers\n \"0\": 5,\n \"1\": 3,\n \"2\": 5,\n \"3\": 5,\n \"4\": 5,\n \"5\": 5,\n \"6\": 5,\n \"7\": 5,\n \"8\": 5,\n \"9\": 5,\n\n // More punctuation\n \":\": 1,\n \";\": 1,\n \"<\": 4,\n \"=\": 4,\n \">\": 4,\n \"?\": 5,\n \"@\": 7,\n\n // Uppercase\n \"A\": 6,\n \"B\": 5,\n \"C\": 5,\n \"D\": 5,\n \"E\": 4,\n \"F\": 4,\n \"G\": 5,\n \"H\": 5,\n \"I\": 2,\n \"J\": 3,\n \"K\": 5,\n \"L\": 4,\n \"M\": 7,\n \"N\": 5,\n \"O\": 5,\n \"P\": 5,\n \"Q\": 5,\n \"R\": 5,\n \"S\": 5,\n \"T\": 5,\n \"U\": 5,\n \"V\": 6,\n \"W\": 7,\n \"X\": 6,\n \"Y\": 6,\n \"Z\": 5,\n\n // Brackets & special\n \"[\": 2,\n \"\\\\\": 3,\n \"]\": 2,\n \"^\": 4,\n \"_\": 3,\n \"`\": 2,\n\n // Lowercase\n \"a\": 5,\n \"b\": 4,\n \"c\": 4,\n \"d\": 4,\n \"e\": 4,\n \"f\": 4,\n \"g\": 4,\n \"h\": 4,\n \"i\": 1,\n \"j\": 2,\n \"k\": 4,\n \"l\": 1,\n \"m\": 7,\n \"n\": 4,\n \"o\": 4,\n \"p\": 4,\n \"q\": 4,\n \"r\": 3,\n \"s\": 4,\n \"t\": 3,\n \"u\": 5,\n \"v\": 5,\n \"w\": 7,\n \"x\": 5,\n \"y\": 5,\n \"z\": 4,\n\n // More special\n \"{\": 3,\n \"|\": 1,\n \"}\": 3,\n \"~\": 7,\n}\n\n/**\n * Even Realities G1 Smart Glasses Display Profile\n *\n * Verified through empirical testing with actual hardware.\n * See: line-width-debug-tool/line-width-spec.md\n */\nexport const G1_PROFILE: DisplayProfile = {\n id: \"even-realities-g1\",\n name: \"Even Realities G1\",\n\n // Display dimensions\n displayWidthPx: 576,\n maxLines: 5,\n\n // BLE constraints\n maxPayloadBytes: 390,\n bleChunkSize: 176,\n\n // Font metrics\n fontMetrics: {\n // Glyph widths from G1FontLoaderKt\n glyphWidths: new Map(Object.entries(G1_GLYPH_WIDTHS)),\n\n // Default glyph width for unmapped Latin characters (use max to be safe)\n defaultGlyphWidth: 7,\n\n // Rendered width = (glyphWidth + 1) * 2\n renderFormula: (glyphWidth: number) => (glyphWidth + 1) * 2,\n\n // Uniform-width scripts - ALL characters in these scripts render at this exact width\n // These are verified values in RENDERED pixels, NOT averages\n uniformScripts: {\n cjk: 18, // ALL Chinese/Japanese Kanji chars = 18px (verified)\n hiragana: 18, // ALL Hiragana chars = 18px (verified)\n katakana: 18, // ALL Katakana chars = 18px (verified)\n korean: 24, // ALL Korean Hangul chars = 24px (verified)\n cyrillic: 18, // ALL Cyrillic chars = 18px (verified)\n },\n\n // Fallback for unmapped Latin characters\n // Uses MAX width to guarantee no overflow (safe under-utilization)\n fallback: {\n latinMaxWidth: 16, // Max Latin = 'm', 'w' at (7+1)*2 = 16px\n unknownBehavior: \"useLatinMax\",\n },\n },\n\n constraints: {\n minCharsBeforeHyphen: 3,\n // Kinsoku: Characters that should not appear at start of line\n noStartChars: [\".\", \",\", \"!\", \"?\", \":\", \";\", \")\", \"]\", \"}\", \"。\", \",\", \"!\", \"?\", \":\", \";\", \")\", \"】\", \"」\"],\n // Kinsoku: Characters that should not appear at end of line\n noEndChars: [\"(\", \"[\", \"{\", \"(\", \"【\", \"「\"],\n },\n}\n\n/**\n * G1 Profile for LEGACY mobile clients that have their own wrapping logic.\n *\n * Old mobile clients re-wrap text received from the cloud, causing double-wrapping.\n * This profile uses a reduced display width (~522px instead of 576px) so that\n * when the mobile client re-wraps, the result still fits within 5 lines.\n *\n * Use this profile when:\n * - Mobile client version < X.X.X (has old wrapping logic)\n * - You see text getting cut off or exceeding 5 lines\n *\n * Once all clients are updated, this can be deprecated.\n */\nexport const G1_PROFILE_LEGACY: DisplayProfile = {\n id: \"even-realities-g1-legacy\",\n name: \"Even Realities G1 (Legacy Client Compatibility)\",\n\n // Reduced display width to prevent double-wrapping overflow\n // Old mobile client wraps at ~90% of true width\n displayWidthPx: 420,\n maxLines: 5,\n\n // BLE constraints (same as standard)\n maxPayloadBytes: 390,\n bleChunkSize: 176,\n\n // Font metrics (same as standard)\n fontMetrics: {\n glyphWidths: new Map(Object.entries(G1_GLYPH_WIDTHS)),\n defaultGlyphWidth: 7,\n renderFormula: (glyphWidth: number) => (glyphWidth + 1) * 2,\n uniformScripts: {\n cjk: 18,\n hiragana: 18,\n katakana: 18,\n korean: 24,\n cyrillic: 18,\n },\n fallback: {\n latinMaxWidth: 16,\n unknownBehavior: \"useLatinMax\",\n },\n },\n\n constraints: {\n minCharsBeforeHyphen: 3,\n noStartChars: [\".\", \",\", \"!\", \"?\", \":\", \";\", \")\", \"]\", \"}\", \"。\", \",\", \"!\", \"?\", \":\", \";\", \")\", \"】\", \"」\"],\n noEndChars: [\"(\", \"[\", \"{\", \"(\", \"【\", \"「\"],\n },\n}\n\n/**\n * Get the hyphen width for G1 in rendered pixels.\n * Hyphen glyph = 4px → rendered = (4+1)*2 = 10px\n */\nexport const G1_HYPHEN_WIDTH_PX = 10\n\n/**\n * Get the space width for G1 in rendered pixels.\n * Space glyph = 2px → rendered = (2+1)*2 = 6px\n */\nexport const G1_SPACE_WIDTH_PX = 6\n",
6
6
  "import type {ScriptType} from \"../profiles/types\"\n\n/**\n * Unicode ranges for script detection.\n * Used to classify characters for proper width measurement.\n */\nexport const SCRIPT_RANGES = {\n // CJK Unified Ideographs\n cjk: [\n [0x4e00, 0x9fff], // Main block (common Chinese, Japanese Kanji)\n [0x3400, 0x4dbf], // Extension A\n [0x20000, 0x2a6df], // Extension B\n [0x2a700, 0x2b73f], // Extension C\n [0x2b740, 0x2b81f], // Extension D\n [0xf900, 0xfaff], // Compatibility Ideographs\n ] as const,\n\n // Japanese Hiragana\n hiragana: [[0x3040, 0x309f]] as const,\n\n // Japanese Katakana\n katakana: [\n [0x30a0, 0x30ff], // Main block\n [0x31f0, 0x31ff], // Phonetic Extensions\n ] as const,\n\n // Korean\n korean: [\n [0xac00, 0xd7af], // Hangul Syllables\n [0x1100, 0x11ff], // Hangul Jamo\n [0x3130, 0x318f], // Compatibility Jamo\n [0xa960, 0xa97f], // Jamo Extended-A\n [0xd7b0, 0xd7ff], // Jamo Extended-B\n ] as const,\n\n // Cyrillic\n cyrillic: [\n [0x0400, 0x04ff], // Main block\n [0x0500, 0x052f], // Supplement\n ] as const,\n\n // Numbers (ASCII)\n numbers: [[0x30, 0x39]] as const,\n\n // Basic punctuation (ASCII)\n punctuation: [\n [0x20, 0x2f], // Space and basic punctuation\n [0x3a, 0x40], // More punctuation\n [0x5b, 0x60], // Brackets etc.\n [0x7b, 0x7e], // Braces etc.\n ] as const,\n\n // Unsupported scripts (for filtering)\n arabic: [[0x0600, 0x06ff]] as const,\n hebrew: [[0x0590, 0x05ff]] as const,\n thai: [[0x0e00, 0x0e7f]] as const,\n emoji: [\n [0x1f600, 0x1f64f], // Emoticons\n [0x1f300, 0x1f5ff], // Misc Symbols and Pictographs\n [0x1f680, 0x1f6ff], // Transport and Map\n [0x1f1e0, 0x1f1ff], // Flags\n [0x2600, 0x26ff], // Misc Symbols\n [0x2700, 0x27bf], // Dingbats\n [0xfe00, 0xfe0f], // Variation Selectors\n [0x1f900, 0x1f9ff], // Supplemental Symbols\n ] as const,\n} as const\n\n/**\n * Check if a code point is within any of the given ranges.\n */\nfunction inRanges(codePoint: number, ranges: readonly (readonly [number, number])[]): boolean {\n for (const [start, end] of ranges) {\n if (codePoint >= start && codePoint <= end) {\n return true\n }\n }\n return false\n}\n\n/**\n * Detect the script type of a single character.\n *\n * @param char - Single character to classify\n * @returns The script type of the character\n */\nexport function detectScript(char: string): ScriptType {\n if (!char || char.length === 0) {\n return \"latin\"\n }\n\n // Get the code point (handles surrogate pairs for characters outside BMP)\n const codePoint = char.codePointAt(0)\n if (codePoint === undefined) {\n return \"latin\"\n }\n\n // Check each script in order of likelihood/importance\n\n // CJK (most common for multi-byte)\n if (inRanges(codePoint, SCRIPT_RANGES.cjk)) {\n return \"cjk\"\n }\n\n // Japanese kana\n if (inRanges(codePoint, SCRIPT_RANGES.hiragana)) {\n return \"hiragana\"\n }\n if (inRanges(codePoint, SCRIPT_RANGES.katakana)) {\n return \"katakana\"\n }\n\n // Korean\n if (inRanges(codePoint, SCRIPT_RANGES.korean)) {\n return \"korean\"\n }\n\n // Cyrillic\n if (inRanges(codePoint, SCRIPT_RANGES.cyrillic)) {\n return \"cyrillic\"\n }\n\n // Numbers\n if (inRanges(codePoint, SCRIPT_RANGES.numbers)) {\n return \"numbers\"\n }\n\n // Punctuation\n if (inRanges(codePoint, SCRIPT_RANGES.punctuation)) {\n return \"punctuation\"\n }\n\n // Unsupported scripts\n if (\n inRanges(codePoint, SCRIPT_RANGES.arabic) ||\n inRanges(codePoint, SCRIPT_RANGES.hebrew) ||\n inRanges(codePoint, SCRIPT_RANGES.thai) ||\n inRanges(codePoint, SCRIPT_RANGES.emoji)\n ) {\n return \"unsupported\"\n }\n\n // Default to Latin for ASCII letters and anything else\n return \"latin\"\n}\n\n/**\n * Check if a character is a CJK character (Chinese, Japanese Kanji).\n * CJK characters can break anywhere without needing a hyphen.\n */\nexport function isCJKCharacter(char: string): boolean {\n const script = detectScript(char)\n return script === \"cjk\" || script === \"hiragana\" || script === \"katakana\"\n}\n\n/**\n * Check if a character is Korean Hangul.\n */\nexport function isKoreanCharacter(char: string): boolean {\n return detectScript(char) === \"korean\"\n}\n\n/**\n * Check if a character is from a uniform-width script.\n * These scripts render all characters at the same width.\n */\nexport function isUniformWidthScript(char: string): boolean {\n const script = detectScript(char)\n return (\n script === \"cjk\" || script === \"hiragana\" || script === \"katakana\" || script === \"korean\" || script === \"cyrillic\"\n )\n}\n\n/**\n * Check if a character is from an unsupported script.\n * These characters may not render correctly on the glasses.\n */\nexport function isUnsupportedScript(char: string): boolean {\n return detectScript(char) === \"unsupported\"\n}\n\n/**\n * Check if breaking between two characters requires a hyphen.\n * Returns false for:\n * - Breaking after CJK characters (can break anywhere)\n * - Breaking before or after spaces\n * - Breaking after punctuation\n */\nexport function needsHyphenForBreak(charBefore: string, charAfter: string): boolean {\n // No hyphen needed after CJK (can break anywhere)\n if (isCJKCharacter(charBefore)) {\n return false\n }\n\n // No hyphen needed before CJK\n if (isCJKCharacter(charAfter)) {\n return false\n }\n\n // No hyphen needed after space\n if (charBefore === \" \" || charBefore === \"\\t\") {\n return false\n }\n\n // No hyphen needed before space (the space is a natural break point)\n if (charAfter === \" \" || charAfter === \"\\t\") {\n return false\n }\n\n // No hyphen needed after existing punctuation that serves as break\n const breakPunctuation = [\"-\", \"–\", \"—\", \"/\", \"\\\\\", \"|\"]\n if (breakPunctuation.includes(charBefore)) {\n return false\n }\n\n // Default: hyphen is needed for mid-word Latin breaks\n return true\n}\n",
@@ -12,6 +12,6 @@
12
12
  "/**\n * @mentra/display-utils\n *\n * Glasses-agnostic, pixel-accurate text measurement and wrapping library\n * for smart glasses displays.\n *\n * Key features:\n * - Pixel-perfect measurement (no abstract units or averages)\n * - Multiple break modes (character, word, strict-word)\n * - Full script support (Latin, CJK, Korean, Cyrillic)\n * - Configurable display profiles for different glasses hardware\n *\n * @example\n * ```typescript\n * import {\n * TextMeasurer,\n * TextWrapper,\n * DisplayHelpers,\n * G1_PROFILE\n * } from '@mentra/display-utils'\n *\n * // Create measurer and wrapper for G1 glasses\n * const measurer = new TextMeasurer(G1_PROFILE)\n * const wrapper = new TextWrapper(measurer, { breakMode: 'character' })\n * const helpers = new DisplayHelpers(measurer, wrapper)\n *\n * // Wrap text for display\n * const result = wrapper.wrap(\"Hello, world! This is a long text.\")\n * console.log(result.lines)\n * // [\"Hello, world! This is a long text th-\", \"at needs wrapping.\"]\n * ```\n */\n\n// =============================================================================\n// Profiles - Hardware configurations for different glasses\n// =============================================================================\n\nexport type {\n DisplayProfile,\n FontMetrics,\n UniformScriptWidths,\n FallbackConfig,\n DisplayConstraints,\n ScriptType,\n} from \"./profiles\"\n\nexport {G1_PROFILE, G1_PROFILE_LEGACY, G1_HYPHEN_WIDTH_PX, G1_SPACE_WIDTH_PX} from \"./profiles\"\n\n// Import for factory functions\nimport {G1_PROFILE_LEGACY} from \"./profiles\"\n\n// =============================================================================\n// Measurer - Pixel-accurate text measurement\n// =============================================================================\n\nexport {TextMeasurer} from \"./measurer\"\nexport type {CharMeasurement, TextMeasurement} from \"./measurer\"\n\n// Script detection utilities\nexport {\n detectScript,\n isCJKCharacter,\n isKoreanCharacter,\n isUniformWidthScript,\n isUnsupportedScript,\n needsHyphenForBreak,\n SCRIPT_RANGES,\n} from \"./measurer\"\n\n// =============================================================================\n// Wrapper - Text wrapping with multiple break modes\n// =============================================================================\n\nexport {TextWrapper} from \"./wrapper\"\nexport type {WrapOptions, WrapResult, LineMetrics, BreakMode} from \"./wrapper\"\nexport {DEFAULT_WRAP_OPTIONS} from \"./wrapper\"\n\n// =============================================================================\n// Helpers - Optional convenience utilities\n// =============================================================================\n\nexport {DisplayHelpers, ScrollView} from \"./helpers\"\nexport type {TruncateResult, Page, Chunk, ScrollPosition, ScrollViewport} from \"./helpers\"\n\n// =============================================================================\n// Convenience factory functions\n// =============================================================================\n\nimport {TextMeasurer} from \"./measurer\"\nimport {TextWrapper} from \"./wrapper\"\nimport {DisplayHelpers} from \"./helpers\"\nimport {G1_PROFILE} from \"./profiles\"\nimport type {DisplayProfile} from \"./profiles\"\nimport type {WrapOptions} from \"./wrapper\"\n\n/**\n * Create a complete display toolkit for a given profile.\n *\n * @param profile - Display profile (defaults to G1)\n * @param wrapOptions - Default wrap options\n * @returns Object with measurer, wrapper, and helpers\n *\n * @example\n * ```typescript\n * const { measurer, wrapper, helpers } = createDisplayToolkit()\n * const lines = wrapper.wrapToLines(\"Hello, world!\")\n * ```\n */\nexport function createDisplayToolkit(\n profile: DisplayProfile = G1_PROFILE,\n wrapOptions?: WrapOptions,\n): {\n measurer: TextMeasurer\n wrapper: TextWrapper\n helpers: DisplayHelpers\n profile: DisplayProfile\n} {\n const measurer = new TextMeasurer(profile)\n const wrapper = new TextWrapper(measurer, wrapOptions)\n const helpers = new DisplayHelpers(measurer, wrapper)\n\n return {\n measurer,\n wrapper,\n helpers,\n profile,\n }\n}\n\n/**\n * Create a G1-configured display toolkit with character breaking.\n * This is the recommended setup for captions and similar high-utilization use cases.\n *\n * @returns Object with measurer, wrapper, and helpers configured for G1\n *\n * @example\n * ```typescript\n * const { wrapper } = createG1Toolkit()\n * const result = wrapper.wrap(\"Your text here\")\n * ```\n */\nexport function createG1Toolkit(): {\n measurer: TextMeasurer\n wrapper: TextWrapper\n helpers: DisplayHelpers\n profile: DisplayProfile\n} {\n return createDisplayToolkit(G1_PROFILE, {\n breakMode: \"character\",\n hyphenChar: \"-\",\n minCharsBeforeHyphen: 3,\n })\n}\n\n/**\n * Create a G1-configured display toolkit for LEGACY mobile clients.\n *\n * Use this when the mobile client has old wrapping logic that re-wraps\n * text received from the cloud. This profile uses a reduced display width\n * (~522px instead of 576px) to prevent double-wrapping overflow.\n *\n * @returns Object with measurer, wrapper, and helpers configured for legacy G1 clients\n *\n * @example\n * ```typescript\n * // For old mobile clients that double-wrap\n * const { wrapper } = createG1LegacyToolkit()\n * const result = wrapper.wrap(\"Your text here\")\n * // Lines will be shorter to account for mobile re-wrapping\n * ```\n */\nexport function createG1LegacyToolkit(): {\n measurer: TextMeasurer\n wrapper: TextWrapper\n helpers: DisplayHelpers\n profile: DisplayProfile\n} {\n return createDisplayToolkit(G1_PROFILE_LEGACY, {\n breakMode: \"character\",\n hyphenChar: \"-\",\n minCharsBeforeHyphen: 3,\n })\n}\n"
13
13
  ],
14
14
  "mappings": "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",
15
- "debugId": "5DD60770487F882B64756E2164756E21",
15
+ "debugId": "7A9C99D0B00FC7CF64756E2164756E21",
16
16
  "names": []
17
17
  }
package/dist/index.js CHANGED
@@ -1906,6 +1906,9 @@ class EventManager {
1906
1906
  this.unsubscribe(type);
1907
1907
  }
1908
1908
  }
1909
+ getRegisteredStreams() {
1910
+ return Array.from(this.handlers.keys());
1911
+ }
1909
1912
  emit(event, data) {
1910
1913
  try {
1911
1914
  this.emitter.emit(event, data);
@@ -3528,6 +3531,7 @@ class SimpleStorage {
3528
3531
  }
3529
3532
 
3530
3533
  // src/app/session/index.ts
3534
+ var SDK_SUBSCRIPTION_PATCH = "bug007-fix-v2";
3531
3535
  var APP_TO_APP_EVENT_TYPES = [
3532
3536
  "app_message_received",
3533
3537
  "app_user_joined",
@@ -3541,7 +3545,7 @@ class AppSession {
3541
3545
  ws = null;
3542
3546
  sessionId = null;
3543
3547
  reconnectAttempts = 0;
3544
- subscriptions = new Set;
3548
+ terminated = false;
3545
3549
  streamRates = new Map;
3546
3550
  resources = new ResourceTracker;
3547
3551
  settingsData = [];
@@ -3609,18 +3613,14 @@ class AppSession {
3609
3613
  this.layouts = new LayoutManager(config.packageName, this.send.bind(this));
3610
3614
  this.settings = new SettingsManager(this.settingsData, this.config.packageName, this.config.mentraOSWebsocketUrl, this.sessionId ?? undefined, async (streams3) => {
3611
3615
  this.logger.debug({ streams: JSON.stringify(streams3) }, `[AppSession] subscribeFn called for streams`);
3612
- streams3.forEach((stream) => {
3613
- if (!this.subscriptions.has(stream)) {
3614
- this.subscriptions.add(stream);
3615
- this.logger.debug(`[AppSession] Auto-subscribed to stream '${stream}' for MentraOS setting.`);
3616
- } else {
3617
- this.logger.debug(`[AppSession] Already subscribed to stream '${stream}'.`);
3618
- }
3619
- });
3620
- this.logger.debug({ subscriptions: JSON.stringify(Array.from(this.subscriptions)) }, `[AppSession] Current subscriptions after subscribeFn`);
3616
+ const currentHandlerStreams = this.events.getRegisteredStreams();
3617
+ this.logger.debug({
3618
+ requestedStreams: JSON.stringify(streams3),
3619
+ currentHandlerStreams: JSON.stringify(currentHandlerStreams)
3620
+ }, `[AppSession] subscribeFn: requested streams vs current handler streams`);
3621
3621
  if (this.ws?.readyState === 1) {
3622
3622
  this.updateSubscriptions();
3623
- this.logger.debug(`[AppSession] Sent updated subscriptions to cloud after auto-subscribing to MentraOS setting.`);
3623
+ this.logger.debug(`[AppSession] Sent updated subscriptions to cloud (derived from handlers).`);
3624
3624
  } else {
3625
3625
  this.logger.debug(`[AppSession] WebSocket not open, will send subscriptions when connected.`);
3626
3626
  }
@@ -3697,7 +3697,6 @@ class AppSession {
3697
3697
  this.logger.warn(`[AppSession] Attempted to subscribe to App-to-App event type '${type}', which is not a valid stream. Use the event handler (e.g., onAppMessage) instead.`);
3698
3698
  return;
3699
3699
  }
3700
- this.subscriptions.add(type);
3701
3700
  if (rate) {
3702
3701
  this.streamRates.set(type, rate);
3703
3702
  }
@@ -3716,7 +3715,6 @@ class AppSession {
3716
3715
  this.logger.warn(`[AppSession] Attempted to unsubscribe from App-to-App event type '${type}', which is not a valid stream.`);
3717
3716
  return;
3718
3717
  }
3719
- this.subscriptions.delete(type);
3720
3718
  this.streamRates.delete(type);
3721
3719
  if (this.ws?.readyState === 1) {
3722
3720
  this.updateSubscriptions();
@@ -3840,11 +3838,15 @@ class AppSession {
3840
3838
  const isUserSessionEnded = reason && reason.includes("User session ended");
3841
3839
  this.logger.debug(`\uD83D\uDD0C [${this.config.packageName}] WebSocket closed with code ${code}${reasonStr}`);
3842
3840
  this.logger.debug(`\uD83D\uDD0C [${this.config.packageName}] isNormalClosure: ${isNormalClosure}, isManualStop: ${isManualStop}, isUserSessionEnded: ${isUserSessionEnded}`);
3843
- if (!isNormalClosure && !isManualStop) {
3841
+ if (isUserSessionEnded) {
3842
+ this.terminated = true;
3843
+ this.logger.info(`\uD83D\uDED1 [${this.config.packageName}] User session ended - marking as terminated, no reconnection allowed`);
3844
+ }
3845
+ if (!isNormalClosure && !isManualStop && !this.terminated) {
3844
3846
  this.logger.warn(`\uD83D\uDD0C [${this.config.packageName}] Abnormal closure detected, attempting reconnection`);
3845
3847
  this.handleReconnection();
3846
3848
  } else {
3847
- this.logger.debug(`\uD83D\uDD0C [${this.config.packageName}] Normal closure detected, not attempting reconnection`);
3849
+ this.logger.debug(`\uD83D\uDD0C [${this.config.packageName}] Normal/terminated closure detected, not attempting reconnection (terminated: ${this.terminated})`);
3848
3850
  }
3849
3851
  if (isUserSessionEnded) {
3850
3852
  this.logger.info(`\uD83D\uDED1 [${this.config.packageName}] User session ended - emitting disconnected event with sessionEnded flag`);
@@ -3924,7 +3926,6 @@ class AppSession {
3924
3926
  this.resources.dispose();
3925
3927
  this.ws = null;
3926
3928
  this.sessionId = null;
3927
- this.subscriptions.clear();
3928
3929
  this.reconnectAttempts = 0;
3929
3930
  }
3930
3931
  getSettings() {
@@ -3945,11 +3946,14 @@ class AppSession {
3945
3946
  if (!this.subscriptionSettingsHandler)
3946
3947
  return;
3947
3948
  try {
3948
- const newSubscriptions = this.subscriptionSettingsHandler(this.settingsData);
3949
- this.subscriptions.clear();
3950
- newSubscriptions.forEach((subscription) => {
3951
- this.subscriptions.add(subscription);
3952
- });
3949
+ const settingsSubscriptions = this.subscriptionSettingsHandler(this.settingsData);
3950
+ const handlerStreams = this.events.getRegisteredStreams();
3951
+ if (settingsSubscriptions.length !== handlerStreams.length) {
3952
+ this.logger.warn({
3953
+ settingsSubscriptions: JSON.stringify(settingsSubscriptions),
3954
+ handlerStreams: JSON.stringify(handlerStreams)
3955
+ }, `[AppSession] Settings-based subscriptions (${settingsSubscriptions.length}) differ from handler-based subscriptions (${handlerStreams.length}). ` + `Subscriptions are now derived from handlers. Ensure handlers are registered for desired streams.`);
3956
+ }
3953
3957
  if (this.ws && this.ws.readyState === 1) {
3954
3958
  this.updateSubscriptions();
3955
3959
  }
@@ -4079,6 +4083,8 @@ class AppSession {
4079
4083
  this.logger.debug(`[AppSession] No capabilities provided in CONNECTION_ACK`);
4080
4084
  }
4081
4085
  this.events.emit("connected", this.settingsData);
4086
+ const handlerCount = this.events.getRegisteredStreams().length;
4087
+ this.logger.info({ patch: SDK_SUBSCRIPTION_PATCH, handlerCount }, `[AppSession] \uD83D\uDD27 SDK Patch Active: ${SDK_SUBSCRIPTION_PATCH} - Subscriptions derived from ${handlerCount} handler(s)`);
4082
4088
  this.updateSubscriptions();
4083
4089
  if (this.shouldUpdateSubscriptionsOnSettingsChange && this.settingsData.length > 0) {
4084
4090
  this.updateSubscriptionsFromSettings();
@@ -4087,28 +4093,33 @@ class AppSession {
4087
4093
  const errorMessage = message.message || "Unknown connection error";
4088
4094
  this.events.emit("error", new Error(errorMessage));
4089
4095
  } else if (message.type === "audio_chunk" /* AUDIO_CHUNK */) {
4090
- if (this.subscriptions.has("audio_chunk" /* AUDIO_CHUNK */)) {
4096
+ const hasAudioHandler = this.events.getRegisteredStreams().includes("audio_chunk" /* AUDIO_CHUNK */);
4097
+ if (hasAudioHandler) {
4091
4098
  this.events.emit("audio_chunk" /* AUDIO_CHUNK */, message);
4092
4099
  }
4093
4100
  } else if (isDataStream(message) && message.streamType === "glasses_connection_state" /* GLASSES_CONNECTION_STATE */) {
4094
4101
  this.glassesConnectionState = message.data;
4095
- if (this.subscriptions.has("glasses_connection_state" /* GLASSES_CONNECTION_STATE */)) {
4102
+ const hasGlassesStateHandler = this.events.getRegisteredStreams().includes("glasses_connection_state" /* GLASSES_CONNECTION_STATE */);
4103
+ if (hasGlassesStateHandler) {
4096
4104
  const sanitizedData = this.sanitizeEventData("glasses_connection_state" /* GLASSES_CONNECTION_STATE */, message.data);
4097
4105
  this.events.emit("glasses_connection_state" /* GLASSES_CONNECTION_STATE */, sanitizedData);
4098
4106
  }
4099
4107
  } else if (isDataStream(message)) {
4100
4108
  const messageStreamType = message.streamType;
4101
- if (messageStreamType && this.subscriptions.has(messageStreamType)) {
4109
+ const hasHandler = this.events.getRegisteredStreams().includes(messageStreamType);
4110
+ if (messageStreamType && hasHandler) {
4102
4111
  const sanitizedData = this.sanitizeEventData(messageStreamType, message.data);
4103
4112
  this.events.emit(messageStreamType, sanitizedData);
4104
4113
  }
4105
4114
  } else if (isRtmpStreamStatus2(message)) {
4106
- if (this.subscriptions.has("rtmp_stream_status" /* RTMP_STREAM_STATUS */)) {
4115
+ const hasRtmpHandler = this.events.getRegisteredStreams().includes("rtmp_stream_status" /* RTMP_STREAM_STATUS */);
4116
+ if (hasRtmpHandler) {
4107
4117
  this.events.emit("rtmp_stream_status" /* RTMP_STREAM_STATUS */, message);
4108
4118
  }
4109
4119
  this.camera.updateStreamState(message);
4110
4120
  } else if (isManagedStreamStatus(message)) {
4111
- if (this.subscriptions.has("managed_stream_status" /* MANAGED_STREAM_STATUS */)) {
4121
+ const hasManagedStreamHandler = this.events.getRegisteredStreams().includes("managed_stream_status" /* MANAGED_STREAM_STATUS */);
4122
+ if (hasManagedStreamHandler) {
4112
4123
  this.events.emit("managed_stream_status" /* MANAGED_STREAM_STATUS */, message);
4113
4124
  }
4114
4125
  this.camera.handleManagedStreamStatus(message);
@@ -4245,7 +4256,8 @@ class AppSession {
4245
4256
  }
4246
4257
  handleBinaryMessage(buffer) {
4247
4258
  try {
4248
- if (!this.subscriptions.has("audio_chunk" /* AUDIO_CHUNK */)) {
4259
+ const hasAudioHandler = this.events.getRegisteredStreams().includes("audio_chunk" /* AUDIO_CHUNK */);
4260
+ if (!hasAudioHandler) {
4249
4261
  return;
4250
4262
  }
4251
4263
  if (!buffer || buffer.byteLength === 0) {
@@ -4318,8 +4330,9 @@ class AppSession {
4318
4330
  this.send(message);
4319
4331
  }
4320
4332
  updateSubscriptions() {
4321
- this.logger.info({ subscriptions: JSON.stringify(Array.from(this.subscriptions)) }, `[AppSession] updateSubscriptions: sending subscriptions to cloud`);
4322
- const subscriptionPayload = Array.from(this.subscriptions).map((stream) => {
4333
+ const derivedSubscriptions = this.events.getRegisteredStreams();
4334
+ this.logger.info({ subscriptions: JSON.stringify(derivedSubscriptions) }, `[AppSession] updateSubscriptions: sending ${derivedSubscriptions.length} subscriptions to cloud (derived from handlers)`);
4335
+ const subscriptionPayload = derivedSubscriptions.map((stream) => {
4323
4336
  const rate = this.streamRates.get(stream);
4324
4337
  if (rate && stream === "location_stream" /* LOCATION_STREAM */) {
4325
4338
  return { stream: "location_stream", rate };
@@ -4336,6 +4349,10 @@ class AppSession {
4336
4349
  this.send(message);
4337
4350
  }
4338
4351
  async handleReconnection() {
4352
+ if (this.terminated) {
4353
+ this.logger.info(`\uD83D\uDD04 Reconnection skipped: session was terminated (User session ended). ` + `If cloud restarts app, onSession will be called with fresh handlers.`);
4354
+ return;
4355
+ }
4339
4356
  if (!this.config.autoReconnect || !this.sessionId) {
4340
4357
  this.logger.debug(`\uD83D\uDD04 Reconnection skipped: autoReconnect=${this.config.autoReconnect}, sessionId=${this.sessionId ? "valid" : "invalid"}`);
4341
4358
  return;
@@ -5425,4 +5442,4 @@ export {
5425
5442
  AnimationUtils
5426
5443
  };
5427
5444
 
5428
- //# debugId=AD30D8A3207C691A64756E2164756E21
5445
+ //# debugId=E26109C36CC6A50F64756E2164756E21