@glassly/engine 0.3.5-dev.746 → 0.3.5-dev.749

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.
@@ -1,9 +1,9 @@
1
1
  export const ENGINE_RELEASE_METADATA = Object.freeze({
2
2
  "schemaVersion": 1,
3
3
  "familyBaseVersion": "0.3.5",
4
- "releaseIdentity": "0.3.5-dev.746",
5
- "releaseSetId": "glassly-0.3.5-dev.746",
6
- "sourceCommit": "cac52fa70073682f25120d73f6485c77c4117efe",
4
+ "releaseIdentity": "0.3.5-dev.749",
5
+ "releaseSetId": "glassly-0.3.5-dev.749",
6
+ "sourceCommit": "4461bce5d0be6fad2c3a8a42b0baf0228e215dc3",
7
7
  "otaManifestUrl": null,
8
8
  "otaManifestSha256": null
9
9
  });
@@ -1 +1 @@
1
- {"version":3,"file":"releaseMetadata.js","sourceRoot":"","sources":["../../src/generated/releaseMetadata.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,uBAAuB,GAAoC,MAAM,CAAC,MAAM,CAAC;IACpF,eAAe,EAAE,CAAC;IAClB,mBAAmB,EAAE,OAAO;IAC5B,iBAAiB,EAAE,eAAe;IAClC,cAAc,EAAE,uBAAuB;IACvC,cAAc,EAAE,0CAA0C;IAC1D,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;CAC1B,CAAC,CAAA","sourcesContent":["/** Generated by release CI. Do not edit in a release checkout. */\nexport interface EngineReleaseMetadata {\n schemaVersion: 1\n familyBaseVersion: string | null\n releaseIdentity: string | null\n releaseSetId: string | null\n sourceCommit: string | null\n otaManifestUrl: string | null\n otaManifestSha256: string | null\n}\n\nexport const ENGINE_RELEASE_METADATA: Readonly<EngineReleaseMetadata> = Object.freeze({\n \"schemaVersion\": 1,\n \"familyBaseVersion\": \"0.3.5\",\n \"releaseIdentity\": \"0.3.5-dev.746\",\n \"releaseSetId\": \"glassly-0.3.5-dev.746\",\n \"sourceCommit\": \"cac52fa70073682f25120d73f6485c77c4117efe\",\n \"otaManifestUrl\": null,\n \"otaManifestSha256\": null\n})\n"]}
1
+ {"version":3,"file":"releaseMetadata.js","sourceRoot":"","sources":["../../src/generated/releaseMetadata.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,uBAAuB,GAAoC,MAAM,CAAC,MAAM,CAAC;IACpF,eAAe,EAAE,CAAC;IAClB,mBAAmB,EAAE,OAAO;IAC5B,iBAAiB,EAAE,eAAe;IAClC,cAAc,EAAE,uBAAuB;IACvC,cAAc,EAAE,0CAA0C;IAC1D,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;CAC1B,CAAC,CAAA","sourcesContent":["/** Generated by release CI. Do not edit in a release checkout. */\nexport interface EngineReleaseMetadata {\n schemaVersion: 1\n familyBaseVersion: string | null\n releaseIdentity: string | null\n releaseSetId: string | null\n sourceCommit: string | null\n otaManifestUrl: string | null\n otaManifestSha256: string | null\n}\n\nexport const ENGINE_RELEASE_METADATA: Readonly<EngineReleaseMetadata> = Object.freeze({\n \"schemaVersion\": 1,\n \"familyBaseVersion\": \"0.3.5\",\n \"releaseIdentity\": \"0.3.5-dev.749\",\n \"releaseSetId\": \"glassly-0.3.5-dev.749\",\n \"sourceCommit\": \"4461bce5d0be6fad2c3a8a42b0baf0228e215dc3\",\n \"otaManifestUrl\": null,\n \"otaManifestSha256\": null\n})\n"]}
@@ -18,9 +18,10 @@ export declare function appDeclaresAction(app: ClientApp | undefined, actionId:
18
18
  * public by default; `visibility: "system"` ones need a system caller.
19
19
  */
20
20
  export declare function checkActionAccess(app: ClientApp | undefined, target: string | undefined, actionId: string | undefined, callerIsSystem: boolean): ActionError | null;
21
+ /** BgTimer's shape; passed in so this module stays loadable without the native timer. */
21
22
  export interface ActionTimers {
22
- setTimeout(cb: () => void, ms: number): number;
23
- clearTimeout(id: number): void;
23
+ setTimeout: (cb: () => void, ms: number) => number;
24
+ clearTimeout: (id: number) => void;
24
25
  }
25
26
  /** Outstanding ACTION_CALLs awaiting an ACTION_RESULT, keyed by host-generated callId. */
26
27
  export declare class PendingActionCalls {
@@ -1 +1 @@
1
- {"version":3,"file":"actionInvoke.d.ts","sourceRoot":"","sources":["../../src/services/actionInvoke.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAA;AAE9C,MAAM,MAAM,WAAW,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACnF,MAAM,MAAM,aAAa,GAAG;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GAAG;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAC,CAAA;AAEvF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,aAAsD,CAAA;AAEpH,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIvF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,SAAS,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,cAAc,EAAE,OAAO,GACtB,WAAW,GAAG,IAAI,CAyBpB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9C,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAED,0FAA0F;AAC1F,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAJlC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyF;gBAG5F,MAAM,EAAE,YAAY,EACpB,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO;IAG/D,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAUrG,gGAAgG;IAChG,YAAY,CAAC,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAyBhF"}
1
+ {"version":3,"file":"actionInvoke.d.ts","sourceRoot":"","sources":["../../src/services/actionInvoke.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAA;AAE9C,MAAM,MAAM,WAAW,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACnF,MAAM,MAAM,aAAa,GAAG;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GAAG;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAC,CAAA;AAEvF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,aAAsD,CAAA;AAEpH,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIvF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,SAAS,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,cAAc,EAAE,OAAO,GACtB,WAAW,GAAG,IAAI,CAyBpB;AAED,yFAAyF;AACzF,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAA;IAClD,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAED,0FAA0F;AAC1F,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAJlC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyF;gBAG5F,MAAM,EAAE,YAAY,EACpB,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO;IAG/D,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAUrG,gGAAgG;IAChG,YAAY,CAAC,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAyBhF"}
@@ -1 +1 @@
1
- {"version":3,"file":"actionInvoke.js","sourceRoot":"","sources":["../../src/services/actionInvoke.ts"],"names":[],"mappings":"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","sourcesContent":["import {MiniappErrorCode} from \"@glassly/miniapp\"\n\nimport type {ClientApp} from \"../types/applet\"\n\nexport type ActionError = {code: string; message: string} & Record<string, unknown>\nexport type ActionOutcome = {ok: true; data: unknown} | {ok: false; error: ActionError}\n\nexport const actionFailure = (code: string, message: string): ActionOutcome => ({ok: false, error: {code, message}})\n\n/** Installed, compatible, and declares the action. */\nexport function appDeclaresAction(app: ClientApp | undefined, actionId: string): boolean {\n if (!app) return false\n if (app.compatibility && app.compatibility.isCompatible === false) return false\n return (app.actions ?? []).some((a) => a.id === actionId)\n}\n\n/**\n * Gates shared by miniapp->miniapp invoke and host invoke. Declared actions are\n * public by default; `visibility: \"system\"` ones need a system caller.\n */\nexport function checkActionAccess(\n app: ClientApp | undefined,\n target: string | undefined,\n actionId: string | undefined,\n callerIsSystem: boolean,\n): ActionError | null {\n if (!target || !app) {\n return {\n code: MiniappErrorCode.APP_NOT_FOUND,\n message: `Miniapp not found: ${target ?? \"(missing targetPackageName)\"}`,\n }\n }\n if (!actionId) return {code: MiniappErrorCode.ACTION_NOT_FOUND, message: \"invoke requires an actionId\"}\n if (app.compatibility && app.compatibility.isCompatible === false) {\n return {\n code: MiniappErrorCode.APP_NOT_COMPATIBLE,\n message: `${target} is not compatible with the connected glasses`,\n }\n }\n const declared = (app.actions ?? []).find((a) => a.id === actionId)\n if (!declared) {\n return {code: MiniappErrorCode.ACTION_NOT_FOUND, message: `${target} does not declare action \"${actionId}\"`}\n }\n if (declared.visibility === \"system\" && !callerIsSystem) {\n return {\n code: MiniappErrorCode.NOT_PERMITTED,\n message: `Action \"${actionId}\" on ${target} is restricted to system apps`,\n }\n }\n return null\n}\n\nexport interface ActionTimers {\n setTimeout(cb: () => void, ms: number): number\n clearTimeout(id: number): void\n}\n\n/** Outstanding ACTION_CALLs awaiting an ACTION_RESULT, keyed by host-generated callId. */\nexport class PendingActionCalls {\n private readonly calls = new Map<string, {target: string; settle: (o: ActionOutcome) => void; timer: number}>()\n\n constructor(\n private readonly timers: ActionTimers,\n private readonly payloadTooLarge: (value: unknown) => boolean,\n ) {}\n\n /** Register a call; resolves with its outcome, or ACTION_TIMEOUT. */\n register(callId: string, target: string, actionId: string, timeoutMs: number): Promise<ActionOutcome> {\n return new Promise((resolve) => {\n const timer = this.timers.setTimeout(() => {\n this.calls.delete(callId)\n resolve(actionFailure(MiniappErrorCode.ACTION_TIMEOUT, `action \"${actionId}\" timed out after ${timeoutMs}ms`))\n }, timeoutMs)\n this.calls.set(callId, {target, settle: resolve, timer})\n })\n }\n\n /** Settle from a target's ACTION_RESULT payload. Only the invoked target may resolve a call. */\n handleResult(targetPackageName: string, payload: Record<string, unknown>): void {\n const callId = payload.callId as string | undefined\n if (!callId) return\n const pending = this.calls.get(callId)\n // callIds are guessable (timestamp + seq): a different miniapp must not spoof someone else's result.\n if (!pending || pending.target !== targetPackageName) return\n this.calls.delete(callId)\n this.timers.clearTimeout(pending.timer)\n\n if (payload.ok === true) {\n if (this.payloadTooLarge(payload.result)) {\n pending.settle(actionFailure(MiniappErrorCode.PAYLOAD_TOO_LARGE, \"action result exceeded the 256 KB cap\"))\n return\n }\n pending.settle({ok: true, data: payload.result ?? null})\n return\n }\n pending.settle({\n ok: false,\n error: (payload.error as ActionError | undefined) ?? {\n code: MiniappErrorCode.INTERNAL,\n message: \"action handler error\",\n },\n })\n }\n}\n"]}
1
+ {"version":3,"file":"actionInvoke.js","sourceRoot":"","sources":["../../src/services/actionInvoke.ts"],"names":[],"mappings":"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","sourcesContent":["import {MiniappErrorCode} from \"@glassly/miniapp\"\n\nimport type {ClientApp} from \"../types/applet\"\n\nexport type ActionError = {code: string; message: string} & Record<string, unknown>\nexport type ActionOutcome = {ok: true; data: unknown} | {ok: false; error: ActionError}\n\nexport const actionFailure = (code: string, message: string): ActionOutcome => ({ok: false, error: {code, message}})\n\n/** Installed, compatible, and declares the action. */\nexport function appDeclaresAction(app: ClientApp | undefined, actionId: string): boolean {\n if (!app) return false\n if (app.compatibility && app.compatibility.isCompatible === false) return false\n return (app.actions ?? []).some((a) => a.id === actionId)\n}\n\n/**\n * Gates shared by miniapp->miniapp invoke and host invoke. Declared actions are\n * public by default; `visibility: \"system\"` ones need a system caller.\n */\nexport function checkActionAccess(\n app: ClientApp | undefined,\n target: string | undefined,\n actionId: string | undefined,\n callerIsSystem: boolean,\n): ActionError | null {\n if (!target || !app) {\n return {\n code: MiniappErrorCode.APP_NOT_FOUND,\n message: `Miniapp not found: ${target ?? \"(missing targetPackageName)\"}`,\n }\n }\n if (!actionId) return {code: MiniappErrorCode.ACTION_NOT_FOUND, message: \"invoke requires an actionId\"}\n if (app.compatibility && app.compatibility.isCompatible === false) {\n return {\n code: MiniappErrorCode.APP_NOT_COMPATIBLE,\n message: `${target} is not compatible with the connected glasses`,\n }\n }\n const declared = (app.actions ?? []).find((a) => a.id === actionId)\n if (!declared) {\n return {code: MiniappErrorCode.ACTION_NOT_FOUND, message: `${target} does not declare action \"${actionId}\"`}\n }\n if (declared.visibility === \"system\" && !callerIsSystem) {\n return {\n code: MiniappErrorCode.NOT_PERMITTED,\n message: `Action \"${actionId}\" on ${target} is restricted to system apps`,\n }\n }\n return null\n}\n\n/** BgTimer's shape; passed in so this module stays loadable without the native timer. */\nexport interface ActionTimers {\n setTimeout: (cb: () => void, ms: number) => number\n clearTimeout: (id: number) => void\n}\n\n/** Outstanding ACTION_CALLs awaiting an ACTION_RESULT, keyed by host-generated callId. */\nexport class PendingActionCalls {\n private readonly calls = new Map<string, {target: string; settle: (o: ActionOutcome) => void; timer: number}>()\n\n constructor(\n private readonly timers: ActionTimers,\n private readonly payloadTooLarge: (value: unknown) => boolean,\n ) {}\n\n /** Register a call; resolves with its outcome, or ACTION_TIMEOUT. */\n register(callId: string, target: string, actionId: string, timeoutMs: number): Promise<ActionOutcome> {\n return new Promise((resolve) => {\n const timer = this.timers.setTimeout(() => {\n this.calls.delete(callId)\n resolve(actionFailure(MiniappErrorCode.ACTION_TIMEOUT, `action \"${actionId}\" timed out after ${timeoutMs}ms`))\n }, timeoutMs)\n this.calls.set(callId, {target, settle: resolve, timer})\n })\n }\n\n /** Settle from a target's ACTION_RESULT payload. Only the invoked target may resolve a call. */\n handleResult(targetPackageName: string, payload: Record<string, unknown>): void {\n const callId = payload.callId as string | undefined\n if (!callId) return\n const pending = this.calls.get(callId)\n // callIds are guessable (timestamp + seq): a different miniapp must not spoof someone else's result.\n if (!pending || pending.target !== targetPackageName) return\n this.calls.delete(callId)\n this.timers.clearTimeout(pending.timer)\n\n if (payload.ok === true) {\n if (this.payloadTooLarge(payload.result)) {\n pending.settle(actionFailure(MiniappErrorCode.PAYLOAD_TOO_LARGE, \"action result exceeded the 256 KB cap\"))\n return\n }\n pending.settle({ok: true, data: payload.result ?? null})\n return\n }\n pending.settle({\n ok: false,\n error: (payload.error as ActionError | undefined) ?? {\n code: MiniappErrorCode.INTERNAL,\n message: \"action handler error\",\n },\n })\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glassly/engine",
3
- "version": "0.3.5-dev.746",
3
+ "version": "0.3.5-dev.749",
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.5-dev.746",
101
- "@glassly/cloud-client": "0.3.5-dev.746",
102
- "@glassly/cloud-protocol": "0.3.5-dev.746",
103
- "@glassly/crust": "0.3.5-dev.746",
104
- "@glassly/miniapp": "0.3.5-dev.746",
100
+ "@glassly/bluetooth-sdk": "0.3.5-dev.749",
101
+ "@glassly/cloud-client": "0.3.5-dev.749",
102
+ "@glassly/cloud-protocol": "0.3.5-dev.749",
103
+ "@glassly/crust": "0.3.5-dev.749",
104
+ "@glassly/miniapp": "0.3.5-dev.749",
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.5-dev.746",
110
+ "@glassly/llm-providers": "0.3.5-dev.749",
111
111
  "@huggingface/jinja": "^0.5.9",
112
112
  "jsonrepair": "^3.12.0"
113
113
  },
@@ -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.5",
15
- "releaseIdentity": "0.3.5-dev.746",
16
- "releaseSetId": "glassly-0.3.5-dev.746",
17
- "sourceCommit": "cac52fa70073682f25120d73f6485c77c4117efe",
15
+ "releaseIdentity": "0.3.5-dev.749",
16
+ "releaseSetId": "glassly-0.3.5-dev.749",
17
+ "sourceCommit": "4461bce5d0be6fad2c3a8a42b0baf0228e215dc3",
18
18
  "otaManifestUrl": null,
19
19
  "otaManifestSha256": null
20
20
  })
@@ -50,9 +50,10 @@ export function checkActionAccess(
50
50
  return null
51
51
  }
52
52
 
53
+ /** BgTimer's shape; passed in so this module stays loadable without the native timer. */
53
54
  export interface ActionTimers {
54
- setTimeout(cb: () => void, ms: number): number
55
- clearTimeout(id: number): void
55
+ setTimeout: (cb: () => void, ms: number) => number
56
+ clearTimeout: (id: number) => void
56
57
  }
57
58
 
58
59
  /** Outstanding ACTION_CALLs awaiting an ACTION_RESULT, keyed by host-generated callId. */