@elizaos/plugin-phone 2.0.3-beta.2 → 2.0.3-beta.3

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 (123) hide show
  1. package/dist/companion/components/Chat.d.ts +14 -0
  2. package/dist/companion/components/Chat.d.ts.map +1 -0
  3. package/dist/companion/components/Chat.js +195 -0
  4. package/dist/companion/components/Chat.js.map +1 -0
  5. package/dist/companion/components/Pairing.d.ts +9 -0
  6. package/dist/companion/components/Pairing.d.ts.map +1 -0
  7. package/dist/companion/components/Pairing.js +175 -0
  8. package/dist/companion/components/Pairing.js.map +1 -0
  9. package/dist/companion/components/PhoneCompanionApp.d.ts +9 -0
  10. package/dist/companion/components/PhoneCompanionApp.d.ts.map +1 -0
  11. package/dist/companion/components/PhoneCompanionApp.js +174 -0
  12. package/dist/companion/components/PhoneCompanionApp.js.map +1 -0
  13. package/dist/companion/components/RemoteSession.d.ts +9 -0
  14. package/dist/companion/components/RemoteSession.d.ts.map +1 -0
  15. package/dist/companion/components/RemoteSession.js +382 -0
  16. package/dist/companion/components/RemoteSession.js.map +1 -0
  17. package/dist/companion/components/index.d.ts +5 -0
  18. package/dist/companion/components/index.d.ts.map +1 -0
  19. package/dist/companion/components/index.js +11 -0
  20. package/dist/companion/components/index.js.map +1 -0
  21. package/dist/companion/index.d.ts +14 -0
  22. package/dist/companion/index.d.ts.map +1 -0
  23. package/dist/companion/index.js +12 -0
  24. package/dist/companion/index.js.map +1 -0
  25. package/dist/companion/services/eliza-intent.d.ts +63 -0
  26. package/dist/companion/services/eliza-intent.d.ts.map +1 -0
  27. package/dist/companion/services/eliza-intent.js +52 -0
  28. package/dist/companion/services/eliza-intent.js.map +1 -0
  29. package/dist/companion/services/env.d.ts +11 -0
  30. package/dist/companion/services/env.d.ts.map +1 -0
  31. package/dist/companion/services/env.js +20 -0
  32. package/dist/companion/services/env.js.map +1 -0
  33. package/dist/companion/services/index.d.ts +14 -0
  34. package/dist/companion/services/index.d.ts.map +1 -0
  35. package/dist/companion/services/index.js +29 -0
  36. package/dist/companion/services/index.js.map +1 -0
  37. package/dist/companion/services/intent-bridge.d.ts +11 -0
  38. package/dist/companion/services/intent-bridge.d.ts.map +1 -0
  39. package/dist/companion/services/intent-bridge.js +15 -0
  40. package/dist/companion/services/intent-bridge.js.map +1 -0
  41. package/dist/companion/services/logger.d.ts +14 -0
  42. package/dist/companion/services/logger.d.ts.map +1 -0
  43. package/dist/companion/services/logger.js +50 -0
  44. package/dist/companion/services/logger.js.map +1 -0
  45. package/dist/companion/services/navigation.d.ts +17 -0
  46. package/dist/companion/services/navigation.d.ts.map +1 -0
  47. package/dist/companion/services/navigation.js +104 -0
  48. package/dist/companion/services/navigation.js.map +1 -0
  49. package/dist/companion/services/push.d.ts +27 -0
  50. package/dist/companion/services/push.d.ts.map +1 -0
  51. package/dist/companion/services/push.js +101 -0
  52. package/dist/companion/services/push.js.map +1 -0
  53. package/dist/companion/services/session-client.d.ts +114 -0
  54. package/dist/companion/services/session-client.d.ts.map +1 -0
  55. package/dist/companion/services/session-client.js +197 -0
  56. package/dist/companion/services/session-client.js.map +1 -0
  57. package/dist/components/PhoneAppView.d.ts +18 -0
  58. package/dist/components/PhoneAppView.d.ts.map +1 -0
  59. package/dist/components/PhoneAppView.helpers.d.ts +12 -0
  60. package/dist/components/PhoneAppView.helpers.d.ts.map +1 -0
  61. package/dist/components/PhoneAppView.helpers.js +44 -0
  62. package/dist/components/PhoneAppView.helpers.js.map +1 -0
  63. package/dist/components/PhoneAppView.interact.d.ts +2 -0
  64. package/dist/components/PhoneAppView.interact.d.ts.map +1 -0
  65. package/dist/components/PhoneAppView.interact.js +63 -0
  66. package/dist/components/PhoneAppView.interact.js.map +1 -0
  67. package/dist/components/PhoneAppView.js +566 -0
  68. package/dist/components/PhoneAppView.js.map +1 -0
  69. package/dist/components/PhoneSpatialView.d.ts +43 -0
  70. package/dist/components/PhoneSpatialView.d.ts.map +1 -0
  71. package/dist/components/PhoneSpatialView.js +180 -0
  72. package/dist/components/PhoneSpatialView.js.map +1 -0
  73. package/dist/components/PhoneView.d.ts +13 -0
  74. package/dist/components/PhoneView.d.ts.map +1 -0
  75. package/dist/components/PhoneView.js +161 -0
  76. package/dist/components/PhoneView.js.map +1 -0
  77. package/dist/components/phone-app.d.ts +13 -0
  78. package/dist/components/phone-app.d.ts.map +1 -0
  79. package/dist/components/phone-app.js +20 -0
  80. package/dist/components/phone-app.js.map +1 -0
  81. package/dist/components/phone-view-bundle.d.ts +3 -0
  82. package/dist/components/phone-view-bundle.d.ts.map +1 -0
  83. package/dist/components/phone-view-bundle.js +7 -0
  84. package/dist/components/phone-view-bundle.js.map +1 -0
  85. package/dist/index.d.ts +25 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +28 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/plugin.d.ts +17 -0
  90. package/dist/plugin.d.ts.map +1 -0
  91. package/dist/plugin.js +48 -0
  92. package/dist/plugin.js.map +1 -0
  93. package/dist/providers/call-log.d.ts +11 -0
  94. package/dist/providers/call-log.d.ts.map +1 -0
  95. package/dist/providers/call-log.js +66 -0
  96. package/dist/providers/call-log.js.map +1 -0
  97. package/dist/register-companion-page.d.ts +13 -0
  98. package/dist/register-companion-page.d.ts.map +1 -0
  99. package/dist/register-companion-page.js +12 -0
  100. package/dist/register-companion-page.js.map +1 -0
  101. package/dist/register-terminal-view.d.ts +15 -0
  102. package/dist/register-terminal-view.d.ts.map +1 -0
  103. package/dist/register-terminal-view.js +21 -0
  104. package/dist/register-terminal-view.js.map +1 -0
  105. package/dist/register.d.ts +9 -0
  106. package/dist/register.d.ts.map +1 -0
  107. package/dist/register.js +11 -0
  108. package/dist/register.js.map +1 -0
  109. package/dist/twilio.d.ts +33 -0
  110. package/dist/twilio.d.ts.map +1 -0
  111. package/dist/twilio.js +238 -0
  112. package/dist/twilio.js.map +1 -0
  113. package/dist/ui.d.ts +8 -0
  114. package/dist/ui.d.ts.map +1 -0
  115. package/dist/ui.js +23 -0
  116. package/dist/ui.js.map +1 -0
  117. package/dist/views/bundle.js +407 -0
  118. package/dist/views/bundle.js.map +1 -0
  119. package/dist/views/dist-Cd2YtKy4.js +270 -0
  120. package/dist/views/dist-Cd2YtKy4.js.map +1 -0
  121. package/dist/views/web-TGRkTsa8.js +58 -0
  122. package/dist/views/web-TGRkTsa8.js.map +1 -0
  123. package/package.json +9 -8
@@ -0,0 +1,407 @@
1
+ import { n as e } from "./dist-Cd2YtKy4.js";
2
+ import { consumePendingPhoneNumber as t } from "@elizaos/ui/app-navigate-view";
3
+ import { Button as n, Card as r, Divider as i, HStack as a, List as o, SpatialSurface as s, Text as c, VStack as l } from "@elizaos/ui/spatial";
4
+ import { useCallback as u, useEffect as d, useRef as f, useState as p } from "react";
5
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
6
+ var g = e("ElizaPhone", { web: () => import("./web-TGRkTsa8.js").then((e) => new e.PhoneWeb()) }), _ = 50, v = 200;
7
+ function y(e) {
8
+ return e.cachedName && e.cachedName.trim().length > 0 ? e.cachedName.trim() : e.number && e.number.trim().length > 0 ? e.number.trim() : "Unknown";
9
+ }
10
+ function b(e) {
11
+ let t = e.trim();
12
+ return t ? `${t.startsWith("+") ? "+" : ""}${t.replace(/[^0-9]/g, "")}` : "";
13
+ }
14
+ function x(e) {
15
+ return !Number.isFinite(e) || typeof e != "number" ? _ : Math.min(v, Math.max(1, Math.trunc(e)));
16
+ }
17
+ async function S(e) {
18
+ let t = typeof e?.number == "string" ? b(e.number) : "", [n, r] = await Promise.all([g.getStatus().catch(() => null), g.listRecentCalls({
19
+ limit: x(e?.limit),
20
+ ...t ? { number: t } : {}
21
+ })]);
22
+ return {
23
+ status: n,
24
+ calls: r.calls
25
+ };
26
+ }
27
+ //#endregion
28
+ //#region src/components/PhoneAppView.interact.ts
29
+ async function C(e, t) {
30
+ if (e === "terminal-phone-state") {
31
+ let e = await S({
32
+ limit: t?.limit,
33
+ number: typeof t?.number == "string" ? t.number : void 0
34
+ });
35
+ return {
36
+ viewType: "tui",
37
+ status: e.status,
38
+ calls: e.calls.map((e) => ({
39
+ id: e.id,
40
+ number: e.number,
41
+ cachedName: e.cachedName,
42
+ label: y(e),
43
+ date: e.date,
44
+ durationSeconds: e.durationSeconds,
45
+ type: e.type,
46
+ isNew: e.isNew,
47
+ agentSummary: e.agentSummary,
48
+ agentTranscript: e.agentTranscript
49
+ }))
50
+ };
51
+ }
52
+ if (e === "terminal-place-call") {
53
+ let e = b(typeof t?.number == "string" ? t.number : "");
54
+ if (!e) throw Error("number is required");
55
+ return await g.placeCall({ number: e }), {
56
+ placed: !0,
57
+ number: e,
58
+ viewType: "tui"
59
+ };
60
+ }
61
+ if (e === "terminal-open-dialer") {
62
+ let e = b(typeof t?.number == "string" ? t.number : "");
63
+ return await g.openDialer(e ? { number: e } : void 0), {
64
+ opened: !0,
65
+ number: e || null,
66
+ viewType: "tui"
67
+ };
68
+ }
69
+ if (e === "terminal-save-call-transcript") {
70
+ let e = typeof t?.callId == "string" ? t.callId.trim() : "", n = typeof t?.transcript == "string" ? t.transcript.trim() : "", r = typeof t?.summary == "string" ? t.summary.trim() : "";
71
+ if (!e) throw Error("callId is required");
72
+ if (!n) throw Error("transcript is required");
73
+ return {
74
+ saved: !0,
75
+ updatedAt: (await g.saveCallTranscript({
76
+ callId: e,
77
+ transcript: n,
78
+ ...r ? { summary: r } : {}
79
+ })).updatedAt,
80
+ viewType: "tui"
81
+ };
82
+ }
83
+ throw Error(`Unsupported capability "${e}"`);
84
+ }
85
+ //#endregion
86
+ //#region src/components/PhoneSpatialView.tsx
87
+ var w = [
88
+ "1",
89
+ "2",
90
+ "3",
91
+ "4",
92
+ "5",
93
+ "6",
94
+ "7",
95
+ "8",
96
+ "9",
97
+ "*",
98
+ "0",
99
+ "#"
100
+ ];
101
+ function T(e) {
102
+ switch (e) {
103
+ case "missed": return "danger";
104
+ case "incoming": return "success";
105
+ case "outgoing": return "primary";
106
+ default: return "muted";
107
+ }
108
+ }
109
+ function E(e) {
110
+ switch (e) {
111
+ case "missed": return "x";
112
+ case "incoming": return "<";
113
+ case "outgoing": return ">";
114
+ case "voicemail": return "o";
115
+ default: return ".";
116
+ }
117
+ }
118
+ function D(e, t) {
119
+ let n = String(e.type ?? "").toLowerCase(), r;
120
+ switch (n) {
121
+ case "incoming":
122
+ case "answered_externally":
123
+ r = "incoming";
124
+ break;
125
+ case "outgoing":
126
+ r = "outgoing";
127
+ break;
128
+ case "missed":
129
+ case "rejected":
130
+ case "blocked":
131
+ r = "missed";
132
+ break;
133
+ case "voicemail":
134
+ r = "voicemail";
135
+ break;
136
+ default: r = "unknown";
137
+ }
138
+ return {
139
+ id: e.id,
140
+ name: e.cachedName?.trim() || e.number || "Unknown",
141
+ number: e.number ?? "",
142
+ when: t,
143
+ direction: r
144
+ };
145
+ }
146
+ function O({ snapshot: e, onAction: t }) {
147
+ let s = (e) => () => t?.(e);
148
+ return /* @__PURE__ */ h(r, {
149
+ gap: 1,
150
+ padding: 1,
151
+ children: [
152
+ /* @__PURE__ */ h(a, {
153
+ gap: 1,
154
+ align: "center",
155
+ children: [/* @__PURE__ */ m(c, {
156
+ style: "caption",
157
+ tone: e.callReady ? "success" : "danger",
158
+ grow: 1,
159
+ children: e.callReady ? "call-ready" : "call-blocked"
160
+ }), /* @__PURE__ */ m(c, {
161
+ style: "caption",
162
+ tone: "muted",
163
+ children: e.loading ? "loading" : `${e.calls.length} recent`
164
+ })]
165
+ }),
166
+ e.error ? /* @__PURE__ */ m(c, {
167
+ tone: "danger",
168
+ style: "caption",
169
+ children: e.error
170
+ }) : null,
171
+ /* @__PURE__ */ m(i, { label: "dialer" }),
172
+ /* @__PURE__ */ m(c, {
173
+ style: "subheading",
174
+ align: "center",
175
+ children: e.dialed || " "
176
+ }),
177
+ /* @__PURE__ */ m(a, {
178
+ gap: 1,
179
+ wrap: !0,
180
+ justify: "center",
181
+ children: w.map((e) => /* @__PURE__ */ m(n, {
182
+ variant: "outline",
183
+ tone: "default",
184
+ width: 5,
185
+ agent: `key-${e}`,
186
+ onPress: s(`key:${e}`),
187
+ children: e
188
+ }, e))
189
+ }),
190
+ /* @__PURE__ */ h(a, {
191
+ gap: 1,
192
+ wrap: !0,
193
+ children: [
194
+ /* @__PURE__ */ m(n, {
195
+ variant: "outline",
196
+ tone: "default",
197
+ width: 5,
198
+ agent: "plus",
199
+ onPress: s("key:+"),
200
+ children: "+"
201
+ }),
202
+ /* @__PURE__ */ m(n, {
203
+ grow: 1,
204
+ agent: "call",
205
+ onPress: s("call"),
206
+ children: "Call"
207
+ }),
208
+ /* @__PURE__ */ m(n, {
209
+ variant: "outline",
210
+ tone: "default",
211
+ grow: 1,
212
+ agent: "open-dialer",
213
+ onPress: s("open-dialer"),
214
+ children: "Open dialer"
215
+ }),
216
+ /* @__PURE__ */ m(n, {
217
+ variant: "ghost",
218
+ tone: "danger",
219
+ agent: "backspace",
220
+ onPress: s("backspace"),
221
+ children: "Del"
222
+ })
223
+ ]
224
+ }),
225
+ /* @__PURE__ */ m(a, {
226
+ gap: 1,
227
+ justify: "center",
228
+ children: /* @__PURE__ */ m(n, {
229
+ variant: "ghost",
230
+ tone: "default",
231
+ agent: "contacts",
232
+ onPress: s("contacts"),
233
+ children: "Contacts"
234
+ })
235
+ }),
236
+ /* @__PURE__ */ m(i, { label: "recent" }),
237
+ e.calls.length === 0 ? /* @__PURE__ */ m(c, {
238
+ tone: "muted",
239
+ align: "center",
240
+ style: "caption",
241
+ children: "None"
242
+ }) : /* @__PURE__ */ m(o, {
243
+ gap: 0,
244
+ children: e.calls.slice(0, 8).map((e) => /* @__PURE__ */ h(a, {
245
+ gap: 1,
246
+ align: "center",
247
+ agent: `call-${e.id}`,
248
+ children: [
249
+ /* @__PURE__ */ m(c, {
250
+ tone: T(e.direction),
251
+ children: E(e.direction)
252
+ }),
253
+ /* @__PURE__ */ h(l, {
254
+ gap: 0,
255
+ grow: 1,
256
+ children: [/* @__PURE__ */ m(c, {
257
+ bold: !0,
258
+ wrap: !1,
259
+ children: e.name
260
+ }), e.name === e.number ? null : /* @__PURE__ */ m(c, {
261
+ style: "caption",
262
+ tone: "muted",
263
+ wrap: !1,
264
+ children: e.number
265
+ })]
266
+ }),
267
+ /* @__PURE__ */ m(c, {
268
+ style: "caption",
269
+ tone: "muted",
270
+ children: e.when
271
+ }),
272
+ /* @__PURE__ */ m(n, {
273
+ variant: "ghost",
274
+ tone: "primary",
275
+ agent: `call:${e.id}`,
276
+ onPress: s(`call-number:${e.number}`),
277
+ children: "Call"
278
+ })
279
+ ]
280
+ }, e.id))
281
+ })
282
+ ]
283
+ });
284
+ }
285
+ //#endregion
286
+ //#region src/components/PhoneView.tsx
287
+ function k(e) {
288
+ let t = new Date(e);
289
+ if (Number.isNaN(t.getTime())) return "";
290
+ let n = /* @__PURE__ */ new Date();
291
+ return t.getFullYear() === n.getFullYear() && t.getMonth() === n.getMonth() && t.getDate() === n.getDate() ? t.toLocaleTimeString(void 0, {
292
+ hour: "2-digit",
293
+ minute: "2-digit"
294
+ }) : t.toLocaleString(void 0, {
295
+ month: "short",
296
+ day: "numeric",
297
+ hour: "2-digit",
298
+ minute: "2-digit"
299
+ });
300
+ }
301
+ function A() {
302
+ typeof window > "u" || window.dispatchEvent(new CustomEvent("eliza:navigate:view", { detail: {
303
+ viewId: "contacts",
304
+ viewPath: "/contacts"
305
+ } }));
306
+ }
307
+ function j() {
308
+ let [e, n] = p(""), [r, i] = p(!1), [a, o] = p([]), [c, l] = p(!1), [h, _] = p(null), v = u(async () => {
309
+ l(!0), _(null);
310
+ try {
311
+ let e = await g.requestPermissions().catch(() => null);
312
+ if (e && e.phone !== "granted") {
313
+ o([]), i(!1), _("Phone access is needed for recent calls and dialing. Grant it in your device settings, then retry.");
314
+ return;
315
+ }
316
+ let [t, { calls: n }] = await Promise.all([g.getStatus().catch(() => null), g.listRecentCalls({ limit: 50 })]);
317
+ i(t?.canPlaceCalls ?? !0), o(n.map((e) => D(e, k(e.date))));
318
+ } catch (e) {
319
+ _(e instanceof Error ? e.message : String(e)), o([]), i(!1);
320
+ } finally {
321
+ l(!1);
322
+ }
323
+ }, []);
324
+ d(() => {
325
+ let e = t();
326
+ e && (_(null), n(e));
327
+ }, []);
328
+ let y = f(!1);
329
+ d(() => {
330
+ y.current || (y.current = !0, v());
331
+ let e = setInterval(() => {
332
+ v();
333
+ }, 2e4);
334
+ return () => clearInterval(e);
335
+ }, [v]);
336
+ let x = u(async (e) => {
337
+ let t = b(e);
338
+ if (!t) {
339
+ _("Enter a number to call.");
340
+ return;
341
+ }
342
+ _(null);
343
+ try {
344
+ await g.placeCall({ number: t });
345
+ } catch (e) {
346
+ _(e instanceof Error ? e.message : String(e));
347
+ }
348
+ }, []), S = u(async () => {
349
+ let t = b(e);
350
+ _(null);
351
+ try {
352
+ await g.openDialer(t ? { number: t } : void 0);
353
+ } catch (e) {
354
+ _(e instanceof Error ? e.message : String(e));
355
+ }
356
+ }, [e]), C = u((t) => {
357
+ if (t.startsWith("key:")) {
358
+ let e = t.slice(4);
359
+ if (_(null), e === "+") {
360
+ n((e) => e.length === 0 ? "+" : e);
361
+ return;
362
+ }
363
+ n((t) => `${t}${e}`);
364
+ return;
365
+ }
366
+ if (t.startsWith("call-number:")) {
367
+ x(t.slice(12));
368
+ return;
369
+ }
370
+ switch (t) {
371
+ case "call":
372
+ x(e);
373
+ return;
374
+ case "open-dialer":
375
+ S();
376
+ return;
377
+ case "backspace":
378
+ _(null), n((e) => e.slice(0, -1));
379
+ return;
380
+ case "contacts":
381
+ A();
382
+ return;
383
+ case "refresh":
384
+ v();
385
+ return;
386
+ }
387
+ }, [
388
+ e,
389
+ S,
390
+ x,
391
+ v
392
+ ]);
393
+ return /* @__PURE__ */ m(s, { children: /* @__PURE__ */ m(O, {
394
+ snapshot: {
395
+ callReady: r,
396
+ dialed: e,
397
+ calls: a,
398
+ loading: c,
399
+ error: h
400
+ },
401
+ onAction: C
402
+ }) });
403
+ }
404
+ //#endregion
405
+ export { j as PhoneView, C as interact };
406
+
407
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","names":[],"sources":["../../../plugin-native-phone/dist/esm/index.js","../../src/components/PhoneAppView.helpers.ts","../../src/components/PhoneAppView.interact.ts","../../src/components/PhoneSpatialView.tsx","../../src/components/PhoneView.tsx"],"sourcesContent":["import { registerPlugin } from \"@capacitor/core\";\nexport * from \"./definitions\";\nconst loadWeb = () => import(\"./web\").then((m) => new m.PhoneWeb());\nexport const Phone = registerPlugin(\"ElizaPhone\", {\n web: loadWeb,\n});\n//# sourceMappingURL=index.js.map","// Pure phone data helpers shared between PhoneAppView.tsx (the React views) and\n// PhoneAppView.interact.ts (the terminal capability handler). Split out so the\n// .tsx file exports only React components and stays Fast-Refresh-compatible\n// (Vite full-reloads a component file that also exports plain functions).\n\nimport type { CallLogEntry } from \"@elizaos/capacitor-phone\";\nimport { Phone } from \"@elizaos/capacitor-phone\";\n\nconst DEFAULT_CALL_LOG_LIMIT = 50;\nconst MAX_CALL_LOG_LIMIT = 200;\n\nexport function callLabelFor(entry: CallLogEntry): string {\n if (entry.cachedName && entry.cachedName.trim().length > 0) {\n return entry.cachedName.trim();\n }\n if (entry.number && entry.number.trim().length > 0) {\n return entry.number.trim();\n }\n return \"Unknown\";\n}\n\n/** Strip whitespace and visual separators while keeping leading + and digits. */\nexport function normalizeNumber(input: string): string {\n const trimmed = input.trim();\n if (!trimmed) return \"\";\n const leadingPlus = trimmed.startsWith(\"+\") ? \"+\" : \"\";\n return `${leadingPlus}${trimmed.replace(/[^0-9]/g, \"\")}`;\n}\n\nfunction normalizeCallLogLimit(limit: unknown): number {\n if (!Number.isFinite(limit) || typeof limit !== \"number\") {\n return DEFAULT_CALL_LOG_LIMIT;\n }\n return Math.min(MAX_CALL_LOG_LIMIT, Math.max(1, Math.trunc(limit)));\n}\n\nexport async function loadPhoneState(options?: {\n limit?: unknown;\n number?: string;\n}) {\n const normalizedNumber =\n typeof options?.number === \"string\" ? normalizeNumber(options.number) : \"\";\n const [status, recent] = await Promise.all([\n Phone.getStatus().catch(() => null),\n Phone.listRecentCalls({\n limit: normalizeCallLogLimit(options?.limit),\n ...(normalizedNumber ? { number: normalizedNumber } : {}),\n }),\n ]);\n return {\n status,\n calls: recent.calls,\n };\n}\n","// View-bundle `interact` capability handler, split out of PhoneAppView.tsx so\n// that file exports only React components and stays Fast-Refresh-compatible\n// (Vite would full-reload a component file that also exports a plain function).\n// The view bundle re-exports `interact` via ./phone-view-bundle.ts.\n\nimport { Phone } from \"@elizaos/capacitor-phone\";\nimport {\n callLabelFor,\n loadPhoneState,\n normalizeNumber,\n} from \"./PhoneAppView.helpers.ts\";\n\nexport async function interact(\n capability: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n if (capability === \"terminal-phone-state\") {\n const state = await loadPhoneState({\n limit: params?.limit,\n number: typeof params?.number === \"string\" ? params.number : undefined,\n });\n return {\n viewType: \"tui\",\n status: state.status,\n calls: state.calls.map((call) => ({\n id: call.id,\n number: call.number,\n cachedName: call.cachedName,\n label: callLabelFor(call),\n date: call.date,\n durationSeconds: call.durationSeconds,\n type: call.type,\n isNew: call.isNew,\n agentSummary: call.agentSummary,\n agentTranscript: call.agentTranscript,\n })),\n };\n }\n\n if (capability === \"terminal-place-call\") {\n const number = normalizeNumber(\n typeof params?.number === \"string\" ? params.number : \"\",\n );\n if (!number) throw new Error(\"number is required\");\n await Phone.placeCall({ number });\n return { placed: true, number, viewType: \"tui\" };\n }\n\n if (capability === \"terminal-open-dialer\") {\n const number = normalizeNumber(\n typeof params?.number === \"string\" ? params.number : \"\",\n );\n await Phone.openDialer(number ? { number } : undefined);\n return { opened: true, number: number || null, viewType: \"tui\" };\n }\n\n if (capability === \"terminal-save-call-transcript\") {\n const callId =\n typeof params?.callId === \"string\" ? params.callId.trim() : \"\";\n const transcript =\n typeof params?.transcript === \"string\" ? params.transcript.trim() : \"\";\n const summary =\n typeof params?.summary === \"string\" ? params.summary.trim() : \"\";\n if (!callId) throw new Error(\"callId is required\");\n if (!transcript) throw new Error(\"transcript is required\");\n const result = await Phone.saveCallTranscript({\n callId,\n transcript,\n ...(summary ? { summary } : {}),\n });\n return { saved: true, updatedAt: result.updatedAt, viewType: \"tui\" };\n }\n\n throw new Error(`Unsupported capability \"${capability}\"`);\n}\n","/**\n * PhoneSpatialView - the phone surface authored once with the spatial\n * vocabulary, so it renders correctly wherever it is displayed:\n *\n * - GUI / XR - mounted in `<SpatialSurface>` (DOM; XR scales up).\n * - TUI - rendered to real terminal lines by the agent terminal, via\n * `registerSpatialTerminalView` (see `register-terminal-view.ts`).\n *\n * It is purely presentational (a snapshot + an action callback in, primitives\n * out) and imports only the cross-modality primitives plus a type-only view of\n * the native call log, so it is safe to render in the Node agent process where\n * the terminal lives (no Capacitor runtime import).\n */\n\nimport type { CallLogEntry } from \"@elizaos/capacitor-phone\";\nimport {\n Button,\n Card,\n Divider,\n HStack,\n List,\n type SpatialTone,\n Text,\n VStack,\n} from \"@elizaos/ui/spatial\";\n\nexport interface PhoneCallRow {\n id: string;\n /** Display name: cached contact name, else the number. */\n name: string;\n number: string;\n /** Pre-formatted relative/short time. */\n when: string;\n direction: \"incoming\" | \"outgoing\" | \"missed\" | \"voicemail\" | \"unknown\";\n}\n\nexport interface PhoneSnapshot {\n callReady: boolean;\n dialed: string;\n calls: PhoneCallRow[];\n loading?: boolean;\n error?: string | null;\n}\n\nconst DIAL_KEYS = [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"*\", \"0\", \"#\"];\n\nfunction directionTone(direction: PhoneCallRow[\"direction\"]): SpatialTone {\n switch (direction) {\n case \"missed\":\n return \"danger\";\n case \"incoming\":\n return \"success\";\n case \"outgoing\":\n return \"primary\";\n default:\n return \"muted\";\n }\n}\n\nfunction directionMark(direction: PhoneCallRow[\"direction\"]): string {\n switch (direction) {\n case \"missed\":\n return \"x\";\n case \"incoming\":\n return \"<\";\n case \"outgoing\":\n return \">\";\n case \"voicemail\":\n return \"o\";\n default:\n return \".\";\n }\n}\n\n/** Map a native call-log entry to the presentational row shape. */\nexport function toPhoneCallRow(\n entry: CallLogEntry,\n when: string,\n): PhoneCallRow {\n const type = String(entry.type ?? \"\").toLowerCase();\n // Collapse the native call-log types down to the four directions the row\n // renders: rejected/blocked read as missed, answered_externally as incoming.\n let direction: PhoneCallRow[\"direction\"];\n switch (type) {\n case \"incoming\":\n case \"answered_externally\":\n direction = \"incoming\";\n break;\n case \"outgoing\":\n direction = \"outgoing\";\n break;\n case \"missed\":\n case \"rejected\":\n case \"blocked\":\n direction = \"missed\";\n break;\n case \"voicemail\":\n direction = \"voicemail\";\n break;\n default:\n direction = \"unknown\";\n }\n return {\n id: entry.id,\n name: entry.cachedName?.trim() || entry.number || \"Unknown\",\n number: entry.number ?? \"\",\n when,\n direction,\n };\n}\n\nexport interface PhoneSpatialViewProps {\n snapshot: PhoneSnapshot;\n /**\n * Dispatched action ids: `key:<digit>` (digit, `*`, `#`, or `+`), `call`,\n * `open-dialer`, `backspace`, `contacts`, `call-number:<number>` (place a\n * call to a recent-call row), `refresh`.\n */\n onAction?: (action: string) => void;\n}\n\nexport function PhoneSpatialView({\n snapshot,\n onAction,\n}: PhoneSpatialViewProps) {\n const dispatch = (action: string) => () => onAction?.(action);\n return (\n <Card gap={1} padding={1}>\n <HStack gap={1} align=\"center\">\n <Text\n style=\"caption\"\n tone={snapshot.callReady ? \"success\" : \"danger\"}\n grow={1}\n >\n {snapshot.callReady ? \"call-ready\" : \"call-blocked\"}\n </Text>\n <Text style=\"caption\" tone=\"muted\">\n {snapshot.loading ? \"loading\" : `${snapshot.calls.length} recent`}\n </Text>\n </HStack>\n\n {snapshot.error ? (\n <Text tone=\"danger\" style=\"caption\">\n {snapshot.error}\n </Text>\n ) : null}\n\n <Divider label=\"dialer\" />\n <Text style=\"subheading\" align=\"center\">\n {snapshot.dialed || \" \"}\n </Text>\n <HStack gap={1} wrap justify=\"center\">\n {DIAL_KEYS.map((k) => (\n <Button\n key={k}\n variant=\"outline\"\n tone=\"default\"\n width={5}\n agent={`key-${k}`}\n onPress={dispatch(`key:${k}`)}\n >\n {k}\n </Button>\n ))}\n </HStack>\n <HStack gap={1} wrap>\n <Button\n variant=\"outline\"\n tone=\"default\"\n width={5}\n agent=\"plus\"\n onPress={dispatch(\"key:+\")}\n >\n +\n </Button>\n <Button grow={1} agent=\"call\" onPress={dispatch(\"call\")}>\n Call\n </Button>\n <Button\n variant=\"outline\"\n tone=\"default\"\n grow={1}\n agent=\"open-dialer\"\n onPress={dispatch(\"open-dialer\")}\n >\n Open dialer\n </Button>\n <Button\n variant=\"ghost\"\n tone=\"danger\"\n agent=\"backspace\"\n onPress={dispatch(\"backspace\")}\n >\n Del\n </Button>\n </HStack>\n <HStack gap={1} justify=\"center\">\n <Button\n variant=\"ghost\"\n tone=\"default\"\n agent=\"contacts\"\n onPress={dispatch(\"contacts\")}\n >\n Contacts\n </Button>\n </HStack>\n\n <Divider label=\"recent\" />\n {snapshot.calls.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n None\n </Text>\n ) : (\n <List gap={0}>\n {snapshot.calls.slice(0, 8).map((call) => (\n <HStack\n key={call.id}\n gap={1}\n align=\"center\"\n agent={`call-${call.id}`}\n >\n <Text tone={directionTone(call.direction)}>\n {directionMark(call.direction)}\n </Text>\n <VStack gap={0} grow={1}>\n <Text bold wrap={false}>\n {call.name}\n </Text>\n {call.name !== call.number ? (\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n {call.number}\n </Text>\n ) : null}\n </VStack>\n <Text style=\"caption\" tone=\"muted\">\n {call.when}\n </Text>\n <Button\n variant=\"ghost\"\n tone=\"primary\"\n agent={`call:${call.id}`}\n onPress={dispatch(`call-number:${call.number}`)}\n >\n Call\n </Button>\n </HStack>\n ))}\n </List>\n )}\n </Card>\n );\n}\n","/**\n * PhoneView — the single GUI/XR data wrapper for the Phone surface.\n *\n * It owns the live Android data (call-log fetch, dialer state, pending-number\n * handoff, place-call / open-dialer / Contacts-link actions) and renders the\n * one presentational {@link PhoneSpatialView} inside a {@link SpatialSurface}.\n * Omitting the `modality` prop lets `SpatialSurface` auto-detect GUI vs XR via\n * `window.__elizaXRContext`, so the SAME component serves both surfaces. The\n * TUI surface renders the same `PhoneSpatialView` through the terminal registry\n * (see `register-terminal-view.tsx`).\n */\n\nimport { Phone } from \"@elizaos/capacitor-phone\";\nimport { consumePendingPhoneNumber } from \"@elizaos/ui/app-navigate-view\";\nimport { SpatialSurface } from \"@elizaos/ui/spatial\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { normalizeNumber } from \"./PhoneAppView.helpers.ts\";\nimport {\n type PhoneCallRow,\n type PhoneSnapshot,\n PhoneSpatialView,\n toPhoneCallRow,\n} from \"./PhoneSpatialView.tsx\";\n\n/** Short relative/absolute timestamp for a recent-call row. */\nfunction formatWhen(epochMs: number): string {\n const date = new Date(epochMs);\n if (Number.isNaN(date.getTime())) return \"\";\n const now = new Date();\n const sameDay =\n date.getFullYear() === now.getFullYear() &&\n date.getMonth() === now.getMonth() &&\n date.getDate() === now.getDate();\n if (sameDay) {\n return date.toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n }\n return date.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/** Open the separate Contacts view via the navigation bus. */\nfunction openContacts(): void {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(\"eliza:navigate:view\", {\n detail: { viewId: \"contacts\", viewPath: \"/contacts\" },\n }),\n );\n}\n\nexport function PhoneView() {\n const [dialed, setDialed] = useState(\"\");\n const [callReady, setCallReady] = useState(false);\n const [calls, setCalls] = useState<PhoneCallRow[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const refreshCalls = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const status = await Phone.requestPermissions().catch(() => null);\n if (status && status.phone !== \"granted\") {\n setCalls([]);\n setCallReady(false);\n setError(\n \"Phone access is needed for recent calls and dialing. Grant it in your device settings, then retry.\",\n );\n return;\n }\n const [phoneStatus, { calls: fetched }] = await Promise.all([\n Phone.getStatus().catch(() => null),\n Phone.listRecentCalls({ limit: 50 }),\n ]);\n setCallReady(phoneStatus?.canPlaceCalls ?? true);\n setCalls(\n fetched.map((entry) => toPhoneCallRow(entry, formatWhen(entry.date))),\n );\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setCalls([]);\n setCallReady(false);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Seed the dialer from a cross-view handoff (e.g. a Contacts \"Call\" control).\n // Single-shot: the number is consumed so a later plain navigation does not\n // re-seed a stale value.\n useEffect(() => {\n const pending = consumePendingPhoneNumber();\n if (pending) {\n setError(null);\n setDialed(pending);\n }\n }, []);\n\n // Load the recent-calls log on mount, then keep it fresh with a quiet 20s\n // poll. Torn down on unmount.\n const autoLoadedRef = useRef(false);\n useEffect(() => {\n if (!autoLoadedRef.current) {\n autoLoadedRef.current = true;\n void refreshCalls();\n }\n const interval = setInterval(() => {\n void refreshCalls();\n }, 20_000);\n return () => clearInterval(interval);\n }, [refreshCalls]);\n\n const placeCall = useCallback(async (number: string) => {\n const normalized = normalizeNumber(number);\n if (!normalized) {\n setError(\"Enter a number to call.\");\n return;\n }\n setError(null);\n try {\n await Phone.placeCall({ number: normalized });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n }\n }, []);\n\n const openDialer = useCallback(async () => {\n const number = normalizeNumber(dialed);\n setError(null);\n try {\n await Phone.openDialer(number ? { number } : undefined);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n }\n }, [dialed]);\n\n const onAction = useCallback(\n (action: string) => {\n if (action.startsWith(\"key:\")) {\n const key = action.slice(4);\n setError(null);\n if (key === \"+\") {\n // Leading + only when the input is empty (international dialing).\n setDialed((prev) => (prev.length === 0 ? \"+\" : prev));\n return;\n }\n setDialed((prev) => `${prev}${key}`);\n return;\n }\n if (action.startsWith(\"call-number:\")) {\n void placeCall(action.slice(\"call-number:\".length));\n return;\n }\n switch (action) {\n case \"call\":\n void placeCall(dialed);\n return;\n case \"open-dialer\":\n void openDialer();\n return;\n case \"backspace\":\n setError(null);\n setDialed((prev) => prev.slice(0, -1));\n return;\n case \"contacts\":\n openContacts();\n return;\n case \"refresh\":\n void refreshCalls();\n return;\n }\n },\n [dialed, openDialer, placeCall, refreshCalls],\n );\n\n const snapshot: PhoneSnapshot = {\n callReady,\n dialed,\n calls,\n loading,\n error,\n };\n\n return (\n <SpatialSurface>\n <PhoneSpatialView snapshot={snapshot} onAction={onAction} />\n </SpatialSurface>\n );\n}\n"],"mappings":"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"}