@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.
- package/README.md +3 -1
- package/dist/cli.js +45 -11
- package/package.json +3 -2
- package/runtime/server/dist/adapters/markdown.js +74 -0
- package/runtime/server/dist/adapters/markdown.js.map +1 -0
- package/runtime/server/dist/adapters/slack.js +369 -0
- package/runtime/server/dist/adapters/slack.js.map +1 -0
- package/runtime/server/dist/adapters/telegram.js +199 -0
- package/runtime/server/dist/adapters/telegram.js.map +1 -0
- package/runtime/server/dist/adapters/types.js +2 -0
- package/runtime/server/dist/adapters/types.js.map +1 -0
- package/runtime/server/dist/adapters/web.js +168 -0
- package/runtime/server/dist/adapters/web.js.map +1 -0
- package/runtime/server/dist/agent.js +219 -0
- package/runtime/server/dist/agent.js.map +1 -0
- package/runtime/server/dist/config.js +73 -0
- package/runtime/server/dist/config.js.map +1 -0
- package/runtime/server/dist/index.js +122 -0
- package/runtime/server/dist/index.js.map +1 -0
- package/runtime/server/package-lock.json +2768 -121
- package/runtime/server/package.json +13 -3
- package/runtime/start.bat +2 -2
- package/runtime/start.sh +1 -1
- package/runtime/web/index.html +58 -15
- package/runtime/web/js/api.js +13 -0
- package/runtime/web/{app.js → js/chat.js} +126 -193
- package/runtime/web/js/config.js +15 -0
- package/runtime/web/js/main.js +47 -0
- package/runtime/web/js/settings.js +132 -0
- package/runtime/web/styles.css +171 -0
- package/runtime/server/chat-proxy.js +0 -161
- package/runtime/server/index.js +0 -63
- 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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"}
|