@glassly/engine 0.3.0-dev.474 → 0.3.0-dev.484

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.
@@ -2,8 +2,7 @@
2
2
  * Anchor resolution — turn corner-anchored boxes into plain top-left boxes
3
3
  * against the device's real canvas. Runs in emitScene BEFORE the canPosition
4
4
  * branch so both processScene (clamping) and degradeScene (reading order)
5
- * only ever see concrete coordinates. Spec:
6
- * notes/superpowers/specs/2026-08-10-anchored-render-boxes.md
5
+ * only ever see concrete coordinates.
7
6
  */
8
7
  import type { SceneElementInput } from "./types";
9
8
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../../../../src/utils/display/scene/anchor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAA0B,iBAAiB,EAAC,MAAM,SAAS,CAAA;AAcvE;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,iBAAiB,EAAE,EACnC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,iBAAiB,EAAE,CAKrB"}
1
+ {"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../../../../src/utils/display/scene/anchor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAA0B,iBAAiB,EAAC,MAAM,SAAS,CAAA;AAcvE;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,iBAAiB,EAAE,EACnC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,iBAAiB,EAAE,CAKrB"}
@@ -2,8 +2,7 @@
2
2
  * Anchor resolution — turn corner-anchored boxes into plain top-left boxes
3
3
  * against the device's real canvas. Runs in emitScene BEFORE the canPosition
4
4
  * branch so both processScene (clamping) and degradeScene (reading order)
5
- * only ever see concrete coordinates. Spec:
6
- * notes/superpowers/specs/2026-08-10-anchored-render-boxes.md
5
+ * only ever see concrete coordinates.
7
6
  */
8
7
  function resolveBox(box, width, height) {
9
8
  const { anchor, x, y, w, h } = box;
@@ -1 +1 @@
1
- {"version":3,"file":"anchor.js","sourceRoot":"","sources":["../../../../src/utils/display/scene/anchor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,SAAS,UAAU,CAAC,GAAkB,EAAE,KAAa,EAAE,MAAc;IACnE,MAAM,EAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,GAAG,GAAG,CAAA;IAChC,MAAM,KAAK,GAAG,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,cAAc,CAAA;IACjE,MAAM,MAAM,GAAG,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,cAAc,CAAA;IACpE,OAAO;QACL,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAmC,EACnC,KAAa,EACb,MAAc;IAEd,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACtB,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,EAAE,CAAA;QACzE,OAAO,EAAC,GAAG,EAAE,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,EAAC,CAAA;IACxD,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["/**\n * Anchor resolution — turn corner-anchored boxes into plain top-left boxes\n * against the device's real canvas. Runs in emitScene BEFORE the canPosition\n * branch so both processScene (clamping) and degradeScene (reading order)\n * only ever see concrete coordinates. Spec:\n * notes/superpowers/specs/2026-08-10-anchored-render-boxes.md\n */\n\nimport type {SceneBox, SceneBoxInput, SceneElementInput} from \"./types\"\n\nfunction resolveBox(box: SceneBoxInput, width: number, height: number): SceneBox {\n const {anchor, x, y, w, h} = box\n const right = anchor === \"top-right\" || anchor === \"bottom-right\"\n const bottom = anchor === \"bottom-left\" || anchor === \"bottom-right\"\n return {\n x: right ? width - x - w : x,\n y: bottom ? height - y - h : y,\n w,\n h,\n }\n}\n\n/**\n * Resolve every anchored box in a scene to top-left coordinates on a W×H\n * canvas. Unanchored elements pass through unchanged (same reference — no\n * copy churn on the common path), as do malformed ones so processScene's\n * validation still sees and reports them. Non-finite insets survive the\n * subtraction as non-finite and are dropped by the same validation.\n */\nexport function resolveAnchors(\n input: readonly SceneElementInput[],\n width: number,\n height: number,\n): SceneElementInput[] {\n return input.map((el) => {\n if (!el || typeof el !== \"object\" || !el.box || !el.box.anchor) return el\n return {...el, box: resolveBox(el.box, width, height)}\n })\n}\n"]}
1
+ {"version":3,"file":"anchor.js","sourceRoot":"","sources":["../../../../src/utils/display/scene/anchor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,SAAS,UAAU,CAAC,GAAkB,EAAE,KAAa,EAAE,MAAc;IACnE,MAAM,EAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,GAAG,GAAG,CAAA;IAChC,MAAM,KAAK,GAAG,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,cAAc,CAAA;IACjE,MAAM,MAAM,GAAG,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,cAAc,CAAA;IACpE,OAAO;QACL,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAmC,EACnC,KAAa,EACb,MAAc;IAEd,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACtB,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,EAAE,CAAA;QACzE,OAAO,EAAC,GAAG,EAAE,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,EAAC,CAAA;IACxD,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["/**\n * Anchor resolution — turn corner-anchored boxes into plain top-left boxes\n * against the device's real canvas. Runs in emitScene BEFORE the canPosition\n * branch so both processScene (clamping) and degradeScene (reading order)\n * only ever see concrete coordinates.\n */\n\nimport type {SceneBox, SceneBoxInput, SceneElementInput} from \"./types\"\n\nfunction resolveBox(box: SceneBoxInput, width: number, height: number): SceneBox {\n const {anchor, x, y, w, h} = box\n const right = anchor === \"top-right\" || anchor === \"bottom-right\"\n const bottom = anchor === \"bottom-left\" || anchor === \"bottom-right\"\n return {\n x: right ? width - x - w : x,\n y: bottom ? height - y - h : y,\n w,\n h,\n }\n}\n\n/**\n * Resolve every anchored box in a scene to top-left coordinates on a W×H\n * canvas. Unanchored elements pass through unchanged (same reference — no\n * copy churn on the common path), as do malformed ones so processScene's\n * validation still sees and reports them. Non-finite insets survive the\n * subtraction as non-finite and are dropped by the same validation.\n */\nexport function resolveAnchors(\n input: readonly SceneElementInput[],\n width: number,\n height: number,\n): SceneElementInput[] {\n return input.map((el) => {\n if (!el || typeof el !== \"object\" || !el.box || !el.box.anchor) return el\n return {...el, box: resolveBox(el.box, width, height)}\n })\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glassly/engine",
3
- "version": "0.3.0-dev.474",
3
+ "version": "0.3.0-dev.484",
4
4
  "description": "Glassly Engine — miniapp registry, WebView bridge, and miniapp store",
5
5
  "main": "build/index.js",
6
6
  "react-native": "src/index.ts",
@@ -97,17 +97,17 @@
97
97
  "registry": "https://registry.npmjs.org/"
98
98
  },
99
99
  "dependencies": {
100
- "@glassly/bluetooth-sdk": "0.3.0-dev.474",
101
- "@glassly/cloud-client": "0.3.0-dev.474",
102
- "@glassly/cloud-protocol": "0.3.0-dev.474",
103
- "@glassly/crust": "0.3.0-dev.474",
104
- "@glassly/miniapp": "0.3.0-dev.474",
100
+ "@glassly/bluetooth-sdk": "0.3.0-dev.484",
101
+ "@glassly/cloud-client": "0.3.0-dev.484",
102
+ "@glassly/cloud-protocol": "0.3.0-dev.484",
103
+ "@glassly/crust": "0.3.0-dev.484",
104
+ "@glassly/miniapp": "0.3.0-dev.484",
105
105
  "buffer": "^6.0.3",
106
106
  "events": "^3.3.0",
107
107
  "react-native-marked": "8.1.1",
108
108
  "semver": "^7.7.4",
109
109
  "typesafe-ts": "^1.7.1",
110
- "@glassly/llm-providers": "0.3.0-dev.474"
110
+ "@glassly/llm-providers": "0.3.0-dev.484"
111
111
  },
112
112
  "devDependencies": {
113
113
  "@glassly/llm-providers": "workspace:*",
@@ -12,9 +12,9 @@ export interface EngineReleaseMetadata {
12
12
  export const ENGINE_RELEASE_METADATA: Readonly<EngineReleaseMetadata> = Object.freeze({
13
13
  "schemaVersion": 1,
14
14
  "familyBaseVersion": "0.3.0",
15
- "releaseIdentity": "0.3.0-dev.474",
16
- "releaseSetId": "glassly-0.3.0-dev.474",
17
- "sourceCommit": "d23db172572fca744fc756686262a1aa4701969c",
15
+ "releaseIdentity": "0.3.0-dev.484",
16
+ "releaseSetId": "glassly-0.3.0-dev.484",
17
+ "sourceCommit": "a432fcd0e2c5f51821851de826eb38dd65ad0de8",
18
18
  "otaManifestUrl": null,
19
19
  "otaManifestSha256": null
20
20
  })
@@ -10,8 +10,7 @@
10
10
  * - core-app vs background-app arbitration with a background lock
11
11
  *
12
12
  * Scope is deliberately local-only. Cloud-originated displays are untouched
13
- * and may race with local displays during dev; that's acceptable per plan
14
- * (notes/archive/agents/local-display-manager-plan.md).
13
+ * and may race with local displays during dev; that's acceptable.
15
14
  *
16
15
  * Display pacing is NOT done here. A JS-side ~300ms throttle used to live in
17
16
  * this class, but JS timers (and therefore the throttle's trailing flush) do
@@ -2142,14 +2142,17 @@ class LocalMiniappRuntime {
2142
2142
  const required = permissionForStream(stream)
2143
2143
  if (required && !declaredTypes.has(required)) {
2144
2144
  logPermissionNotDeclared(packageName, required, `to subscribe to "${stream}"`, `{"type": "${required}"}`)
2145
- this.sendResult(packageName, requestId, false, undefined, {
2145
+ const error = {
2146
2146
  code: MiniappErrorCode.PERMISSION_NOT_DECLARED,
2147
2147
  message: `${required} permission not declared in miniapp.json (required for "${stream}"). Add {"type": "${required}"} to the "permissions" array.`,
2148
2148
  // Extra context fields read by the SDK so authors that subscribe
2149
2149
  // to session.on("error") can format their own messages.
2150
2150
  permission: required,
2151
2151
  subscription: stream,
2152
- })
2152
+ }
2153
+ // The SDK sends SUBSCRIBE without a requestId, so push the rejection.
2154
+ if (requestId) this.sendResult(packageName, requestId, false, undefined, error)
2155
+ else this.sendToMiniapp(packageName, {type: MiniappResponseType.ERROR, ...error})
2153
2156
  return
2154
2157
  }
2155
2158
  }
@@ -2,8 +2,7 @@
2
2
  * Anchor resolution — turn corner-anchored boxes into plain top-left boxes
3
3
  * against the device's real canvas. Runs in emitScene BEFORE the canPosition
4
4
  * branch so both processScene (clamping) and degradeScene (reading order)
5
- * only ever see concrete coordinates. Spec:
6
- * notes/superpowers/specs/2026-08-10-anchored-render-boxes.md
5
+ * only ever see concrete coordinates.
7
6
  */
8
7
 
9
8
  import type {SceneBox, SceneBoxInput, SceneElementInput} from "./types"