@cremini/skillpack 1.0.8 → 1.0.9-im.1

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.
Files changed (33) hide show
  1. package/README.md +3 -1
  2. package/dist/cli.js +45 -11
  3. package/package.json +3 -2
  4. package/runtime/server/dist/adapters/markdown.js +74 -0
  5. package/runtime/server/dist/adapters/markdown.js.map +1 -0
  6. package/runtime/server/dist/adapters/slack.js +369 -0
  7. package/runtime/server/dist/adapters/slack.js.map +1 -0
  8. package/runtime/server/dist/adapters/telegram.js +199 -0
  9. package/runtime/server/dist/adapters/telegram.js.map +1 -0
  10. package/runtime/server/dist/adapters/types.js +2 -0
  11. package/runtime/server/dist/adapters/types.js.map +1 -0
  12. package/runtime/server/dist/adapters/web.js +168 -0
  13. package/runtime/server/dist/adapters/web.js.map +1 -0
  14. package/runtime/server/dist/agent.js +219 -0
  15. package/runtime/server/dist/agent.js.map +1 -0
  16. package/runtime/server/dist/config.js +73 -0
  17. package/runtime/server/dist/config.js.map +1 -0
  18. package/runtime/server/dist/index.js +122 -0
  19. package/runtime/server/dist/index.js.map +1 -0
  20. package/runtime/server/package-lock.json +2768 -121
  21. package/runtime/server/package.json +13 -3
  22. package/runtime/start.bat +2 -2
  23. package/runtime/start.sh +1 -1
  24. package/runtime/web/index.html +58 -15
  25. package/runtime/web/js/api.js +13 -0
  26. package/runtime/web/{app.js → js/chat.js} +126 -193
  27. package/runtime/web/js/config.js +15 -0
  28. package/runtime/web/js/main.js +47 -0
  29. package/runtime/web/js/settings.js +132 -0
  30. package/runtime/web/styles.css +171 -0
  31. package/runtime/server/chat-proxy.js +0 -161
  32. package/runtime/server/index.js +0 -63
  33. package/runtime/server/routes.js +0 -104
@@ -0,0 +1,73 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export class ConfigManager {
4
+ static instance;
5
+ configData = {};
6
+ configPath = "";
7
+ constructor() { }
8
+ static getInstance() {
9
+ if (!ConfigManager.instance) {
10
+ ConfigManager.instance = new ConfigManager();
11
+ }
12
+ return ConfigManager.instance;
13
+ }
14
+ load(rootDir) {
15
+ this.configPath = path.join(rootDir, "data", "config.json");
16
+ if (fs.existsSync(this.configPath)) {
17
+ try {
18
+ this.configData = JSON.parse(fs.readFileSync(this.configPath, "utf-8"));
19
+ console.log(" Loaded config from data/config.json");
20
+ }
21
+ catch (err) {
22
+ console.warn(" Warning: Failed to parse data/config.json:", err);
23
+ }
24
+ }
25
+ // Environment variables as fallback if not set in config file
26
+ let { apiKey = "", provider = "openai" } = this.configData;
27
+ if (!apiKey) {
28
+ if (process.env.OPENAI_API_KEY) {
29
+ apiKey = process.env.OPENAI_API_KEY;
30
+ provider = "openai";
31
+ }
32
+ else if (process.env.ANTHROPIC_API_KEY) {
33
+ apiKey = process.env.ANTHROPIC_API_KEY;
34
+ provider = "anthropic";
35
+ }
36
+ }
37
+ this.configData.apiKey = apiKey;
38
+ this.configData.provider = provider;
39
+ return this.configData;
40
+ }
41
+ getConfig() {
42
+ return this.configData;
43
+ }
44
+ save(rootDir, updates) {
45
+ const configDir = path.join(rootDir, "data");
46
+ if (!this.configPath) {
47
+ this.configPath = path.join(rootDir, "data", "config.json");
48
+ }
49
+ if (!fs.existsSync(configDir)) {
50
+ fs.mkdirSync(configDir, { recursive: true });
51
+ }
52
+ // Merge configuration
53
+ if (updates.apiKey !== undefined)
54
+ this.configData.apiKey = updates.apiKey;
55
+ if (updates.provider !== undefined)
56
+ this.configData.provider = updates.provider;
57
+ // Deep merge for adapters to avoid losing other objects not provided in this update
58
+ if (updates.adapters !== undefined) {
59
+ this.configData.adapters = {
60
+ ...(this.configData.adapters || {}),
61
+ ...updates.adapters
62
+ };
63
+ }
64
+ try {
65
+ fs.writeFileSync(this.configPath, JSON.stringify(this.configData, null, 2), "utf-8");
66
+ }
67
+ catch (err) {
68
+ console.error("Failed to save config:", err);
69
+ }
70
+ }
71
+ }
72
+ export const configManager = ConfigManager.getInstance();
73
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAe7B,MAAM,OAAO,aAAa;IAChB,MAAM,CAAC,QAAQ,CAAgB;IAC/B,UAAU,GAAe,EAAE,CAAC;IAC5B,UAAU,GAAW,EAAE,CAAC;IAEhC,gBAAuB,CAAC;IAEjB,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEM,IAAI,CAAC,OAAe;QACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBACxE,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE,GAAG,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;QAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;gBAC/B,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;gBACpC,QAAQ,GAAG,QAAQ,CAAC;YACtB,CAAC;iBAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;gBACzC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;gBACvC,QAAQ,GAAG,WAAW,CAAC;YACzB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEM,IAAI,CAAC,OAAe,EAAE,OAA4B;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,sBAAsB;QACtB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC1E,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAEhF,qFAAqF;QACrF,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG;gBACzB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACnC,GAAG,OAAO,CAAC,QAAQ;aACpB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EACxC,OAAO,CACR,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC"}
@@ -0,0 +1,122 @@
1
+ import express from "express";
2
+ import path from "node:path";
3
+ import fs from "node:fs";
4
+ import { fileURLToPath } from "node:url";
5
+ import { createServer } from "node:http";
6
+ import { exec } from "node:child_process";
7
+ import { PackAgent } from "./agent.js";
8
+ import { WebAdapter } from "./adapters/web.js";
9
+ import { configManager } from "./config.js";
10
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
11
+ // ---------------------------------------------------------------------------
12
+ // Resolve root directory
13
+ // ---------------------------------------------------------------------------
14
+ // In dev (running from dist/), go up two levels: dist/ → server/ → pack root
15
+ // In production (copied to target), go up one level: dist/ → server/ → pack root
16
+ const serverDir = path.resolve(__dirname, "..");
17
+ const rootDir = process.env.PACK_ROOT || path.resolve(serverDir, "..");
18
+ // ---------------------------------------------------------------------------
19
+ // Read configuration: data/config.json first, env vars override
20
+ // ---------------------------------------------------------------------------
21
+ const dataConfig = configManager.load(rootDir);
22
+ const apiKey = dataConfig.apiKey || "";
23
+ const provider = dataConfig.provider || "openai";
24
+ const modelId = provider === "anthropic" ? "claude-opus-4-6" : "gpt-5.4";
25
+ // ---------------------------------------------------------------------------
26
+ // Create Express app & HTTP server
27
+ // ---------------------------------------------------------------------------
28
+ const webDir = fs.existsSync(path.join(rootDir, "web"))
29
+ ? path.join(rootDir, "web")
30
+ : path.join(serverDir, "..", "web");
31
+ const app = express();
32
+ app.use(express.json());
33
+ app.use(express.static(webDir));
34
+ const server = createServer(app);
35
+ // ---------------------------------------------------------------------------
36
+ // Create PackAgent (shared instance)
37
+ // ---------------------------------------------------------------------------
38
+ const agent = new PackAgent({ apiKey, rootDir, provider, modelId });
39
+ // ---------------------------------------------------------------------------
40
+ // Start adapters
41
+ // ---------------------------------------------------------------------------
42
+ async function startAdapters() {
43
+ // Web adapter is always enabled
44
+ const webAdapter = new WebAdapter();
45
+ await webAdapter.start({ agent, server, app, rootDir });
46
+ // Telegram adapter (conditional)
47
+ if (dataConfig.adapters?.telegram?.token) {
48
+ try {
49
+ const { TelegramAdapter } = await import("./adapters/telegram.js");
50
+ const telegramAdapter = new TelegramAdapter({
51
+ token: dataConfig.adapters.telegram.token,
52
+ });
53
+ await telegramAdapter.start({ agent, server, app, rootDir });
54
+ }
55
+ catch (err) {
56
+ console.error("[Telegram] Failed to start:", err);
57
+ }
58
+ }
59
+ // Slack adapter (conditional)
60
+ const slackConfig = dataConfig.adapters?.slack;
61
+ if (slackConfig?.botToken || slackConfig?.appToken) {
62
+ if (!slackConfig.botToken || !slackConfig.appToken) {
63
+ console.warn("[Slack] Skipped: both adapters.slack.botToken and adapters.slack.appToken are required.");
64
+ }
65
+ else {
66
+ try {
67
+ const { SlackAdapter } = await import("./adapters/slack.js");
68
+ const slackAdapter = new SlackAdapter({
69
+ botToken: slackConfig.botToken,
70
+ appToken: slackConfig.appToken,
71
+ });
72
+ await slackAdapter.start({ agent, server, app, rootDir });
73
+ }
74
+ catch (err) {
75
+ console.error("[Slack] Failed to start:", err);
76
+ }
77
+ }
78
+ }
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // Listen
82
+ // ---------------------------------------------------------------------------
83
+ const HOST = process.env.HOST || "127.0.0.1";
84
+ const DEFAULT_PORT = 26313;
85
+ server.once("listening", () => {
86
+ const address = server.address();
87
+ const actualPort = typeof address === "string" ? address : address?.port;
88
+ const url = `http://${HOST}:${actualPort}`;
89
+ console.log(`\n Skills Pack Server`);
90
+ console.log(` Running at ${url}\n`);
91
+ // Open the browser automatically
92
+ const cmd = process.platform === "darwin"
93
+ ? `open ${url}`
94
+ : process.platform === "win32"
95
+ ? `start ${url}`
96
+ : `xdg-open ${url}`;
97
+ exec(cmd, () => { });
98
+ });
99
+ function tryListen(port) {
100
+ server.listen(port, HOST);
101
+ server.once("error", (err) => {
102
+ if (err.code === "EADDRINUSE") {
103
+ console.log(` Port ${port} is in use, trying ${port + 1}...`);
104
+ server.close();
105
+ tryListen(port + 1);
106
+ }
107
+ else {
108
+ throw err;
109
+ }
110
+ });
111
+ }
112
+ // Start adapters, then listen
113
+ startAdapters()
114
+ .then(() => {
115
+ const startPort = Number(process.env.PORT) || DEFAULT_PORT;
116
+ tryListen(startPort);
117
+ })
118
+ .catch((err) => {
119
+ console.error("Failed to start adapters:", err);
120
+ process.exit(1);
121
+ });
122
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}