@elizaos/capacitor-agent 1.0.0 → 2.0.11-beta.7
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/ElizaosCapacitorAgent.podspec +17 -0
- package/LICENSE +21 -0
- package/README.md +145 -0
- package/android/build.gradle +44 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/ai/eliza/plugins/agent/AgentPlugin.kt +308 -0
- package/dist/esm/definitions.d.ts +87 -2
- package/dist/esm/definitions.d.ts.map +1 -1
- package/dist/esm/definitions.js +4 -1
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/web.d.ts +5 -2
- package/dist/esm/web.d.ts.map +1 -1
- package/dist/esm/web.js +108 -2
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +109 -3
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +109 -3
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/AgentPlugin/AgentPlugin.swift +917 -0
- package/package.json +20 -10
package/dist/esm/index.js
CHANGED
|
@@ -3,6 +3,6 @@ export * from "./definitions";
|
|
|
3
3
|
export const Agent = registerPlugin("Agent", {
|
|
4
4
|
web: () => import("./web").then((m) => new m.AgentWeb()),
|
|
5
5
|
// Electrobun uses the preload bridge (agent:start, agent:stop, etc.)
|
|
6
|
-
// iOS/Android
|
|
6
|
+
// iOS/Android use the native bridge when registered, otherwise the HTTP web fallback.
|
|
7
7
|
});
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,cAAc,eAAe,CAAC;AAE9B,MAAM,CAAC,MAAM,KAAK,GAAG,cAAc,CAAc,OAAO,EAAE;IACxD,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxD,qEAAqE;IACrE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,cAAc,eAAe,CAAC;AAE9B,MAAM,CAAC,MAAM,KAAK,GAAG,cAAc,CAAc,OAAO,EAAE;IACxD,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxD,qEAAqE;IACrE,sFAAsF;CACvF,CAAC,CAAC"}
|
package/dist/esm/web.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { WebPlugin } from "@capacitor/core";
|
|
2
|
-
import type { AgentPlugin, AgentStatus, ChatResult } from "./definitions";
|
|
2
|
+
import type { AgentPlugin, AgentRequestOptions, AgentRequestResult, AgentStartOptions, AgentStatus, ChatResult, LocalAgentTokenResult } from "./definitions";
|
|
3
3
|
/**
|
|
4
4
|
* Web fallback implementation.
|
|
5
5
|
*
|
|
@@ -27,11 +27,12 @@ export declare class AgentWeb extends WebPlugin implements AgentPlugin {
|
|
|
27
27
|
private ensureLegacyConversationId;
|
|
28
28
|
private chatViaConversation;
|
|
29
29
|
private apiBase;
|
|
30
|
+
private isLocalAgentIpcBase;
|
|
30
31
|
private apiToken;
|
|
31
32
|
private authHeaders;
|
|
32
33
|
/** True when we can reach the API via HTTP. */
|
|
33
34
|
private canReachApi;
|
|
34
|
-
start(): Promise<AgentStatus>;
|
|
35
|
+
start(_options?: AgentStartOptions): Promise<AgentStatus>;
|
|
35
36
|
stop(): Promise<{
|
|
36
37
|
ok: boolean;
|
|
37
38
|
}>;
|
|
@@ -39,5 +40,7 @@ export declare class AgentWeb extends WebPlugin implements AgentPlugin {
|
|
|
39
40
|
chat(options: {
|
|
40
41
|
text: string;
|
|
41
42
|
}): Promise<ChatResult>;
|
|
43
|
+
getLocalAgentToken(): Promise<LocalAgentTokenResult>;
|
|
44
|
+
request(options: AgentRequestOptions): Promise<AgentRequestResult>;
|
|
42
45
|
}
|
|
43
46
|
//# sourceMappingURL=web.d.ts.map
|
package/dist/esm/web.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAuDvB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,QAAS,SAAQ,SAAU,YAAW,WAAW;IAC5D,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,yBAAyB;YAUnB,0BAA0B;YA0B1B,mBAAmB;IA8BjC,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,WAAW;IAKnB,+CAA+C;IAC/C,OAAO,CAAC,WAAW;IAab,KAAK,CAAC,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IAkBzD,IAAI,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;IAWhC,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;IAgBjC,IAAI,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAQpD,kBAAkB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAQpD,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAkCzE"}
|
package/dist/esm/web.js
CHANGED
|
@@ -1,4 +1,45 @@
|
|
|
1
1
|
import { WebPlugin } from "@capacitor/core";
|
|
2
|
+
function assertNonEmptyText(text) {
|
|
3
|
+
if (typeof text !== "string" || text.trim().length === 0) {
|
|
4
|
+
throw new Error("Agent.chat requires non-empty text");
|
|
5
|
+
}
|
|
6
|
+
return text;
|
|
7
|
+
}
|
|
8
|
+
function assertRequestPath(path) {
|
|
9
|
+
if (typeof path !== "string" || path.trim().length === 0) {
|
|
10
|
+
throw new Error("Agent.request path must start with /");
|
|
11
|
+
}
|
|
12
|
+
const trimmed = path.trim();
|
|
13
|
+
if (!trimmed.startsWith("/") ||
|
|
14
|
+
trimmed.startsWith("//") ||
|
|
15
|
+
trimmed.includes("\\")) {
|
|
16
|
+
throw new Error("Agent.request requires a local path that starts with / and is not an absolute URL");
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const parsed = new URL(trimmed);
|
|
20
|
+
if (parsed.protocol) {
|
|
21
|
+
throw new Error("Agent.request requires a local path that starts with / and is not an absolute URL");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
if (err instanceof Error && err.message.includes("absolute URL")) {
|
|
26
|
+
throw err;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return trimmed;
|
|
30
|
+
}
|
|
31
|
+
function assertRequestMethod(method) {
|
|
32
|
+
if (method === undefined)
|
|
33
|
+
return "GET";
|
|
34
|
+
if (typeof method !== "string") {
|
|
35
|
+
throw new Error("Unsupported HTTP method");
|
|
36
|
+
}
|
|
37
|
+
const normalized = method.trim().toUpperCase();
|
|
38
|
+
if (!/^[A-Z]{1,16}$/.test(normalized)) {
|
|
39
|
+
throw new Error("Unsupported HTTP method");
|
|
40
|
+
}
|
|
41
|
+
return normalized;
|
|
42
|
+
}
|
|
2
43
|
/**
|
|
3
44
|
* Web fallback implementation.
|
|
4
45
|
*
|
|
@@ -66,6 +107,7 @@ export class AgentWeb extends WebPlugin {
|
|
|
66
107
|
}
|
|
67
108
|
async chatViaConversation(text, retryOnMissingConversation = true) {
|
|
68
109
|
const conversationId = await this.ensureLegacyConversationId();
|
|
110
|
+
// @duplicate-component-audit-allow: agent API message POST; server-side runtime owns model trajectory logging.
|
|
69
111
|
const res = await fetch(`${this.apiBase()}/api/conversations/${encodeURIComponent(conversationId)}/messages`, {
|
|
70
112
|
method: "POST",
|
|
71
113
|
headers: {
|
|
@@ -92,6 +134,27 @@ export class AgentWeb extends WebPlugin {
|
|
|
92
134
|
// No explicit base — use relative URLs (works on http/https origins).
|
|
93
135
|
return "";
|
|
94
136
|
}
|
|
137
|
+
isLocalAgentIpcBase() {
|
|
138
|
+
const base = this.apiBase().trim();
|
|
139
|
+
if (!base)
|
|
140
|
+
return false;
|
|
141
|
+
const lower = base.toLowerCase();
|
|
142
|
+
if (lower === "eliza-local-agent://ipc" ||
|
|
143
|
+
lower.startsWith("eliza-local-agent://ipc/") ||
|
|
144
|
+
lower.startsWith("eliza-local-agent://ipc?")) {
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const parsed = new URL(base);
|
|
149
|
+
return (parsed.protocol === "eliza-local-agent:" &&
|
|
150
|
+
(parsed.hostname === "ipc" ||
|
|
151
|
+
parsed.pathname === "//ipc" ||
|
|
152
|
+
parsed.pathname.startsWith("//ipc/")));
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
95
158
|
apiToken() {
|
|
96
159
|
const global = typeof window !== "undefined"
|
|
97
160
|
? window.__ELIZA_API_TOKEN__
|
|
@@ -109,6 +172,8 @@ export class AgentWeb extends WebPlugin {
|
|
|
109
172
|
}
|
|
110
173
|
/** True when we can reach the API via HTTP. */
|
|
111
174
|
canReachApi() {
|
|
175
|
+
if (this.isLocalAgentIpcBase())
|
|
176
|
+
return false;
|
|
112
177
|
const global = typeof window !== "undefined"
|
|
113
178
|
? window.__ELIZA_API_BASE__
|
|
114
179
|
: undefined;
|
|
@@ -120,7 +185,7 @@ export class AgentWeb extends WebPlugin {
|
|
|
120
185
|
const proto = window.location.protocol;
|
|
121
186
|
return proto === "http:" || proto === "https:";
|
|
122
187
|
}
|
|
123
|
-
async start() {
|
|
188
|
+
async start(_options) {
|
|
124
189
|
if (!this.canReachApi()) {
|
|
125
190
|
return {
|
|
126
191
|
state: "not_started",
|
|
@@ -163,10 +228,51 @@ export class AgentWeb extends WebPlugin {
|
|
|
163
228
|
return res.json();
|
|
164
229
|
}
|
|
165
230
|
async chat(options) {
|
|
231
|
+
const text = assertNonEmptyText(options.text);
|
|
166
232
|
if (!this.canReachApi()) {
|
|
167
233
|
return { text: "Agent API not available", agentName: "System" };
|
|
168
234
|
}
|
|
169
|
-
return this.chatViaConversation(
|
|
235
|
+
return this.chatViaConversation(text);
|
|
236
|
+
}
|
|
237
|
+
async getLocalAgentToken() {
|
|
238
|
+
const token = this.apiToken();
|
|
239
|
+
return {
|
|
240
|
+
available: Boolean(token),
|
|
241
|
+
token,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
async request(options) {
|
|
245
|
+
const path = assertRequestPath(options.path);
|
|
246
|
+
const method = assertRequestMethod(options.method);
|
|
247
|
+
if (this.isLocalAgentIpcBase()) {
|
|
248
|
+
return {
|
|
249
|
+
status: 503,
|
|
250
|
+
statusText: "Service Unavailable",
|
|
251
|
+
headers: { "content-type": "application/json" },
|
|
252
|
+
body: JSON.stringify({
|
|
253
|
+
error: "native_agent_unavailable",
|
|
254
|
+
message: "Agent web fallback cannot handle eliza-local-agent://ipc; use the native Capacitor Agent plugin",
|
|
255
|
+
}),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
const res = await fetch(`${this.apiBase()}${path}`, {
|
|
259
|
+
method,
|
|
260
|
+
headers: {
|
|
261
|
+
...this.authHeaders(),
|
|
262
|
+
...options.headers,
|
|
263
|
+
},
|
|
264
|
+
body: options.body ?? undefined,
|
|
265
|
+
});
|
|
266
|
+
const headers = {};
|
|
267
|
+
res.headers.forEach((value, key) => {
|
|
268
|
+
headers[key] = value;
|
|
269
|
+
});
|
|
270
|
+
return {
|
|
271
|
+
status: res.status,
|
|
272
|
+
statusText: res.statusText,
|
|
273
|
+
headers,
|
|
274
|
+
body: await res.text(),
|
|
275
|
+
};
|
|
170
276
|
}
|
|
171
277
|
}
|
|
172
278
|
//# sourceMappingURL=web.js.map
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -5,9 +5,50 @@ var core = require('@capacitor/core');
|
|
|
5
5
|
const Agent = core.registerPlugin("Agent", {
|
|
6
6
|
web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.AgentWeb()),
|
|
7
7
|
// Electrobun uses the preload bridge (agent:start, agent:stop, etc.)
|
|
8
|
-
// iOS/Android
|
|
8
|
+
// iOS/Android use the native bridge when registered, otherwise the HTTP web fallback.
|
|
9
9
|
});
|
|
10
10
|
|
|
11
|
+
function assertNonEmptyText(text) {
|
|
12
|
+
if (typeof text !== "string" || text.trim().length === 0) {
|
|
13
|
+
throw new Error("Agent.chat requires non-empty text");
|
|
14
|
+
}
|
|
15
|
+
return text;
|
|
16
|
+
}
|
|
17
|
+
function assertRequestPath(path) {
|
|
18
|
+
if (typeof path !== "string" || path.trim().length === 0) {
|
|
19
|
+
throw new Error("Agent.request path must start with /");
|
|
20
|
+
}
|
|
21
|
+
const trimmed = path.trim();
|
|
22
|
+
if (!trimmed.startsWith("/") ||
|
|
23
|
+
trimmed.startsWith("//") ||
|
|
24
|
+
trimmed.includes("\\")) {
|
|
25
|
+
throw new Error("Agent.request requires a local path that starts with / and is not an absolute URL");
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const parsed = new URL(trimmed);
|
|
29
|
+
if (parsed.protocol) {
|
|
30
|
+
throw new Error("Agent.request requires a local path that starts with / and is not an absolute URL");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
if (err instanceof Error && err.message.includes("absolute URL")) {
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return trimmed;
|
|
39
|
+
}
|
|
40
|
+
function assertRequestMethod(method) {
|
|
41
|
+
if (method === undefined)
|
|
42
|
+
return "GET";
|
|
43
|
+
if (typeof method !== "string") {
|
|
44
|
+
throw new Error("Unsupported HTTP method");
|
|
45
|
+
}
|
|
46
|
+
const normalized = method.trim().toUpperCase();
|
|
47
|
+
if (!/^[A-Z]{1,16}$/.test(normalized)) {
|
|
48
|
+
throw new Error("Unsupported HTTP method");
|
|
49
|
+
}
|
|
50
|
+
return normalized;
|
|
51
|
+
}
|
|
11
52
|
/**
|
|
12
53
|
* Web fallback implementation.
|
|
13
54
|
*
|
|
@@ -75,6 +116,7 @@ class AgentWeb extends core.WebPlugin {
|
|
|
75
116
|
}
|
|
76
117
|
async chatViaConversation(text, retryOnMissingConversation = true) {
|
|
77
118
|
const conversationId = await this.ensureLegacyConversationId();
|
|
119
|
+
// @duplicate-component-audit-allow: agent API message POST; server-side runtime owns model trajectory logging.
|
|
78
120
|
const res = await fetch(`${this.apiBase()}/api/conversations/${encodeURIComponent(conversationId)}/messages`, {
|
|
79
121
|
method: "POST",
|
|
80
122
|
headers: {
|
|
@@ -101,6 +143,27 @@ class AgentWeb extends core.WebPlugin {
|
|
|
101
143
|
// No explicit base — use relative URLs (works on http/https origins).
|
|
102
144
|
return "";
|
|
103
145
|
}
|
|
146
|
+
isLocalAgentIpcBase() {
|
|
147
|
+
const base = this.apiBase().trim();
|
|
148
|
+
if (!base)
|
|
149
|
+
return false;
|
|
150
|
+
const lower = base.toLowerCase();
|
|
151
|
+
if (lower === "eliza-local-agent://ipc" ||
|
|
152
|
+
lower.startsWith("eliza-local-agent://ipc/") ||
|
|
153
|
+
lower.startsWith("eliza-local-agent://ipc?")) {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
const parsed = new URL(base);
|
|
158
|
+
return (parsed.protocol === "eliza-local-agent:" &&
|
|
159
|
+
(parsed.hostname === "ipc" ||
|
|
160
|
+
parsed.pathname === "//ipc" ||
|
|
161
|
+
parsed.pathname.startsWith("//ipc/")));
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
104
167
|
apiToken() {
|
|
105
168
|
const global = typeof window !== "undefined"
|
|
106
169
|
? window.__ELIZA_API_TOKEN__
|
|
@@ -118,6 +181,8 @@ class AgentWeb extends core.WebPlugin {
|
|
|
118
181
|
}
|
|
119
182
|
/** True when we can reach the API via HTTP. */
|
|
120
183
|
canReachApi() {
|
|
184
|
+
if (this.isLocalAgentIpcBase())
|
|
185
|
+
return false;
|
|
121
186
|
const global = typeof window !== "undefined"
|
|
122
187
|
? window.__ELIZA_API_BASE__
|
|
123
188
|
: undefined;
|
|
@@ -129,7 +194,7 @@ class AgentWeb extends core.WebPlugin {
|
|
|
129
194
|
const proto = window.location.protocol;
|
|
130
195
|
return proto === "http:" || proto === "https:";
|
|
131
196
|
}
|
|
132
|
-
async start() {
|
|
197
|
+
async start(_options) {
|
|
133
198
|
if (!this.canReachApi()) {
|
|
134
199
|
return {
|
|
135
200
|
state: "not_started",
|
|
@@ -172,10 +237,51 @@ class AgentWeb extends core.WebPlugin {
|
|
|
172
237
|
return res.json();
|
|
173
238
|
}
|
|
174
239
|
async chat(options) {
|
|
240
|
+
const text = assertNonEmptyText(options.text);
|
|
175
241
|
if (!this.canReachApi()) {
|
|
176
242
|
return { text: "Agent API not available", agentName: "System" };
|
|
177
243
|
}
|
|
178
|
-
return this.chatViaConversation(
|
|
244
|
+
return this.chatViaConversation(text);
|
|
245
|
+
}
|
|
246
|
+
async getLocalAgentToken() {
|
|
247
|
+
const token = this.apiToken();
|
|
248
|
+
return {
|
|
249
|
+
available: Boolean(token),
|
|
250
|
+
token,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
async request(options) {
|
|
254
|
+
const path = assertRequestPath(options.path);
|
|
255
|
+
const method = assertRequestMethod(options.method);
|
|
256
|
+
if (this.isLocalAgentIpcBase()) {
|
|
257
|
+
return {
|
|
258
|
+
status: 503,
|
|
259
|
+
statusText: "Service Unavailable",
|
|
260
|
+
headers: { "content-type": "application/json" },
|
|
261
|
+
body: JSON.stringify({
|
|
262
|
+
error: "native_agent_unavailable",
|
|
263
|
+
message: "Agent web fallback cannot handle eliza-local-agent://ipc; use the native Capacitor Agent plugin",
|
|
264
|
+
}),
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
const res = await fetch(`${this.apiBase()}${path}`, {
|
|
268
|
+
method,
|
|
269
|
+
headers: {
|
|
270
|
+
...this.authHeaders(),
|
|
271
|
+
...options.headers,
|
|
272
|
+
},
|
|
273
|
+
body: options.body ?? undefined,
|
|
274
|
+
});
|
|
275
|
+
const headers = {};
|
|
276
|
+
res.headers.forEach((value, key) => {
|
|
277
|
+
headers[key] = value;
|
|
278
|
+
});
|
|
279
|
+
return {
|
|
280
|
+
status: res.status,
|
|
281
|
+
statusText: res.statusText,
|
|
282
|
+
headers,
|
|
283
|
+
body: await res.text(),
|
|
284
|
+
};
|
|
179
285
|
}
|
|
180
286
|
}
|
|
181
287
|
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from \"@capacitor/core\";\nexport * from \"./definitions\";\nexport const Agent = registerPlugin(\"Agent\", {\n web: () => import(\"./web\").then((m) => new m.AgentWeb()),\n // Electrobun uses the preload bridge (agent:start, agent:stop, etc.)\n // iOS/Android will use the web fallback (HTTP to API server) for now\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\n/**\n * Web fallback implementation.\n *\n * On non-desktop platforms (iOS, Android, web), the agent runtime runs\n * on a server. This implementation delegates to the HTTP API.\n *\n * In Electrobun the desktop bridge calls the native main-process\n * implementation via RPC instead — this web fallback is only used when\n * no native plugin is available. If the page is served from a non-HTTP\n * origin (e.g. electrobun://), relative fetches would hit the\n * app shell HTML, so we bail early.\n *\n * Local-agent-on-Android (Phase E): when the host UI selects the\n * \"Local Agent\" tile, it sets `apiBase` to `http://127.0.0.1:31337`,\n * which the runtime mirrors into `window.__ELIZA_API_BASE__`. From this\n * plugin's perspective there is no special case — it simply HTTP-POSTs\n * to `${apiBase}/api/agent/start|stop|status`, which is exactly the same\n * surface Phase B's `ElizaAgentService` exposes. The web fallback path\n * therefore works unchanged for both remote and on-device agents.\n */\nexport class AgentWeb extends WebPlugin {\n legacyConversationStorageKey() {\n const base = this.apiBase() ||\n (typeof window !== \"undefined\" ? window.location.origin : \"same-origin\");\n return `eliza_agent_web_conversation:${encodeURIComponent(base)}`;\n }\n readLegacyConversationId() {\n if (typeof window === \"undefined\")\n return null;\n const stored = window.sessionStorage.getItem(this.legacyConversationStorageKey());\n return stored?.trim() ? stored.trim() : null;\n }\n writeLegacyConversationId(conversationId) {\n if (typeof window === \"undefined\")\n return;\n const key = this.legacyConversationStorageKey();\n if (conversationId?.trim()) {\n window.sessionStorage.setItem(key, conversationId.trim());\n return;\n }\n window.sessionStorage.removeItem(key);\n }\n async ensureLegacyConversationId() {\n const cached = this.readLegacyConversationId();\n if (cached)\n return cached;\n const res = await fetch(`${this.apiBase()}/api/conversations`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.authHeaders(),\n },\n body: JSON.stringify({ title: \"Quick Chat\" }),\n });\n if (!res.ok) {\n throw new Error(`Failed to create conversation: ${res.status}`);\n }\n const data = (await res.json());\n const conversationId = data.conversation?.id?.trim();\n if (!conversationId) {\n throw new Error(\"Conversation create response missing id\");\n }\n this.writeLegacyConversationId(conversationId);\n return conversationId;\n }\n async chatViaConversation(text, retryOnMissingConversation = true) {\n const conversationId = await this.ensureLegacyConversationId();\n const res = await fetch(`${this.apiBase()}/api/conversations/${encodeURIComponent(conversationId)}/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.authHeaders(),\n },\n body: JSON.stringify({ text, channelType: \"DM\" }),\n });\n if (res.status === 404 && retryOnMissingConversation) {\n this.writeLegacyConversationId(null);\n return this.chatViaConversation(text, false);\n }\n if (!res.ok) {\n throw new Error(`Chat request failed: ${res.status}`);\n }\n return res.json();\n }\n apiBase() {\n const global = typeof window !== \"undefined\"\n ? window.__ELIZA_API_BASE__\n : undefined;\n if (typeof global === \"string\" && global.trim().length > 0)\n return global;\n // No explicit base — use relative URLs (works on http/https origins).\n return \"\";\n }\n apiToken() {\n const global = typeof window !== \"undefined\"\n ? window.__ELIZA_API_TOKEN__\n : undefined;\n if (typeof global === \"string\" && global.trim())\n return global.trim();\n if (typeof window === \"undefined\")\n return null;\n const stored = window.sessionStorage.getItem(\"eliza_api_token\");\n return stored?.trim() ? stored.trim() : null;\n }\n authHeaders() {\n const token = this.apiToken();\n return token ? { Authorization: `Bearer ${token}` } : {};\n }\n /** True when we can reach the API via HTTP. */\n canReachApi() {\n const global = typeof window !== \"undefined\"\n ? window.__ELIZA_API_BASE__\n : undefined;\n if (typeof global === \"string\" && global.trim().length > 0)\n return true;\n // No explicit base — relative fetches only work on http(s) origins.\n if (typeof window === \"undefined\")\n return false;\n const proto = window.location.protocol;\n return proto === \"http:\" || proto === \"https:\";\n }\n async start() {\n if (!this.canReachApi()) {\n return {\n state: \"not_started\",\n agentName: null,\n port: null,\n startedAt: null,\n error: \"No API endpoint\",\n };\n }\n const res = await fetch(`${this.apiBase()}/api/agent/start`, {\n method: \"POST\",\n headers: this.authHeaders(),\n });\n const data = await res.json();\n return data.status ?? data;\n }\n async stop() {\n if (!this.canReachApi()) {\n return { ok: false };\n }\n const res = await fetch(`${this.apiBase()}/api/agent/stop`, {\n method: \"POST\",\n headers: this.authHeaders(),\n });\n return res.json();\n }\n async getStatus() {\n if (!this.canReachApi()) {\n return {\n state: \"not_started\",\n agentName: null,\n port: null,\n startedAt: null,\n error: \"No API endpoint\",\n };\n }\n const res = await fetch(`${this.apiBase()}/api/status`, {\n headers: this.authHeaders(),\n });\n return res.json();\n }\n async chat(options) {\n if (!this.canReachApi()) {\n return { text: \"Agent API not available\", agentName: \"System\" };\n }\n return this.chatViaConversation(options.text);\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from \"@capacitor/core\";\nexport * from \"./definitions\";\nexport const Agent = registerPlugin(\"Agent\", {\n web: () => import(\"./web\").then((m) => new m.AgentWeb()),\n // Electrobun uses the preload bridge (agent:start, agent:stop, etc.)\n // iOS/Android use the native bridge when registered, otherwise the HTTP web fallback.\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nfunction assertNonEmptyText(text) {\n if (typeof text !== \"string\" || text.trim().length === 0) {\n throw new Error(\"Agent.chat requires non-empty text\");\n }\n return text;\n}\nfunction assertRequestPath(path) {\n if (typeof path !== \"string\" || path.trim().length === 0) {\n throw new Error(\"Agent.request path must start with /\");\n }\n const trimmed = path.trim();\n if (!trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"//\") ||\n trimmed.includes(\"\\\\\")) {\n throw new Error(\"Agent.request requires a local path that starts with / and is not an absolute URL\");\n }\n try {\n const parsed = new URL(trimmed);\n if (parsed.protocol) {\n throw new Error(\"Agent.request requires a local path that starts with / and is not an absolute URL\");\n }\n }\n catch (err) {\n if (err instanceof Error && err.message.includes(\"absolute URL\")) {\n throw err;\n }\n }\n return trimmed;\n}\nfunction assertRequestMethod(method) {\n if (method === undefined)\n return \"GET\";\n if (typeof method !== \"string\") {\n throw new Error(\"Unsupported HTTP method\");\n }\n const normalized = method.trim().toUpperCase();\n if (!/^[A-Z]{1,16}$/.test(normalized)) {\n throw new Error(\"Unsupported HTTP method\");\n }\n return normalized;\n}\n/**\n * Web fallback implementation.\n *\n * On non-desktop platforms (iOS, Android, web), the agent runtime runs\n * on a server. This implementation delegates to the HTTP API.\n *\n * In Electrobun the desktop bridge calls the native main-process\n * implementation via RPC instead — this web fallback is only used when\n * no native plugin is available. If the page is served from a non-HTTP\n * origin (e.g. electrobun://), relative fetches would hit the\n * app shell HTML, so we bail early.\n *\n * Local-agent-on-Android (Phase E): when the host UI selects the\n * \"Local Agent\" tile, it sets `apiBase` to `http://127.0.0.1:31337`,\n * which the runtime mirrors into `window.__ELIZA_API_BASE__`. From this\n * plugin's perspective there is no special case — it simply HTTP-POSTs\n * to `${apiBase}/api/agent/start|stop|status`, which is exactly the same\n * surface Phase B's `ElizaAgentService` exposes. The web fallback path\n * therefore works unchanged for both remote and on-device agents.\n */\nexport class AgentWeb extends WebPlugin {\n legacyConversationStorageKey() {\n const base = this.apiBase() ||\n (typeof window !== \"undefined\" ? window.location.origin : \"same-origin\");\n return `eliza_agent_web_conversation:${encodeURIComponent(base)}`;\n }\n readLegacyConversationId() {\n if (typeof window === \"undefined\")\n return null;\n const stored = window.sessionStorage.getItem(this.legacyConversationStorageKey());\n return stored?.trim() ? stored.trim() : null;\n }\n writeLegacyConversationId(conversationId) {\n if (typeof window === \"undefined\")\n return;\n const key = this.legacyConversationStorageKey();\n if (conversationId?.trim()) {\n window.sessionStorage.setItem(key, conversationId.trim());\n return;\n }\n window.sessionStorage.removeItem(key);\n }\n async ensureLegacyConversationId() {\n const cached = this.readLegacyConversationId();\n if (cached)\n return cached;\n const res = await fetch(`${this.apiBase()}/api/conversations`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.authHeaders(),\n },\n body: JSON.stringify({ title: \"Quick Chat\" }),\n });\n if (!res.ok) {\n throw new Error(`Failed to create conversation: ${res.status}`);\n }\n const data = (await res.json());\n const conversationId = data.conversation?.id?.trim();\n if (!conversationId) {\n throw new Error(\"Conversation create response missing id\");\n }\n this.writeLegacyConversationId(conversationId);\n return conversationId;\n }\n async chatViaConversation(text, retryOnMissingConversation = true) {\n const conversationId = await this.ensureLegacyConversationId();\n // @duplicate-component-audit-allow: agent API message POST; server-side runtime owns model trajectory logging.\n const res = await fetch(`${this.apiBase()}/api/conversations/${encodeURIComponent(conversationId)}/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.authHeaders(),\n },\n body: JSON.stringify({ text, channelType: \"DM\" }),\n });\n if (res.status === 404 && retryOnMissingConversation) {\n this.writeLegacyConversationId(null);\n return this.chatViaConversation(text, false);\n }\n if (!res.ok) {\n throw new Error(`Chat request failed: ${res.status}`);\n }\n return res.json();\n }\n apiBase() {\n const global = typeof window !== \"undefined\"\n ? window.__ELIZA_API_BASE__\n : undefined;\n if (typeof global === \"string\" && global.trim().length > 0)\n return global;\n // No explicit base — use relative URLs (works on http/https origins).\n return \"\";\n }\n isLocalAgentIpcBase() {\n const base = this.apiBase().trim();\n if (!base)\n return false;\n const lower = base.toLowerCase();\n if (lower === \"eliza-local-agent://ipc\" ||\n lower.startsWith(\"eliza-local-agent://ipc/\") ||\n lower.startsWith(\"eliza-local-agent://ipc?\")) {\n return true;\n }\n try {\n const parsed = new URL(base);\n return (parsed.protocol === \"eliza-local-agent:\" &&\n (parsed.hostname === \"ipc\" ||\n parsed.pathname === \"//ipc\" ||\n parsed.pathname.startsWith(\"//ipc/\")));\n }\n catch {\n return false;\n }\n }\n apiToken() {\n const global = typeof window !== \"undefined\"\n ? window.__ELIZA_API_TOKEN__\n : undefined;\n if (typeof global === \"string\" && global.trim())\n return global.trim();\n if (typeof window === \"undefined\")\n return null;\n const stored = window.sessionStorage.getItem(\"eliza_api_token\");\n return stored?.trim() ? stored.trim() : null;\n }\n authHeaders() {\n const token = this.apiToken();\n return token ? { Authorization: `Bearer ${token}` } : {};\n }\n /** True when we can reach the API via HTTP. */\n canReachApi() {\n if (this.isLocalAgentIpcBase())\n return false;\n const global = typeof window !== \"undefined\"\n ? window.__ELIZA_API_BASE__\n : undefined;\n if (typeof global === \"string\" && global.trim().length > 0)\n return true;\n // No explicit base — relative fetches only work on http(s) origins.\n if (typeof window === \"undefined\")\n return false;\n const proto = window.location.protocol;\n return proto === \"http:\" || proto === \"https:\";\n }\n async start(_options) {\n if (!this.canReachApi()) {\n return {\n state: \"not_started\",\n agentName: null,\n port: null,\n startedAt: null,\n error: \"No API endpoint\",\n };\n }\n const res = await fetch(`${this.apiBase()}/api/agent/start`, {\n method: \"POST\",\n headers: this.authHeaders(),\n });\n const data = await res.json();\n return data.status ?? data;\n }\n async stop() {\n if (!this.canReachApi()) {\n return { ok: false };\n }\n const res = await fetch(`${this.apiBase()}/api/agent/stop`, {\n method: \"POST\",\n headers: this.authHeaders(),\n });\n return res.json();\n }\n async getStatus() {\n if (!this.canReachApi()) {\n return {\n state: \"not_started\",\n agentName: null,\n port: null,\n startedAt: null,\n error: \"No API endpoint\",\n };\n }\n const res = await fetch(`${this.apiBase()}/api/status`, {\n headers: this.authHeaders(),\n });\n return res.json();\n }\n async chat(options) {\n const text = assertNonEmptyText(options.text);\n if (!this.canReachApi()) {\n return { text: \"Agent API not available\", agentName: \"System\" };\n }\n return this.chatViaConversation(text);\n }\n async getLocalAgentToken() {\n const token = this.apiToken();\n return {\n available: Boolean(token),\n token,\n };\n }\n async request(options) {\n const path = assertRequestPath(options.path);\n const method = assertRequestMethod(options.method);\n if (this.isLocalAgentIpcBase()) {\n return {\n status: 503,\n statusText: \"Service Unavailable\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n error: \"native_agent_unavailable\",\n message: \"Agent web fallback cannot handle eliza-local-agent://ipc; use the native Capacitor Agent plugin\",\n }),\n };\n }\n const res = await fetch(`${this.apiBase()}${path}`, {\n method,\n headers: {\n ...this.authHeaders(),\n ...options.headers,\n },\n body: options.body ?? undefined,\n });\n const headers = {};\n res.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return {\n status: res.status,\n statusText: res.statusText,\n headers,\n body: await res.text(),\n };\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
package/dist/plugin.js
CHANGED
|
@@ -4,9 +4,50 @@ var capacitorAgent = (function (exports, core) {
|
|
|
4
4
|
const Agent = core.registerPlugin("Agent", {
|
|
5
5
|
web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.AgentWeb()),
|
|
6
6
|
// Electrobun uses the preload bridge (agent:start, agent:stop, etc.)
|
|
7
|
-
// iOS/Android
|
|
7
|
+
// iOS/Android use the native bridge when registered, otherwise the HTTP web fallback.
|
|
8
8
|
});
|
|
9
9
|
|
|
10
|
+
function assertNonEmptyText(text) {
|
|
11
|
+
if (typeof text !== "string" || text.trim().length === 0) {
|
|
12
|
+
throw new Error("Agent.chat requires non-empty text");
|
|
13
|
+
}
|
|
14
|
+
return text;
|
|
15
|
+
}
|
|
16
|
+
function assertRequestPath(path) {
|
|
17
|
+
if (typeof path !== "string" || path.trim().length === 0) {
|
|
18
|
+
throw new Error("Agent.request path must start with /");
|
|
19
|
+
}
|
|
20
|
+
const trimmed = path.trim();
|
|
21
|
+
if (!trimmed.startsWith("/") ||
|
|
22
|
+
trimmed.startsWith("//") ||
|
|
23
|
+
trimmed.includes("\\")) {
|
|
24
|
+
throw new Error("Agent.request requires a local path that starts with / and is not an absolute URL");
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const parsed = new URL(trimmed);
|
|
28
|
+
if (parsed.protocol) {
|
|
29
|
+
throw new Error("Agent.request requires a local path that starts with / and is not an absolute URL");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
if (err instanceof Error && err.message.includes("absolute URL")) {
|
|
34
|
+
throw err;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return trimmed;
|
|
38
|
+
}
|
|
39
|
+
function assertRequestMethod(method) {
|
|
40
|
+
if (method === undefined)
|
|
41
|
+
return "GET";
|
|
42
|
+
if (typeof method !== "string") {
|
|
43
|
+
throw new Error("Unsupported HTTP method");
|
|
44
|
+
}
|
|
45
|
+
const normalized = method.trim().toUpperCase();
|
|
46
|
+
if (!/^[A-Z]{1,16}$/.test(normalized)) {
|
|
47
|
+
throw new Error("Unsupported HTTP method");
|
|
48
|
+
}
|
|
49
|
+
return normalized;
|
|
50
|
+
}
|
|
10
51
|
/**
|
|
11
52
|
* Web fallback implementation.
|
|
12
53
|
*
|
|
@@ -74,6 +115,7 @@ var capacitorAgent = (function (exports, core) {
|
|
|
74
115
|
}
|
|
75
116
|
async chatViaConversation(text, retryOnMissingConversation = true) {
|
|
76
117
|
const conversationId = await this.ensureLegacyConversationId();
|
|
118
|
+
// @duplicate-component-audit-allow: agent API message POST; server-side runtime owns model trajectory logging.
|
|
77
119
|
const res = await fetch(`${this.apiBase()}/api/conversations/${encodeURIComponent(conversationId)}/messages`, {
|
|
78
120
|
method: "POST",
|
|
79
121
|
headers: {
|
|
@@ -100,6 +142,27 @@ var capacitorAgent = (function (exports, core) {
|
|
|
100
142
|
// No explicit base — use relative URLs (works on http/https origins).
|
|
101
143
|
return "";
|
|
102
144
|
}
|
|
145
|
+
isLocalAgentIpcBase() {
|
|
146
|
+
const base = this.apiBase().trim();
|
|
147
|
+
if (!base)
|
|
148
|
+
return false;
|
|
149
|
+
const lower = base.toLowerCase();
|
|
150
|
+
if (lower === "eliza-local-agent://ipc" ||
|
|
151
|
+
lower.startsWith("eliza-local-agent://ipc/") ||
|
|
152
|
+
lower.startsWith("eliza-local-agent://ipc?")) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
const parsed = new URL(base);
|
|
157
|
+
return (parsed.protocol === "eliza-local-agent:" &&
|
|
158
|
+
(parsed.hostname === "ipc" ||
|
|
159
|
+
parsed.pathname === "//ipc" ||
|
|
160
|
+
parsed.pathname.startsWith("//ipc/")));
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
103
166
|
apiToken() {
|
|
104
167
|
const global = typeof window !== "undefined"
|
|
105
168
|
? window.__ELIZA_API_TOKEN__
|
|
@@ -117,6 +180,8 @@ var capacitorAgent = (function (exports, core) {
|
|
|
117
180
|
}
|
|
118
181
|
/** True when we can reach the API via HTTP. */
|
|
119
182
|
canReachApi() {
|
|
183
|
+
if (this.isLocalAgentIpcBase())
|
|
184
|
+
return false;
|
|
120
185
|
const global = typeof window !== "undefined"
|
|
121
186
|
? window.__ELIZA_API_BASE__
|
|
122
187
|
: undefined;
|
|
@@ -128,7 +193,7 @@ var capacitorAgent = (function (exports, core) {
|
|
|
128
193
|
const proto = window.location.protocol;
|
|
129
194
|
return proto === "http:" || proto === "https:";
|
|
130
195
|
}
|
|
131
|
-
async start() {
|
|
196
|
+
async start(_options) {
|
|
132
197
|
if (!this.canReachApi()) {
|
|
133
198
|
return {
|
|
134
199
|
state: "not_started",
|
|
@@ -171,10 +236,51 @@ var capacitorAgent = (function (exports, core) {
|
|
|
171
236
|
return res.json();
|
|
172
237
|
}
|
|
173
238
|
async chat(options) {
|
|
239
|
+
const text = assertNonEmptyText(options.text);
|
|
174
240
|
if (!this.canReachApi()) {
|
|
175
241
|
return { text: "Agent API not available", agentName: "System" };
|
|
176
242
|
}
|
|
177
|
-
return this.chatViaConversation(
|
|
243
|
+
return this.chatViaConversation(text);
|
|
244
|
+
}
|
|
245
|
+
async getLocalAgentToken() {
|
|
246
|
+
const token = this.apiToken();
|
|
247
|
+
return {
|
|
248
|
+
available: Boolean(token),
|
|
249
|
+
token,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
async request(options) {
|
|
253
|
+
const path = assertRequestPath(options.path);
|
|
254
|
+
const method = assertRequestMethod(options.method);
|
|
255
|
+
if (this.isLocalAgentIpcBase()) {
|
|
256
|
+
return {
|
|
257
|
+
status: 503,
|
|
258
|
+
statusText: "Service Unavailable",
|
|
259
|
+
headers: { "content-type": "application/json" },
|
|
260
|
+
body: JSON.stringify({
|
|
261
|
+
error: "native_agent_unavailable",
|
|
262
|
+
message: "Agent web fallback cannot handle eliza-local-agent://ipc; use the native Capacitor Agent plugin",
|
|
263
|
+
}),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const res = await fetch(`${this.apiBase()}${path}`, {
|
|
267
|
+
method,
|
|
268
|
+
headers: {
|
|
269
|
+
...this.authHeaders(),
|
|
270
|
+
...options.headers,
|
|
271
|
+
},
|
|
272
|
+
body: options.body ?? undefined,
|
|
273
|
+
});
|
|
274
|
+
const headers = {};
|
|
275
|
+
res.headers.forEach((value, key) => {
|
|
276
|
+
headers[key] = value;
|
|
277
|
+
});
|
|
278
|
+
return {
|
|
279
|
+
status: res.status,
|
|
280
|
+
statusText: res.statusText,
|
|
281
|
+
headers,
|
|
282
|
+
body: await res.text(),
|
|
283
|
+
};
|
|
178
284
|
}
|
|
179
285
|
}
|
|
180
286
|
|