@clappstore/connect 0.6.0 → 0.7.0
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/agent-handler.d.ts +5 -3
- package/dist/agent-handler.d.ts.map +1 -1
- package/dist/agent-handler.js +54 -3
- package/dist/agent-handler.js.map +1 -1
- package/dist/defaults.d.ts +0 -3
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +3 -9
- package/dist/defaults.js.map +1 -1
- package/dist/index.js +37 -88
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +202 -0
- package/dist/server.js.map +1 -0
- package/dist/settings-handler.d.ts +7 -7
- package/dist/settings-handler.d.ts.map +1 -1
- package/dist/settings-handler.js +20 -22
- package/dist/settings-handler.js.map +1 -1
- package/dist/state-store.d.ts +40 -0
- package/dist/state-store.d.ts.map +1 -0
- package/dist/state-store.js +74 -0
- package/dist/state-store.js.map +1 -0
- package/package.json +7 -3
- package/web-app/assets/index-BYIO2GGA.css +1 -0
- package/web-app/assets/index-kbnfuSZC.js +128 -0
- package/web-app/index.html +13 -0
- package/dist/credentials.d.ts +0 -5
- package/dist/credentials.d.ts.map +0 -1
- package/dist/credentials.js +0 -32
- package/dist/credentials.js.map +0 -1
- package/dist/intent-poller.d.ts +0 -22
- package/dist/intent-poller.d.ts.map +0 -1
- package/dist/intent-poller.js +0 -51
- package/dist/intent-poller.js.map +0 -1
- package/dist/relay-client.d.ts +0 -16
- package/dist/relay-client.d.ts.map +0 -1
- package/dist/relay-client.js +0 -121
- package/dist/relay-client.js.map +0 -1
- package/dist/state-watcher.d.ts +0 -23
- package/dist/state-watcher.d.ts.map +0 -1
- package/dist/state-watcher.js +0 -121
- package/dist/state-watcher.js.map +0 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Clapps</title>
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-kbnfuSZC.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BYIO2GGA.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div id="root"></div>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
package/dist/credentials.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
declare const CREDENTIALS_PATH: string;
|
|
2
|
-
export declare function loadToken(relay: string, agentId: string): string | null;
|
|
3
|
-
export declare function saveToken(relay: string, agentId: string, token: string): void;
|
|
4
|
-
export { CREDENTIALS_PATH };
|
|
5
|
-
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,gBAAgB,QAIrB,CAAC;AAsBF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIvE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQ7E;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
package/dist/credentials.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
2
|
-
import { resolve, dirname } from "node:path";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
const CREDENTIALS_PATH = resolve(homedir(), ".openclaw", "clapps-credentials.json");
|
|
5
|
-
function credentialKey(relay, agentId) {
|
|
6
|
-
return `${relay}:${agentId}`;
|
|
7
|
-
}
|
|
8
|
-
function readCredentials() {
|
|
9
|
-
try {
|
|
10
|
-
const raw = readFileSync(CREDENTIALS_PATH, "utf-8");
|
|
11
|
-
return JSON.parse(raw);
|
|
12
|
-
}
|
|
13
|
-
catch {
|
|
14
|
-
return {};
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
export function loadToken(relay, agentId) {
|
|
18
|
-
const creds = readCredentials();
|
|
19
|
-
const entry = creds[credentialKey(relay, agentId)];
|
|
20
|
-
return entry?.token ?? null;
|
|
21
|
-
}
|
|
22
|
-
export function saveToken(relay, agentId, token) {
|
|
23
|
-
const creds = readCredentials();
|
|
24
|
-
creds[credentialKey(relay, agentId)] = {
|
|
25
|
-
token,
|
|
26
|
-
createdAt: new Date().toISOString(),
|
|
27
|
-
};
|
|
28
|
-
mkdirSync(dirname(CREDENTIALS_PATH), { recursive: true });
|
|
29
|
-
writeFileSync(CREDENTIALS_PATH, JSON.stringify(creds, null, 2) + "\n");
|
|
30
|
-
}
|
|
31
|
-
export { CREDENTIALS_PATH };
|
|
32
|
-
//# sourceMappingURL=credentials.js.map
|
package/dist/credentials.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,gBAAgB,GAAG,OAAO,CAC9B,OAAO,EAAE,EACT,WAAW,EACX,yBAAyB,CAC1B,CAAC;AASF,SAAS,aAAa,CAAC,KAAa,EAAE,OAAe;IACnD,OAAO,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,OAAe;IACtD,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,OAAO,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,OAAe,EAAE,KAAa;IACrE,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,GAAG;QACrC,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACzE,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
package/dist/intent-poller.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { IntentMessage } from "@clapps/core";
|
|
2
|
-
import type { AgentHandler } from "./agent-handler.js";
|
|
3
|
-
export interface IntentPollerOptions {
|
|
4
|
-
relayUrl: string;
|
|
5
|
-
token: string;
|
|
6
|
-
agentId: string;
|
|
7
|
-
agentHandler: AgentHandler;
|
|
8
|
-
intervalMs?: number;
|
|
9
|
-
onIntent?: (intent: IntentMessage) => boolean;
|
|
10
|
-
onError?: (error: Error) => void;
|
|
11
|
-
}
|
|
12
|
-
/** Poll the relay for pending intents and forward them to the agent */
|
|
13
|
-
export declare class IntentPoller {
|
|
14
|
-
private options;
|
|
15
|
-
private timer;
|
|
16
|
-
private lastSeen;
|
|
17
|
-
constructor(options: IntentPollerOptions);
|
|
18
|
-
start(): void;
|
|
19
|
-
stop(): void;
|
|
20
|
-
private poll;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=intent-poller.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intent-poller.d.ts","sourceRoot":"","sources":["../src/intent-poller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,uEAAuE;AACvE,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAM;gBAEV,OAAO,EAAE,mBAAmB;IAIxC,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;YAOE,IAAI;CA2BnB"}
|
package/dist/intent-poller.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/** Poll the relay for pending intents and forward them to the agent */
|
|
2
|
-
export class IntentPoller {
|
|
3
|
-
options;
|
|
4
|
-
timer = null;
|
|
5
|
-
lastSeen = "";
|
|
6
|
-
constructor(options) {
|
|
7
|
-
this.options = options;
|
|
8
|
-
}
|
|
9
|
-
start() {
|
|
10
|
-
if (this.timer)
|
|
11
|
-
return;
|
|
12
|
-
this.poll();
|
|
13
|
-
this.timer = setInterval(() => this.poll(), this.options.intervalMs ?? 1500);
|
|
14
|
-
}
|
|
15
|
-
stop() {
|
|
16
|
-
if (this.timer) {
|
|
17
|
-
clearInterval(this.timer);
|
|
18
|
-
this.timer = null;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
async poll() {
|
|
22
|
-
try {
|
|
23
|
-
const url = new URL("/api/agent/intents", this.options.relayUrl);
|
|
24
|
-
url.searchParams.set("token", this.options.token);
|
|
25
|
-
url.searchParams.set("agentId", this.options.agentId);
|
|
26
|
-
if (this.lastSeen) {
|
|
27
|
-
url.searchParams.set("since", this.lastSeen);
|
|
28
|
-
}
|
|
29
|
-
const res = await fetch(url.toString());
|
|
30
|
-
if (!res.ok)
|
|
31
|
-
return;
|
|
32
|
-
const data = (await res.json());
|
|
33
|
-
for (const intent of data.intents) {
|
|
34
|
-
this.lastSeen = intent.id;
|
|
35
|
-
try {
|
|
36
|
-
// Let onIntent handle it locally; skip ACP if it returns true
|
|
37
|
-
if (this.options.onIntent?.(intent))
|
|
38
|
-
continue;
|
|
39
|
-
await this.options.agentHandler.handleIntent(intent);
|
|
40
|
-
}
|
|
41
|
-
catch (err) {
|
|
42
|
-
this.options.onError?.(err);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
catch (err) {
|
|
47
|
-
this.options.onError?.(err);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=intent-poller.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intent-poller.js","sourceRoot":"","sources":["../src/intent-poller.ts"],"names":[],"mappings":"AAaA,uEAAuE;AACvE,MAAM,OAAO,YAAY;IACf,OAAO,CAAsB;IAC7B,KAAK,GAA0C,IAAI,CAAC;IACpD,QAAQ,GAAG,EAAE,CAAC;IAEtB,YAAY,OAA4B;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,KAAK,GAAG,WAAW,CACtB,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EACjB,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAChC,CAAC;IACJ,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACtD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO;YAEpB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiC,CAAC;YAChE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,8DAA8D;oBAC9D,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;wBAAE,SAAS;oBAC9C,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBACvD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAY,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAY,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;CACF"}
|
package/dist/relay-client.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export interface RelayClientOptions {
|
|
2
|
-
relayUrl: string;
|
|
3
|
-
token: string;
|
|
4
|
-
agentId: string;
|
|
5
|
-
}
|
|
6
|
-
export declare class RelayClient {
|
|
7
|
-
private relayUrl;
|
|
8
|
-
private token;
|
|
9
|
-
private agentId;
|
|
10
|
-
constructor(options: RelayClientOptions);
|
|
11
|
-
pushState(clappId: string, state: object): Promise<void>;
|
|
12
|
-
pushApps(apps: unknown[]): Promise<void>;
|
|
13
|
-
pushView(viewId: string, content: string): Promise<void>;
|
|
14
|
-
syncDir(stateDir: string, viewsDir?: string): Promise<void>;
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=relay-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relay-client.d.ts","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAwCD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,kBAAkB;IAMjC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBxD,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBxD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmClE"}
|
package/dist/relay-client.js
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
|
-
import { readdir } from "node:fs/promises";
|
|
3
|
-
import { basename, resolve } from "node:path";
|
|
4
|
-
const MAX_RETRIES = 4;
|
|
5
|
-
const BASE_DELAY_MS = 500;
|
|
6
|
-
async function retryFetch(url, init, label) {
|
|
7
|
-
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
8
|
-
try {
|
|
9
|
-
const res = await fetch(url, init);
|
|
10
|
-
if (res.ok)
|
|
11
|
-
return res;
|
|
12
|
-
if (attempt < MAX_RETRIES - 1 && res.status >= 500) {
|
|
13
|
-
const delay = BASE_DELAY_MS * 2 ** attempt + Math.random() * BASE_DELAY_MS;
|
|
14
|
-
console.warn(`[relay] Retry ${attempt + 1} for ${label}: HTTP ${res.status}`);
|
|
15
|
-
await new Promise((r) => setTimeout(r, delay));
|
|
16
|
-
continue;
|
|
17
|
-
}
|
|
18
|
-
throw new Error(`Failed to push ${label}: HTTP ${res.status}`);
|
|
19
|
-
}
|
|
20
|
-
catch (err) {
|
|
21
|
-
if (attempt < MAX_RETRIES - 1 && err.code) {
|
|
22
|
-
const delay = BASE_DELAY_MS * 2 ** attempt + Math.random() * BASE_DELAY_MS;
|
|
23
|
-
console.warn(`[relay] Retry ${attempt + 1} for ${label}: ${err.message}`);
|
|
24
|
-
await new Promise((r) => setTimeout(r, delay));
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
throw err;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
throw new Error(`Failed to push ${label} after ${MAX_RETRIES} attempts`);
|
|
31
|
-
}
|
|
32
|
-
export class RelayClient {
|
|
33
|
-
relayUrl;
|
|
34
|
-
token;
|
|
35
|
-
agentId;
|
|
36
|
-
constructor(options) {
|
|
37
|
-
this.relayUrl = options.relayUrl;
|
|
38
|
-
this.token = options.token;
|
|
39
|
-
this.agentId = options.agentId;
|
|
40
|
-
}
|
|
41
|
-
async pushState(clappId, state) {
|
|
42
|
-
await retryFetch(`${this.relayUrl}/api/agent/state`, {
|
|
43
|
-
method: "POST",
|
|
44
|
-
headers: {
|
|
45
|
-
"Content-Type": "application/json",
|
|
46
|
-
Authorization: `Bearer ${this.token}`,
|
|
47
|
-
},
|
|
48
|
-
body: JSON.stringify({
|
|
49
|
-
agentId: this.agentId,
|
|
50
|
-
clappId,
|
|
51
|
-
...state,
|
|
52
|
-
}),
|
|
53
|
-
}, `state/${clappId}`);
|
|
54
|
-
}
|
|
55
|
-
async pushApps(apps) {
|
|
56
|
-
await retryFetch(`${this.relayUrl}/api/agent/apps`, {
|
|
57
|
-
method: "POST",
|
|
58
|
-
headers: {
|
|
59
|
-
"Content-Type": "application/json",
|
|
60
|
-
Authorization: `Bearer ${this.token}`,
|
|
61
|
-
},
|
|
62
|
-
body: JSON.stringify({
|
|
63
|
-
agentId: this.agentId,
|
|
64
|
-
apps,
|
|
65
|
-
}),
|
|
66
|
-
}, "apps");
|
|
67
|
-
}
|
|
68
|
-
async pushView(viewId, content) {
|
|
69
|
-
await retryFetch(`${this.relayUrl}/api/agent/views`, {
|
|
70
|
-
method: "POST",
|
|
71
|
-
headers: {
|
|
72
|
-
"Content-Type": "application/json",
|
|
73
|
-
Authorization: `Bearer ${this.token}`,
|
|
74
|
-
},
|
|
75
|
-
body: JSON.stringify({
|
|
76
|
-
agentId: this.agentId,
|
|
77
|
-
viewId,
|
|
78
|
-
content,
|
|
79
|
-
}),
|
|
80
|
-
}, `view/${viewId}`);
|
|
81
|
-
}
|
|
82
|
-
async syncDir(stateDir, viewsDir) {
|
|
83
|
-
// Push all .json files from stateDir
|
|
84
|
-
const stateFiles = await readdir(stateDir);
|
|
85
|
-
for (const file of stateFiles) {
|
|
86
|
-
if (!file.endsWith(".json"))
|
|
87
|
-
continue;
|
|
88
|
-
try {
|
|
89
|
-
const content = await readFile(resolve(stateDir, file), "utf-8");
|
|
90
|
-
const parsed = JSON.parse(content);
|
|
91
|
-
const name = basename(file, ".json");
|
|
92
|
-
if (name === "_apps") {
|
|
93
|
-
await this.pushApps(parsed);
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
await this.pushState(name, parsed);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
catch (err) {
|
|
100
|
-
console.warn(`[relay] Failed to push ${file}: ${err.message}`);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
// Push all .md files from viewsDir
|
|
104
|
-
if (viewsDir) {
|
|
105
|
-
const viewFiles = await readdir(viewsDir);
|
|
106
|
-
for (const file of viewFiles) {
|
|
107
|
-
if (!file.endsWith(".md"))
|
|
108
|
-
continue;
|
|
109
|
-
try {
|
|
110
|
-
const content = await readFile(resolve(viewsDir, file), "utf-8");
|
|
111
|
-
const viewId = basename(file, ".md");
|
|
112
|
-
await this.pushView(viewId, content);
|
|
113
|
-
}
|
|
114
|
-
catch (err) {
|
|
115
|
-
console.warn(`[relay] Failed to push view ${file}: ${err.message}`);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
//# sourceMappingURL=relay-client.js.map
|
package/dist/relay-client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"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"}
|
package/dist/state-watcher.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export interface StateWatcherOptions {
|
|
2
|
-
stateDir: string;
|
|
3
|
-
viewsDir?: string;
|
|
4
|
-
relayUrl: string;
|
|
5
|
-
token: string;
|
|
6
|
-
agentId: string;
|
|
7
|
-
onError?: (error: Error) => void;
|
|
8
|
-
}
|
|
9
|
-
/** Watch the agent's ui/state/ directory for changes and push to relay */
|
|
10
|
-
export declare class StateWatcher {
|
|
11
|
-
private options;
|
|
12
|
-
private stateWatcher;
|
|
13
|
-
private viewsWatcher;
|
|
14
|
-
constructor(options: StateWatcherOptions);
|
|
15
|
-
start(): void;
|
|
16
|
-
/** Resolves when chokidar has finished its initial scan and filesystem watchers are active */
|
|
17
|
-
waitReady(): Promise<void>;
|
|
18
|
-
stop(): Promise<void>;
|
|
19
|
-
private pushState;
|
|
20
|
-
private pushView;
|
|
21
|
-
private pushApps;
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=state-watcher.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state-watcher.d.ts","sourceRoot":"","sources":["../src/state-watcher.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,0EAA0E;AAC1E,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,YAAY,CAA0B;gBAElC,OAAO,EAAE,mBAAmB;IAIxC,KAAK,IAAI,IAAI;IAoBb,8FAA8F;IAC9F,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOb,SAAS;YAgCT,QAAQ;YA0BR,QAAQ;CAiBvB"}
|
package/dist/state-watcher.js
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { watch } from "chokidar";
|
|
2
|
-
import { readFile } from "node:fs/promises";
|
|
3
|
-
import { basename } from "node:path";
|
|
4
|
-
/** Watch the agent's ui/state/ directory for changes and push to relay */
|
|
5
|
-
export class StateWatcher {
|
|
6
|
-
options;
|
|
7
|
-
stateWatcher = null;
|
|
8
|
-
viewsWatcher = null;
|
|
9
|
-
constructor(options) {
|
|
10
|
-
this.options = options;
|
|
11
|
-
}
|
|
12
|
-
start() {
|
|
13
|
-
this.stateWatcher = watch(`${this.options.stateDir}/*.json`, {
|
|
14
|
-
ignoreInitial: false,
|
|
15
|
-
awaitWriteFinish: { stabilityThreshold: 200 },
|
|
16
|
-
});
|
|
17
|
-
this.stateWatcher.on("add", (path) => this.pushState(path));
|
|
18
|
-
this.stateWatcher.on("change", (path) => this.pushState(path));
|
|
19
|
-
if (this.options.viewsDir) {
|
|
20
|
-
this.viewsWatcher = watch(`${this.options.viewsDir}/*.md`, {
|
|
21
|
-
ignoreInitial: false,
|
|
22
|
-
awaitWriteFinish: { stabilityThreshold: 200 },
|
|
23
|
-
});
|
|
24
|
-
this.viewsWatcher.on("add", (path) => this.pushView(path));
|
|
25
|
-
this.viewsWatcher.on("change", (path) => this.pushView(path));
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/** Resolves when chokidar has finished its initial scan and filesystem watchers are active */
|
|
29
|
-
waitReady() {
|
|
30
|
-
return new Promise((resolve) => {
|
|
31
|
-
if (!this.viewsWatcher) {
|
|
32
|
-
this.stateWatcher?.on("ready", () => resolve());
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
let readyCount = 0;
|
|
36
|
-
const onReady = () => {
|
|
37
|
-
readyCount++;
|
|
38
|
-
if (readyCount >= 2)
|
|
39
|
-
resolve();
|
|
40
|
-
};
|
|
41
|
-
this.stateWatcher?.on("ready", onReady);
|
|
42
|
-
this.viewsWatcher.on("ready", onReady);
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
async stop() {
|
|
46
|
-
await this.stateWatcher?.close();
|
|
47
|
-
await this.viewsWatcher?.close();
|
|
48
|
-
this.stateWatcher = null;
|
|
49
|
-
this.viewsWatcher = null;
|
|
50
|
-
}
|
|
51
|
-
async pushState(filePath) {
|
|
52
|
-
try {
|
|
53
|
-
const content = await readFile(filePath, "utf-8");
|
|
54
|
-
const parsed = JSON.parse(content);
|
|
55
|
-
const name = basename(filePath, ".json");
|
|
56
|
-
if (name === "_apps") {
|
|
57
|
-
await this.pushApps(parsed);
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
const res = await fetch(`${this.options.relayUrl}/api/agent/state`, {
|
|
61
|
-
method: "POST",
|
|
62
|
-
headers: {
|
|
63
|
-
"Content-Type": "application/json",
|
|
64
|
-
Authorization: `Bearer ${this.options.token}`,
|
|
65
|
-
},
|
|
66
|
-
body: JSON.stringify({
|
|
67
|
-
agentId: this.options.agentId,
|
|
68
|
-
clappId: name,
|
|
69
|
-
...parsed,
|
|
70
|
-
}),
|
|
71
|
-
});
|
|
72
|
-
if (!res.ok) {
|
|
73
|
-
throw new Error(`Failed to push state: ${res.status}`);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
catch (err) {
|
|
77
|
-
this.options.onError?.(err);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
async pushView(filePath) {
|
|
81
|
-
try {
|
|
82
|
-
const content = await readFile(filePath, "utf-8");
|
|
83
|
-
const viewId = basename(filePath, ".md");
|
|
84
|
-
const res = await fetch(`${this.options.relayUrl}/api/agent/views`, {
|
|
85
|
-
method: "POST",
|
|
86
|
-
headers: {
|
|
87
|
-
"Content-Type": "application/json",
|
|
88
|
-
Authorization: `Bearer ${this.options.token}`,
|
|
89
|
-
},
|
|
90
|
-
body: JSON.stringify({
|
|
91
|
-
agentId: this.options.agentId,
|
|
92
|
-
viewId,
|
|
93
|
-
content,
|
|
94
|
-
}),
|
|
95
|
-
});
|
|
96
|
-
if (!res.ok) {
|
|
97
|
-
throw new Error(`Failed to push view: ${res.status}`);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
catch (err) {
|
|
101
|
-
this.options.onError?.(err);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
async pushApps(apps) {
|
|
105
|
-
const res = await fetch(`${this.options.relayUrl}/api/agent/apps`, {
|
|
106
|
-
method: "POST",
|
|
107
|
-
headers: {
|
|
108
|
-
"Content-Type": "application/json",
|
|
109
|
-
Authorization: `Bearer ${this.options.token}`,
|
|
110
|
-
},
|
|
111
|
-
body: JSON.stringify({
|
|
112
|
-
agentId: this.options.agentId,
|
|
113
|
-
apps,
|
|
114
|
-
}),
|
|
115
|
-
});
|
|
116
|
-
if (!res.ok) {
|
|
117
|
-
throw new Error(`Failed to push apps: ${res.status}`);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
//# sourceMappingURL=state-watcher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state-watcher.js","sourceRoot":"","sources":["../src/state-watcher.ts"],"names":[],"mappings":"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"}
|