@clappstore/connect 0.7.1 → 0.7.2

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.
@@ -0,0 +1,28 @@
1
+ import type { IntentMessage } from "@clapps/core";
2
+ export interface AgentClientOptions {
3
+ session: string;
4
+ agentToken?: string;
5
+ onError?: (error: Error) => void;
6
+ }
7
+ /** Communicate with the local OpenClaw agent via ACP (Agent Client Protocol) subprocess */
8
+ export declare class AgentClient {
9
+ private session;
10
+ private agentToken;
11
+ private onError;
12
+ private proc;
13
+ private rl;
14
+ private nextId;
15
+ private pending;
16
+ private started;
17
+ constructor(options: AgentClientOptions);
18
+ /** Spawn the ACP subprocess and run the initialize + session/load handshake */
19
+ start(): Promise<void>;
20
+ /** Send an intent to the agent via ACP session/prompt */
21
+ sendIntent(intent: IntentMessage): Promise<string>;
22
+ /** Kill the ACP subprocess */
23
+ stop(): void;
24
+ private spawnProcess;
25
+ private handleLine;
26
+ private rpc;
27
+ }
28
+ //# sourceMappingURL=agent-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-client.d.ts","sourceRoot":"","sources":["../src/agent-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAOD,2FAA2F;AAC3F,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,kBAAkB;IAMvC,+EAA+E;IACzE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB5B,yDAAyD;IACnD,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBxD,8BAA8B;IAC9B,IAAI,IAAI,IAAI;IAiBZ,OAAO,CAAC,YAAY;IA+CpB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,GAAG;CAyBZ"}
@@ -0,0 +1,159 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createInterface } from "node:readline";
3
+ /** Communicate with the local OpenClaw agent via ACP (Agent Client Protocol) subprocess */
4
+ export class AgentClient {
5
+ session;
6
+ agentToken;
7
+ onError;
8
+ proc = null;
9
+ rl = null;
10
+ nextId = 1;
11
+ pending = new Map();
12
+ started = false;
13
+ constructor(options) {
14
+ this.session = options.session;
15
+ this.agentToken = options.agentToken;
16
+ this.onError = options.onError;
17
+ }
18
+ /** Spawn the ACP subprocess and run the initialize + session/load handshake */
19
+ async start() {
20
+ if (this.started)
21
+ return;
22
+ this.spawnProcess();
23
+ // ACP handshake (must be sequential)
24
+ await this.rpc("initialize", {
25
+ protocolVersion: 1,
26
+ clientInfo: { name: "clapps-connect", version: "1.0.0" },
27
+ clientCapabilities: {},
28
+ });
29
+ await this.rpc("session/load", {
30
+ sessionId: this.session,
31
+ cwd: "/root",
32
+ mcpServers: [],
33
+ });
34
+ this.started = true;
35
+ console.log(`🔌 ACP connected (session: ${this.session})`);
36
+ }
37
+ /** Send an intent to the agent via ACP session/prompt */
38
+ async sendIntent(intent) {
39
+ if (!this.proc) {
40
+ throw new Error("AgentClient not started — call start() first");
41
+ }
42
+ const prompt = `[CLAPP_INTENT] ${intent.intent} ${JSON.stringify(intent.payload)}`;
43
+ const result = (await this.rpc("session/prompt", {
44
+ sessionId: this.session,
45
+ prompt: [{ type: "text", text: prompt }],
46
+ }));
47
+ // Extract text from the response
48
+ if (result && typeof result === "object" && "content" in result) {
49
+ const texts = (result.content ?? [])
50
+ .map((c) => c.text)
51
+ .filter(Boolean);
52
+ return texts.join("\n");
53
+ }
54
+ return "";
55
+ }
56
+ /** Kill the ACP subprocess */
57
+ stop() {
58
+ this.started = false;
59
+ this.rl?.close();
60
+ this.rl = null;
61
+ if (this.proc) {
62
+ this.proc.kill("SIGTERM");
63
+ this.proc = null;
64
+ }
65
+ // Reject any pending requests
66
+ for (const [, pending] of this.pending) {
67
+ pending.reject(new Error("AgentClient stopped"));
68
+ }
69
+ this.pending.clear();
70
+ }
71
+ // ---- internals ----
72
+ spawnProcess() {
73
+ const args = ["acp", "--session", this.session];
74
+ if (this.agentToken) {
75
+ args.push("--token", this.agentToken);
76
+ }
77
+ this.proc = spawn("openclaw", args, {
78
+ stdio: ["pipe", "pipe", "pipe"],
79
+ });
80
+ this.rl = createInterface({ input: this.proc.stdout });
81
+ this.rl.on("line", (line) => this.handleLine(line));
82
+ this.proc.stderr?.on("data", (chunk) => {
83
+ const msg = chunk.toString().trim();
84
+ if (msg) {
85
+ console.error(`[acp stderr] ${msg}`);
86
+ }
87
+ });
88
+ this.proc.on("exit", (code) => {
89
+ if (this.started) {
90
+ const err = new Error(`ACP process exited unexpectedly (code ${code})`);
91
+ this.onError?.(err);
92
+ // Auto-restart
93
+ this.proc = null;
94
+ this.rl = null;
95
+ // Reject pending requests
96
+ for (const [, pending] of this.pending) {
97
+ pending.reject(err);
98
+ }
99
+ this.pending.clear();
100
+ // Attempt restart after a short delay
101
+ setTimeout(() => {
102
+ if (this.started) {
103
+ console.log("🔄 Restarting ACP subprocess...");
104
+ this.start().catch((e) => this.onError?.(e));
105
+ }
106
+ }, 2000);
107
+ }
108
+ });
109
+ this.proc.on("error", (err) => {
110
+ this.onError?.(err);
111
+ });
112
+ }
113
+ handleLine(line) {
114
+ let msg;
115
+ try {
116
+ msg = JSON.parse(line);
117
+ }
118
+ catch {
119
+ // Not JSON — ignore
120
+ return;
121
+ }
122
+ // Ignore notifications (no id field — like session/update)
123
+ if (msg.id == null)
124
+ return;
125
+ const pending = this.pending.get(msg.id);
126
+ if (!pending)
127
+ return;
128
+ this.pending.delete(msg.id);
129
+ if (msg.error) {
130
+ pending.reject(new Error(msg.error.message));
131
+ }
132
+ else {
133
+ pending.resolve(msg.result);
134
+ }
135
+ }
136
+ rpc(method, params) {
137
+ return new Promise((resolve, reject) => {
138
+ if (!this.proc?.stdin?.writable) {
139
+ reject(new Error("ACP process not running"));
140
+ return;
141
+ }
142
+ const id = this.nextId++;
143
+ this.pending.set(id, { resolve, reject });
144
+ const request = JSON.stringify({
145
+ jsonrpc: "2.0",
146
+ id,
147
+ method,
148
+ params,
149
+ });
150
+ this.proc.stdin.write(request + "\n", (err) => {
151
+ if (err) {
152
+ this.pending.delete(id);
153
+ reject(err);
154
+ }
155
+ });
156
+ });
157
+ }
158
+ }
159
+ //# sourceMappingURL=agent-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-client.js","sourceRoot":"","sources":["../src/agent-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { IntentMessage } from "@clapps/core";
2
+ import type { AgentClient } from "./agent-client.js";
3
+ import type { StateStore } from "./state-store.js";
4
+ export interface AgentHandlerOptions {
5
+ agentClient: AgentClient;
6
+ store: StateStore;
7
+ stateDir: string;
8
+ viewsDir?: string;
9
+ }
10
+ export declare class AgentHandler {
11
+ private agentClient;
12
+ private store;
13
+ private stateDir;
14
+ private viewsDir;
15
+ constructor(options: AgentHandlerOptions);
16
+ handleIntent(intent: IntentMessage): Promise<void>;
17
+ /** Read state/views from disk and push into the in-memory store */
18
+ syncToStore(): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=agent-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-handler.d.ts","sourceRoot":"","sources":["../src/agent-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAqB;gBAEzB,OAAO,EAAE,mBAAmB;IAOlC,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD,mEAAmE;IAC7D,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CA8CnC"}
@@ -0,0 +1,68 @@
1
+ export class AgentHandler {
2
+ agentClient;
3
+ store;
4
+ stateDir;
5
+ viewsDir;
6
+ constructor(options) {
7
+ this.agentClient = options.agentClient;
8
+ this.store = options.store;
9
+ this.stateDir = options.stateDir;
10
+ this.viewsDir = options.viewsDir;
11
+ }
12
+ async handleIntent(intent) {
13
+ await this.agentClient.sendIntent(intent);
14
+ await this.syncToStore();
15
+ }
16
+ /** Read state/views from disk and push into the in-memory store */
17
+ async syncToStore() {
18
+ const { readdir, readFile } = await import("node:fs/promises");
19
+ const { resolve, basename } = await import("node:path");
20
+ // Sync state files
21
+ try {
22
+ const stateFiles = await readdir(this.stateDir);
23
+ for (const file of stateFiles) {
24
+ if (!file.endsWith(".json"))
25
+ continue;
26
+ try {
27
+ const content = await readFile(resolve(this.stateDir, file), "utf-8");
28
+ const parsed = JSON.parse(content);
29
+ const name = basename(file, ".json");
30
+ if (name === "_apps") {
31
+ this.store.setApps(parsed);
32
+ }
33
+ else {
34
+ this.store.setState(name, parsed);
35
+ }
36
+ }
37
+ catch (err) {
38
+ console.warn(`[sync] Failed to read ${file}: ${err.message}`);
39
+ }
40
+ }
41
+ }
42
+ catch {
43
+ // stateDir may not exist yet
44
+ }
45
+ // Sync view files
46
+ if (this.viewsDir) {
47
+ try {
48
+ const viewFiles = await readdir(this.viewsDir);
49
+ for (const file of viewFiles) {
50
+ if (!file.endsWith(".md"))
51
+ continue;
52
+ try {
53
+ const content = await readFile(resolve(this.viewsDir, file), "utf-8");
54
+ const viewId = basename(file, ".md");
55
+ this.store.setView(viewId, content);
56
+ }
57
+ catch (err) {
58
+ console.warn(`[sync] Failed to read view ${file}: ${err.message}`);
59
+ }
60
+ }
61
+ }
62
+ catch {
63
+ // viewsDir may not exist yet
64
+ }
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=agent-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-handler.js","sourceRoot":"","sources":["../src/agent-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { AppEntry, ClappState } from "@clapps/core";
2
+ import type { WebSocket } from "ws";
3
+ export interface WsMessage {
4
+ type: string;
5
+ [key: string]: unknown;
6
+ }
7
+ interface ConnectedClient {
8
+ ws: WebSocket;
9
+ subscriptions: Set<string>;
10
+ context?: ClientContext;
11
+ }
12
+ export interface ClientContext {
13
+ platform?: string;
14
+ user?: Record<string, unknown>;
15
+ capabilities?: Record<string, unknown>;
16
+ }
17
+ /**
18
+ * In-memory store for apps, state, and views.
19
+ * Broadcasts changes to connected WebSocket clients.
20
+ */
21
+ export declare class StateStore {
22
+ private apps;
23
+ private state;
24
+ private views;
25
+ private clients;
26
+ addClient(ws: WebSocket, context?: ClientContext): ConnectedClient;
27
+ removeClient(client: ConnectedClient): void;
28
+ subscribe(client: ConnectedClient, clappIds: string[]): void;
29
+ getApps(): AppEntry[];
30
+ setApps(apps: AppEntry[]): void;
31
+ getState(clappId: string): ClappState | undefined;
32
+ setState(clappId: string, state: ClappState): void;
33
+ getView(viewId: string): string | undefined;
34
+ setView(viewId: string, content: string): void;
35
+ private broadcast;
36
+ private broadcastToSubscribers;
37
+ private safeSend;
38
+ }
39
+ export {};
40
+ //# sourceMappingURL=state-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../src/state-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,eAAe;IACvB,EAAE,EAAE,SAAS,CAAC;IACd,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,OAAO,CAA8B;IAI7C,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,eAAe;IAMlE,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAI3C,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAQ5D,OAAO,IAAI,QAAQ,EAAE;IAIrB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI;IAO/B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIjD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAWlD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3C,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAO9C,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,QAAQ;CAKjB"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * In-memory store for apps, state, and views.
3
+ * Broadcasts changes to connected WebSocket clients.
4
+ */
5
+ export class StateStore {
6
+ apps = [];
7
+ state = new Map();
8
+ views = new Map();
9
+ clients = new Set();
10
+ // --- Client management ---
11
+ addClient(ws, context) {
12
+ const client = { ws, subscriptions: new Set(), context };
13
+ this.clients.add(client);
14
+ return client;
15
+ }
16
+ removeClient(client) {
17
+ this.clients.delete(client);
18
+ }
19
+ subscribe(client, clappIds) {
20
+ for (const id of clappIds) {
21
+ client.subscriptions.add(id);
22
+ }
23
+ }
24
+ // --- Apps ---
25
+ getApps() {
26
+ return this.apps;
27
+ }
28
+ setApps(apps) {
29
+ this.apps = apps;
30
+ this.broadcast({ type: "apps", apps });
31
+ }
32
+ // --- State ---
33
+ getState(clappId) {
34
+ return this.state.get(clappId);
35
+ }
36
+ setState(clappId, state) {
37
+ this.state.set(clappId, state);
38
+ this.broadcastToSubscribers(clappId, {
39
+ type: "state",
40
+ clappId,
41
+ state,
42
+ });
43
+ }
44
+ // --- Views ---
45
+ getView(viewId) {
46
+ return this.views.get(viewId);
47
+ }
48
+ setView(viewId, content) {
49
+ this.views.set(viewId, content);
50
+ this.broadcast({ type: "view", viewId, content });
51
+ }
52
+ // --- Broadcast ---
53
+ broadcast(msg) {
54
+ const data = JSON.stringify(msg);
55
+ for (const client of this.clients) {
56
+ this.safeSend(client.ws, data);
57
+ }
58
+ }
59
+ broadcastToSubscribers(clappId, msg) {
60
+ const data = JSON.stringify(msg);
61
+ for (const client of this.clients) {
62
+ // Send to clients subscribed to this clappId, or to all if they have no subscriptions (broadcast mode)
63
+ if (client.subscriptions.size === 0 || client.subscriptions.has(clappId)) {
64
+ this.safeSend(client.ws, data);
65
+ }
66
+ }
67
+ }
68
+ safeSend(ws, data) {
69
+ if (ws.readyState === ws.OPEN) {
70
+ ws.send(data);
71
+ }
72
+ }
73
+ }
74
+ //# sourceMappingURL=state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../src/state-store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clappstore/connect",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "clapps-connect": "./dist/index.js"