@ebowwa/daemons 0.5.0 → 0.5.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 (79) hide show
  1. package/dist/agent.d.ts +37 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/bin/discord-cli.js +25 -60
  4. package/dist/bin/telegram-cli.js +25 -60
  5. package/dist/channels/base.d.ts +163 -0
  6. package/dist/channels/base.d.ts.map +1 -0
  7. package/dist/channels/discord.d.ts +61 -0
  8. package/dist/channels/discord.d.ts.map +1 -0
  9. package/dist/channels/index.d.ts +55 -0
  10. package/dist/channels/index.d.ts.map +1 -0
  11. package/dist/channels/telegram.d.ts +113 -0
  12. package/dist/channels/telegram.d.ts.map +1 -0
  13. package/dist/daemon.d.ts +119 -0
  14. package/dist/daemon.d.ts.map +1 -0
  15. package/dist/hooks.d.ts +34 -0
  16. package/dist/hooks.d.ts.map +1 -0
  17. package/dist/index.d.ts +24 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +25 -60
  20. package/dist/memory.d.ts +151 -0
  21. package/dist/memory.d.ts.map +1 -0
  22. package/dist/skills/coding/commit.d.ts +31 -0
  23. package/dist/skills/coding/commit.d.ts.map +1 -0
  24. package/dist/skills/coding/execute-subtask.d.ts +30 -0
  25. package/dist/skills/coding/execute-subtask.d.ts.map +1 -0
  26. package/dist/skills/coding/fix-issues.d.ts +29 -0
  27. package/dist/skills/coding/fix-issues.d.ts.map +1 -0
  28. package/dist/skills/coding/index.d.ts +21 -0
  29. package/dist/skills/coding/index.d.ts.map +1 -0
  30. package/dist/skills/coding/plan-task.d.ts +38 -0
  31. package/dist/skills/coding/plan-task.d.ts.map +1 -0
  32. package/dist/skills/coding/quality-check.d.ts +35 -0
  33. package/dist/skills/coding/quality-check.d.ts.map +1 -0
  34. package/dist/skills/index.d.ts +38 -0
  35. package/dist/skills/index.d.ts.map +1 -0
  36. package/dist/skills/registry.d.ts +95 -0
  37. package/dist/skills/registry.d.ts.map +1 -0
  38. package/dist/skills/shared/index.d.ts +16 -0
  39. package/dist/skills/shared/index.d.ts.map +1 -0
  40. package/dist/skills/shared/reflect.d.ts +42 -0
  41. package/dist/skills/shared/reflect.d.ts.map +1 -0
  42. package/dist/skills/shared/review.d.ts +42 -0
  43. package/dist/skills/shared/review.d.ts.map +1 -0
  44. package/dist/skills/shared/trajectory.d.ts +80 -0
  45. package/dist/skills/shared/trajectory.d.ts.map +1 -0
  46. package/dist/skills/trading/analyze-market.d.ts +43 -0
  47. package/dist/skills/trading/analyze-market.d.ts.map +1 -0
  48. package/dist/skills/trading/check-risk.d.ts +33 -0
  49. package/dist/skills/trading/check-risk.d.ts.map +1 -0
  50. package/dist/skills/trading/execute-trade.d.ts +38 -0
  51. package/dist/skills/trading/execute-trade.d.ts.map +1 -0
  52. package/dist/skills/trading/generate-signal.d.ts +57 -0
  53. package/dist/skills/trading/generate-signal.d.ts.map +1 -0
  54. package/dist/skills/trading/index.d.ts +21 -0
  55. package/dist/skills/trading/index.d.ts.map +1 -0
  56. package/dist/skills/trading/monitor-position.d.ts +37 -0
  57. package/dist/skills/trading/monitor-position.d.ts.map +1 -0
  58. package/dist/skills/types.d.ts +173 -0
  59. package/dist/skills/types.d.ts.map +1 -0
  60. package/dist/skills/workflows.d.ts +36 -0
  61. package/dist/skills/workflows.d.ts.map +1 -0
  62. package/dist/state.d.ts +31 -0
  63. package/dist/state.d.ts.map +1 -0
  64. package/dist/tools.d.ts +42 -0
  65. package/dist/tools.d.ts.map +1 -0
  66. package/dist/types.d.ts +281 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/workflow.d.ts +182 -0
  69. package/dist/workflow.d.ts.map +1 -0
  70. package/dist/workflows/coding.d.ts +79 -0
  71. package/dist/workflows/coding.d.ts.map +1 -0
  72. package/dist/workflows/index.d.ts +24 -0
  73. package/dist/workflows/index.d.ts.map +1 -0
  74. package/dist/workflows/trading.d.ts +72 -0
  75. package/dist/workflows/trading.d.ts.map +1 -0
  76. package/package.json +9 -2
  77. package/src/channels/base.ts +1 -0
  78. package/src/channels/telegram.ts +2 -1
  79. package/src/skills/shared/trajectory.ts +8 -1
@@ -0,0 +1,37 @@
1
+ /**
2
+ * GLM Agent - Individual GLM-powered agent
3
+ *
4
+ * Wraps GLM 4.7 API with tool access and hook integration.
5
+ */
6
+ import type { GLMAgentConfig, GLMToolResult } from "./types.js";
7
+ export declare class GLMAgent {
8
+ private config;
9
+ private client;
10
+ private tools;
11
+ constructor(config: GLMAgentConfig);
12
+ /**
13
+ * Execute a prompt and get response
14
+ */
15
+ execute(prompt: string, tools?: Record<string, unknown>): Promise<string>;
16
+ /**
17
+ * Execute a tool call
18
+ */
19
+ executeTool(toolName: string, args: unknown): Promise<GLMToolResult>;
20
+ /**
21
+ * Register a tool
22
+ */
23
+ registerTool(name: string, handler: (args: unknown) => Promise<unknown>): void;
24
+ /**
25
+ * Get available tools
26
+ */
27
+ getAvailableTools(): string[];
28
+ /**
29
+ * Get agent ID
30
+ */
31
+ get agentId(): string;
32
+ /**
33
+ * Get agent name
34
+ */
35
+ get name(): string;
36
+ }
37
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhE,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAA+D;gBAEhE,MAAM,EAAE,cAAc;IAKlC;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IA6B/E;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IA4B1E;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAI9E;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAI7B;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -118961,7 +118961,7 @@ var coerce = {
118961
118961
  date: (arg) => ZodDate.create({ ...arg, coerce: true })
118962
118962
  };
118963
118963
  var NEVER = INVALID;
118964
- // ../codespaces-types/runtime/ai.ts
118964
+ // ../codespaces-types/runtime/ai.js
118965
118965
  var ChatMessageRoleSchema = exports_external.enum(["system", "user", "assistant", "tool"]);
118966
118966
  var ToolCallSchema = exports_external.object({
118967
118967
  id: exports_external.string(),
@@ -119214,13 +119214,22 @@ class GLMNetworkError extends Error {
119214
119214
  function resolveApiKey(apiKey) {
119215
119215
  if (apiKey)
119216
119216
  return apiKey;
119217
+ const keysArray = process.env.Z_AI_API_KEYS || process.env.ZAI_API_KEYS;
119218
+ if (keysArray) {
119219
+ try {
119220
+ const keys = JSON.parse(keysArray);
119221
+ if (keys.length > 0) {
119222
+ return keys[0];
119223
+ }
119224
+ } catch {}
119225
+ }
119217
119226
  if (process.env.Z_AI_API_KEY)
119218
119227
  return process.env.Z_AI_API_KEY;
119219
119228
  if (process.env.ZAI_API_KEY)
119220
119229
  return process.env.ZAI_API_KEY;
119221
119230
  if (process.env.GLM_API_KEY)
119222
119231
  return process.env.GLM_API_KEY;
119223
- throw new Error("GLM API key not found. Set Z_AI_API_KEY, ZAI_API_KEY, or GLM_API_KEY environment variable.");
119232
+ throw new Error("GLM API key not found. Set Z_AI_API_KEYS (JSON array), Z_AI_API_KEY, ZAI_API_KEY, or GLM_API_KEY.");
119224
119233
  }
119225
119234
  function formatLatency(ms) {
119226
119235
  if (ms < 1000)
@@ -119889,7 +119898,7 @@ class ToolExecutor {
119889
119898
  content,
119890
119899
  iterations,
119891
119900
  toolCalls: allToolCalls,
119892
- toolResults,
119901
+ toolResults: Object.fromEntries(toolResults),
119893
119902
  rawResponse: response
119894
119903
  };
119895
119904
  }
@@ -120628,7 +120637,7 @@ var TrajectoryParams = exports_external2.discriminatedUnion("action", [
120628
120637
  primitiveId: exports_external2.string(),
120629
120638
  package: exports_external2.string(),
120630
120639
  version: exports_external2.string(),
120631
- inputs: exports_external2.record(exports_external2.unknown()),
120640
+ inputs: exports_external2.record(exports_external2.string(), exports_external2.unknown()),
120632
120641
  output: exports_external2.unknown(),
120633
120642
  durationNs: exports_external2.number(),
120634
120643
  verified: exports_external2.boolean(),
@@ -120678,6 +120687,12 @@ var trajectorySkill = {
120678
120687
  maxRetries: 1,
120679
120688
  async execute(params, context) {
120680
120689
  const memory2 = await getTrajectoryMemory();
120690
+ if (!params) {
120691
+ return {
120692
+ success: false,
120693
+ error: "No parameters provided"
120694
+ };
120695
+ }
120681
120696
  if (!memory2) {
120682
120697
  return {
120683
120698
  success: false,
@@ -122931,9 +122946,7 @@ class ConversationMemory {
122931
122946
  function registerStartCommand(bot, _memory, _tools) {
122932
122947
  bot.onText(/\/start/, async (msg) => {
122933
122948
  const chatId = msg.chat.id;
122934
- await bot.sendMessage(chatId, `\uD83D\uDC4B Hello! I'm GLM Daemon Telegram Bot.
122935
-
122936
- ` + `\uD83E\uDDE0 Powered by GLM-4.7 via Z.AI API
122949
+ await bot.sendMessage(chatId, `\uD83D\uDC4B Hello!
122937
122950
 
122938
122951
  ` + `Commands:
122939
122952
  ` + `/start - Show this message
@@ -122944,7 +122957,7 @@ function registerStartCommand(bot, _memory, _tools) {
122944
122957
  ` + `/clear - Clear conversation memory
122945
122958
  ` + `/help - Show help
122946
122959
 
122947
- ` + "Or just send any message for AI assistance!");
122960
+ ` + "Or just send any message for assistance!");
122948
122961
  });
122949
122962
  }
122950
122963
  // ../channel-telegram/dist/api/keys.js
@@ -122968,9 +122981,8 @@ function registerStatusCommand(bot, _memory, _tools) {
122968
122981
  bot.onText(/\/status/, async (msg) => {
122969
122982
  const chatId = msg.chat.id;
122970
122983
  const apiKey = getZAIKey();
122971
- await bot.sendMessage(chatId, `*Bot Status*
122984
+ await bot.sendMessage(chatId, `*API Status*
122972
122985
 
122973
- ` + `*AI:* GLM-4.7 via Z.AI
122974
122986
  ` + `*API:* ${apiKey ? "Connected" : "Disconnected"}`, { parse_mode: "Markdown" });
122975
122987
  });
122976
122988
  }
@@ -122978,9 +122990,7 @@ function registerStatusCommand(bot, _memory, _tools) {
122978
122990
  function registerHelpCommand(bot, _memory, _tools) {
122979
122991
  bot.onText(/\/help/, async (msg) => {
122980
122992
  const chatId = msg.chat.id;
122981
- await bot.sendMessage(chatId, `\uD83D\uDCDA *GLM Daemon Bot Help*
122982
-
122983
- ` + `\uD83E\uDDE0 Powered by GLM-4.7 via Z.AI API
122993
+ await bot.sendMessage(chatId, `\uD83D\uDCDA *Bot Help*
122984
122994
 
122985
122995
  ` + `*Commands:*
122986
122996
  ` + `/start - Show welcome message
@@ -122994,14 +123004,10 @@ function registerHelpCommand(bot, _memory, _tools) {
122994
123004
  ` + `/resources - Show system resources
122995
123005
  ` + `/logs [n] - Show last n log lines
122996
123006
  ` + `/toolsoutput [on|off] - Toggle tool output messages
122997
- ` + `/innerthoughts [msg] - Ask the inner monologue
122998
123007
  ` + `/help - Show this help
122999
123008
 
123000
123009
  ` + `*Usage:*
123001
- ` + `Just send any message and I\\'ll respond with AI assistance!
123002
-
123003
- ` + `*Mentions:*
123004
- ` + "@innerthoughts in any message triggers the inner monologue.", { parse_mode: "Markdown" });
123010
+ ` + "Just send any message for assistance!", { parse_mode: "Markdown" });
123005
123011
  });
123006
123012
  }
123007
123013
  // ../channel-telegram/dist/commands/git.js
@@ -123369,47 +123375,6 @@ Tool logging is already enabled.`;
123369
123375
  }
123370
123376
  });
123371
123377
  }
123372
- // ../channel-telegram/dist/commands/innerthoughts.js
123373
- var MONOLOGUE_URL = process.env.MONOLOGUE_URL || "http://localhost:8920";
123374
- async function askMonologue(question) {
123375
- try {
123376
- const res = await fetch(`${MONOLOGUE_URL}/ask`, {
123377
- method: "POST",
123378
- headers: { "Content-Type": "application/json" },
123379
- body: JSON.stringify({ question })
123380
- });
123381
- if (!res.ok) {
123382
- return `Monologue error: ${res.status}`;
123383
- }
123384
- const data = await res.json();
123385
- let thought = data.thought || "...";
123386
- thought = thought.replace(/[*_\[\]]/g, "").replace(/\n+/g, " ").trim().slice(0, 400);
123387
- return thought;
123388
- } catch (error48) {
123389
- return `Could not reach inner monologue: ${error48.message}`;
123390
- }
123391
- }
123392
- function registerInnerthoughtsCommand(bot, _memory, _tools) {
123393
- bot.onText(/\/innerthoughts(?:\s+(.+))?/, async (msg, match) => {
123394
- const chatId = msg.chat.id;
123395
- const question = match?.[1]?.trim() || "What are you thinking about?";
123396
- bot.sendChatAction(chatId, "typing");
123397
- const thought = await askMonologue(question);
123398
- await bot.sendMessage(chatId, `\uD83D\uDCAD *Inner Monologue*
123399
-
123400
- _${thought}_`, { parse_mode: "Markdown" });
123401
- });
123402
- bot.on("text", async (msg) => {
123403
- const text = msg.text || "";
123404
- if (text.toLowerCase().includes("@innerthoughts")) {
123405
- const chatId = msg.chat.id;
123406
- const question = text.replace(/@innerthoughts/gi, "").trim() || "Hello?";
123407
- bot.sendChatAction(chatId, "typing");
123408
- const thought = await askMonologue(question);
123409
- await bot.sendMessage(chatId, `\uD83D\uDCAD _${thought}_`, { parse_mode: "Markdown" });
123410
- }
123411
- });
123412
- }
123413
123378
  // ../channel-telegram/dist/commands/restart.js
123414
123379
  import { execSync as execSync7 } from "child_process";
123415
123380
  function register(bot, tools) {
@@ -123453,7 +123418,6 @@ function registerAllCommands(bot, memory2, tools) {
123453
123418
  registerResumeCommand(bot, memory2, tools);
123454
123419
  registerQuietCommand(bot, memory2, tools);
123455
123420
  registerVerboseCommand(bot, memory2, tools);
123456
- registerInnerthoughtsCommand(bot, memory2, tools);
123457
123421
  register(bot, tools);
123458
123422
  }
123459
123423
  // ../channel-telegram/dist/utils/normalize.js
@@ -123720,6 +123684,7 @@ class TelegramChannel {
123720
123684
  { command: "logs", description: "View recent logs" },
123721
123685
  { command: "clear", description: "Clear conversation history" },
123722
123686
  { command: "tools", description: "List available tools" },
123687
+ { command: "resources", description: "Show system resources" },
123723
123688
  { command: "restart", description: "Restart the bot service" },
123724
123689
  { command: "cancel", description: "Stop current task" },
123725
123690
  { command: "quiet", description: "Hide tool logging" },
@@ -118961,7 +118961,7 @@ var coerce = {
118961
118961
  date: (arg) => ZodDate.create({ ...arg, coerce: true })
118962
118962
  };
118963
118963
  var NEVER = INVALID;
118964
- // ../codespaces-types/runtime/ai.ts
118964
+ // ../codespaces-types/runtime/ai.js
118965
118965
  var ChatMessageRoleSchema = exports_external.enum(["system", "user", "assistant", "tool"]);
118966
118966
  var ToolCallSchema = exports_external.object({
118967
118967
  id: exports_external.string(),
@@ -119214,13 +119214,22 @@ class GLMNetworkError extends Error {
119214
119214
  function resolveApiKey(apiKey) {
119215
119215
  if (apiKey)
119216
119216
  return apiKey;
119217
+ const keysArray = process.env.Z_AI_API_KEYS || process.env.ZAI_API_KEYS;
119218
+ if (keysArray) {
119219
+ try {
119220
+ const keys = JSON.parse(keysArray);
119221
+ if (keys.length > 0) {
119222
+ return keys[0];
119223
+ }
119224
+ } catch {}
119225
+ }
119217
119226
  if (process.env.Z_AI_API_KEY)
119218
119227
  return process.env.Z_AI_API_KEY;
119219
119228
  if (process.env.ZAI_API_KEY)
119220
119229
  return process.env.ZAI_API_KEY;
119221
119230
  if (process.env.GLM_API_KEY)
119222
119231
  return process.env.GLM_API_KEY;
119223
- throw new Error("GLM API key not found. Set Z_AI_API_KEY, ZAI_API_KEY, or GLM_API_KEY environment variable.");
119232
+ throw new Error("GLM API key not found. Set Z_AI_API_KEYS (JSON array), Z_AI_API_KEY, ZAI_API_KEY, or GLM_API_KEY.");
119224
119233
  }
119225
119234
  function formatLatency(ms) {
119226
119235
  if (ms < 1000)
@@ -119889,7 +119898,7 @@ class ToolExecutor {
119889
119898
  content,
119890
119899
  iterations,
119891
119900
  toolCalls: allToolCalls,
119892
- toolResults,
119901
+ toolResults: Object.fromEntries(toolResults),
119893
119902
  rawResponse: response
119894
119903
  };
119895
119904
  }
@@ -120628,7 +120637,7 @@ var TrajectoryParams = exports_external2.discriminatedUnion("action", [
120628
120637
  primitiveId: exports_external2.string(),
120629
120638
  package: exports_external2.string(),
120630
120639
  version: exports_external2.string(),
120631
- inputs: exports_external2.record(exports_external2.unknown()),
120640
+ inputs: exports_external2.record(exports_external2.string(), exports_external2.unknown()),
120632
120641
  output: exports_external2.unknown(),
120633
120642
  durationNs: exports_external2.number(),
120634
120643
  verified: exports_external2.boolean(),
@@ -120678,6 +120687,12 @@ var trajectorySkill = {
120678
120687
  maxRetries: 1,
120679
120688
  async execute(params, context) {
120680
120689
  const memory2 = await getTrajectoryMemory();
120690
+ if (!params) {
120691
+ return {
120692
+ success: false,
120693
+ error: "No parameters provided"
120694
+ };
120695
+ }
120681
120696
  if (!memory2) {
120682
120697
  return {
120683
120698
  success: false,
@@ -122931,9 +122946,7 @@ class ConversationMemory {
122931
122946
  function registerStartCommand(bot, _memory, _tools) {
122932
122947
  bot.onText(/\/start/, async (msg) => {
122933
122948
  const chatId = msg.chat.id;
122934
- await bot.sendMessage(chatId, `\uD83D\uDC4B Hello! I'm GLM Daemon Telegram Bot.
122935
-
122936
- ` + `\uD83E\uDDE0 Powered by GLM-4.7 via Z.AI API
122949
+ await bot.sendMessage(chatId, `\uD83D\uDC4B Hello!
122937
122950
 
122938
122951
  ` + `Commands:
122939
122952
  ` + `/start - Show this message
@@ -122944,7 +122957,7 @@ function registerStartCommand(bot, _memory, _tools) {
122944
122957
  ` + `/clear - Clear conversation memory
122945
122958
  ` + `/help - Show help
122946
122959
 
122947
- ` + "Or just send any message for AI assistance!");
122960
+ ` + "Or just send any message for assistance!");
122948
122961
  });
122949
122962
  }
122950
122963
  // ../channel-telegram/dist/api/keys.js
@@ -122968,9 +122981,8 @@ function registerStatusCommand(bot, _memory, _tools) {
122968
122981
  bot.onText(/\/status/, async (msg) => {
122969
122982
  const chatId = msg.chat.id;
122970
122983
  const apiKey = getZAIKey();
122971
- await bot.sendMessage(chatId, `*Bot Status*
122984
+ await bot.sendMessage(chatId, `*API Status*
122972
122985
 
122973
- ` + `*AI:* GLM-4.7 via Z.AI
122974
122986
  ` + `*API:* ${apiKey ? "Connected" : "Disconnected"}`, { parse_mode: "Markdown" });
122975
122987
  });
122976
122988
  }
@@ -122978,9 +122990,7 @@ function registerStatusCommand(bot, _memory, _tools) {
122978
122990
  function registerHelpCommand(bot, _memory, _tools) {
122979
122991
  bot.onText(/\/help/, async (msg) => {
122980
122992
  const chatId = msg.chat.id;
122981
- await bot.sendMessage(chatId, `\uD83D\uDCDA *GLM Daemon Bot Help*
122982
-
122983
- ` + `\uD83E\uDDE0 Powered by GLM-4.7 via Z.AI API
122993
+ await bot.sendMessage(chatId, `\uD83D\uDCDA *Bot Help*
122984
122994
 
122985
122995
  ` + `*Commands:*
122986
122996
  ` + `/start - Show welcome message
@@ -122994,14 +123004,10 @@ function registerHelpCommand(bot, _memory, _tools) {
122994
123004
  ` + `/resources - Show system resources
122995
123005
  ` + `/logs [n] - Show last n log lines
122996
123006
  ` + `/toolsoutput [on|off] - Toggle tool output messages
122997
- ` + `/innerthoughts [msg] - Ask the inner monologue
122998
123007
  ` + `/help - Show this help
122999
123008
 
123000
123009
  ` + `*Usage:*
123001
- ` + `Just send any message and I\\'ll respond with AI assistance!
123002
-
123003
- ` + `*Mentions:*
123004
- ` + "@innerthoughts in any message triggers the inner monologue.", { parse_mode: "Markdown" });
123010
+ ` + "Just send any message for assistance!", { parse_mode: "Markdown" });
123005
123011
  });
123006
123012
  }
123007
123013
  // ../channel-telegram/dist/commands/git.js
@@ -123369,47 +123375,6 @@ Tool logging is already enabled.`;
123369
123375
  }
123370
123376
  });
123371
123377
  }
123372
- // ../channel-telegram/dist/commands/innerthoughts.js
123373
- var MONOLOGUE_URL = process.env.MONOLOGUE_URL || "http://localhost:8920";
123374
- async function askMonologue(question) {
123375
- try {
123376
- const res = await fetch(`${MONOLOGUE_URL}/ask`, {
123377
- method: "POST",
123378
- headers: { "Content-Type": "application/json" },
123379
- body: JSON.stringify({ question })
123380
- });
123381
- if (!res.ok) {
123382
- return `Monologue error: ${res.status}`;
123383
- }
123384
- const data = await res.json();
123385
- let thought = data.thought || "...";
123386
- thought = thought.replace(/[*_\[\]]/g, "").replace(/\n+/g, " ").trim().slice(0, 400);
123387
- return thought;
123388
- } catch (error48) {
123389
- return `Could not reach inner monologue: ${error48.message}`;
123390
- }
123391
- }
123392
- function registerInnerthoughtsCommand(bot, _memory, _tools) {
123393
- bot.onText(/\/innerthoughts(?:\s+(.+))?/, async (msg, match) => {
123394
- const chatId = msg.chat.id;
123395
- const question = match?.[1]?.trim() || "What are you thinking about?";
123396
- bot.sendChatAction(chatId, "typing");
123397
- const thought = await askMonologue(question);
123398
- await bot.sendMessage(chatId, `\uD83D\uDCAD *Inner Monologue*
123399
-
123400
- _${thought}_`, { parse_mode: "Markdown" });
123401
- });
123402
- bot.on("text", async (msg) => {
123403
- const text = msg.text || "";
123404
- if (text.toLowerCase().includes("@innerthoughts")) {
123405
- const chatId = msg.chat.id;
123406
- const question = text.replace(/@innerthoughts/gi, "").trim() || "Hello?";
123407
- bot.sendChatAction(chatId, "typing");
123408
- const thought = await askMonologue(question);
123409
- await bot.sendMessage(chatId, `\uD83D\uDCAD _${thought}_`, { parse_mode: "Markdown" });
123410
- }
123411
- });
123412
- }
123413
123378
  // ../channel-telegram/dist/commands/restart.js
123414
123379
  import { execSync as execSync7 } from "child_process";
123415
123380
  function register(bot, tools) {
@@ -123453,7 +123418,6 @@ function registerAllCommands(bot, memory2, tools) {
123453
123418
  registerResumeCommand(bot, memory2, tools);
123454
123419
  registerQuietCommand(bot, memory2, tools);
123455
123420
  registerVerboseCommand(bot, memory2, tools);
123456
- registerInnerthoughtsCommand(bot, memory2, tools);
123457
123421
  register(bot, tools);
123458
123422
  }
123459
123423
  // ../channel-telegram/dist/utils/normalize.js
@@ -123720,6 +123684,7 @@ class TelegramChannel {
123720
123684
  { command: "logs", description: "View recent logs" },
123721
123685
  { command: "clear", description: "Clear conversation history" },
123722
123686
  { command: "tools", description: "List available tools" },
123687
+ { command: "resources", description: "Show system resources" },
123723
123688
  { command: "restart", description: "Restart the bot service" },
123724
123689
  { command: "cancel", description: "Stop current task" },
123725
123690
  { command: "quiet", description: "Hide tool logging" },
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Base Channel - Implements ChannelConnector from @ebowwa/channel-types
3
+ *
4
+ * Abstract base class for all communication channels (Telegram, Discord, etc.)
5
+ * Provides shared functionality for message routing, error handling, and conversation management.
6
+ */
7
+ import { type ChannelConnector, type ChannelId, type ChannelMessage, type ChannelResponse, type ChannelCapabilities, type MessageHandler, type StreamChunk } from "@ebowwa/channel-types";
8
+ import { GLMClient } from "@ebowwa/ai";
9
+ import { GLMDaemon } from "../daemon.js";
10
+ export interface GLMChannelConfig {
11
+ /** Platform identifier */
12
+ platform: "telegram" | "discord" | "whatsapp" | "cli";
13
+ /** Account/bot ID */
14
+ accountId: string;
15
+ /** Instance ID for multiple instances */
16
+ instanceId?: string;
17
+ /** Butler storage directory */
18
+ butlerStorageDir?: string;
19
+ /** Working directory for daemon tasks */
20
+ daemonWorkdir?: string;
21
+ /** Base branch for daemon */
22
+ daemonBaseBranch?: string;
23
+ /** Auto-PR on completion */
24
+ enableDaemonAutoPR?: boolean;
25
+ /** Auto-commit during work */
26
+ enableDaemonAutoCommit?: boolean;
27
+ }
28
+ export interface MessageContext {
29
+ userId: string;
30
+ userName?: string;
31
+ channelId?: string;
32
+ timestamp: Date;
33
+ }
34
+ export interface RouteResult {
35
+ source: "butler" | "daemon" | "error";
36
+ response: string;
37
+ metadata?: {
38
+ daemonId?: string;
39
+ phase?: string;
40
+ executionTime?: number;
41
+ toolIterations?: number;
42
+ };
43
+ }
44
+ export interface MessageClassification {
45
+ type: "chat" | "task" | "status" | "unknown";
46
+ confidence: number;
47
+ suggestedAction: "handle_locally" | "delegate_daemon" | "both";
48
+ }
49
+ export type BaseChannelConfig = GLMChannelConfig;
50
+ /**
51
+ * Abstract base class for communication channels.
52
+ * Implements ChannelConnector from @ebowwa/channel-types.
53
+ */
54
+ export declare abstract class BaseChannel implements ChannelConnector {
55
+ abstract readonly id: ChannelId;
56
+ abstract readonly label: string;
57
+ abstract readonly capabilities: ChannelCapabilities;
58
+ protected glmClient: GLMClient;
59
+ protected daemon: GLMDaemon | null;
60
+ protected activeDaemonTask: string | null;
61
+ protected config: GLMChannelConfig;
62
+ protected conversationHistory: Map<string, Array<{
63
+ role: string;
64
+ content: string;
65
+ }>>;
66
+ protected messageHandler?: MessageHandler;
67
+ protected connected: boolean;
68
+ constructor(config: GLMChannelConfig);
69
+ /**
70
+ * Start the channel
71
+ */
72
+ start(): Promise<void>;
73
+ /**
74
+ * Stop the channel
75
+ */
76
+ stop(): Promise<void>;
77
+ /**
78
+ * Register message handler (from ChannelConnector interface)
79
+ */
80
+ onMessage(handler: MessageHandler): void;
81
+ /**
82
+ * Send response (from ChannelConnector interface)
83
+ * Must be implemented by subclasses for platform-specific delivery
84
+ */
85
+ abstract send(response: ChannelResponse): Promise<void>;
86
+ /**
87
+ * Optional streaming support
88
+ */
89
+ stream?(response: ChannelResponse, chunks: AsyncIterable<StreamChunk>): Promise<void>;
90
+ /**
91
+ * Check if connected
92
+ */
93
+ isConnected(): boolean;
94
+ /**
95
+ * Start the platform-specific bot (must be implemented by subclasses)
96
+ */
97
+ protected abstract startPlatform(): Promise<void>;
98
+ /**
99
+ * Stop the platform-specific bot (must be implemented by subclasses)
100
+ */
101
+ protected abstract stopPlatform(): Promise<void>;
102
+ /**
103
+ * Route a ChannelMessage through the internal handler or use default routing.
104
+ * This bridges ChannelMessage (from channel-types) to the internal routing logic.
105
+ */
106
+ routeChannelMessage(message: ChannelMessage): Promise<ChannelResponse>;
107
+ /**
108
+ * Route a message to appropriate handler (internal routing logic)
109
+ */
110
+ routeMessage(content: string, context: MessageContext): Promise<RouteResult>;
111
+ /**
112
+ * Convert internal RouteResult to ChannelResponse
113
+ */
114
+ protected resultToResponse(result: RouteResult, originalMessage: ChannelMessage): ChannelResponse;
115
+ /**
116
+ * Classify incoming message
117
+ */
118
+ protected classifyMessage(content: string): Promise<MessageClassification>;
119
+ /**
120
+ * Handle chat messages locally with GLM + tools
121
+ *
122
+ * Uses ToolExecutor from @ebowwa/ai/tools for the tool call loop.
123
+ * Refactored from manual tool loop on Feb 15, 2026.
124
+ */
125
+ protected handleChat(content: string, context: MessageContext): Promise<RouteResult>;
126
+ /**
127
+ * Handle task messages by delegating to GLMDaemon
128
+ */
129
+ protected handleTask(content: string, context: MessageContext): Promise<RouteResult>;
130
+ /**
131
+ * Handle status queries
132
+ */
133
+ protected handleStatus(): Promise<RouteResult>;
134
+ /**
135
+ * Handle unknown messages - ask for clarification
136
+ */
137
+ protected handleUnknown(content: string): Promise<RouteResult>;
138
+ /**
139
+ * Add message to conversation history
140
+ */
141
+ protected addToHistory(userId: string, message: {
142
+ role: string;
143
+ content: string;
144
+ }): void;
145
+ /**
146
+ * Get current status
147
+ */
148
+ getStatus(): {
149
+ hasActiveDaemon: boolean;
150
+ activeTask: string | null;
151
+ conversationCount: number;
152
+ daemonPhase: string | null;
153
+ };
154
+ /**
155
+ * Cleanup resources
156
+ */
157
+ cleanup(): Promise<void>;
158
+ /**
159
+ * Helper to create ChannelId for this channel
160
+ */
161
+ protected createId(): ChannelId;
162
+ }
163
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/channels/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Discord Channel Adapter
3
+ *
4
+ * Implements ChannelConnector from @ebowwa/channel-types.
5
+ * Discord bot using discord.js.
6
+ */
7
+ import { type ChannelId, type ChannelResponse, type ChannelCapabilities } from "@ebowwa/channel-types";
8
+ import { BaseChannel, type GLMChannelConfig } from "./base.js";
9
+ export interface DiscordChannelConfig extends GLMChannelConfig {
10
+ platform: "discord";
11
+ /** Bot token */
12
+ botToken: string;
13
+ /** Application ID for slash commands */
14
+ applicationId?: string;
15
+ /** Guild ID to restrict to */
16
+ guildId?: string;
17
+ /** Channel IDs to listen to (empty = all) */
18
+ channelIds?: string[];
19
+ /** Enable slash commands */
20
+ enableSlashCommands?: boolean;
21
+ }
22
+ export type { DiscordChannelConfig as DiscordConfig };
23
+ export declare class DiscordChannel extends BaseChannel {
24
+ readonly id: ChannelId;
25
+ readonly label = "Discord";
26
+ readonly capabilities: ChannelCapabilities;
27
+ private client;
28
+ private token;
29
+ private guildId?;
30
+ private channelIds?;
31
+ constructor(config: DiscordChannelConfig);
32
+ /**
33
+ * Send response to Discord
34
+ */
35
+ send(response: ChannelResponse): Promise<void>;
36
+ /**
37
+ * Start Discord bot
38
+ */
39
+ protected startPlatform(): Promise<void>;
40
+ /**
41
+ * Stop Discord bot
42
+ */
43
+ protected stopPlatform(): Promise<void>;
44
+ /**
45
+ * Create normalized ChannelMessage from Discord message
46
+ */
47
+ private createChannelMessage;
48
+ /**
49
+ * Send response, handling chunking for long messages
50
+ */
51
+ private sendResponse;
52
+ }
53
+ /**
54
+ * Create a Discord channel from config
55
+ */
56
+ export declare function createDiscordChannel(config: DiscordChannelConfig): DiscordChannel;
57
+ /**
58
+ * Create Discord channel config from environment (Doppler)
59
+ */
60
+ export declare function createDiscordConfigFromEnv(): DiscordChannelConfig | null;
61
+ //# sourceMappingURL=discord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../src/channels/discord.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,eAAe,EACpB,KAAK,mBAAmB,EAIzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EAEtB,MAAM,WAAW,CAAC;AAMnB,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,QAAQ,EAAE,SAAS,CAAC;IACpB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAGD,YAAY,EAAE,oBAAoB,IAAI,aAAa,EAAE,CAAC;AAMtD,qBAAa,cAAe,SAAQ,WAAW;IAC7C,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,KAAK,aAAa;IAC3B,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAkBxC;IAEF,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,UAAU,CAAC,CAAW;gBAElB,MAAM,EAAE,oBAAoB;IAmBxC;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BpD;;OAEG;cACa,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD9C;;OAEG;cACa,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAS7C;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA0D5B;;OAEG;YACW,YAAY;CAY3B;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAEjF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,oBAAoB,GAAG,IAAI,CAwBxE"}