@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,14 @@
1
+ import type React from "react";
2
+ interface ChatProps {
3
+ pairedAgentUrl: string | null;
4
+ onOpenPairing(): void;
5
+ onOpenRemoteSession(): void;
6
+ remoteSessionAvailable: boolean;
7
+ }
8
+ /**
9
+ * Overlay-chat-friendly companion home. Chat streaming lives in the host chat;
10
+ * this view only exposes pairing and remote-session state.
11
+ */
12
+ export declare function Chat({ pairedAgentUrl, onOpenPairing, onOpenRemoteSession, remoteSessionAvailable, }: ChatProps): React.JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=Chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/companion/components/Chat.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,UAAU,SAAS;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,IAAI,IAAI,CAAC;IACtB,mBAAmB,IAAI,IAAI,CAAC;IAC5B,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,EACnB,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,sBAAsB,GACvB,EAAE,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA8D/B"}
@@ -0,0 +1,195 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Link2, MonitorUp, QrCode, Radio } from "lucide-react";
3
+ import { useEffect } from "react";
4
+ import { agentUrl as configuredAgentUrl, logger } from "../services/index.js";
5
+ function Chat({
6
+ pairedAgentUrl,
7
+ onOpenPairing,
8
+ onOpenRemoteSession,
9
+ remoteSessionAvailable
10
+ }) {
11
+ const resolvedAgentUrl = pairedAgentUrl ?? configuredAgentUrl();
12
+ const paired = resolvedAgentUrl !== null;
13
+ useEffect(() => {
14
+ logger.info("[Chat] mount", {
15
+ resolvedAgentUrl,
16
+ remoteSessionAvailable
17
+ });
18
+ }, [resolvedAgentUrl, remoteSessionAvailable]);
19
+ return /* @__PURE__ */ jsxs("main", { style: styles.root, children: [
20
+ /* @__PURE__ */ jsxs("header", { style: styles.header, children: [
21
+ /* @__PURE__ */ jsx("h2", { style: styles.title, children: "Companion" }),
22
+ /* @__PURE__ */ jsxs("div", { style: styles.statusGrid, children: [
23
+ /* @__PURE__ */ jsx(
24
+ StatusTile,
25
+ {
26
+ icon: /* @__PURE__ */ jsx(Radio, { size: 18 }),
27
+ active: paired,
28
+ value: paired ? "Paired" : "Offline"
29
+ }
30
+ ),
31
+ /* @__PURE__ */ jsx(
32
+ StatusTile,
33
+ {
34
+ icon: /* @__PURE__ */ jsx(MonitorUp, { size: 18 }),
35
+ active: remoteSessionAvailable,
36
+ value: remoteSessionAvailable ? "Live" : "Idle"
37
+ }
38
+ )
39
+ ] })
40
+ ] }),
41
+ /* @__PURE__ */ jsxs("section", { style: styles.body, children: [
42
+ /* @__PURE__ */ jsxs("div", { style: styles.agentCard, children: [
43
+ /* @__PURE__ */ jsx(Link2, { size: 18, color: paired ? "#22c55e" : "#6b7280" }),
44
+ /* @__PURE__ */ jsx("span", { style: styles.url, children: resolvedAgentUrl ?? "No agent" })
45
+ ] }),
46
+ /* @__PURE__ */ jsxs("div", { style: styles.actions, children: [
47
+ /* @__PURE__ */ jsxs(
48
+ "button",
49
+ {
50
+ type: "button",
51
+ onClick: onOpenPairing,
52
+ style: paired ? styles.secondaryAction : styles.primaryAction,
53
+ children: [
54
+ /* @__PURE__ */ jsx(QrCode, { size: 18 }),
55
+ /* @__PURE__ */ jsx("span", { children: paired ? "Re-pair" : "Pair" })
56
+ ]
57
+ }
58
+ ),
59
+ /* @__PURE__ */ jsxs(
60
+ "button",
61
+ {
62
+ type: "button",
63
+ onClick: onOpenRemoteSession,
64
+ disabled: !remoteSessionAvailable,
65
+ style: remoteSessionAvailable ? styles.primaryAction : styles.disabledAction,
66
+ children: [
67
+ /* @__PURE__ */ jsx(MonitorUp, { size: 18 }),
68
+ /* @__PURE__ */ jsx("span", { children: "Remote" })
69
+ ]
70
+ }
71
+ )
72
+ ] })
73
+ ] })
74
+ ] });
75
+ }
76
+ function StatusTile({
77
+ icon,
78
+ active,
79
+ value
80
+ }) {
81
+ return /* @__PURE__ */ jsxs("div", { style: styles.statusTile, children: [
82
+ /* @__PURE__ */ jsx("span", { style: active ? styles.statusIconActive : styles.statusIcon, children: icon }),
83
+ /* @__PURE__ */ jsx("span", { style: styles.statusValue, children: value })
84
+ ] });
85
+ }
86
+ const styles = {
87
+ root: {
88
+ display: "flex",
89
+ flexDirection: "column",
90
+ height: "100%",
91
+ background: "#0b0f14",
92
+ color: "#f8fafc"
93
+ },
94
+ header: {
95
+ padding: 20,
96
+ display: "flex",
97
+ flexDirection: "column",
98
+ gap: 12,
99
+ borderBottom: "1px solid #1f2937"
100
+ },
101
+ title: { margin: 0, fontSize: 20, fontWeight: 650 },
102
+ statusGrid: {
103
+ display: "grid",
104
+ gridTemplateColumns: "1fr 1fr",
105
+ gap: 8
106
+ },
107
+ statusTile: {
108
+ minHeight: 68,
109
+ display: "flex",
110
+ alignItems: "center",
111
+ justifyContent: "center",
112
+ gap: 10,
113
+ border: "1px solid #1f2937",
114
+ borderRadius: 8,
115
+ background: "#111827"
116
+ },
117
+ statusIcon: { display: "flex", color: "#6b7280" },
118
+ statusIconActive: { display: "flex", color: "#22c55e" },
119
+ statusValue: { fontSize: 14, fontWeight: 650 },
120
+ body: {
121
+ flex: 1,
122
+ padding: 20,
123
+ overflowY: "auto",
124
+ display: "flex",
125
+ flexDirection: "column",
126
+ gap: 12
127
+ },
128
+ agentCard: {
129
+ minHeight: 56,
130
+ display: "flex",
131
+ alignItems: "center",
132
+ gap: 10,
133
+ border: "1px solid #1f2937",
134
+ borderRadius: 8,
135
+ background: "#111827",
136
+ padding: "0 14px"
137
+ },
138
+ actions: {
139
+ display: "grid",
140
+ gridTemplateColumns: "1fr 1fr",
141
+ gap: 8
142
+ },
143
+ primaryAction: {
144
+ minHeight: 52,
145
+ display: "flex",
146
+ alignItems: "center",
147
+ justifyContent: "center",
148
+ gap: 8,
149
+ background: "#f97316",
150
+ color: "#111827",
151
+ border: "none",
152
+ borderRadius: 8,
153
+ fontSize: 14,
154
+ fontWeight: 700
155
+ },
156
+ secondaryAction: {
157
+ minHeight: 52,
158
+ display: "flex",
159
+ alignItems: "center",
160
+ justifyContent: "center",
161
+ gap: 8,
162
+ background: "#111827",
163
+ color: "#e5e7eb",
164
+ border: "1px solid #374151",
165
+ borderRadius: 8,
166
+ fontSize: 14,
167
+ fontWeight: 650
168
+ },
169
+ disabledAction: {
170
+ minHeight: 52,
171
+ display: "flex",
172
+ alignItems: "center",
173
+ justifyContent: "center",
174
+ gap: 8,
175
+ background: "#111827",
176
+ color: "#6b7280",
177
+ border: "1px solid #1f2937",
178
+ borderRadius: 8,
179
+ fontSize: 14,
180
+ fontWeight: 650
181
+ },
182
+ url: {
183
+ minWidth: 0,
184
+ overflow: "hidden",
185
+ textOverflow: "ellipsis",
186
+ whiteSpace: "nowrap",
187
+ opacity: 0.75,
188
+ fontSize: 12,
189
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace"
190
+ }
191
+ };
192
+ export {
193
+ Chat
194
+ };
195
+ //# sourceMappingURL=Chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/companion/components/Chat.tsx"],"sourcesContent":["import { Link2, MonitorUp, QrCode, Radio } from \"lucide-react\";\nimport type React from \"react\";\nimport { useEffect } from \"react\";\nimport { agentUrl as configuredAgentUrl, logger } from \"../services/index.js\";\n\ninterface ChatProps {\n pairedAgentUrl: string | null;\n onOpenPairing(): void;\n onOpenRemoteSession(): void;\n remoteSessionAvailable: boolean;\n}\n\n/**\n * Overlay-chat-friendly companion home. Chat streaming lives in the host chat;\n * this view only exposes pairing and remote-session state.\n */\nexport function Chat({\n pairedAgentUrl,\n onOpenPairing,\n onOpenRemoteSession,\n remoteSessionAvailable,\n}: ChatProps): React.JSX.Element {\n const resolvedAgentUrl = pairedAgentUrl ?? configuredAgentUrl();\n const paired = resolvedAgentUrl !== null;\n\n useEffect(() => {\n logger.info(\"[Chat] mount\", {\n resolvedAgentUrl,\n remoteSessionAvailable,\n });\n }, [resolvedAgentUrl, remoteSessionAvailable]);\n\n return (\n <main style={styles.root}>\n <header style={styles.header}>\n <h2 style={styles.title}>Companion</h2>\n <div style={styles.statusGrid}>\n <StatusTile\n icon={<Radio size={18} />}\n active={paired}\n value={paired ? \"Paired\" : \"Offline\"}\n />\n <StatusTile\n icon={<MonitorUp size={18} />}\n active={remoteSessionAvailable}\n value={remoteSessionAvailable ? \"Live\" : \"Idle\"}\n />\n </div>\n </header>\n\n <section style={styles.body}>\n <div style={styles.agentCard}>\n <Link2 size={18} color={paired ? \"#22c55e\" : \"#6b7280\"} />\n <span style={styles.url}>{resolvedAgentUrl ?? \"No agent\"}</span>\n </div>\n\n <div style={styles.actions}>\n <button\n type=\"button\"\n onClick={onOpenPairing}\n style={paired ? styles.secondaryAction : styles.primaryAction}\n >\n <QrCode size={18} />\n <span>{paired ? \"Re-pair\" : \"Pair\"}</span>\n </button>\n\n <button\n type=\"button\"\n onClick={onOpenRemoteSession}\n disabled={!remoteSessionAvailable}\n style={\n remoteSessionAvailable\n ? styles.primaryAction\n : styles.disabledAction\n }\n >\n <MonitorUp size={18} />\n <span>Remote</span>\n </button>\n </div>\n </section>\n </main>\n );\n}\n\nfunction StatusTile({\n icon,\n active,\n value,\n}: {\n icon: React.ReactNode;\n active: boolean;\n value: string;\n}) {\n return (\n <div style={styles.statusTile}>\n <span style={active ? styles.statusIconActive : styles.statusIcon}>\n {icon}\n </span>\n <span style={styles.statusValue}>{value}</span>\n </div>\n );\n}\n\nconst styles: Record<string, React.CSSProperties> = {\n root: {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"#0b0f14\",\n color: \"#f8fafc\",\n },\n header: {\n padding: 20,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n borderBottom: \"1px solid #1f2937\",\n },\n title: { margin: 0, fontSize: 20, fontWeight: 650 },\n statusGrid: {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 8,\n },\n statusTile: {\n minHeight: 68,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 10,\n border: \"1px solid #1f2937\",\n borderRadius: 8,\n background: \"#111827\",\n },\n statusIcon: { display: \"flex\", color: \"#6b7280\" },\n statusIconActive: { display: \"flex\", color: \"#22c55e\" },\n statusValue: { fontSize: 14, fontWeight: 650 },\n body: {\n flex: 1,\n padding: 20,\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n },\n agentCard: {\n minHeight: 56,\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n border: \"1px solid #1f2937\",\n borderRadius: 8,\n background: \"#111827\",\n padding: \"0 14px\",\n },\n actions: {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 8,\n },\n primaryAction: {\n minHeight: 52,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n background: \"#f97316\",\n color: \"#111827\",\n border: \"none\",\n borderRadius: 8,\n fontSize: 14,\n fontWeight: 700,\n },\n secondaryAction: {\n minHeight: 52,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n background: \"#111827\",\n color: \"#e5e7eb\",\n border: \"1px solid #374151\",\n borderRadius: 8,\n fontSize: 14,\n fontWeight: 650,\n },\n disabledAction: {\n minHeight: 52,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n background: \"#111827\",\n color: \"#6b7280\",\n border: \"1px solid #1f2937\",\n borderRadius: 8,\n fontSize: 14,\n fontWeight: 650,\n },\n url: {\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n opacity: 0.75,\n fontSize: 12,\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, monospace\",\n },\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,9 @@
1
+ import type React from "react";
2
+ import { type PairingPayload } from "../services";
3
+ interface PairingViewProps {
4
+ onPaired(payload: PairingPayload): void;
5
+ onBack(): void;
6
+ }
7
+ export declare function Pairing({ onPaired, onBack, }: PairingViewProps): React.JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=Pairing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pairing.d.ts","sourceRoot":"","sources":["../../../src/companion/components/Pairing.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,UAAU,gBAAgB;IACxB,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IACxC,MAAM,IAAI,IAAI,CAAC;CAChB;AAOD,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,MAAM,GACP,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA+HtC"}
@@ -0,0 +1,175 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import {
3
+ CapacitorBarcodeScanner,
4
+ CapacitorBarcodeScannerTypeHint
5
+ } from "@capacitor/barcode-scanner";
6
+ import { Capacitor } from "@capacitor/core";
7
+ import { useCallback, useState } from "react";
8
+ import {
9
+ decodePairingPayload,
10
+ ElizaIntent,
11
+ logger
12
+ } from "../services/index.js";
13
+ function Pairing({
14
+ onPaired,
15
+ onBack
16
+ }) {
17
+ const [code, setCode] = useState("");
18
+ const [status, setStatus] = useState({ kind: "idle" });
19
+ const scan = useCallback(async () => {
20
+ if (!Capacitor.isNativePlatform()) {
21
+ setStatus({
22
+ kind: "error",
23
+ message: "Camera scan requires the iOS native runtime. Paste the code below."
24
+ });
25
+ return;
26
+ }
27
+ setStatus({ kind: "scanning" });
28
+ try {
29
+ logger.info("[Pairing] scanBarcode start", {});
30
+ const result = await CapacitorBarcodeScanner.scanBarcode({
31
+ hint: CapacitorBarcodeScannerTypeHint.QR_CODE,
32
+ scanInstructions: "Point the camera at the code on your Mac"
33
+ });
34
+ const payload = decodePairingPayload(result.ScanResult);
35
+ logger.info("[Pairing] pairing payload decoded", {
36
+ agentId: payload.agentId
37
+ });
38
+ onPaired(payload);
39
+ setStatus({ kind: "idle" });
40
+ } catch (err) {
41
+ logger.warn("[Pairing] scan or decode failed", {
42
+ message: err instanceof Error ? err.message : String(err)
43
+ });
44
+ setStatus({
45
+ kind: "error",
46
+ message: err instanceof Error && err.message.length > 0 ? err.message : "Could not read the QR code. Try again or enter the code below."
47
+ });
48
+ }
49
+ }, [onPaired]);
50
+ const submitManual = useCallback(
51
+ async (event) => {
52
+ event.preventDefault();
53
+ const trimmed = code.trim();
54
+ if (trimmed.length === 0) {
55
+ setStatus({
56
+ kind: "error",
57
+ message: "Paste the pairing payload shown on your Mac."
58
+ });
59
+ return;
60
+ }
61
+ logger.info("[Pairing] manual payload submit", {
62
+ length: trimmed.length
63
+ });
64
+ try {
65
+ const payload = decodePairingPayload(trimmed);
66
+ await ElizaIntent.setPairingStatus({
67
+ deviceId: payload.agentId,
68
+ agentUrl: payload.ingressUrl
69
+ });
70
+ onPaired(payload);
71
+ setStatus({ kind: "idle" });
72
+ } catch (err) {
73
+ logger.warn("[Pairing] manual payload decode failed", {
74
+ message: err instanceof Error ? err.message : String(err)
75
+ });
76
+ setStatus({
77
+ kind: "error",
78
+ message: err instanceof Error && err.message.length > 0 ? err.message : "Could not read the pairing payload. Scan the QR code or paste the full payload."
79
+ });
80
+ }
81
+ },
82
+ [code, onPaired]
83
+ );
84
+ return /* @__PURE__ */ jsxs("main", { style: styles.root, children: [
85
+ /* @__PURE__ */ jsxs("header", { style: styles.header, children: [
86
+ /* @__PURE__ */ jsx("button", { type: "button", onClick: onBack, style: styles.back, children: "Back" }),
87
+ /* @__PURE__ */ jsx("h1", { style: styles.title, children: "Pair with Eliza" })
88
+ ] }),
89
+ /* @__PURE__ */ jsxs("section", { style: styles.section, children: [
90
+ /* @__PURE__ */ jsx("p", { style: styles.hint, children: "Scan the QR code shown in the Eliza desktop app, or paste its pairing payload manually." }),
91
+ /* @__PURE__ */ jsx(
92
+ "button",
93
+ {
94
+ type: "button",
95
+ onClick: scan,
96
+ disabled: status.kind === "scanning",
97
+ style: styles.primary,
98
+ children: status.kind === "scanning" ? "Scanning..." : "Scan QR code"
99
+ }
100
+ )
101
+ ] }),
102
+ /* @__PURE__ */ jsx("section", { style: styles.section, children: /* @__PURE__ */ jsxs("form", { onSubmit: submitManual, style: styles.form, children: [
103
+ /* @__PURE__ */ jsx("label", { htmlFor: "pairing-code", style: styles.label, children: "Or paste payload" }),
104
+ /* @__PURE__ */ jsx(
105
+ "input",
106
+ {
107
+ id: "pairing-code",
108
+ value: code,
109
+ onChange: (event) => setCode(event.target.value),
110
+ inputMode: "text",
111
+ autoComplete: "off",
112
+ placeholder: "base64 pairing payload",
113
+ style: styles.input
114
+ }
115
+ ),
116
+ /* @__PURE__ */ jsx("button", { type: "submit", style: styles.secondary, children: "Pair device" })
117
+ ] }) }),
118
+ status.kind === "error" ? /* @__PURE__ */ jsx("p", { style: styles.error, children: status.message }) : null
119
+ ] });
120
+ }
121
+ const styles = {
122
+ root: {
123
+ display: "flex",
124
+ flexDirection: "column",
125
+ height: "100%",
126
+ padding: 20,
127
+ gap: 24
128
+ },
129
+ header: { display: "flex", flexDirection: "column", gap: 12 },
130
+ back: {
131
+ alignSelf: "flex-start",
132
+ background: "transparent",
133
+ border: "none",
134
+ color: "#93c5fd",
135
+ fontSize: 16,
136
+ padding: 0
137
+ },
138
+ title: { margin: 0, fontSize: 28, fontWeight: 600 },
139
+ section: { display: "flex", flexDirection: "column", gap: 12 },
140
+ hint: { margin: 0, opacity: 0.7 },
141
+ primary: {
142
+ padding: "14px 16px",
143
+ background: "#4f46e5",
144
+ color: "#fff",
145
+ border: "none",
146
+ borderRadius: 12,
147
+ fontSize: 16,
148
+ fontWeight: 600
149
+ },
150
+ secondary: {
151
+ padding: "12px 16px",
152
+ background: "#1f2937",
153
+ color: "#e5e7eb",
154
+ border: "1px solid #374151",
155
+ borderRadius: 12,
156
+ fontSize: 16
157
+ },
158
+ form: { display: "flex", flexDirection: "column", gap: 8 },
159
+ label: { fontSize: 12, opacity: 0.7, textTransform: "uppercase" },
160
+ input: {
161
+ fontSize: 24,
162
+ letterSpacing: "0.4em",
163
+ textAlign: "center",
164
+ padding: "12px 16px",
165
+ background: "#111",
166
+ border: "1px solid #333",
167
+ borderRadius: 12,
168
+ color: "#e5e7eb"
169
+ },
170
+ error: { color: "#fbbf24", margin: 0 }
171
+ };
172
+ export {
173
+ Pairing
174
+ };
175
+ //# sourceMappingURL=Pairing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/companion/components/Pairing.tsx"],"sourcesContent":["import {\n CapacitorBarcodeScanner,\n CapacitorBarcodeScannerTypeHint,\n} from \"@capacitor/barcode-scanner\";\nimport { Capacitor } from \"@capacitor/core\";\nimport type React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport {\n decodePairingPayload,\n ElizaIntent,\n logger,\n type PairingPayload,\n} from \"../services/index.js\";\n\ninterface PairingViewProps {\n onPaired(payload: PairingPayload): void;\n onBack(): void;\n}\n\ntype Status =\n | { kind: \"idle\" }\n | { kind: \"scanning\" }\n | { kind: \"error\"; message: string };\n\nexport function Pairing({\n onPaired,\n onBack,\n}: PairingViewProps): React.JSX.Element {\n const [code, setCode] = useState(\"\");\n const [status, setStatus] = useState<Status>({ kind: \"idle\" });\n\n const scan = useCallback(async () => {\n if (!Capacitor.isNativePlatform()) {\n setStatus({\n kind: \"error\",\n message:\n \"Camera scan requires the iOS native runtime. Paste the code below.\",\n });\n return;\n }\n setStatus({ kind: \"scanning\" });\n try {\n logger.info(\"[Pairing] scanBarcode start\", {});\n const result = await CapacitorBarcodeScanner.scanBarcode({\n hint: CapacitorBarcodeScannerTypeHint.QR_CODE,\n scanInstructions: \"Point the camera at the code on your Mac\",\n });\n const payload = decodePairingPayload(result.ScanResult);\n logger.info(\"[Pairing] pairing payload decoded\", {\n agentId: payload.agentId,\n });\n onPaired(payload);\n setStatus({ kind: \"idle\" });\n } catch (err) {\n logger.warn(\"[Pairing] scan or decode failed\", {\n message: err instanceof Error ? err.message : String(err),\n });\n setStatus({\n kind: \"error\",\n message:\n err instanceof Error && err.message.length > 0\n ? err.message\n : \"Could not read the QR code. Try again or enter the code below.\",\n });\n }\n }, [onPaired]);\n\n const submitManual = useCallback(\n async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const trimmed = code.trim();\n if (trimmed.length === 0) {\n setStatus({\n kind: \"error\",\n message: \"Paste the pairing payload shown on your Mac.\",\n });\n return;\n }\n logger.info(\"[Pairing] manual payload submit\", {\n length: trimmed.length,\n });\n try {\n const payload = decodePairingPayload(trimmed);\n await ElizaIntent.setPairingStatus({\n deviceId: payload.agentId,\n agentUrl: payload.ingressUrl,\n });\n onPaired(payload);\n setStatus({ kind: \"idle\" });\n } catch (err) {\n logger.warn(\"[Pairing] manual payload decode failed\", {\n message: err instanceof Error ? err.message : String(err),\n });\n setStatus({\n kind: \"error\",\n message:\n err instanceof Error && err.message.length > 0\n ? err.message\n : \"Could not read the pairing payload. Scan the QR code or paste the full payload.\",\n });\n }\n },\n [code, onPaired],\n );\n\n return (\n <main style={styles.root}>\n <header style={styles.header}>\n <button type=\"button\" onClick={onBack} style={styles.back}>\n Back\n </button>\n <h1 style={styles.title}>Pair with Eliza</h1>\n </header>\n\n <section style={styles.section}>\n <p style={styles.hint}>\n Scan the QR code shown in the Eliza desktop app, or paste its pairing\n payload manually.\n </p>\n <button\n type=\"button\"\n onClick={scan}\n disabled={status.kind === \"scanning\"}\n style={styles.primary}\n >\n {status.kind === \"scanning\" ? \"Scanning...\" : \"Scan QR code\"}\n </button>\n </section>\n\n <section style={styles.section}>\n <form onSubmit={submitManual} style={styles.form}>\n <label htmlFor=\"pairing-code\" style={styles.label}>\n Or paste payload\n </label>\n <input\n id=\"pairing-code\"\n value={code}\n onChange={(event) => setCode(event.target.value)}\n inputMode=\"text\"\n autoComplete=\"off\"\n placeholder=\"base64 pairing payload\"\n style={styles.input}\n />\n <button type=\"submit\" style={styles.secondary}>\n Pair device\n </button>\n </form>\n </section>\n\n {status.kind === \"error\" ? (\n <p style={styles.error}>{status.message}</p>\n ) : null}\n </main>\n );\n}\n\nconst styles: Record<string, React.CSSProperties> = {\n root: {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n padding: 20,\n gap: 24,\n },\n header: { display: \"flex\", flexDirection: \"column\", gap: 12 },\n back: {\n alignSelf: \"flex-start\",\n background: \"transparent\",\n border: \"none\",\n color: \"#93c5fd\",\n fontSize: 16,\n padding: 0,\n },\n title: { margin: 0, fontSize: 28, fontWeight: 600 },\n section: { display: \"flex\", flexDirection: \"column\", gap: 12 },\n hint: { margin: 0, opacity: 0.7 },\n primary: {\n padding: \"14px 16px\",\n background: \"#4f46e5\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: 12,\n fontSize: 16,\n fontWeight: 600,\n },\n secondary: {\n padding: \"12px 16px\",\n background: \"#1f2937\",\n color: \"#e5e7eb\",\n border: \"1px solid #374151\",\n borderRadius: 12,\n fontSize: 16,\n },\n form: { display: \"flex\", flexDirection: \"column\", gap: 8 },\n label: { fontSize: 12, opacity: 0.7, textTransform: \"uppercase\" },\n input: {\n fontSize: 24,\n letterSpacing: \"0.4em\",\n textAlign: \"center\",\n padding: \"12px 16px\",\n background: \"#111\",\n border: \"1px solid #333\",\n borderRadius: 12,\n color: \"#e5e7eb\",\n },\n error: { color: \"#fbbf24\", margin: 0 },\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,9 @@
1
+ import type React from "react";
2
+ /**
3
+ * The phone-companion surface — three-view Capacitor app that pairs with a
4
+ * Eliza desktop agent (QR handshake), mirrors chat, and serves as the
5
+ * remote-session viewer for the paired Mac. Formerly shipped as a standalone
6
+ * top-level app project; now rendered inside the main iOS bundle.
7
+ */
8
+ export declare function PhoneCompanionApp(): React.JSX.Element;
9
+ //# sourceMappingURL=PhoneCompanionApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhoneCompanionApp.d.ts","sourceRoot":"","sources":["../../../src/companion/components/PhoneCompanionApp.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAiB/B;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAyGrD"}
@@ -0,0 +1,174 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Capacitor } from "@capacitor/core";
3
+ import { useCallback, useEffect, useRef, useState } from "react";
4
+ import {
5
+ apnsEnabled,
6
+ agentUrl as configuredAgentUrl,
7
+ ElizaIntent,
8
+ logger,
9
+ registerPush,
10
+ useNavigation
11
+ } from "../services/index.js";
12
+ import { Chat } from "./Chat.js";
13
+ import { Pairing } from "./Pairing.js";
14
+ import { RemoteSession } from "./RemoteSession.js";
15
+ function PhoneCompanionApp() {
16
+ const nav = useNavigation();
17
+ const pushRef = useRef(nav.push);
18
+ pushRef.current = nav.push;
19
+ const [agentUrl, setAgentUrl] = useState(null);
20
+ const [pairingPayload, setPairingPayload] = useState(
21
+ null
22
+ );
23
+ const persistPairingToNative = useCallback(
24
+ async (payload) => {
25
+ if (!Capacitor.isNativePlatform()) return;
26
+ try {
27
+ await ElizaIntent.setPairingStatus({
28
+ deviceId: payload.agentId,
29
+ agentUrl: payload.ingressUrl
30
+ });
31
+ } catch (err) {
32
+ logger.warn("[PhoneCompanionApp] setPairingStatus failed", {
33
+ message: err instanceof Error ? err.message : String(err)
34
+ });
35
+ }
36
+ },
37
+ []
38
+ );
39
+ useEffect(() => {
40
+ logger.info("[PhoneCompanionApp] boot", {
41
+ apnsEnabled: apnsEnabled(),
42
+ hasConfiguredAgentUrl: configuredAgentUrl() !== null
43
+ });
44
+ ElizaIntent.getPairingStatus().then((status) => {
45
+ if (status.paired && status.agentUrl !== null) {
46
+ setAgentUrl(status.agentUrl);
47
+ }
48
+ }).catch((err) => {
49
+ logger.warn("[PhoneCompanionApp] getPairingStatus failed", {
50
+ message: err instanceof Error ? err.message : String(err)
51
+ });
52
+ });
53
+ }, []);
54
+ useEffect(() => {
55
+ if (!apnsEnabled()) return;
56
+ let disposed = false;
57
+ let handle = null;
58
+ void registerPush({
59
+ onIntent: (intent) => {
60
+ if (intent.kind === "session-start") {
61
+ logger.info(
62
+ "[PhoneCompanionApp] session.start intent -> RemoteSession",
63
+ {
64
+ agentId: intent.payload.agentId
65
+ }
66
+ );
67
+ void persistPairingToNative(intent.payload);
68
+ setPairingPayload(intent.payload);
69
+ setAgentUrl(intent.payload.ingressUrl);
70
+ pushRef.current("remote-session");
71
+ }
72
+ },
73
+ onError: (err) => {
74
+ logger.warn("[PhoneCompanionApp] push registration error", {
75
+ message: err.message
76
+ });
77
+ }
78
+ }).then((h) => {
79
+ if (disposed) {
80
+ void h.unregister();
81
+ return;
82
+ }
83
+ handle = h;
84
+ });
85
+ return () => {
86
+ disposed = true;
87
+ void handle?.unregister();
88
+ };
89
+ }, [persistPairingToNative]);
90
+ if (!nav.ready) {
91
+ return /* @__PURE__ */ jsx("main", { style: styles.loadingRoot, children: /* @__PURE__ */ jsxs("div", { style: styles.loadingPanel, children: [
92
+ /* @__PURE__ */ jsx("span", { style: styles.loadingDot }),
93
+ /* @__PURE__ */ jsx("span", { style: styles.loadingLabel, children: "Starting" })
94
+ ] }) });
95
+ }
96
+ return renderView(nav.view, {
97
+ agentUrl,
98
+ pairingPayload,
99
+ onPushPairing: () => nav.push("pairing"),
100
+ onPushRemoteSession: () => nav.push("remote-session"),
101
+ onBackToChat: () => nav.pop("chat"),
102
+ onPaired: (payload) => {
103
+ void persistPairingToNative(payload);
104
+ setPairingPayload(payload);
105
+ setAgentUrl(payload.ingressUrl);
106
+ nav.push("remote-session");
107
+ }
108
+ });
109
+ }
110
+ function renderView(view, h) {
111
+ if (view === "pairing") {
112
+ return /* @__PURE__ */ jsx(Pairing, { onPaired: h.onPaired, onBack: h.onBackToChat });
113
+ }
114
+ if (view === "remote-session") {
115
+ if (h.pairingPayload === null) {
116
+ return /* @__PURE__ */ jsx(
117
+ Chat,
118
+ {
119
+ pairedAgentUrl: h.agentUrl,
120
+ onOpenPairing: h.onPushPairing,
121
+ onOpenRemoteSession: h.onPushRemoteSession,
122
+ remoteSessionAvailable: false
123
+ }
124
+ );
125
+ }
126
+ return /* @__PURE__ */ jsx(RemoteSession, { payload: h.pairingPayload, onExit: h.onBackToChat });
127
+ }
128
+ return /* @__PURE__ */ jsx(
129
+ Chat,
130
+ {
131
+ pairedAgentUrl: h.agentUrl,
132
+ onOpenPairing: h.onPushPairing,
133
+ onOpenRemoteSession: h.onPushRemoteSession,
134
+ remoteSessionAvailable: h.pairingPayload !== null
135
+ }
136
+ );
137
+ }
138
+ const styles = {
139
+ loadingRoot: {
140
+ minHeight: "100%",
141
+ display: "grid",
142
+ placeItems: "center",
143
+ background: "#0b0f14",
144
+ color: "#f8fafc"
145
+ },
146
+ loadingPanel: {
147
+ minWidth: 160,
148
+ minHeight: 56,
149
+ display: "flex",
150
+ alignItems: "center",
151
+ justifyContent: "center",
152
+ gap: 10,
153
+ border: "1px solid #1f2937",
154
+ borderRadius: 8,
155
+ background: "#111827"
156
+ },
157
+ loadingDot: {
158
+ width: 10,
159
+ height: 10,
160
+ borderRadius: 999,
161
+ background: "#f97316",
162
+ boxShadow: "0 0 18px rgba(249, 115, 22, 0.55)"
163
+ },
164
+ loadingLabel: {
165
+ fontSize: 13,
166
+ fontWeight: 700,
167
+ textTransform: "uppercase",
168
+ letterSpacing: 0
169
+ }
170
+ };
171
+ export {
172
+ PhoneCompanionApp
173
+ };
174
+ //# sourceMappingURL=PhoneCompanionApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/companion/components/PhoneCompanionApp.tsx"],"sourcesContent":["import { Capacitor } from \"@capacitor/core\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n apnsEnabled,\n agentUrl as configuredAgentUrl,\n ElizaIntent,\n logger,\n type PairingPayload,\n type RegisterPushHandle,\n registerPush,\n useNavigation,\n type ViewName,\n} from \"../services/index.js\";\nimport { Chat } from \"./Chat.js\";\nimport { Pairing } from \"./Pairing.js\";\nimport { RemoteSession } from \"./RemoteSession.js\";\n\n/**\n * The phone-companion surface — three-view Capacitor app that pairs with a\n * Eliza desktop agent (QR handshake), mirrors chat, and serves as the\n * remote-session viewer for the paired Mac. Formerly shipped as a standalone\n * top-level app project; now rendered inside the main iOS bundle.\n */\nexport function PhoneCompanionApp(): React.JSX.Element {\n const nav = useNavigation();\n const pushRef = useRef(nav.push);\n pushRef.current = nav.push;\n const [agentUrl, setAgentUrl] = useState<string | null>(null);\n const [pairingPayload, setPairingPayload] = useState<PairingPayload | null>(\n null,\n );\n\n const persistPairingToNative = useCallback(\n async (payload: PairingPayload) => {\n if (!Capacitor.isNativePlatform()) return;\n try {\n await ElizaIntent.setPairingStatus({\n deviceId: payload.agentId,\n agentUrl: payload.ingressUrl,\n });\n } catch (err) {\n logger.warn(\"[PhoneCompanionApp] setPairingStatus failed\", {\n message: err instanceof Error ? err.message : String(err),\n });\n }\n },\n [],\n );\n\n useEffect(() => {\n logger.info(\"[PhoneCompanionApp] boot\", {\n apnsEnabled: apnsEnabled(),\n hasConfiguredAgentUrl: configuredAgentUrl() !== null,\n });\n ElizaIntent.getPairingStatus()\n .then((status) => {\n if (status.paired && status.agentUrl !== null) {\n setAgentUrl(status.agentUrl);\n }\n })\n .catch((err) => {\n logger.warn(\"[PhoneCompanionApp] getPairingStatus failed\", {\n message: err instanceof Error ? err.message : String(err),\n });\n });\n }, []);\n\n useEffect(() => {\n if (!apnsEnabled()) return;\n let disposed = false;\n let handle: RegisterPushHandle | null = null;\n void registerPush({\n onIntent: (intent) => {\n if (intent.kind === \"session-start\") {\n logger.info(\n \"[PhoneCompanionApp] session.start intent -> RemoteSession\",\n {\n agentId: intent.payload.agentId,\n },\n );\n void persistPairingToNative(intent.payload);\n setPairingPayload(intent.payload);\n setAgentUrl(intent.payload.ingressUrl);\n pushRef.current(\"remote-session\");\n }\n },\n onError: (err) => {\n logger.warn(\"[PhoneCompanionApp] push registration error\", {\n message: err.message,\n });\n },\n }).then((h) => {\n if (disposed) {\n void h.unregister();\n return;\n }\n handle = h;\n });\n return () => {\n disposed = true;\n void handle?.unregister();\n };\n }, [persistPairingToNative]);\n\n if (!nav.ready) {\n return (\n <main style={styles.loadingRoot}>\n <div style={styles.loadingPanel}>\n <span style={styles.loadingDot} />\n <span style={styles.loadingLabel}>Starting</span>\n </div>\n </main>\n );\n }\n\n return renderView(nav.view, {\n agentUrl,\n pairingPayload,\n onPushPairing: () => nav.push(\"pairing\"),\n onPushRemoteSession: () => nav.push(\"remote-session\"),\n onBackToChat: () => nav.pop(\"chat\"),\n onPaired: (payload: PairingPayload) => {\n void persistPairingToNative(payload);\n setPairingPayload(payload);\n setAgentUrl(payload.ingressUrl);\n nav.push(\"remote-session\");\n },\n });\n}\n\ninterface ViewHandlers {\n agentUrl: string | null;\n pairingPayload: PairingPayload | null;\n onPushPairing(): void;\n onPushRemoteSession(): void;\n onBackToChat(): void;\n onPaired(payload: PairingPayload): void;\n}\n\nfunction renderView(view: ViewName, h: ViewHandlers): React.JSX.Element {\n if (view === \"pairing\") {\n return <Pairing onPaired={h.onPaired} onBack={h.onBackToChat} />;\n }\n if (view === \"remote-session\") {\n if (h.pairingPayload === null) {\n return (\n <Chat\n pairedAgentUrl={h.agentUrl}\n onOpenPairing={h.onPushPairing}\n onOpenRemoteSession={h.onPushRemoteSession}\n remoteSessionAvailable={false}\n />\n );\n }\n return <RemoteSession payload={h.pairingPayload} onExit={h.onBackToChat} />;\n }\n return (\n <Chat\n pairedAgentUrl={h.agentUrl}\n onOpenPairing={h.onPushPairing}\n onOpenRemoteSession={h.onPushRemoteSession}\n remoteSessionAvailable={h.pairingPayload !== null}\n />\n );\n}\n\nconst styles: Record<string, React.CSSProperties> = {\n loadingRoot: {\n minHeight: \"100%\",\n display: \"grid\",\n placeItems: \"center\",\n background: \"#0b0f14\",\n color: \"#f8fafc\",\n },\n loadingPanel: {\n minWidth: 160,\n minHeight: 56,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 10,\n border: \"1px solid #1f2937\",\n borderRadius: 8,\n background: \"#111827\",\n },\n loadingDot: {\n width: 10,\n height: 10,\n borderRadius: 999,\n background: \"#f97316\",\n boxShadow: \"0 0 18px rgba(249, 115, 22, 0.55)\",\n },\n loadingLabel: {\n fontSize: 13,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: 0,\n },\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import { type PairingPayload } from "../services";
3
+ interface RemoteSessionProps {
4
+ payload: PairingPayload;
5
+ onExit(): void;
6
+ }
7
+ export declare function RemoteSession({ payload, onExit, }: RemoteSessionProps): React.JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=RemoteSession.d.ts.map