tabclaw 0.1.0 → 0.1.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.
- package/README.md +45 -8
- package/dist/cli/index.js +64 -12
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/process.js +62 -29
- package/dist/daemon/process.js.map +1 -1
- package/package.json +1 -1
package/dist/daemon/process.js
CHANGED
|
@@ -4231,6 +4231,7 @@ var helpCommand = {
|
|
|
4231
4231
|
};
|
|
4232
4232
|
function generateStaticHelpText() {
|
|
4233
4233
|
let output = "**TabClaw Bot Commands**\n\n";
|
|
4234
|
+
output += "**/start** - Show welcome message\n\n";
|
|
4234
4235
|
output += "**/session** - Session management\n";
|
|
4235
4236
|
output += " `list` [--all] - List all sessions\n";
|
|
4236
4237
|
output += " `status` <session-id> - Get session details\n";
|
|
@@ -4247,8 +4248,33 @@ function generateStaticHelpText() {
|
|
|
4247
4248
|
return output;
|
|
4248
4249
|
}
|
|
4249
4250
|
|
|
4251
|
+
// src/core/command/builtin/start.ts
|
|
4252
|
+
init_esm_shims();
|
|
4253
|
+
var startCommand = {
|
|
4254
|
+
description: "Start the bot and show welcome message",
|
|
4255
|
+
usage: "/start",
|
|
4256
|
+
handler: async () => {
|
|
4257
|
+
return `\u{1F44B} **Welcome to TabClaw!**
|
|
4258
|
+
|
|
4259
|
+
I'm your Claude Code monitoring assistant. I'll notify you about:
|
|
4260
|
+
- \u{1F510} Permission requests that need your approval
|
|
4261
|
+
- \u2705 Task completions
|
|
4262
|
+
- \u{1F7E2} Session starts
|
|
4263
|
+
- \u274C Errors
|
|
4264
|
+
|
|
4265
|
+
**Available Commands:**
|
|
4266
|
+
/help - Show all available commands
|
|
4267
|
+
/session list - List active sessions
|
|
4268
|
+
/system status - Check system status
|
|
4269
|
+
/system ping - Test connectivity
|
|
4270
|
+
|
|
4271
|
+
Use the buttons on notifications to approve or deny permission requests.`;
|
|
4272
|
+
}
|
|
4273
|
+
};
|
|
4274
|
+
|
|
4250
4275
|
// src/core/command/builtin/index.ts
|
|
4251
4276
|
function registerBuiltinCommands(registry) {
|
|
4277
|
+
registry.register("start", "start", startCommand);
|
|
4252
4278
|
registry.registerGroup("session", sessionCommands);
|
|
4253
4279
|
registry.registerGroup("system", systemCommands);
|
|
4254
4280
|
registry.register("help", "help", helpCommand);
|
|
@@ -5019,25 +5045,6 @@ var BaseChannel = class {
|
|
|
5019
5045
|
sender
|
|
5020
5046
|
});
|
|
5021
5047
|
}
|
|
5022
|
-
/**
|
|
5023
|
-
* 检查发送者是否有权限
|
|
5024
|
-
* 权限检查逻辑:
|
|
5025
|
-
* - 如果 allowFrom 为空或未配置,拒绝所有
|
|
5026
|
-
* - 如果 allowFrom 包含 "*",允许所有
|
|
5027
|
-
* - 否则检查 senderId 是否在 allowFrom 列表中
|
|
5028
|
-
* @param senderId - 发送者ID
|
|
5029
|
-
* @returns 是否有权限
|
|
5030
|
-
*/
|
|
5031
|
-
isAllowed(senderId) {
|
|
5032
|
-
const allowList = this.config.allowFrom;
|
|
5033
|
-
if (!allowList || allowList.length === 0) {
|
|
5034
|
-
return false;
|
|
5035
|
-
}
|
|
5036
|
-
if (allowList.includes("*")) {
|
|
5037
|
-
return true;
|
|
5038
|
-
}
|
|
5039
|
-
return allowList.includes(senderId);
|
|
5040
|
-
}
|
|
5041
5048
|
/**
|
|
5042
5049
|
* 检查是否应该处理某类通知
|
|
5043
5050
|
* @param eventType - 事件类型 (session_start, session_end, permission_request, finished, error)
|
|
@@ -5244,6 +5251,20 @@ var TelegramChannel = class extends (_a = BaseChannel) {
|
|
|
5244
5251
|
this.formatter = new TelegramFormatter();
|
|
5245
5252
|
this.allowedUsers = new Set(telegramConfig.allowed_users || []);
|
|
5246
5253
|
}
|
|
5254
|
+
/**
|
|
5255
|
+
* 检查发送者是否有权限
|
|
5256
|
+
* @param senderId - 发送者ID
|
|
5257
|
+
* @returns 是否有权限
|
|
5258
|
+
*/
|
|
5259
|
+
isAllowed(senderId) {
|
|
5260
|
+
if (this.allowedUsers.size === 0) {
|
|
5261
|
+
return false;
|
|
5262
|
+
}
|
|
5263
|
+
if (this.allowedUsers.has("*")) {
|
|
5264
|
+
return true;
|
|
5265
|
+
}
|
|
5266
|
+
return this.allowedUsers.has(senderId);
|
|
5267
|
+
}
|
|
5247
5268
|
/**
|
|
5248
5269
|
* 启动 Channel
|
|
5249
5270
|
* 启动 Bot 并订阅权限申请事件
|
|
@@ -5519,6 +5540,12 @@ var LoggerChannel = class extends (_a2 = BaseChannel) {
|
|
|
5519
5540
|
super(config, bus, logger4);
|
|
5520
5541
|
this.messageLogger = getLogger().child({ channel: "logger" });
|
|
5521
5542
|
}
|
|
5543
|
+
/**
|
|
5544
|
+
* Logger Channel 不接收消息,拒绝所有发送者
|
|
5545
|
+
*/
|
|
5546
|
+
isAllowed(_senderId) {
|
|
5547
|
+
return false;
|
|
5548
|
+
}
|
|
5522
5549
|
async start() {
|
|
5523
5550
|
await super.start();
|
|
5524
5551
|
this.logger.info("Logger channel started");
|
|
@@ -5554,6 +5581,12 @@ var FeishuChannel = class extends (_a3 = BaseChannel) {
|
|
|
5554
5581
|
constructor(config, bus, logger4) {
|
|
5555
5582
|
super(config, bus, logger4);
|
|
5556
5583
|
}
|
|
5584
|
+
/**
|
|
5585
|
+
* Feishu Channel 骨架实现,暂不支持接收消息
|
|
5586
|
+
*/
|
|
5587
|
+
isAllowed(_senderId) {
|
|
5588
|
+
return false;
|
|
5589
|
+
}
|
|
5557
5590
|
async start() {
|
|
5558
5591
|
await super.start();
|
|
5559
5592
|
this.logger.info("Feishu channel started (skeleton)");
|
|
@@ -5588,6 +5621,16 @@ async function main() {
|
|
|
5588
5621
|
process.exit(1);
|
|
5589
5622
|
}
|
|
5590
5623
|
logger4.info(`Loaded hook token: ${hookToken.substring(0, 8)}...`);
|
|
5624
|
+
if (pidFilePath) {
|
|
5625
|
+
writePidFile(pidFilePath, {
|
|
5626
|
+
pid: process.pid,
|
|
5627
|
+
port,
|
|
5628
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
5629
|
+
version: VERSION3,
|
|
5630
|
+
token: hookToken
|
|
5631
|
+
});
|
|
5632
|
+
logger4.info(`PID file written to: ${pidFilePath}`);
|
|
5633
|
+
}
|
|
5591
5634
|
const httpServer = new HttpServer(port);
|
|
5592
5635
|
const wsServer = new WebSocketServer(httpServer, { path: "/ws" });
|
|
5593
5636
|
const sessionManager = new SessionManager();
|
|
@@ -5654,16 +5697,6 @@ async function main() {
|
|
|
5654
5697
|
const adapter = new ClaudeHookAdapter();
|
|
5655
5698
|
setupRoutes(httpServer, sessionManager, gateway, adapter, () => wsServer.getClientCount());
|
|
5656
5699
|
setupWebSocketHandlers(wsServer, sessionManager, { permissionQueue });
|
|
5657
|
-
if (pidFilePath) {
|
|
5658
|
-
writePidFile(pidFilePath, {
|
|
5659
|
-
pid: process.pid,
|
|
5660
|
-
port,
|
|
5661
|
-
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
5662
|
-
version: VERSION3,
|
|
5663
|
-
token: hookToken
|
|
5664
|
-
});
|
|
5665
|
-
logger4.info(`PID file written to: ${pidFilePath}`);
|
|
5666
|
-
}
|
|
5667
5700
|
const shutdown = async (signal) => {
|
|
5668
5701
|
logger4.info(`Received ${signal}, shutting down gracefully...`);
|
|
5669
5702
|
notificationHandler.stop();
|