@clappstore/connect 0.4.0 → 0.6.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 +31 -10
- package/dist/defaults.js.map +1 -1
- package/dist/index.js +36 -35
- package/dist/index.js.map +1 -1
- package/dist/intent-poller.d.ts +2 -2
- package/dist/intent-poller.d.ts.map +1 -1
- package/dist/intent-poller.js +1 -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 +9 -0
- package/dist/settings-handler.d.ts.map +1 -1
- package/dist/settings-handler.js +64 -5
- package/dist/settings-handler.js.map +1 -1
- 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;AAoJrD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAqCrE;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
|
@@ -62,31 +62,49 @@ Module(ref=default/settings):
|
|
|
62
62
|
const DEFAULT_SETTINGS_VIEW = `---
|
|
63
63
|
name: settings
|
|
64
64
|
domain: default
|
|
65
|
-
version: 0.
|
|
65
|
+
version: 0.2.0
|
|
66
66
|
---
|
|
67
67
|
|
|
68
68
|
## State Bindings
|
|
69
|
-
- \`
|
|
70
|
-
- \`
|
|
69
|
+
- \`active.isConfigured\` -> boolean
|
|
70
|
+
- \`active.description\` -> string
|
|
71
|
+
- \`providers.anthropic.apiKey.configured\` -> boolean
|
|
72
|
+
- \`providers.anthropic.apiKey.maskedKey\` -> string
|
|
73
|
+
- \`providers.anthropic.subscription.configured\` -> boolean
|
|
71
74
|
|
|
72
75
|
## Layout
|
|
73
76
|
\`\`\`clapp-layout
|
|
74
77
|
Column(gap=4):
|
|
75
78
|
Heading(level=2): "Settings"
|
|
79
|
+
Card(title=Authentication Status):
|
|
80
|
+
Column(gap=2):
|
|
81
|
+
Conditional(when=active.isConfigured):
|
|
82
|
+
MarkdownContent(source=active.description):
|
|
83
|
+
Conditional(when=!active.isConfigured):
|
|
84
|
+
Heading(level=4): "No authentication configured"
|
|
76
85
|
Card(title=Anthropic API Key):
|
|
77
86
|
Column(gap=3):
|
|
78
|
-
Conditional(when=providers.anthropic.configured):
|
|
87
|
+
Conditional(when=providers.anthropic.apiKey.configured):
|
|
79
88
|
Heading(level=4): "Configured"
|
|
80
|
-
Conditional(when=!providers.anthropic.configured):
|
|
89
|
+
Conditional(when=!providers.anthropic.apiKey.configured):
|
|
81
90
|
Heading(level=4): "Not configured"
|
|
82
91
|
IntentForm(intent=settings.setAnthropicKey, submitLabel=Save Key):
|
|
83
92
|
TextInput(name=apiKey, type=password, placeholder=sk-ant-...):
|
|
93
|
+
Card(title=Claude Subscription):
|
|
94
|
+
Column(gap=3):
|
|
95
|
+
Conditional(when=providers.anthropic.subscription.configured):
|
|
96
|
+
Heading(level=4): "Configured"
|
|
97
|
+
Conditional(when=!providers.anthropic.subscription.configured):
|
|
98
|
+
Heading(level=4): "Not configured"
|
|
99
|
+
IntentForm(intent=settings.setClaudeToken, submitLabel=Save Token):
|
|
100
|
+
TextInput(name=token, type=password, placeholder=Paste setup-token here...):
|
|
84
101
|
\`\`\`
|
|
85
102
|
|
|
86
103
|
## Intents
|
|
87
104
|
| Name | Payload | Description |
|
|
88
105
|
|------|---------|-------------|
|
|
89
106
|
| settings.setAnthropicKey | \`{ apiKey: string }\` | Set the Anthropic API key |
|
|
107
|
+
| settings.setClaudeToken | \`{ token: string }\` | Set Claude subscription setup-token |
|
|
90
108
|
`;
|
|
91
109
|
const DEFAULT_SETTINGS_APP_ENTRY = {
|
|
92
110
|
id: "settings",
|
|
@@ -114,7 +132,7 @@ const DEFAULT_APPS = [
|
|
|
114
132
|
},
|
|
115
133
|
];
|
|
116
134
|
export function seedDefaults(viewsDir, stateDir) {
|
|
117
|
-
// Seed app definitions and view modules
|
|
135
|
+
// Seed app definitions and always overwrite default view modules
|
|
118
136
|
for (const { appPath, viewPath, appMd, viewMd } of DEFAULT_APPS) {
|
|
119
137
|
const fullAppPath = resolve(viewsDir, appPath);
|
|
120
138
|
if (!existsSync(fullAppPath)) {
|
|
@@ -122,10 +140,7 @@ export function seedDefaults(viewsDir, stateDir) {
|
|
|
122
140
|
console.log(`📝 Created default app: ${fullAppPath}`);
|
|
123
141
|
}
|
|
124
142
|
const fullViewPath = resolve(viewsDir, viewPath);
|
|
125
|
-
|
|
126
|
-
writeFileSync(fullViewPath, viewMd, "utf-8");
|
|
127
|
-
console.log(`📝 Created default view: ${fullViewPath}`);
|
|
128
|
-
}
|
|
143
|
+
writeFileSync(fullViewPath, viewMd, "utf-8");
|
|
129
144
|
}
|
|
130
145
|
// Seed or merge _apps.json
|
|
131
146
|
const appsPath = resolve(stateDir, "_apps.json");
|
|
@@ -154,6 +169,12 @@ export function seedDefaults(viewsDir, stateDir) {
|
|
|
154
169
|
}
|
|
155
170
|
}
|
|
156
171
|
}
|
|
172
|
+
/** Push all seeded files to the relay in one shot */
|
|
173
|
+
export async function pushDefaults(relay, viewsDir, stateDir) {
|
|
174
|
+
console.log("Pushing defaults to relay...");
|
|
175
|
+
await relay.syncDir(stateDir, viewsDir);
|
|
176
|
+
console.log("Initial sync complete");
|
|
177
|
+
}
|
|
157
178
|
/** Check if the agent has an AI provider API key configured and write _status.json */
|
|
158
179
|
export function checkAuthStatus(stateDir, authPath) {
|
|
159
180
|
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,11 @@ 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";
|
|
10
11
|
import { SettingsHandler } from "./settings-handler.js";
|
|
11
12
|
function parseArgs(args) {
|
|
12
13
|
const opts = {};
|
|
@@ -69,31 +70,18 @@ async function main() {
|
|
|
69
70
|
// Ensure directories exist
|
|
70
71
|
mkdirSync(stateDir, { recursive: true });
|
|
71
72
|
mkdirSync(viewsDir, { recursive: true });
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const settingsHandler = new SettingsHandler({ stateDir });
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
agentId,
|
|
82
|
-
agentClient,
|
|
83
|
-
onIntent: settingsHandler.handleIntent,
|
|
84
|
-
onError: (err) => console.error("[intent-poller]", err.message),
|
|
85
|
-
});
|
|
86
|
-
const stateWatcher = new StateWatcher({
|
|
87
|
-
stateDir,
|
|
88
|
-
viewsDir,
|
|
89
|
-
relayUrl,
|
|
90
|
-
token,
|
|
91
|
-
agentId,
|
|
92
|
-
onError: (err) => console.error("[state-watcher]", err.message),
|
|
93
|
-
});
|
|
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);
|
|
94
82
|
console.log(`🤖 Agent ID: ${agentId}`);
|
|
95
|
-
console.log(`📁
|
|
96
|
-
console.log(`📄
|
|
83
|
+
console.log(`📁 State dir: ${stateDir}`);
|
|
84
|
+
console.log(`📄 Views dir: ${viewsDir}`);
|
|
97
85
|
// Create/reuse a stable link token for browser access
|
|
98
86
|
try {
|
|
99
87
|
const linkRes = await fetch(`${relayUrl}/api/agent/links`, {
|
|
@@ -117,13 +105,12 @@ async function main() {
|
|
|
117
105
|
catch (err) {
|
|
118
106
|
console.warn(`⚠️ Could not create link: ${err instanceof Error ? err.message : err}`);
|
|
119
107
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
// Start ACP subprocess, then begin polling for intents
|
|
108
|
+
// 4. Start ACP subprocess
|
|
109
|
+
const agentClient = new AgentClient({
|
|
110
|
+
session,
|
|
111
|
+
agentToken,
|
|
112
|
+
onError: (err) => console.error("[acp]", err.message),
|
|
113
|
+
});
|
|
127
114
|
try {
|
|
128
115
|
await agentClient.start();
|
|
129
116
|
}
|
|
@@ -131,13 +118,27 @@ async function main() {
|
|
|
131
118
|
console.error(`⚠️ ACP failed to start: ${err instanceof Error ? err.message : err}`);
|
|
132
119
|
console.error(" Intent processing will not work until ACP is available.");
|
|
133
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
|
+
});
|
|
134
136
|
intentPoller.start();
|
|
135
137
|
// Graceful shutdown
|
|
136
|
-
process.on("SIGINT",
|
|
138
|
+
process.on("SIGINT", () => {
|
|
137
139
|
console.log("\nShutting down...");
|
|
138
140
|
intentPoller.stop();
|
|
139
141
|
agentClient.stop();
|
|
140
|
-
await stateWatcher.stop();
|
|
141
142
|
process.exit(0);
|
|
142
143
|
});
|
|
143
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,10 @@
|
|
|
1
1
|
import type { IntentMessage } from "@clapps/core";
|
|
2
|
-
import {
|
|
2
|
+
import type { AgentHandler } from "./agent-handler.js";
|
|
3
3
|
export interface IntentPollerOptions {
|
|
4
4
|
relayUrl: string;
|
|
5
5
|
token: string;
|
|
6
6
|
agentId: string;
|
|
7
|
-
|
|
7
|
+
agentHandler: AgentHandler;
|
|
8
8
|
intervalMs?: number;
|
|
9
9
|
onIntent?: (intent: IntentMessage) => boolean;
|
|
10
10
|
onError?: (error: Error) => void;
|
|
@@ -1 +1 @@
|
|
|
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,EAAE,
|
|
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;
|
|
@@ -37,7 +36,7 @@ export class IntentPoller {
|
|
|
37
36
|
// Let onIntent handle it locally; skip ACP if it returns true
|
|
38
37
|
if (this.options.onIntent?.(intent))
|
|
39
38
|
continue;
|
|
40
|
-
await this.options.
|
|
39
|
+
await this.options.agentHandler.handleIntent(intent);
|
|
41
40
|
}
|
|
42
41
|
catch (err) {
|
|
43
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":"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"}
|
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
import type { IntentMessage } from "@clapps/core";
|
|
2
|
+
import type { RelayClient } from "./relay-client.js";
|
|
2
3
|
export interface SettingsHandlerOptions {
|
|
3
4
|
stateDir: string;
|
|
5
|
+
relay: RelayClient;
|
|
4
6
|
authPath?: string;
|
|
5
7
|
}
|
|
6
8
|
export declare class SettingsHandler {
|
|
7
9
|
private stateDir;
|
|
10
|
+
private relay;
|
|
8
11
|
private authPath;
|
|
9
12
|
constructor(options: SettingsHandlerOptions);
|
|
10
13
|
/** Returns true if the intent was handled locally (should not be forwarded to ACP) */
|
|
11
14
|
handleIntent: (intent: IntentMessage) => boolean;
|
|
12
15
|
/** Write auth.json with the Anthropic API key */
|
|
13
16
|
private setAnthropicKey;
|
|
17
|
+
/** Set Claude subscription token via openclaw CLI */
|
|
18
|
+
private setClaudeToken;
|
|
14
19
|
/** Write settings.json state with provider status (masked keys) */
|
|
15
20
|
writeSettingsState(): void;
|
|
21
|
+
/** Push settings.json state to relay */
|
|
22
|
+
pushSettingsState(): Promise<void>;
|
|
23
|
+
/** Push _status.json state to relay */
|
|
24
|
+
pushStatusState(): Promise<void>;
|
|
16
25
|
}
|
|
17
26
|
//# sourceMappingURL=settings-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-handler.d.ts","sourceRoot":"","sources":["../src/settings-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings-handler.d.ts","sourceRoot":"","sources":["../src/settings-handler.ts"],"names":[],"mappings":"AAIA,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,CA0B7C;IAEF,iDAAiD;IACjD,OAAO,CAAC,eAAe;IA+BvB,qDAAqD;IACrD,OAAO,CAAC,cAAc;IA4BtB,mEAAmE;IACnE,kBAAkB,IAAI,IAAI;IAyD1B,wCAAwC;IAClC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxC,uCAAuC;IACjC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAKvC"}
|
package/dist/settings-handler.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
2
3
|
import { dirname, resolve } from "node:path";
|
|
3
4
|
import { homedir } from "node:os";
|
|
4
5
|
import { checkAuthStatus } from "./defaults.js";
|
|
5
6
|
export class SettingsHandler {
|
|
6
7
|
stateDir;
|
|
8
|
+
relay;
|
|
7
9
|
authPath;
|
|
8
10
|
constructor(options) {
|
|
9
11
|
this.stateDir = options.stateDir;
|
|
12
|
+
this.relay = options.relay;
|
|
10
13
|
this.authPath =
|
|
11
14
|
options.authPath ??
|
|
12
15
|
resolve(homedir(), ".openclaw", "agents", "main", "agent", "auth.json");
|
|
@@ -25,6 +28,15 @@ export class SettingsHandler {
|
|
|
25
28
|
this.setAnthropicKey(apiKey.trim());
|
|
26
29
|
return true;
|
|
27
30
|
}
|
|
31
|
+
case "settings.setClaudeToken": {
|
|
32
|
+
const token = intent.payload.token;
|
|
33
|
+
if (typeof token !== "string" || token.trim().length === 0) {
|
|
34
|
+
console.warn("[settings] Invalid token payload, ignoring");
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
this.setClaudeToken(token.trim());
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
28
40
|
default:
|
|
29
41
|
console.warn(`[settings] Unknown settings intent: ${intent.intent}`);
|
|
30
42
|
return true;
|
|
@@ -47,41 +59,88 @@ export class SettingsHandler {
|
|
|
47
59
|
mkdirSync(dirname(this.authPath), { recursive: true });
|
|
48
60
|
writeFileSync(this.authPath, JSON.stringify(auth, null, 2), "utf-8");
|
|
49
61
|
console.log(`✅ Anthropic API key saved to ${this.authPath}`);
|
|
50
|
-
// Update settings state with masked key
|
|
62
|
+
// Update settings state with masked key and push directly
|
|
63
|
+
this.writeSettingsState();
|
|
64
|
+
this.pushSettingsState().catch((err) => console.error(`[settings] Failed to push settings: ${err.message}`));
|
|
65
|
+
// Re-check auth status so _status.json reflects the new key, then push
|
|
66
|
+
checkAuthStatus(this.stateDir, this.authPath);
|
|
67
|
+
this.pushStatusState().catch((err) => console.error(`[settings] Failed to push status: ${err.message}`));
|
|
68
|
+
}
|
|
69
|
+
/** Set Claude subscription token via openclaw CLI */
|
|
70
|
+
setClaudeToken(token) {
|
|
71
|
+
const result = spawnSync("openclaw", ["models", "auth", "paste-token", "--provider", "anthropic"], { input: token, encoding: "utf-8", timeout: 15_000 });
|
|
72
|
+
if (result.status !== 0) {
|
|
73
|
+
const msg = (result.stderr || result.error?.message || "unknown error").toString().trim();
|
|
74
|
+
console.error(`[settings] openclaw paste-token failed: ${msg}`);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
console.log("✅ Claude subscription token saved via openclaw");
|
|
78
|
+
// Update settings state and push
|
|
51
79
|
this.writeSettingsState();
|
|
52
|
-
|
|
80
|
+
this.pushSettingsState().catch((err) => console.error(`[settings] Failed to push settings: ${err.message}`));
|
|
81
|
+
// Re-check auth status so _status.json reflects the new token, then push
|
|
53
82
|
checkAuthStatus(this.stateDir, this.authPath);
|
|
83
|
+
this.pushStatusState().catch((err) => console.error(`[settings] Failed to push status: ${err.message}`));
|
|
54
84
|
}
|
|
55
85
|
/** Write settings.json state with provider status (masked keys) */
|
|
56
86
|
writeSettingsState() {
|
|
57
|
-
let
|
|
87
|
+
let apiKeyConfigured = false;
|
|
58
88
|
let maskedKey = "";
|
|
89
|
+
let subscriptionConfigured = false;
|
|
59
90
|
try {
|
|
60
91
|
if (existsSync(this.authPath)) {
|
|
61
92
|
const auth = JSON.parse(readFileSync(this.authPath, "utf-8"));
|
|
62
93
|
const key = auth?.anthropic?.apiKey;
|
|
63
94
|
if (typeof key === "string" && key.length > 0) {
|
|
64
|
-
|
|
95
|
+
apiKeyConfigured = true;
|
|
65
96
|
maskedKey =
|
|
66
97
|
key.length > 8
|
|
67
98
|
? key.slice(0, 7) + "..." + key.slice(-4)
|
|
68
99
|
: "***";
|
|
69
100
|
}
|
|
101
|
+
const oauthToken = auth?.anthropic?.oauthToken;
|
|
102
|
+
if (typeof oauthToken === "string" && oauthToken.length > 0) {
|
|
103
|
+
subscriptionConfigured = true;
|
|
104
|
+
}
|
|
70
105
|
}
|
|
71
106
|
}
|
|
72
107
|
catch {
|
|
73
108
|
// Leave as unconfigured
|
|
74
109
|
}
|
|
110
|
+
const isConfigured = apiKeyConfigured || subscriptionConfigured;
|
|
111
|
+
let description = "";
|
|
112
|
+
if (apiKeyConfigured) {
|
|
113
|
+
description = `**Anthropic API Key** — ${maskedKey}`;
|
|
114
|
+
}
|
|
115
|
+
else if (subscriptionConfigured) {
|
|
116
|
+
description = "**Claude Subscription** — Token configured";
|
|
117
|
+
}
|
|
75
118
|
const statePath = resolve(this.stateDir, "settings.json");
|
|
76
119
|
writeFileSync(statePath, JSON.stringify({
|
|
77
120
|
version: Date.now(),
|
|
78
121
|
timestamp: new Date().toISOString(),
|
|
79
122
|
state: {
|
|
123
|
+
active: { isConfigured, description },
|
|
80
124
|
providers: {
|
|
81
|
-
anthropic: {
|
|
125
|
+
anthropic: {
|
|
126
|
+
apiKey: { configured: apiKeyConfigured, maskedKey },
|
|
127
|
+
subscription: { configured: subscriptionConfigured },
|
|
128
|
+
},
|
|
82
129
|
},
|
|
83
130
|
},
|
|
84
131
|
}, null, 2), "utf-8");
|
|
85
132
|
}
|
|
133
|
+
/** Push settings.json state to relay */
|
|
134
|
+
async pushSettingsState() {
|
|
135
|
+
const statePath = resolve(this.stateDir, "settings.json");
|
|
136
|
+
const content = readFileSync(statePath, "utf-8");
|
|
137
|
+
await this.relay.pushState("settings", JSON.parse(content));
|
|
138
|
+
}
|
|
139
|
+
/** Push _status.json state to relay */
|
|
140
|
+
async pushStatusState() {
|
|
141
|
+
const statePath = resolve(this.stateDir, "_status.json");
|
|
142
|
+
const content = readFileSync(statePath, "utf-8");
|
|
143
|
+
await this.relay.pushState("_status", JSON.parse(content));
|
|
144
|
+
}
|
|
86
145
|
}
|
|
87
146
|
//# sourceMappingURL=settings-handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-handler.js","sourceRoot":"","sources":["../src/settings-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
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.6.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
|
}
|