@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
@@ -16,6 +16,157 @@ function getParams(options) {
16
16
  function messageText(message) {
17
17
  return (message?.content?.text ?? "").toString();
18
18
  }
19
+ function normalizedNonEmpty(value) {
20
+ if (typeof value !== "string") {
21
+ return null;
22
+ }
23
+ const trimmed = value.trim();
24
+ return trimmed.length > 0 ? trimmed : null;
25
+ }
26
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
27
+ function escapeRegExp(value) {
28
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
29
+ }
30
+ function normalizeLookup(value) {
31
+ return value.toLowerCase().replace(/\s+/g, " ").trim();
32
+ }
33
+ async function resolveRelationshipIdByName(service, rawName) {
34
+ const needle = normalizeLookup(rawName);
35
+ if (!needle) {
36
+ return null;
37
+ }
38
+ const relationships = await service.listRelationships({ limit: 200 });
39
+ const exactMatch = relationships.find((relationship) => normalizeLookup(relationship.name) === needle) ??
40
+ relationships.find((relationship) => normalizeLookup(relationship.primaryHandle).includes(needle) ||
41
+ normalizeLookup(relationship.email ?? "").includes(needle));
42
+ if (exactMatch) {
43
+ return exactMatch.id;
44
+ }
45
+ return (relationships.find((relationship) => normalizeLookup(relationship.name).includes(needle))?.id ?? null);
46
+ }
47
+ async function resolveRelationshipIdFromText(service, rawText) {
48
+ const haystack = normalizeLookup(rawText);
49
+ if (!haystack) {
50
+ return null;
51
+ }
52
+ const relationships = await service.listRelationships({ limit: 200 });
53
+ const fullNameMatch = relationships.find((relationship) => haystack.includes(normalizeLookup(relationship.name)));
54
+ if (fullNameMatch) {
55
+ return fullNameMatch.id;
56
+ }
57
+ const candidateMatches = new Map();
58
+ for (const relationship of relationships) {
59
+ const nameTokens = normalizeLookup(relationship.name)
60
+ .split(" ")
61
+ .filter((token) => token.length >= 3);
62
+ const handleTokens = [
63
+ normalizeLookup(relationship.primaryHandle).replace(/^@/, ""),
64
+ normalizeLookup(relationship.email ?? "").split("@")[0] ?? "",
65
+ ].filter((token) => token.length >= 3);
66
+ for (const token of [...nameTokens, ...handleTokens]) {
67
+ const tokenPattern = new RegExp(`\\b${escapeRegExp(token)}\\b`, "i");
68
+ if (tokenPattern.test(rawText)) {
69
+ candidateMatches.set(relationship.id, relationship.id);
70
+ break;
71
+ }
72
+ }
73
+ }
74
+ if (candidateMatches.size === 1) {
75
+ return [...candidateMatches.values()][0] ?? null;
76
+ }
77
+ return null;
78
+ }
79
+ async function resolveRelationshipId(service, params, body) {
80
+ const explicitRelationshipId = normalizedNonEmpty(params.relationshipId);
81
+ if (explicitRelationshipId) {
82
+ if (UUID_PATTERN.test(explicitRelationshipId)) {
83
+ return explicitRelationshipId;
84
+ }
85
+ const resolvedFromRelationshipId = await resolveRelationshipIdByName(service, explicitRelationshipId);
86
+ if (resolvedFromRelationshipId) {
87
+ return resolvedFromRelationshipId;
88
+ }
89
+ }
90
+ const name = normalizedNonEmpty(params.name);
91
+ if (!name) {
92
+ for (const candidate of [params.intent, body]) {
93
+ const normalizedCandidate = normalizedNonEmpty(candidate);
94
+ const resolvedFromText = normalizedCandidate
95
+ ? await resolveRelationshipIdFromText(service, normalizedCandidate)
96
+ : null;
97
+ if (resolvedFromText) {
98
+ return resolvedFromText;
99
+ }
100
+ }
101
+ return null;
102
+ }
103
+ const resolvedFromName = await resolveRelationshipIdByName(service, name);
104
+ if (resolvedFromName) {
105
+ return resolvedFromName;
106
+ }
107
+ return resolveRelationshipIdFromText(service, name);
108
+ }
109
+ function normalizeFollowUpDueAt(rawDueAt) {
110
+ const trimmed = rawDueAt.trim();
111
+ if (!trimmed) {
112
+ return null;
113
+ }
114
+ const directMs = Date.parse(trimmed);
115
+ if (Number.isFinite(directMs)) {
116
+ return new Date(directMs).toISOString();
117
+ }
118
+ const normalized = normalizeLookup(trimmed);
119
+ const base = new Date();
120
+ const atDefaultFollowUpTime = (date) => {
121
+ const copy = new Date(date);
122
+ copy.setHours(9, 0, 0, 0);
123
+ return copy.toISOString();
124
+ };
125
+ if (/\btoday\b/.test(normalized)) {
126
+ return atDefaultFollowUpTime(base);
127
+ }
128
+ if (/\btomorrow\b/.test(normalized)) {
129
+ const tomorrow = new Date(base);
130
+ tomorrow.setDate(tomorrow.getDate() + 1);
131
+ return atDefaultFollowUpTime(tomorrow);
132
+ }
133
+ if (/\bnext week\b/.test(normalized) ||
134
+ /\bin a week\b/.test(normalized) ||
135
+ /\ba week from now\b/.test(normalized)) {
136
+ const nextWeek = new Date(base);
137
+ nextWeek.setDate(nextWeek.getDate() + 7);
138
+ return atDefaultFollowUpTime(nextWeek);
139
+ }
140
+ const weekdayMap = {
141
+ sunday: 0,
142
+ monday: 1,
143
+ tuesday: 2,
144
+ wednesday: 3,
145
+ thursday: 4,
146
+ friday: 5,
147
+ saturday: 6,
148
+ };
149
+ const weekdayMatch = normalized.match(/\b(?:(next)\s+)?(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\b/);
150
+ if (weekdayMatch) {
151
+ const qualifier = weekdayMatch[1] ?? "";
152
+ const weekdayToken = weekdayMatch[2] ?? "";
153
+ const targetWeekday = weekdayMap[weekdayToken];
154
+ if (targetWeekday !== undefined) {
155
+ const currentWeekday = base.getDay();
156
+ let delta = (targetWeekday - currentWeekday + 7) % 7;
157
+ if (qualifier === "next") {
158
+ delta = delta === 0 ? 7 : delta + 7;
159
+ }
160
+ else if (delta === 0) {
161
+ delta = 7;
162
+ }
163
+ const resolved = new Date(base);
164
+ resolved.setDate(resolved.getDate() + delta);
165
+ return atDefaultFollowUpTime(resolved);
166
+ }
167
+ }
168
+ return null;
169
+ }
19
170
  const RELATIONSHIP_SUBACTIONS = [
20
171
  "list_contacts",
21
172
  "add_contact",
@@ -95,9 +246,10 @@ async function resolveRelationshipPlanWithLlm(args) {
95
246
  if (!parsed) {
96
247
  return { subaction: null, shouldAct: null };
97
248
  }
249
+ const subaction = normalizeRelationshipSubaction(parsed.subaction);
98
250
  return {
99
- subaction: normalizeRelationshipSubaction(parsed.subaction),
100
- shouldAct: normalizeShouldAct(parsed.shouldAct),
251
+ subaction,
252
+ shouldAct: subaction ? true : normalizeShouldAct(parsed.shouldAct),
101
253
  response: normalizePlannerResponse(parsed.response),
102
254
  };
103
255
  }
@@ -125,6 +277,7 @@ export const relationshipAction = {
125
277
  "ADD_CONTACT",
126
278
  ],
127
279
  description: "Manage contacts, relationships, and follow-ups. Subactions: list_contacts, add_contact, log_interaction, add_follow_up, complete_follow_up, follow_up_list, days_since.",
280
+ suppressPostActionContinuation: true,
128
281
  validate: async (runtime, message) => hasLifeOpsAccess(runtime, message),
129
282
  handler: async (runtime, message, state, options, callback) => {
130
283
  if (!(await hasLifeOpsAccess(runtime, message))) {
@@ -216,9 +369,9 @@ export const relationshipAction = {
216
369
  };
217
370
  }
218
371
  if (subaction === "log_interaction") {
219
- const relationshipId = params.relationshipId;
372
+ const relationshipId = await resolveRelationshipId(service, params, body);
220
373
  if (!relationshipId) {
221
- const text = "I need the contact's relationshipId to log an interaction.";
374
+ const text = "I need a known contact to log an interaction.";
222
375
  await callback?.({ text });
223
376
  return {
224
377
  text,
@@ -254,11 +407,14 @@ export const relationshipAction = {
254
407
  };
255
408
  }
256
409
  if (subaction === "add_follow_up") {
257
- const relationshipId = params.relationshipId;
258
- const dueAt = params.dueAt;
410
+ const relationshipId = await resolveRelationshipId(service, params, body);
411
+ const dueAtSource = normalizedNonEmpty(params.dueAt) ?? body;
412
+ const dueAt = dueAtSource ? normalizeFollowUpDueAt(dueAtSource) : null;
259
413
  const reason = params.reason ?? params.notes ?? "";
260
414
  if (!relationshipId || !dueAt) {
261
- const text = "I need a contact relationshipId and a dueAt to schedule a follow-up.";
415
+ const text = !relationshipId
416
+ ? "I need a known contact to schedule a follow-up."
417
+ : "I need a due date or time to schedule a follow-up.";
262
418
  await callback?.({ text });
263
419
  return {
264
420
  text,
@@ -318,9 +474,9 @@ export const relationshipAction = {
318
474
  };
319
475
  }
320
476
  if (subaction === "days_since") {
321
- const relationshipId = params.relationshipId;
477
+ const relationshipId = await resolveRelationshipId(service, params, body);
322
478
  if (!relationshipId) {
323
- const text = "I need a relationshipId to check last contact.";
479
+ const text = "I need a known contact to check last contact.";
324
480
  await callback?.({ text });
325
481
  return {
326
482
  text,
@@ -361,7 +517,7 @@ export const relationshipAction = {
361
517
  },
362
518
  {
363
519
  name: "name",
364
- description: "Contact display name.",
520
+ description: "Contact display name. When relationshipId is omitted, the handler resolves an existing contact by this name.",
365
521
  schema: { type: "string" },
366
522
  },
367
523
  {
@@ -406,7 +562,7 @@ export const relationshipAction = {
406
562
  },
407
563
  {
408
564
  name: "dueAt",
409
- description: "ISO-8601 due time for a follow-up.",
565
+ description: "Follow-up due time. Accepts natural language like 'tomorrow', 'next week', or 'next Tuesday at 3pm', or an ISO-8601 timestamp.",
410
566
  schema: { type: "string" },
411
567
  },
412
568
  {
@@ -37,7 +37,7 @@ export const remoteDesktopAction = {
37
37
  "REMOTE_CONTROL",
38
38
  "PHONE_REMOTE_ACCESS",
39
39
  ],
40
- description: "Start or end a secure remote desktop session so you can view/control the computer from your phone. Requires a pairing code. Subactions: start, status, end, list.",
40
+ description: "Start or end a secure remote desktop session so you can view/control the computer from another device. Requires a pairing code. Use this only for remote-session lifecycle work (start, status, end, list), not for local Finder/Desktop automation, screenshots, browser workflows, or file handling on this machine — those belong to LIFEOPS_COMPUTER_USE.",
41
41
  validate: async (runtime, message) => hasOwnerAccess(runtime, message),
42
42
  parameters: [
43
43
  {
@@ -1 +1 @@
1
- {"version":3,"file":"screen-time.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/actions/screen-time.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,MAAM,EAKP,MAAM,eAAe,CAAC;AAkEvB,eAAO,MAAM,gBAAgB,EAAE,MAqN9B,CAAC"}
1
+ {"version":3,"file":"screen-time.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/actions/screen-time.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,MAAM,EAKP,MAAM,eAAe,CAAC;AAmEvB,eAAO,MAAM,gBAAgB,EAAE,MA0N9B,CAAC"}
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { LifeOpsService } from "../lifeops/service.js";
7
7
  import { hasLifeOpsAccess } from "./lifeops-google-helpers.js";
8
+ import { looksLikeScreenTimeReflection } from "./non-actionable-request.js";
8
9
  function getParams(options) {
9
10
  const params = options?.parameters;
10
11
  return params ?? {};
@@ -49,8 +50,13 @@ function inferSubaction(intent, messageBody) {
49
50
  export const screenTimeAction = {
50
51
  name: "SCREEN_TIME",
51
52
  similes: ["SCREENTIME", "APP_USAGE", "WEBSITE_USAGE", "DWELL_TIME"],
52
- description: "Query screen time summaries (per app, per website, daily). Subactions: summary, today, weekly, by_app, by_website.",
53
- validate: async (runtime, message) => hasLifeOpsAccess(runtime, message),
53
+ description: "Query screen time summaries (per app, per website, daily). Use this for quantitative usage questions like 'how much screen time have I used today?', 'break down my screen time by app this week', or 'which websites did I spend the most time on?'. Do not use this when the user is only reflecting or venting like 'I spend too much time on my phone' unless they actually ask for the numbers. Subactions: summary, today, weekly, by_app, by_website.",
54
+ validate: async (runtime, message) => {
55
+ if (looksLikeScreenTimeReflection(messageText(message))) {
56
+ return false;
57
+ }
58
+ return hasLifeOpsAccess(runtime, message);
59
+ },
54
60
  handler: async (runtime, message, _state, options, callback) => {
55
61
  if (!(await hasLifeOpsAccess(runtime, message))) {
56
62
  const text = "Screen time data is restricted to the owner.";
@@ -21,7 +21,7 @@ function coerceString(value) {
21
21
  export const startRemoteSessionAction = {
22
22
  name: ACTION_NAME,
23
23
  similes: ["OPEN_REMOTE_SESSION", "BEGIN_REMOTE_SESSION", "REMOTE_START"],
24
- description: "Open a remote-control session. Requires confirmed: true. If running in local mode (MILADY_REMOTE_LOCAL_MODE=1) no pairing code is needed; otherwise a valid 6-digit pairing code is required.",
24
+ description: "Open a remote-control session. Requires confirmed: true. If running in local mode (MILADY_REMOTE_LOCAL_MODE=1) no pairing code is needed; otherwise a valid 6-digit pairing code is required. Use this only to start a remote session, not for local screenshots, Finder/Desktop tasks, or browser/file automation on this Mac — those belong to LIFEOPS_COMPUTER_USE.",
25
25
  validate: async (runtime, message) => hasOwnerAccess(runtime, message),
26
26
  parameters: [
27
27
  {
@@ -0,0 +1,5 @@
1
+ import type { Action } from "@elizaos/core";
2
+ export declare const subscriptionsAction: Action & {
3
+ suppressPostActionContinuation?: boolean;
4
+ };
5
+ //# sourceMappingURL=subscriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptions.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/actions/subscriptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAOP,MAAM,eAAe,CAAC;AAqQvB,eAAO,MAAM,mBAAmB,EAAE,MAAM,GAAG;IACzC,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAuC1C,CAAC"}
@@ -0,0 +1,251 @@
1
+ import { hasLifeOpsAccess, INTERNAL_URL } from "./lifeops-google-helpers.js";
2
+ import { LifeOpsService, LifeOpsServiceError } from "../lifeops/service.js";
3
+ const ACTION_NAME = "SUBSCRIPTIONS";
4
+ function messageText(message) {
5
+ return typeof message.content?.text === "string" ? message.content.text : "";
6
+ }
7
+ function mergeParams(message, options) {
8
+ const params = {
9
+ ...(options?.parameters ??
10
+ {}),
11
+ };
12
+ if (message.content && typeof message.content === "object") {
13
+ for (const [key, value] of Object.entries(message.content)) {
14
+ if (params[key] === undefined) {
15
+ params[key] = value;
16
+ }
17
+ }
18
+ }
19
+ return params;
20
+ }
21
+ function normalizeMode(value) {
22
+ if (typeof value !== "string") {
23
+ return null;
24
+ }
25
+ const normalized = value.trim().toLowerCase();
26
+ if (normalized === "audit" ||
27
+ normalized === "cancel" ||
28
+ normalized === "status") {
29
+ return normalized;
30
+ }
31
+ return null;
32
+ }
33
+ function parseConfirmed(text, params) {
34
+ if (typeof params.confirmed === "boolean") {
35
+ return params.confirmed;
36
+ }
37
+ return /\b(go ahead|confirm|yes cancel|do it now|proceed)\b/i.test(text);
38
+ }
39
+ function browserTaskData(result) {
40
+ const artifacts = Array.isArray(result.cancellation.metadata.artifacts)
41
+ ? result.cancellation.metadata.artifacts
42
+ : [];
43
+ return {
44
+ status: result.cancellation.status,
45
+ completed: result.cancellation.status === "completed",
46
+ needsHuman: [
47
+ "awaiting_confirmation",
48
+ "needs_login",
49
+ "needs_mfa",
50
+ "needs_user_choice",
51
+ "retention_offer",
52
+ "phone_only",
53
+ "chat_only",
54
+ "blocked",
55
+ ].includes(result.cancellation.status),
56
+ artifactCount: result.cancellation.artifactCount,
57
+ artifacts,
58
+ };
59
+ }
60
+ async function runSubscriptionsAction(runtime, message, state, options) {
61
+ void state;
62
+ const text = messageText(message);
63
+ const params = mergeParams(message, options);
64
+ const service = new LifeOpsService(runtime);
65
+ const inferred = service.resolveSubscriptionIntent(text);
66
+ const mode = normalizeMode(params.mode) ?? inferred.mode;
67
+ if (!mode) {
68
+ return {
69
+ success: false,
70
+ text: "Tell me whether you want a subscription audit, a cancellation, or a status check.",
71
+ data: { error: "AMBIGUOUS_SUBSCRIPTIONS_REQUEST" },
72
+ };
73
+ }
74
+ const serviceName = params.serviceName ?? inferred.serviceName ?? null;
75
+ const serviceSlug = params.serviceSlug ?? inferred.serviceSlug ?? null;
76
+ switch (mode) {
77
+ case "audit": {
78
+ const summary = await service.auditSubscriptions(INTERNAL_URL, {
79
+ queryWindowDays: params.queryWindowDays,
80
+ serviceQuery: serviceName ?? serviceSlug,
81
+ });
82
+ return {
83
+ success: true,
84
+ text: service.summarizeSubscriptionAudit(summary),
85
+ data: {
86
+ audit: summary.audit,
87
+ candidates: summary.candidates,
88
+ report: {
89
+ totalCandidates: summary.audit.totalCandidates,
90
+ activeCandidates: summary.audit.activeCandidates,
91
+ canceledCandidates: summary.audit.canceledCandidates,
92
+ uncertainCandidates: summary.audit.uncertainCandidates,
93
+ },
94
+ },
95
+ };
96
+ }
97
+ case "cancel": {
98
+ const summary = await service.cancelSubscription({
99
+ candidateId: params.candidateId ?? null,
100
+ serviceName,
101
+ serviceSlug,
102
+ executor: params.executor ?? inferred.executor ?? null,
103
+ confirmed: parseConfirmed(text, params),
104
+ });
105
+ return {
106
+ success: summary.cancellation.status !== "failed" &&
107
+ summary.cancellation.status !== "unsupported_surface",
108
+ text: service.summarizeSubscriptionCancellation(summary),
109
+ data: {
110
+ cancellation: summary.cancellation,
111
+ candidate: summary.candidate,
112
+ browserTask: browserTaskData(summary),
113
+ },
114
+ };
115
+ }
116
+ case "status": {
117
+ const summary = await service.getSubscriptionCancellationStatus({
118
+ cancellationId: params.cancellationId ?? null,
119
+ serviceName,
120
+ serviceSlug,
121
+ });
122
+ if (!summary) {
123
+ const latestAudit = await service.getLatestSubscriptionAudit();
124
+ if (latestAudit) {
125
+ return {
126
+ success: true,
127
+ text: service.summarizeSubscriptionAudit(latestAudit),
128
+ data: {
129
+ audit: latestAudit.audit,
130
+ candidates: latestAudit.candidates,
131
+ },
132
+ };
133
+ }
134
+ return {
135
+ success: true,
136
+ text: "No subscription audit or cancellation state is available yet.",
137
+ data: { audit: null, cancellation: null },
138
+ };
139
+ }
140
+ return {
141
+ success: true,
142
+ text: service.summarizeSubscriptionCancellation(summary),
143
+ data: {
144
+ cancellation: summary.cancellation,
145
+ candidate: summary.candidate,
146
+ browserTask: browserTaskData(summary),
147
+ },
148
+ };
149
+ }
150
+ }
151
+ }
152
+ const examples = [
153
+ [
154
+ {
155
+ name: "{{name1}}",
156
+ content: { text: "Audit my subscriptions and tell me what I can cancel." },
157
+ },
158
+ {
159
+ name: "{{agentName}}",
160
+ content: {
161
+ text: "I'll audit recent subscription signals and summarize what looks active, already canceled, or worth reviewing.",
162
+ actions: [ACTION_NAME],
163
+ },
164
+ },
165
+ ],
166
+ [
167
+ {
168
+ name: "{{name1}}",
169
+ content: { text: "Cancel my Google Play subscription." },
170
+ },
171
+ {
172
+ name: "{{agentName}}",
173
+ content: {
174
+ text: "I'll open the subscription flow, stop before the irreversible step if confirmation is needed, and then report the outcome.",
175
+ actions: [ACTION_NAME],
176
+ },
177
+ },
178
+ ],
179
+ [
180
+ {
181
+ name: "{{name1}}",
182
+ content: { text: "Cancel my Netflix subscription." },
183
+ },
184
+ {
185
+ name: "{{agentName}}",
186
+ content: {
187
+ text: "I'll open the subscription flow for Netflix, pause for confirmation if needed, and then report the result.",
188
+ actions: [ACTION_NAME],
189
+ },
190
+ },
191
+ ],
192
+ [
193
+ {
194
+ name: "{{name1}}",
195
+ content: { text: "Cancel Hulu in my browser." },
196
+ },
197
+ {
198
+ name: "{{agentName}}",
199
+ content: {
200
+ text: "I'll route this through the subscription cancellation flow instead of generic website blocking and tell you what happened.",
201
+ actions: [ACTION_NAME],
202
+ },
203
+ },
204
+ ],
205
+ [
206
+ {
207
+ name: "{{name1}}",
208
+ content: { text: "Cancel my App Store subscription on this Mac." },
209
+ },
210
+ {
211
+ name: "{{agentName}}",
212
+ content: {
213
+ text: "I'll use the subscription cancellation flow for the App Store and report whether it needs any manual confirmation.",
214
+ actions: [ACTION_NAME],
215
+ },
216
+ },
217
+ ],
218
+ ];
219
+ export const subscriptionsAction = {
220
+ name: ACTION_NAME,
221
+ similes: [
222
+ "SUBSCRIPTION_AUDIT",
223
+ "SUBSCRIPTION_CANCEL",
224
+ "UNSUBSCRIBE_SERVICE",
225
+ "MANAGE_SUBSCRIPTIONS",
226
+ "CANCEL_NETFLIX",
227
+ "CANCEL_HULU",
228
+ "CANCEL_APP_STORE_SUBSCRIPTION",
229
+ "CANCEL_GOOGLE_PLAY_SUBSCRIPTION",
230
+ ],
231
+ description: "Audit recurring subscriptions from LifeOps signals, cancel supported subscriptions through the browser, and report cancellation status with artifacts and human-handoff states. " +
232
+ "Use this for requests like 'cancel my Netflix subscription', 'cancel Hulu in my browser', 'cancel my Google Play subscription', or 'cancel my App Store subscription on this Mac'.",
233
+ suppressPostActionContinuation: true,
234
+ validate: async (runtime, message) => hasLifeOpsAccess(runtime, message),
235
+ handler: async (runtime, message, state, options) => {
236
+ try {
237
+ return await runSubscriptionsAction(runtime, message, state, options);
238
+ }
239
+ catch (error) {
240
+ if (error instanceof LifeOpsServiceError) {
241
+ return {
242
+ success: false,
243
+ text: error.message,
244
+ data: { status: error.status },
245
+ };
246
+ }
247
+ throw error;
248
+ }
249
+ },
250
+ examples,
251
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"twilio-call.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/actions/twilio-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EAMZ,MAAM,eAAe,CAAC;AA4BvB,eAAO,MAAM,gBAAgB,EAAE,MAyL9B,CAAC;AA4BF,iBAAS,eAAe,CACtB,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,GAAG,SAAS,GAC7D,MAAM,GAAG,IAAI,CAUf;AAED,iBAAS,qBAAqB,CAC5B,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,GAAG,SAAS,GAC7D,MAAM,EAAE,CAiBV;AA0BD,eAAO,MAAM,cAAc,EAAE,MAAM,GAAG;IACpC,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAgI1C,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,GAAG;IACxC,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAsK1C,CAAC;AAGF,eAAO,MAAM,UAAU;;;CAGtB,CAAC"}
1
+ {"version":3,"file":"twilio-call.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/actions/twilio-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EAMZ,MAAM,eAAe,CAAC;AA4BvB,eAAO,MAAM,gBAAgB,EAAE,MAiM9B,CAAC;AA4BF,iBAAS,eAAe,CACtB,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,GAAG,SAAS,GAC7D,MAAM,GAAG,IAAI,CAUf;AAED,iBAAS,qBAAqB,CAC5B,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,GAAG,SAAS,GAC7D,MAAM,EAAE,CAiBV;AA0BD,eAAO,MAAM,cAAc,EAAE,MAAM,GAAG;IACpC,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAgI1C,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,GAAG;IACxC,8BAA8B,CAAC,EAAE,OAAO,CAAC;CA2M1C,CAAC;AAGF,eAAO,MAAM,UAAU;;;CAGtB,CAAC"}
@@ -17,9 +17,17 @@ function coerceBool(value) {
17
17
  }
18
18
  export const twilioCallAction = {
19
19
  name: ACTION_NAME,
20
- similes: ["CALL_ME", "PLACE_CALL", "VOICE_CALL", "TWILIO_CALL"],
20
+ similes: [
21
+ "CALL_ME",
22
+ "PLACE_CALL",
23
+ "VOICE_CALL",
24
+ "TWILIO_CALL",
25
+ "CALL_DENTIST",
26
+ "PHONE_SUPPORT",
27
+ ],
21
28
  description: "Place a voice call via Twilio. Use only for urgent escalations or " +
22
- "explicit voice-call requests from the owner. Always drafts first; the " +
29
+ "explicit voice-call requests from the owner. Use this for real phone " +
30
+ "calls, not for calendar-only rescheduling or advice. Always drafts first; the " +
23
31
  "caller must pass confirmed: true to actually dial.",
24
32
  validate: async (runtime, message) => {
25
33
  if (!readTwilioCredentialsFromEnv())
@@ -365,6 +373,10 @@ export const callExternalAction = {
365
373
  "CALL_THIRD_PARTY",
366
374
  "BOOK_BY_PHONE",
367
375
  "REBOOK_BY_PHONE",
376
+ "CALL_DENTIST",
377
+ "PHONE_CABLE_COMPANY",
378
+ "CALL_SUPPORT",
379
+ "RESCHEDULE_APPOINTMENT_BY_PHONE",
368
380
  ],
369
381
  tags: [
370
382
  "always-include",
@@ -372,8 +384,13 @@ export const callExternalAction = {
372
384
  "rebook by phone",
373
385
  "call vendor",
374
386
  "call airline",
387
+ "call dentist",
388
+ "call doctor",
389
+ "phone support",
390
+ "call cable company",
391
+ "reschedule appointment",
375
392
  ],
376
- description: "Place an outbound phone call to a third party via Twilio. Use this for approved booking/reschedule/escalation calls to vendors or counterparties. This action can draft the call, ask which saved contact to use, and then require confirmation before dialing. The recipient must appear in the configured allow-list before the actual call is placed.",
393
+ description: "Place an outbound phone call to a third party via Twilio. Use this for approved booking, reschedule, outage, support, or escalation calls to vendors or counterparties. Examples: 'call the dentist and reschedule my appointment', 'phone my cable company and ask about the outage', 'call the airline', or 'call the hotel to rebook'. This action can draft the call, ask which saved contact to use, and then require confirmation before dialing. If the user wants a real phone call to a third party, prefer this action over CALENDAR_ACTION, LIFE, or CROSS_CHANNEL_SEND. The recipient must appear in the configured allow-list before the actual call is placed.",
377
394
  suppressPostActionContinuation: true,
378
395
  validate: async (runtime, message) => {
379
396
  return hasOwnerAccess(runtime, message);
@@ -501,6 +518,34 @@ export const callExternalAction = {
501
518
  },
502
519
  },
503
520
  ],
521
+ [
522
+ {
523
+ name: "{{name1}}",
524
+ content: {
525
+ text: "Call the dentist and reschedule my appointment.",
526
+ },
527
+ },
528
+ {
529
+ name: "{{agentName}}",
530
+ content: {
531
+ text: "I can draft that call and hold it behind your approval. Tell me which saved contact or phone number to use, and I'll ask for confirmation before dialing.",
532
+ },
533
+ },
534
+ ],
535
+ [
536
+ {
537
+ name: "{{name1}}",
538
+ content: {
539
+ text: "Phone my cable company and ask about the outage.",
540
+ },
541
+ },
542
+ {
543
+ name: "{{agentName}}",
544
+ content: {
545
+ text: "I can draft the support call. Tell me which saved contact or phone number to use, and I'll ask for confirmation before dialing.",
546
+ },
547
+ },
548
+ ],
504
549
  ],
505
550
  };
506
551
  // Exposed for tests.
@@ -1 +1 @@
1
- {"version":3,"file":"update-owner-profile.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/actions/update-owner-profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiC,MAAM,eAAe,CAAC;AAmB3E,eAAO,MAAM,wBAAwB,EAAE,MAAM,GAAG;IAC9C,8BAA8B,CAAC,EAAE,OAAO,CAAC;CA2K1C,CAAC"}
1
+ {"version":3,"file":"update-owner-profile.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/actions/update-owner-profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiC,MAAM,eAAe,CAAC;AAmB3E,eAAO,MAAM,wBAAwB,EAAE,MAAM,GAAG;IAC9C,8BAA8B,CAAC,EAAE,OAAO,CAAC;CA4K1C,CAAC"}
@@ -21,7 +21,8 @@ export const updateOwnerProfileAction = {
21
21
  ],
22
22
  description: "Silently persist stable, owner-only LifeOps profile details when the canonical owner clearly states or confirms them. " +
23
23
  "Use only for the owner, never for other contacts, and do not ask follow-up questions just to fill these fields. " +
24
- "This includes durable travel-booking preferences or a reusable travel-preference checklist when the owner wants those preferences remembered for future bookings.",
24
+ "This includes durable travel-booking preferences or a reusable travel-preference checklist when the owner wants those preferences remembered for future bookings. " +
25
+ "Do not use this for todos, goals, reminders, temporary plans, or live task state.",
25
26
  descriptionCompressed: "Persist stable owner profile details when stated/confirmed. Owner only.",
26
27
  suppressPostActionContinuation: true,
27
28
  validate: async (runtime, message) => {
@@ -1,9 +1,13 @@
1
1
  import type { Action } from "@elizaos/core";
2
- export declare const blockWebsitesAction: Action;
2
+ export declare const blockWebsitesAction: Action & {
3
+ suppressPostActionContinuation?: boolean;
4
+ };
3
5
  export declare const getWebsiteBlockStatusAction: Action;
4
6
  export declare const requestWebsiteBlockingPermissionAction: Action;
5
7
  export declare const unblockWebsitesAction: Action;
6
- export declare const selfControlBlockWebsitesAction: Action;
8
+ export declare const selfControlBlockWebsitesAction: Action & {
9
+ suppressPostActionContinuation?: boolean;
10
+ };
7
11
  export declare const selfControlGetStatusAction: Action;
8
12
  export declare const selfControlRequestPermissionAction: Action;
9
13
  export declare const selfControlUnblockWebsitesAction: Action;