@clappstore/connect 0.3.3 → 0.5.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 +18 -0
- package/dist/agent-handler.d.ts.map +1 -0
- package/dist/agent-handler.js +17 -0
- package/dist/agent-handler.js.map +1 -0
- package/dist/defaults.d.ts +3 -0
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +96 -17
- package/dist/defaults.js.map +1 -1
- package/dist/index.js +37 -32
- package/dist/index.js.map +1 -1
- package/dist/intent-poller.d.ts +4 -2
- package/dist/intent-poller.d.ts.map +1 -1
- package/dist/intent-poller.js +4 -2
- package/dist/intent-poller.js.map +1 -1
- package/dist/relay-client.d.ts +16 -0
- package/dist/relay-client.d.ts.map +1 -0
- package/dist/relay-client.js +121 -0
- package/dist/relay-client.js.map +1 -0
- package/dist/settings-handler.d.ts +24 -0
- package/dist/settings-handler.d.ts.map +1 -0
- package/dist/settings-handler.js +103 -0
- package/dist/settings-handler.js.map +1 -0
- package/package.json +1 -4
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { IntentMessage } from "@clapps/core";
|
|
2
|
+
import type { AgentClient } from "./agent-client.js";
|
|
3
|
+
import type { RelayClient } from "./relay-client.js";
|
|
4
|
+
export interface AgentHandlerOptions {
|
|
5
|
+
agentClient: AgentClient;
|
|
6
|
+
relay: RelayClient;
|
|
7
|
+
stateDir: string;
|
|
8
|
+
viewsDir?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class AgentHandler {
|
|
11
|
+
private agentClient;
|
|
12
|
+
private relay;
|
|
13
|
+
private stateDir;
|
|
14
|
+
private viewsDir;
|
|
15
|
+
constructor(options: AgentHandlerOptions);
|
|
16
|
+
handleIntent(intent: IntentMessage): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# 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,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAqB;gBAEzB,OAAO,EAAE,mBAAmB;IAOlC,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class AgentHandler {
|
|
2
|
+
agentClient;
|
|
3
|
+
relay;
|
|
4
|
+
stateDir;
|
|
5
|
+
viewsDir;
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.agentClient = options.agentClient;
|
|
8
|
+
this.relay = options.relay;
|
|
9
|
+
this.stateDir = options.stateDir;
|
|
10
|
+
this.viewsDir = options.viewsDir;
|
|
11
|
+
}
|
|
12
|
+
async handleIntent(intent) {
|
|
13
|
+
await this.agentClient.sendIntent(intent);
|
|
14
|
+
await this.relay.syncDir(this.stateDir, this.viewsDir);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=agent-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-handler.js","sourceRoot":"","sources":["../src/agent-handler.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,YAAY;IACf,WAAW,CAAc;IACzB,KAAK,CAAc;IACnB,QAAQ,CAAS;IACjB,QAAQ,CAAqB;IAErC,YAAY,OAA4B;QACtC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAqB;QACtC,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;CACF"}
|
package/dist/defaults.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import type { RelayClient } from "./relay-client.js";
|
|
1
2
|
export declare function seedDefaults(viewsDir: string, stateDir: string): void;
|
|
3
|
+
/** Push all seeded files to the relay in one shot */
|
|
4
|
+
export declare function pushDefaults(relay: RelayClient, viewsDir: string, stateDir: string): Promise<void>;
|
|
2
5
|
/** Check if the agent has an AI provider API key configured and write _status.json */
|
|
3
6
|
export declare function checkAuthStatus(stateDir: string, authPath?: string): void;
|
|
4
7
|
//# sourceMappingURL=defaults.d.ts.map
|
package/dist/defaults.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAkIrD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAwCrE;AAED,qDAAqD;AACrD,wBAAsB,YAAY,CAChC,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAmDzE"}
|
package/dist/defaults.js
CHANGED
|
@@ -46,41 +46,120 @@ const DEFAULT_CHAT_APP_ENTRY = {
|
|
|
46
46
|
description: "Chat with the agent",
|
|
47
47
|
pinned: true,
|
|
48
48
|
};
|
|
49
|
+
const DEFAULT_SETTINGS_APP_MD = `---
|
|
50
|
+
name: Settings
|
|
51
|
+
domain: default
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Modules
|
|
55
|
+
- default/settings
|
|
56
|
+
|
|
57
|
+
## Layout
|
|
58
|
+
\`\`\`clapp-layout
|
|
59
|
+
Module(ref=default/settings):
|
|
60
|
+
\`\`\`
|
|
61
|
+
`;
|
|
62
|
+
const DEFAULT_SETTINGS_VIEW = `---
|
|
63
|
+
name: settings
|
|
64
|
+
domain: default
|
|
65
|
+
version: 0.1.0
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## State Bindings
|
|
69
|
+
- \`providers.anthropic.configured\` -> boolean
|
|
70
|
+
- \`providers.anthropic.maskedKey\` -> string
|
|
71
|
+
|
|
72
|
+
## Layout
|
|
73
|
+
\`\`\`clapp-layout
|
|
74
|
+
Column(gap=4):
|
|
75
|
+
Heading(level=2): "Settings"
|
|
76
|
+
Card(title=Anthropic API Key):
|
|
77
|
+
Column(gap=3):
|
|
78
|
+
Conditional(when=providers.anthropic.configured):
|
|
79
|
+
Heading(level=4): "Configured"
|
|
80
|
+
Conditional(when=!providers.anthropic.configured):
|
|
81
|
+
Heading(level=4): "Not configured"
|
|
82
|
+
IntentForm(intent=settings.setAnthropicKey, submitLabel=Save Key):
|
|
83
|
+
TextInput(name=apiKey, type=password, placeholder=sk-ant-...):
|
|
84
|
+
\`\`\`
|
|
85
|
+
|
|
86
|
+
## Intents
|
|
87
|
+
| Name | Payload | Description |
|
|
88
|
+
|------|---------|-------------|
|
|
89
|
+
| settings.setAnthropicKey | \`{ apiKey: string }\` | Set the Anthropic API key |
|
|
90
|
+
`;
|
|
91
|
+
const DEFAULT_SETTINGS_APP_ENTRY = {
|
|
92
|
+
id: "settings",
|
|
93
|
+
name: "Settings",
|
|
94
|
+
emoji: "\u2699\uFE0F",
|
|
95
|
+
description: "Configure your agent",
|
|
96
|
+
pinned: true,
|
|
97
|
+
};
|
|
98
|
+
const DEFAULT_APP_ENTRIES = [
|
|
99
|
+
DEFAULT_CHAT_APP_ENTRY,
|
|
100
|
+
DEFAULT_SETTINGS_APP_ENTRY,
|
|
101
|
+
];
|
|
102
|
+
const DEFAULT_APPS = [
|
|
103
|
+
{
|
|
104
|
+
appPath: "chat.app.md",
|
|
105
|
+
viewPath: "default.chat.view.md",
|
|
106
|
+
appMd: DEFAULT_CHAT_APP_MD,
|
|
107
|
+
viewMd: DEFAULT_CHAT_VIEW,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
appPath: "settings.app.md",
|
|
111
|
+
viewPath: "default.settings.view.md",
|
|
112
|
+
appMd: DEFAULT_SETTINGS_APP_MD,
|
|
113
|
+
viewMd: DEFAULT_SETTINGS_VIEW,
|
|
114
|
+
},
|
|
115
|
+
];
|
|
49
116
|
export function seedDefaults(viewsDir, stateDir) {
|
|
50
|
-
// Seed
|
|
51
|
-
const appPath
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
117
|
+
// Seed app definitions and view modules
|
|
118
|
+
for (const { appPath, viewPath, appMd, viewMd } of DEFAULT_APPS) {
|
|
119
|
+
const fullAppPath = resolve(viewsDir, appPath);
|
|
120
|
+
if (!existsSync(fullAppPath)) {
|
|
121
|
+
writeFileSync(fullAppPath, appMd, "utf-8");
|
|
122
|
+
console.log(`📝 Created default app: ${fullAppPath}`);
|
|
123
|
+
}
|
|
124
|
+
const fullViewPath = resolve(viewsDir, viewPath);
|
|
125
|
+
if (!existsSync(fullViewPath)) {
|
|
126
|
+
writeFileSync(fullViewPath, viewMd, "utf-8");
|
|
127
|
+
console.log(`📝 Created default view: ${fullViewPath}`);
|
|
128
|
+
}
|
|
61
129
|
}
|
|
62
130
|
// Seed or merge _apps.json
|
|
63
131
|
const appsPath = resolve(stateDir, "_apps.json");
|
|
64
132
|
if (!existsSync(appsPath)) {
|
|
65
|
-
writeFileSync(appsPath, JSON.stringify(
|
|
133
|
+
writeFileSync(appsPath, JSON.stringify(DEFAULT_APP_ENTRIES, null, 2), "utf-8");
|
|
66
134
|
console.log(`📝 Created default apps registry: ${appsPath}`);
|
|
67
135
|
}
|
|
68
136
|
else {
|
|
69
137
|
try {
|
|
70
138
|
const existing = JSON.parse(readFileSync(appsPath, "utf-8"));
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
existing.
|
|
139
|
+
let changed = false;
|
|
140
|
+
for (const entry of DEFAULT_APP_ENTRIES) {
|
|
141
|
+
if (!existing.some((app) => app.id === entry.id)) {
|
|
142
|
+
existing.push(entry);
|
|
143
|
+
changed = true;
|
|
144
|
+
console.log(`📝 Added ${entry.id} app to existing apps registry`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (changed) {
|
|
74
148
|
writeFileSync(appsPath, JSON.stringify(existing, null, 2), "utf-8");
|
|
75
|
-
console.log(`📝 Added chat app to existing apps registry`);
|
|
76
149
|
}
|
|
77
150
|
}
|
|
78
151
|
catch {
|
|
79
152
|
// If _apps.json is malformed, don't overwrite — let the user fix it
|
|
80
|
-
console.warn(`⚠️ Could not parse ${appsPath}, skipping
|
|
153
|
+
console.warn(`⚠️ Could not parse ${appsPath}, skipping app seeding`);
|
|
81
154
|
}
|
|
82
155
|
}
|
|
83
156
|
}
|
|
157
|
+
/** Push all seeded files to the relay in one shot */
|
|
158
|
+
export async function pushDefaults(relay, viewsDir, stateDir) {
|
|
159
|
+
console.log("Pushing defaults to relay...");
|
|
160
|
+
await relay.syncDir(stateDir, viewsDir);
|
|
161
|
+
console.log("Initial sync complete");
|
|
162
|
+
}
|
|
84
163
|
/** Check if the agent has an AI provider API key configured and write _status.json */
|
|
85
164
|
export function checkAuthStatus(stateDir, authPath) {
|
|
86
165
|
const defaultAuthPath = resolve(homedir(), ".openclaw", "agents", "main", "agent", "auth.json");
|
package/dist/defaults.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,10 +3,12 @@ import { resolve } from "node:path";
|
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { mkdirSync } from "node:fs";
|
|
5
5
|
import { AgentClient } from "./agent-client.js";
|
|
6
|
+
import { AgentHandler } from "./agent-handler.js";
|
|
6
7
|
import { IntentPoller } from "./intent-poller.js";
|
|
7
|
-
import {
|
|
8
|
+
import { RelayClient } from "./relay-client.js";
|
|
8
9
|
import { loadToken, saveToken, CREDENTIALS_PATH } from "./credentials.js";
|
|
9
|
-
import { seedDefaults, checkAuthStatus } from "./defaults.js";
|
|
10
|
+
import { seedDefaults, checkAuthStatus, pushDefaults } from "./defaults.js";
|
|
11
|
+
import { SettingsHandler } from "./settings-handler.js";
|
|
10
12
|
function parseArgs(args) {
|
|
11
13
|
const opts = {};
|
|
12
14
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -68,29 +70,18 @@ async function main() {
|
|
|
68
70
|
// Ensure directories exist
|
|
69
71
|
mkdirSync(stateDir, { recursive: true });
|
|
70
72
|
mkdirSync(viewsDir, { recursive: true });
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
agentClient,
|
|
81
|
-
onError: (err) => console.error("[intent-poller]", err.message),
|
|
82
|
-
});
|
|
83
|
-
const stateWatcher = new StateWatcher({
|
|
84
|
-
stateDir,
|
|
85
|
-
viewsDir,
|
|
86
|
-
relayUrl,
|
|
87
|
-
token,
|
|
88
|
-
agentId,
|
|
89
|
-
onError: (err) => console.error("[state-watcher]", err.message),
|
|
90
|
-
});
|
|
73
|
+
// 1. Create RelayClient
|
|
74
|
+
const relay = new RelayClient({ relayUrl, token, agentId });
|
|
75
|
+
// 2. Seed defaults to disk
|
|
76
|
+
seedDefaults(viewsDir, stateDir);
|
|
77
|
+
checkAuthStatus(stateDir);
|
|
78
|
+
const settingsHandler = new SettingsHandler({ stateDir, relay });
|
|
79
|
+
settingsHandler.writeSettingsState();
|
|
80
|
+
// 3. Push everything to relay (retried, awaited)
|
|
81
|
+
await pushDefaults(relay, viewsDir, stateDir);
|
|
91
82
|
console.log(`🤖 Agent ID: ${agentId}`);
|
|
92
|
-
console.log(`📁
|
|
93
|
-
console.log(`📄
|
|
83
|
+
console.log(`📁 State dir: ${stateDir}`);
|
|
84
|
+
console.log(`📄 Views dir: ${viewsDir}`);
|
|
94
85
|
// Create/reuse a stable link token for browser access
|
|
95
86
|
try {
|
|
96
87
|
const linkRes = await fetch(`${relayUrl}/api/agent/links`, {
|
|
@@ -114,12 +105,12 @@ async function main() {
|
|
|
114
105
|
catch (err) {
|
|
115
106
|
console.warn(`⚠️ Could not create link: ${err instanceof Error ? err.message : err}`);
|
|
116
107
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
108
|
+
// 4. Start ACP subprocess
|
|
109
|
+
const agentClient = new AgentClient({
|
|
110
|
+
session,
|
|
111
|
+
agentToken,
|
|
112
|
+
onError: (err) => console.error("[acp]", err.message),
|
|
113
|
+
});
|
|
123
114
|
try {
|
|
124
115
|
await agentClient.start();
|
|
125
116
|
}
|
|
@@ -127,13 +118,27 @@ async function main() {
|
|
|
127
118
|
console.error(`⚠️ ACP failed to start: ${err instanceof Error ? err.message : err}`);
|
|
128
119
|
console.error(" Intent processing will not work until ACP is available.");
|
|
129
120
|
}
|
|
121
|
+
// 5. Start polling for intents
|
|
122
|
+
const agentHandler = new AgentHandler({
|
|
123
|
+
agentClient,
|
|
124
|
+
relay,
|
|
125
|
+
stateDir,
|
|
126
|
+
viewsDir,
|
|
127
|
+
});
|
|
128
|
+
const intentPoller = new IntentPoller({
|
|
129
|
+
relayUrl,
|
|
130
|
+
token,
|
|
131
|
+
agentId,
|
|
132
|
+
agentHandler,
|
|
133
|
+
onIntent: settingsHandler.handleIntent,
|
|
134
|
+
onError: (err) => console.error("[intent-poller]", err.message),
|
|
135
|
+
});
|
|
130
136
|
intentPoller.start();
|
|
131
137
|
// Graceful shutdown
|
|
132
|
-
process.on("SIGINT",
|
|
138
|
+
process.on("SIGINT", () => {
|
|
133
139
|
console.log("\nShutting down...");
|
|
134
140
|
intentPoller.stop();
|
|
135
141
|
agentClient.stop();
|
|
136
|
-
await stateWatcher.stop();
|
|
137
142
|
process.exit(0);
|
|
138
143
|
});
|
|
139
144
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/intent-poller.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { IntentMessage } from "@clapps/core";
|
|
2
|
+
import type { AgentHandler } from "./agent-handler.js";
|
|
2
3
|
export interface IntentPollerOptions {
|
|
3
4
|
relayUrl: string;
|
|
4
5
|
token: string;
|
|
5
6
|
agentId: string;
|
|
6
|
-
|
|
7
|
+
agentHandler: AgentHandler;
|
|
7
8
|
intervalMs?: number;
|
|
9
|
+
onIntent?: (intent: IntentMessage) => boolean;
|
|
8
10
|
onError?: (error: Error) => void;
|
|
9
11
|
}
|
|
10
12
|
/** Poll the relay for pending intents and forward them to the agent */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent-poller.d.ts","sourceRoot":"","sources":["../src/intent-poller.ts"],"names":[],"mappings":"
|
|
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
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { AgentClient } from "./agent-client.js";
|
|
2
1
|
/** Poll the relay for pending intents and forward them to the agent */
|
|
3
2
|
export class IntentPoller {
|
|
4
3
|
options;
|
|
@@ -34,7 +33,10 @@ export class IntentPoller {
|
|
|
34
33
|
for (const intent of data.intents) {
|
|
35
34
|
this.lastSeen = intent.id;
|
|
36
35
|
try {
|
|
37
|
-
|
|
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);
|
|
38
40
|
}
|
|
39
41
|
catch (err) {
|
|
40
42
|
this.options.onError?.(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent-poller.js","sourceRoot":"","sources":["../src/intent-poller.ts"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQ9C,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B,KAAK,UAAU,UAAU,CACvB,GAAW,EACX,IAAiB,EACjB,KAAa;IAEb,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACnC,IAAI,GAAG,CAAC,EAAE;gBAAE,OAAO,GAAG,CAAC;YACvB,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBACnD,MAAM,KAAK,GACT,aAAa,GAAG,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC;gBAC/D,OAAO,CAAC,IAAI,CACV,iBAAiB,OAAO,GAAG,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAC,MAAM,EAAE,CAChE,CAAC;gBACF,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC/C,SAAS;YACX,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,IAAK,GAA6B,CAAC,IAAI,EAAE,CAAC;gBACrE,MAAM,KAAK,GACT,aAAa,GAAG,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC;gBAC/D,OAAO,CAAC,IAAI,CACV,iBAAiB,OAAO,GAAG,CAAC,QAAQ,KAAK,KAAM,GAAa,CAAC,OAAO,EAAE,CACvE,CAAC;gBACF,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC/C,SAAS;YACX,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,UAAU,WAAW,WAAW,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,OAAO,WAAW;IACd,QAAQ,CAAS;IACjB,KAAK,CAAS;IACd,OAAO,CAAS;IAExB,YAAY,OAA2B;QACrC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,KAAa;QAC5C,MAAM,UAAU,CACd,GAAG,IAAI,CAAC,QAAQ,kBAAkB,EAClC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;aACtC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO;gBACP,GAAG,KAAK;aACT,CAAC;SACH,EACD,SAAS,OAAO,EAAE,CACnB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAe;QAC5B,MAAM,UAAU,CACd,GAAG,IAAI,CAAC,QAAQ,iBAAiB,EACjC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;aACtC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI;aACL,CAAC;SACH,EACD,MAAM,CACP,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,OAAe;QAC5C,MAAM,UAAU,CACd,GAAG,IAAI,CAAC,QAAQ,kBAAkB,EAClC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;aACtC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM;gBACN,OAAO;aACR,CAAC;SACH,EACD,QAAQ,MAAM,EAAE,CACjB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,QAAiB;QAC/C,qCAAqC;QACrC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS;YACtC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBACjE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAErC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBACrB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,0BAA0B,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,SAAS;gBACpC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;oBACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACrC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACvC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IntentMessage } from "@clapps/core";
|
|
2
|
+
import type { RelayClient } from "./relay-client.js";
|
|
3
|
+
export interface SettingsHandlerOptions {
|
|
4
|
+
stateDir: string;
|
|
5
|
+
relay: RelayClient;
|
|
6
|
+
authPath?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class SettingsHandler {
|
|
9
|
+
private stateDir;
|
|
10
|
+
private relay;
|
|
11
|
+
private authPath;
|
|
12
|
+
constructor(options: SettingsHandlerOptions);
|
|
13
|
+
/** Returns true if the intent was handled locally (should not be forwarded to ACP) */
|
|
14
|
+
handleIntent: (intent: IntentMessage) => boolean;
|
|
15
|
+
/** Write auth.json with the Anthropic API key */
|
|
16
|
+
private setAnthropicKey;
|
|
17
|
+
/** Write settings.json state with provider status (masked keys) */
|
|
18
|
+
writeSettingsState(): void;
|
|
19
|
+
/** Push settings.json state to relay */
|
|
20
|
+
pushSettingsState(): Promise<void>;
|
|
21
|
+
/** Push _status.json state to relay */
|
|
22
|
+
pushStatusState(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=settings-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-handler.d.ts","sourceRoot":"","sources":["../src/settings-handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,sBAAsB;IAQ3C,sFAAsF;IACtF,YAAY,GAAI,QAAQ,aAAa,KAAG,OAAO,CAiB7C;IAEF,iDAAiD;IACjD,OAAO,CAAC,eAAe;IA+BvB,mEAAmE;IACnE,kBAAkB,IAAI,IAAI;IAwC1B,wCAAwC;IAClC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxC,uCAAuC;IACjC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAKvC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { checkAuthStatus } from "./defaults.js";
|
|
5
|
+
export class SettingsHandler {
|
|
6
|
+
stateDir;
|
|
7
|
+
relay;
|
|
8
|
+
authPath;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.stateDir = options.stateDir;
|
|
11
|
+
this.relay = options.relay;
|
|
12
|
+
this.authPath =
|
|
13
|
+
options.authPath ??
|
|
14
|
+
resolve(homedir(), ".openclaw", "agents", "main", "agent", "auth.json");
|
|
15
|
+
}
|
|
16
|
+
/** Returns true if the intent was handled locally (should not be forwarded to ACP) */
|
|
17
|
+
handleIntent = (intent) => {
|
|
18
|
+
if (!intent.intent.startsWith("settings."))
|
|
19
|
+
return false;
|
|
20
|
+
switch (intent.intent) {
|
|
21
|
+
case "settings.setAnthropicKey": {
|
|
22
|
+
const apiKey = intent.payload.apiKey;
|
|
23
|
+
if (typeof apiKey !== "string" || apiKey.trim().length === 0) {
|
|
24
|
+
console.warn("[settings] Invalid apiKey payload, ignoring");
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
this.setAnthropicKey(apiKey.trim());
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
default:
|
|
31
|
+
console.warn(`[settings] Unknown settings intent: ${intent.intent}`);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
/** Write auth.json with the Anthropic API key */
|
|
36
|
+
setAnthropicKey(apiKey) {
|
|
37
|
+
// Read existing auth or start fresh
|
|
38
|
+
let auth = {};
|
|
39
|
+
try {
|
|
40
|
+
if (existsSync(this.authPath)) {
|
|
41
|
+
auth = JSON.parse(readFileSync(this.authPath, "utf-8"));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Start fresh if unreadable
|
|
46
|
+
}
|
|
47
|
+
auth.anthropic = { apiKey };
|
|
48
|
+
// Ensure directory exists
|
|
49
|
+
mkdirSync(dirname(this.authPath), { recursive: true });
|
|
50
|
+
writeFileSync(this.authPath, JSON.stringify(auth, null, 2), "utf-8");
|
|
51
|
+
console.log(`✅ Anthropic API key saved to ${this.authPath}`);
|
|
52
|
+
// Update settings state with masked key and push directly
|
|
53
|
+
this.writeSettingsState();
|
|
54
|
+
this.pushSettingsState().catch((err) => console.error(`[settings] Failed to push settings: ${err.message}`));
|
|
55
|
+
// Re-check auth status so _status.json reflects the new key, then push
|
|
56
|
+
checkAuthStatus(this.stateDir, this.authPath);
|
|
57
|
+
this.pushStatusState().catch((err) => console.error(`[settings] Failed to push status: ${err.message}`));
|
|
58
|
+
}
|
|
59
|
+
/** Write settings.json state with provider status (masked keys) */
|
|
60
|
+
writeSettingsState() {
|
|
61
|
+
let configured = false;
|
|
62
|
+
let maskedKey = "";
|
|
63
|
+
try {
|
|
64
|
+
if (existsSync(this.authPath)) {
|
|
65
|
+
const auth = JSON.parse(readFileSync(this.authPath, "utf-8"));
|
|
66
|
+
const key = auth?.anthropic?.apiKey;
|
|
67
|
+
if (typeof key === "string" && key.length > 0) {
|
|
68
|
+
configured = true;
|
|
69
|
+
maskedKey =
|
|
70
|
+
key.length > 8
|
|
71
|
+
? key.slice(0, 7) + "..." + key.slice(-4)
|
|
72
|
+
: "***";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Leave as unconfigured
|
|
78
|
+
}
|
|
79
|
+
const statePath = resolve(this.stateDir, "settings.json");
|
|
80
|
+
writeFileSync(statePath, JSON.stringify({
|
|
81
|
+
version: Date.now(),
|
|
82
|
+
timestamp: new Date().toISOString(),
|
|
83
|
+
state: {
|
|
84
|
+
providers: {
|
|
85
|
+
anthropic: { configured, maskedKey },
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
}, null, 2), "utf-8");
|
|
89
|
+
}
|
|
90
|
+
/** Push settings.json state to relay */
|
|
91
|
+
async pushSettingsState() {
|
|
92
|
+
const statePath = resolve(this.stateDir, "settings.json");
|
|
93
|
+
const content = readFileSync(statePath, "utf-8");
|
|
94
|
+
await this.relay.pushState("settings", JSON.parse(content));
|
|
95
|
+
}
|
|
96
|
+
/** Push _status.json state to relay */
|
|
97
|
+
async pushStatusState() {
|
|
98
|
+
const statePath = resolve(this.stateDir, "_status.json");
|
|
99
|
+
const content = readFileSync(statePath, "utf-8");
|
|
100
|
+
await this.relay.pushState("_status", JSON.parse(content));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=settings-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-handler.js","sourceRoot":"","sources":["../src/settings-handler.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.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"clapps-connect": "./dist/index.js"
|
|
@@ -13,9 +13,6 @@
|
|
|
13
13
|
"build": "tsc",
|
|
14
14
|
"clean": "rm -rf dist"
|
|
15
15
|
},
|
|
16
|
-
"dependencies": {
|
|
17
|
-
"chokidar": "^4.0.3"
|
|
18
|
-
},
|
|
19
16
|
"devDependencies": {
|
|
20
17
|
"@clapps/core": "workspace:*"
|
|
21
18
|
}
|