@cremini/skillpack 1.1.2 → 1.1.4-beta.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.
Files changed (39) hide show
  1. package/dist/cli.js +1602 -339
  2. package/package.json +17 -9
  3. package/templates/start.bat +3 -0
  4. package/templates/start.sh +3 -0
  5. package/runtime/README.md +0 -51
  6. package/runtime/server/dist/adapters/markdown.js +0 -74
  7. package/runtime/server/dist/adapters/markdown.js.map +0 -1
  8. package/runtime/server/dist/adapters/slack.js +0 -369
  9. package/runtime/server/dist/adapters/slack.js.map +0 -1
  10. package/runtime/server/dist/adapters/telegram.js +0 -199
  11. package/runtime/server/dist/adapters/telegram.js.map +0 -1
  12. package/runtime/server/dist/adapters/types.js +0 -2
  13. package/runtime/server/dist/adapters/types.js.map +0 -1
  14. package/runtime/server/dist/adapters/web.js +0 -201
  15. package/runtime/server/dist/adapters/web.js.map +0 -1
  16. package/runtime/server/dist/agent.js +0 -245
  17. package/runtime/server/dist/agent.js.map +0 -1
  18. package/runtime/server/dist/config.js +0 -79
  19. package/runtime/server/dist/config.js.map +0 -1
  20. package/runtime/server/dist/index.js +0 -146
  21. package/runtime/server/dist/index.js.map +0 -1
  22. package/runtime/server/dist/lifecycle.js +0 -85
  23. package/runtime/server/dist/lifecycle.js.map +0 -1
  24. package/runtime/server/dist/memory.js +0 -195
  25. package/runtime/server/dist/memory.js.map +0 -1
  26. package/runtime/server/package-lock.json +0 -8433
  27. package/runtime/server/package.json +0 -23
  28. package/runtime/start.bat +0 -51
  29. package/runtime/start.sh +0 -50
  30. /package/{runtime/web → web}/index.html +0 -0
  31. /package/{runtime/web → web}/js/api-key-dialog.js +0 -0
  32. /package/{runtime/web → web}/js/api.js +0 -0
  33. /package/{runtime/web → web}/js/chat-apps-dialog.js +0 -0
  34. /package/{runtime/web → web}/js/chat.js +0 -0
  35. /package/{runtime/web → web}/js/config.js +0 -0
  36. /package/{runtime/web → web}/js/main.js +0 -0
  37. /package/{runtime/web → web}/js/settings.js +0 -0
  38. /package/{runtime/web → web}/marked.min.js +0 -0
  39. /package/{runtime/web → web}/styles.css +0 -0
@@ -1,245 +0,0 @@
1
- import path from "node:path";
2
- import { AuthStorage, createAgentSession, ModelRegistry, SessionManager, DefaultResourceLoader, } from "@mariozechner/pi-coding-agent";
3
- const DEBUG = true;
4
- const log = (...args) => DEBUG && console.log(...args);
5
- const write = (data) => DEBUG && process.stdout.write(data);
6
- function getAssistantDiagnostics(message) {
7
- if (!message || message.role !== "assistant") {
8
- return null;
9
- }
10
- const stopReason = message.stopReason ?? "unknown";
11
- const errorMessage = message.errorMessage ||
12
- (stopReason === "error" || stopReason === "aborted"
13
- ? `Request ${stopReason}`
14
- : "");
15
- const content = Array.isArray(message.content) ? message.content : [];
16
- const text = content
17
- .filter((item) => item?.type === "text")
18
- .map((item) => item.text || "")
19
- .join("")
20
- .trim();
21
- const toolCalls = content.filter((item) => item?.type === "toolCall").length;
22
- return { stopReason, errorMessage, hasText: text.length > 0, toolCalls };
23
- }
24
- function getLifecycleTrigger(channelId) {
25
- if (channelId.startsWith("telegram-"))
26
- return "telegram";
27
- if (channelId.startsWith("slack-"))
28
- return "slack";
29
- return "web";
30
- }
31
- // ---------------------------------------------------------------------------
32
- // PackAgent
33
- // ---------------------------------------------------------------------------
34
- export class PackAgent {
35
- options;
36
- channels = new Map();
37
- pendingSessionCreations = new Map();
38
- constructor(options) {
39
- this.options = options;
40
- }
41
- /**
42
- * Lazily create (or return existing) session for a channel.
43
- */
44
- async getOrCreateSession(channelId) {
45
- const existing = this.channels.get(channelId);
46
- if (existing)
47
- return existing;
48
- const pendingCreation = this.pendingSessionCreations.get(channelId);
49
- if (pendingCreation)
50
- return pendingCreation;
51
- const createSessionPromise = (async () => {
52
- const { apiKey, rootDir, provider, modelId } = this.options;
53
- const authStorage = AuthStorage.inMemory({
54
- [provider]: { type: "api_key", key: apiKey },
55
- });
56
- authStorage.setRuntimeApiKey(provider, apiKey);
57
- const modelRegistry = new ModelRegistry(authStorage);
58
- const model = modelRegistry.find(provider, modelId);
59
- const sessionManager = SessionManager.inMemory();
60
- const skillsPath = path.resolve(rootDir, "skills");
61
- log(`[PackAgent] Loading skills from: ${skillsPath}`);
62
- const resourceLoader = new DefaultResourceLoader({
63
- cwd: rootDir,
64
- additionalSkillPaths: [skillsPath],
65
- });
66
- await resourceLoader.reload();
67
- const { session } = await createAgentSession({
68
- cwd: rootDir,
69
- authStorage,
70
- modelRegistry,
71
- sessionManager,
72
- resourceLoader,
73
- model,
74
- });
75
- const channelSession = {
76
- session,
77
- running: false,
78
- pending: Promise.resolve(),
79
- };
80
- this.channels.set(channelId, channelSession);
81
- return channelSession;
82
- })();
83
- this.pendingSessionCreations.set(channelId, createSessionPromise);
84
- try {
85
- return await createSessionPromise;
86
- }
87
- finally {
88
- this.pendingSessionCreations.delete(channelId);
89
- }
90
- }
91
- async handleMessage(channelId, text, onEvent) {
92
- const cs = await this.getOrCreateSession(channelId);
93
- const run = async () => {
94
- cs.running = true;
95
- let turnHadVisibleOutput = false;
96
- // Subscribe to agent events and forward to adapter
97
- const unsubscribe = cs.session.subscribe((event) => {
98
- switch (event.type) {
99
- case "agent_start":
100
- log("\n=== [AGENT SESSION START] ===");
101
- log("System Prompt:\n", cs.session.systemPrompt);
102
- log("============================\n");
103
- onEvent({ type: "agent_start" });
104
- break;
105
- case "message_start":
106
- log(`\n--- [Message Start: ${event.message?.role}] ---`);
107
- if (event.message?.role === "user") {
108
- log(JSON.stringify(event.message.content, null, 2));
109
- }
110
- onEvent({ type: "message_start", role: event.message?.role ?? "" });
111
- break;
112
- case "message_update":
113
- if (event.assistantMessageEvent?.type === "text_delta") {
114
- turnHadVisibleOutput = true;
115
- write(event.assistantMessageEvent.delta);
116
- onEvent({
117
- type: "text_delta",
118
- delta: event.assistantMessageEvent.delta,
119
- });
120
- }
121
- else if (event.assistantMessageEvent?.type === "thinking_delta") {
122
- turnHadVisibleOutput = true;
123
- onEvent({
124
- type: "thinking_delta",
125
- delta: event.assistantMessageEvent.delta,
126
- });
127
- }
128
- break;
129
- case "message_end":
130
- log(`\n--- [Message End: ${event.message?.role}] ---`);
131
- if (event.message?.role === "assistant") {
132
- const diagnostics = getAssistantDiagnostics(event.message);
133
- if (diagnostics) {
134
- log(`[Assistant Diagnostics] stopReason=${diagnostics.stopReason} text=${diagnostics.hasText ? "yes" : "no"} toolCalls=${diagnostics.toolCalls}`);
135
- if (diagnostics.errorMessage) {
136
- log(`[Assistant Error] ${diagnostics.errorMessage}`);
137
- }
138
- }
139
- }
140
- onEvent({ type: "message_end", role: event.message?.role ?? "" });
141
- break;
142
- case "tool_execution_start":
143
- turnHadVisibleOutput = true;
144
- log(`\n>>> [Tool Start: ${event.toolName}] >>>`);
145
- log("Args:", JSON.stringify(event.args, null, 2));
146
- onEvent({
147
- type: "tool_start",
148
- toolName: event.toolName,
149
- toolInput: event.args,
150
- });
151
- break;
152
- case "tool_execution_end":
153
- turnHadVisibleOutput = true;
154
- log(`<<< [Tool End: ${event.toolName}] <<<`);
155
- log(`Error: ${event.isError ? "Yes" : "No"}`);
156
- onEvent({
157
- type: "tool_end",
158
- toolName: event.toolName,
159
- isError: event.isError,
160
- result: event.result,
161
- });
162
- break;
163
- case "agent_end":
164
- log("\n=== [AGENT SESSION END] ===\n");
165
- onEvent({ type: "agent_end" });
166
- break;
167
- }
168
- });
169
- try {
170
- await cs.session.prompt(text);
171
- const lastMessage = cs.session.state.messages.at(-1);
172
- const diagnostics = getAssistantDiagnostics(lastMessage);
173
- if (diagnostics?.errorMessage) {
174
- return {
175
- stopReason: diagnostics.stopReason,
176
- errorMessage: diagnostics.errorMessage,
177
- };
178
- }
179
- if (diagnostics &&
180
- !diagnostics.hasText &&
181
- diagnostics.toolCalls === 0 &&
182
- !turnHadVisibleOutput) {
183
- return {
184
- stopReason: diagnostics.stopReason,
185
- errorMessage: "Assistant returned no visible output. Check the server logs for details.",
186
- };
187
- }
188
- return { stopReason: diagnostics?.stopReason ?? "unknown" };
189
- }
190
- finally {
191
- cs.running = false;
192
- unsubscribe();
193
- }
194
- };
195
- const resultPromise = cs.pending.catch(() => undefined).then(run);
196
- cs.pending = resultPromise.then(() => undefined, () => undefined);
197
- return resultPromise;
198
- }
199
- async handleCommand(command, channelId) {
200
- switch (command) {
201
- case "clear": {
202
- const cs = this.channels.get(channelId);
203
- if (cs) {
204
- cs.session.dispose();
205
- this.channels.delete(channelId);
206
- }
207
- return { success: true, message: "Session cleared." };
208
- }
209
- case "restart":
210
- log("[PackAgent] Restart requested");
211
- return this.options.lifecycleHandler.requestRestart(getLifecycleTrigger(channelId));
212
- case "shutdown":
213
- log("[PackAgent] Shutdown requested");
214
- return this.options.lifecycleHandler.requestShutdown(getLifecycleTrigger(channelId));
215
- default:
216
- return { success: false, message: `Unknown command: ${command}` };
217
- }
218
- }
219
- abort(channelId) {
220
- const cs = this.channels.get(channelId);
221
- if (cs?.running) {
222
- cs.session.abort?.();
223
- }
224
- }
225
- isRunning(channelId) {
226
- return this.channels.get(channelId)?.running ?? false;
227
- }
228
- dispose(channelId) {
229
- const cs = this.channels.get(channelId);
230
- if (cs) {
231
- cs.session.dispose();
232
- this.channels.delete(channelId);
233
- }
234
- }
235
- /** Reserved: list all sessions */
236
- listSessions() {
237
- // TODO: Implement session persistence and listing
238
- return [];
239
- }
240
- /** Reserved: restore a historical session */
241
- async restoreSession(_sessionId) {
242
- // TODO: Implement session restoration
243
- }
244
- }
245
- //# sourceMappingURL=agent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -1,79 +0,0 @@
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
- // 对每个 adapter key 单独处理:null 表示删除,有实际对象则直接覆写
58
- if (updates.adapters !== undefined) {
59
- const merged = { ...(this.configData.adapters || {}) };
60
- for (const [adapterKey, adapterVal] of Object.entries(updates.adapters)) {
61
- if (adapterVal === null || adapterVal === undefined) {
62
- delete merged[adapterKey];
63
- }
64
- else {
65
- merged[adapterKey] = adapterVal;
66
- }
67
- }
68
- this.configData.adapters = merged;
69
- }
70
- try {
71
- fs.writeFileSync(this.configPath, JSON.stringify(this.configData, null, 2), "utf-8");
72
- }
73
- catch (err) {
74
- console.error("Failed to save config:", err);
75
- }
76
- }
77
- }
78
- export const configManager = ConfigManager.getInstance();
79
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,146 +0,0 @@
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
- import { Lifecycle } from "./lifecycle.js";
11
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
12
- // ---------------------------------------------------------------------------
13
- // Resolve root directory
14
- // ---------------------------------------------------------------------------
15
- // In dev (running from dist/), go up two levels: dist/ → server/ → pack root
16
- // In production (copied to target), go up one level: dist/ → server/ → pack root
17
- const serverDir = path.resolve(__dirname, "..");
18
- const rootDir = process.env.PACK_ROOT || path.resolve(serverDir, "..");
19
- // ---------------------------------------------------------------------------
20
- // Read configuration: data/config.json first, env vars override
21
- // ---------------------------------------------------------------------------
22
- const dataConfig = configManager.load(rootDir);
23
- const apiKey = dataConfig.apiKey || "";
24
- const provider = dataConfig.provider || "openai";
25
- const modelId = provider === "anthropic" ? "claude-opus-4-6" : "gpt-5.4";
26
- // ---------------------------------------------------------------------------
27
- // Create Express app & HTTP server
28
- // ---------------------------------------------------------------------------
29
- const webDir = fs.existsSync(path.join(rootDir, "web"))
30
- ? path.join(rootDir, "web")
31
- : path.join(serverDir, "..", "web");
32
- const app = express();
33
- app.use(express.json());
34
- app.use(express.static(webDir));
35
- const server = createServer(app);
36
- const lifecycle = new Lifecycle(server);
37
- // ---------------------------------------------------------------------------
38
- // Create PackAgent (shared instance)
39
- // ---------------------------------------------------------------------------
40
- const agent = new PackAgent({
41
- apiKey,
42
- rootDir,
43
- provider,
44
- modelId,
45
- lifecycleHandler: lifecycle,
46
- });
47
- // ---------------------------------------------------------------------------
48
- // Start adapters
49
- // ---------------------------------------------------------------------------
50
- async function startAdapters() {
51
- const adapters = [];
52
- // Web adapter is always enabled
53
- const webAdapter = new WebAdapter();
54
- await webAdapter.start({ agent, server, app, rootDir, lifecycle });
55
- adapters.push(webAdapter);
56
- // Telegram adapter (conditional)
57
- if (dataConfig.adapters?.telegram?.token) {
58
- try {
59
- const { TelegramAdapter } = await import("./adapters/telegram.js");
60
- const telegramAdapter = new TelegramAdapter({
61
- token: dataConfig.adapters.telegram.token,
62
- });
63
- await telegramAdapter.start({ agent, server, app, rootDir, lifecycle });
64
- adapters.push(telegramAdapter);
65
- }
66
- catch (err) {
67
- console.error("[Telegram] Failed to start:", err);
68
- }
69
- }
70
- // Slack adapter (conditional)
71
- const slackConfig = dataConfig.adapters?.slack;
72
- if (slackConfig?.botToken || slackConfig?.appToken) {
73
- if (!slackConfig.botToken || !slackConfig.appToken) {
74
- console.warn("[Slack] Skipped: both adapters.slack.botToken and adapters.slack.appToken are required.");
75
- }
76
- else {
77
- try {
78
- const { SlackAdapter } = await import("./adapters/slack.js");
79
- const slackAdapter = new SlackAdapter({
80
- botToken: slackConfig.botToken,
81
- appToken: slackConfig.appToken,
82
- });
83
- await slackAdapter.start({ agent, server, app, rootDir, lifecycle });
84
- adapters.push(slackAdapter);
85
- }
86
- catch (err) {
87
- console.error("[Slack] Failed to start:", err);
88
- }
89
- }
90
- }
91
- lifecycle.registerAdapters(adapters);
92
- }
93
- // ---------------------------------------------------------------------------
94
- // Listen
95
- // ---------------------------------------------------------------------------
96
- const HOST = process.env.HOST || "127.0.0.1";
97
- const DEFAULT_PORT = 26313;
98
- server.once("listening", () => {
99
- const address = server.address();
100
- const actualPort = typeof address === "string" ? address : address?.port;
101
- const url = `http://${HOST}:${actualPort}`;
102
- console.log(`\n Skills Pack Server`);
103
- console.log(` Running at ${url}\n`);
104
- // Open the browser automatically (only on first run)
105
- if (process.env.SKILLPACK_FIRST_RUN === "1") {
106
- const cmd = process.platform === "darwin"
107
- ? `open ${url}`
108
- : process.platform === "win32"
109
- ? `start ${url}`
110
- : `xdg-open ${url}`;
111
- exec(cmd, (err) => {
112
- if (err)
113
- console.warn(` Could not open browser: ${err.message}`);
114
- });
115
- }
116
- });
117
- function tryListen(port) {
118
- server.listen(port, HOST);
119
- server.once("error", (err) => {
120
- if (err.code === "EADDRINUSE") {
121
- console.log(` Port ${port} is in use, trying ${port + 1}...`);
122
- server.close();
123
- tryListen(port + 1);
124
- }
125
- else {
126
- throw err;
127
- }
128
- });
129
- }
130
- process.on("SIGINT", () => {
131
- void lifecycle.requestShutdown("signal");
132
- });
133
- process.on("SIGTERM", () => {
134
- void lifecycle.requestShutdown("signal");
135
- });
136
- // Start adapters, then listen
137
- startAdapters()
138
- .then(() => {
139
- const startPort = Number(process.env.PORT) || DEFAULT_PORT;
140
- tryListen(startPort);
141
- })
142
- .catch((err) => {
143
- console.error("Failed to start adapters:", err);
144
- process.exit(1);
145
- });
146
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,85 +0,0 @@
1
- export const SHUTDOWN_EXIT_CODE = 64;
2
- export const RESTART_EXIT_CODE = 75;
3
- const STOP_TIMEOUT_MS = 3_000;
4
- function detectProcessManager() {
5
- return process.env.PACK_ROOT ? "wrapper" : "none";
6
- }
7
- export class Lifecycle {
8
- server;
9
- exitFn;
10
- processManager;
11
- adapters = [];
12
- stopReason = null;
13
- constructor(server, exitFn = (code) => process.exit(code)) {
14
- this.server = server;
15
- this.exitFn = exitFn;
16
- this.processManager = detectProcessManager();
17
- }
18
- registerAdapters(adapters) {
19
- this.adapters = adapters;
20
- }
21
- getRuntimeControl() {
22
- return {
23
- canManagedRestart: this.processManager === "wrapper",
24
- processManager: this.processManager,
25
- };
26
- }
27
- async requestRestart(trigger) {
28
- return this.requestStop("restart", trigger);
29
- }
30
- async requestShutdown(trigger) {
31
- return this.requestStop("shutdown", trigger);
32
- }
33
- async requestStop(reason, trigger) {
34
- if (this.stopReason) {
35
- const message = this.stopReason === "restart"
36
- ? "Restart already in progress."
37
- : "Shutdown already in progress.";
38
- return { success: true, message };
39
- }
40
- this.stopReason = reason;
41
- console.log(`[Lifecycle] ${reason} requested via ${trigger}`);
42
- setTimeout(() => {
43
- void this.gracefulStopAndExit(reason);
44
- }, 50);
45
- return {
46
- success: true,
47
- message: reason === "restart" ? "Restarting..." : "Shutting down...",
48
- };
49
- }
50
- async gracefulStopAndExit(reason) {
51
- try {
52
- await Promise.race([
53
- this.gracefulStop(),
54
- new Promise((resolve) => {
55
- setTimeout(() => {
56
- console.warn("[Lifecycle] Graceful stop timed out, forcing exit.");
57
- resolve();
58
- }, STOP_TIMEOUT_MS);
59
- }),
60
- ]);
61
- }
62
- catch (err) {
63
- console.error("[Lifecycle] Error during graceful stop:", err);
64
- }
65
- const exitCode = reason === "restart" ? RESTART_EXIT_CODE : SHUTDOWN_EXIT_CODE;
66
- this.exitFn(exitCode);
67
- }
68
- async gracefulStop() {
69
- for (const adapter of [...this.adapters].reverse()) {
70
- try {
71
- await adapter.stop();
72
- }
73
- catch (err) {
74
- console.error(`[Lifecycle] Failed to stop ${adapter.name}:`, err);
75
- }
76
- }
77
- if (!this.server.listening) {
78
- return;
79
- }
80
- await new Promise((resolve) => {
81
- this.server.close(() => resolve());
82
- });
83
- }
84
- }
85
- //# sourceMappingURL=lifecycle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}