@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
@@ -1 +1 @@
1
- {"version":3,"file":"website-blocker.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/actions/website-blocker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAKP,MAAM,eAAe,CAAC;AAgOvB,eAAO,MAAM,mBAAmB,EAAE,MAgMjC,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,MAuDzC,CAAC;AAEF,eAAO,MAAM,sCAAsC,EAAE,MA8DpD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MA6FnC,CAAC;AAEF,eAAO,MAAM,8BAA8B,QAAsB,CAAC;AAClE,eAAO,MAAM,0BAA0B,QAA8B,CAAC;AACtE,eAAO,MAAM,kCAAkC,QACP,CAAC;AACzC,eAAO,MAAM,gCAAgC,QAAwB,CAAC"}
1
+ {"version":3,"file":"website-blocker.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/actions/website-blocker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAKP,MAAM,eAAe,CAAC;AAoOvB,eAAO,MAAM,mBAAmB,EAAE,MAAM,GAAG;IACzC,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAmO1C,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,MAuDzC,CAAC;AAEF,eAAO,MAAM,sCAAsC,EAAE,MA8DpD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MA6FnC,CAAC;AAEF,eAAO,MAAM,8BAA8B;qCA7bR,OAAO;CA6buB,CAAC;AAClE,eAAO,MAAM,0BAA0B,QAA8B,CAAC;AACtE,eAAO,MAAM,kCAAkC,QACP,CAAC;AACzC,eAAO,MAAM,gCAAgC,QAAwB,CAAC"}
@@ -110,14 +110,18 @@ async function resolveWebsiteBlockPlanWithLlm(args) {
110
110
  "",
111
111
  "Rules:",
112
112
  "- Only start a block when the user is clearly asking to block websites now.",
113
+ "- Generic focus-block requests like 'turn on a focus block for all social media sites' belong here; do not invent a task gate for them.",
114
+ "- Use BLOCK_WEBSITES for fixed-duration or generic focus blocks. Do not treat them as task-gated blocks unless the user explicitly says until I finish, until I complete, or until I'm done with a task.",
113
115
  "- If the user says not yet, later, hold off, wait, or is only discussing candidate sites, set shouldAct=false and explain that you will wait for confirmation.",
114
116
  "- If the current request refers to previously mentioned websites, recover them from recent conversation context.",
115
117
  "- If the websites are unclear or missing, set shouldAct=false and ask the user to name the public hostnames explicitly.",
116
118
  "- Prefer bare public hostnames like x.com in the websites array.",
117
119
  "- Use durationMinutes=null only when the user explicitly wants the block to last until manual removal.",
120
+ "- If the user gives an exact timed duration like 45, 90, or 135 minutes, preserve that exact duration instead of falling back to the default 60-minute block.",
118
121
  "",
119
122
  "Examples:",
120
123
  ' {"shouldAct":true,"response":null,"websites":["x.com","twitter.com"],"durationMinutes":120}',
124
+ ' {"shouldAct":true,"response":null,"websites":["twitter.com"],"durationMinutes":90}',
121
125
  ' {"shouldAct":false,"response":"I noted those websites and will wait for your confirmation before blocking them.","websites":["x.com","twitter.com"]}',
122
126
  ' {"shouldAct":false,"response":"Tell me which public website hostnames to block, such as x.com or youtube.com.","websites":[]}',
123
127
  "",
@@ -168,11 +172,17 @@ export const blockWebsitesAction = {
168
172
  "START_FOCUS_BLOCK",
169
173
  "BLOCK_SITE",
170
174
  "BLOCK_DISTRACTING_SITES",
175
+ "FOCUS_BLOCK",
176
+ "BLOCK_SOCIAL_MEDIA",
177
+ "SOCIAL_MEDIA_BLOCK",
171
178
  ],
172
179
  description: "Admin-only. Start a local website block by editing the system hosts file. " +
180
+ "Use this for fixed-duration or generic focus blocks like 'block twitter and reddit for the next 2 hours', 'turn on a focus block for all social media sites', or 'block youtube'. " +
173
181
  "Use recent conversation context to block public websites like x.com for a fixed duration or until manually unblocked. " +
182
+ "Do not use this when the unblock condition is finishing a task, workout, or todo; that is BLOCK_UNTIL_TASK_COMPLETE. " +
174
183
  "If the user confirms a block in a follow-up message without repeating the hostnames, reuse that context through the action planner.",
175
184
  descriptionCompressed: "Admin: block websites via hosts file for set duration.",
185
+ suppressPostActionContinuation: true,
176
186
  validate: async (runtime, message) => {
177
187
  const access = await getSelfControlAccess(runtime, message);
178
188
  return access.allowed;
@@ -304,6 +314,34 @@ export const blockWebsitesAction = {
304
314
  },
305
315
  },
306
316
  ],
317
+ [
318
+ {
319
+ name: "{{name1}}",
320
+ content: { text: "Block twitter.com for exactly 90 minutes." },
321
+ },
322
+ {
323
+ name: "{{agentName}}",
324
+ content: {
325
+ text: "Started a website block for twitter.com until 2026-04-04T13:44:54.000Z.",
326
+ action: "BLOCK_WEBSITES",
327
+ },
328
+ },
329
+ ],
330
+ [
331
+ {
332
+ name: "{{name1}}",
333
+ content: {
334
+ text: "Turn on a focus block for all social media sites.",
335
+ },
336
+ },
337
+ {
338
+ name: "{{agentName}}",
339
+ content: {
340
+ text: "Started a website block for facebook.com, instagram.com, reddit.com, tiktok.com, x.com, and youtube.com until you unblock it.",
341
+ action: "BLOCK_WEBSITES",
342
+ },
343
+ },
344
+ ],
307
345
  [
308
346
  {
309
347
  name: "{{name1}}",
@@ -1 +1 @@
1
- {"version":3,"file":"x-read.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/actions/x-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAQP,MAAM,eAAe,CAAC;AA6MvB,eAAO,MAAM,WAAW,EAAE,MAuOzB,CAAC"}
1
+ {"version":3,"file":"x-read.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/actions/x-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAQP,MAAM,eAAe,CAAC;AA6MvB,eAAO,MAAM,WAAW,EAAE,MA+PzB,CAAC"}
@@ -159,9 +159,21 @@ function summarizeFeedItems(items, feedType) {
159
159
  }
160
160
  export const xReadAction = {
161
161
  name: "X_READ",
162
- similes: ["READ_X", "READ_TWITTER", "X_DMS", "X_FEED", "X_SEARCH"],
162
+ similes: [
163
+ "READ_X",
164
+ "READ_TWITTER",
165
+ "CHECK_TWITTER_DMS",
166
+ "TWITTER_TIMELINE",
167
+ "X_TIMELINE",
168
+ "TWITTER_MENTIONS",
169
+ "SEARCH_TWITTER",
170
+ "X_DMS",
171
+ "X_FEED",
172
+ "X_SEARCH",
173
+ ],
163
174
  description: "Read X/Twitter DMs, the home timeline or mentions feed, or run a recent search. " +
164
- "Use this for retrieving content from X (not posting).",
175
+ "Use this for requests like 'check my Twitter DMs', 'what's on my X timeline?', 'show me my mentions', or 'search Twitter for posts about elizaOS'. " +
176
+ "Use this for retrieving content from X, not posting. Do not reply that X/Twitter access is unavailable when this action is registered and visible.",
165
177
  validate: async (runtime, message) => {
166
178
  if (!(await hasLifeOpsAccess(runtime, message)))
167
179
  return false;
@@ -339,6 +351,18 @@ export const xReadAction = {
339
351
  },
340
352
  },
341
353
  ],
354
+ [
355
+ {
356
+ name: "{{name1}}",
357
+ content: { text: "What's on my X timeline?" },
358
+ },
359
+ {
360
+ name: "{{agentName}}",
361
+ content: {
362
+ text: "X home_timeline (5):\n- @carol: great post!",
363
+ },
364
+ },
365
+ ],
342
366
  [
343
367
  {
344
368
  name: "{{name1}}",
@@ -354,7 +378,7 @@ export const xReadAction = {
354
378
  [
355
379
  {
356
380
  name: "{{name1}}",
357
- content: { text: 'Search X for "elizaOS".' },
381
+ content: { text: "Search Twitter for posts about elizaOS." },
358
382
  },
359
383
  {
360
384
  name: "{{agentName}}",
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/dossier/action.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,MAAM,EAOP,MAAM,eAAe,CAAC;AAgBvB,eAAO,MAAM,qBAAqB,EAAE,MA2FnC,CAAC"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/dossier/action.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,MAAM,EAOP,MAAM,eAAe,CAAC;AAgBvB,eAAO,MAAM,qBAAqB,EAAE,MA4FnC,CAAC"}
@@ -10,12 +10,13 @@ import { DossierService, getRelationshipsServiceLike, } from "./service.js";
10
10
  export const generateDossierAction = {
11
11
  name: "GENERATE_DOSSIER",
12
12
  similes: [
13
- "MEETING_DOSSIER",
14
- "PREMEETING_BRIEFING",
15
- "BRIEF_ME_FOR_MEETING",
16
- "PREPARE_FOR_MEETING",
13
+ "MEETING_DOSSIER_BY_EVENT",
14
+ "EVENT_DOSSIER",
15
+ "GENERATE_DOSSIER_FROM_EVENT",
17
16
  ],
18
- description: "Generate a structured pre-meeting dossier (attendee context, recent email threads, prior dossiers, meeting-link health) for an upcoming calendar event.",
17
+ description: "Low-level event-specific dossier generation for an already identified calendar event. " +
18
+ "Use this only when the event id or fuzzy event title is already known from a prior workflow. " +
19
+ "Prefer DOSSIER for generic user requests like 'brief me', 'background on the person I'm meeting', or 'prep me for my next meeting'.",
19
20
  validate: async (runtime, message) => hasOwnerAccess(runtime, message),
20
21
  handler: async (runtime, _message, _state, options) => {
21
22
  const params = (options?.parameters ??
@@ -73,12 +74,12 @@ export const generateDossierAction = {
73
74
  [
74
75
  {
75
76
  name: "{{name1}}",
76
- content: { text: "Brief me for my 3pm meeting" },
77
+ content: { text: "Generate a dossier for event 'Board sync tomorrow'" },
77
78
  },
78
79
  {
79
80
  name: "{{agentName}}",
80
81
  content: {
81
- text: "# Meeting Dossier — 3pm with Alex\n...",
82
+ text: "# Meeting Dossier — Board sync tomorrow\n...",
82
83
  action: "GENERATE_DOSSIER",
83
84
  },
84
85
  },
@@ -1 +1 @@
1
- {"version":3,"file":"listOverdueFollowups.d.ts","sourceRoot":"","sources":["../../../../../../../../apps/app-lifeops/src/followup/actions/listOverdueFollowups.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAGP,MAAM,eAAe,CAAC;AAOvB,eAAO,MAAM,0BAA0B,EAAE,MAoDxC,CAAC"}
1
+ {"version":3,"file":"listOverdueFollowups.d.ts","sourceRoot":"","sources":["../../../../../../../../apps/app-lifeops/src/followup/actions/listOverdueFollowups.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAGP,MAAM,eAAe,CAAC;AAOvB,eAAO,MAAM,0BAA0B,EAAE,MAqDxC,CAAC"}
@@ -10,6 +10,7 @@ export const listOverdueFollowupsAction = {
10
10
  "FOLLOWUP_LIST",
11
11
  ],
12
12
  description: "List contacts whose last-contacted-at timestamp exceeds their follow-up threshold. " +
13
+ "Use this for overdue or pending follow-up list queries, not for scheduling a new reminder. " +
13
14
  "Returns an empty list when the RelationshipsService is not available.",
14
15
  validate: async (runtime, message) => hasOwnerAccess(runtime, message),
15
16
  handler: async (runtime) => {
@@ -1 +1 @@
1
- {"version":3,"file":"markFollowupDone.d.ts","sourceRoot":"","sources":["../../../../../../../../apps/app-lifeops/src/followup/actions/markFollowupDone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAKP,MAAM,eAAe,CAAC;AAkDvB,eAAO,MAAM,sBAAsB,EAAE,MAiKpC,CAAC"}
1
+ {"version":3,"file":"markFollowupDone.d.ts","sourceRoot":"","sources":["../../../../../../../../apps/app-lifeops/src/followup/actions/markFollowupDone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAKP,MAAM,eAAe,CAAC;AAkDvB,eAAO,MAAM,sBAAsB,EAAE,MAkKpC,CAAC"}
@@ -32,7 +32,8 @@ export const markFollowupDoneAction = {
32
32
  "MARK_CONTACTED",
33
33
  "RECORD_INTERACTION",
34
34
  ],
35
- description: "Mark a contact as followed-up-with (updates lastContactedAt to now). " +
35
+ description: "Mark a contact as already followed-up-with (updates lastContactedAt to now). " +
36
+ "Use this only when the interaction already happened, not for future reminders. " +
36
37
  "Requires either an explicit contactId (UUID) or an unambiguous contactName. " +
37
38
  "Ambiguous names return a clarifying response without modifying any contact.",
38
39
  validate: async (runtime, message) => hasOwnerAccess(runtime, message),
@@ -1 +1 @@
1
- {"version":3,"file":"setFollowupThreshold.d.ts","sourceRoot":"","sources":["../../../../../../../../apps/app-lifeops/src/followup/actions/setFollowupThreshold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAKP,MAAM,eAAe,CAAC;AA0BvB,eAAO,MAAM,0BAA0B,EAAE,MAgLxC,CAAC"}
1
+ {"version":3,"file":"setFollowupThreshold.d.ts","sourceRoot":"","sources":["../../../../../../../../apps/app-lifeops/src/followup/actions/setFollowupThreshold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAKP,MAAM,eAAe,CAAC;AA0BvB,eAAO,MAAM,0BAA0B,EAAE,MAiLxC,CAAC"}
@@ -16,7 +16,8 @@ export const setFollowupThresholdAction = {
16
16
  "CHANGE_FOLLOWUP_INTERVAL",
17
17
  "SET_CONTACT_FREQUENCY_DAYS",
18
18
  ],
19
- description: "Set the follow-up threshold (in days) for a specific contact. " +
19
+ description: "Set a recurring follow-up cadence threshold (in days) for a specific contact. " +
20
+ "Use this for durable rules like 'every 14 days', not one-off reminders like 'next week'. " +
20
21
  "Requires a positive integer threshold and either contactId or an unambiguous contactName.",
21
22
  validate: async (runtime, message) => hasOwnerAccess(runtime, message),
22
23
  handler: async (runtime, _message, _state, options) => {
@@ -1 +1 @@
1
- {"version":3,"file":"calendly-client.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/calendly-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;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;AA8HD,wBAAsB,eAAe,CACnC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAY9E;AAQD,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAY9B;AAED,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,mBAAmB,EAC1B,IAAI,GAAE;IACJ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,OAAO,CAAC,sBAAsB,EAAE,CAAC,CA8BnC;AAeD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,mBAAmB,EAC1B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA0BjC;AAqBD,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,mBAAmB,EAC1B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBpD"}
1
+ {"version":3,"file":"calendly-client.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/calendly-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;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;AAQD,wBAAgB,8BAA8B,CAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,mBAAmB,GAAG,IAAI,CAY5B;AA8HD,wBAAsB,eAAe,CACnC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAY9E;AAQD,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAY9B;AAED,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,mBAAmB,EAC1B,IAAI,GAAE;IACJ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,OAAO,CAAC,sBAAsB,EAAE,CAAC,CA8BnC;AAeD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,mBAAmB,EAC1B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA0BjC;AAqBD,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,mBAAmB,EAC1B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBpD"}
@@ -9,8 +9,10 @@ export class CalendlyError extends Error {
9
9
  this.name = "CalendlyError";
10
10
  }
11
11
  }
12
- const CALENDLY_BASE_URL = process.env.MILADY_MOCK_CALENDLY_BASE ?? "https://api.calendly.com";
13
12
  const REQUEST_TIMEOUT_MS = 12_000;
13
+ function getCalendlyBaseUrl() {
14
+ return process.env.MILADY_MOCK_CALENDLY_BASE ?? "https://api.calendly.com";
15
+ }
14
16
  export function readCalendlyCredentialsFromEnv(env = process.env) {
15
17
  const personalAccessToken = env.ELIZA_CALENDLY_TOKEN?.trim();
16
18
  if (!personalAccessToken) {
@@ -25,7 +27,7 @@ export function readCalendlyCredentialsFromEnv(env = process.env) {
25
27
  };
26
28
  }
27
29
  async function calendlyRequest(creds, path, init = {}) {
28
- const url = path.startsWith("http") ? path : `${CALENDLY_BASE_URL}${path}`;
30
+ const url = path.startsWith("http") ? path : `${getCalendlyBaseUrl()}${path}`;
29
31
  const response = await fetch(url, {
30
32
  ...init,
31
33
  headers: {
@@ -1 +1 @@
1
- {"version":3,"file":"discord-browser-scraper.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/discord-browser-scraper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discord-browser-scraper.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/discord-browser-scraper.ts"],"names":[],"mappings":"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"}
@@ -66,10 +66,10 @@ function discordAnchorTextParts(anchor) {
66
66
  function discordAnchorLabel(anchor) {
67
67
  const ariaLabel = normalizeDiscordText(anchor.getAttribute("aria-label"));
68
68
  if (ariaLabel) {
69
- return ariaLabel
69
+ return (ariaLabel
70
70
  .split(",")
71
71
  .map((part) => normalizeDiscordText(part))
72
- .find((part) => part !== null && !/\bunread\b/i.test(part)) ?? ariaLabel;
72
+ .find((part) => part !== null && !/\bunread\b/i.test(part)) ?? ariaLabel);
73
73
  }
74
74
  const parts = discordAnchorTextParts(anchor);
75
75
  return (parts.find((part) => !/\bunread\b/i.test(part) &&
@@ -159,7 +159,7 @@ export function probeDiscordCapturedPage(page) {
159
159
  if (!isDiscordUrl(candidate.href))
160
160
  continue;
161
161
  const href = normalizeDiscordText(candidate.href);
162
- if (!href || !href.includes("/channels/@me/"))
162
+ if (!href?.includes("/channels/@me/"))
163
163
  continue;
164
164
  const channelId = selectedDiscordDmChannelId(href);
165
165
  const dedupeKey = channelId ?? href;
@@ -220,7 +220,8 @@ export function probeDiscordDocumentState(document, url) {
220
220
  const tagEl = panel?.querySelector('[class*="nameTag"] [class*="discrim"]') ||
221
221
  document.querySelector('[class*="nameTag"] [class*="discrim"]');
222
222
  const username = normalizeDiscordText(nameEl?.textContent ?? null);
223
- const discriminator = normalizeDiscordText(tagEl?.textContent ?? null)?.replace(/^#/, "") ?? null;
223
+ const discriminator = normalizeDiscordText(tagEl?.textContent ?? null)?.replace(/^#/, "") ??
224
+ null;
224
225
  const snippet = normalizeDiscordText(panel?.textContent ?? null)?.slice(0, 160) ?? null;
225
226
  const selectedChannelId = selectedDiscordDmChannelId(safeUrl ?? null);
226
227
  const previews = extractDiscordDmPreviews(document, selectedChannelId);
@@ -286,7 +287,7 @@ async function findTabByIdOrPartition(tabId, partition, env) {
286
287
  export async function ensureDiscordTab(args) {
287
288
  const env = args.env ?? process.env;
288
289
  if (!discordBrowserWorkspaceAvailable(env)) {
289
- throw new Error("Discord connector requires the Milady desktop app's browser workspace.");
290
+ throw new Error("Discord connector requires the Milady Desktop Browser workspace.");
290
291
  }
291
292
  const partition = discordPartitionFor(args.agentId, args.side);
292
293
  const existing = await findTabByIdOrPartition(args.existingTabId ?? null, partition, env);
@@ -10,7 +10,7 @@
10
10
  * - Nothing is logged that could contain secret material.
11
11
  * - All subprocess invocations use `execFile` with an args array.
12
12
  */
13
- export type PasswordManagerBackend = "1password" | "protonpass" | "none";
13
+ export type PasswordManagerBackend = "1password" | "protonpass" | "fixture" | "none";
14
14
  export interface PasswordManagerItem {
15
15
  id: string;
16
16
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"password-manager-bridge.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/password-manager-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,YAAY,GAAG,MAAM,CAAC;AAEzE,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBAGvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,sBAAsB,EAC/B,KAAK,CAAC,EAAE,OAAO;CAOlB;AAwDD,wBAAsB,4BAA4B,CAChD,MAAM,CAAC,EAAE,2BAA2B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAiCjC;AAED,4DAA4D;AAC5D,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD;AA8SD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAOhC;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACxB,MAAM,CAAC,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAWhC;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,GAAG,UAAU,EAC9B,MAAM,CAAC,EAAE,2BAA2B,GACnC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CA+CjD"}
1
+ {"version":3,"file":"password-manager-bridge.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/password-manager-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,MAAM,MAAM,sBAAsB,GAC9B,WAAW,GACX,YAAY,GACZ,SAAS,GACT,MAAM,CAAC;AAEX,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBAGvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,sBAAsB,EAC/B,KAAK,CAAC,EAAE,OAAO;CAOlB;AA4HD,wBAAsB,4BAA4B,CAChD,MAAM,CAAC,EAAE,2BAA2B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAyCjC;AAED,4DAA4D;AAC5D,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD;AA8SD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAShC;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACxB,MAAM,CAAC,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAahC;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,GAAG,UAAU,EAC9B,MAAM,CAAC,EAAE,2BAA2B,GACnC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAmDjD"}
@@ -24,6 +24,69 @@ export class PasswordManagerError extends Error {
24
24
  }
25
25
  }
26
26
  const CLIPBOARD_TTL_SECONDS = 30;
27
+ const PASSWORD_MANAGER_FIXTURE_ITEMS = [
28
+ {
29
+ id: "pm-github",
30
+ title: "GitHub",
31
+ url: "https://github.com/login",
32
+ username: "benchmark-user",
33
+ hasPassword: true,
34
+ tags: ["dev", "github", "code"],
35
+ metadata: { vault: "Mocked Benchmark" },
36
+ },
37
+ {
38
+ id: "pm-google-workspace",
39
+ title: "Google Workspace",
40
+ url: "https://mail.google.com",
41
+ username: "owner@example.com",
42
+ hasPassword: true,
43
+ tags: ["google", "email"],
44
+ metadata: { vault: "Mocked Benchmark" },
45
+ },
46
+ {
47
+ id: "pm-aws-prod",
48
+ title: "AWS Console",
49
+ url: "https://signin.aws.amazon.com",
50
+ username: "infra@example.com",
51
+ hasPassword: true,
52
+ tags: ["aws", "cloud"],
53
+ metadata: { vault: "Mocked Benchmark" },
54
+ },
55
+ ];
56
+ function isTruthyEnv(value) {
57
+ if (!value)
58
+ return false;
59
+ const normalized = value.trim().toLowerCase();
60
+ return (normalized === "1" ||
61
+ normalized === "true" ||
62
+ normalized === "yes" ||
63
+ normalized === "on" ||
64
+ normalized === "fixture");
65
+ }
66
+ function isFalsyEnv(value) {
67
+ if (!value)
68
+ return false;
69
+ const normalized = value.trim().toLowerCase();
70
+ return (normalized === "0" ||
71
+ normalized === "false" ||
72
+ normalized === "no" ||
73
+ normalized === "off");
74
+ }
75
+ function isFixturePasswordManagerEnabled() {
76
+ const explicit = process.env.MILADY_TEST_PASSWORD_MANAGER_BACKEND;
77
+ if (isFalsyEnv(explicit))
78
+ return false;
79
+ if (isTruthyEnv(explicit))
80
+ return true;
81
+ return process.env.MILADY_BENCHMARK_USE_MOCKS === "1";
82
+ }
83
+ function listItemsViaFixture() {
84
+ return PASSWORD_MANAGER_FIXTURE_ITEMS.map((item) => ({
85
+ ...item,
86
+ tags: item.tags ? [...item.tags] : undefined,
87
+ metadata: item.metadata ? { ...item.metadata } : undefined,
88
+ }));
89
+ }
27
90
  // ---------------------------------------------------------------------------
28
91
  // Detection
29
92
  // ---------------------------------------------------------------------------
@@ -75,6 +138,14 @@ export async function detectPasswordManagerBackend(config) {
75
138
  detectionCache.set(key, "none");
76
139
  return "none";
77
140
  }
141
+ if (preferred === "fixture") {
142
+ detectionCache.set(key, "fixture");
143
+ return "fixture";
144
+ }
145
+ if (isFixturePasswordManagerEnabled()) {
146
+ detectionCache.set(key, "fixture");
147
+ return "fixture";
148
+ }
78
149
  if (preferred === "1password") {
79
150
  const ok = await probeOp(config);
80
151
  const result = ok ? "1password" : "none";
@@ -318,16 +389,20 @@ async function resolveActiveBackend(config) {
318
389
  }
319
390
  export async function searchPasswordItems(query, config) {
320
391
  const backend = await resolveActiveBackend(config);
321
- const items = backend === "1password"
322
- ? await listItemsVia1Password(config)
323
- : await listItemsViaProtonPass(config);
392
+ const items = backend === "fixture"
393
+ ? listItemsViaFixture()
394
+ : backend === "1password"
395
+ ? await listItemsVia1Password(config)
396
+ : await listItemsViaProtonPass(config);
324
397
  return items.filter((item) => matchesQuery(item, query));
325
398
  }
326
399
  export async function listPasswordItems(opts, config) {
327
400
  const backend = await resolveActiveBackend(config);
328
- const items = backend === "1password"
329
- ? await listItemsVia1Password(config)
330
- : await listItemsViaProtonPass(config);
401
+ const items = backend === "fixture"
402
+ ? listItemsViaFixture()
403
+ : backend === "1password"
404
+ ? await listItemsVia1Password(config)
405
+ : await listItemsViaProtonPass(config);
331
406
  const limit = opts.limit;
332
407
  if (typeof limit === "number" && limit >= 0) {
333
408
  return items.slice(0, limit);
@@ -339,6 +414,9 @@ export async function injectCredentialToClipboard(itemId, field, config) {
339
414
  throw new PasswordManagerError("itemId is required", config?.preferredBackend ?? "none");
340
415
  }
341
416
  const backend = await resolveActiveBackend(config);
417
+ if (backend === "fixture") {
418
+ return { ok: true, expiresInSeconds: CLIPBOARD_TTL_SECONDS };
419
+ }
342
420
  if (backend === "1password") {
343
421
  const binary = resolveOpBinary(config);
344
422
  const args = [
@@ -1 +1 @@
1
- {"version":3,"file":"remote-desktop.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/remote-desktop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,MAAM,MAAM,oBAAoB,GAC5B,eAAe,GACf,eAAe,GACf,WAAW,GACX,MAAM,CAAC;AAEX,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,oBAAoB,CAAC;IAC9B,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;CAK3D;AA2GD,wBAAsB,0BAA0B,CAC9C,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAsB/B;AAwLD,wBAAsB,kBAAkB,CACtC,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CA2G/B;AAED,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAGtC;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BhE;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAM1E"}
1
+ {"version":3,"file":"remote-desktop.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/remote-desktop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,MAAM,MAAM,oBAAoB,GAC5B,eAAe,GACf,eAAe,GACf,WAAW,GACX,MAAM,CAAC;AAEX,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,oBAAoB,CAAC;IAC9B,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;CAK3D;AA0HD,wBAAsB,0BAA0B,CAC9C,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAyB/B;AAwLD,wBAAsB,kBAAkB,CACtC,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CA2H/B;AAED,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAGtC;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BhE;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAM1E"}
@@ -22,6 +22,18 @@ export class RemoteDesktopError extends Error {
22
22
  const sessions = new Map();
23
23
  const DEFAULT_VNC_PORT = 5900;
24
24
  const DEFAULT_SESSION_MINUTES = 60;
25
+ function isMockRemoteDesktopEnabled() {
26
+ const explicit = process.env.MILADY_TEST_REMOTE_DESKTOP_BACKEND?.trim();
27
+ if (explicit) {
28
+ const normalized = explicit.toLowerCase();
29
+ return (normalized === "1" ||
30
+ normalized === "true" ||
31
+ normalized === "yes" ||
32
+ normalized === "on" ||
33
+ normalized === "fixture");
34
+ }
35
+ return process.env.MILADY_BENCHMARK_USE_MOCKS === "1";
36
+ }
25
37
  // ---------------------------------------------------------------------------
26
38
  // Env / config resolution
27
39
  // ---------------------------------------------------------------------------
@@ -80,6 +92,9 @@ async function probeNgrok(token) {
80
92
  }
81
93
  }
82
94
  export async function detectRemoteDesktopBackend(config) {
95
+ if (isMockRemoteDesktopEnabled()) {
96
+ return "tailscale-vnc";
97
+ }
83
98
  const resolved = resolveConfig(config);
84
99
  if (resolved.preferredBackend === "none")
85
100
  return "none";
@@ -218,6 +233,7 @@ async function startNgrokVncSession(args) {
218
233
  // ---------------------------------------------------------------------------
219
234
  export async function startRemoteSession(config) {
220
235
  const resolved = resolveConfig(config);
236
+ const mockEnabled = isMockRemoteDesktopEnabled();
221
237
  const backend = await detectRemoteDesktopBackend(config);
222
238
  const now = new Date();
223
239
  const durationMs = resolved.sessionDurationMinutes * 60_000;
@@ -243,6 +259,20 @@ export async function startRemoteSession(config) {
243
259
  return failed;
244
260
  }
245
261
  try {
262
+ if (mockEnabled) {
263
+ const activeSession = {
264
+ ...initialSession,
265
+ backend,
266
+ status: "active",
267
+ accessUrl: `vnc://127.0.0.1:${resolved.vncPort}/mock/${id}`,
268
+ };
269
+ const expiryTimer = scheduleExpiry(id, durationMs);
270
+ sessions.set(id, {
271
+ session: activeSession,
272
+ expiryTimer,
273
+ });
274
+ return activeSession;
275
+ }
246
276
  let accessUrl;
247
277
  let ngrokProcess;
248
278
  if (backend === "tailscale-vnc") {
@@ -1,5 +1,6 @@
1
1
  import type { IAgentRuntime } from "@elizaos/core";
2
2
  import type { LifeOpsActivitySignal, LifeOpsAuditEvent, LifeOpsBrowserCompanionStatus, LifeOpsBrowserPageContext, LifeOpsBrowserSession, LifeOpsBrowserSettings, LifeOpsBrowserTabSummary, LifeOpsCalendarEvent, LifeOpsChannelPolicy, LifeOpsConnectorGrant, LifeOpsConnectorSide, LifeOpsDossier, LifeOpsFollowUp, LifeOpsRelationship, LifeOpsRelationshipInteraction, LifeOpsScreenTimeDaily, LifeOpsScreenTimeSession, LifeOpsGmailMessageSummary, LifeOpsGoalDefinition, LifeOpsGoalLink, LifeOpsOccurrence, LifeOpsOccurrenceView, LifeOpsReminderAttempt, LifeOpsReminderPlan, LifeOpsTaskDefinition, LifeOpsWorkflowDefinition, LifeOpsWorkflowRun, LifeOpsXDm, LifeOpsXFeedItem, LifeOpsXFeedType, LifeOpsXSyncState, LifeOpsSchedulingNegotiation, LifeOpsSchedulingProposal } from "@elizaos/shared/contracts/lifeops";
3
+ import type { LifeOpsSubscriptionAudit, LifeOpsSubscriptionCandidate, LifeOpsSubscriptionCancellation } from "./subscriptions-types.js";
3
4
  type BrowserCompanionCredential = {
4
5
  companion: LifeOpsBrowserCompanionStatus;
5
6
  pairingTokenHash: string | null;
@@ -95,6 +96,17 @@ export declare class LifeOpsRepository {
95
96
  listReminderPlansForOwners(agentId: string, ownerType: string, ownerIds: string[]): Promise<LifeOpsReminderPlan[]>;
96
97
  createAuditEvent(event: LifeOpsAuditEvent): Promise<void>;
97
98
  listAuditEvents(agentId: string, ownerType: string, ownerId: string): Promise<LifeOpsAuditEvent[]>;
99
+ createSubscriptionAudit(audit: LifeOpsSubscriptionAudit): Promise<void>;
100
+ updateSubscriptionAudit(audit: LifeOpsSubscriptionAudit): Promise<void>;
101
+ getSubscriptionAudit(agentId: string, auditId: string): Promise<LifeOpsSubscriptionAudit | null>;
102
+ getLatestSubscriptionAudit(agentId: string): Promise<LifeOpsSubscriptionAudit | null>;
103
+ createSubscriptionCandidate(candidate: LifeOpsSubscriptionCandidate): Promise<void>;
104
+ listSubscriptionCandidatesForAudit(agentId: string, auditId: string): Promise<LifeOpsSubscriptionCandidate[]>;
105
+ getSubscriptionCandidate(agentId: string, candidateId: string): Promise<LifeOpsSubscriptionCandidate | null>;
106
+ createSubscriptionCancellation(cancellation: LifeOpsSubscriptionCancellation): Promise<void>;
107
+ updateSubscriptionCancellation(cancellation: LifeOpsSubscriptionCancellation): Promise<void>;
108
+ getSubscriptionCancellation(agentId: string, cancellationId: string): Promise<LifeOpsSubscriptionCancellation | null>;
109
+ getLatestSubscriptionCancellation(agentId: string, serviceSlug?: string): Promise<LifeOpsSubscriptionCancellation | null>;
98
110
  createActivitySignal(signal: LifeOpsActivitySignal): Promise<void>;
99
111
  listActivitySignals(agentId: string, args?: {
100
112
  sinceAt?: string | null;
@@ -258,6 +270,9 @@ export declare function createLifeOpsReminderPlan(params: Omit<LifeOpsReminderPl
258
270
  export declare function createLifeOpsChannelPolicy(params: Omit<LifeOpsChannelPolicy, "id" | "createdAt" | "updatedAt">): LifeOpsChannelPolicy;
259
271
  export declare function createLifeOpsWebsiteAccessGrant(params: Omit<LifeOpsWebsiteAccessGrant, "id" | "createdAt" | "updatedAt">): LifeOpsWebsiteAccessGrant;
260
272
  export declare function createLifeOpsAuditEvent(params: Omit<LifeOpsAuditEvent, "id" | "createdAt">): LifeOpsAuditEvent;
273
+ export declare function createLifeOpsSubscriptionAudit(params: Omit<LifeOpsSubscriptionAudit, "id" | "createdAt" | "updatedAt">): LifeOpsSubscriptionAudit;
274
+ export declare function createLifeOpsSubscriptionCandidate(params: Omit<LifeOpsSubscriptionCandidate, "id" | "createdAt" | "updatedAt">): LifeOpsSubscriptionCandidate;
275
+ export declare function createLifeOpsSubscriptionCancellation(params: Omit<LifeOpsSubscriptionCancellation, "id" | "createdAt" | "updatedAt">): LifeOpsSubscriptionCancellation;
261
276
  export declare function createLifeOpsActivitySignal(params: Omit<LifeOpsActivitySignal, "id" | "createdAt">): LifeOpsActivitySignal;
262
277
  export declare function createLifeOpsConnectorGrant(params: Omit<LifeOpsConnectorGrant, "id" | "createdAt" | "updatedAt" | "side" | "executionTarget" | "sourceOfTruth" | "preferredByAgent" | "cloudConnectionId"> & Partial<Pick<LifeOpsConnectorGrant, "side" | "executionTarget" | "sourceOfTruth" | "preferredByAgent" | "cloudConnectionId">>): LifeOpsConnectorGrant;
263
278
  export declare function createLifeOpsCalendarSyncState(params: Omit<LifeOpsCalendarSyncState, "id" | "updatedAt">): LifeOpsCalendarSyncState;