@elizaos/plugin-phone 2.0.3-beta.2 → 2.0.3-beta.4
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.
- package/dist/companion/components/Chat.d.ts +14 -0
- package/dist/companion/components/Chat.d.ts.map +1 -0
- package/dist/companion/components/Chat.js +195 -0
- package/dist/companion/components/Chat.js.map +1 -0
- package/dist/companion/components/Pairing.d.ts +9 -0
- package/dist/companion/components/Pairing.d.ts.map +1 -0
- package/dist/companion/components/Pairing.js +175 -0
- package/dist/companion/components/Pairing.js.map +1 -0
- package/dist/companion/components/PhoneCompanionApp.d.ts +9 -0
- package/dist/companion/components/PhoneCompanionApp.d.ts.map +1 -0
- package/dist/companion/components/PhoneCompanionApp.js +174 -0
- package/dist/companion/components/PhoneCompanionApp.js.map +1 -0
- package/dist/companion/components/RemoteSession.d.ts +9 -0
- package/dist/companion/components/RemoteSession.d.ts.map +1 -0
- package/dist/companion/components/RemoteSession.js +382 -0
- package/dist/companion/components/RemoteSession.js.map +1 -0
- package/dist/companion/components/index.d.ts +5 -0
- package/dist/companion/components/index.d.ts.map +1 -0
- package/dist/companion/components/index.js +11 -0
- package/dist/companion/components/index.js.map +1 -0
- package/dist/companion/index.d.ts +14 -0
- package/dist/companion/index.d.ts.map +1 -0
- package/dist/companion/index.js +12 -0
- package/dist/companion/index.js.map +1 -0
- package/dist/companion/services/eliza-intent.d.ts +63 -0
- package/dist/companion/services/eliza-intent.d.ts.map +1 -0
- package/dist/companion/services/eliza-intent.js +52 -0
- package/dist/companion/services/eliza-intent.js.map +1 -0
- package/dist/companion/services/env.d.ts +11 -0
- package/dist/companion/services/env.d.ts.map +1 -0
- package/dist/companion/services/env.js +20 -0
- package/dist/companion/services/env.js.map +1 -0
- package/dist/companion/services/index.d.ts +14 -0
- package/dist/companion/services/index.d.ts.map +1 -0
- package/dist/companion/services/index.js +29 -0
- package/dist/companion/services/index.js.map +1 -0
- package/dist/companion/services/intent-bridge.d.ts +11 -0
- package/dist/companion/services/intent-bridge.d.ts.map +1 -0
- package/dist/companion/services/intent-bridge.js +15 -0
- package/dist/companion/services/intent-bridge.js.map +1 -0
- package/dist/companion/services/logger.d.ts +14 -0
- package/dist/companion/services/logger.d.ts.map +1 -0
- package/dist/companion/services/logger.js +50 -0
- package/dist/companion/services/logger.js.map +1 -0
- package/dist/companion/services/navigation.d.ts +17 -0
- package/dist/companion/services/navigation.d.ts.map +1 -0
- package/dist/companion/services/navigation.js +104 -0
- package/dist/companion/services/navigation.js.map +1 -0
- package/dist/companion/services/push.d.ts +27 -0
- package/dist/companion/services/push.d.ts.map +1 -0
- package/dist/companion/services/push.js +101 -0
- package/dist/companion/services/push.js.map +1 -0
- package/dist/companion/services/session-client.d.ts +114 -0
- package/dist/companion/services/session-client.d.ts.map +1 -0
- package/dist/companion/services/session-client.js +197 -0
- package/dist/companion/services/session-client.js.map +1 -0
- package/dist/components/PhoneAppView.d.ts +18 -0
- package/dist/components/PhoneAppView.d.ts.map +1 -0
- package/dist/components/PhoneAppView.helpers.d.ts +12 -0
- package/dist/components/PhoneAppView.helpers.d.ts.map +1 -0
- package/dist/components/PhoneAppView.helpers.js +44 -0
- package/dist/components/PhoneAppView.helpers.js.map +1 -0
- package/dist/components/PhoneAppView.interact.d.ts +2 -0
- package/dist/components/PhoneAppView.interact.d.ts.map +1 -0
- package/dist/components/PhoneAppView.interact.js +63 -0
- package/dist/components/PhoneAppView.interact.js.map +1 -0
- package/dist/components/PhoneAppView.js +566 -0
- package/dist/components/PhoneAppView.js.map +1 -0
- package/dist/components/PhoneSpatialView.d.ts +43 -0
- package/dist/components/PhoneSpatialView.d.ts.map +1 -0
- package/dist/components/PhoneSpatialView.js +180 -0
- package/dist/components/PhoneSpatialView.js.map +1 -0
- package/dist/components/PhoneView.d.ts +13 -0
- package/dist/components/PhoneView.d.ts.map +1 -0
- package/dist/components/PhoneView.js +161 -0
- package/dist/components/PhoneView.js.map +1 -0
- package/dist/components/phone-app.d.ts +13 -0
- package/dist/components/phone-app.d.ts.map +1 -0
- package/dist/components/phone-app.js +20 -0
- package/dist/components/phone-app.js.map +1 -0
- package/dist/components/phone-view-bundle.d.ts +3 -0
- package/dist/components/phone-view-bundle.d.ts.map +1 -0
- package/dist/components/phone-view-bundle.js +7 -0
- package/dist/components/phone-view-bundle.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +17 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +48 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers/call-log.d.ts +11 -0
- package/dist/providers/call-log.d.ts.map +1 -0
- package/dist/providers/call-log.js +66 -0
- package/dist/providers/call-log.js.map +1 -0
- package/dist/register-companion-page.d.ts +13 -0
- package/dist/register-companion-page.d.ts.map +1 -0
- package/dist/register-companion-page.js +12 -0
- package/dist/register-companion-page.js.map +1 -0
- package/dist/register-terminal-view.d.ts +15 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +21 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/register.d.ts +9 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +11 -0
- package/dist/register.js.map +1 -0
- package/dist/twilio.d.ts +33 -0
- package/dist/twilio.d.ts.map +1 -0
- package/dist/twilio.js +238 -0
- package/dist/twilio.js.map +1 -0
- package/dist/ui.d.ts +8 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +23 -0
- package/dist/ui.js.map +1 -0
- package/dist/views/bundle.js +407 -0
- package/dist/views/bundle.js.map +1 -0
- package/dist/views/dist-Cd2YtKy4.js +270 -0
- package/dist/views/dist-Cd2YtKy4.js.map +1 -0
- package/dist/views/web-TGRkTsa8.js +58 -0
- package/dist/views/web-TGRkTsa8.js.map +1 -0
- 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
|