@clappstore/connect 0.7.0 → 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.
- package/clapps/settings/README.md +74 -0
- package/clapps/settings/clapp.json +25 -0
- package/clapps/settings/components/ProviderEditor.tsx +512 -0
- package/clapps/settings/components/ProviderList.tsx +300 -0
- package/clapps/settings/components/SessionList.tsx +189 -0
- package/clapps/settings/handlers/settings-handler.js +760 -0
- package/clapps/settings/views/default.settings.view.md +38 -0
- package/clapps/settings/views/settings.app.md +12 -0
- package/dist/clapp-handler.d.ts +16 -0
- package/dist/clapp-handler.d.ts.map +1 -0
- package/dist/clapp-handler.js +2 -0
- package/dist/clapp-handler.js.map +1 -0
- package/dist/clapp-loader.d.ts +3 -0
- package/dist/clapp-loader.d.ts.map +1 -0
- package/dist/clapp-loader.js +61 -0
- package/dist/clapp-loader.js.map +1 -0
- package/dist/defaults.d.ts +9 -2
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +130 -71
- package/dist/defaults.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -12
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -1
- package/dist/server.js.map +1 -1
- package/package.json +8 -4
- package/dist/settings-handler.d.ts +0 -26
- package/dist/settings-handler.d.ts.map +0 -1
- package/dist/settings-handler.js +0 -144
- package/dist/settings-handler.js.map +0 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: settings
|
|
3
|
+
domain: default
|
|
4
|
+
version: 0.6.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## State Bindings
|
|
8
|
+
- `active.isConfigured` -> boolean
|
|
9
|
+
- `active.model` -> string
|
|
10
|
+
- `configuredProviders` -> array
|
|
11
|
+
- `sessions.sessions` -> array
|
|
12
|
+
- `sessions.globalModel` -> string
|
|
13
|
+
|
|
14
|
+
## Layout
|
|
15
|
+
```clapp-layout
|
|
16
|
+
Column(gap=5):
|
|
17
|
+
Card(title=AI Providers):
|
|
18
|
+
Column(gap=4):
|
|
19
|
+
Conditional(when=active.isConfigured):
|
|
20
|
+
ProviderList(data=configuredProviders):
|
|
21
|
+
Conditional(when=!active.isConfigured):
|
|
22
|
+
Heading(level=4): "No providers configured"
|
|
23
|
+
SessionList():
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Intents
|
|
27
|
+
| Name | Payload | Description |
|
|
28
|
+
|------|---------|-------------|
|
|
29
|
+
| settings.setAnthropicKey | `{ apiKey: string, customName?: string }` | Set an Anthropic API key |
|
|
30
|
+
| settings.setClaudeToken | `{ setupToken: string, customName?: string }` | Set a Claude subscription token |
|
|
31
|
+
| settings.setOpenAIKey | `{ apiKey: string, customName?: string }` | Set an OpenAI API key |
|
|
32
|
+
| settings.setKimiCodingKey | `{ apiKey: string, customName?: string }` | Set a Kimi Coding API key |
|
|
33
|
+
| settings.setActiveProvider | `{ provider: string }` | Set the active AI provider |
|
|
34
|
+
| settings.setActiveModel | `{ model: string }` | Set the active AI model |
|
|
35
|
+
| settings.deleteProvider | `{ profileId: string }` | Delete a provider profile |
|
|
36
|
+
| settings.listSessions | `{}` | Refresh the list of active sessions |
|
|
37
|
+
| settings.resetSessionModel | `{ sessionKey: string }` | Reset a session to use the system default |
|
|
38
|
+
| settings.applyDefaultToAll | `{}` | Apply system default to all sessions |
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ClappHandlerContext {
|
|
2
|
+
stateDir: string;
|
|
3
|
+
setState(clappId: string, state: unknown): void;
|
|
4
|
+
checkAuthStatus(): void;
|
|
5
|
+
}
|
|
6
|
+
export interface ClappHandler {
|
|
7
|
+
handleIntent(intent: {
|
|
8
|
+
intent: string;
|
|
9
|
+
payload: Record<string, unknown>;
|
|
10
|
+
}): boolean;
|
|
11
|
+
onConnect?(): void;
|
|
12
|
+
refresh?(): void;
|
|
13
|
+
init?(): void;
|
|
14
|
+
}
|
|
15
|
+
export type ClappHandlerFactory = (ctx: ClappHandlerContext) => ClappHandler;
|
|
16
|
+
//# sourceMappingURL=clapp-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clapp-handler.d.ts","sourceRoot":"","sources":["../src/clapp-handler.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAChD,eAAe,IAAI,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC;IACpF,SAAS,CAAC,IAAI,IAAI,CAAC;IACnB,OAAO,CAAC,IAAI,IAAI,CAAC;IACjB,IAAI,CAAC,IAAI,IAAI,CAAC;CACf;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clapp-handler.js","sourceRoot":"","sources":["../src/clapp-handler.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clapp-loader.d.ts","sourceRoot":"","sources":["../src/clapp-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAuB,MAAM,oBAAoB,CAAC;AAOjG,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,YAAY,EAAE,CAAC,CA6DzB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
export async function loadClappHandlers(clappsDir, ctx) {
|
|
5
|
+
const handlers = [];
|
|
6
|
+
if (!existsSync(clappsDir)) {
|
|
7
|
+
console.warn(`[clapp-loader] Clapps directory not found: ${clappsDir}`);
|
|
8
|
+
return handlers;
|
|
9
|
+
}
|
|
10
|
+
let entries;
|
|
11
|
+
try {
|
|
12
|
+
entries = readdirSync(clappsDir, { withFileTypes: true })
|
|
13
|
+
.filter((d) => d.isDirectory())
|
|
14
|
+
.map((d) => d.name);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
console.warn(`[clapp-loader] Failed to read clapps directory: ${clappsDir}`);
|
|
18
|
+
return handlers;
|
|
19
|
+
}
|
|
20
|
+
for (const entry of entries) {
|
|
21
|
+
const manifestPath = resolve(clappsDir, entry, "clapp.json");
|
|
22
|
+
if (!existsSync(manifestPath))
|
|
23
|
+
continue;
|
|
24
|
+
let manifest;
|
|
25
|
+
try {
|
|
26
|
+
manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
console.warn(`[clapp-loader] Failed to parse ${manifestPath}: ${err}`);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (!Array.isArray(manifest.handlers) || manifest.handlers.length === 0) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
for (const handlerRef of manifest.handlers) {
|
|
36
|
+
// Manifest references .ts source paths; convert to compiled .js
|
|
37
|
+
const jsPath = handlerRef.replace(/\.ts$/, ".js");
|
|
38
|
+
const fullPath = resolve(clappsDir, entry, jsPath);
|
|
39
|
+
if (!existsSync(fullPath)) {
|
|
40
|
+
console.warn(`[clapp-loader] Handler not found: ${fullPath}`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const mod = await import(pathToFileURL(fullPath).href);
|
|
45
|
+
const factory = mod.default;
|
|
46
|
+
if (typeof factory !== "function") {
|
|
47
|
+
console.warn(`[clapp-loader] ${fullPath} does not export a default factory function`);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const handler = factory(ctx);
|
|
51
|
+
handlers.push(handler);
|
|
52
|
+
console.log(`[clapp-loader] Loaded handler: ${manifest.name}`);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
console.error(`[clapp-loader] Failed to load handler ${fullPath}: ${err}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return handlers;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=clapp-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clapp-loader.js","sourceRoot":"","sources":["../src/clapp-loader.ts"],"names":[],"mappings":"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"}
|
package/dist/defaults.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
/** Get the user's clapps directory */
|
|
2
|
+
export declare function getUserClappsDir(): string;
|
|
3
|
+
/** Get the bundled clapps directory (shipped with package) */
|
|
4
|
+
export declare function getBundledClappsDir(): string;
|
|
5
|
+
/** Install default clapps to user directory if not present */
|
|
6
|
+
export declare function installDefaultClapps(): void;
|
|
7
|
+
/** Seed default views and apps registry */
|
|
1
8
|
export declare function seedDefaults(viewsDir: string, stateDir: string): void;
|
|
2
|
-
/** Check if the agent has an AI provider
|
|
3
|
-
export declare function checkAuthStatus(stateDir: string,
|
|
9
|
+
/** Check if the agent has an AI provider configured and write _status.json */
|
|
10
|
+
export declare function checkAuthStatus(stateDir: string, authProfilesPath?: string): void;
|
|
4
11
|
//# 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":"AAyJA,sCAAsC;AACtC,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,8DAA8D;AAC9D,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C;AA6BD,8DAA8D;AAC9D,wBAAgB,oBAAoB,IAAI,IAAI,CAwB3C;AAED,2CAA2C;AAC3C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CA2CrE;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAyDjF"}
|
package/dist/defaults.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { resolve } from "node:path";
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, cpSync } from "node:fs";
|
|
2
|
+
import { resolve, dirname } from "node:path";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
// === Bundled defaults (fallback if user hasn't customized) ===
|
|
4
6
|
const DEFAULT_CHAT_APP_MD = `---
|
|
5
7
|
name: Chat
|
|
6
8
|
domain: default
|
|
@@ -39,13 +41,6 @@ Column(gap=4):
|
|
|
39
41
|
|------|---------|-------------|
|
|
40
42
|
| chat.send | \`{ text: string }\` | Send a chat message |
|
|
41
43
|
`;
|
|
42
|
-
const DEFAULT_CHAT_APP_ENTRY = {
|
|
43
|
-
id: "chat",
|
|
44
|
-
name: "Chat",
|
|
45
|
-
emoji: "\u{1F4AC}",
|
|
46
|
-
description: "Chat with the agent",
|
|
47
|
-
pinned: true,
|
|
48
|
-
};
|
|
49
44
|
const DEFAULT_SETTINGS_APP_MD = `---
|
|
50
45
|
name: Settings
|
|
51
46
|
domain: default
|
|
@@ -62,87 +57,146 @@ Module(ref=default/settings):
|
|
|
62
57
|
const DEFAULT_SETTINGS_VIEW = `---
|
|
63
58
|
name: settings
|
|
64
59
|
domain: default
|
|
65
|
-
version: 0.
|
|
60
|
+
version: 0.6.0
|
|
66
61
|
---
|
|
67
62
|
|
|
68
63
|
## State Bindings
|
|
69
64
|
- \`active.isConfigured\` -> boolean
|
|
70
|
-
- \`active.
|
|
71
|
-
- \`
|
|
72
|
-
- \`
|
|
73
|
-
- \`
|
|
74
|
-
- \`providers.anthropic.subscription.instructions\` -> string
|
|
65
|
+
- \`active.model\` -> string
|
|
66
|
+
- \`configuredProviders\` -> array
|
|
67
|
+
- \`sessions.sessions\` -> array
|
|
68
|
+
- \`sessions.globalModel\` -> string
|
|
75
69
|
|
|
76
70
|
## Layout
|
|
77
71
|
\`\`\`clapp-layout
|
|
78
|
-
Column(gap=
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
Column(gap=2):
|
|
72
|
+
Column(gap=5):
|
|
73
|
+
Card(title=AI Providers):
|
|
74
|
+
Column(gap=4):
|
|
82
75
|
Conditional(when=active.isConfigured):
|
|
83
|
-
|
|
76
|
+
ProviderList(data=configuredProviders):
|
|
84
77
|
Conditional(when=!active.isConfigured):
|
|
85
|
-
Heading(level=4): "No
|
|
86
|
-
|
|
87
|
-
Column(gap=3):
|
|
88
|
-
Conditional(when=providers.anthropic.apiKey.configured):
|
|
89
|
-
Heading(level=4): "Configured"
|
|
90
|
-
Conditional(when=!providers.anthropic.apiKey.configured):
|
|
91
|
-
Heading(level=4): "Not configured"
|
|
92
|
-
IntentForm(intent=settings.setAnthropicKey, submitLabel=Save Key):
|
|
93
|
-
TextInput(name=apiKey, type=password, placeholder=sk-ant-...):
|
|
94
|
-
Card(title=Claude Subscription):
|
|
95
|
-
Column(gap=3):
|
|
96
|
-
Conditional(when=providers.anthropic.subscription.configured):
|
|
97
|
-
Heading(level=4): "Configured"
|
|
98
|
-
Conditional(when=!providers.anthropic.subscription.configured):
|
|
99
|
-
Heading(level=4): "Not configured"
|
|
100
|
-
MarkdownContent(source=providers.anthropic.subscription.instructions):
|
|
101
|
-
IntentForm(intent=settings.setClaudeToken, submitLabel=Save Token):
|
|
102
|
-
TextInput(name=token, type=password, placeholder=Paste setup-token here...):
|
|
78
|
+
Heading(level=4): "No providers configured"
|
|
79
|
+
SessionList():
|
|
103
80
|
\`\`\`
|
|
104
81
|
|
|
105
82
|
## Intents
|
|
106
83
|
| Name | Payload | Description |
|
|
107
84
|
|------|---------|-------------|
|
|
108
|
-
| settings.setAnthropicKey | \`{ apiKey: string }\` | Set
|
|
109
|
-
| settings.setClaudeToken | \`{
|
|
85
|
+
| settings.setAnthropicKey | \`{ apiKey: string, customName?: string }\` | Set an Anthropic API key |
|
|
86
|
+
| settings.setClaudeToken | \`{ setupToken: string, customName?: string }\` | Set a Claude subscription token |
|
|
87
|
+
| settings.setOpenAIKey | \`{ apiKey: string, customName?: string }\` | Set an OpenAI API key |
|
|
88
|
+
| settings.setKimiCodingKey | \`{ apiKey: string, customName?: string }\` | Set a Kimi Coding API key |
|
|
89
|
+
| settings.setActiveProvider | \`{ provider: string }\` | Set the active AI provider |
|
|
90
|
+
| settings.setActiveModel | \`{ model: string }\` | Set the active AI model |
|
|
91
|
+
| settings.deleteProvider | \`{ profileId: string }\` | Delete a provider profile |
|
|
92
|
+
| settings.listSessions | \`{}\` | Refresh the list of active sessions |
|
|
93
|
+
| settings.resetSessionModel | \`{ sessionKey: string }\` | Reset a session to use the system default |
|
|
94
|
+
| settings.applyDefaultToAll | \`{}\` | Apply system default to all sessions |
|
|
110
95
|
`;
|
|
111
|
-
const DEFAULT_SETTINGS_APP_ENTRY = {
|
|
112
|
-
id: "settings",
|
|
113
|
-
name: "Settings",
|
|
114
|
-
emoji: "\u2699\uFE0F",
|
|
115
|
-
description: "Configure your agent",
|
|
116
|
-
pinned: true,
|
|
117
|
-
};
|
|
118
96
|
const DEFAULT_APP_ENTRIES = [
|
|
119
|
-
|
|
120
|
-
|
|
97
|
+
{
|
|
98
|
+
id: "chat",
|
|
99
|
+
name: "Chat",
|
|
100
|
+
emoji: "\u{1F4AC}",
|
|
101
|
+
description: "Chat with the agent",
|
|
102
|
+
pinned: true,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: "settings",
|
|
106
|
+
name: "Settings",
|
|
107
|
+
emoji: "\u2699\uFE0F",
|
|
108
|
+
description: "Configure your agent",
|
|
109
|
+
pinned: true,
|
|
110
|
+
},
|
|
121
111
|
];
|
|
122
|
-
const
|
|
112
|
+
const BUNDLED_CLAPPS = [
|
|
123
113
|
{
|
|
114
|
+
id: "chat",
|
|
124
115
|
appPath: "chat.app.md",
|
|
125
116
|
viewPath: "default.chat.view.md",
|
|
126
117
|
appMd: DEFAULT_CHAT_APP_MD,
|
|
127
118
|
viewMd: DEFAULT_CHAT_VIEW,
|
|
128
119
|
},
|
|
129
120
|
{
|
|
121
|
+
id: "settings",
|
|
130
122
|
appPath: "settings.app.md",
|
|
131
123
|
viewPath: "default.settings.view.md",
|
|
132
124
|
appMd: DEFAULT_SETTINGS_APP_MD,
|
|
133
125
|
viewMd: DEFAULT_SETTINGS_VIEW,
|
|
134
126
|
},
|
|
135
127
|
];
|
|
128
|
+
// === Clapp loading ===
|
|
129
|
+
/** Get the user's clapps directory */
|
|
130
|
+
export function getUserClappsDir() {
|
|
131
|
+
return resolve(homedir(), ".openclaw", "clapps");
|
|
132
|
+
}
|
|
133
|
+
/** Get the bundled clapps directory (shipped with package) */
|
|
134
|
+
export function getBundledClappsDir() {
|
|
135
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
136
|
+
return resolve(__dirname, "..", "clapps");
|
|
137
|
+
}
|
|
138
|
+
/** Load a view file, checking user dir first, then bundled, then fallback to embedded */
|
|
139
|
+
function loadView(clappId, viewFile, fallback) {
|
|
140
|
+
const userPath = resolve(getUserClappsDir(), clappId, "views", viewFile);
|
|
141
|
+
if (existsSync(userPath)) {
|
|
142
|
+
try {
|
|
143
|
+
return readFileSync(userPath, "utf-8");
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Fall through
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const bundledPath = resolve(getBundledClappsDir(), clappId, "views", viewFile);
|
|
150
|
+
if (existsSync(bundledPath)) {
|
|
151
|
+
try {
|
|
152
|
+
return readFileSync(bundledPath, "utf-8");
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Fall through
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return fallback;
|
|
159
|
+
}
|
|
160
|
+
/** Install default clapps to user directory if not present */
|
|
161
|
+
export function installDefaultClapps() {
|
|
162
|
+
const userClappsDir = getUserClappsDir();
|
|
163
|
+
const bundledClappsDir = getBundledClappsDir();
|
|
164
|
+
for (const clapp of BUNDLED_CLAPPS) {
|
|
165
|
+
const userClappDir = resolve(userClappsDir, clapp.id);
|
|
166
|
+
const bundledClappDir = resolve(bundledClappsDir, clapp.id);
|
|
167
|
+
// Skip if user already has this clapp
|
|
168
|
+
if (existsSync(userClappDir)) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
// Copy from bundled if available
|
|
172
|
+
if (existsSync(bundledClappDir)) {
|
|
173
|
+
try {
|
|
174
|
+
mkdirSync(userClappDir, { recursive: true });
|
|
175
|
+
cpSync(bundledClappDir, userClappDir, { recursive: true });
|
|
176
|
+
console.log(`📦 Installed clapp: ${clapp.id} -> ${userClappDir}`);
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
console.warn(`⚠️ Failed to install clapp ${clapp.id}: ${err}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/** Seed default views and apps registry */
|
|
136
185
|
export function seedDefaults(viewsDir, stateDir) {
|
|
137
|
-
//
|
|
138
|
-
|
|
139
|
-
|
|
186
|
+
// Install clapps to user directory first
|
|
187
|
+
installDefaultClapps();
|
|
188
|
+
// Seed app definitions and view modules
|
|
189
|
+
for (const clapp of BUNDLED_CLAPPS) {
|
|
190
|
+
const fullAppPath = resolve(viewsDir, clapp.appPath);
|
|
191
|
+
const appContent = loadView(clapp.id, clapp.appPath.replace(".app.md", ".app.md"), clapp.appMd);
|
|
140
192
|
if (!existsSync(fullAppPath)) {
|
|
141
|
-
writeFileSync(fullAppPath,
|
|
142
|
-
console.log(`📝 Created
|
|
193
|
+
writeFileSync(fullAppPath, appContent, "utf-8");
|
|
194
|
+
console.log(`📝 Created app: ${fullAppPath}`);
|
|
143
195
|
}
|
|
144
|
-
const fullViewPath = resolve(viewsDir, viewPath);
|
|
145
|
-
|
|
196
|
+
const fullViewPath = resolve(viewsDir, clapp.viewPath);
|
|
197
|
+
const viewFile = clapp.viewPath.replace("default.", "").replace(".view.md", ".view.md");
|
|
198
|
+
const viewContent = loadView(clapp.id, `default.${clapp.id}.view.md`, clapp.viewMd);
|
|
199
|
+
writeFileSync(fullViewPath, viewContent, "utf-8");
|
|
146
200
|
}
|
|
147
201
|
// Seed or merge _apps.json
|
|
148
202
|
const appsPath = resolve(stateDir, "_apps.json");
|
|
@@ -170,31 +224,36 @@ export function seedDefaults(viewsDir, stateDir) {
|
|
|
170
224
|
}
|
|
171
225
|
}
|
|
172
226
|
}
|
|
173
|
-
/** Check if the agent has an AI provider
|
|
174
|
-
export function checkAuthStatus(stateDir,
|
|
175
|
-
const
|
|
176
|
-
const targetPath =
|
|
227
|
+
/** Check if the agent has an AI provider configured and write _status.json */
|
|
228
|
+
export function checkAuthStatus(stateDir, authProfilesPath) {
|
|
229
|
+
const defaultAuthProfilesPath = resolve(homedir(), ".openclaw", "agents", "main", "agent", "auth-profiles.json");
|
|
230
|
+
const targetPath = authProfilesPath ?? defaultAuthProfilesPath;
|
|
177
231
|
let setupRequired = true;
|
|
178
|
-
let message = "Your agent needs an AI provider key to respond to messages.
|
|
179
|
-
|
|
232
|
+
let message = "Your agent needs an AI provider key to respond to messages. Run:\n" +
|
|
233
|
+
"`openclaw models auth` to configure authentication.";
|
|
180
234
|
try {
|
|
181
235
|
if (existsSync(targetPath)) {
|
|
182
236
|
const raw = readFileSync(targetPath, "utf-8");
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
237
|
+
const data = JSON.parse(raw);
|
|
238
|
+
// Check if any profile has actual credentials
|
|
239
|
+
const profiles = data.profiles ?? data;
|
|
240
|
+
const hasCredentials = Object.values(profiles).some((profile) => {
|
|
241
|
+
if (typeof profile === "object" && profile !== null) {
|
|
242
|
+
const p = profile;
|
|
243
|
+
return ((typeof p.token === "string" && p.token.length > 0) ||
|
|
244
|
+
(typeof p.key === "string" && p.key.length > 0) ||
|
|
245
|
+
(typeof p.access === "string" && p.access.length > 0));
|
|
187
246
|
}
|
|
188
|
-
return
|
|
247
|
+
return false;
|
|
189
248
|
});
|
|
190
|
-
if (
|
|
249
|
+
if (hasCredentials) {
|
|
191
250
|
setupRequired = false;
|
|
192
251
|
message = "";
|
|
193
252
|
}
|
|
194
253
|
}
|
|
195
254
|
}
|
|
196
255
|
catch {
|
|
197
|
-
// If we can't read auth.json, assume setup is required
|
|
256
|
+
// If we can't read auth-profiles.json, assume setup is required
|
|
198
257
|
}
|
|
199
258
|
const statusPath = resolve(stateDir, "_status.json");
|
|
200
259
|
writeFileSync(statusPath, JSON.stringify({
|
|
@@ -203,7 +262,7 @@ export function checkAuthStatus(stateDir, authPath) {
|
|
|
203
262
|
state: { setupRequired, message },
|
|
204
263
|
}, null, 2), "utf-8");
|
|
205
264
|
if (setupRequired) {
|
|
206
|
-
console.warn("⚠️ No AI provider
|
|
265
|
+
console.warn("⚠️ No AI provider configured — _status.json written with setupRequired: true");
|
|
207
266
|
}
|
|
208
267
|
}
|
|
209
268
|
//# sourceMappingURL=defaults.js.map
|
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;
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAeA,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,8 +7,8 @@ import { AgentClient } from "./agent-client.js";
|
|
|
7
7
|
import { AgentHandler } from "./agent-handler.js";
|
|
8
8
|
import { StateStore } from "./state-store.js";
|
|
9
9
|
import { startServer } from "./server.js";
|
|
10
|
-
import { seedDefaults, checkAuthStatus } from "./defaults.js";
|
|
11
|
-
import {
|
|
10
|
+
import { seedDefaults, checkAuthStatus, getBundledClappsDir } from "./defaults.js";
|
|
11
|
+
import { loadClappHandlers } from "./clapp-loader.js";
|
|
12
12
|
function parseArgs(args) {
|
|
13
13
|
const opts = {};
|
|
14
14
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -36,9 +36,16 @@ async function main() {
|
|
|
36
36
|
// 2. Seed defaults to disk
|
|
37
37
|
seedDefaults(viewsDir, stateDir);
|
|
38
38
|
checkAuthStatus(stateDir);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
// 3. Load clapp handlers dynamically
|
|
40
|
+
const handlerContext = {
|
|
41
|
+
stateDir,
|
|
42
|
+
setState: (id, state) => store.setState(id, state),
|
|
43
|
+
checkAuthStatus: () => checkAuthStatus(stateDir),
|
|
44
|
+
};
|
|
45
|
+
const handlers = await loadClappHandlers(getBundledClappsDir(), handlerContext);
|
|
46
|
+
for (const h of handlers)
|
|
47
|
+
h.init?.();
|
|
48
|
+
// 4. Start ACP subprocess
|
|
42
49
|
const agentClient = new AgentClient({
|
|
43
50
|
session,
|
|
44
51
|
agentToken,
|
|
@@ -53,39 +60,51 @@ async function main() {
|
|
|
53
60
|
console.error(`⚠️ ACP failed to start: ${err instanceof Error ? err.message : err}`);
|
|
54
61
|
console.error(" Intent processing will not work until ACP is available.");
|
|
55
62
|
}
|
|
56
|
-
//
|
|
63
|
+
// 5. Create agent handler (syncs disk → store after intents)
|
|
57
64
|
const agentHandler = new AgentHandler({
|
|
58
65
|
agentClient,
|
|
59
66
|
store,
|
|
60
67
|
stateDir,
|
|
61
68
|
viewsDir,
|
|
62
69
|
});
|
|
63
|
-
//
|
|
70
|
+
// 6. Initial sync: load all disk state into the store
|
|
64
71
|
await agentHandler.syncToStore();
|
|
65
|
-
//
|
|
72
|
+
// 7. Resolve static SPA directory
|
|
66
73
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
67
74
|
const staticDir = resolve(__dirname, "..", "web-app");
|
|
68
|
-
//
|
|
75
|
+
// 8. Start HTTP + WebSocket server
|
|
69
76
|
const server = startServer({
|
|
70
77
|
port,
|
|
71
78
|
store,
|
|
72
79
|
staticDir,
|
|
73
80
|
agentConnected: () => agentStarted,
|
|
81
|
+
onConnect: () => {
|
|
82
|
+
for (const h of handlers)
|
|
83
|
+
h.onConnect?.();
|
|
84
|
+
},
|
|
74
85
|
onIntent: (intent, _context) => {
|
|
75
|
-
// Let
|
|
76
|
-
|
|
77
|
-
|
|
86
|
+
// Let clapp handlers intercept first
|
|
87
|
+
for (const h of handlers) {
|
|
88
|
+
if (h.handleIntent(intent))
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
78
91
|
// Forward to agent
|
|
79
92
|
agentHandler.handleIntent(intent).catch((err) => {
|
|
80
93
|
console.error(`[intent] ${err.message}`);
|
|
81
94
|
});
|
|
82
95
|
},
|
|
83
96
|
});
|
|
97
|
+
// 9. Periodic refresh to detect external config changes (every 10s)
|
|
98
|
+
const refreshInterval = setInterval(() => {
|
|
99
|
+
for (const h of handlers)
|
|
100
|
+
h.refresh?.();
|
|
101
|
+
}, 10_000);
|
|
84
102
|
console.log(`📁 State dir: ${stateDir}`);
|
|
85
103
|
console.log(`📄 Views dir: ${viewsDir}`);
|
|
86
104
|
// Graceful shutdown
|
|
87
105
|
process.on("SIGINT", () => {
|
|
88
106
|
console.log("\nShutting down...");
|
|
107
|
+
clearInterval(refreshInterval);
|
|
89
108
|
server.close();
|
|
90
109
|
agentClient.stop();
|
|
91
110
|
process.exit(0);
|
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,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,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/server.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export interface ServerOptions {
|
|
|
6
6
|
onIntent: (intent: IntentMessage, context?: ClientContext) => void;
|
|
7
7
|
staticDir?: string;
|
|
8
8
|
agentConnected?: () => boolean;
|
|
9
|
+
onConnect?: () => void;
|
|
9
10
|
}
|
|
10
11
|
export declare function startServer(options: ServerOptions): {
|
|
11
12
|
close: () => void;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AAElF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AAElF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAcD,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAuCzE"}
|
package/dist/server.js
CHANGED
|
@@ -16,13 +16,15 @@ const MIME_TYPES = {
|
|
|
16
16
|
".woff2": "font/woff2",
|
|
17
17
|
};
|
|
18
18
|
export function startServer(options) {
|
|
19
|
-
const { port, store, onIntent, staticDir, agentConnected } = options;
|
|
19
|
+
const { port, store, onIntent, staticDir, agentConnected, onConnect } = options;
|
|
20
20
|
const server = createServer((req, res) => {
|
|
21
21
|
handleRequest(req, res, store, onIntent, staticDir, agentConnected);
|
|
22
22
|
});
|
|
23
23
|
const wss = new WebSocketServer({ server });
|
|
24
24
|
wss.on("connection", (ws) => {
|
|
25
25
|
const client = store.addClient(ws);
|
|
26
|
+
// Notify that a client connected (for state refresh)
|
|
27
|
+
onConnect?.();
|
|
26
28
|
ws.on("message", (raw) => {
|
|
27
29
|
try {
|
|
28
30
|
const msg = JSON.parse(String(raw));
|