agentdial 1.0.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 (97) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +310 -0
  4. package/dist/adapters/discord.d.ts +24 -0
  5. package/dist/adapters/discord.d.ts.map +1 -0
  6. package/dist/adapters/discord.js +129 -0
  7. package/dist/adapters/discord.js.map +1 -0
  8. package/dist/adapters/email.d.ts +38 -0
  9. package/dist/adapters/email.d.ts.map +1 -0
  10. package/dist/adapters/email.js +187 -0
  11. package/dist/adapters/email.js.map +1 -0
  12. package/dist/adapters/index.d.ts +12 -0
  13. package/dist/adapters/index.d.ts.map +1 -0
  14. package/dist/adapters/index.js +36 -0
  15. package/dist/adapters/index.js.map +1 -0
  16. package/dist/adapters/slack.d.ts +27 -0
  17. package/dist/adapters/slack.d.ts.map +1 -0
  18. package/dist/adapters/slack.js +173 -0
  19. package/dist/adapters/slack.js.map +1 -0
  20. package/dist/adapters/telegram.d.ts +28 -0
  21. package/dist/adapters/telegram.d.ts.map +1 -0
  22. package/dist/adapters/telegram.js +155 -0
  23. package/dist/adapters/telegram.js.map +1 -0
  24. package/dist/adapters/twilio-sms.d.ts +36 -0
  25. package/dist/adapters/twilio-sms.d.ts.map +1 -0
  26. package/dist/adapters/twilio-sms.js +187 -0
  27. package/dist/adapters/twilio-sms.js.map +1 -0
  28. package/dist/adapters/twilio-whatsapp.d.ts +37 -0
  29. package/dist/adapters/twilio-whatsapp.d.ts.map +1 -0
  30. package/dist/adapters/twilio-whatsapp.js +188 -0
  31. package/dist/adapters/twilio-whatsapp.js.map +1 -0
  32. package/dist/adapters/types.d.ts +349 -0
  33. package/dist/adapters/types.d.ts.map +1 -0
  34. package/dist/adapters/types.js +82 -0
  35. package/dist/adapters/types.js.map +1 -0
  36. package/dist/adapters/voice.d.ts +54 -0
  37. package/dist/adapters/voice.d.ts.map +1 -0
  38. package/dist/adapters/voice.js +250 -0
  39. package/dist/adapters/voice.js.map +1 -0
  40. package/dist/commands/channels.d.ts +5 -0
  41. package/dist/commands/channels.d.ts.map +1 -0
  42. package/dist/commands/channels.js +188 -0
  43. package/dist/commands/channels.js.map +1 -0
  44. package/dist/commands/mcp-serve.d.ts +14 -0
  45. package/dist/commands/mcp-serve.d.ts.map +1 -0
  46. package/dist/commands/mcp-serve.js +479 -0
  47. package/dist/commands/mcp-serve.js.map +1 -0
  48. package/dist/commands/serve.d.ts +6 -0
  49. package/dist/commands/serve.d.ts.map +1 -0
  50. package/dist/commands/serve.js +128 -0
  51. package/dist/commands/serve.js.map +1 -0
  52. package/dist/commands/setup.d.ts +4 -0
  53. package/dist/commands/setup.d.ts.map +1 -0
  54. package/dist/commands/setup.js +174 -0
  55. package/dist/commands/setup.js.map +1 -0
  56. package/dist/commands/status.d.ts +4 -0
  57. package/dist/commands/status.d.ts.map +1 -0
  58. package/dist/commands/status.js +86 -0
  59. package/dist/commands/status.js.map +1 -0
  60. package/dist/commands/test.d.ts +5 -0
  61. package/dist/commands/test.d.ts.map +1 -0
  62. package/dist/commands/test.js +48 -0
  63. package/dist/commands/test.js.map +1 -0
  64. package/dist/commands/voice.d.ts +6 -0
  65. package/dist/commands/voice.d.ts.map +1 -0
  66. package/dist/commands/voice.js +192 -0
  67. package/dist/commands/voice.js.map +1 -0
  68. package/dist/index.d.ts +3 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +119 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/lib/config.d.ts +7 -0
  73. package/dist/lib/config.d.ts.map +1 -0
  74. package/dist/lib/config.js +36 -0
  75. package/dist/lib/config.js.map +1 -0
  76. package/dist/lib/constants.d.ts +13 -0
  77. package/dist/lib/constants.d.ts.map +1 -0
  78. package/dist/lib/constants.js +52 -0
  79. package/dist/lib/constants.js.map +1 -0
  80. package/dist/lib/credentials.d.ts +7 -0
  81. package/dist/lib/credentials.d.ts.map +1 -0
  82. package/dist/lib/credentials.js +61 -0
  83. package/dist/lib/credentials.js.map +1 -0
  84. package/dist/lib/gateway.d.ts +27 -0
  85. package/dist/lib/gateway.d.ts.map +1 -0
  86. package/dist/lib/gateway.js +103 -0
  87. package/dist/lib/gateway.js.map +1 -0
  88. package/dist/lib/identity.d.ts +5 -0
  89. package/dist/lib/identity.d.ts.map +1 -0
  90. package/dist/lib/identity.js +36 -0
  91. package/dist/lib/identity.js.map +1 -0
  92. package/dist/lib/ui.d.ts +12 -0
  93. package/dist/lib/ui.d.ts.map +1 -0
  94. package/dist/lib/ui.js +91 -0
  95. package/dist/lib/ui.js.map +1 -0
  96. package/package.json +95 -0
  97. package/templates/IDENTITY.md +59 -0
package/dist/index.js ADDED
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { VERSION } from "./lib/constants.js";
4
+ import { banner } from "./lib/ui.js";
5
+ const program = new Command();
6
+ program
7
+ .name("agentdial")
8
+ .description("Dial your AI agent into every platform. One identity. Every channel.")
9
+ .version(VERSION)
10
+ .hook("preAction", (thisCommand) => {
11
+ if (thisCommand.args.length === 0 && !thisCommand.parent) {
12
+ banner();
13
+ }
14
+ });
15
+ // ── Setup ──
16
+ program
17
+ .command("setup")
18
+ .description("Interactive setup wizard — configure identity and channels")
19
+ .option("-f, --file <path>", "Path to IDENTITY.md file")
20
+ .action(async (opts) => {
21
+ const { cmdSetup } = await import("./commands/setup.js");
22
+ await cmdSetup(opts);
23
+ });
24
+ // ── Channels ──
25
+ const channels = program
26
+ .command("channels")
27
+ .description("Manage communication channels");
28
+ channels
29
+ .command("add <channel>")
30
+ .description("Add and configure a channel (telegram, discord, slack, ...)")
31
+ .action(async (channel) => {
32
+ const { cmdChannelAdd } = await import("./commands/channels.js");
33
+ await cmdChannelAdd(channel);
34
+ });
35
+ channels
36
+ .command("remove <channel>")
37
+ .description("Remove a channel configuration")
38
+ .action(async (channel) => {
39
+ const { cmdChannelRemove } = await import("./commands/channels.js");
40
+ await cmdChannelRemove(channel);
41
+ });
42
+ channels
43
+ .command("list")
44
+ .description("List all configured channels and their status")
45
+ .action(async () => {
46
+ const { cmdChannelList } = await import("./commands/channels.js");
47
+ await cmdChannelList();
48
+ });
49
+ channels
50
+ .command("test [channel]")
51
+ .description("Test a channel connection (or all channels)")
52
+ .action(async (channel) => {
53
+ const { cmdChannelTest } = await import("./commands/channels.js");
54
+ await cmdChannelTest(channel);
55
+ });
56
+ // ── Voice ──
57
+ const voice = program
58
+ .command("voice")
59
+ .description("Voice channel management (Twilio)");
60
+ voice
61
+ .command("setup")
62
+ .description("Configure voice channel with Twilio credentials")
63
+ .action(async () => {
64
+ const { cmdVoiceSetup } = await import("./commands/voice.js");
65
+ await cmdVoiceSetup();
66
+ });
67
+ voice
68
+ .command("test")
69
+ .description("Test voice channel with a test call")
70
+ .option("-n, --number <phone>", "Phone number to test")
71
+ .action(async (opts) => {
72
+ const { cmdVoiceTest } = await import("./commands/voice.js");
73
+ await cmdVoiceTest(opts);
74
+ });
75
+ // ── Status ──
76
+ program
77
+ .command("status")
78
+ .description("Show status of all channels and the gateway")
79
+ .option("-j, --json", "Output as JSON")
80
+ .action(async (opts) => {
81
+ const { cmdStatus } = await import("./commands/status.js");
82
+ await cmdStatus(opts);
83
+ });
84
+ // ── Test ──
85
+ program
86
+ .command("test")
87
+ .description("Send a test message through the gateway")
88
+ .option("-c, --channel <channel>", "Channel to test through")
89
+ .option("-m, --message <text>", "Test message text", "Hello from agentdial!")
90
+ .action(async (opts) => {
91
+ const { cmdTest } = await import("./commands/test.js");
92
+ await cmdTest(opts);
93
+ });
94
+ // ── Serve ──
95
+ program
96
+ .command("serve")
97
+ .description("Start the agentdial gateway server")
98
+ .option("-p, --port <port>", "Gateway port", "3141")
99
+ .option("-a, --agent-url <url>", "Agent backend URL")
100
+ .option("-f, --file <path>", "Path to IDENTITY.md file")
101
+ .action(async (opts) => {
102
+ const { cmdServe } = await import("./commands/serve.js");
103
+ await cmdServe(opts);
104
+ });
105
+ // ── MCP Serve ──
106
+ program
107
+ .command("mcp-serve")
108
+ .description("Start as an MCP server for Claude Code integration")
109
+ .action(async () => {
110
+ const { cmdMcpServe } = await import("./commands/mcp-serve.js");
111
+ await cmdMcpServe();
112
+ });
113
+ // ── Default action (show help with banner) ──
114
+ program.action(() => {
115
+ banner();
116
+ program.help();
117
+ });
118
+ program.parse();
119
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AgentDialConfig } from "../adapters/types.js";
2
+ export declare function ensureConfigDir(): Promise<void>;
3
+ export declare function getConfigPath(): string;
4
+ export declare function loadConfig(): Promise<AgentDialConfig>;
5
+ export declare function saveConfig(config: AgentDialConfig): Promise<void>;
6
+ export declare function updateConfig(updates: Partial<AgentDialConfig>): Promise<AgentDialConfig>;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC,CAY3D;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvE;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC,CAM1B"}
@@ -0,0 +1,36 @@
1
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import { CONFIG_DIR, CONFIG_FILE } from "./constants.js";
4
+ import { AgentDialConfigSchema } from "../adapters/types.js";
5
+ export async function ensureConfigDir() {
6
+ if (!existsSync(CONFIG_DIR)) {
7
+ await mkdir(CONFIG_DIR, { recursive: true });
8
+ }
9
+ }
10
+ export function getConfigPath() {
11
+ return CONFIG_FILE;
12
+ }
13
+ export async function loadConfig() {
14
+ await ensureConfigDir();
15
+ if (!existsSync(CONFIG_FILE)) {
16
+ const defaults = AgentDialConfigSchema.parse({});
17
+ await saveConfig(defaults);
18
+ return defaults;
19
+ }
20
+ const raw = await readFile(CONFIG_FILE, "utf-8");
21
+ const parsed = JSON.parse(raw);
22
+ return AgentDialConfigSchema.parse(parsed);
23
+ }
24
+ export async function saveConfig(config) {
25
+ await ensureConfigDir();
26
+ const json = JSON.stringify(config, null, 2);
27
+ await writeFile(CONFIG_FILE, json + "\n", "utf-8");
28
+ }
29
+ export async function updateConfig(updates) {
30
+ const current = await loadConfig();
31
+ const merged = { ...current, ...updates };
32
+ const validated = AgentDialConfigSchema.parse(merged);
33
+ await saveConfig(validated);
34
+ return validated;
35
+ }
36
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,eAAe,EAAE,CAAC;IAExB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IAC1C,OAAO,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAuB;IACtD,MAAM,eAAe,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAiC;IAEjC,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IAC1C,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare const VERSION = "1.0.0";
2
+ export declare const CONFIG_DIR: string;
3
+ export declare const CONFIG_FILE: string;
4
+ export declare const CREDENTIALS_DIR: string;
5
+ export declare const TEMPLATES_DIR: string;
6
+ export declare const LOGS_DIR: string;
7
+ export declare const DEFAULT_GATEWAY_PORT = 3141;
8
+ export declare const DEFAULT_IDENTITY_FILE = "IDENTITY.md";
9
+ export declare const SUPPORTED_CHANNELS: readonly ["telegram", "discord", "slack", "sms", "whatsapp", "email", "voice", "teams", "messenger", "web"];
10
+ export declare const FREE_CHANNELS: ReadonlySet<string>;
11
+ export declare const CHANNEL_DISPLAY_NAMES: Record<string, string>;
12
+ export declare const CHANNEL_SETUP_TIMES: Record<string, string>;
13
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,eAAO,MAAM,UAAU,QAAgC,CAAC;AACxD,eAAO,MAAM,WAAW,QAAkC,CAAC;AAC3D,eAAO,MAAM,eAAe,QAAkC,CAAC;AAC/D,eAAO,MAAM,aAAa,QAAgC,CAAC;AAC3D,eAAO,MAAM,QAAQ,QAA2B,CAAC;AAEjD,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AAEnD,eAAO,MAAM,kBAAkB,6GAWrB,CAAC;AAEX,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,CAI5C,CAAC;AAEH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWxD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWtD,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ export const VERSION = "1.0.0";
4
+ export const CONFIG_DIR = join(homedir(), ".agentdial");
5
+ export const CONFIG_FILE = join(CONFIG_DIR, "config.json");
6
+ export const CREDENTIALS_DIR = join(CONFIG_DIR, "credentials");
7
+ export const TEMPLATES_DIR = join(CONFIG_DIR, "templates");
8
+ export const LOGS_DIR = join(CONFIG_DIR, "logs");
9
+ export const DEFAULT_GATEWAY_PORT = 3141;
10
+ export const DEFAULT_IDENTITY_FILE = "IDENTITY.md";
11
+ export const SUPPORTED_CHANNELS = [
12
+ "telegram",
13
+ "discord",
14
+ "slack",
15
+ "sms",
16
+ "whatsapp",
17
+ "email",
18
+ "voice",
19
+ "teams",
20
+ "messenger",
21
+ "web",
22
+ ];
23
+ export const FREE_CHANNELS = new Set([
24
+ "telegram",
25
+ "discord",
26
+ "web",
27
+ ]);
28
+ export const CHANNEL_DISPLAY_NAMES = {
29
+ telegram: "Telegram Bot",
30
+ discord: "Discord Bot",
31
+ slack: "Slack App",
32
+ sms: "SMS (Twilio)",
33
+ whatsapp: "WhatsApp (Twilio)",
34
+ email: "Email (SendGrid)",
35
+ voice: "Voice (Twilio)",
36
+ teams: "Microsoft Teams",
37
+ messenger: "Facebook Messenger",
38
+ web: "Web Widget",
39
+ };
40
+ export const CHANNEL_SETUP_TIMES = {
41
+ telegram: "2 min",
42
+ discord: "3 min",
43
+ slack: "5 min",
44
+ sms: "5 min",
45
+ whatsapp: "10 min",
46
+ email: "3 min",
47
+ voice: "5 min",
48
+ teams: "10 min",
49
+ messenger: "10 min",
50
+ web: "1 min",
51
+ };
52
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACxD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAEjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AACzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAEnD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,UAAU;IACV,SAAS;IACT,OAAO;IACP,KAAK;IACL,UAAU;IACV,OAAO;IACP,OAAO;IACP,OAAO;IACP,WAAW;IACX,KAAK;CACG,CAAC;AAEX,MAAM,CAAC,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC;IACxD,UAAU;IACV,SAAS;IACT,KAAK;CACN,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,QAAQ,EAAE,cAAc;IACxB,OAAO,EAAE,aAAa;IACtB,KAAK,EAAE,WAAW;IAClB,GAAG,EAAE,cAAc;IACnB,QAAQ,EAAE,mBAAmB;IAC7B,KAAK,EAAE,kBAAkB;IACzB,KAAK,EAAE,gBAAgB;IACvB,KAAK,EAAE,iBAAiB;IACxB,SAAS,EAAE,oBAAoB;IAC/B,GAAG,EAAE,YAAY;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,QAAQ,EAAE,OAAO;IACjB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,OAAO;IACZ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,QAAQ;IACf,SAAS,EAAE,QAAQ;IACnB,GAAG,EAAE,OAAO;CACb,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ChannelType } from "../adapters/types.js";
2
+ export declare function saveCredential(channel: ChannelType, key: string, value: string): Promise<void>;
3
+ export declare function getCredential(channel: ChannelType, key: string): Promise<string | undefined>;
4
+ export declare function listCredentials(channel: ChannelType): Promise<string[]>;
5
+ export declare function deleteCredential(channel: ChannelType, key: string): Promise<boolean>;
6
+ export declare function listConfiguredChannels(): Promise<ChannelType[]>;
7
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA0CxD,wBAAsB,cAAc,CAClC,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAG7B;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7E;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAMrE"}
@@ -0,0 +1,61 @@
1
+ import { readFile, writeFile, mkdir, readdir, chmod } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { CREDENTIALS_DIR } from "./constants.js";
5
+ async function ensureCredentialsDir() {
6
+ if (!existsSync(CREDENTIALS_DIR)) {
7
+ await mkdir(CREDENTIALS_DIR, { recursive: true });
8
+ await chmod(CREDENTIALS_DIR, 0o700);
9
+ }
10
+ }
11
+ function credentialPath(channel) {
12
+ return join(CREDENTIALS_DIR, `${channel}.json`);
13
+ }
14
+ async function loadChannelCredentials(channel) {
15
+ const filePath = credentialPath(channel);
16
+ if (!existsSync(filePath)) {
17
+ return {};
18
+ }
19
+ const raw = await readFile(filePath, "utf-8");
20
+ try {
21
+ return JSON.parse(raw);
22
+ }
23
+ catch {
24
+ return {};
25
+ }
26
+ }
27
+ async function persistChannelCredentials(channel, credentials) {
28
+ await ensureCredentialsDir();
29
+ const filePath = credentialPath(channel);
30
+ await writeFile(filePath, JSON.stringify(credentials, null, 2) + "\n", "utf-8");
31
+ await chmod(filePath, 0o600);
32
+ }
33
+ export async function saveCredential(channel, key, value) {
34
+ const creds = await loadChannelCredentials(channel);
35
+ creds[key] = value;
36
+ await persistChannelCredentials(channel, creds);
37
+ }
38
+ export async function getCredential(channel, key) {
39
+ const creds = await loadChannelCredentials(channel);
40
+ return creds[key];
41
+ }
42
+ export async function listCredentials(channel) {
43
+ const creds = await loadChannelCredentials(channel);
44
+ return Object.keys(creds);
45
+ }
46
+ export async function deleteCredential(channel, key) {
47
+ const creds = await loadChannelCredentials(channel);
48
+ if (!(key in creds))
49
+ return false;
50
+ delete creds[key];
51
+ await persistChannelCredentials(channel, creds);
52
+ return true;
53
+ }
54
+ export async function listConfiguredChannels() {
55
+ await ensureCredentialsDir();
56
+ const files = await readdir(CREDENTIALS_DIR);
57
+ return files
58
+ .filter((f) => f.endsWith(".json"))
59
+ .map((f) => f.replace(".json", ""));
60
+ }
61
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ChannelType, GatewayMessage, GatewayResponse } from "../adapters/types.js";
2
+ interface RawChannelMessage {
3
+ text?: string;
4
+ content?: string;
5
+ body?: string;
6
+ message?: string;
7
+ from?: string;
8
+ sender?: string;
9
+ userId?: string;
10
+ user_id?: string;
11
+ chatId?: string;
12
+ chat_id?: string;
13
+ threadId?: string;
14
+ thread_id?: string;
15
+ timestamp?: number;
16
+ date?: number;
17
+ ts?: string;
18
+ }
19
+ export declare function normalizeMessage(raw: RawChannelMessage, channel: ChannelType): GatewayMessage;
20
+ interface ChannelFormattedResponse {
21
+ channel: ChannelType;
22
+ payload: Record<string, unknown>;
23
+ }
24
+ export declare function formatResponse(response: GatewayResponse, channel: ChannelType): ChannelFormattedResponse;
25
+ export declare function routeMessage(msg: GatewayMessage, agentUrl: string): Promise<GatewayResponse>;
26
+ export {};
27
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/lib/gateway.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAI9B,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,WAAW,GACnB,cAAc,CAkBhB;AAWD,UAAU,wBAAwB;IAChC,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,WAAW,GACnB,wBAAwB,CAiE1B;AAID,wBAAsB,YAAY,CAChC,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CAe1B"}
@@ -0,0 +1,103 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { GatewayMessageSchema, GatewayResponseSchema, } from "../adapters/types.js";
3
+ export function normalizeMessage(raw, channel) {
4
+ const text = raw.text ?? raw.content ?? raw.body ?? raw.message ?? "";
5
+ const from = raw.from ?? raw.sender ?? raw.userId ?? raw.user_id ?? "unknown";
6
+ const threadId = raw.threadId ?? raw.thread_id ?? raw.chatId ?? raw.chat_id ?? undefined;
7
+ const timestamp = raw.timestamp ?? raw.date ?? parseSlackTs(raw.ts) ?? Date.now();
8
+ const msg = {
9
+ id: randomUUID(),
10
+ channel,
11
+ from: String(from),
12
+ text: String(text),
13
+ timestamp,
14
+ threadId: threadId ? String(threadId) : undefined,
15
+ };
16
+ return GatewayMessageSchema.parse(msg);
17
+ }
18
+ function parseSlackTs(ts) {
19
+ if (!ts)
20
+ return undefined;
21
+ const seconds = parseFloat(ts);
22
+ if (isNaN(seconds))
23
+ return undefined;
24
+ return Math.floor(seconds * 1000);
25
+ }
26
+ export function formatResponse(response, channel) {
27
+ const validated = GatewayResponseSchema.parse(response);
28
+ switch (channel) {
29
+ case "telegram":
30
+ return {
31
+ channel,
32
+ payload: {
33
+ text: validated.text,
34
+ parse_mode: "Markdown",
35
+ reply_markup: validated.actions
36
+ ? {
37
+ inline_keyboard: [
38
+ validated.actions.map((a) => ({
39
+ text: a.label,
40
+ ...(a.type === "url"
41
+ ? { url: a.value }
42
+ : { callback_data: a.value }),
43
+ })),
44
+ ],
45
+ }
46
+ : undefined,
47
+ },
48
+ };
49
+ case "discord":
50
+ return {
51
+ channel,
52
+ payload: {
53
+ content: validated.text,
54
+ embeds: validated.cards?.map((c) => ({
55
+ title: c.title,
56
+ description: c.description,
57
+ image: c.imageUrl ? { url: c.imageUrl } : undefined,
58
+ })),
59
+ },
60
+ };
61
+ case "slack":
62
+ return {
63
+ channel,
64
+ payload: {
65
+ text: validated.text,
66
+ blocks: [
67
+ { type: "section", text: { type: "mrkdwn", text: validated.text } },
68
+ ...(validated.actions?.map((a) => ({
69
+ type: "actions",
70
+ elements: [
71
+ {
72
+ type: a.type === "url" ? "button" : "button",
73
+ text: { type: "plain_text", text: a.label },
74
+ ...(a.type === "url" ? { url: a.value } : { value: a.value }),
75
+ },
76
+ ],
77
+ })) ?? []),
78
+ ],
79
+ },
80
+ };
81
+ default:
82
+ return {
83
+ channel,
84
+ payload: { text: validated.text },
85
+ };
86
+ }
87
+ }
88
+ // ── Route message to agent backend ──
89
+ export async function routeMessage(msg, agentUrl) {
90
+ const res = await fetch(agentUrl, {
91
+ method: "POST",
92
+ headers: { "Content-Type": "application/json" },
93
+ body: JSON.stringify(msg),
94
+ signal: AbortSignal.timeout(30_000),
95
+ });
96
+ if (!res.ok) {
97
+ const body = await res.text().catch(() => "unknown error");
98
+ throw new Error(`Agent returned ${String(res.status)}: ${body}`);
99
+ }
100
+ const data = (await res.json());
101
+ return GatewayResponseSchema.parse(data);
102
+ }
103
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/lib/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Identity } from "../adapters/types.js";
2
+ export declare function parseIdentity(filePath: string): Promise<Identity>;
3
+ export declare function writeIdentity(filePath: string, identity: Identity, body?: string): Promise<void>;
4
+ export declare function validateIdentity(data: unknown): Identity;
5
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/lib/identity.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIrD,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgBvE;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAExD"}
@@ -0,0 +1,36 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
4
+ import { IdentitySchema } from "../adapters/types.js";
5
+ const FRONTMATTER_REGEX = /^---\n([\s\S]*?)\n---/;
6
+ export async function parseIdentity(filePath) {
7
+ if (!existsSync(filePath)) {
8
+ throw new Error(`Identity file not found: ${filePath}`);
9
+ }
10
+ const raw = await readFile(filePath, "utf-8");
11
+ const match = FRONTMATTER_REGEX.exec(raw);
12
+ if (!match?.[1]) {
13
+ throw new Error(`No YAML frontmatter found in ${filePath}. Expected ---\\n...\\n--- block.`);
14
+ }
15
+ const yaml = parseYaml(match[1]);
16
+ return IdentitySchema.parse(yaml);
17
+ }
18
+ export async function writeIdentity(filePath, identity, body) {
19
+ const validated = IdentitySchema.parse(identity);
20
+ const yaml = stringifyYaml(validated, { lineWidth: 0 });
21
+ const bodyContent = body ?? generateDefaultBody(validated);
22
+ const content = `---\n${yaml}---\n\n${bodyContent}\n`;
23
+ await writeFile(filePath, content, "utf-8");
24
+ }
25
+ export function validateIdentity(data) {
26
+ return IdentitySchema.parse(data);
27
+ }
28
+ function generateDefaultBody(identity) {
29
+ const lines = [`# ${identity.name}`, ""];
30
+ if (identity.tagline) {
31
+ lines.push(`> ${identity.tagline}`, "");
32
+ }
33
+ lines.push("## Personality", "", "<!-- Describe your agent's personality, tone, and communication style -->", "", "## Capabilities", "", "<!-- List what your agent can do -->", "", "## Boundaries", "", "<!-- Define what your agent should NOT do -->");
34
+ return lines.join("\n");
35
+ }
36
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/lib/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE1C,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,gCAAgC,QAAQ,mCAAmC,CAC5E,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAY,CAAC;IAC5C,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,QAAkB,EAClB,IAAa;IAEb,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,IAAI,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,QAAQ,IAAI,UAAU,WAAW,IAAI,CAAC;IACtD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAkB;IAC7C,MAAM,KAAK,GAAa,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAEnD,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CACR,gBAAgB,EAChB,EAAE,EACF,2EAA2E,EAC3E,EAAE,EACF,iBAAiB,EACjB,EAAE,EACF,sCAAsC,EACtC,EAAE,EACF,eAAe,EACf,EAAE,EACF,+CAA+C,CAChD,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare function banner(): void;
2
+ export declare function box(title: string, content: string): void;
3
+ export declare function success(msg: string): void;
4
+ export declare function error(msg: string): void;
5
+ export declare function warn(msg: string): void;
6
+ export declare function info(msg: string): void;
7
+ export declare function heading(msg: string): void;
8
+ export interface TableRow {
9
+ [key: string]: string;
10
+ }
11
+ export declare function table(headers: string[], rows: TableRow[]): void;
12
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/lib/ui.ts"],"names":[],"mappings":"AAYA,wBAAgB,MAAM,IAAI,IAAI,CAa7B;AAID,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA0BxD;AAID,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAGzC;AAID,MAAM,WAAW,QAAQ;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CA4B/D"}
package/dist/lib/ui.js ADDED
@@ -0,0 +1,91 @@
1
+ import chalk from "chalk";
2
+ import { VERSION } from "./constants.js";
3
+ // ── Colors (warm black aesthetic) ──
4
+ const brand = chalk.hex("#8B5CF6");
5
+ const dim = chalk.hex("#6B7280");
6
+ const warm = chalk.hex("#D4C5A9");
7
+ const bright = chalk.hex("#E5E7EB");
8
+ // ── Banner ──
9
+ export function banner() {
10
+ const art = [
11
+ "",
12
+ brand(" ___ __ ____ _ __"),
13
+ brand(" / _ |___ ____ ___ ____/ / / __ \\(_)___ _/ /"),
14
+ brand(" / __ / _ `/ -_) _ \\/ __/ / / / / / / _ `/ / "),
15
+ brand("/_/ |_\\_, /\\__/_//_/\\__/_/ /_/ /_/_/\\_,_/_/ "),
16
+ brand(" /___/"),
17
+ "",
18
+ dim(` v${VERSION} ${warm("One identity. Every channel.")}`),
19
+ "",
20
+ ];
21
+ console.log(art.join("\n"));
22
+ }
23
+ // ── Box Drawing ──
24
+ export function box(title, content) {
25
+ const lines = content.split("\n");
26
+ const maxLen = Math.max(title.length + 2, ...lines.map((l) => stripAnsi(l).length));
27
+ const width = Math.min(maxLen + 4, 72);
28
+ const top = dim(` ${"\u250C"}${"─".repeat(width)}${"\u2510"}`);
29
+ const titleLine = dim(" │ ") +
30
+ brand(title) +
31
+ " ".repeat(width - title.length - 2) +
32
+ dim(" │");
33
+ const sep = dim(` ${"\u251C"}${"─".repeat(width)}${"\u2524"}`);
34
+ const bot = dim(` ${"\u2514"}${"─".repeat(width)}${"\u2518"}`);
35
+ console.log(top);
36
+ console.log(titleLine);
37
+ console.log(sep);
38
+ for (const line of lines) {
39
+ const stripped = stripAnsi(line);
40
+ const pad = width - stripped.length - 2;
41
+ console.log(dim(" │ ") + line + " ".repeat(Math.max(0, pad)) + dim(" │"));
42
+ }
43
+ console.log(bot);
44
+ }
45
+ // ── Status Helpers ──
46
+ export function success(msg) {
47
+ console.log(chalk.green(" \u2713 ") + bright(msg));
48
+ }
49
+ export function error(msg) {
50
+ console.log(chalk.red(" \u2717 ") + bright(msg));
51
+ }
52
+ export function warn(msg) {
53
+ console.log(chalk.yellow(" ! ") + bright(msg));
54
+ }
55
+ export function info(msg) {
56
+ console.log(dim(" \u2022 ") + warm(msg));
57
+ }
58
+ export function heading(msg) {
59
+ console.log("\n" + brand(" " + msg));
60
+ console.log(dim(" " + "─".repeat(msg.length)));
61
+ }
62
+ export function table(headers, rows) {
63
+ if (rows.length === 0) {
64
+ info("No data to display.");
65
+ return;
66
+ }
67
+ const colWidths = headers.map((h) => Math.max(h.length, ...rows.map((r) => stripAnsi(r[h] ?? "").length)));
68
+ const headerLine = headers
69
+ .map((h, i) => brand(h.padEnd(colWidths[i] ?? 0)))
70
+ .join(dim(" "));
71
+ console.log(" " + headerLine);
72
+ console.log(" " + colWidths.map((w) => dim("─".repeat(w))).join(dim(" ")));
73
+ for (const row of rows) {
74
+ const line = headers
75
+ .map((h, i) => {
76
+ const val = row[h] ?? "";
77
+ const stripped = stripAnsi(val);
78
+ const pad = (colWidths[i] ?? 0) - stripped.length;
79
+ return val + " ".repeat(Math.max(0, pad));
80
+ })
81
+ .join(dim(" "));
82
+ console.log(" " + line);
83
+ }
84
+ console.log("");
85
+ }
86
+ // ── Utilities ──
87
+ function stripAnsi(str) {
88
+ // eslint-disable-next-line no-control-regex
89
+ return str.replace(/\u001B\[\d+m/g, "").replace(/\u001B\[[\d;]*m/g, "");
90
+ }
91
+ //# sourceMappingURL=ui.js.map