@clappstore/connect 0.6.1 → 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.
Files changed (42) hide show
  1. package/dist/agent-handler.d.ts +5 -3
  2. package/dist/agent-handler.d.ts.map +1 -1
  3. package/dist/agent-handler.js +54 -3
  4. package/dist/agent-handler.js.map +1 -1
  5. package/dist/defaults.d.ts +0 -3
  6. package/dist/defaults.d.ts.map +1 -1
  7. package/dist/defaults.js +0 -8
  8. package/dist/defaults.js.map +1 -1
  9. package/dist/index.js +37 -88
  10. package/dist/index.js.map +1 -1
  11. package/dist/server.d.ts +13 -0
  12. package/dist/server.d.ts.map +1 -0
  13. package/dist/server.js +202 -0
  14. package/dist/server.js.map +1 -0
  15. package/dist/settings-handler.d.ts +7 -7
  16. package/dist/settings-handler.d.ts.map +1 -1
  17. package/dist/settings-handler.js +16 -21
  18. package/dist/settings-handler.js.map +1 -1
  19. package/dist/state-store.d.ts +40 -0
  20. package/dist/state-store.d.ts.map +1 -0
  21. package/dist/state-store.js +74 -0
  22. package/dist/state-store.js.map +1 -0
  23. package/package.json +7 -3
  24. package/web-app/assets/index-BYIO2GGA.css +1 -0
  25. package/web-app/assets/index-kbnfuSZC.js +128 -0
  26. package/web-app/index.html +13 -0
  27. package/dist/credentials.d.ts +0 -5
  28. package/dist/credentials.d.ts.map +0 -1
  29. package/dist/credentials.js +0 -32
  30. package/dist/credentials.js.map +0 -1
  31. package/dist/intent-poller.d.ts +0 -22
  32. package/dist/intent-poller.d.ts.map +0 -1
  33. package/dist/intent-poller.js +0 -51
  34. package/dist/intent-poller.js.map +0 -1
  35. package/dist/relay-client.d.ts +0 -16
  36. package/dist/relay-client.d.ts.map +0 -1
  37. package/dist/relay-client.js +0 -121
  38. package/dist/relay-client.js.map +0 -1
  39. package/dist/state-watcher.d.ts +0 -23
  40. package/dist/state-watcher.d.ts.map +0 -1
  41. package/dist/state-watcher.js +0 -121
  42. 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>
@@ -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"}
@@ -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
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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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"}