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.
@@ -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();