@tomorrowos/sdk 0.9.50 → 0.9.51
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/LOVABLE_SETUP.md +1 -1
- package/VERCEL_QUESTIONS.md +1 -1
- package/VERCEL_SETUP.md +1 -1
- package/dist/tomorrowos.d.ts +6 -0
- package/dist/tomorrowos.d.ts.map +1 -1
- package/dist/tomorrowos.js +45 -0
- package/package.json +1 -1
- package/templates/cms-starter/package.json +2 -2
- package/templates/cms-starter-v0/package.json +2 -2
package/LOVABLE_SETUP.md
CHANGED
package/VERCEL_QUESTIONS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Vercel / v0 閳?Verbatim question bank
|
|
2
2
|
|
|
3
|
-
> **Protocol:** `vercel-questions/1.0` (pairs with `VERCEL_SETUP.md` 1.9+ / `@tomorrowos/sdk` 0.9.
|
|
3
|
+
> **Protocol:** `vercel-questions/1.0` (pairs with `VERCEL_SETUP.md` 1.9+ / `@tomorrowos/sdk` 0.9.51+)
|
|
4
4
|
> **For Agents:** When asking the user a setup question, **copy-paste the block below for that step EXACTLY**.
|
|
5
5
|
> Do **not** paraphrase, reorder, rename options, or invent alternatives (no S3, no Supabase Storage, no 閳ユ窂lob recommended閳? no 閳ユ竸isable media閳?.
|
|
6
6
|
> After each answer, configure per `VERCEL_SETUP.md`, then paste the **next** block.
|
package/VERCEL_SETUP.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
>
|
|
6
6
|
> **On Vercel, this file is the setup questionnaire** (not `REPLIT_SETUP.md`, not `LLM_PROMPT.md`).
|
|
7
7
|
>
|
|
8
|
-
> Protocol id: `vercel-setup/1.9` — pairs with `@tomorrowos/sdk` **0.9.
|
|
8
|
+
> Protocol id: `vercel-setup/1.9` — pairs with `@tomorrowos/sdk` **0.9.51+** (`templates/cms-starter-v0`, Fluid Functions WebSockets).
|
|
9
9
|
>
|
|
10
10
|
> **Questions source of truth:** `VERCEL_QUESTIONS.md` ? Agents must **open that file and paste each Q block verbatim**. Do not paraphrase.
|
|
11
11
|
> **Copy questions verbatim from `VERCEL_QUESTIONS.md`.** Do not invent alternate Q2 options (no ?Supabase Storage?? no S3, no ?disable media?? no making Blob the recommended option).
|
package/dist/tomorrowos.d.ts
CHANGED
|
@@ -104,6 +104,9 @@ export declare class TomorrowOS extends EventEmitter {
|
|
|
104
104
|
private readonly devices;
|
|
105
105
|
private readonly pendingDeviceMeta;
|
|
106
106
|
private readonly deviceLogs;
|
|
107
|
+
/** Last device.ping (or bind) time — used to drop half-open sockets after power loss. */
|
|
108
|
+
private readonly deviceLastHeartbeatMs;
|
|
109
|
+
private heartbeatSweepTimer;
|
|
107
110
|
private httpServer;
|
|
108
111
|
private wss;
|
|
109
112
|
private staticRoot;
|
|
@@ -175,6 +178,9 @@ export declare class TomorrowOS extends EventEmitter {
|
|
|
175
178
|
* hello overwriting a healthy reconnect with a dead peer).
|
|
176
179
|
*/
|
|
177
180
|
private bindDeviceSocket;
|
|
181
|
+
private touchDeviceHeartbeat;
|
|
182
|
+
private startDeviceHeartbeatSweep;
|
|
183
|
+
private sweepStaleDeviceHeartbeats;
|
|
178
184
|
/** Wait briefly for the device WebSocket to appear (first-pair hello races). */
|
|
179
185
|
private waitForOpenDeviceSocket;
|
|
180
186
|
private sendPairingVerified;
|
package/dist/tomorrowos.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tomorrowos.d.ts","sourceRoot":"","sources":["../src/tomorrowos.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,IAAI,MAAM,MAAM,CAAC;AAYxB,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,KAAK,EACV,gBAAgB,EAKhB,eAAe,EAEhB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"tomorrowos.d.ts","sourceRoot":"","sources":["../src/tomorrowos.ts"],"names":[],"mappings":"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"}
|
package/dist/tomorrowos.js
CHANGED
|
@@ -13,6 +13,9 @@ import { probeVideoDurationMs } from "./media-probe.js";
|
|
|
13
13
|
import { contentHashHex, storeUploadIfNeeded } from "./upload-storage.js";
|
|
14
14
|
import { detectPrimaryLanIpv4 } from "./lan-address.js";
|
|
15
15
|
import { buildServerStatus } from "./server-status.js";
|
|
16
|
+
/** Mark offline if no device.ping within this window (power-loss / half-open TCP). */
|
|
17
|
+
const DEVICE_HEARTBEAT_TIMEOUT_MS = 30_000;
|
|
18
|
+
const DEVICE_HEARTBEAT_SWEEP_MS = 10_000;
|
|
16
19
|
function normalizeDevicePlatform(platform, system) {
|
|
17
20
|
const explicit = typeof platform === "string" ? platform.trim().toLowerCase() : "";
|
|
18
21
|
if (explicit)
|
|
@@ -232,6 +235,9 @@ export class TomorrowOS extends EventEmitter {
|
|
|
232
235
|
devices = new Map();
|
|
233
236
|
pendingDeviceMeta = new Map();
|
|
234
237
|
deviceLogs = new Map();
|
|
238
|
+
/** Last device.ping (or bind) time — used to drop half-open sockets after power loss. */
|
|
239
|
+
deviceLastHeartbeatMs = new Map();
|
|
240
|
+
heartbeatSweepTimer = null;
|
|
235
241
|
httpServer = null;
|
|
236
242
|
wss = null;
|
|
237
243
|
staticRoot = null;
|
|
@@ -585,8 +591,43 @@ export class TomorrowOS extends EventEmitter {
|
|
|
585
591
|
return false;
|
|
586
592
|
ws.deviceId = deviceId;
|
|
587
593
|
this.devices.set(deviceId, ws);
|
|
594
|
+
this.touchDeviceHeartbeat(deviceId);
|
|
588
595
|
return true;
|
|
589
596
|
}
|
|
597
|
+
touchDeviceHeartbeat(deviceId) {
|
|
598
|
+
const id = String(deviceId || "").trim();
|
|
599
|
+
if (!id)
|
|
600
|
+
return;
|
|
601
|
+
this.deviceLastHeartbeatMs.set(id, Date.now());
|
|
602
|
+
}
|
|
603
|
+
startDeviceHeartbeatSweep() {
|
|
604
|
+
if (this.heartbeatSweepTimer)
|
|
605
|
+
return;
|
|
606
|
+
this.heartbeatSweepTimer = setInterval(() => {
|
|
607
|
+
this.sweepStaleDeviceHeartbeats();
|
|
608
|
+
}, DEVICE_HEARTBEAT_SWEEP_MS);
|
|
609
|
+
// Unref so the timer does not keep serverless/local processes alive alone.
|
|
610
|
+
const timer = this.heartbeatSweepTimer;
|
|
611
|
+
if (typeof timer.unref === "function")
|
|
612
|
+
timer.unref();
|
|
613
|
+
}
|
|
614
|
+
sweepStaleDeviceHeartbeats() {
|
|
615
|
+
const now = Date.now();
|
|
616
|
+
for (const [deviceId, ws] of this.devices) {
|
|
617
|
+
if (ws.readyState !== WebSocket.OPEN)
|
|
618
|
+
continue;
|
|
619
|
+
const last = this.deviceLastHeartbeatMs.get(deviceId);
|
|
620
|
+
// Not yet touched (should be rare) — give a full timeout window from now.
|
|
621
|
+
if (last == null) {
|
|
622
|
+
this.touchDeviceHeartbeat(deviceId);
|
|
623
|
+
continue;
|
|
624
|
+
}
|
|
625
|
+
if (now - last < DEVICE_HEARTBEAT_TIMEOUT_MS)
|
|
626
|
+
continue;
|
|
627
|
+
console.warn(`[TomorrowOS] device heartbeat timeout (${DEVICE_HEARTBEAT_TIMEOUT_MS}ms): ${deviceId}`);
|
|
628
|
+
this.forceDeviceOffline(deviceId);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
590
631
|
/** Wait briefly for the device WebSocket to appear (first-pair hello races). */
|
|
591
632
|
async waitForOpenDeviceSocket(deviceId, timeoutMs = 5000) {
|
|
592
633
|
const deadline = Date.now() + timeoutMs;
|
|
@@ -719,6 +760,7 @@ export class TomorrowOS extends EventEmitter {
|
|
|
719
760
|
this.devices.delete(deviceId);
|
|
720
761
|
}
|
|
721
762
|
}
|
|
763
|
+
this.deviceLastHeartbeatMs.delete(deviceId);
|
|
722
764
|
void this.touchPairedOffline(deviceId);
|
|
723
765
|
this.emit("device.offline", {
|
|
724
766
|
deviceId,
|
|
@@ -871,6 +913,7 @@ export class TomorrowOS extends EventEmitter {
|
|
|
871
913
|
this.handleConnection(ws);
|
|
872
914
|
});
|
|
873
915
|
this.serverStartedAt = new Date().toISOString();
|
|
916
|
+
this.startDeviceHeartbeatSweep();
|
|
874
917
|
const onVercel = Boolean(process.env.VERCEL);
|
|
875
918
|
const shouldListen = options.autoListen ?? !onVercel;
|
|
876
919
|
if (shouldListen) {
|
|
@@ -1728,6 +1771,7 @@ export class TomorrowOS extends EventEmitter {
|
|
|
1728
1771
|
}));
|
|
1729
1772
|
const deviceId = ws.deviceId;
|
|
1730
1773
|
if (deviceId) {
|
|
1774
|
+
this.touchDeviceHeartbeat(deviceId);
|
|
1731
1775
|
const timestamp = typeof msg.timestamp === "string" && msg.timestamp.trim()
|
|
1732
1776
|
? msg.timestamp
|
|
1733
1777
|
: new Date().toISOString();
|
|
@@ -1763,6 +1807,7 @@ export class TomorrowOS extends EventEmitter {
|
|
|
1763
1807
|
if (this.devices.get(id) !== ws)
|
|
1764
1808
|
return;
|
|
1765
1809
|
this.devices.delete(id);
|
|
1810
|
+
this.deviceLastHeartbeatMs.delete(id);
|
|
1766
1811
|
void this.touchPairedOffline(id);
|
|
1767
1812
|
this.emit("device.offline", {
|
|
1768
1813
|
deviceId: id,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tomorrowos/sdk",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.51",
|
|
4
4
|
"description": "TomorrowOS CMS server SDK - WebSocket transport, pairing, device commands, optional static CMS UI. Includes CLI (tomorrowos init / build) and starter templates.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "my-cms",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.51",
|
|
4
4
|
"description": "CMS server on @tomorrowos/sdk. Add your UI (React, static files, etc.) alongside this server.",
|
|
5
5
|
"private": true,
|
|
6
6
|
"type": "module",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"build-player": "tomorrowos build --platform tizen"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@tomorrowos/sdk": "^0.9.
|
|
16
|
+
"@tomorrowos/sdk": "^0.9.51",
|
|
17
17
|
"dotenv": "^17.2.3",
|
|
18
18
|
"tsx": "^4.19.0"
|
|
19
19
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "my-cms",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.51",
|
|
4
4
|
"description": "TomorrowOS CMS for Vercel / v0 Publish (Fluid Function + WebSockets + optional Next Preview).",
|
|
5
5
|
"private": true,
|
|
6
6
|
"type": "module",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"build-player": "tomorrowos build --platform tizen"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@tomorrowos/sdk": "^0.9.
|
|
20
|
+
"@tomorrowos/sdk": "^0.9.51",
|
|
21
21
|
"dotenv": "^17.2.3",
|
|
22
22
|
"tsx": "^4.19.0"
|
|
23
23
|
},
|