@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.
@@ -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,12 @@
1
+ ---
2
+ name: Settings
3
+ domain: default
4
+ ---
5
+
6
+ ## Modules
7
+ - default/settings
8
+
9
+ ## Layout
10
+ ```clapp-layout
11
+ Module(ref=default/settings):
12
+ ```
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=clapp-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clapp-handler.js","sourceRoot":"","sources":["../src/clapp-handler.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { ClappHandler, ClappHandlerContext } from "./clapp-handler.js";
2
+ export declare function loadClappHandlers(clappsDir: string, ctx: ClappHandlerContext): Promise<ClappHandler[]>;
3
+ //# sourceMappingURL=clapp-loader.d.ts.map
@@ -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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"}
@@ -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 API key configured and write _status.json */
3
- export declare function checkAuthStatus(stateDir: string, authPath?: string): void;
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
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAwJA,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAoCrE;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAkDzE"}
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.3.0
60
+ version: 0.6.0
66
61
  ---
67
62
 
68
63
  ## State Bindings
69
64
  - \`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
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=4):
79
- Heading(level=2): "Settings"
80
- Card(title=Authentication Status):
81
- Column(gap=2):
72
+ Column(gap=5):
73
+ Card(title=AI Providers):
74
+ Column(gap=4):
82
75
  Conditional(when=active.isConfigured):
83
- MarkdownContent(source=active.description):
76
+ ProviderList(data=configuredProviders):
84
77
  Conditional(when=!active.isConfigured):
85
- Heading(level=4): "No authentication configured"
86
- Card(title=Anthropic API Key):
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 the Anthropic API key |
109
- | settings.setClaudeToken | \`{ token: string }\` | Set Claude subscription setup-token |
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
- DEFAULT_CHAT_APP_ENTRY,
120
- DEFAULT_SETTINGS_APP_ENTRY,
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 DEFAULT_APPS = [
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
- // Seed app definitions and always overwrite default view modules
138
- for (const { appPath, viewPath, appMd, viewMd } of DEFAULT_APPS) {
139
- const fullAppPath = resolve(viewsDir, appPath);
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, appMd, "utf-8");
142
- console.log(`📝 Created default app: ${fullAppPath}`);
193
+ writeFileSync(fullAppPath, appContent, "utf-8");
194
+ console.log(`📝 Created app: ${fullAppPath}`);
143
195
  }
144
- const fullViewPath = resolve(viewsDir, viewPath);
145
- writeFileSync(fullViewPath, viewMd, "utf-8");
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 API key configured and write _status.json */
174
- export function checkAuthStatus(stateDir, authPath) {
175
- const defaultAuthPath = resolve(homedir(), ".openclaw", "agents", "main", "agent", "auth.json");
176
- const targetPath = authPath ?? defaultAuthPath;
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. SSH into your server and run:\n" +
179
- 'openclaw config set agents.main.auth.anthropic.apiKey "sk-ant-..."';
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 auth = JSON.parse(raw);
184
- const hasKey = Object.values(auth).some((provider) => {
185
- if (typeof provider === "object" && provider !== null) {
186
- return Object.values(provider).some((v) => typeof v === "string" && v.length > 0);
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 typeof provider === "string" && provider.length > 0;
247
+ return false;
189
248
  });
190
- if (hasKey) {
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 key configured — _status.json written with setupRequired: true");
265
+ console.warn("⚠️ No AI provider configured — _status.json written with setupRequired: true");
207
266
  }
208
267
  }
209
268
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export type { ClappHandler, ClappHandlerContext, ClappHandlerFactory } from "./clapp-handler.js";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -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 { SettingsHandler } from "./settings-handler.js";
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
- const settingsHandler = new SettingsHandler({ stateDir, store });
40
- settingsHandler.writeSettingsState();
41
- // 3. Start ACP subprocess
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
- // 4. Create agent handler (syncs disk → store after intents)
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
- // 5. Initial sync: load all disk state into the store
70
+ // 6. Initial sync: load all disk state into the store
64
71
  await agentHandler.syncToStore();
65
- // 6. Resolve static SPA directory
72
+ // 7. Resolve static SPA directory
66
73
  const __dirname = dirname(fileURLToPath(import.meta.url));
67
74
  const staticDir = resolve(__dirname, "..", "web-app");
68
- // 7. Start HTTP + WebSocket server
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 settings handler intercept first
76
- if (settingsHandler.handleIntent(intent))
77
- return;
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":"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"}
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;
@@ -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;CAChC;AAcD,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAoCzE"}
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));