@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
@@ -54,13 +54,15 @@ function tabIdFromGrant(grant) {
54
54
  function sessionIdFromGrant(grant) {
55
55
  if (!grant)
56
56
  return null;
57
- const raw = grant.metadata?.sessionId;
57
+ const raw = grant.metadata
58
+ ?.sessionId;
58
59
  return typeof raw === "string" && raw.length > 0 ? raw : null;
59
60
  }
60
61
  function companionIdFromGrant(grant) {
61
62
  if (!grant)
62
63
  return null;
63
- const raw = grant.metadata?.companionId;
64
+ const raw = grant.metadata
65
+ ?.companionId;
64
66
  return typeof raw === "string" && raw.length > 0 ? raw : null;
65
67
  }
66
68
  function companionKey(args) {
@@ -79,10 +81,14 @@ function sortCompanionsByRecency(companions) {
79
81
  return [...companions].sort((left, right) => {
80
82
  const leftMs = Date.parse(left.lastSeenAt ?? "");
81
83
  const rightMs = Date.parse(right.lastSeenAt ?? "");
82
- if (Number.isFinite(leftMs) && Number.isFinite(rightMs) && leftMs !== rightMs) {
84
+ if (Number.isFinite(leftMs) &&
85
+ Number.isFinite(rightMs) &&
86
+ leftMs !== rightMs) {
83
87
  return rightMs - leftMs;
84
88
  }
85
- if (left.lastSeenAt && right.lastSeenAt && left.lastSeenAt !== right.lastSeenAt) {
89
+ if (left.lastSeenAt &&
90
+ right.lastSeenAt &&
91
+ left.lastSeenAt !== right.lastSeenAt) {
86
92
  return right.lastSeenAt.localeCompare(left.lastSeenAt);
87
93
  }
88
94
  return left.id.localeCompare(right.id);
@@ -100,7 +106,9 @@ function pickNewestDiscordTab(tabs) {
100
106
  }
101
107
  const leftMs = Date.parse(left.lastFocusedAt ?? left.lastSeenAt);
102
108
  const rightMs = Date.parse(right.lastFocusedAt ?? right.lastSeenAt);
103
- if (Number.isFinite(leftMs) && Number.isFinite(rightMs) && leftMs !== rightMs) {
109
+ if (Number.isFinite(leftMs) &&
110
+ Number.isFinite(rightMs) &&
111
+ leftMs !== rightMs) {
104
112
  return rightMs - leftMs;
105
113
  }
106
114
  return right.lastSeenAt.localeCompare(left.lastSeenAt);
@@ -112,8 +120,7 @@ function parseSessionProbe(session) {
112
120
  const result = asRecord(session.result);
113
121
  if (!result)
114
122
  return null;
115
- const actionResults = asRecord(result.actionResults) ??
116
- result;
123
+ const actionResults = asRecord(result.actionResults) ?? result;
117
124
  let pageUrl = null;
118
125
  let pageTitle = null;
119
126
  let mainText = null;
@@ -137,7 +144,9 @@ function parseSessionProbe(session) {
137
144
  }
138
145
  else if (action.kind === "read_page") {
139
146
  pageUrl =
140
- typeof entry.url === "string" && entry.url.length > 0 ? entry.url : pageUrl;
147
+ typeof entry.url === "string" && entry.url.length > 0
148
+ ? entry.url
149
+ : pageUrl;
141
150
  pageTitle =
142
151
  typeof entry.title === "string" && entry.title.length > 0
143
152
  ? entry.title
@@ -176,7 +185,133 @@ function sessionError(session) {
176
185
  return null;
177
186
  const result = asRecord(session.result);
178
187
  const error = result?.error;
179
- return typeof error === "string" && error.trim().length > 0 ? error.trim() : null;
188
+ return typeof error === "string" && error.trim().length > 0
189
+ ? error.trim()
190
+ : null;
191
+ }
192
+ function siteAccessAllowsDiscord(companion, hasDiscordPage) {
193
+ if (!companion) {
194
+ return null;
195
+ }
196
+ if (hasDiscordPage) {
197
+ return true;
198
+ }
199
+ if (companion.permissions.allOrigins) {
200
+ return true;
201
+ }
202
+ return companion.permissions.grantedOrigins.some((origin) => origin.includes("discord.com"));
203
+ }
204
+ function browserAuthStateFromProbe(probe) {
205
+ if (probe?.loggedIn === true) {
206
+ return "logged_in";
207
+ }
208
+ if (probe?.loggedIn === false &&
209
+ Boolean(probe.url?.includes("discord.com"))) {
210
+ return "logged_out";
211
+ }
212
+ return "unknown";
213
+ }
214
+ function browserTabState(args) {
215
+ if (args.probe?.dmInbox.visible) {
216
+ return "dm_inbox_visible";
217
+ }
218
+ if (args.probe?.url?.includes("discord.com")) {
219
+ return "discord_open";
220
+ }
221
+ if (args.hasDiscordTab) {
222
+ return "background_discord";
223
+ }
224
+ return "missing";
225
+ }
226
+ function lifeOpsBrowserAccessStatus(args) {
227
+ const authState = browserAuthStateFromProbe(args.probe);
228
+ const tabState = browserTabState({
229
+ probe: args.probe,
230
+ hasDiscordTab: args.hasDiscordTab,
231
+ });
232
+ let nextAction = "none";
233
+ if (!args.settingsEnabled || !args.trackingEnabled || args.paused) {
234
+ nextAction = "enable_browser_access";
235
+ }
236
+ else if (!args.hasAnyCompanion) {
237
+ nextAction = "connect_browser";
238
+ }
239
+ else if (!args.hasConnectedCompanion) {
240
+ nextAction = "open_extension_popup";
241
+ }
242
+ else if (authState === "logged_out") {
243
+ nextAction = "log_in";
244
+ }
245
+ else if (!args.canControl && tabState === "missing") {
246
+ nextAction = "enable_browser_control";
247
+ }
248
+ else if (!args.canControl && tabState !== "dm_inbox_visible") {
249
+ nextAction = "focus_dm_inbox_manually";
250
+ }
251
+ else if (tabState === "missing") {
252
+ nextAction = "open_discord";
253
+ }
254
+ else if (authState === "logged_in" && tabState !== "dm_inbox_visible") {
255
+ nextAction = "open_dm_inbox";
256
+ }
257
+ if (args.siteAccessOk === false && nextAction === "none") {
258
+ nextAction = "open_discord";
259
+ }
260
+ return {
261
+ source: "lifeops_browser",
262
+ active: args.active,
263
+ available: args.settingsEnabled &&
264
+ args.trackingEnabled &&
265
+ !args.paused &&
266
+ args.hasConnectedCompanion,
267
+ browser: args.companion?.browser ?? null,
268
+ profileId: args.companion?.profileId ?? null,
269
+ profileLabel: args.companion?.profileLabel ?? null,
270
+ companionId: args.companion?.id ?? null,
271
+ companionLabel: args.companion?.label ?? null,
272
+ canControl: args.canControl,
273
+ siteAccessOk: args.siteAccessOk,
274
+ currentUrl: args.probe?.url ?? null,
275
+ tabState,
276
+ authState,
277
+ nextAction,
278
+ };
279
+ }
280
+ function desktopBrowserAccessStatus(args) {
281
+ const authState = browserAuthStateFromProbe(args.probe);
282
+ const tabState = browserTabState({
283
+ probe: args.probe,
284
+ hasDiscordTab: args.hasTab,
285
+ });
286
+ let nextAction = "none";
287
+ if (!args.available) {
288
+ nextAction = "open_desktop_browser";
289
+ }
290
+ else if (authState === "logged_out") {
291
+ nextAction = "log_in";
292
+ }
293
+ else if (tabState === "missing") {
294
+ nextAction = "open_discord";
295
+ }
296
+ else if (authState === "logged_in" && tabState !== "dm_inbox_visible") {
297
+ nextAction = "open_dm_inbox";
298
+ }
299
+ return {
300
+ source: "desktop_browser",
301
+ active: args.active,
302
+ available: args.available,
303
+ browser: null,
304
+ profileId: null,
305
+ profileLabel: null,
306
+ companionId: null,
307
+ companionLabel: null,
308
+ canControl: args.available,
309
+ siteAccessOk: args.available ? true : null,
310
+ currentUrl: args.probe?.url ?? null,
311
+ tabState,
312
+ authState,
313
+ nextAction,
314
+ };
180
315
  }
181
316
  /** @internal */
182
317
  export function withDiscord(Base) {
@@ -204,17 +339,18 @@ export function withDiscord(Base) {
204
339
  }
205
340
  async lifeOpsDiscordGetOwnerBrowserDiscordState(grant) {
206
341
  const settings = await this.getBrowserSettings();
207
- const connectedCompanions = sortCompanionsByRecency((await this.listBrowserCompanions()).filter((companion) => companion.connectionState === "connected"));
208
- const available = settings.enabled &&
209
- settings.trackingMode !== "off" &&
210
- !this.isBrowserPaused(settings) &&
342
+ const allCompanions = sortCompanionsByRecency(await this.listBrowserCompanions());
343
+ const connectedCompanions = allCompanions.filter((companion) => companion.connectionState === "connected");
344
+ const paused = this.isBrowserPaused(settings);
345
+ const trackingEnabled = settings.trackingMode !== "off";
346
+ const settingsEnabled = settings.enabled;
347
+ const available = settingsEnabled &&
348
+ trackingEnabled &&
349
+ !paused &&
211
350
  connectedCompanions.length > 0;
212
- if (!available) {
213
- return null;
214
- }
215
351
  const tabs = await this.listBrowserTabs();
216
352
  const currentPage = await this.getCurrentBrowserPage();
217
- const currentPageProbe = currentPage && currentPage.url.includes("discord.com")
353
+ const currentPageProbe = currentPage?.url.includes("discord.com")
218
354
  ? probeDiscordCapturedPage(currentPage)
219
355
  : null;
220
356
  const discordTab = pickNewestDiscordTab(tabs);
@@ -240,9 +376,13 @@ export function withDiscord(Base) {
240
376
  profileId: discordTab.profileId,
241
377
  }))) ??
242
378
  (companionIdFromGrant(grant)
243
- ? connectedCompanions.find((companion) => companion.id === companionIdFromGrant(grant)) ?? null
379
+ ? (connectedCompanions.find((companion) => companion.id === companionIdFromGrant(grant)) ?? null)
244
380
  : null) ??
245
381
  connectedCompanions[0] ??
382
+ (companionIdFromGrant(grant)
383
+ ? (allCompanions.find((companion) => companion.id === companionIdFromGrant(grant)) ?? null)
384
+ : null) ??
385
+ allCompanions[0] ??
246
386
  null;
247
387
  const reason = browserReasonFor({
248
388
  available,
@@ -257,9 +397,15 @@ export function withDiscord(Base) {
257
397
  });
258
398
  return {
259
399
  available,
400
+ settingsEnabled,
401
+ trackingEnabled,
402
+ paused,
260
403
  canControl: settings.allowBrowserControl,
261
404
  selectedCompanion,
405
+ hasAnyCompanion: allCompanions.length > 0,
406
+ hasConnectedCompanion: connectedCompanions.length > 0,
262
407
  discordTab,
408
+ currentPageUrl: currentPage?.url ?? null,
263
409
  probe,
264
410
  session,
265
411
  lastError: sessionError(session),
@@ -271,6 +417,14 @@ export function withDiscord(Base) {
271
417
  const tabId = tabIdFromGrant(grant);
272
418
  const probe = available ? await this.lifeOpsDiscordProbeTab(tabId) : null;
273
419
  const loggedIn = probe?.loggedIn === true;
420
+ const browserAccess = [
421
+ desktopBrowserAccessStatus({
422
+ active: available,
423
+ available,
424
+ probe,
425
+ hasTab: Boolean(tabId),
426
+ }),
427
+ ];
274
428
  const capabilities = loggedIn || probe?.dmInbox.visible
275
429
  ? capabilitiesForSide(LIFEOPS_DISCORD_CAPABILITIES, normalizedSide)
276
430
  : (grant?.capabilities ?? []).filter((candidate) => candidate === "discord.read" || candidate === "discord.send");
@@ -290,6 +444,7 @@ export function withDiscord(Base) {
290
444
  grantedCapabilities: capabilities,
291
445
  lastError: null,
292
446
  tabId,
447
+ browserAccess,
293
448
  grant,
294
449
  };
295
450
  }
@@ -298,9 +453,37 @@ export function withDiscord(Base) {
298
453
  const grant = await this.repository.getConnectorGrant(this.agentId(), "discord", "local", normalizedSide);
299
454
  if (normalizedSide === "owner") {
300
455
  const browserState = await this.lifeOpsDiscordGetOwnerBrowserDiscordState(grant);
301
- if (browserState) {
302
- const probe = browserState.probe;
303
- const connected = probe?.loggedIn === true;
456
+ const workspaceAvailable = discordBrowserWorkspaceAvailable();
457
+ const workspaceTabId = tabIdFromGrant(grant);
458
+ const workspaceProbe = workspaceAvailable
459
+ ? await this.lifeOpsDiscordProbeTab(workspaceTabId)
460
+ : null;
461
+ const probe = browserState.probe;
462
+ const connected = probe?.loggedIn === true;
463
+ const onDiscordPage = Boolean(browserState.currentPageUrl?.includes("discord.com")) ||
464
+ Boolean(browserState.discordTab);
465
+ const browserAccess = [
466
+ lifeOpsBrowserAccessStatus({
467
+ active: browserState.available,
468
+ settingsEnabled: browserState.settingsEnabled,
469
+ trackingEnabled: browserState.trackingEnabled,
470
+ paused: browserState.paused,
471
+ canControl: browserState.canControl,
472
+ companion: browserState.selectedCompanion,
473
+ hasAnyCompanion: browserState.hasAnyCompanion,
474
+ hasConnectedCompanion: browserState.hasConnectedCompanion,
475
+ probe,
476
+ hasDiscordTab: onDiscordPage,
477
+ siteAccessOk: siteAccessAllowsDiscord(browserState.selectedCompanion, onDiscordPage || Boolean(browserState.discordTab)),
478
+ }),
479
+ desktopBrowserAccessStatus({
480
+ active: !browserState.available && workspaceAvailable,
481
+ available: workspaceAvailable,
482
+ probe: workspaceProbe,
483
+ hasTab: Boolean(workspaceTabId),
484
+ }),
485
+ ];
486
+ if (browserState.available) {
304
487
  return {
305
488
  provider: "discord",
306
489
  side: normalizedSide,
@@ -314,9 +497,15 @@ export function withDiscord(Base) {
314
497
  : [],
315
498
  lastError: browserState.lastError,
316
499
  tabId: tabIdFromGrant(grant),
500
+ browserAccess,
317
501
  grant,
318
502
  };
319
503
  }
504
+ const workspaceStatus = await this.lifeOpsDiscordBuildWorkspaceStatus(normalizedSide, grant);
505
+ return {
506
+ ...workspaceStatus,
507
+ browserAccess,
508
+ };
320
509
  }
321
510
  return this.lifeOpsDiscordBuildWorkspaceStatus(normalizedSide, grant);
322
511
  }
@@ -330,16 +519,22 @@ export function withDiscord(Base) {
330
519
  const existing = await this.repository.getConnectorGrant(this.agentId(), "discord", "local", normalizedSide);
331
520
  if (normalizedSide === "owner") {
332
521
  const browserState = await this.lifeOpsDiscordGetOwnerBrowserDiscordState(existing);
333
- if (browserState) {
522
+ const hasConnectedBrowserPath = browserState.hasConnectedCompanion ||
523
+ Boolean(browserState.currentPageUrl?.includes("discord.com")) ||
524
+ Boolean(browserState.discordTab) ||
525
+ Boolean(browserState.probe);
526
+ if (hasConnectedBrowserPath) {
334
527
  const probe = browserState.probe;
335
528
  const connected = probe?.loggedIn === true;
336
529
  const dmInboxVisible = probe?.dmInbox.visible === true;
337
530
  const identity = identityFromProbe(probe, existing?.identity ?? null) ?? {};
338
- const onDiscordPage = Boolean(probe?.url && probe.url.includes("discord.com"));
339
- const onDiscordDmPage = Boolean(probe?.url && probe.url.includes("/channels/@me"));
531
+ const onDiscordPage = Boolean(probe?.url?.includes("discord.com"));
532
+ const onDiscordDmPage = Boolean(probe?.url?.includes("/channels/@me"));
340
533
  const needsDiscordOpen = !connected && !onDiscordPage;
341
534
  const needsDmInspection = connected && !dmInboxVisible;
342
- if (!browserState.canControl && !browserState.discordTab && !onDiscordPage) {
535
+ if (!browserState.canControl &&
536
+ !browserState.discordTab &&
537
+ !onDiscordPage) {
343
538
  fail(409, "LifeOps Browser can see your browser, but browser control is disabled. Enable browser control or open Discord manually, then try again.");
344
539
  }
345
540
  let sessionId = sessionIdFromGrant(existing);
@@ -487,7 +682,7 @@ export function withDiscord(Base) {
487
682
  }
488
683
  }
489
684
  if (!discordBrowserWorkspaceAvailable()) {
490
- fail(503, "Discord connector requires either a connected LifeOps Browser companion or the Milady desktop app browser workspace.");
685
+ fail(503, "Discord connector requires either Your Browser connected through LifeOps Browser or Milady Desktop Browser.");
491
686
  }
492
687
  const { tabId } = await ensureDiscordTab({
493
688
  agentId: this.agentId(),
@@ -581,22 +776,7 @@ export function withDiscord(Base) {
581
776
  }
582
777
  await this.repository.deleteConnectorGrant(this.agentId(), "discord", "local", normalizedSide);
583
778
  await this.recordConnectorAudit(`discord:${normalizedSide}`, "discord browser connector disconnected", { side: normalizedSide }, {});
584
- return {
585
- provider: "discord",
586
- side: normalizedSide,
587
- available: normalizedSide === "owner"
588
- ? Boolean(await this.lifeOpsDiscordGetOwnerBrowserDiscordState(null)) ||
589
- discordBrowserWorkspaceAvailable()
590
- : discordBrowserWorkspaceAvailable(),
591
- connected: false,
592
- reason: "disconnected",
593
- identity: null,
594
- dmInbox: emptyDiscordDmInboxProbe(),
595
- grantedCapabilities: [],
596
- lastError: null,
597
- tabId: null,
598
- grant: null,
599
- };
779
+ return this.getDiscordConnectorStatus(normalizedSide);
600
780
  }
601
781
  }
602
782
  return LifeOpsDiscordServiceMixin;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=service-mixin-subscriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-mixin-subscriptions.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/service-mixin-subscriptions.ts"],"names":[],"mappings":""}