@channel.io/app-sdk 0.1.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/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { createCommand } from "./commands/create.js";
4
+ import { addCommand } from "./commands/add.js";
5
+ import { devCommand } from "./commands/dev.js";
6
+ import { buildCommand } from "./commands/build.js";
7
+ import { generateCommand } from "./commands/generate.js";
8
+ const program = new Command();
9
+ program.name("channel-app").description("CLI for Channel.io App SDK").version("0.0.1");
10
+ // Register commands
11
+ program.addCommand(createCommand);
12
+ program.addCommand(addCommand);
13
+ program.addCommand(devCommand);
14
+ program.addCommand(buildCommand);
15
+ program.addCommand(generateCommand);
16
+ program.parse();
17
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEvF,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAEpC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const addCommand: Command;
3
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4KpC,eAAO,MAAM,UAAU,SAcnB,CAAC"}
@@ -0,0 +1,302 @@
1
+ import { Command } from "commander";
2
+ import pc from "picocolors";
3
+ import * as fs from "node:fs";
4
+ import * as path from "node:path";
5
+ import prompts from "prompts";
6
+ const EXTENSION_TEMPLATES = {
7
+ oauth: `import { createOAuthExtensionV1 } from "@channel.io/app-sdk-core";
8
+
9
+ export const oauthExtension = createOAuthExtensionV1({
10
+ getAuthConfig: async (ctx) => ({
11
+ authorizationUrl: "https://provider.com/oauth/authorize",
12
+ tokenUrl: "https://provider.com/oauth/token",
13
+ scopes: ["read", "write"],
14
+ clientId: process.env.OAUTH_CLIENT_ID ?? "",
15
+ }),
16
+ validateCredentials: async (ctx) => {
17
+ // TODO: Implement credential validation
18
+ return { valid: true };
19
+ },
20
+ });
21
+ `,
22
+ apikey: `import { createApiKeyExtensionV1 } from "@channel.io/app-sdk-core";
23
+
24
+ export const apikeyExtension = createApiKeyExtensionV1({
25
+ getAuthConfig: async (ctx) => ({
26
+ fields: [
27
+ {
28
+ name: "apiKey",
29
+ label: "API Key",
30
+ type: "password",
31
+ required: true,
32
+ placeholder: "Enter your API key",
33
+ },
34
+ ],
35
+ instructions: "Enter your API key to connect.",
36
+ }),
37
+ validateCredentials: async (ctx, credentials) => {
38
+ // TODO: Validate the API key
39
+ return { valid: true };
40
+ },
41
+ });
42
+ `,
43
+ calendar: `import { createCalendarExtensionV1 } from "@channel.io/app-sdk-core";
44
+
45
+ export const calendarExtension = createCalendarExtensionV1({
46
+ listEventTypes: async (ctx, params) => {
47
+ // TODO: Fetch event types from your calendar provider
48
+ return {
49
+ eventTypes: [
50
+ { id: "1", name: "30 Minute Meeting", duration: 30 },
51
+ { id: "2", name: "60 Minute Meeting", duration: 60 },
52
+ ],
53
+ };
54
+ },
55
+ getAvailability: async (ctx, params) => {
56
+ // TODO: Fetch available slots from your calendar provider
57
+ return { slots: [] };
58
+ },
59
+ createBooking: async (ctx, params) => {
60
+ // TODO: Create booking with your calendar provider
61
+ throw new Error("Not implemented");
62
+ },
63
+ });
64
+ `,
65
+ command: `import { createCommandExtensionV1 } from "@channel.io/app-sdk-core";
66
+
67
+ export const commandExtension = createCommandExtensionV1({
68
+ execute: async (ctx, params) => {
69
+ const [subcommand, ...args] = params.args;
70
+
71
+ switch (subcommand) {
72
+ case "help":
73
+ return {
74
+ action: "sendMessage",
75
+ text: "Available commands: help, search <query>",
76
+ };
77
+ case "search":
78
+ return {
79
+ action: "openWam",
80
+ wamName: "search-results",
81
+ wamParams: { query: args.join(" ") },
82
+ };
83
+ default:
84
+ return { action: "none" };
85
+ }
86
+ },
87
+ getSuggestions: async (ctx, params) => ({
88
+ suggestions: [
89
+ { value: "help", label: "Help", description: "Show help message" },
90
+ { value: "search", label: "Search", description: "Search for items" },
91
+ ],
92
+ }),
93
+ });
94
+ `,
95
+ widget: `import { createWidgetExtensionV1 } from "@channel.io/app-sdk-core";
96
+
97
+ export const widgetExtension = createWidgetExtensionV1({
98
+ getConfig: async (ctx) => ({
99
+ name: "My Widget",
100
+ description: "A helpful widget",
101
+ scope: "desk", // or "front"
102
+ widgetType: "wam", // or "snippet"
103
+ nameDescI18nMap: {
104
+ ko: { name: "내 위젯", description: "도움이 되는 위젯" },
105
+ ja: { name: "マイウィジェット", description: "便利なウィジェット" },
106
+ },
107
+ }),
108
+ onAction: async (ctx, params) => {
109
+ // TODO: Handle widget action
110
+ return {
111
+ success: true,
112
+ message: "Widget action completed",
113
+ };
114
+ },
115
+ });
116
+ `,
117
+ customtab: `import { createCustomTabExtensionV1 } from "@channel.io/app-sdk-core";
118
+
119
+ export const customTabExtension = createCustomTabExtensionV1({
120
+ getConfig: async (ctx) => ({
121
+ name: "My Tab",
122
+ nameI18nMap: {
123
+ ko: { name: "내 탭" },
124
+ ja: { name: "マイタブ" },
125
+ },
126
+ icon: "info",
127
+ }),
128
+ getContent: async (ctx, params) => ({
129
+ wamName: "my-tab-content",
130
+ wamParams: {
131
+ userChatId: params.userChatId,
132
+ },
133
+ }),
134
+ });
135
+ `,
136
+ alftask: `import { createAlfTaskExtensionV1 } from "@channel.io/app-sdk-core";
137
+
138
+ export const alfTaskExtension = createAlfTaskExtensionV1({
139
+ getAlfTasks: async (ctx) => ({
140
+ predefinedTasks: [
141
+ {
142
+ version: "v1.0.0",
143
+ name: "Auto Reply",
144
+ trigger: "user_message",
145
+ memorySchema: [
146
+ { name: "userMessage", type: "string" },
147
+ { name: "reply", type: "string" },
148
+ ],
149
+ nodes: [
150
+ {
151
+ id: "analyze",
152
+ type: "function",
153
+ config: { function: "analyzeMessage" },
154
+ next: "reply",
155
+ },
156
+ {
157
+ id: "reply",
158
+ type: "send_message",
159
+ config: { message: "{{memory.reply}}" },
160
+ },
161
+ ],
162
+ startNodeId: "analyze",
163
+ },
164
+ ],
165
+ }),
166
+ });
167
+ `,
168
+ };
169
+ const EXTENSION_TYPES = Object.keys(EXTENSION_TEMPLATES);
170
+ export const addCommand = new Command()
171
+ .command("add")
172
+ .description("Add extension or function to the project")
173
+ .argument("<type>", `Type to add: extension, function`)
174
+ .argument("[name]", "Name of the extension or function")
175
+ .action(async (type, name) => {
176
+ if (type === "extension") {
177
+ await addExtension(name);
178
+ }
179
+ else if (type === "function") {
180
+ await addFunction(name);
181
+ }
182
+ else {
183
+ console.log(pc.red(`Unknown type: ${type}. Use 'extension' or 'function'`));
184
+ process.exit(1);
185
+ }
186
+ });
187
+ async function addExtension(name) {
188
+ // Find extensions directory
189
+ const extensionsDir = findExtensionsDir();
190
+ if (!extensionsDir) {
191
+ console.log(pc.red("Could not find extensions directory. Make sure you're in a Channel.io app project."));
192
+ process.exit(1);
193
+ }
194
+ // Prompt for extension type if not provided
195
+ if (!name || !EXTENSION_TYPES.includes(name)) {
196
+ const response = await prompts({
197
+ type: "select",
198
+ name: "extensionType",
199
+ message: "Select extension type to add:",
200
+ choices: EXTENSION_TYPES.map((t) => ({ title: t, value: t })),
201
+ });
202
+ if (!response.extensionType) {
203
+ console.log(pc.yellow("Cancelled"));
204
+ return;
205
+ }
206
+ name = response.extensionType;
207
+ }
208
+ if (!name) {
209
+ console.log(pc.red("Extension name is required"));
210
+ process.exit(1);
211
+ }
212
+ const template = EXTENSION_TEMPLATES[name];
213
+ if (!template) {
214
+ console.log(pc.red(`Unknown extension type: ${name}`));
215
+ console.log(pc.dim(`Available types: ${EXTENSION_TYPES.join(", ")}`));
216
+ process.exit(1);
217
+ }
218
+ const fileName = `${name}.extension.ts`;
219
+ const filePath = path.join(extensionsDir, fileName);
220
+ if (fs.existsSync(filePath)) {
221
+ const response = await prompts({
222
+ type: "confirm",
223
+ name: "overwrite",
224
+ message: `${fileName} already exists. Overwrite?`,
225
+ initial: false,
226
+ });
227
+ if (!response.overwrite) {
228
+ console.log(pc.yellow("Cancelled"));
229
+ return;
230
+ }
231
+ }
232
+ fs.writeFileSync(filePath, template);
233
+ console.log(pc.green(`Created ${fileName}`));
234
+ console.log(pc.dim(`Don't forget to register the extension in your app module!`));
235
+ }
236
+ async function addFunction(name) {
237
+ // Find extensions directory
238
+ const extensionsDir = findExtensionsDir();
239
+ if (!extensionsDir) {
240
+ console.log(pc.red("Could not find extensions directory."));
241
+ process.exit(1);
242
+ }
243
+ // List existing extensions
244
+ const files = fs.readdirSync(extensionsDir).filter((f) => f.endsWith(".extension.ts"));
245
+ if (files.length === 0) {
246
+ console.log(pc.red("No extensions found. Add an extension first with: channel-app add extension"));
247
+ process.exit(1);
248
+ }
249
+ // Prompt for extension to add function to
250
+ const response = await prompts([
251
+ {
252
+ type: "select",
253
+ name: "extension",
254
+ message: "Select extension to add function to:",
255
+ choices: files.map((f) => ({
256
+ title: f.replace(".extension.ts", ""),
257
+ value: f,
258
+ })),
259
+ },
260
+ {
261
+ type: "text",
262
+ name: "functionName",
263
+ message: "Function name:",
264
+ initial: name,
265
+ validate: (v) => (v ? true : "Function name is required"),
266
+ },
267
+ {
268
+ type: "text",
269
+ name: "groupName",
270
+ message: "Function group name:",
271
+ initial: "default",
272
+ },
273
+ ]);
274
+ if (!response.extension || !response.functionName) {
275
+ console.log(pc.yellow("Cancelled"));
276
+ return;
277
+ }
278
+ console.log(pc.yellow("Function scaffolding is not fully implemented yet."));
279
+ console.log(pc.dim(`Please manually add the function '${response.functionName}' to group '${response.groupName}' in ${response.extension}`));
280
+ }
281
+ function findExtensionsDir() {
282
+ const possiblePaths = [
283
+ "src/extensions",
284
+ "apps/server/src/extensions",
285
+ "server/src/extensions",
286
+ "extensions",
287
+ ];
288
+ for (const p of possiblePaths) {
289
+ const fullPath = path.join(process.cwd(), p);
290
+ if (fs.existsSync(fullPath)) {
291
+ return fullPath;
292
+ }
293
+ }
294
+ // Try to create default path
295
+ const defaultPath = path.join(process.cwd(), "src/extensions");
296
+ if (fs.existsSync(path.dirname(defaultPath))) {
297
+ fs.mkdirSync(defaultPath, { recursive: true });
298
+ return defaultPath;
299
+ }
300
+ return null;
301
+ }
302
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const buildCommand: Command;
3
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,YAAY,SAqCrB,CAAC"}
@@ -0,0 +1,119 @@
1
+ import { Command } from "commander";
2
+ import pc from "picocolors";
3
+ import * as fs from "node:fs";
4
+ import * as path from "node:path";
5
+ import { execSync } from "node:child_process";
6
+ export const buildCommand = new Command()
7
+ .command("build")
8
+ .description("Build the app for production")
9
+ .option("-o, --output <dir>", "Output directory", "dist")
10
+ .action((options) => {
11
+ const projectType = detectProjectType();
12
+ console.log(pc.cyan("Building for production..."));
13
+ try {
14
+ // Build server if it exists
15
+ if (projectType.hasServer) {
16
+ console.log(pc.dim("Building server..."));
17
+ buildServer(projectType.serverPath, options.output);
18
+ console.log(pc.green("Server built successfully"));
19
+ }
20
+ // Build WAM if it exists
21
+ if (projectType.hasWam) {
22
+ console.log(pc.dim("Building WAM..."));
23
+ buildWam(projectType.wamPath, options.output);
24
+ console.log(pc.green("WAM built successfully"));
25
+ }
26
+ if (!projectType.hasServer && !projectType.hasWam) {
27
+ console.log(pc.yellow("No server or WAM found to build."));
28
+ console.log(pc.dim("Make sure you're in a Channel.io app project directory."));
29
+ return;
30
+ }
31
+ console.log(pc.green("\nBuild completed successfully!"));
32
+ }
33
+ catch (error) {
34
+ console.log(pc.red(`Build failed: ${error instanceof Error ? error.message : String(error)}`));
35
+ process.exit(1);
36
+ }
37
+ });
38
+ function detectProjectType() {
39
+ const cwd = process.cwd();
40
+ // Check for monorepo structure
41
+ const appsServerPath = path.join(cwd, "apps/server");
42
+ const appsWamPath = path.join(cwd, "apps/wam");
43
+ if (fs.existsSync(appsServerPath) && fs.existsSync(appsWamPath)) {
44
+ return {
45
+ hasServer: true,
46
+ serverPath: appsServerPath,
47
+ hasWam: true,
48
+ wamPath: appsWamPath,
49
+ };
50
+ }
51
+ // Check for standalone server/wam directories
52
+ const serverPath = path.join(cwd, "server");
53
+ const wamPath = path.join(cwd, "wam");
54
+ if (fs.existsSync(path.join(serverPath, "package.json")) &&
55
+ fs.existsSync(path.join(wamPath, "package.json"))) {
56
+ return {
57
+ hasServer: true,
58
+ serverPath: serverPath,
59
+ hasWam: true,
60
+ wamPath: wamPath,
61
+ };
62
+ }
63
+ // Check for single project
64
+ const packageJsonPath = path.join(cwd, "package.json");
65
+ if (fs.existsSync(packageJsonPath)) {
66
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
67
+ const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
68
+ return {
69
+ hasServer: !!deps["@nestjs/core"] || !!deps["@channel.io/app-sdk-server"],
70
+ serverPath: cwd,
71
+ hasWam: !!deps.react || !!deps["@channel.io/app-sdk-wam"],
72
+ wamPath: cwd,
73
+ };
74
+ }
75
+ return {
76
+ hasServer: false,
77
+ serverPath: cwd,
78
+ hasWam: false,
79
+ wamPath: cwd,
80
+ };
81
+ }
82
+ function buildServer(serverPath, _outputDir) {
83
+ const packageJsonPath = path.join(serverPath, "package.json");
84
+ if (!fs.existsSync(packageJsonPath)) {
85
+ throw new Error(`No package.json found at ${serverPath}`);
86
+ }
87
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
88
+ const scripts = packageJson.scripts || {};
89
+ // Try to find the best build script
90
+ if (scripts.build) {
91
+ execSync("pnpm run build", { cwd: serverPath, stdio: "inherit" });
92
+ }
93
+ else {
94
+ // Default to tsc for TypeScript projects
95
+ const tsconfigPath = path.join(serverPath, "tsconfig.json");
96
+ if (fs.existsSync(tsconfigPath)) {
97
+ execSync("pnpm tsc", { cwd: serverPath, stdio: "inherit" });
98
+ }
99
+ else {
100
+ throw new Error("No build script found and no tsconfig.json for TypeScript compilation");
101
+ }
102
+ }
103
+ }
104
+ function buildWam(wamPath, _outputDir) {
105
+ const packageJsonPath = path.join(wamPath, "package.json");
106
+ if (!fs.existsSync(packageJsonPath)) {
107
+ throw new Error(`No package.json found at ${wamPath}`);
108
+ }
109
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
110
+ const scripts = packageJson.scripts || {};
111
+ // Try to find the best build script
112
+ if (scripts.build) {
113
+ execSync("pnpm run build", { cwd: wamPath, stdio: "inherit" });
114
+ }
115
+ else {
116
+ throw new Error("No build script found in WAM package.json");
117
+ }
118
+ }
119
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const createCommand: Command;
3
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SAqGtB,CAAC"}