@elizaos/plugin-elizacloud 2.0.0-beta.1 → 2.0.11-beta.7

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 (285) hide show
  1. package/README.md +20 -44
  2. package/auto-enable.ts +10 -5
  3. package/dist/browser/index.browser.js +2 -2
  4. package/dist/browser/index.browser.js.map +4 -4
  5. package/dist/cjs/index.node.cjs +2874 -5915
  6. package/dist/cjs/index.node.js.map +47 -116
  7. package/dist/cloud/auth-service-types.d.ts +8 -0
  8. package/dist/cloud/auth-service-types.d.ts.map +1 -0
  9. package/dist/cloud/auth-service-types.js +36 -0
  10. package/dist/cloud/auth-service-types.js.map +10 -0
  11. package/dist/cloud/auth.js +4 -51
  12. package/dist/cloud/auth.js.map +4 -4
  13. package/dist/cloud/base-url.d.ts +6 -2
  14. package/dist/cloud/base-url.d.ts.map +1 -1
  15. package/dist/cloud/base-url.js +3 -51
  16. package/dist/cloud/base-url.js.map +3 -3
  17. package/dist/cloud/bridge-client.d.ts +3 -3
  18. package/dist/cloud/bridge-client.d.ts.map +1 -1
  19. package/dist/cloud/bridge-client.js +3 -51
  20. package/dist/cloud/bridge-client.js.map +3 -3
  21. package/dist/cloud/clack-observer.d.ts +35 -0
  22. package/dist/cloud/clack-observer.d.ts.map +1 -0
  23. package/dist/cloud/clack-observer.js +143 -0
  24. package/dist/cloud/clack-observer.js.map +10 -0
  25. package/dist/cloud/cloud-manager.js +45 -92
  26. package/dist/cloud/cloud-manager.js.map +6 -6
  27. package/dist/cloud/cloud-wallet.js +2 -4835
  28. package/dist/cloud/cloud-wallet.js.map +3 -82
  29. package/dist/cloud/duffel-client.d.ts +181 -0
  30. package/dist/cloud/duffel-client.d.ts.map +1 -0
  31. package/dist/cloud/duffel-client.js +506 -0
  32. package/dist/cloud/duffel-client.js.map +11 -0
  33. package/dist/cloud/index.d.ts +6 -0
  34. package/dist/cloud/index.d.ts.map +1 -1
  35. package/dist/cloud/index.js +1782 -1
  36. package/dist/cloud/index.js.map +18 -3
  37. package/dist/cloud/lifeops-schedule-sync-client.d.ts +43 -0
  38. package/dist/cloud/lifeops-schedule-sync-client.d.ts.map +1 -0
  39. package/dist/cloud/lifeops-schedule-sync-client.js +180 -0
  40. package/dist/cloud/lifeops-schedule-sync-client.js.map +11 -0
  41. package/dist/cloud/lifeops-schedule-sync-contracts.d.ts +89 -0
  42. package/dist/cloud/lifeops-schedule-sync-contracts.d.ts.map +1 -0
  43. package/dist/cloud/lifeops-schedule-sync-contracts.js +39 -0
  44. package/dist/cloud/lifeops-schedule-sync-contracts.js.map +10 -0
  45. package/dist/cloud/managed-payment-clients.d.ts +166 -0
  46. package/dist/cloud/managed-payment-clients.d.ts.map +1 -0
  47. package/dist/cloud/managed-payment-clients.js +238 -0
  48. package/dist/cloud/managed-payment-clients.js.map +11 -0
  49. package/dist/cloud/null-observer.d.ts +35 -0
  50. package/dist/cloud/null-observer.d.ts.map +1 -0
  51. package/dist/cloud/null-observer.js +45 -0
  52. package/dist/cloud/null-observer.js.map +10 -0
  53. package/dist/cloud/setup-observer.d.ts +98 -0
  54. package/dist/cloud/setup-observer.d.ts.map +1 -0
  55. package/dist/cloud/setup-observer.js +2 -0
  56. package/dist/cloud/setup-observer.js.map +9 -0
  57. package/dist/cloud/validate-url.d.ts.map +1 -1
  58. package/dist/cloud/validate-url.js +2 -1
  59. package/dist/cloud/validate-url.js.map +3 -3
  60. package/dist/cloud/x402-payment-handler.d.ts +85 -0
  61. package/dist/cloud/x402-payment-handler.d.ts.map +1 -0
  62. package/dist/cloud/x402-payment-handler.js +119 -0
  63. package/dist/cloud/x402-payment-handler.js.map +10 -0
  64. package/dist/cloud-setup.d.ts +36 -0
  65. package/dist/cloud-setup.d.ts.map +1 -0
  66. package/dist/{onboarding.js → cloud-setup.js} +139 -139
  67. package/dist/cloud-setup.js.map +14 -0
  68. package/dist/cloud-voice-catalog.d.ts +65 -0
  69. package/dist/cloud-voice-catalog.d.ts.map +1 -0
  70. package/dist/cloud-voice-catalog.js +278 -0
  71. package/dist/cloud-voice-catalog.js.map +12 -0
  72. package/dist/index.browser.d.ts +11 -0
  73. package/dist/index.browser.d.ts.map +1 -1
  74. package/dist/index.d.ts +7 -1
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +5416 -8405
  77. package/dist/index.js.map +48 -116
  78. package/dist/index.node.d.ts +8 -1
  79. package/dist/index.node.d.ts.map +1 -1
  80. package/dist/init.js +17 -4
  81. package/dist/init.js.map +4 -4
  82. package/dist/lib/cloud-connection.d.ts +0 -1
  83. package/dist/lib/cloud-connection.d.ts.map +1 -1
  84. package/dist/lib/cloud-connection.js +14 -91
  85. package/dist/lib/cloud-connection.js.map +7 -7
  86. package/dist/lib/cloud-secrets.d.ts +5 -18
  87. package/dist/lib/cloud-secrets.d.ts.map +1 -1
  88. package/dist/lib/cloud-secrets.js +8 -36
  89. package/dist/lib/cloud-secrets.js.map +3 -3
  90. package/dist/lib/config-like.d.ts +1 -1
  91. package/dist/lib/config-like.d.ts.map +1 -1
  92. package/dist/lib/config-like.js +3 -3
  93. package/dist/lib/config-like.js.map +3 -3
  94. package/dist/lib/credential-type-map.d.ts +1 -1
  95. package/dist/lib/credential-type-map.js.map +1 -1
  96. package/dist/lib/http.d.ts +0 -11
  97. package/dist/lib/http.d.ts.map +1 -1
  98. package/dist/lib/http.js.map +2 -2
  99. package/dist/lib/server-cloud-tts.d.ts +12 -25
  100. package/dist/lib/server-cloud-tts.d.ts.map +1 -1
  101. package/dist/lib/server-cloud-tts.js +31 -329
  102. package/dist/lib/server-cloud-tts.js.map +4 -7
  103. package/dist/lib/tts-debug.d.ts +5 -3
  104. package/dist/lib/tts-debug.d.ts.map +1 -1
  105. package/dist/lib/tts-debug.js +1 -34
  106. package/dist/lib/tts-debug.js.map +3 -4
  107. package/dist/models/embeddings.d.ts.map +1 -1
  108. package/dist/models/embeddings.js +79 -69
  109. package/dist/models/embeddings.js.map +6 -6
  110. package/dist/models/image.d.ts.map +1 -1
  111. package/dist/models/image.js +42 -15
  112. package/dist/models/image.js.map +6 -6
  113. package/dist/models/index.js +676 -166
  114. package/dist/models/index.js.map +11 -12
  115. package/dist/models/research.d.ts.map +1 -1
  116. package/dist/models/research.js +24 -7
  117. package/dist/models/research.js.map +6 -6
  118. package/dist/models/speech.d.ts +61 -3
  119. package/dist/models/speech.d.ts.map +1 -1
  120. package/dist/models/speech.js +173 -17
  121. package/dist/models/speech.js.map +5 -5
  122. package/dist/models/text.d.ts +106 -1
  123. package/dist/models/text.d.ts.map +1 -1
  124. package/dist/models/text.js +452 -82
  125. package/dist/models/text.js.map +7 -8
  126. package/dist/models/tokenization.d.ts.map +1 -1
  127. package/dist/models/tokenization.js.map +2 -2
  128. package/dist/models/transcription.d.ts.map +1 -1
  129. package/dist/models/transcription.js +20 -6
  130. package/dist/models/transcription.js.map +5 -5
  131. package/dist/node/index.node.js +2828 -5838
  132. package/dist/node/index.node.js.map +47 -116
  133. package/dist/plugin.d.ts.map +1 -1
  134. package/dist/plugin.js +376 -5050
  135. package/dist/plugin.js.map +16 -92
  136. package/dist/providers/openai.js +11 -2
  137. package/dist/providers/openai.js.map +3 -3
  138. package/dist/register-routes.js +376 -5050
  139. package/dist/register-routes.js.map +16 -92
  140. package/dist/routes/cloud-billing-routes.d.ts.map +1 -1
  141. package/dist/routes/cloud-billing-routes.js +17 -60
  142. package/dist/routes/cloud-billing-routes.js.map +8 -7
  143. package/dist/routes/cloud-coding-container-routes.d.ts +8 -0
  144. package/dist/routes/cloud-coding-container-routes.d.ts.map +1 -0
  145. package/dist/routes/cloud-coding-container-routes.js +214 -0
  146. package/dist/routes/cloud-coding-container-routes.js.map +11 -0
  147. package/dist/routes/cloud-compat-routes.d.ts.map +1 -1
  148. package/dist/routes/cloud-compat-routes.js +17 -60
  149. package/dist/routes/cloud-compat-routes.js.map +8 -7
  150. package/dist/routes/cloud-features-routes.js +2 -2
  151. package/dist/routes/cloud-features-routes.js.map +4 -4
  152. package/dist/routes/cloud-relay-routes.d.ts +2 -1
  153. package/dist/routes/cloud-relay-routes.d.ts.map +1 -1
  154. package/dist/routes/cloud-relay-routes.js +84 -2
  155. package/dist/routes/cloud-relay-routes.js.map +5 -4
  156. package/dist/routes/cloud-routes-autonomous.d.ts +3 -4
  157. package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -1
  158. package/dist/routes/cloud-routes-autonomous.js +11 -4893
  159. package/dist/routes/cloud-routes-autonomous.js.map +8 -87
  160. package/dist/routes/cloud-routes.d.ts +2 -2
  161. package/dist/routes/cloud-routes.d.ts.map +1 -1
  162. package/dist/routes/cloud-routes.js +343 -5058
  163. package/dist/routes/cloud-routes.js.map +13 -90
  164. package/dist/routes/cloud-status-routes-autonomous.d.ts +1 -2
  165. package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -1
  166. package/dist/routes/cloud-status-routes-autonomous.js +4 -51
  167. package/dist/routes/cloud-status-routes-autonomous.js.map +5 -5
  168. package/dist/routes/cloud-status-routes.js +14 -90
  169. package/dist/routes/cloud-status-routes.js.map +7 -7
  170. package/dist/routes/home-remote-runner-access-url.d.ts +16 -0
  171. package/dist/routes/home-remote-runner-access-url.d.ts.map +1 -0
  172. package/dist/routes/home-remote-runner-access-url.js +91 -0
  173. package/dist/routes/home-remote-runner-access-url.js.map +10 -0
  174. package/dist/routes/travel-provider-relay-routes.d.ts +9 -0
  175. package/dist/routes/travel-provider-relay-routes.d.ts.map +1 -0
  176. package/dist/routes/travel-provider-relay-routes.js +358 -0
  177. package/dist/routes/travel-provider-relay-routes.js.map +14 -0
  178. package/dist/services/cloud-auth.d.ts +1 -1
  179. package/dist/services/cloud-auth.d.ts.map +1 -1
  180. package/dist/services/cloud-auth.js +7 -2
  181. package/dist/services/cloud-auth.js.map +4 -4
  182. package/dist/services/cloud-backup.js.map +2 -2
  183. package/dist/services/cloud-bootstrap.d.ts.map +1 -1
  184. package/dist/services/cloud-bootstrap.js.map +2 -2
  185. package/dist/services/cloud-bridge.js.map +3 -3
  186. package/dist/services/cloud-container.d.ts +5 -1
  187. package/dist/services/cloud-container.d.ts.map +1 -1
  188. package/dist/services/cloud-container.js +52 -1
  189. package/dist/services/cloud-container.js.map +4 -4
  190. package/dist/services/cloud-credential-provider.js.map +2 -2
  191. package/dist/services/cloud-model-registry.js.map +2 -2
  192. package/dist/types/cloud.d.ts +1 -0
  193. package/dist/types/cloud.d.ts.map +1 -1
  194. package/dist/types/cloud.js.map +2 -2
  195. package/dist/types/index.d.ts +1 -1
  196. package/dist/types/index.d.ts.map +1 -1
  197. package/dist/utils/cloud-sdk/client.d.ts.map +1 -1
  198. package/dist/utils/cloud-sdk/client.js +136 -4
  199. package/dist/utils/cloud-sdk/client.js.map +5 -5
  200. package/dist/utils/cloud-sdk/http.js.map +1 -1
  201. package/dist/utils/cloud-sdk/public-routes.d.ts +186 -0
  202. package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -1
  203. package/dist/utils/cloud-sdk/public-routes.js +99 -1
  204. package/dist/utils/cloud-sdk/public-routes.js.map +3 -3
  205. package/dist/utils/cloud-sdk/types.d.ts +0 -2
  206. package/dist/utils/cloud-sdk/types.d.ts.map +1 -1
  207. package/dist/utils/cloud-sdk/types.js.map +1 -1
  208. package/dist/utils/config.d.ts +10 -1
  209. package/dist/utils/config.d.ts.map +1 -1
  210. package/dist/utils/config.js +12 -2
  211. package/dist/utils/config.js.map +3 -3
  212. package/dist/utils/events.d.ts +23 -2
  213. package/dist/utils/events.d.ts.map +1 -1
  214. package/dist/utils/events.js +5 -3
  215. package/dist/utils/events.js.map +3 -3
  216. package/dist/utils/sdk-client.d.ts.map +1 -1
  217. package/dist/utils/sdk-client.js +17 -4
  218. package/dist/utils/sdk-client.js.map +4 -4
  219. package/dist/utils/waifu-metering.d.ts +108 -0
  220. package/dist/utils/waifu-metering.d.ts.map +1 -0
  221. package/dist/utils/waifu-metering.js +166 -0
  222. package/dist/utils/waifu-metering.js.map +10 -0
  223. package/package.json +51 -22
  224. package/src/cloud/auth-service-types.ts +24 -0
  225. package/src/cloud/base-url.ts +6 -62
  226. package/src/cloud/clack-observer.ts +189 -0
  227. package/src/cloud/duffel-client.ts +847 -0
  228. package/src/cloud/index.ts +10 -0
  229. package/src/cloud/lifeops-schedule-sync-client.ts +245 -0
  230. package/src/cloud/lifeops-schedule-sync-contracts.ts +124 -0
  231. package/src/cloud/managed-payment-clients.ts +374 -0
  232. package/src/cloud/null-observer.ts +45 -0
  233. package/src/cloud/setup-observer.ts +125 -0
  234. package/src/cloud/validate-url.ts +7 -1
  235. package/src/cloud/x402-payment-handler.ts +215 -0
  236. package/src/cloud-setup.ts +531 -0
  237. package/src/cloud-voice-catalog.test.ts +254 -0
  238. package/src/cloud-voice-catalog.ts +246 -0
  239. package/src/index.browser.ts +29 -0
  240. package/src/index.node.ts +31 -1
  241. package/src/index.ts +76 -4
  242. package/src/lib/cloud-connection.ts +2 -4
  243. package/src/lib/cloud-secrets.ts +10 -54
  244. package/src/lib/config-like.ts +1 -1
  245. package/src/lib/credential-type-map.ts +2 -2
  246. package/src/lib/http.ts +0 -17
  247. package/src/lib/server-cloud-tts.ts +33 -341
  248. package/src/lib/tts-debug.ts +5 -34
  249. package/src/models/embeddings.ts +140 -76
  250. package/src/models/image.ts +29 -14
  251. package/src/models/research.ts +11 -1
  252. package/src/models/speech.ts +269 -23
  253. package/src/models/text.ts +704 -110
  254. package/src/models/tokenization.ts +2 -2
  255. package/src/models/transcription.ts +7 -3
  256. package/src/plugin.ts +38 -0
  257. package/src/routes/cloud-billing-routes.ts +4 -14
  258. package/src/routes/cloud-coding-container-routes.ts +198 -0
  259. package/src/routes/cloud-compat-routes.ts +4 -14
  260. package/src/routes/cloud-features-routes.ts +1 -1
  261. package/src/routes/cloud-relay-routes.ts +47 -1
  262. package/src/routes/cloud-routes-autonomous.ts +7 -10
  263. package/src/routes/cloud-routes.ts +68 -7
  264. package/src/routes/cloud-status-routes-autonomous.ts +6 -2
  265. package/src/routes/home-remote-runner-access-url.ts +83 -0
  266. package/src/routes/travel-provider-relay-routes.ts +193 -0
  267. package/src/services/cloud-auth.ts +9 -2
  268. package/src/services/cloud-bootstrap.ts +1 -3
  269. package/src/services/cloud-bridge.ts +1 -1
  270. package/src/services/cloud-container.ts +93 -0
  271. package/src/services/cloud-credential-provider.ts +1 -1
  272. package/src/services/cloud-model-registry.ts +1 -1
  273. package/src/types/cloud.ts +22 -0
  274. package/src/types/index.ts +19 -0
  275. package/src/utils/cloud-sdk/client.ts +42 -3
  276. package/src/utils/cloud-sdk/public-routes.ts +168 -0
  277. package/src/utils/cloud-sdk/types.ts +0 -2
  278. package/src/utils/config.ts +20 -1
  279. package/src/utils/events.ts +30 -2
  280. package/src/utils/sdk-client.ts +5 -1
  281. package/src/utils/waifu-metering.ts +302 -0
  282. package/dist/onboarding.d.ts +0 -35
  283. package/dist/onboarding.d.ts.map +0 -1
  284. package/dist/onboarding.js.map +0 -14
  285. package/src/onboarding.ts +0 -396
@@ -4,10 +4,18 @@ export {
4
4
  cloudLogin,
5
5
  } from "./auth.js";
6
6
  export { BackupScheduler } from "./backup.js";
7
+ export {
8
+ isCloudAuthApiKeyService,
9
+ normalizeCloudApiKey,
10
+ type CloudAuthApiKeyService,
11
+ } from "./auth-service-types.js";
7
12
  export {
8
13
  normalizeCloudSiteUrl,
9
14
  resolveCloudApiBaseUrl,
10
15
  } from "./base-url.js";
16
+ export * from "./duffel-client.js";
17
+ export * from "./lifeops-schedule-sync-client.js";
18
+ export * from "./lifeops-schedule-sync-contracts.js";
11
19
  export {
12
20
  type BackupInfo,
13
21
  type CloudAgent,
@@ -21,6 +29,8 @@ export {
21
29
  type CloudManagerCallbacks,
22
30
  } from "./cloud-manager.js";
23
31
  export { CloudRuntimeProxy } from "./cloud-proxy.js";
32
+ export * from "./managed-payment-clients.js";
33
+ export * from "./x402-payment-handler.js";
24
34
  export {
25
35
  ConnectionMonitor,
26
36
  type ConnectionMonitorCallbacks,
@@ -0,0 +1,245 @@
1
+ import {
2
+ normalizeCloudSiteUrl,
3
+ resolveCloudApiBaseUrl,
4
+ } from "./base-url.js";
5
+ import type {
6
+ GetLifeOpsScheduleMergedStateResponse,
7
+ SyncLifeOpsScheduleObservationsRequest,
8
+ SyncLifeOpsScheduleObservationsResponse,
9
+ } from "./lifeops-schedule-sync-contracts.js";
10
+
11
+ const LIFEOPS_SCHEDULE_REQUEST_TIMEOUT_MS = 20_000;
12
+
13
+ export class LifeOpsScheduleSyncClientError extends Error {
14
+ constructor(
15
+ public readonly status: number,
16
+ message: string,
17
+ ) {
18
+ super(message);
19
+ this.name = "LifeOpsScheduleSyncClientError";
20
+ }
21
+ }
22
+
23
+ export type ResolvedLifeOpsScheduleSyncConfig =
24
+ | {
25
+ configured: false;
26
+ mode: "none";
27
+ }
28
+ | {
29
+ configured: true;
30
+ mode: "remote";
31
+ baseUrl: string;
32
+ accessToken: string | null;
33
+ }
34
+ | {
35
+ configured: true;
36
+ mode: "cloud";
37
+ apiBaseUrl: string;
38
+ apiKey: string;
39
+ agentId: string;
40
+ };
41
+
42
+ export interface LifeOpsScheduleSyncConfigInput {
43
+ remoteApiBase?: string | null;
44
+ remoteAccessToken?: string | null;
45
+ apiKey?: string | null;
46
+ baseUrl?: string | null;
47
+ agentId?: string | null;
48
+ }
49
+
50
+ function normalizeOptionalString(value: string | null | undefined): string | null {
51
+ const trimmed = value?.trim();
52
+ return trimmed && trimmed.length > 0 ? trimmed : null;
53
+ }
54
+
55
+ export function normalizeLifeOpsScheduleSyncSecret(
56
+ value: string | null | undefined,
57
+ ): string | null {
58
+ const trimmed = normalizeOptionalString(value);
59
+ if (!trimmed) {
60
+ return null;
61
+ }
62
+ return trimmed.toUpperCase() === "[REDACTED]" ? null : trimmed;
63
+ }
64
+
65
+ export function resolveLifeOpsScheduleSyncConfig(
66
+ config: LifeOpsScheduleSyncConfigInput = {},
67
+ ): ResolvedLifeOpsScheduleSyncConfig {
68
+ const remoteApiBase = normalizeOptionalString(config.remoteApiBase);
69
+ if (remoteApiBase) {
70
+ return {
71
+ configured: true,
72
+ mode: "remote",
73
+ baseUrl: remoteApiBase.replace(/\/+$/, ""),
74
+ accessToken:
75
+ normalizeLifeOpsScheduleSyncSecret(config.remoteAccessToken) ??
76
+ normalizeLifeOpsScheduleSyncSecret(process.env.ELIZA_REMOTE_ACCESS_TOKEN),
77
+ };
78
+ }
79
+
80
+ const apiKey =
81
+ normalizeLifeOpsScheduleSyncSecret(config.apiKey) ??
82
+ normalizeLifeOpsScheduleSyncSecret(process.env.ELIZAOS_CLOUD_API_KEY);
83
+ const agentId =
84
+ normalizeLifeOpsScheduleSyncSecret(config.agentId) ??
85
+ normalizeLifeOpsScheduleSyncSecret(process.env.ELIZAOS_CLOUD_AGENT_ID);
86
+ if (!apiKey || !agentId) {
87
+ return {
88
+ configured: false,
89
+ mode: "none",
90
+ };
91
+ }
92
+
93
+ return {
94
+ configured: true,
95
+ mode: "cloud",
96
+ apiBaseUrl: resolveCloudApiBaseUrl(
97
+ normalizeOptionalString(config.baseUrl) ?? process.env.ELIZAOS_CLOUD_BASE_URL,
98
+ ),
99
+ apiKey,
100
+ agentId,
101
+ };
102
+ }
103
+
104
+ function buildTimeoutSignal(): AbortSignal {
105
+ return AbortSignal.timeout(LIFEOPS_SCHEDULE_REQUEST_TIMEOUT_MS);
106
+ }
107
+
108
+ async function readJsonResponse<T>(response: Response): Promise<T> {
109
+ if (!response.ok) {
110
+ let detail = `${response.status} ${response.statusText}`.trim();
111
+ const text = await response.text();
112
+ const trimmed = text.trim();
113
+ if (trimmed.length > 0) {
114
+ try {
115
+ const parsed = JSON.parse(trimmed) as {
116
+ error?: string;
117
+ message?: string;
118
+ };
119
+ detail = parsed.message ?? parsed.error ?? trimmed;
120
+ } catch {
121
+ detail = trimmed.slice(0, 200);
122
+ }
123
+ }
124
+ throw new LifeOpsScheduleSyncClientError(response.status, detail);
125
+ }
126
+ return (await response.json()) as T;
127
+ }
128
+
129
+ export function resolveLifeOpsScheduleSyncSiteUrl(rawUrl?: string): string {
130
+ return normalizeCloudSiteUrl(rawUrl);
131
+ }
132
+
133
+ export class LifeOpsScheduleSyncClient {
134
+ constructor(
135
+ private readonly configSource:
136
+ | ResolvedLifeOpsScheduleSyncConfig
137
+ | (() => ResolvedLifeOpsScheduleSyncConfig) =
138
+ resolveLifeOpsScheduleSyncConfig,
139
+ ) {}
140
+
141
+ private getConfig(): ResolvedLifeOpsScheduleSyncConfig {
142
+ return typeof this.configSource === "function"
143
+ ? this.configSource()
144
+ : this.configSource;
145
+ }
146
+
147
+ get configured(): boolean {
148
+ return this.getConfig().configured;
149
+ }
150
+
151
+ private requireConfig(): Exclude<
152
+ ResolvedLifeOpsScheduleSyncConfig,
153
+ { configured: false }
154
+ > {
155
+ const config = this.getConfig();
156
+ if (!config.configured) {
157
+ throw new LifeOpsScheduleSyncClientError(
158
+ 409,
159
+ "LifeOps schedule sync is not configured.",
160
+ );
161
+ }
162
+ return config;
163
+ }
164
+
165
+ private resolvePath(pathname: string): string {
166
+ const config = this.requireConfig();
167
+ const normalizedPath = pathname.replace(/^\/+/, "");
168
+ if (config.mode === "remote") {
169
+ return new URL(
170
+ `api/lifeops/schedule/${normalizedPath}`,
171
+ `${config.baseUrl.replace(/\/+$/, "")}/`,
172
+ ).toString();
173
+ }
174
+ return new URL(
175
+ `eliza/agents/${encodeURIComponent(config.agentId)}/lifeops/schedule/${normalizedPath}`,
176
+ `${config.apiBaseUrl.replace(/\/+$/, "")}/`,
177
+ ).toString();
178
+ }
179
+
180
+ private requestHeaders(
181
+ initHeaders: HeadersInit | undefined,
182
+ ): Record<string, string> {
183
+ const config = this.requireConfig();
184
+ const headers: Record<string, string> = {
185
+ Accept: "application/json",
186
+ "Content-Type": "application/json",
187
+ };
188
+ if (config.mode === "cloud") {
189
+ headers["X-API-Key"] = config.apiKey;
190
+ }
191
+ if (config.mode === "remote" && config.accessToken) {
192
+ headers.Authorization = `Bearer ${config.accessToken}`;
193
+ }
194
+ if (initHeaders instanceof Headers) {
195
+ for (const [key, value] of initHeaders.entries()) {
196
+ headers[key] = value;
197
+ }
198
+ return headers;
199
+ }
200
+ if (Array.isArray(initHeaders)) {
201
+ for (const [key, value] of initHeaders) {
202
+ headers[key] = value;
203
+ }
204
+ return headers;
205
+ }
206
+ return {
207
+ ...headers,
208
+ ...(initHeaders ?? {}),
209
+ };
210
+ }
211
+
212
+ private async request<T>(pathname: string, init: RequestInit): Promise<T> {
213
+ const response = await fetch(this.resolvePath(pathname), {
214
+ ...init,
215
+ headers: this.requestHeaders(init.headers),
216
+ signal: init.signal ?? buildTimeoutSignal(),
217
+ });
218
+ return readJsonResponse<T>(response);
219
+ }
220
+
221
+ async syncObservations(
222
+ request: SyncLifeOpsScheduleObservationsRequest,
223
+ ): Promise<SyncLifeOpsScheduleObservationsResponse> {
224
+ return this.request<SyncLifeOpsScheduleObservationsResponse>(
225
+ "observations",
226
+ {
227
+ method: "POST",
228
+ body: JSON.stringify(request),
229
+ },
230
+ );
231
+ }
232
+
233
+ async getMergedState(
234
+ timezone: string,
235
+ scope: "local" | "cloud" | "effective" = "cloud",
236
+ ): Promise<GetLifeOpsScheduleMergedStateResponse> {
237
+ const query = new URLSearchParams({ timezone, scope });
238
+ return this.request<GetLifeOpsScheduleMergedStateResponse>(
239
+ `merged-state?${query.toString()}`,
240
+ {
241
+ method: "GET",
242
+ },
243
+ );
244
+ }
245
+ }
@@ -0,0 +1,124 @@
1
+ import type {
2
+ LifeOpsAwakeProbability,
3
+ LifeOpsCircadianState,
4
+ LifeOpsPersonalBaseline,
5
+ LifeOpsRelativeTime,
6
+ LifeOpsScheduleInsight,
7
+ LifeOpsScheduleMealLabel,
8
+ LifeOpsScheduleRegularity,
9
+ LifeOpsScheduleSleepStatus,
10
+ LifeOpsUnclearReason,
11
+ } from "@elizaos/shared";
12
+
13
+ export const LIFEOPS_SCHEDULE_DEVICE_KINDS = [
14
+ "iphone",
15
+ "ipad",
16
+ "mac",
17
+ "watch",
18
+ "cloud",
19
+ "unknown",
20
+ ] as const;
21
+
22
+ export type LifeOpsScheduleDeviceKind =
23
+ (typeof LIFEOPS_SCHEDULE_DEVICE_KINDS)[number];
24
+
25
+ export const LIFEOPS_SCHEDULE_OBSERVATION_ORIGINS = [
26
+ "local_inference",
27
+ "device_sync",
28
+ ] as const;
29
+
30
+ export type LifeOpsScheduleObservationOrigin =
31
+ (typeof LIFEOPS_SCHEDULE_OBSERVATION_ORIGINS)[number];
32
+
33
+ export const LIFEOPS_SCHEDULE_STATE_SCOPES = ["local", "cloud"] as const;
34
+
35
+ export type LifeOpsScheduleStateScope =
36
+ (typeof LIFEOPS_SCHEDULE_STATE_SCOPES)[number];
37
+
38
+ export interface LifeOpsScheduleObservationSnapshot {
39
+ effectiveDayKey: string;
40
+ localDate: string;
41
+ phase: LifeOpsCircadianState;
42
+ circadianState: LifeOpsCircadianState;
43
+ stateConfidence: number;
44
+ uncertaintyReason: LifeOpsUnclearReason | null;
45
+ relativeTime: LifeOpsRelativeTime;
46
+ awakeProbability: LifeOpsAwakeProbability;
47
+ regularity: LifeOpsScheduleRegularity;
48
+ baseline: LifeOpsPersonalBaseline | null;
49
+ sleepStatus: LifeOpsScheduleSleepStatus;
50
+ isProbablySleeping: boolean;
51
+ sleepConfidence: number;
52
+ currentSleepStartedAt: string | null;
53
+ lastSleepStartedAt: string | null;
54
+ lastSleepEndedAt: string | null;
55
+ lastSleepDurationMinutes: number | null;
56
+ wakeAt: string | null;
57
+ firstActiveAt: string | null;
58
+ lastActiveAt: string | null;
59
+ lastMealAt: string | null;
60
+ nextMealLabel: LifeOpsScheduleMealLabel | null;
61
+ nextMealWindowStartAt: string | null;
62
+ nextMealWindowEndAt: string | null;
63
+ nextMealConfidence: number;
64
+ }
65
+
66
+ export interface LifeOpsScheduleObservation {
67
+ id: string;
68
+ agentId: string;
69
+ origin: LifeOpsScheduleObservationOrigin;
70
+ deviceId: string;
71
+ deviceKind: LifeOpsScheduleDeviceKind;
72
+ timezone: string;
73
+ observedAt: string;
74
+ windowStartAt: string;
75
+ windowEndAt: string | null;
76
+ circadianState: LifeOpsCircadianState;
77
+ stateConfidence: number;
78
+ uncertaintyReason: LifeOpsUnclearReason | null;
79
+ mealLabel: LifeOpsScheduleMealLabel | null;
80
+ metadata: Record<string, unknown>;
81
+ createdAt: string;
82
+ updatedAt: string;
83
+ }
84
+
85
+ export interface LifeOpsScheduleMergedState extends LifeOpsScheduleInsight {
86
+ id: string;
87
+ agentId: string;
88
+ scope: LifeOpsScheduleStateScope;
89
+ mergedAt: string;
90
+ observationCount: number;
91
+ deviceCount: number;
92
+ contributingDeviceKinds: LifeOpsScheduleDeviceKind[];
93
+ metadata: Record<string, unknown>;
94
+ createdAt: string;
95
+ updatedAt: string;
96
+ }
97
+
98
+ export interface SyncLifeOpsScheduleObservationInput {
99
+ circadianState: LifeOpsCircadianState;
100
+ stateConfidence: number;
101
+ uncertaintyReason?: LifeOpsUnclearReason | null;
102
+ windowStartAt: string;
103
+ windowEndAt?: string | null;
104
+ mealLabel?: LifeOpsScheduleMealLabel | null;
105
+ snapshot?: Partial<LifeOpsScheduleObservationSnapshot> | null;
106
+ metadata?: Record<string, unknown>;
107
+ }
108
+
109
+ export interface SyncLifeOpsScheduleObservationsRequest {
110
+ deviceId: string;
111
+ deviceKind: LifeOpsScheduleDeviceKind;
112
+ timezone: string;
113
+ observedAt?: string;
114
+ observations: SyncLifeOpsScheduleObservationInput[];
115
+ }
116
+
117
+ export interface SyncLifeOpsScheduleObservationsResponse {
118
+ acceptedCount: number;
119
+ mergedState: LifeOpsScheduleMergedState;
120
+ }
121
+
122
+ export interface GetLifeOpsScheduleMergedStateResponse {
123
+ mergedState: LifeOpsScheduleMergedState | null;
124
+ }