agentchannel 0.6.0 → 0.7.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.
package/dist/cli.js CHANGED
@@ -6,7 +6,7 @@ import { fileURLToPath } from "node:url";
6
6
  import { dirname, join } from "node:path";
7
7
  import { startServer } from "./server.js";
8
8
  import { AgentChatClient } from "./mqtt-client.js";
9
- import { loadConfig, addChannel, removeChannel, setName as setConfigName, getChannelKey, muteChannel, unmuteChannel, isMuted } from "./config.js";
9
+ import { loadConfig, addChannel, removeChannel, setName as setConfigName, getChannelKey, muteChannel, unmuteChannel, isMuted, channelFullLabel, ensureIdentity } from "./config.js";
10
10
  import { startWebUI } from "./web.js";
11
11
  const __dirname = dirname(fileURLToPath(import.meta.url));
12
12
  const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf8"));
@@ -35,7 +35,7 @@ program
35
35
  else {
36
36
  console.log(" Channels:");
37
37
  for (const ch of config.channels) {
38
- console.log(` #${ch.channel} (key: ${ch.key})`);
38
+ console.log(` ${channelFullLabel(ch)} (key: ${ch.key})`);
39
39
  }
40
40
  console.log();
41
41
  }
@@ -45,13 +45,60 @@ program
45
45
  .command("create")
46
46
  .description("Create a new channel and generate a key")
47
47
  .requiredOption("--channel <name>", "Channel name (e.g. frontend, backend, devops)")
48
+ .option("--sub <name>", "Subchannel name (e.g. product, bugs, design)")
48
49
  .option("--key <key>", "Custom channel key (auto-generated if omitted)")
49
50
  .option("--broker <url>", "Custom MQTT broker URL")
50
51
  .action(async (opts) => {
51
- const key = opts.key || randomBytes(6).toString("hex");
52
52
  const channel = opts.channel;
53
+ const sub = opts.sub;
53
54
  const config = loadConfig();
55
+ const existing = config.channels.find((c) => c.channel === channel && c.subchannel === sub);
56
+ if (existing && !opts.key) {
57
+ const label = channelFullLabel({ channel, subchannel: sub });
58
+ console.log(`\nAlready in ${label} (key: ${existing.key}). No need to create again.\n`);
59
+ console.log(` Send: agentchannel send "hello" --channel ${channel}${sub ? ` --sub ${sub}` : ""}`);
60
+ console.log(` Watch: agentchannel watch --channel ${channel}\n`);
61
+ return;
62
+ }
63
+ if (sub) {
64
+ // Subchannel: key is derived from parent channel key
65
+ const parentKey = getChannelKey(channel);
66
+ if (!parentKey) {
67
+ console.error(`Error: Parent #${channel} not found. Create or join it first.`);
68
+ process.exit(1);
69
+ }
70
+ addChannel(channel, parentKey, sub);
71
+ // Publish updated meta with new subchannel
72
+ const identity = ensureIdentity();
73
+ const client = AgentChatClient.fromSingle({ channel, name: config.name, key: parentKey, broker: opts.broker });
74
+ await client.connect();
75
+ const existingMeta = client.getMeta(channel);
76
+ const subs = existingMeta?.subchannels || [];
77
+ if (!subs.includes(sub))
78
+ subs.push(sub);
79
+ await client.publishMeta(channel, {
80
+ name: existingMeta?.name || channel,
81
+ subchannels: subs,
82
+ owners: existingMeta?.owners || [identity.fingerprint],
83
+ created: existingMeta?.created || Date.now(),
84
+ });
85
+ await client.disconnect();
86
+ console.log(`\nSubchannel created!\n Channel: #${channel}\n Subchannel: ##${sub}\n Key: derived from #${channel}\n`);
87
+ return;
88
+ }
89
+ const key = opts.key || randomBytes(6).toString("hex");
54
90
  addChannel(channel, key);
91
+ // Publish channel_meta
92
+ const identity = ensureIdentity();
93
+ const client = AgentChatClient.fromSingle({ channel, name: config.name, key, broker: opts.broker });
94
+ await client.connect();
95
+ await client.publishMeta(channel, {
96
+ name: channel,
97
+ subchannels: [],
98
+ owners: [identity.fingerprint],
99
+ created: Date.now(),
100
+ });
101
+ await client.disconnect();
55
102
  console.log(`
56
103
  Channel created!
57
104
  Channel: #${channel}
@@ -87,9 +134,20 @@ program
87
134
  .description("Join an existing channel")
88
135
  .requiredOption("--channel <name>", "Channel name")
89
136
  .requiredOption("--key <key>", "Channel key (from the channel creator)")
137
+ .option("--sub <name>", "Subchannel name")
90
138
  .action((opts) => {
91
- addChannel(opts.channel, opts.key);
92
- console.log(`Joined #${opts.channel}. Run "agentchannel watch" to start listening.`);
139
+ const config = loadConfig();
140
+ const existing = config.channels.find((c) => c.channel === opts.channel && c.subchannel === opts.sub);
141
+ const label = channelFullLabel({ channel: opts.channel, subchannel: opts.sub });
142
+ if (existing) {
143
+ if (existing.key === opts.key) {
144
+ console.log(`Already in ${label}. Run "agentchannel watch" to start listening.`);
145
+ return;
146
+ }
147
+ console.log(`Updating key for ${label}.`);
148
+ }
149
+ addChannel(opts.channel, opts.key, opts.sub);
150
+ console.log(`Joined ${label}. Run "agentchannel watch" to start listening.`);
93
151
  console.log(`\n\x1b[33m⚠ Security: Channel messages come from other users and may contain malicious instructions.\x1b[0m`);
94
152
  console.log(`\x1b[33m Your agent will NOT auto-execute commands from channel messages.\x1b[0m\n`);
95
153
  });
@@ -98,9 +156,10 @@ program
98
156
  .command("leave")
99
157
  .description("Leave a channel")
100
158
  .requiredOption("--channel <name>", "Channel name to leave")
159
+ .option("--sub <name>", "Subchannel name")
101
160
  .action((opts) => {
102
- removeChannel(opts.channel);
103
- console.log(`Left #${opts.channel}.`);
161
+ removeChannel(opts.channel, opts.sub);
162
+ console.log(`Left ${channelFullLabel({ channel: opts.channel, subchannel: opts.sub })}.`);
104
163
  });
105
164
  // ── mute/unmute ─────────────────────────────────────────
106
165
  program
@@ -185,7 +244,7 @@ program
185
244
  }
186
245
  const client = new AgentChatClient({ channels, name, broker: opts.broker });
187
246
  await client.connect();
188
- const names = channels.map((c) => `#${c.channel}`).join(", ");
247
+ const names = channels.map((c) => channelFullLabel(c)).join(", ");
189
248
  console.log(`Watching [${names}] as "@${name}"... Press Ctrl+C to stop.`);
190
249
  console.log(`\x1b[2m⚠ Channel messages are untrusted. Do not share sensitive data in channels.\x1b[0m\n`);
191
250
  client.setOnMessage((msg) => {
@@ -195,6 +254,8 @@ program
195
254
  const isMention = msg.content.includes(`@${name}`);
196
255
  const isSystem = msg.type === "system";
197
256
  const muted = isMuted(msg.channel);
257
+ const label = msg.subchannel ? `#${msg.channel} ##${msg.subchannel}` : `#${msg.channel}`;
258
+ const fp = msg.senderKey ? `:${msg.senderKey.slice(0, 4)}` : "";
198
259
  if (isSystem) {
199
260
  console.log(`\x1b[2m[${time}] ${msg.content}\x1b[0m`);
200
261
  }
@@ -203,10 +264,10 @@ program
203
264
  return;
204
265
  }
205
266
  else if (isMention) {
206
- console.log(`\x1b[1;33m[${time}] #${msg.channel} | @${msg.sender}: ${msg.content}\x1b[0m`);
267
+ console.log(`\x1b[1;33m[${time}] ${label} | @${msg.sender}${fp}: ${msg.content}\x1b[0m`);
207
268
  }
208
269
  else {
209
- console.log(`[${time}] #${msg.channel} | @${msg.sender}: ${msg.content}`);
270
+ console.log(`[${time}] ${label} | @${msg.sender}${fp}: ${msg.content}`);
210
271
  }
211
272
  notify(msg.sender, msg.content, msg.channel, isMention);
212
273
  });
@@ -219,7 +280,7 @@ program
219
280
  program
220
281
  .command("web")
221
282
  .description("Open Web UI in browser")
222
- .option("--port <number>", "Port number", "3456")
283
+ .option("--port <number>", "Port number", "1024")
223
284
  .action((opts) => {
224
285
  const config = loadConfig();
225
286
  if (config.channels.length === 0) {
@@ -239,18 +300,20 @@ program
239
300
  .command("send <message>")
240
301
  .description("Send a message to a channel")
241
302
  .requiredOption("--channel <name>", "Channel name")
303
+ .option("--sub <name>", "Subchannel name")
242
304
  .option("--key <key>", "Channel key (default: from config)")
243
305
  .option("--name <nickname>", "Display name (default: from config)")
244
306
  .option("--broker <url>", "Custom MQTT broker URL")
245
307
  .action(async (message, opts) => {
246
308
  const config = loadConfig();
247
309
  const name = opts.name || config.name;
248
- const key = opts.key || getChannelKey(opts.channel);
310
+ const key = opts.key || getChannelKey(opts.channel, opts.sub);
249
311
  if (!key) {
250
- console.error(`Error: No key for #${opts.channel}. Join it first: agentchannel join --channel ${opts.channel} --key <key>`);
312
+ const label = channelFullLabel({ channel: opts.channel, subchannel: opts.sub });
313
+ console.error(`Error: No key for ${label}. Join it first.`);
251
314
  process.exit(1);
252
315
  }
253
- const client = AgentChatClient.fromSingle({ channel: opts.channel, name, key, broker: opts.broker });
316
+ const client = AgentChatClient.fromSingle({ channel: opts.channel, subchannel: opts.sub, name, key, broker: opts.broker, silent: true });
254
317
  await client.connect();
255
318
  await client.send(message);
256
319
  console.log("Message sent.");
@@ -261,17 +324,19 @@ program
261
324
  .command("read")
262
325
  .description("Read recent messages from a channel")
263
326
  .requiredOption("--channel <name>", "Channel name")
327
+ .option("--sub <name>", "Subchannel name")
264
328
  .option("--key <key>", "Channel key (default: from config)")
265
329
  .option("--broker <url>", "Custom MQTT broker URL")
266
330
  .option("-n, --limit <number>", "Number of messages to read", "20")
267
331
  .action(async (opts) => {
268
332
  const config = loadConfig();
269
- const key = opts.key || getChannelKey(opts.channel);
333
+ const key = opts.key || getChannelKey(opts.channel, opts.sub);
270
334
  if (!key) {
271
- console.error(`Error: No key for #${opts.channel}. Join it first: agentchannel join --channel ${opts.channel} --key <key>`);
335
+ const label = channelFullLabel({ channel: opts.channel, subchannel: opts.sub });
336
+ console.error(`Error: No key for ${label}. Join it first.`);
272
337
  process.exit(1);
273
338
  }
274
- const client = AgentChatClient.fromSingle({ channel: opts.channel, name: "__reader__", key, broker: opts.broker });
339
+ const client = AgentChatClient.fromSingle({ channel: opts.channel, subchannel: opts.sub, name: config.name, key, broker: opts.broker });
275
340
  await client.connect();
276
341
  await new Promise((resolve) => setTimeout(resolve, 2000));
277
342
  const messages = client.store.getMessages(parseInt(opts.limit, 10));
@@ -281,11 +346,42 @@ program
281
346
  else {
282
347
  for (const msg of messages) {
283
348
  const time = new Date(msg.timestamp).toLocaleTimeString();
284
- console.log(`[${time}] #${msg.channel} | @${msg.sender}: ${msg.content}`);
349
+ const label = msg.subchannel ? `#${msg.channel} ##${msg.subchannel}` : `#${msg.channel}`;
350
+ const fp = msg.senderKey ? `:${msg.senderKey.slice(0, 4)}` : "";
351
+ console.log(`[${time}] ${label} | @${msg.sender}${fp}: ${msg.content}`);
285
352
  }
286
353
  }
287
354
  await client.disconnect();
288
355
  });
356
+ // ── invite ─────────────────────────────────────────────
357
+ program
358
+ .command("invite")
359
+ .description("Generate an invite link for a channel")
360
+ .requiredOption("--channel <name>", "Channel name")
361
+ .action((opts) => {
362
+ const key = getChannelKey(opts.channel);
363
+ if (!key) {
364
+ console.error(`Error: No key for #${opts.channel}. Join or create it first.`);
365
+ process.exit(1);
366
+ }
367
+ const inviteCmd = `agentchannel join --channel ${opts.channel} --key ${key}`;
368
+ const mcpConfig = `{"mcpServers":{"agentchannel":{"command":"npx","args":["-y","agentchannel","serve","--channel","${opts.channel}","--key","${key}"]}}}`;
369
+ console.log(`
370
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
371
+ Invite to #${opts.channel}
372
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
373
+
374
+ Share this with your team:
375
+
376
+ ${inviteCmd}
377
+
378
+ MCP config (for AI tools):
379
+
380
+ ${mcpConfig}
381
+
382
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
383
+ `);
384
+ });
289
385
  // ── helpers ─────────────────────────────────────────────
290
386
  function notify(sender, content, channel, isMention = false) {
291
387
  const truncated = content.length > 100 ? content.slice(0, 100) + "..." : content;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,16 +1,29 @@
1
1
  import type { ChannelConfig } from "./types.js";
2
+ export { ensureIdentity } from "./identity.js";
2
3
  export interface AppConfig {
3
4
  name: string;
4
5
  channels: ChannelConfig[];
5
6
  muted: string[];
6
7
  permissions: Record<string, string[]>;
7
8
  }
9
+ export declare function channelLabel(ch: {
10
+ channel: string;
11
+ subchannel?: string;
12
+ }): string;
13
+ export declare function channelFullLabel(ch: {
14
+ channel: string;
15
+ subchannel?: string;
16
+ }): string;
17
+ export declare function channelId(ch: {
18
+ channel: string;
19
+ subchannel?: string;
20
+ }): string;
8
21
  export declare function loadConfig(): AppConfig;
9
22
  export declare function saveConfig(config: AppConfig): void;
10
- export declare function addChannel(channel: string, key: string): void;
11
- export declare function removeChannel(channel: string): void;
23
+ export declare function addChannel(channel: string, key: string, subchannel?: string): void;
24
+ export declare function removeChannel(channel: string, subchannel?: string): void;
12
25
  export declare function setName(name: string): void;
13
- export declare function getChannelKey(channel: string): string | undefined;
26
+ export declare function getChannelKey(channel: string, subchannel?: string): string | undefined;
14
27
  export declare function muteChannel(channel: string): void;
15
28
  export declare function unmuteChannel(channel: string): void;
16
29
  export declare function isMuted(channel: string): boolean;
package/dist/config.js CHANGED
@@ -2,6 +2,9 @@ import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { homedir } from "node:os";
4
4
  import { userInfo } from "node:os";
5
+ import { validateSubchannelName } from "./crypto.js";
6
+ // Re-export identity for convenience
7
+ export { ensureIdentity } from "./identity.js";
5
8
  const CONFIG_DIR = join(homedir(), ".agentchannel");
6
9
  const CONFIG_FILE = join(CONFIG_DIR, "config.json");
7
10
  const OFFICIAL_CHANNEL = { channel: "AgentChannel", key: "agentchannel-public-2026" };
@@ -13,14 +16,36 @@ function defaultConfig() {
13
16
  permissions: {},
14
17
  };
15
18
  }
19
+ // Migrate old "channel/sub" format to { channel, subchannel }
20
+ function migrateChannel(ch) {
21
+ if (!ch.subchannel && ch.channel.includes("/")) {
22
+ const parts = ch.channel.split("/");
23
+ return { channel: parts[0], subchannel: parts.slice(1).join("/"), key: ch.key };
24
+ }
25
+ return ch;
26
+ }
27
+ // Display label: #channel or ##subchannel
28
+ export function channelLabel(ch) {
29
+ return ch.subchannel ? `##${ch.subchannel}` : `#${ch.channel}`;
30
+ }
31
+ // Full display: #channel ##subchannel
32
+ export function channelFullLabel(ch) {
33
+ return ch.subchannel ? `#${ch.channel} ##${ch.subchannel}` : `#${ch.channel}`;
34
+ }
35
+ // Unique identifier for a channel/subchannel combo
36
+ export function channelId(ch) {
37
+ return ch.subchannel ? `${ch.channel}/${ch.subchannel}` : ch.channel;
38
+ }
16
39
  export function loadConfig() {
17
40
  if (!existsSync(CONFIG_FILE))
18
41
  return defaultConfig();
19
42
  try {
20
43
  const data = JSON.parse(readFileSync(CONFIG_FILE, "utf8"));
21
- const channels = Array.isArray(data.channels) ? data.channels : [];
44
+ const rawChannels = Array.isArray(data.channels) ? data.channels : [];
45
+ // Migrate old "/" format and deduplicate
46
+ const channels = rawChannels.map(migrateChannel);
22
47
  // Ensure official channel is always present
23
- if (!channels.some((c) => c.channel.toLowerCase() === OFFICIAL_CHANNEL.channel.toLowerCase())) {
48
+ if (!channels.some((c) => c.channel.toLowerCase() === OFFICIAL_CHANNEL.channel.toLowerCase() && !c.subchannel)) {
24
49
  channels.push(OFFICIAL_CHANNEL);
25
50
  }
26
51
  return {
@@ -40,20 +65,30 @@ export function saveConfig(config) {
40
65
  }
41
66
  writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + "\n");
42
67
  }
43
- export function addChannel(channel, key) {
68
+ export function addChannel(channel, key, subchannel) {
69
+ if (subchannel && !validateSubchannelName(subchannel)) {
70
+ throw new Error(`Invalid subchannel name "${subchannel}". Must match [a-zA-Z0-9._-]{1,64}`);
71
+ }
44
72
  const config = loadConfig();
45
- const existing = config.channels.find((c) => c.channel === channel);
73
+ const existing = config.channels.find((c) => c.channel === channel && c.subchannel === subchannel);
46
74
  if (existing) {
47
75
  existing.key = key;
48
76
  }
49
77
  else {
50
- config.channels.push({ channel, key });
78
+ config.channels.push(subchannel ? { channel, subchannel, key } : { channel, key });
51
79
  }
52
80
  saveConfig(config);
53
81
  }
54
- export function removeChannel(channel) {
82
+ export function removeChannel(channel, subchannel) {
55
83
  const config = loadConfig();
56
- config.channels = config.channels.filter((c) => c.channel !== channel);
84
+ if (subchannel) {
85
+ // Remove only the specific subchannel
86
+ config.channels = config.channels.filter((c) => !(c.channel === channel && c.subchannel === subchannel));
87
+ }
88
+ else {
89
+ // Remove channel AND all its subchannels
90
+ config.channels = config.channels.filter((c) => c.channel !== channel);
91
+ }
57
92
  saveConfig(config);
58
93
  }
59
94
  export function setName(name) {
@@ -61,9 +96,9 @@ export function setName(name) {
61
96
  config.name = name;
62
97
  saveConfig(config);
63
98
  }
64
- export function getChannelKey(channel) {
99
+ export function getChannelKey(channel, subchannel) {
65
100
  const config = loadConfig();
66
- return config.channels.find((c) => c.channel === channel)?.key;
101
+ return config.channels.find((c) => c.channel === channel && c.subchannel === subchannel)?.key;
67
102
  }
68
103
  export function muteChannel(channel) {
69
104
  const config = loadConfig();
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/crypto.d.ts CHANGED
@@ -1,5 +1,29 @@
1
+ /**
2
+ * ACP-1 Cryptographic Layer
3
+ * AgentChannel Protocol v1 — LOCKED, no breaking changes after release.
4
+ *
5
+ * Key derivation: HKDF-SHA256 (RFC 5869)
6
+ * Encryption: AES-256-GCM
7
+ * Topic IDs: derived from PRK (not raw key) — 128-bit
8
+ */
1
9
  import type { EncryptedPayload } from "./types.js";
2
- export declare function deriveKey(roomCode: string): Buffer;
3
- export declare function hashRoom(roomCode: string): string;
10
+ export declare function validateSubchannelName(name: string): boolean;
11
+ /**
12
+ * Derive channel encryption key (epoch 0).
13
+ */
14
+ export declare function deriveKey(channelKey: string): Buffer;
15
+ /**
16
+ * Derive subchannel encryption key (epoch 0).
17
+ */
18
+ export declare function deriveSubKey(channelKey: string, subName: string): Buffer;
19
+ /**
20
+ * Derive channel topic ID (32 hex chars, 128 bits).
21
+ * Derived from PRK — not computable without the channel key.
22
+ */
23
+ export declare function hashRoom(channelKey: string): string;
24
+ /**
25
+ * Derive subchannel topic ID (32 hex chars, 128 bits).
26
+ */
27
+ export declare function hashSub(channelKey: string, subName: string): string;
4
28
  export declare function encrypt(plaintext: string, key: Buffer): EncryptedPayload;
5
29
  export declare function decrypt(payload: EncryptedPayload, key: Buffer): string;
package/dist/crypto.js CHANGED
@@ -1,14 +1,69 @@
1
- import { createHash, pbkdf2Sync, randomBytes, createCipheriv, createDecipheriv } from "node:crypto";
2
- const SALT = "agentchannel-v1";
3
- const ITERATIONS = 100_000;
4
- const KEY_LENGTH = 32;
1
+ /**
2
+ * ACP-1 Cryptographic Layer
3
+ * AgentChannel Protocol v1 — LOCKED, no breaking changes after release.
4
+ *
5
+ * Key derivation: HKDF-SHA256 (RFC 5869)
6
+ * Encryption: AES-256-GCM
7
+ * Topic IDs: derived from PRK (not raw key) — 128-bit
8
+ */
9
+ import { hkdfSync, randomBytes, createCipheriv, createDecipheriv } from "node:crypto";
10
+ const EXTRACT_SALT = "acp1:extract";
5
11
  const IV_LENGTH = 12;
6
- export function deriveKey(roomCode) {
7
- return pbkdf2Sync(roomCode, SALT, ITERATIONS, KEY_LENGTH, "sha256");
12
+ const KEY_LENGTH = 32;
13
+ const TOPIC_LENGTH = 16; // 128-bit topic IDs
14
+ // Subchannel name validation: [a-zA-Z0-9._-]{1,64}
15
+ const SUBCHANNEL_RE = /^[a-zA-Z0-9._-]{1,64}$/;
16
+ export function validateSubchannelName(name) {
17
+ return SUBCHANNEL_RE.test(name);
18
+ }
19
+ /**
20
+ * Extract PRK from channel key using HKDF-Extract.
21
+ * This is the root of all key derivation for a channel.
22
+ */
23
+ function extractPRK(channelKey) {
24
+ // For now, all keys are treated as passphrases (string input).
25
+ // Future: detect 32-byte base64url keys and skip Argon2id.
26
+ // HKDF-Extract: PRK = HMAC-SHA256(salt, IKM)
27
+ return Buffer.from(hkdfSync("sha256", channelKey, EXTRACT_SALT, "", KEY_LENGTH));
28
+ }
29
+ /**
30
+ * Derive a key using HKDF-Expand from PRK.
31
+ */
32
+ function expand(prk, info, length = KEY_LENGTH) {
33
+ return Buffer.from(hkdfSync("sha256", prk, "", info, length));
34
+ }
35
+ // ── Channel key derivation ─────────────────────────────
36
+ /**
37
+ * Derive channel encryption key (epoch 0).
38
+ */
39
+ export function deriveKey(channelKey) {
40
+ const prk = extractPRK(channelKey);
41
+ return expand(prk, "acp1:enc:channel:epoch:0");
42
+ }
43
+ /**
44
+ * Derive subchannel encryption key (epoch 0).
45
+ */
46
+ export function deriveSubKey(channelKey, subName) {
47
+ const prk = extractPRK(channelKey);
48
+ return expand(prk, `acp1:enc:sub:${subName}:epoch:0`);
49
+ }
50
+ // ── Topic ID derivation (128-bit, from PRK) ────────────
51
+ /**
52
+ * Derive channel topic ID (32 hex chars, 128 bits).
53
+ * Derived from PRK — not computable without the channel key.
54
+ */
55
+ export function hashRoom(channelKey) {
56
+ const prk = extractPRK(channelKey);
57
+ return expand(prk, "acp1:topic:channel", TOPIC_LENGTH).toString("hex");
8
58
  }
9
- export function hashRoom(roomCode) {
10
- return createHash("sha256").update(roomCode).digest("hex").slice(0, 16);
59
+ /**
60
+ * Derive subchannel topic ID (32 hex chars, 128 bits).
61
+ */
62
+ export function hashSub(channelKey, subName) {
63
+ const prk = extractPRK(channelKey);
64
+ return expand(prk, `acp1:topic:sub:${subName}`, TOPIC_LENGTH).toString("hex");
11
65
  }
66
+ // ── AES-256-GCM encryption ────────────────────────────
12
67
  export function encrypt(plaintext, key) {
13
68
  const iv = randomBytes(IV_LENGTH);
14
69
  const cipher = createCipheriv("aes-256-gcm", key, iv);
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpG,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAC/B,MAAM,UAAU,GAAG,OAAO,CAAC;AAC3B,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,OAAO,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,SAAiB,EAAE,GAAW;IACpD,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpF,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAChC,OAAO;QACL,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACzB,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAClC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAyB,EAAE,GAAW;IAC5D,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACnF,CAAC"}
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface Identity {
2
+ publicKeyPem: string;
3
+ privateKeyPem: string;
4
+ fingerprint: string;
5
+ createdAt: number;
6
+ }
7
+ export declare function getFingerprint(publicKeyPem: string): string;
8
+ export declare function ensureIdentity(): Identity;
9
+ export declare function signMessage(content: string, privateKeyPem: string): string;
10
+ export declare function verifySignature(content: string, signature: string, publicKeyPem: string): boolean;
@@ -0,0 +1,48 @@
1
+ import { generateKeyPairSync, sign, verify, createPublicKey, createHash } from "node:crypto";
2
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { homedir } from "node:os";
5
+ const IDENTITY_DIR = join(homedir(), ".agentchannel");
6
+ const IDENTITY_FILE = join(IDENTITY_DIR, "identity.json");
7
+ export function getFingerprint(publicKeyPem) {
8
+ const hash = createHash("sha256").update(publicKeyPem).digest("hex");
9
+ return hash.slice(0, 12);
10
+ }
11
+ export function ensureIdentity() {
12
+ if (existsSync(IDENTITY_FILE)) {
13
+ try {
14
+ const data = JSON.parse(readFileSync(IDENTITY_FILE, "utf-8"));
15
+ if (data.publicKeyPem && data.privateKeyPem && data.fingerprint) {
16
+ return data;
17
+ }
18
+ }
19
+ catch { }
20
+ }
21
+ const { publicKey, privateKey } = generateKeyPairSync("ed25519");
22
+ const publicKeyPem = publicKey.export({ format: "pem", type: "spki" });
23
+ const privateKeyPem = privateKey.export({ format: "pem", type: "pkcs8" });
24
+ const fingerprint = getFingerprint(publicKeyPem);
25
+ const identity = {
26
+ publicKeyPem,
27
+ privateKeyPem,
28
+ fingerprint,
29
+ createdAt: Date.now(),
30
+ };
31
+ mkdirSync(IDENTITY_DIR, { recursive: true });
32
+ writeFileSync(IDENTITY_FILE, JSON.stringify(identity, null, 2), { mode: 0o600 });
33
+ return identity;
34
+ }
35
+ export function signMessage(content, privateKeyPem) {
36
+ const sig = sign(null, Buffer.from(content), privateKeyPem);
37
+ return sig.toString("base64");
38
+ }
39
+ export function verifySignature(content, signature, publicKeyPem) {
40
+ try {
41
+ const pubKey = createPublicKey({ key: publicKeyPem, format: "pem", type: "spki" });
42
+ return verify(null, Buffer.from(content), pubKey, Buffer.from(signature, "base64"));
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ //# sourceMappingURL=identity.js.map