@elizaos/agent 2.0.0-alpha.192 → 2.0.0-alpha.196

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 (240) hide show
  1. package/apps/app-lifeops/src/action.d.ts.map +1 -1
  2. package/apps/app-lifeops/src/action.js +21 -2
  3. package/apps/app-lifeops/src/actions/app-blocker.d.ts +3 -1
  4. package/apps/app-lifeops/src/actions/app-blocker.d.ts.map +1 -1
  5. package/apps/app-lifeops/src/actions/app-blocker.js +2 -0
  6. package/apps/app-lifeops/src/actions/calendar.d.ts.map +1 -1
  7. package/apps/app-lifeops/src/actions/calendar.js +140 -7
  8. package/apps/app-lifeops/src/actions/computer-use.d.ts.map +1 -1
  9. package/apps/app-lifeops/src/actions/computer-use.js +248 -17
  10. package/apps/app-lifeops/src/actions/cross-channel-send.d.ts +3 -1
  11. package/apps/app-lifeops/src/actions/cross-channel-send.d.ts.map +1 -1
  12. package/apps/app-lifeops/src/actions/cross-channel-send.js +1 -0
  13. package/apps/app-lifeops/src/actions/dossier.d.ts.map +1 -1
  14. package/apps/app-lifeops/src/actions/dossier.js +51 -34
  15. package/apps/app-lifeops/src/actions/gmail.d.ts.map +1 -1
  16. package/apps/app-lifeops/src/actions/gmail.js +5 -0
  17. package/apps/app-lifeops/src/actions/inbox.d.ts.map +1 -1
  18. package/apps/app-lifeops/src/actions/inbox.js +8 -1
  19. package/apps/app-lifeops/src/actions/life.d.ts.map +1 -1
  20. package/apps/app-lifeops/src/actions/life.extractor.d.ts.map +1 -1
  21. package/apps/app-lifeops/src/actions/life.extractor.js +103 -4
  22. package/apps/app-lifeops/src/actions/life.js +8 -0
  23. package/apps/app-lifeops/src/actions/non-actionable-request.d.ts +6 -0
  24. package/apps/app-lifeops/src/actions/non-actionable-request.d.ts.map +1 -0
  25. package/apps/app-lifeops/src/actions/non-actionable-request.js +33 -0
  26. package/apps/app-lifeops/src/actions/password-manager.d.ts.map +1 -1
  27. package/apps/app-lifeops/src/actions/password-manager.js +11 -2
  28. package/apps/app-lifeops/src/actions/relationships.d.ts +3 -1
  29. package/apps/app-lifeops/src/actions/relationships.d.ts.map +1 -1
  30. package/apps/app-lifeops/src/actions/relationships.js +167 -11
  31. package/apps/app-lifeops/src/actions/remote-desktop.js +1 -1
  32. package/apps/app-lifeops/src/actions/screen-time.d.ts.map +1 -1
  33. package/apps/app-lifeops/src/actions/screen-time.js +8 -2
  34. package/apps/app-lifeops/src/actions/start-remote-session.js +1 -1
  35. package/apps/app-lifeops/src/actions/subscriptions.d.ts +5 -0
  36. package/apps/app-lifeops/src/actions/subscriptions.d.ts.map +1 -0
  37. package/apps/app-lifeops/src/actions/subscriptions.js +251 -0
  38. package/apps/app-lifeops/src/actions/twilio-call.d.ts.map +1 -1
  39. package/apps/app-lifeops/src/actions/twilio-call.js +48 -3
  40. package/apps/app-lifeops/src/actions/update-owner-profile.d.ts.map +1 -1
  41. package/apps/app-lifeops/src/actions/update-owner-profile.js +2 -1
  42. package/apps/app-lifeops/src/actions/website-blocker.d.ts +6 -2
  43. package/apps/app-lifeops/src/actions/website-blocker.d.ts.map +1 -1
  44. package/apps/app-lifeops/src/actions/website-blocker.js +38 -0
  45. package/apps/app-lifeops/src/actions/x-read.d.ts.map +1 -1
  46. package/apps/app-lifeops/src/actions/x-read.js +27 -3
  47. package/apps/app-lifeops/src/dossier/action.d.ts.map +1 -1
  48. package/apps/app-lifeops/src/dossier/action.js +8 -7
  49. package/apps/app-lifeops/src/followup/actions/listOverdueFollowups.d.ts.map +1 -1
  50. package/apps/app-lifeops/src/followup/actions/listOverdueFollowups.js +1 -0
  51. package/apps/app-lifeops/src/followup/actions/markFollowupDone.d.ts.map +1 -1
  52. package/apps/app-lifeops/src/followup/actions/markFollowupDone.js +2 -1
  53. package/apps/app-lifeops/src/followup/actions/setFollowupThreshold.d.ts.map +1 -1
  54. package/apps/app-lifeops/src/followup/actions/setFollowupThreshold.js +2 -1
  55. package/apps/app-lifeops/src/lifeops/calendly-client.d.ts.map +1 -1
  56. package/apps/app-lifeops/src/lifeops/calendly-client.js +4 -2
  57. package/apps/app-lifeops/src/lifeops/discord-browser-scraper.d.ts.map +1 -1
  58. package/apps/app-lifeops/src/lifeops/discord-browser-scraper.js +6 -5
  59. package/apps/app-lifeops/src/lifeops/password-manager-bridge.d.ts +1 -1
  60. package/apps/app-lifeops/src/lifeops/password-manager-bridge.d.ts.map +1 -1
  61. package/apps/app-lifeops/src/lifeops/password-manager-bridge.js +84 -6
  62. package/apps/app-lifeops/src/lifeops/remote-desktop.d.ts.map +1 -1
  63. package/apps/app-lifeops/src/lifeops/remote-desktop.js +30 -0
  64. package/apps/app-lifeops/src/lifeops/repository.d.ts +15 -0
  65. package/apps/app-lifeops/src/lifeops/repository.d.ts.map +1 -1
  66. package/apps/app-lifeops/src/lifeops/repository.js +330 -1
  67. package/apps/app-lifeops/src/lifeops/service-mixin-discord.js +222 -42
  68. package/apps/app-lifeops/src/lifeops/service-mixin-subscriptions.d.ts +2 -0
  69. package/apps/app-lifeops/src/lifeops/service-mixin-subscriptions.d.ts.map +1 -0
  70. package/apps/app-lifeops/src/lifeops/service-mixin-subscriptions.js +763 -0
  71. package/apps/app-lifeops/src/lifeops/service.d.ts +63 -0
  72. package/apps/app-lifeops/src/lifeops/service.d.ts.map +1 -1
  73. package/apps/app-lifeops/src/lifeops/service.js +2 -1
  74. package/apps/app-lifeops/src/lifeops/subscriptions-playbooks.d.ts +54 -0
  75. package/apps/app-lifeops/src/lifeops/subscriptions-playbooks.d.ts.map +1 -0
  76. package/apps/app-lifeops/src/lifeops/subscriptions-playbooks.js +213 -0
  77. package/apps/app-lifeops/src/lifeops/subscriptions-types.d.ts +80 -0
  78. package/apps/app-lifeops/src/lifeops/subscriptions-types.d.ts.map +1 -0
  79. package/apps/app-lifeops/src/lifeops/twilio.d.ts.map +1 -1
  80. package/apps/app-lifeops/src/lifeops/twilio.js +4 -2
  81. package/apps/app-lifeops/src/lifeops/whatsapp-client.d.ts.map +1 -1
  82. package/apps/app-lifeops/src/lifeops/whatsapp-client.js +4 -2
  83. package/apps/app-lifeops/src/lifeops/x-poster.d.ts.map +1 -1
  84. package/apps/app-lifeops/src/lifeops/x-poster.js +12 -6
  85. package/apps/app-lifeops/src/lifeops/x-reader.d.ts.map +1 -1
  86. package/apps/app-lifeops/src/lifeops/x-reader.js +7 -5
  87. package/apps/app-lifeops/src/plugin.d.ts.map +1 -1
  88. package/apps/app-lifeops/src/plugin.js +31 -24
  89. package/apps/app-lifeops/src/provider.d.ts.map +1 -1
  90. package/apps/app-lifeops/src/provider.js +4 -4
  91. package/apps/app-lifeops/src/providers/inbox-triage.js +2 -2
  92. package/apps/app-lifeops/src/providers/lifeops.d.ts.map +1 -1
  93. package/apps/app-lifeops/src/providers/lifeops.js +19 -10
  94. package/apps/app-lifeops/src/providers/website-blocker.js +1 -1
  95. package/apps/app-lifeops/src/public.d.ts +4 -0
  96. package/apps/app-lifeops/src/public.d.ts.map +1 -0
  97. package/apps/app-lifeops/src/public.js +3 -0
  98. package/apps/app-lifeops/src/routes/plugin.d.ts +18 -0
  99. package/apps/app-lifeops/src/routes/plugin.d.ts.map +1 -0
  100. package/apps/app-lifeops/src/routes/plugin.js +270 -0
  101. package/apps/app-lifeops/src/website-blocker/chat-integration/actions/blockUntilTaskComplete.d.ts.map +1 -1
  102. package/apps/app-lifeops/src/website-blocker/chat-integration/actions/blockUntilTaskComplete.js +18 -2
  103. package/apps/app-training/src/core/training-orchestrator.d.ts.map +1 -1
  104. package/apps/app-training/src/core/training-orchestrator.js +4 -0
  105. package/apps/app-training/src/services/training-trigger.d.ts +32 -18
  106. package/apps/app-training/src/services/training-trigger.d.ts.map +1 -1
  107. package/apps/app-training/src/services/training-trigger.js +10 -1
  108. package/package.json +4 -4
  109. package/packages/agent/src/actions/browser-session.d.ts +3 -0
  110. package/packages/agent/src/actions/browser-session.d.ts.map +1 -0
  111. package/packages/agent/src/actions/browser-session.js +207 -0
  112. package/packages/agent/src/actions/context-signal.d.ts +1 -1
  113. package/packages/agent/src/actions/context-signal.d.ts.map +1 -1
  114. package/packages/agent/src/actions/context-signal.js +1 -1
  115. package/packages/agent/src/actions/extract-page.d.ts +3 -0
  116. package/packages/agent/src/actions/extract-page.d.ts.map +1 -0
  117. package/packages/agent/src/actions/extract-page.js +124 -0
  118. package/packages/agent/src/actions/grounded-action-reply.js +1 -1
  119. package/packages/agent/src/actions/recent-conversation-texts.d.ts +9 -0
  120. package/packages/agent/src/actions/recent-conversation-texts.d.ts.map +1 -0
  121. package/packages/agent/src/actions/recent-conversation-texts.js +81 -0
  122. package/packages/agent/src/actions/set-user-name.js +1 -1
  123. package/packages/agent/src/actions/web-search.d.ts +4 -10
  124. package/packages/agent/src/actions/web-search.d.ts.map +1 -1
  125. package/packages/agent/src/actions/web-search.js +89 -19
  126. package/packages/agent/src/api/binance-skill-helpers.d.ts.map +1 -1
  127. package/packages/agent/src/api/binance-skill-helpers.js +1 -1
  128. package/packages/agent/src/api/chat-augmentation.d.ts +1 -20
  129. package/packages/agent/src/api/chat-augmentation.d.ts.map +1 -1
  130. package/packages/agent/src/api/chat-augmentation.js +2 -110
  131. package/packages/agent/src/api/conversation-metadata.d.ts +9 -0
  132. package/packages/agent/src/api/conversation-metadata.d.ts.map +1 -0
  133. package/packages/agent/src/api/conversation-metadata.js +98 -0
  134. package/packages/agent/src/api/conversation-routes.d.ts.map +1 -1
  135. package/packages/agent/src/api/conversation-routes.js +40 -9
  136. package/packages/agent/src/api/lifeops-browser-packaging.d.ts +1 -1
  137. package/packages/agent/src/api/lifeops-browser-packaging.d.ts.map +1 -1
  138. package/packages/agent/src/api/lifeops-browser-packaging.js +1 -1
  139. package/packages/agent/src/api/permissions-routes.js +1 -1
  140. package/packages/agent/src/api/server-helpers-auth.js +1 -1
  141. package/packages/agent/src/api/server-helpers.d.ts +2 -1
  142. package/packages/agent/src/api/server-helpers.d.ts.map +1 -1
  143. package/packages/agent/src/api/server-helpers.js +2 -110
  144. package/packages/agent/src/api/server-types.d.ts +14 -0
  145. package/packages/agent/src/api/server-types.d.ts.map +1 -1
  146. package/packages/agent/src/api/server.d.ts.map +1 -1
  147. package/packages/agent/src/api/server.js +3 -13
  148. package/packages/agent/src/api/workbench-routes.d.ts.map +1 -1
  149. package/packages/agent/src/api/workbench-routes.js +0 -14
  150. package/packages/agent/src/auth/credentials.d.ts.map +1 -1
  151. package/packages/agent/src/auth/credentials.js +8 -0
  152. package/packages/agent/src/config/zod-schema.d.ts +2 -2
  153. package/packages/agent/src/config/zod-schema.providers-core.d.ts +3 -3
  154. package/packages/agent/src/providers/automation-terminal-bridge.d.ts +3 -0
  155. package/packages/agent/src/providers/automation-terminal-bridge.d.ts.map +1 -0
  156. package/packages/agent/src/providers/automation-terminal-bridge.js +71 -0
  157. package/packages/agent/src/providers/index.d.ts +1 -0
  158. package/packages/agent/src/providers/index.d.ts.map +1 -1
  159. package/packages/agent/src/providers/index.js +1 -0
  160. package/packages/agent/src/providers/recent-conversations.d.ts.map +1 -1
  161. package/packages/agent/src/providers/recent-conversations.js +5 -0
  162. package/packages/agent/src/providers/relevant-conversations.d.ts.map +1 -1
  163. package/packages/agent/src/providers/relevant-conversations.js +5 -0
  164. package/packages/agent/src/providers/user-name.d.ts.map +1 -1
  165. package/packages/agent/src/providers/user-name.js +1 -1
  166. package/packages/agent/src/runtime/eliza-plugin.d.ts.map +1 -1
  167. package/packages/agent/src/runtime/eliza-plugin.js +6 -0
  168. package/packages/agent/src/runtime/plugin-resolver.d.ts.map +1 -1
  169. package/packages/agent/src/runtime/plugin-resolver.js +115 -0
  170. package/packages/agent/src/services/browser-workspace-types.d.ts +5 -1
  171. package/packages/agent/src/services/browser-workspace-types.d.ts.map +1 -1
  172. package/packages/agent/src/services/browser-workspace.d.ts.map +1 -1
  173. package/packages/agent/src/services/browser-workspace.js +178 -7
  174. package/packages/agent/src/services/coding-agent-context.d.ts +4 -4
  175. package/packages/agent/src/services/escalation.d.ts +0 -11
  176. package/packages/agent/src/services/escalation.d.ts.map +1 -1
  177. package/packages/agent/src/services/escalation.js +19 -58
  178. package/packages/agent/src/services/hosted-tools.d.ts +70 -0
  179. package/packages/agent/src/services/hosted-tools.d.ts.map +1 -0
  180. package/packages/agent/src/services/hosted-tools.js +87 -0
  181. package/packages/agent/src/services/owner-name.d.ts +4 -0
  182. package/packages/agent/src/services/owner-name.d.ts.map +1 -0
  183. package/packages/agent/src/services/owner-name.js +46 -0
  184. package/packages/agent/src/services/registry-client-queries.d.ts +1 -1
  185. package/packages/agent/src/services/registry-client-queries.js +1 -1
  186. package/packages/agent/src/services/registry-client-types.d.ts +1 -1
  187. package/packages/agent/src/services/stream-manager.d.ts +1 -1
  188. package/packages/app-core/src/config/boot-config-store.d.ts +1 -1
  189. package/packages/app-core/src/config/boot-config-store.d.ts.map +1 -1
  190. package/packages/shared/src/contracts/lifeops.d.ts +26 -0
  191. package/packages/shared/src/contracts/lifeops.d.ts.map +1 -1
  192. package/packages/shared/src/contracts/lifeops.js +28 -0
  193. package/packages/typescript/src/actions.d.ts.map +1 -1
  194. package/packages/typescript/src/actions.js +12 -0
  195. package/packages/typescript/src/features/advanced-capabilities/actions/scheduleFollowUp.d.ts.map +1 -1
  196. package/packages/typescript/src/features/advanced-capabilities/actions/scheduleFollowUp.js +8 -2
  197. package/packages/typescript/src/features/advanced-capabilities/providers/settings.d.ts.map +1 -1
  198. package/packages/typescript/src/features/advanced-capabilities/providers/settings.js +11 -3
  199. package/packages/typescript/src/features/basic-capabilities/providers/actions.d.ts.map +1 -1
  200. package/packages/typescript/src/features/basic-capabilities/providers/actions.js +23 -1
  201. package/packages/typescript/src/features/basic-capabilities/providers/non-actionable-chatter.d.ts +5 -0
  202. package/packages/typescript/src/features/basic-capabilities/providers/non-actionable-chatter.d.ts.map +1 -0
  203. package/packages/typescript/src/features/basic-capabilities/providers/non-actionable-chatter.js +22 -0
  204. package/packages/typescript/src/features/basic-capabilities/providers/providers.d.ts.map +1 -1
  205. package/packages/typescript/src/features/basic-capabilities/providers/providers.js +10 -5
  206. package/packages/typescript/src/features/knowledge/documents-provider.d.ts.map +1 -1
  207. package/packages/typescript/src/features/knowledge/documents-provider.js +1 -0
  208. package/packages/typescript/src/features/shared/schedule-follow-up-response.d.ts +10 -0
  209. package/packages/typescript/src/features/shared/schedule-follow-up-response.d.ts.map +1 -0
  210. package/packages/typescript/src/features/shared/schedule-follow-up-response.js +49 -0
  211. package/packages/typescript/src/features/trajectories/TrajectoriesService.d.ts +1 -0
  212. package/packages/typescript/src/features/trajectories/TrajectoriesService.d.ts.map +1 -1
  213. package/packages/typescript/src/features/trajectories/TrajectoriesService.js +21 -2
  214. package/packages/typescript/src/features/trust/providers/settings.d.ts.map +1 -1
  215. package/packages/typescript/src/features/trust/providers/settings.js +11 -1
  216. package/packages/typescript/src/prompts.d.ts +4 -4
  217. package/packages/typescript/src/prompts.d.ts.map +1 -1
  218. package/packages/typescript/src/prompts.js +10 -2
  219. package/packages/typescript/src/schemas/character.d.ts +3 -3
  220. package/packages/typescript/src/services/message.d.ts +1 -0
  221. package/packages/typescript/src/services/message.d.ts.map +1 -1
  222. package/packages/typescript/src/services/message.js +483 -18
  223. package/packages/typescript/src/types/components.d.ts +6 -0
  224. package/packages/typescript/src/types/components.d.ts.map +1 -1
  225. package/packages/typescript/src/utils/context-routing.d.ts.map +1 -1
  226. package/packages/typescript/src/utils/context-routing.js +5 -1
  227. package/packages/typescript/src/utils/toon.d.ts.map +1 -1
  228. package/packages/typescript/src/utils/toon.js +23 -2
  229. package/packages/typescript/src/utils.d.ts +1 -0
  230. package/packages/typescript/src/utils.d.ts.map +1 -1
  231. package/packages/typescript/src/utils.js +1 -0
  232. package/apps/app-lifeops/src/types/app-blocker-settings-card.d.ts +0 -2
  233. package/apps/app-lifeops/src/types/app-blocker-settings-card.d.ts.map +0 -1
  234. package/apps/app-lifeops/src/types/index.d.ts +0 -3
  235. package/apps/app-lifeops/src/types/index.d.ts.map +0 -1
  236. package/apps/app-lifeops/src/types/index.js +0 -1
  237. package/apps/app-lifeops/src/types/website-blocker-settings-card.d.ts +0 -2
  238. package/apps/app-lifeops/src/types/website-blocker-settings-card.d.ts.map +0 -1
  239. package/apps/app-lifeops/src/types/website-blocker-settings-card.js +0 -1
  240. /package/apps/app-lifeops/src/{types/app-blocker-settings-card.js → lifeops/subscriptions-types.js} +0 -0
@@ -454,9 +454,15 @@ declare const LifeOpsServiceComposedBase_base: {
454
454
  lifeOpsDiscordGetBrowserSessionById(sessionId: string | null): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserSession | null>;
455
455
  lifeOpsDiscordGetOwnerBrowserDiscordState(grant: import("@elizaos/shared/contracts/lifeops.js").LifeOpsConnectorGrant | null): Promise<{
456
456
  available: boolean;
457
+ settingsEnabled: boolean;
458
+ trackingEnabled: boolean;
459
+ paused: boolean;
457
460
  canControl: boolean;
458
461
  selectedCompanion: import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserCompanionStatus | null;
462
+ hasAnyCompanion: boolean;
463
+ hasConnectedCompanion: boolean;
459
464
  discordTab: import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserTabSummary | null;
465
+ currentPageUrl: string | null;
460
466
  probe: import("./discord-browser-scraper.js").DiscordTabProbe | null;
461
467
  session: import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserSession | null;
462
468
  lastError: string | null;
@@ -871,6 +877,63 @@ declare const LifeOpsServiceComposedBase_base: {
871
877
  getWorkflowDefinition(workflowId: string): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsWorkflowDefinition>;
872
878
  requireXGrant(requestedMode?: import("@elizaos/shared/contracts/lifeops.js").LifeOpsConnectorMode): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsConnectorGrant>;
873
879
  };
880
+ } & {
881
+ new (...args: any[]): {
882
+ listSubscriptionPlaybooks(): Promise<import("./subscriptions-playbooks.js").LifeOpsSubscriptionPlaybook[]>;
883
+ getLatestSubscriptionAudit(): Promise<import("./subscriptions-types.js").LifeOpsSubscriptionAuditSummary | null>;
884
+ auditSubscriptions(requestUrl: URL, request?: import("./subscriptions-types.js").LifeOpsSubscriptionDiscoveryRequest): Promise<import("./subscriptions-types.js").LifeOpsSubscriptionAuditSummary>;
885
+ getSubscriptionCancellationStatus(args: {
886
+ cancellationId?: string | null;
887
+ serviceName?: string | null;
888
+ serviceSlug?: string | null;
889
+ }): Promise<import("./subscriptions-types.js").LifeOpsSubscriptionCancellationSummary | null>;
890
+ cancelSubscription(request: import("./subscriptions-types.js").LifeOpsSubscriptionCancellationRequest): Promise<import("./subscriptions-types.js").LifeOpsSubscriptionCancellationSummary>;
891
+ summarizeSubscriptionAudit(summary: import("./subscriptions-types.js").LifeOpsSubscriptionAuditSummary): string;
892
+ summarizeSubscriptionCancellation(summary: import("./subscriptions-types.js").LifeOpsSubscriptionCancellationSummary): string;
893
+ resolveSubscriptionIntent(text: string): {
894
+ mode: "audit" | "cancel" | "status" | null;
895
+ serviceName?: string;
896
+ serviceSlug?: string;
897
+ executor?: import("./subscriptions-types.js").LifeOpsSubscriptionExecutor;
898
+ };
899
+ readonly repository: import("./repository.js").LifeOpsRepository;
900
+ readonly explicitOwnerEntityIdValue: string | null;
901
+ readonly ownerEntityIdValue: string;
902
+ readonly googleManagedClient: import("./google-managed-client.js").GoogleManagedClient;
903
+ ownerRoutingEntityIdPromise: Promise<string | null> | null;
904
+ adaptiveWindowPolicyCache: {
905
+ policy: ReturnType<typeof import("./defaults.js").computeAdaptiveWindowPolicy>;
906
+ computedAt: number;
907
+ } | null;
908
+ readonly runtime: import("@elizaos/core").IAgentRuntime;
909
+ agentId(): string;
910
+ ownerEntityId(): string;
911
+ ownerRoutingEntityId(): Promise<string | null>;
912
+ getBrowserSettingsInternal(): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserSettings>;
913
+ isBrowserPaused(settings: import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserSettings): boolean;
914
+ requireBrowserAvailableForActions(actions: readonly import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserAction[]): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserSettings>;
915
+ buildBrowserCompanion(request: import("@elizaos/shared/contracts/lifeops.js").UpsertLifeOpsBrowserCompanionRequest, current: import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserCompanionStatus | null): import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserCompanionStatus;
916
+ normalizeOwnership(input: import("@elizaos/shared/contracts/lifeops.js").LifeOpsOwnershipInput | undefined, current?: import("@elizaos/shared/contracts/lifeops.js").LifeOpsOwnership): import("@elizaos/shared/contracts/lifeops.js").LifeOpsOwnership;
917
+ normalizeChildOwnership(parent: import("@elizaos/shared/contracts/lifeops.js").LifeOpsOwnership, input: import("@elizaos/shared/contracts/lifeops.js").LifeOpsOwnershipInput | undefined, field?: string): import("@elizaos/shared/contracts/lifeops.js").LifeOpsOwnership;
918
+ logLifeOpsWarn(operation: string, message: string, context?: Record<string, unknown>): void;
919
+ logLifeOpsError(operation: string, error: unknown, context?: Record<string, unknown>): void;
920
+ withReminderProcessingLock<T>(operation: () => Promise<T>): Promise<T>;
921
+ recordAudit(eventType: import("@elizaos/shared/contracts/lifeops.js").LifeOpsAuditEventType, ownerType: "definition" | "occurrence" | "goal", ownerId: string, reason: string, inputs: Record<string, unknown>, decision: Record<string, unknown>): Promise<void>;
922
+ recordConnectorAudit(ownerId: string, reason: string, inputs: Record<string, unknown>, decision: Record<string, unknown>): Promise<void>;
923
+ recordChannelPolicyAudit(ownerId: string, reason: string, inputs: Record<string, unknown>, decision: Record<string, unknown>): Promise<void>;
924
+ recordWorkflowAudit(eventType: "workflow_created" | "workflow_updated" | "workflow_run", ownerId: string, actor: "user" | "workflow", reason: string, inputs: Record<string, unknown>, decision: Record<string, unknown>): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsAuditEvent>;
925
+ recordReminderAudit(eventType: "reminder_due" | "reminder_delivered" | "reminder_blocked" | "reminder_escalation_started" | "reminder_escalation_resolved", ownerType: "occurrence" | "calendar_event", ownerId: string, reason: string, inputs: Record<string, unknown>, decision: Record<string, unknown>): Promise<void>;
926
+ recordBrowserAudit(eventType: "browser_session_created" | "browser_session_updated", ownerId: string, reason: string, inputs: Record<string, unknown>, decision: Record<string, unknown>): Promise<void>;
927
+ recordXPostAudit(ownerId: string, reason: string, inputs: Record<string, unknown>, decision: Record<string, unknown>): Promise<void>;
928
+ clearGoogleGrantAuthFailure(grant: import("@elizaos/shared/contracts/lifeops.js").LifeOpsConnectorGrant): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsConnectorGrant>;
929
+ markGoogleGrantNeedsReauth(grant: import("@elizaos/shared/contracts/lifeops.js").LifeOpsConnectorGrant, message: string): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsConnectorGrant>;
930
+ emitAssistantEvent(text: string, source: string, data?: Record<string, unknown>): void;
931
+ getWorkflowDefinition(workflowId: string): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsWorkflowDefinition>;
932
+ requireXGrant(requestedMode?: import("@elizaos/shared/contracts/lifeops.js").LifeOpsConnectorMode): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsConnectorGrant>;
933
+ getGmailTriage(requestUrl: URL, request?: Record<string, unknown>, now?: Date): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsGmailTriageFeed>;
934
+ listBrowserCompanions(): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserCompanionStatus[]>;
935
+ createBrowserSession(request: import("@elizaos/shared/contracts/lifeops.js").CreateLifeOpsBrowserSessionRequest): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserSession>;
936
+ };
874
937
  } & {
875
938
  new (...args: any[]): {
876
939
  createBrowserSessionInternal(request: import("@elizaos/shared/contracts/lifeops.js").CreateLifeOpsBrowserSessionRequest): Promise<import("@elizaos/shared/contracts/lifeops.js").LifeOpsBrowserSession>;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iEA0EospC,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;0BAA55iC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAnDt3G;;;;;;;GAOG;AACH,qBAAa,0BAA2B,SAAQ,+BAwC/C;CAAG;AAEJ,qBAAa,cAAe,SAAQ,0BAA0B;CAAG"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iEA6EokpC,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;0BAA55iC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AArDtvG;;;;;;;GAOG;AACH,qBAAa,0BAA2B,SAAQ,+BA0C/C;CAAG;AAEJ,qBAAa,cAAe,SAAQ,0BAA0B;CAAG"}
@@ -28,6 +28,7 @@ import { withScheduling } from "./service-mixin-scheduling.js";
28
28
  import { withDossier } from "./service-mixin-dossier.js";
29
29
  import { withHealth } from "./service-mixin-health.js";
30
30
  import { withDrive } from "./service-mixin-drive.js";
31
+ import { withSubscriptions } from "./service-mixin-subscriptions.js";
31
32
  /**
32
33
  * Main LifeOps service — assembled from domain mixins layered on top of
33
34
  * {@link LifeOpsServiceBase}.
@@ -36,7 +37,7 @@ import { withDrive } from "./service-mixin-drive.js";
36
37
  * (Calendar, Gmail, Drive) → business logic (Reminders, Browser, Workflows,
37
38
  * Definitions, Goals) → connectors (X, Telegram, Discord, Signal).
38
39
  */
39
- export class LifeOpsServiceComposedBase extends withHealth(withDossier(withScheduling(withScreenTime(withWhatsApp(withRelationships(withIMessage(withSignal(withDiscord(withTelegram(withXRead(withX(withGoals(withDefinitions(withWorkflows(withBrowser(withReminders(withGmail(withDrive(withCalendar(withGoogle(LifeOpsServiceBase))))))))))))))))))))) {
40
+ export class LifeOpsServiceComposedBase extends withHealth(withDossier(withScheduling(withScreenTime(withWhatsApp(withRelationships(withIMessage(withSignal(withDiscord(withTelegram(withXRead(withX(withGoals(withDefinitions(withWorkflows(withSubscriptions(withBrowser(withReminders(withGmail(withDrive(withCalendar(withGoogle(LifeOpsServiceBase)))))))))))))))))))))) {
40
41
  }
41
42
  export class LifeOpsService extends LifeOpsServiceComposedBase {
42
43
  }
@@ -0,0 +1,54 @@
1
+ import type { LifeOpsSubscriptionExecutor } from "./subscriptions-types.js";
2
+ export type SubscriptionAutomationStep = {
3
+ kind: "open";
4
+ url: string;
5
+ } | {
6
+ kind: "navigate";
7
+ url: string;
8
+ } | {
9
+ kind: "wait_text";
10
+ text: string;
11
+ timeoutMs?: number;
12
+ } | {
13
+ kind: "wait_selector";
14
+ selector: string;
15
+ timeoutMs?: number;
16
+ } | {
17
+ kind: "click_text";
18
+ text: string;
19
+ destructive?: boolean;
20
+ } | {
21
+ kind: "click_selector";
22
+ selector: string;
23
+ destructive?: boolean;
24
+ } | {
25
+ kind: "assert_text";
26
+ text: string;
27
+ } | {
28
+ kind: "screenshot";
29
+ label: string;
30
+ };
31
+ export interface LifeOpsSubscriptionPlaybook {
32
+ key: string;
33
+ serviceName: string;
34
+ aliases: string[];
35
+ executorPreference: LifeOpsSubscriptionExecutor;
36
+ managementUrl: string;
37
+ managementPath?: string;
38
+ auditDomains: string[];
39
+ auditSubjectKeywords: string[];
40
+ loginMarkers: string[];
41
+ mfaMarkers: string[];
42
+ phoneOnlyMarkers: string[];
43
+ chatOnlyMarkers: string[];
44
+ cancellationMarkers: string[];
45
+ steps: SubscriptionAutomationStep[];
46
+ companionSelectors?: {
47
+ cancel?: string;
48
+ confirm?: string;
49
+ };
50
+ }
51
+ export declare const LIFEOPS_SUBSCRIPTION_PLAYBOOKS: readonly LifeOpsSubscriptionPlaybook[];
52
+ export declare function listLifeOpsSubscriptionPlaybooks(): readonly LifeOpsSubscriptionPlaybook[];
53
+ export declare function findLifeOpsSubscriptionPlaybook(serviceNameOrSlug: string | null | undefined): LifeOpsSubscriptionPlaybook | null;
54
+ //# sourceMappingURL=subscriptions-playbooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptions-playbooks.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/subscriptions-playbooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E,MAAM,MAAM,0BAA0B,GAClC;IACE,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEN,MAAM,WAAW,2BAA2B;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kBAAkB,EAAE,2BAA2B,CAAC;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,KAAK,EAAE,0BAA0B,EAAE,CAAC;IACpC,kBAAkB,CAAC,EAAE;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAgCD,eAAO,MAAM,8BAA8B,EAAE,SAAS,2BAA2B,EA6LrE,CAAC;AAMb,wBAAgB,gCAAgC,IAAI,SAAS,2BAA2B,EAAE,CAEzF;AAED,wBAAgB,+BAA+B,CAC7C,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC3C,2BAA2B,GAAG,IAAI,CA0BpC"}
@@ -0,0 +1,213 @@
1
+ const FIXTURE_BASE_URL_ENV = "MILADY_SUBSCRIPTION_FIXTURE_BASE_URL";
2
+ function configuredFixtureBaseUrl() {
3
+ const value = process.env[FIXTURE_BASE_URL_ENV]?.trim();
4
+ if (!value) {
5
+ return null;
6
+ }
7
+ return value.replace(/\/+$/, "");
8
+ }
9
+ function withFixtureOverride(path, fallback) {
10
+ const base = configuredFixtureBaseUrl();
11
+ return base ? `${base}${path}` : fallback;
12
+ }
13
+ const GENERIC_LOGIN_MARKERS = [
14
+ "sign in",
15
+ "log in",
16
+ "login",
17
+ "password",
18
+ "email address",
19
+ ];
20
+ const GENERIC_MFA_MARKERS = [
21
+ "verification code",
22
+ "two-factor",
23
+ "2-step verification",
24
+ "enter code",
25
+ ];
26
+ export const LIFEOPS_SUBSCRIPTION_PLAYBOOKS = [
27
+ {
28
+ key: "google_play",
29
+ serviceName: "Google Play",
30
+ aliases: [
31
+ "google play",
32
+ "play store",
33
+ "play subscriptions",
34
+ ],
35
+ executorPreference: "agent_browser",
36
+ managementUrl: withFixtureOverride("/stores/google-play", "https://play.google.com/store/account/subscriptions"),
37
+ managementPath: "/stores/google-play",
38
+ auditDomains: ["google.com", "googleplay.com"],
39
+ auditSubjectKeywords: [
40
+ "google play",
41
+ "subscription",
42
+ "renewal",
43
+ "receipt",
44
+ ],
45
+ loginMarkers: [...GENERIC_LOGIN_MARKERS],
46
+ mfaMarkers: [...GENERIC_MFA_MARKERS],
47
+ phoneOnlyMarkers: ["phone support"],
48
+ chatOnlyMarkers: ["chat support"],
49
+ cancellationMarkers: ["subscription canceled", "canceled on"],
50
+ steps: [
51
+ {
52
+ kind: "open",
53
+ url: withFixtureOverride("/stores/google-play", "https://play.google.com/store/account/subscriptions"),
54
+ },
55
+ { kind: "wait_text", text: "Subscriptions" },
56
+ { kind: "click_text", text: "Cancel subscription" },
57
+ { kind: "wait_text", text: "Confirm cancellation" },
58
+ { kind: "click_text", text: "Confirm cancellation", destructive: true },
59
+ { kind: "wait_text", text: "subscription canceled" },
60
+ { kind: "screenshot", label: "google-play-cancelled" },
61
+ ],
62
+ companionSelectors: {
63
+ cancel: "[data-lifeops-action='cancel-subscription']",
64
+ confirm: "[data-lifeops-action='confirm-cancellation']",
65
+ },
66
+ },
67
+ {
68
+ key: "apple_subscriptions",
69
+ serviceName: "Apple subscriptions",
70
+ aliases: [
71
+ "apple subscriptions",
72
+ "app store",
73
+ "itunes subscription",
74
+ "apple services",
75
+ ],
76
+ executorPreference: "agent_browser",
77
+ managementUrl: withFixtureOverride("/stores/apple-subscriptions", "https://account.apple.com/account/manage/section/subscriptions"),
78
+ managementPath: "/stores/apple-subscriptions",
79
+ auditDomains: ["apple.com", "itunes.com"],
80
+ auditSubjectKeywords: [
81
+ "app store",
82
+ "apple subscription",
83
+ "renewal receipt",
84
+ ],
85
+ loginMarkers: [...GENERIC_LOGIN_MARKERS, "apple id"],
86
+ mfaMarkers: [...GENERIC_MFA_MARKERS, "trusted device"],
87
+ phoneOnlyMarkers: ["contact apple support by phone"],
88
+ chatOnlyMarkers: ["chat with apple support"],
89
+ cancellationMarkers: ["subscription canceled", "expires on"],
90
+ steps: [
91
+ {
92
+ kind: "open",
93
+ url: withFixtureOverride("/stores/apple-subscriptions", "https://account.apple.com/account/manage/section/subscriptions"),
94
+ },
95
+ { kind: "wait_text", text: "Subscriptions" },
96
+ { kind: "click_text", text: "Cancel subscription" },
97
+ { kind: "wait_text", text: "Confirm cancellation" },
98
+ { kind: "click_text", text: "Confirm cancellation", destructive: true },
99
+ { kind: "wait_text", text: "subscription canceled" },
100
+ { kind: "screenshot", label: "apple-subscriptions-cancelled" },
101
+ ],
102
+ companionSelectors: {
103
+ cancel: "[data-lifeops-action='cancel-subscription']",
104
+ confirm: "[data-lifeops-action='confirm-cancellation']",
105
+ },
106
+ },
107
+ {
108
+ key: "fixture_streaming",
109
+ serviceName: "Fixture Streaming",
110
+ aliases: ["fixture streaming", "streaming fixture", "test streaming"],
111
+ executorPreference: "agent_browser",
112
+ managementUrl: withFixtureOverride("/services/fixture-streaming", "https://example.com/account/subscription"),
113
+ managementPath: "/services/fixture-streaming",
114
+ auditDomains: ["fixture-streaming.example"],
115
+ auditSubjectKeywords: ["fixture streaming", "monthly plan", "receipt"],
116
+ loginMarkers: [...GENERIC_LOGIN_MARKERS],
117
+ mfaMarkers: [...GENERIC_MFA_MARKERS],
118
+ phoneOnlyMarkers: ["call us to cancel"],
119
+ chatOnlyMarkers: ["chat with support to cancel"],
120
+ cancellationMarkers: ["subscription canceled"],
121
+ steps: [
122
+ {
123
+ kind: "open",
124
+ url: withFixtureOverride("/services/fixture-streaming", "https://example.com/account/subscription"),
125
+ },
126
+ { kind: "wait_text", text: "Fixture Streaming" },
127
+ { kind: "click_text", text: "Cancel subscription" },
128
+ { kind: "wait_text", text: "Confirm cancellation" },
129
+ { kind: "click_text", text: "Confirm cancellation", destructive: true },
130
+ { kind: "wait_text", text: "subscription canceled" },
131
+ { kind: "screenshot", label: "fixture-streaming-cancelled" },
132
+ ],
133
+ companionSelectors: {
134
+ cancel: "[data-lifeops-action='cancel-subscription']",
135
+ confirm: "[data-lifeops-action='confirm-cancellation']",
136
+ },
137
+ },
138
+ {
139
+ key: "fixture_login_required",
140
+ serviceName: "Fixture Login Required",
141
+ aliases: ["fixture login required", "test login required"],
142
+ executorPreference: "agent_browser",
143
+ managementUrl: withFixtureOverride("/services/login-required", "https://example.com/account/subscription"),
144
+ managementPath: "/services/login-required",
145
+ auditDomains: ["login-required.example"],
146
+ auditSubjectKeywords: ["login required", "membership receipt"],
147
+ loginMarkers: [...GENERIC_LOGIN_MARKERS],
148
+ mfaMarkers: [...GENERIC_MFA_MARKERS],
149
+ phoneOnlyMarkers: [],
150
+ chatOnlyMarkers: [],
151
+ cancellationMarkers: ["subscription canceled"],
152
+ steps: [
153
+ {
154
+ kind: "open",
155
+ url: withFixtureOverride("/services/login-required", "https://example.com/account/subscription"),
156
+ },
157
+ { kind: "wait_text", text: "Sign in to continue" },
158
+ ],
159
+ companionSelectors: {},
160
+ },
161
+ {
162
+ key: "fixture_phone_only",
163
+ serviceName: "Fixture Phone Only",
164
+ aliases: ["fixture phone only", "test phone only"],
165
+ executorPreference: "agent_browser",
166
+ managementUrl: withFixtureOverride("/services/phone-only", "https://example.com/account/subscription"),
167
+ managementPath: "/services/phone-only",
168
+ auditDomains: ["phone-only.example"],
169
+ auditSubjectKeywords: ["phone only", "billing receipt"],
170
+ loginMarkers: [],
171
+ mfaMarkers: [],
172
+ phoneOnlyMarkers: ["call us to cancel"],
173
+ chatOnlyMarkers: [],
174
+ cancellationMarkers: [],
175
+ steps: [
176
+ {
177
+ kind: "open",
178
+ url: withFixtureOverride("/services/phone-only", "https://example.com/account/subscription"),
179
+ },
180
+ { kind: "wait_text", text: "Call us to cancel" },
181
+ ],
182
+ companionSelectors: {},
183
+ },
184
+ ];
185
+ function normalizeName(value) {
186
+ return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
187
+ }
188
+ export function listLifeOpsSubscriptionPlaybooks() {
189
+ return LIFEOPS_SUBSCRIPTION_PLAYBOOKS;
190
+ }
191
+ export function findLifeOpsSubscriptionPlaybook(serviceNameOrSlug) {
192
+ if (!serviceNameOrSlug) {
193
+ return null;
194
+ }
195
+ const normalized = normalizeName(serviceNameOrSlug);
196
+ for (const playbook of LIFEOPS_SUBSCRIPTION_PLAYBOOKS) {
197
+ if (normalizeName(playbook.key) === normalized) {
198
+ return playbook;
199
+ }
200
+ if (normalizeName(playbook.serviceName) === normalized) {
201
+ return playbook;
202
+ }
203
+ if (playbook.aliases.some((alias) => normalizeName(alias) === normalized)) {
204
+ return playbook;
205
+ }
206
+ if (normalized.includes(normalizeName(playbook.key)) ||
207
+ normalized.includes(normalizeName(playbook.serviceName)) ||
208
+ playbook.aliases.some((alias) => normalized.includes(normalizeName(alias)))) {
209
+ return playbook;
210
+ }
211
+ }
212
+ return null;
213
+ }
@@ -0,0 +1,80 @@
1
+ export type LifeOpsSubscriptionAuditStatus = "completed" | "failed";
2
+ export type LifeOpsSubscriptionSource = "gmail" | "manual";
3
+ export type LifeOpsSubscriptionState = "active" | "canceled" | "uncertain";
4
+ export type LifeOpsSubscriptionCadence = "monthly" | "annual" | "unknown";
5
+ export type LifeOpsSubscriptionExecutor = "user_browser" | "agent_browser" | "desktop_native";
6
+ export type LifeOpsSubscriptionCancellationStatus = "draft" | "awaiting_confirmation" | "running" | "completed" | "already_canceled" | "needs_login" | "needs_mfa" | "needs_user_choice" | "retention_offer" | "phone_only" | "chat_only" | "unsupported_surface" | "blocked" | "failed";
7
+ export interface LifeOpsSubscriptionAudit {
8
+ id: string;
9
+ agentId: string;
10
+ source: LifeOpsSubscriptionSource;
11
+ queryWindowDays: number;
12
+ status: LifeOpsSubscriptionAuditStatus;
13
+ totalCandidates: number;
14
+ activeCandidates: number;
15
+ canceledCandidates: number;
16
+ uncertainCandidates: number;
17
+ summary: string;
18
+ metadata: Record<string, unknown>;
19
+ createdAt: string;
20
+ updatedAt: string;
21
+ }
22
+ export interface LifeOpsSubscriptionCandidate {
23
+ id: string;
24
+ agentId: string;
25
+ auditId: string;
26
+ serviceSlug: string;
27
+ serviceName: string;
28
+ provider: string;
29
+ cadence: LifeOpsSubscriptionCadence;
30
+ state: LifeOpsSubscriptionState;
31
+ confidence: number;
32
+ annualCostEstimateUsd: number | null;
33
+ managementUrl: string | null;
34
+ latestEvidenceAt: string | null;
35
+ evidenceJson: Array<Record<string, unknown>>;
36
+ metadata: Record<string, unknown>;
37
+ createdAt: string;
38
+ updatedAt: string;
39
+ }
40
+ export interface LifeOpsSubscriptionCancellation {
41
+ id: string;
42
+ agentId: string;
43
+ auditId: string | null;
44
+ candidateId: string | null;
45
+ serviceSlug: string;
46
+ serviceName: string;
47
+ executor: LifeOpsSubscriptionExecutor;
48
+ status: LifeOpsSubscriptionCancellationStatus;
49
+ confirmed: boolean;
50
+ currentStep: string | null;
51
+ browserSessionId: string | null;
52
+ evidenceSummary: string | null;
53
+ artifactCount: number;
54
+ managementUrl: string | null;
55
+ error: string | null;
56
+ metadata: Record<string, unknown>;
57
+ createdAt: string;
58
+ updatedAt: string;
59
+ finishedAt: string | null;
60
+ }
61
+ export interface LifeOpsSubscriptionAuditSummary {
62
+ audit: LifeOpsSubscriptionAudit;
63
+ candidates: LifeOpsSubscriptionCandidate[];
64
+ }
65
+ export interface LifeOpsSubscriptionCancellationSummary {
66
+ cancellation: LifeOpsSubscriptionCancellation;
67
+ candidate: LifeOpsSubscriptionCandidate | null;
68
+ }
69
+ export interface LifeOpsSubscriptionDiscoveryRequest {
70
+ queryWindowDays?: number;
71
+ serviceQuery?: string | null;
72
+ }
73
+ export interface LifeOpsSubscriptionCancellationRequest {
74
+ candidateId?: string | null;
75
+ serviceName?: string | null;
76
+ serviceSlug?: string | null;
77
+ executor?: LifeOpsSubscriptionExecutor | null;
78
+ confirmed?: boolean;
79
+ }
80
+ //# sourceMappingURL=subscriptions-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptions-types.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/subscriptions-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"twilio.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/twilio.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+GAA+G;IAC/G,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAUD,wBAAgB,4BAA4B,CAC1C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,iBAAiB,GAAG,IAAI,CAY1B;AAuID,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAWhC;AAYD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,WAAW,EAAE,iBAAiB,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAWhC"}
1
+ {"version":3,"file":"twilio.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/twilio.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+GAA+G;IAC/G,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAUD,wBAAgB,4BAA4B,CAC1C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,iBAAiB,GAAG,IAAI,CAY1B;AAwID,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAWhC;AAYD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,WAAW,EAAE,iBAAiB,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAWhC"}
@@ -19,7 +19,9 @@ export function readTwilioCredentialsFromEnv(env = process.env) {
19
19
  fromPhoneNumber,
20
20
  };
21
21
  }
22
- const TWILIO_BASE_URL = process.env.MILADY_MOCK_TWILIO_BASE ?? "https://api.twilio.com";
22
+ function getTwilioBaseUrl() {
23
+ return process.env.MILADY_MOCK_TWILIO_BASE ?? "https://api.twilio.com";
24
+ }
23
25
  /** Maximum number of retries for transient (5xx / network) failures. */
24
26
  const MAX_RETRIES = 2;
25
27
  /** Base delay in ms for exponential backoff between retries. */
@@ -35,7 +37,7 @@ function isTransientFailure(result) {
35
37
  }
36
38
  async function sendTwilioRequest(args) {
37
39
  const { credentials, path, payload } = args;
38
- const url = `${TWILIO_BASE_URL}/2010-04-01/Accounts/${encodeURIComponent(credentials.accountSid)}${path}`;
40
+ const url = `${getTwilioBaseUrl()}/2010-04-01/Accounts/${encodeURIComponent(credentials.accountSid)}${path}`;
39
41
  const operation = twilioOperation(path);
40
42
  let lastResult = null;
41
43
  for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
@@ -1 +1 @@
1
- {"version":3,"file":"whatsapp-client.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/whatsapp-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,aAAc,SAAQ,KAAK;aAGpB,MAAM,EAAE,MAAM;aACd,IAAI,CAAC,EAAE,OAAO;gBAF9B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,OAAO;CAKjC;AAMD,wBAAgB,8BAA8B,CAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,mBAAmB,GAAG,IAAI,CAY5B;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAqD1C;AA0CD;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,OAAO,GACf,eAAe,EAAE,CAMnB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,eAAe,EAAE,CAI9D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,eAAe,EAAE,CAE7D;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,EAAE,CA0EhF"}
1
+ {"version":3,"file":"whatsapp-client.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/whatsapp-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,aAAc,SAAQ,KAAK;aAGpB,MAAM,EAAE,MAAM;aACd,IAAI,CAAC,EAAE,OAAO;gBAF9B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,OAAO;CAKjC;AAOD,wBAAgB,8BAA8B,CAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,mBAAmB,GAAG,IAAI,CAY5B;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAqD1C;AA0CD;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,OAAO,GACf,eAAe,EAAE,CAMnB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,eAAe,EAAE,CAI9D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,eAAe,EAAE,CAE7D;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,EAAE,CA0EhF"}
@@ -10,7 +10,9 @@ export class WhatsAppError extends Error {
10
10
  }
11
11
  }
12
12
  const DEFAULT_API_VERSION = "v21.0";
13
- const WHATSAPP_BASE_URL = process.env.MILADY_MOCK_WHATSAPP_BASE ?? "https://graph.facebook.com";
13
+ function getWhatsAppBaseUrl() {
14
+ return process.env.MILADY_MOCK_WHATSAPP_BASE ?? "https://graph.facebook.com";
15
+ }
14
16
  export function readWhatsAppCredentialsFromEnv(env = process.env) {
15
17
  const accessToken = env.ELIZA_WHATSAPP_ACCESS_TOKEN?.trim();
16
18
  const phoneNumberId = env.ELIZA_WHATSAPP_PHONE_NUMBER_ID?.trim();
@@ -26,7 +28,7 @@ export function readWhatsAppCredentialsFromEnv(env = process.env) {
26
28
  }
27
29
  export async function sendWhatsAppMessage(creds, req) {
28
30
  const apiVersion = creds.apiVersion ?? DEFAULT_API_VERSION;
29
- const url = `${WHATSAPP_BASE_URL}/${apiVersion}/${encodeURIComponent(creds.phoneNumberId)}/messages`;
31
+ const url = `${getWhatsAppBaseUrl()}/${apiVersion}/${encodeURIComponent(creds.phoneNumberId)}/messages`;
30
32
  const payload = {
31
33
  messaging_product: "whatsapp",
32
34
  to: req.to,
@@ -1 +1 @@
1
- {"version":3,"file":"x-poster.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/x-poster.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;CACrE;AA+ED,wBAAgB,6BAA6B,CAC3C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,kBAAkB,GAAG,IAAI,CAgB3B;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,kBAAkB,CAAC;CACjC,GAAG,OAAO,CAAC,WAAW,CAAC,CA+FvB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;CACrE;AAID;;;;;;;;GAQG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,kBAAkB,CAAC;CACjC,GAAG,OAAO,CAAC,SAAS,CAAC,CAgErB"}
1
+ {"version":3,"file":"x-poster.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/x-poster.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;CACrE;AAmFD,wBAAgB,6BAA6B,CAC3C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,kBAAkB,GAAG,IAAI,CAgB3B;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,kBAAkB,CAAC;CACjC,GAAG,OAAO,CAAC,WAAW,CAAC,CA+FvB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;CACrE;AAMD;;;;;;;;GAQG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,kBAAkB,CAAC;CACjC,GAAG,OAAO,CAAC,SAAS,CAAC,CAgErB"}
@@ -1,8 +1,12 @@
1
1
  import crypto from "node:crypto";
2
2
  import { logger } from "@elizaos/core";
3
3
  import { createIntegrationTelemetrySpan } from "@elizaos/agent/diagnostics/integration-observability";
4
- const X_BASE_URL = process.env.MILADY_MOCK_X_BASE ?? "https://api.twitter.com";
5
- const X_POST_URL = `${X_BASE_URL}/2/tweets`;
4
+ function getXBaseUrl() {
5
+ return process.env.MILADY_MOCK_X_BASE ?? "https://api.twitter.com";
6
+ }
7
+ function getXPostUrl() {
8
+ return `${getXBaseUrl()}/2/tweets`;
9
+ }
6
10
  function percentEncode(value) {
7
11
  return encodeURIComponent(value).replace(/[!'()*]/g, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`);
8
12
  }
@@ -76,13 +80,13 @@ export async function postToX(args) {
76
80
  const timestamp = String(Math.floor(Date.now() / 1000));
77
81
  const authorization = buildOAuth1AuthorizationHeader({
78
82
  method: "POST",
79
- url: X_POST_URL,
83
+ url: getXPostUrl(),
80
84
  credentials,
81
85
  nonce,
82
86
  timestamp,
83
87
  });
84
88
  try {
85
- const response = await fetch(X_POST_URL, {
89
+ const response = await fetch(getXPostUrl(), {
86
90
  method: "POST",
87
91
  headers: {
88
92
  Authorization: authorization,
@@ -147,7 +151,9 @@ export async function postToX(args) {
147
151
  };
148
152
  }
149
153
  }
150
- const X_DM_URL_TEMPLATE = `${X_BASE_URL}/2/dm_conversations/with/{participantId}/messages`;
154
+ function getXDmUrl(participantId) {
155
+ return `${getXBaseUrl()}/2/dm_conversations/with/${encodeURIComponent(participantId)}/messages`;
156
+ }
151
157
  /**
152
158
  * Send a Direct Message on X (Twitter) via the v2 DM API.
153
159
  *
@@ -159,7 +165,7 @@ const X_DM_URL_TEMPLATE = `${X_BASE_URL}/2/dm_conversations/with/{participantId}
159
165
  */
160
166
  export async function sendXDm(args) {
161
167
  const { participantId, text, credentials } = args;
162
- const url = X_DM_URL_TEMPLATE.replace("{participantId}", encodeURIComponent(participantId));
168
+ const url = getXDmUrl(participantId);
163
169
  const nonce = crypto.randomBytes(16).toString("hex");
164
170
  const timestamp = String(Math.floor(Date.now() / 1000));
165
171
  const authorization = buildOAuth1AuthorizationHeader({
@@ -1 +1 @@
1
- {"version":3,"file":"x-reader.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/x-reader.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEhE,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;IAC/E,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAGxC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;QACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACnC;CAQJ;AAyOD;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,kBAAkB,EAC/B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CA6B5B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,kBAAkB,EAC/B,QAAQ,EAAE,SAAS,EACnB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAsDlC;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,WAAW,EAAE,kBAAkB,EAC/B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAElC"}
1
+ {"version":3,"file":"x-reader.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/x-reader.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEhE,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;IAC/E,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAGxC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;QACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACnC;CAQJ;AAyOD;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,kBAAkB,EAC/B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CA6B5B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,kBAAkB,EAC/B,QAAQ,EAAE,SAAS,EACnB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAsDlC;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,WAAW,EAAE,kBAAkB,EAC/B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAElC"}