@glassly/engine 0.4.0-dev.1043 → 0.4.0-dev.1051
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/build/engine.d.ts +1 -0
- package/build/engine.d.ts.map +1 -1
- package/build/facades/reports.d.ts +15 -0
- package/build/facades/reports.d.ts.map +1 -1
- package/build/facades/reports.js +37 -0
- package/build/facades/reports.js.map +1 -1
- package/build/generated/releaseMetadata.js +3 -3
- package/build/generated/releaseMetadata.js.map +1 -1
- package/build/services/CloudClientService.d.ts +3 -1
- package/build/services/CloudClientService.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/facades/reports.ts +41 -0
- package/src/generated/releaseMetadata.ts +3 -3
package/build/engine.d.ts
CHANGED
|
@@ -229,6 +229,7 @@ export declare const engine: {
|
|
|
229
229
|
/** Bug-report, automatic runtime report, and feedback submission. */
|
|
230
230
|
reports: {
|
|
231
231
|
submit(input: import(".").EngineSubmitReportInput): Promise<import(".").ReportSubmitResult>;
|
|
232
|
+
uploadLogs: () => Promise<import("./facades/reports").LogUploadResult>;
|
|
232
233
|
};
|
|
233
234
|
/** Firmware OTA read/observe surface (updateAvailable/status + on* subscriptions). */
|
|
234
235
|
ota: {
|
package/build/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAC,SAAS,EAAkD,aAAa,EAAC,MAAM,qBAAqB,CAAA;AAgD5G,eAAO,MAAM,MAAM;IACjB,2EAA2E;;IAE3E,8EAA8E;;IAE9E;iDAC6C;;IA2G7C;;yCAEqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoCrC,kEAAkE;;;;;;;;;;;;;;;;;;;;;;;IAElE,wEAAwE;;;;;;;;IAExE,sEAAsE;;;;;;;;;;;;IAEtE,qFAAqF;;;;gBA7IpE,CAAC;mBAAiB,CAAC;;;gBAMlC,CAFF;mBAAiB,CAAC;;;;;;;;;;;;;;;;;IA2IlB,qEAAqE
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAC,SAAS,EAAkD,aAAa,EAAC,MAAM,qBAAqB,CAAA;AAgD5G,eAAO,MAAM,MAAM;IACjB,2EAA2E;;IAE3E,8EAA8E;;IAE9E;iDAC6C;;IA2G7C;;yCAEqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoCrC,kEAAkE;;;;;;;;;;;;;;;;;;;;;;;IAElE,wEAAwE;;;;;;;;IAExE,sEAAsE;;;;;;;;;;;;IAEtE,qFAAqF;;;;gBA7IpE,CAAC;mBAAiB,CAAC;;;gBAMlC,CAFF;mBAAiB,CAAC;;;;;;;;;;;;;;;;;IA2IlB,qEAAqE;;;;;IAErE,sFAAsF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAEtF,6EAA6E;;;;;;;;;;;;IAE7E,iFAAiF;;;;;;;;;;;;;;;;;;;;;;;;IAEjF,8CAA8C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAE9C,uDAAuD;;;;;;;;;;;;;;;;IAEvD,8EAA8E;;;;;;;;IAE9E,qFAAqF;;;;IAErF,4EAA4E;;;;;;;;;;;IAE5E,+EAA+E;;;;;;;;;;;;;;;IAE/E,qGAAqG;;;;;;IAErG,kFAAkF;;;;;+BAvKjE,CAAC;;;+BAUiC,CAAC;;;;;;;;;;;;IA+JpD,6FAA6F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG9F,CAAA"}
|
|
@@ -29,8 +29,23 @@ export type ReportSubmitResult = {
|
|
|
29
29
|
status: "failed";
|
|
30
30
|
error: string;
|
|
31
31
|
};
|
|
32
|
+
/** A debug-console log upload: the report it went to, and whether it replaced an earlier upload. */
|
|
33
|
+
export type LogUploadResult = {
|
|
34
|
+
status: "created" | "updated";
|
|
35
|
+
reportId: string;
|
|
36
|
+
} | {
|
|
37
|
+
status: "busy";
|
|
38
|
+
} | {
|
|
39
|
+
status: "failed";
|
|
40
|
+
error: string;
|
|
41
|
+
};
|
|
42
|
+
/** Uploads within this window after a report's creation replace its phone logs. */
|
|
43
|
+
export declare const LOG_UPLOAD_WINDOW_MS: number;
|
|
44
|
+
/** Phone logs only, as a manual bug report; repeated taps cannot spam reports. */
|
|
45
|
+
declare function uploadLogs(): Promise<LogUploadResult>;
|
|
32
46
|
export declare const reports: {
|
|
33
47
|
submit(input: EngineSubmitReportInput): Promise<ReportSubmitResult>;
|
|
48
|
+
uploadLogs: typeof uploadLogs;
|
|
34
49
|
};
|
|
35
50
|
export declare function submitAutomaticReport(input: EngineSubmitAutomaticReportInput): Promise<ReportSubmitResult>;
|
|
36
51
|
//# sourceMappingURL=reports.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../../src/facades/reports.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,qBAAqB,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAC,MAAM,uBAAuB,CAAA;AAOhH,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,uBAAuB,CAAA;AAE9B,MAAM,MAAM,uBAAuB,GAC/B,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;IAAC,IAAI,EAAE,KAAK,CAAA;CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAChC,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAA;CACtC,CAAC,GACF,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;IAAC,IAAI,EAAE,UAAU,CAAA;CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;IACjE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;CACjC,CAAC,CAAA;AAEN,MAAM,MAAM,gCAAgC,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;IAAC,IAAI,EAAE,WAAW,CAAA;CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;IAChH,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAChC,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAA;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAID,MAAM,MAAM,kBAAkB,GAC1B;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,YAAY,CAAA;CAAC,GACnE;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,yBAAyB,CAAA;CAAC,GACtD;IAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAA;AA8HrC,eAAO,MAAM,OAAO;kBACJ,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,CAAC
|
|
1
|
+
{"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../../src/facades/reports.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,qBAAqB,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAC,MAAM,uBAAuB,CAAA;AAOhH,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,uBAAuB,CAAA;AAE9B,MAAM,MAAM,uBAAuB,GAC/B,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;IAAC,IAAI,EAAE,KAAK,CAAA;CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAChC,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAA;CACtC,CAAC,GACF,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;IAAC,IAAI,EAAE,UAAU,CAAA;CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;IACjE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;CACjC,CAAC,CAAA;AAEN,MAAM,MAAM,gCAAgC,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;IAAC,IAAI,EAAE,WAAW,CAAA;CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;IAChH,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAChC,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAA;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAID,MAAM,MAAM,kBAAkB,GAC1B;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,YAAY,CAAA;CAAC,GACnE;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,yBAAyB,CAAA;CAAC,GACtD;IAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAA;AA8HrC,oGAAoG;AACpG,MAAM,MAAM,eAAe,GACvB;IAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,GACjD;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,GAChB;IAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAA;AAErC,mFAAmF;AACnF,eAAO,MAAM,oBAAoB,QAAa,CAAA;AAI9C,kFAAkF;AAClF,iBAAe,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC,CA0BpD;AAED,eAAO,MAAM,OAAO;kBACJ,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,CAAC;;CAIpE,CAAA;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gCAAgC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAE1G"}
|
package/build/facades/reports.js
CHANGED
|
@@ -123,10 +123,47 @@ async function submitReportInternal(input) {
|
|
|
123
123
|
}
|
|
124
124
|
return { status: "submitted", reportId, reportStatus };
|
|
125
125
|
}
|
|
126
|
+
/** Uploads within this window after a report's creation replace its phone logs. */
|
|
127
|
+
export const LOG_UPLOAD_WINDOW_MS = 5 * 60_000;
|
|
128
|
+
let logUpload = null;
|
|
129
|
+
let logUploadInFlight = false;
|
|
130
|
+
/** Phone logs only, as a manual bug report; repeated taps cannot spam reports. */
|
|
131
|
+
async function uploadLogs() {
|
|
132
|
+
if (logUploadInFlight)
|
|
133
|
+
return { status: "busy" };
|
|
134
|
+
logUploadInFlight = true;
|
|
135
|
+
try {
|
|
136
|
+
const logs = logBuffer.getRecentLogs();
|
|
137
|
+
const now = Date.now();
|
|
138
|
+
if (logUpload && now - logUpload.createdAt < LOG_UPLOAD_WINDOW_MS) {
|
|
139
|
+
await cloudClientService.core.reports.addLogs(logUpload.reportId, "phone", logs, { replace: true });
|
|
140
|
+
return { status: "updated", reportId: logUpload.reportId };
|
|
141
|
+
}
|
|
142
|
+
const context = await collectDiagnosticContext();
|
|
143
|
+
const res = await cloudClientService.core.reports.submit({
|
|
144
|
+
kind: "bug",
|
|
145
|
+
trigger: { type: "manual", source: "debug_console", reason: "log_upload" },
|
|
146
|
+
report: { actualBehavior: "Debug console log upload" },
|
|
147
|
+
context,
|
|
148
|
+
});
|
|
149
|
+
logUpload = { reportId: res.reportId, createdAt: now };
|
|
150
|
+
if (logs.length > 0)
|
|
151
|
+
await cloudClientService.core.reports.addLogs(res.reportId, "phone", logs);
|
|
152
|
+
await cloudClientService.core.reports.complete(res.reportId);
|
|
153
|
+
return { status: "created", reportId: res.reportId };
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
return { status: "failed", error: error instanceof Error ? error.message : String(error) };
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
logUploadInFlight = false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
126
162
|
export const reports = {
|
|
127
163
|
submit(input) {
|
|
128
164
|
return submitReportInternal(input);
|
|
129
165
|
},
|
|
166
|
+
uploadLogs,
|
|
130
167
|
};
|
|
131
168
|
export function submitAutomaticReport(input) {
|
|
132
169
|
return submitReportInternal(input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reports.js","sourceRoot":"","sources":["../../src/facades/reports.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * reports facade — `engine.reports`: user/system report submission over the\n * Cloud core client.\n *\n * Host/OEM code owns UI and wording. Engine owns Glassly mechanics: context\n * collection, recent phone logs, Cloud calls, local automatic throttling,\n * screenshots, and notifying connected glasses.\n */\nimport BluetoothSdk from \"@glassly/bluetooth-sdk/internal\"\nimport type {ReportAttachmentInput, ReportContext, ReportStatus, SubmitReportInput} from \"@glassly/cloud-client\"\nimport {useGlassesStore} from \"../stores/glasses\"\nimport {isGlassesConnected} from \"../services/GlassesReadiness\"\nimport {cloudClientService} from \"../services/CloudClientService\"\nimport {collectDiagnosticContext} from \"../utils/diagnosticContext\"\nimport {logBuffer} from \"../utils/devLogging\"\n\nexport type {\n ReportAttachmentInput,\n ReportContext,\n ReportDetails,\n ReportStatus,\n ReportTrigger,\n} from \"@glassly/cloud-client\"\n\nexport type EngineSubmitReportInput =\n | (Omit<Extract<SubmitReportInput, {kind: \"bug\"}>, \"context\"> & {\n context?: Partial<ReportContext>\n screenshots?: ReportAttachmentInput[]\n })\n | (Omit<Extract<SubmitReportInput, {kind: \"feedback\"}>, \"context\"> & {\n context?: Partial<ReportContext>\n })\n\nexport type EngineSubmitAutomaticReportInput = Omit<Extract<SubmitReportInput, {kind: \"automatic\"}>, \"context\"> & {\n context?: Partial<ReportContext>\n screenshots?: ReportAttachmentInput[]\n throttleKey?: string\n throttleWindowMs?: number\n}\n\ntype InternalSubmitReportInput = EngineSubmitReportInput | EngineSubmitAutomaticReportInput\n\nexport type ReportSubmitResult =\n | {status: \"submitted\"; reportId: string; reportStatus: ReportStatus}\n | {status: \"skipped\"; reason: \"throttled_within_window\"}\n | {status: \"failed\"; error: string}\n\nconst DEFAULT_AUTOMATIC_REPORT_THROTTLE_MS = 90_000\nconst automaticReportThrottleRegistry = new Map<string, number>()\n\nfunction automaticThrottleShouldSkip(key: string, nowMs: number, windowMs: number): boolean {\n const previous = automaticReportThrottleRegistry.get(key)\n if (previous !== undefined && nowMs - previous < windowMs) {\n return true\n }\n pruneAutomaticThrottleRegistry(nowMs, windowMs)\n return false\n}\n\nfunction markAutomaticThrottleSuccess(key: string, nowMs: number, windowMs: number): void {\n automaticReportThrottleRegistry.set(key, nowMs)\n pruneAutomaticThrottleRegistry(nowMs, windowMs)\n}\n\nfunction pruneAutomaticThrottleRegistry(nowMs: number, windowMs: number): void {\n for (const [entryKey, entryTime] of automaticReportThrottleRegistry) {\n if (nowMs - entryTime > windowMs * 3) {\n automaticReportThrottleRegistry.delete(entryKey)\n }\n }\n}\n\nfunction notifyGlasses(reportId: string, apiBaseUrl?: string | null): void {\n if (!isGlassesConnected(useGlassesStore.getState().connection)) return\n void (async () => {\n try {\n await cloudClientService.syncCoreTokenToBluetooth()\n await BluetoothSdk.sendIncidentId(reportId, apiBaseUrl ?? cloudClientService.getCoreUrl())\n } catch (error) {\n console.warn(\"reports.submit: notify glasses failed:\", error instanceof Error ? error.message : error)\n }\n })()\n}\n\nasync function submitReportInternal(input: InternalSubmitReportInput): Promise<ReportSubmitResult> {\n const throttle =\n input.kind === \"automatic\" && input.throttleKey\n ? {\n key: input.throttleKey,\n windowMs: input.throttleWindowMs ?? DEFAULT_AUTOMATIC_REPORT_THROTTLE_MS,\n }\n : null\n\n if (input.kind === \"automatic\" && input.throttleKey) {\n const shouldSkip = automaticThrottleShouldSkip(\n input.throttleKey,\n Date.now(),\n throttle?.windowMs ?? DEFAULT_AUTOMATIC_REPORT_THROTTLE_MS,\n )\n if (shouldSkip) return {status: \"skipped\", reason: \"throttled_within_window\"}\n }\n\n const context = await collectDiagnosticContext(input.context)\n let reportId: string\n let reportStatus: ReportStatus\n let artifactsComplete = true\n try {\n const res =\n input.kind === \"feedback\"\n ? await cloudClientService.core.reports.submit({\n kind: \"feedback\",\n feedback: input.feedback,\n context,\n })\n : input.kind === \"bug\"\n ? await cloudClientService.core.reports.submit({\n kind: \"bug\",\n trigger: input.trigger,\n report: input.report,\n context,\n })\n : await cloudClientService.core.reports.submit({\n kind: \"automatic\",\n trigger: input.trigger,\n report: input.report,\n context,\n })\n reportId = res.reportId\n reportStatus = res.status\n } catch (error) {\n return {status: \"failed\", error: error instanceof Error ? error.message : String(error)}\n }\n\n if (input.kind !== \"feedback\") {\n const logs = logBuffer.getRecentLogs()\n if (logs.length > 0) {\n try {\n await cloudClientService.core.reports.addLogs(reportId, \"phone\", logs)\n } catch (error) {\n artifactsComplete = false\n console.warn(\"reports.submit: add phone logs failed:\", error instanceof Error ? error.message : error)\n }\n }\n\n notifyGlasses(reportId, cloudClientService.getCoreUrl())\n\n if (input.screenshots && input.screenshots.length > 0) {\n try {\n await cloudClientService.core.reports.addScreenshots(reportId, input.screenshots)\n } catch (error) {\n artifactsComplete = false\n console.warn(\"reports.submit: add screenshots failed:\", error instanceof Error ? error.message : error)\n }\n }\n\n try {\n const completed = await cloudClientService.core.reports.complete(reportId)\n reportStatus = completed.status\n } catch (error) {\n artifactsComplete = false\n console.warn(\"reports.submit: complete report failed:\", error instanceof Error ? error.message : error)\n }\n }\n\n if (throttle && artifactsComplete) {\n markAutomaticThrottleSuccess(throttle.key, Date.now(), throttle.windowMs)\n }\n\n return {status: \"submitted\", reportId, reportStatus}\n}\n\nexport const reports = {\n submit(input: EngineSubmitReportInput): Promise<ReportSubmitResult> {\n return submitReportInternal(input)\n },\n}\n\nexport function submitAutomaticReport(input: EngineSubmitAutomaticReportInput): Promise<ReportSubmitResult> {\n return submitReportInternal(input)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"reports.js","sourceRoot":"","sources":["../../src/facades/reports.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,YAAY,MAAM,iCAAiC,CAAA;AAE1D,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAC,kBAAkB,EAAC,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EAAC,kBAAkB,EAAC,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAC,wBAAwB,EAAC,MAAM,4BAA4B,CAAA;AACnE,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAA;AAiC7C,MAAM,oCAAoC,GAAG,MAAM,CAAA;AACnD,MAAM,+BAA+B,GAAG,IAAI,GAAG,EAAkB,CAAA;AAEjE,SAAS,2BAA2B,CAAC,GAAW,EAAE,KAAa,EAAE,QAAgB;IAC/E,MAAM,QAAQ,GAAG,+BAA+B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACzD,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAA;IACb,CAAC;IACD,8BAA8B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC/C,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,4BAA4B,CAAC,GAAW,EAAE,KAAa,EAAE,QAAgB;IAChF,+BAA+B,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC/C,8BAA8B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AACjD,CAAC;AAED,SAAS,8BAA8B,CAAC,KAAa,EAAE,QAAgB;IACrE,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,+BAA+B,EAAE,CAAC;QACpE,IAAI,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;YACrC,+BAA+B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,UAA0B;IACjE,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC;QAAE,OAAM;IACtE,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,IAAI,CAAC;YACH,MAAM,kBAAkB,CAAC,wBAAwB,EAAE,CAAA;YACnD,MAAM,YAAY,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,IAAI,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAA;QAC5F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QACxG,CAAC;IACH,CAAC,CAAC,EAAE,CAAA;AACN,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,KAAgC;IAClE,MAAM,QAAQ,GACZ,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,WAAW;QAC7C,CAAC,CAAC;YACE,GAAG,EAAE,KAAK,CAAC,WAAW;YACtB,QAAQ,EAAE,KAAK,CAAC,gBAAgB,IAAI,oCAAoC;SACzE;QACH,CAAC,CAAC,IAAI,CAAA;IAEV,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,2BAA2B,CAC5C,KAAK,CAAC,WAAW,EACjB,IAAI,CAAC,GAAG,EAAE,EACV,QAAQ,EAAE,QAAQ,IAAI,oCAAoC,CAC3D,CAAA;QACD,IAAI,UAAU;YAAE,OAAO,EAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,yBAAyB,EAAC,CAAA;IAC/E,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC7D,IAAI,QAAgB,CAAA;IACpB,IAAI,YAA0B,CAAA;IAC9B,IAAI,iBAAiB,GAAG,IAAI,CAAA;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GACP,KAAK,CAAC,IAAI,KAAK,UAAU;YACvB,CAAC,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC3C,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,OAAO;aACR,CAAC;YACJ,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK;gBACpB,CAAC,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;oBAC3C,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,OAAO;iBACR,CAAC;gBACJ,CAAC,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;oBAC3C,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,OAAO;iBACR,CAAC,CAAA;QACV,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;QACvB,YAAY,GAAG,GAAG,CAAC,MAAM,CAAA;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAC,CAAA;IAC1F,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,EAAE,CAAA;QACtC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;YACxE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,iBAAiB,GAAG,KAAK,CAAA;gBACzB,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YACxG,CAAC;QACH,CAAC;QAED,aAAa,CAAC,QAAQ,EAAE,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAA;QAExD,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;YACnF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,iBAAiB,GAAG,KAAK,CAAA;gBACzB,OAAO,CAAC,IAAI,CAAC,yCAAyC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YACzG,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAC1E,YAAY,GAAG,SAAS,CAAC,MAAM,CAAA;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iBAAiB,GAAG,KAAK,CAAA;YACzB,OAAO,CAAC,IAAI,CAAC,yCAAyC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QACzG,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,IAAI,iBAAiB,EAAE,CAAC;QAClC,4BAA4B,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC3E,CAAC;IAED,OAAO,EAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAC,CAAA;AACtD,CAAC;AAQD,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,MAAM,CAAA;AAC9C,IAAI,SAAS,GAAiD,IAAI,CAAA;AAClE,IAAI,iBAAiB,GAAG,KAAK,CAAA;AAE7B,kFAAkF;AAClF,KAAK,UAAU,UAAU;IACvB,IAAI,iBAAiB;QAAE,OAAO,EAAC,MAAM,EAAE,MAAM,EAAC,CAAA;IAC9C,iBAAiB,GAAG,IAAI,CAAA;IACxB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,EAAE,CAAA;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,SAAS,IAAI,GAAG,GAAG,SAAS,CAAC,SAAS,GAAG,oBAAoB,EAAE,CAAC;YAClE,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAA;YACjG,OAAO,EAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAC,CAAA;QAC1D,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,wBAAwB,EAAE,CAAA;QAChD,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACvD,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAC;YACxE,MAAM,EAAE,EAAC,cAAc,EAAE,0BAA0B,EAAC;YACpD,OAAO;SACR,CAAC,CAAA;QACF,SAAS,GAAG,EAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAC,CAAA;QACpD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QAC/F,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5D,OAAO,EAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAC,CAAA;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAC,CAAA;IAC1F,CAAC;YAAS,CAAC;QACT,iBAAiB,GAAG,KAAK,CAAA;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,MAAM,CAAC,KAA8B;QACnC,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC;IACD,UAAU;CACX,CAAA;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAuC;IAC3E,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAA;AACpC,CAAC","sourcesContent":["/**\n * reports facade — `engine.reports`: user/system report submission over the\n * Cloud core client.\n *\n * Host/OEM code owns UI and wording. Engine owns Glassly mechanics: context\n * collection, recent phone logs, Cloud calls, local automatic throttling,\n * screenshots, and notifying connected glasses.\n */\nimport BluetoothSdk from \"@glassly/bluetooth-sdk/internal\"\nimport type {ReportAttachmentInput, ReportContext, ReportStatus, SubmitReportInput} from \"@glassly/cloud-client\"\nimport {useGlassesStore} from \"../stores/glasses\"\nimport {isGlassesConnected} from \"../services/GlassesReadiness\"\nimport {cloudClientService} from \"../services/CloudClientService\"\nimport {collectDiagnosticContext} from \"../utils/diagnosticContext\"\nimport {logBuffer} from \"../utils/devLogging\"\n\nexport type {\n ReportAttachmentInput,\n ReportContext,\n ReportDetails,\n ReportStatus,\n ReportTrigger,\n} from \"@glassly/cloud-client\"\n\nexport type EngineSubmitReportInput =\n | (Omit<Extract<SubmitReportInput, {kind: \"bug\"}>, \"context\"> & {\n context?: Partial<ReportContext>\n screenshots?: ReportAttachmentInput[]\n })\n | (Omit<Extract<SubmitReportInput, {kind: \"feedback\"}>, \"context\"> & {\n context?: Partial<ReportContext>\n })\n\nexport type EngineSubmitAutomaticReportInput = Omit<Extract<SubmitReportInput, {kind: \"automatic\"}>, \"context\"> & {\n context?: Partial<ReportContext>\n screenshots?: ReportAttachmentInput[]\n throttleKey?: string\n throttleWindowMs?: number\n}\n\ntype InternalSubmitReportInput = EngineSubmitReportInput | EngineSubmitAutomaticReportInput\n\nexport type ReportSubmitResult =\n | {status: \"submitted\"; reportId: string; reportStatus: ReportStatus}\n | {status: \"skipped\"; reason: \"throttled_within_window\"}\n | {status: \"failed\"; error: string}\n\nconst DEFAULT_AUTOMATIC_REPORT_THROTTLE_MS = 90_000\nconst automaticReportThrottleRegistry = new Map<string, number>()\n\nfunction automaticThrottleShouldSkip(key: string, nowMs: number, windowMs: number): boolean {\n const previous = automaticReportThrottleRegistry.get(key)\n if (previous !== undefined && nowMs - previous < windowMs) {\n return true\n }\n pruneAutomaticThrottleRegistry(nowMs, windowMs)\n return false\n}\n\nfunction markAutomaticThrottleSuccess(key: string, nowMs: number, windowMs: number): void {\n automaticReportThrottleRegistry.set(key, nowMs)\n pruneAutomaticThrottleRegistry(nowMs, windowMs)\n}\n\nfunction pruneAutomaticThrottleRegistry(nowMs: number, windowMs: number): void {\n for (const [entryKey, entryTime] of automaticReportThrottleRegistry) {\n if (nowMs - entryTime > windowMs * 3) {\n automaticReportThrottleRegistry.delete(entryKey)\n }\n }\n}\n\nfunction notifyGlasses(reportId: string, apiBaseUrl?: string | null): void {\n if (!isGlassesConnected(useGlassesStore.getState().connection)) return\n void (async () => {\n try {\n await cloudClientService.syncCoreTokenToBluetooth()\n await BluetoothSdk.sendIncidentId(reportId, apiBaseUrl ?? cloudClientService.getCoreUrl())\n } catch (error) {\n console.warn(\"reports.submit: notify glasses failed:\", error instanceof Error ? error.message : error)\n }\n })()\n}\n\nasync function submitReportInternal(input: InternalSubmitReportInput): Promise<ReportSubmitResult> {\n const throttle =\n input.kind === \"automatic\" && input.throttleKey\n ? {\n key: input.throttleKey,\n windowMs: input.throttleWindowMs ?? DEFAULT_AUTOMATIC_REPORT_THROTTLE_MS,\n }\n : null\n\n if (input.kind === \"automatic\" && input.throttleKey) {\n const shouldSkip = automaticThrottleShouldSkip(\n input.throttleKey,\n Date.now(),\n throttle?.windowMs ?? DEFAULT_AUTOMATIC_REPORT_THROTTLE_MS,\n )\n if (shouldSkip) return {status: \"skipped\", reason: \"throttled_within_window\"}\n }\n\n const context = await collectDiagnosticContext(input.context)\n let reportId: string\n let reportStatus: ReportStatus\n let artifactsComplete = true\n try {\n const res =\n input.kind === \"feedback\"\n ? await cloudClientService.core.reports.submit({\n kind: \"feedback\",\n feedback: input.feedback,\n context,\n })\n : input.kind === \"bug\"\n ? await cloudClientService.core.reports.submit({\n kind: \"bug\",\n trigger: input.trigger,\n report: input.report,\n context,\n })\n : await cloudClientService.core.reports.submit({\n kind: \"automatic\",\n trigger: input.trigger,\n report: input.report,\n context,\n })\n reportId = res.reportId\n reportStatus = res.status\n } catch (error) {\n return {status: \"failed\", error: error instanceof Error ? error.message : String(error)}\n }\n\n if (input.kind !== \"feedback\") {\n const logs = logBuffer.getRecentLogs()\n if (logs.length > 0) {\n try {\n await cloudClientService.core.reports.addLogs(reportId, \"phone\", logs)\n } catch (error) {\n artifactsComplete = false\n console.warn(\"reports.submit: add phone logs failed:\", error instanceof Error ? error.message : error)\n }\n }\n\n notifyGlasses(reportId, cloudClientService.getCoreUrl())\n\n if (input.screenshots && input.screenshots.length > 0) {\n try {\n await cloudClientService.core.reports.addScreenshots(reportId, input.screenshots)\n } catch (error) {\n artifactsComplete = false\n console.warn(\"reports.submit: add screenshots failed:\", error instanceof Error ? error.message : error)\n }\n }\n\n try {\n const completed = await cloudClientService.core.reports.complete(reportId)\n reportStatus = completed.status\n } catch (error) {\n artifactsComplete = false\n console.warn(\"reports.submit: complete report failed:\", error instanceof Error ? error.message : error)\n }\n }\n\n if (throttle && artifactsComplete) {\n markAutomaticThrottleSuccess(throttle.key, Date.now(), throttle.windowMs)\n }\n\n return {status: \"submitted\", reportId, reportStatus}\n}\n\n/** A debug-console log upload: the report it went to, and whether it replaced an earlier upload. */\nexport type LogUploadResult =\n | {status: \"created\" | \"updated\"; reportId: string}\n | {status: \"busy\"}\n | {status: \"failed\"; error: string}\n\n/** Uploads within this window after a report's creation replace its phone logs. */\nexport const LOG_UPLOAD_WINDOW_MS = 5 * 60_000\nlet logUpload: {reportId: string; createdAt: number} | null = null\nlet logUploadInFlight = false\n\n/** Phone logs only, as a manual bug report; repeated taps cannot spam reports. */\nasync function uploadLogs(): Promise<LogUploadResult> {\n if (logUploadInFlight) return {status: \"busy\"}\n logUploadInFlight = true\n try {\n const logs = logBuffer.getRecentLogs()\n const now = Date.now()\n if (logUpload && now - logUpload.createdAt < LOG_UPLOAD_WINDOW_MS) {\n await cloudClientService.core.reports.addLogs(logUpload.reportId, \"phone\", logs, {replace: true})\n return {status: \"updated\", reportId: logUpload.reportId}\n }\n const context = await collectDiagnosticContext()\n const res = await cloudClientService.core.reports.submit({\n kind: \"bug\",\n trigger: {type: \"manual\", source: \"debug_console\", reason: \"log_upload\"},\n report: {actualBehavior: \"Debug console log upload\"},\n context,\n })\n logUpload = {reportId: res.reportId, createdAt: now}\n if (logs.length > 0) await cloudClientService.core.reports.addLogs(res.reportId, \"phone\", logs)\n await cloudClientService.core.reports.complete(res.reportId)\n return {status: \"created\", reportId: res.reportId}\n } catch (error) {\n return {status: \"failed\", error: error instanceof Error ? error.message : String(error)}\n } finally {\n logUploadInFlight = false\n }\n}\n\nexport const reports = {\n submit(input: EngineSubmitReportInput): Promise<ReportSubmitResult> {\n return submitReportInternal(input)\n },\n uploadLogs,\n}\n\nexport function submitAutomaticReport(input: EngineSubmitAutomaticReportInput): Promise<ReportSubmitResult> {\n return submitReportInternal(input)\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export const ENGINE_RELEASE_METADATA = Object.freeze({
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"familyBaseVersion": "0.4.0",
|
|
4
|
-
"releaseIdentity": "0.4.0-dev.
|
|
5
|
-
"releaseSetId": "glassly-0.4.0-dev.
|
|
6
|
-
"sourceCommit": "
|
|
4
|
+
"releaseIdentity": "0.4.0-dev.1051",
|
|
5
|
+
"releaseSetId": "glassly-0.4.0-dev.1051",
|
|
6
|
+
"sourceCommit": "0e343b6f2c083cb6e4ce58f4fa533cf84cae4760",
|
|
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,gBAAgB;IACnC,cAAc,EAAE,wBAAwB;IACxC,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.4.0\",\n \"releaseIdentity\": \"0.4.0-dev.
|
|
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,gBAAgB;IACnC,cAAc,EAAE,wBAAwB;IACxC,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.4.0\",\n \"releaseIdentity\": \"0.4.0-dev.1051\",\n \"releaseSetId\": \"glassly-0.4.0-dev.1051\",\n \"sourceCommit\": \"0e343b6f2c083cb6e4ce58f4fa533cf84cae4760\",\n \"otaManifestUrl\": null,\n \"otaManifestSha256\": null\n})\n"]}
|
|
@@ -283,7 +283,9 @@ export declare const cloudClientService: {
|
|
|
283
283
|
core: {
|
|
284
284
|
reports: {
|
|
285
285
|
submit(input: import("@glassly/cloud-client").SubmitReportInput): Promise<import("@glassly/cloud-client").SubmitReportResult>;
|
|
286
|
-
addLogs(reportId: string, source: string, entries: import("@glassly/cloud-client").ReportLogEntry[]
|
|
286
|
+
addLogs(reportId: string, source: string, entries: import("@glassly/cloud-client").ReportLogEntry[], options?: {
|
|
287
|
+
replace?: boolean;
|
|
288
|
+
} | undefined): Promise<import("@glassly/cloud-client").AddReportArtifactsResult>;
|
|
287
289
|
addScreenshots(reportId: string, images: import("@glassly/cloud-client").ReportAttachmentInput[]): Promise<import("@glassly/cloud-client").AddReportArtifactsResult>;
|
|
288
290
|
complete(reportId: string): Promise<{
|
|
289
291
|
status: import("@glassly/cloud-client").ReportStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudClientService.d.ts","sourceRoot":"","sources":["../../src/services/CloudClientService.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"CloudClientService.d.ts","sourceRoot":"","sources":["../../src/services/CloudClientService.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@glassly/engine",
|
|
3
|
-
"version": "0.4.0-dev.
|
|
3
|
+
"version": "0.4.0-dev.1051",
|
|
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.4.0-dev.
|
|
101
|
-
"@glassly/cloud-client": "0.4.0-dev.
|
|
102
|
-
"@glassly/cloud-protocol": "0.4.0-dev.
|
|
103
|
-
"@glassly/crust": "0.4.0-dev.
|
|
104
|
-
"@glassly/miniapp": "0.4.0-dev.
|
|
100
|
+
"@glassly/bluetooth-sdk": "0.4.0-dev.1051",
|
|
101
|
+
"@glassly/cloud-client": "0.4.0-dev.1051",
|
|
102
|
+
"@glassly/cloud-protocol": "0.4.0-dev.1051",
|
|
103
|
+
"@glassly/crust": "0.4.0-dev.1051",
|
|
104
|
+
"@glassly/miniapp": "0.4.0-dev.1051",
|
|
105
105
|
"buffer": "^6.0.3",
|
|
106
106
|
"events": "^3.3.0",
|
|
107
107
|
"react-native-marked": "8.3.2",
|
|
108
108
|
"semver": "^7.7.4",
|
|
109
109
|
"typesafe-ts": "^1.7.1",
|
|
110
|
-
"@glassly/llm-providers": "0.4.0-dev.
|
|
110
|
+
"@glassly/llm-providers": "0.4.0-dev.1051",
|
|
111
111
|
"@huggingface/jinja": "^0.5.9",
|
|
112
112
|
"jsonrepair": "^3.12.0"
|
|
113
113
|
},
|
package/src/facades/reports.ts
CHANGED
|
@@ -169,10 +169,51 @@ async function submitReportInternal(input: InternalSubmitReportInput): Promise<R
|
|
|
169
169
|
return {status: "submitted", reportId, reportStatus}
|
|
170
170
|
}
|
|
171
171
|
|
|
172
|
+
/** A debug-console log upload: the report it went to, and whether it replaced an earlier upload. */
|
|
173
|
+
export type LogUploadResult =
|
|
174
|
+
| {status: "created" | "updated"; reportId: string}
|
|
175
|
+
| {status: "busy"}
|
|
176
|
+
| {status: "failed"; error: string}
|
|
177
|
+
|
|
178
|
+
/** Uploads within this window after a report's creation replace its phone logs. */
|
|
179
|
+
export const LOG_UPLOAD_WINDOW_MS = 5 * 60_000
|
|
180
|
+
let logUpload: {reportId: string; createdAt: number} | null = null
|
|
181
|
+
let logUploadInFlight = false
|
|
182
|
+
|
|
183
|
+
/** Phone logs only, as a manual bug report; repeated taps cannot spam reports. */
|
|
184
|
+
async function uploadLogs(): Promise<LogUploadResult> {
|
|
185
|
+
if (logUploadInFlight) return {status: "busy"}
|
|
186
|
+
logUploadInFlight = true
|
|
187
|
+
try {
|
|
188
|
+
const logs = logBuffer.getRecentLogs()
|
|
189
|
+
const now = Date.now()
|
|
190
|
+
if (logUpload && now - logUpload.createdAt < LOG_UPLOAD_WINDOW_MS) {
|
|
191
|
+
await cloudClientService.core.reports.addLogs(logUpload.reportId, "phone", logs, {replace: true})
|
|
192
|
+
return {status: "updated", reportId: logUpload.reportId}
|
|
193
|
+
}
|
|
194
|
+
const context = await collectDiagnosticContext()
|
|
195
|
+
const res = await cloudClientService.core.reports.submit({
|
|
196
|
+
kind: "bug",
|
|
197
|
+
trigger: {type: "manual", source: "debug_console", reason: "log_upload"},
|
|
198
|
+
report: {actualBehavior: "Debug console log upload"},
|
|
199
|
+
context,
|
|
200
|
+
})
|
|
201
|
+
logUpload = {reportId: res.reportId, createdAt: now}
|
|
202
|
+
if (logs.length > 0) await cloudClientService.core.reports.addLogs(res.reportId, "phone", logs)
|
|
203
|
+
await cloudClientService.core.reports.complete(res.reportId)
|
|
204
|
+
return {status: "created", reportId: res.reportId}
|
|
205
|
+
} catch (error) {
|
|
206
|
+
return {status: "failed", error: error instanceof Error ? error.message : String(error)}
|
|
207
|
+
} finally {
|
|
208
|
+
logUploadInFlight = false
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
172
212
|
export const reports = {
|
|
173
213
|
submit(input: EngineSubmitReportInput): Promise<ReportSubmitResult> {
|
|
174
214
|
return submitReportInternal(input)
|
|
175
215
|
},
|
|
216
|
+
uploadLogs,
|
|
176
217
|
}
|
|
177
218
|
|
|
178
219
|
export function submitAutomaticReport(input: EngineSubmitAutomaticReportInput): Promise<ReportSubmitResult> {
|
|
@@ -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.4.0",
|
|
15
|
-
"releaseIdentity": "0.4.0-dev.
|
|
16
|
-
"releaseSetId": "glassly-0.4.0-dev.
|
|
17
|
-
"sourceCommit": "
|
|
15
|
+
"releaseIdentity": "0.4.0-dev.1051",
|
|
16
|
+
"releaseSetId": "glassly-0.4.0-dev.1051",
|
|
17
|
+
"sourceCommit": "0e343b6f2c083cb6e4ce58f4fa533cf84cae4760",
|
|
18
18
|
"otaManifestUrl": null,
|
|
19
19
|
"otaManifestSha256": null
|
|
20
20
|
})
|