@t0u9h/agent-git-mail 0.1.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 (98) hide show
  1. package/README.md +20 -0
  2. package/dist/app/archive-message.d.ts +7 -0
  3. package/dist/app/archive-message.d.ts.map +1 -0
  4. package/dist/app/archive-message.js +14 -0
  5. package/dist/app/archive-message.js.map +1 -0
  6. package/dist/app/list-messages.d.ts +17 -0
  7. package/dist/app/list-messages.d.ts.map +1 -0
  8. package/dist/app/list-messages.js +37 -0
  9. package/dist/app/list-messages.js.map +1 -0
  10. package/dist/app/read-message.d.ts +12 -0
  11. package/dist/app/read-message.d.ts.map +1 -0
  12. package/dist/app/read-message.js +18 -0
  13. package/dist/app/read-message.js.map +1 -0
  14. package/dist/app/reply-message.d.ts +11 -0
  15. package/dist/app/reply-message.d.ts.map +1 -0
  16. package/dist/app/reply-message.js +83 -0
  17. package/dist/app/reply-message.js.map +1 -0
  18. package/dist/app/run-daemon.d.ts +12 -0
  19. package/dist/app/run-daemon.d.ts.map +1 -0
  20. package/dist/app/run-daemon.js +98 -0
  21. package/dist/app/run-daemon.js.map +1 -0
  22. package/dist/app/send-message.d.ts +13 -0
  23. package/dist/app/send-message.d.ts.map +1 -0
  24. package/dist/app/send-message.js +59 -0
  25. package/dist/app/send-message.js.map +1 -0
  26. package/dist/cli/commands/archive.d.ts +5 -0
  27. package/dist/cli/commands/archive.d.ts.map +1 -0
  28. package/dist/cli/commands/archive.js +10 -0
  29. package/dist/cli/commands/archive.js.map +1 -0
  30. package/dist/cli/commands/config.d.ts +4 -0
  31. package/dist/cli/commands/config.d.ts.map +1 -0
  32. package/dist/cli/commands/config.js +48 -0
  33. package/dist/cli/commands/config.js.map +1 -0
  34. package/dist/cli/commands/list.d.ts +6 -0
  35. package/dist/cli/commands/list.d.ts.map +1 -0
  36. package/dist/cli/commands/list.js +23 -0
  37. package/dist/cli/commands/list.js.map +1 -0
  38. package/dist/cli/commands/read.d.ts +6 -0
  39. package/dist/cli/commands/read.d.ts.map +1 -0
  40. package/dist/cli/commands/read.js +14 -0
  41. package/dist/cli/commands/read.js.map +1 -0
  42. package/dist/cli/commands/reply.d.ts +5 -0
  43. package/dist/cli/commands/reply.d.ts.map +1 -0
  44. package/dist/cli/commands/reply.js +12 -0
  45. package/dist/cli/commands/reply.js.map +1 -0
  46. package/dist/cli/commands/send.d.ts +3 -0
  47. package/dist/cli/commands/send.d.ts.map +1 -0
  48. package/dist/cli/commands/send.js +14 -0
  49. package/dist/cli/commands/send.js.map +1 -0
  50. package/dist/config/index.d.ts +4 -0
  51. package/dist/config/index.d.ts.map +1 -0
  52. package/dist/config/index.js +4 -0
  53. package/dist/config/index.js.map +1 -0
  54. package/dist/config/load.d.ts +10 -0
  55. package/dist/config/load.d.ts.map +1 -0
  56. package/dist/config/load.js +19 -0
  57. package/dist/config/load.js.map +1 -0
  58. package/dist/config/paths.d.ts +3 -0
  59. package/dist/config/paths.d.ts.map +1 -0
  60. package/dist/config/paths.js +10 -0
  61. package/dist/config/paths.js.map +1 -0
  62. package/dist/config/schema.d.ts +41 -0
  63. package/dist/config/schema.d.ts.map +1 -0
  64. package/dist/config/schema.js +11 -0
  65. package/dist/config/schema.js.map +1 -0
  66. package/dist/domain/filename.d.ts +26 -0
  67. package/dist/domain/filename.d.ts.map +1 -0
  68. package/dist/domain/filename.js +27 -0
  69. package/dist/domain/filename.js.map +1 -0
  70. package/dist/domain/frontmatter.d.ts +38 -0
  71. package/dist/domain/frontmatter.d.ts.map +1 -0
  72. package/dist/domain/frontmatter.js +55 -0
  73. package/dist/domain/frontmatter.js.map +1 -0
  74. package/dist/domain/index.d.ts +4 -0
  75. package/dist/domain/index.d.ts.map +1 -0
  76. package/dist/domain/index.js +4 -0
  77. package/dist/domain/index.js.map +1 -0
  78. package/dist/domain/message.d.ts +7 -0
  79. package/dist/domain/message.d.ts.map +1 -0
  80. package/dist/domain/message.js +4 -0
  81. package/dist/domain/message.js.map +1 -0
  82. package/dist/git/exec.d.ts +12 -0
  83. package/dist/git/exec.d.ts.map +1 -0
  84. package/dist/git/exec.js +45 -0
  85. package/dist/git/exec.js.map +1 -0
  86. package/dist/git/repo.d.ts +19 -0
  87. package/dist/git/repo.d.ts.map +1 -0
  88. package/dist/git/repo.js +76 -0
  89. package/dist/git/repo.js.map +1 -0
  90. package/dist/git/waterline.d.ts +8 -0
  91. package/dist/git/waterline.d.ts.map +1 -0
  92. package/dist/git/waterline.js +14 -0
  93. package/dist/git/waterline.js.map +1 -0
  94. package/dist/index.d.ts +3 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +114 -0
  97. package/dist/index.js.map +1 -0
  98. package/package.json +54 -0
package/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # @t0u9h/agent-git-mail
2
+
3
+ A minimal, git-native async mail system for assistant-style agents.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @t0u9h/agent-git-mail
9
+ ```
10
+
11
+ ## What it is
12
+
13
+ Agent Git Mail is a minimal CLI for git-native async mail between assistant-style agents.
14
+
15
+ ## Status
16
+
17
+ Early v0. Interfaces may still change.
18
+
19
+ Project repo:
20
+ - https://github.com/T0UGH/agent-git-mail
@@ -0,0 +1,7 @@
1
+ export interface ArchiveOptions {
2
+ filename: string;
3
+ agent: string;
4
+ configPath?: string;
5
+ }
6
+ export declare function archiveMessage(opts: ArchiveOptions): Promise<void>;
7
+ //# sourceMappingURL=archive-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-message.d.ts","sourceRoot":"","sources":["../../src/app/archive-message.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxE"}
@@ -0,0 +1,14 @@
1
+ import { GitRepo } from '../git/repo.js';
2
+ import { loadConfig } from '../config/load.js';
3
+ export async function archiveMessage(opts) {
4
+ const config = loadConfig(opts.configPath);
5
+ const agent = config.agents[opts.agent];
6
+ if (!agent)
7
+ throw new Error(`Unknown agent: ${opts.agent}`);
8
+ const repo = new GitRepo(agent.repo_path);
9
+ await repo.moveFile(`inbox/${opts.filename}`, `archive/${opts.filename}`);
10
+ await repo.commit(`agm: archive ${opts.filename}`, `archive/${opts.filename}`);
11
+ // archive MUST push
12
+ await repo.push();
13
+ }
14
+ //# sourceMappingURL=archive-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-message.js","sourceRoot":"","sources":["../../src/app/archive-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQ/C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAoB;IACvD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAE5D,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1E,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/E,oBAAoB;IACpB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface ListOptions {
2
+ agent: string;
3
+ dir?: 'inbox' | 'outbox' | 'archive';
4
+ format?: 'table' | 'json';
5
+ configPath?: string;
6
+ }
7
+ export interface ListEntry {
8
+ filename: string;
9
+ from: string;
10
+ to: string;
11
+ subject: string;
12
+ created_at: string;
13
+ reply_to?: string;
14
+ expects_reply: boolean;
15
+ }
16
+ export declare function listMessages(opts: ListOptions): Promise<ListEntry[]>;
17
+ //# sourceMappingURL=list-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-messages.d.ts","sourceRoot":"","sources":["../../src/app/list-messages.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAiC1E"}
@@ -0,0 +1,37 @@
1
+ import { readdirSync } from 'fs';
2
+ import { resolve } from 'path';
3
+ import { parseFrontmatter } from '../domain/frontmatter.js';
4
+ import { loadConfig } from '../config/load.js';
5
+ export async function listMessages(opts) {
6
+ const config = loadConfig(opts.configPath);
7
+ const agent = config.agents[opts.agent];
8
+ if (!agent)
9
+ throw new Error(`Unknown agent: ${opts.agent}`);
10
+ const dir = opts.dir ?? 'inbox';
11
+ const dirPath = resolve(agent.repo_path, dir);
12
+ let files;
13
+ try {
14
+ files = readdirSync(dirPath).filter(f => f.endsWith('.md'));
15
+ }
16
+ catch {
17
+ return [];
18
+ }
19
+ const entries = [];
20
+ for (const file of files) {
21
+ try {
22
+ const { readFileSync } = await import('fs');
23
+ const raw = readFileSync(resolve(dirPath, file), 'utf-8');
24
+ const parsed = parseFrontmatter(raw);
25
+ if (parsed.ok) {
26
+ entries.push({ filename: file, ...parsed.data });
27
+ }
28
+ }
29
+ catch {
30
+ // skip unparseable
31
+ }
32
+ }
33
+ // Sort by created_at descending
34
+ entries.sort((a, b) => b.created_at.localeCompare(a.created_at));
35
+ return entries;
36
+ }
37
+ //# sourceMappingURL=list-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-messages.js","sourceRoot":"","sources":["../../src/app/list-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAmB/C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAiB;IAClD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAE5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC;IAChC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAE9C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type MessageFrontmatter } from '../domain/frontmatter.js';
2
+ export interface ReadOptions {
3
+ filename: string;
4
+ agent: string;
5
+ dir?: 'inbox' | 'outbox' | 'archive';
6
+ configPath?: string;
7
+ }
8
+ export declare function readMessage(opts: ReadOptions): Promise<{
9
+ frontmatter: MessageFrontmatter;
10
+ body: string;
11
+ }>;
12
+ //# sourceMappingURL=read-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-message.d.ts","sourceRoot":"","sources":["../../src/app/read-message.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAErF,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,WAAW,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAc/G"}
@@ -0,0 +1,18 @@
1
+ import { readFileSync } from 'fs';
2
+ import { resolve } from 'path';
3
+ import { parseFrontmatter } from '../domain/frontmatter.js';
4
+ export async function readMessage(opts) {
5
+ const { loadConfig } = await import('../config/load.js');
6
+ const config = loadConfig(opts.configPath);
7
+ const agent = config.agents[opts.agent];
8
+ if (!agent)
9
+ throw new Error(`Unknown agent: ${opts.agent}`);
10
+ const dir = opts.dir ?? 'inbox';
11
+ const filePath = resolve(agent.repo_path, dir, opts.filename);
12
+ const raw = readFileSync(filePath, 'utf-8');
13
+ const parsed = parseFrontmatter(raw);
14
+ if (!parsed.ok)
15
+ throw new Error(`Cannot parse message: ${parsed.error}`);
16
+ return { frontmatter: parsed.data, body: parsed.body };
17
+ }
18
+ //# sourceMappingURL=read-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-message.js","sourceRoot":"","sources":["../../src/app/read-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAA2B,MAAM,0BAA0B,CAAC;AASrF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAiB;IACjD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAE5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACzE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface ReplyOptions {
2
+ originalFilename: string;
3
+ from: string;
4
+ bodyFile: string;
5
+ dir?: 'inbox' | 'outbox';
6
+ configPath?: string;
7
+ }
8
+ export declare function replyMessage(opts: ReplyOptions): Promise<{
9
+ filename: string;
10
+ }>;
11
+ //# sourceMappingURL=reply-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-message.d.ts","sourceRoot":"","sources":["../../src/app/reply-message.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAqEpF"}
@@ -0,0 +1,83 @@
1
+ import { readFileSync } from 'fs';
2
+ import { resolve } from 'path';
3
+ import { GitRepo } from '../git/repo.js';
4
+ import { generateFilename, generateUniqueSuffix } from '../domain/filename.js';
5
+ import { serializeFrontmatter, parseFrontmatter } from '../domain/frontmatter.js';
6
+ import { loadConfig } from '../config/load.js';
7
+ export async function replyMessage(opts) {
8
+ const config = loadConfig(opts.configPath);
9
+ const fromAgent = config.agents[opts.from];
10
+ if (!fromAgent)
11
+ throw new Error(`Unknown agent: ${opts.from}`);
12
+ const dir = opts.dir ?? 'inbox';
13
+ // Find the original message in sender's outbox or inbox
14
+ const searchDirs = dir === 'outbox'
15
+ ? [resolve(fromAgent.repo_path, 'outbox')]
16
+ : [resolve(fromAgent.repo_path, 'inbox'), resolve(fromAgent.repo_path, 'outbox')];
17
+ let originalPath = null;
18
+ for (const d of searchDirs) {
19
+ const p = resolve(d, opts.originalFilename);
20
+ try {
21
+ readFileSync(p, 'utf-8');
22
+ originalPath = p;
23
+ break;
24
+ }
25
+ catch {
26
+ // try next
27
+ }
28
+ }
29
+ if (!originalPath)
30
+ throw new Error(`Original message not found: ${opts.originalFilename}`);
31
+ const raw = readFileSync(originalPath, 'utf-8');
32
+ const parsed = parseFrontmatter(raw);
33
+ if (!parsed.ok)
34
+ throw new Error(`Cannot parse original message: ${parsed.error}`);
35
+ const original = parsed.data;
36
+ // recipient is whoever sent the original message
37
+ const to = original.from;
38
+ const toAgent = config.agents[to];
39
+ if (!toAgent)
40
+ throw new Error(`Unknown agent: ${to}`);
41
+ const body = readFileSync(resolve(opts.bodyFile), 'utf-8');
42
+ const createdAt = new Date().toISOString().replace(/\.\d{3}/, '').replace(/:/g, '-');
43
+ const suffix = generateUniqueSuffix();
44
+ const filename = generateFilename({ from: opts.from, to, createdAt, suffix });
45
+ const frontmatter = {
46
+ from: opts.from,
47
+ to,
48
+ subject: `Re: ${original.subject}`,
49
+ created_at: createdAt.replace(/-/g, ':').replace('+', '+'),
50
+ reply_to: opts.originalFilename,
51
+ expects_reply: false,
52
+ };
53
+ const senderRepo = new GitRepo(fromAgent.repo_path);
54
+ const recipientRepo = new GitRepo(toAgent.repo_path);
55
+ // Write to sender outbox
56
+ const senderContent = serializeFrontmatter(frontmatter) + '\n\n' + body;
57
+ await writeFileAtomic(resolve(senderRepo['repoPath'], 'outbox', filename), senderContent);
58
+ await senderRepo.add(`outbox/${filename}`);
59
+ await senderRepo.commit(`agm: send ${filename}`, `outbox/${filename}`);
60
+ await maybePush(senderRepo);
61
+ // Write to recipient inbox
62
+ const recipientContent = serializeFrontmatter(frontmatter) + '\n\n' + body;
63
+ await writeFileAtomic(resolve(recipientRepo['repoPath'], 'inbox', filename), recipientContent);
64
+ await recipientRepo.add(`inbox/${filename}`);
65
+ await recipientRepo.commit(`agm: deliver ${filename}`, `inbox/${filename}`);
66
+ await maybePush(recipientRepo);
67
+ return { filename };
68
+ }
69
+ async function maybePush(repo) {
70
+ try {
71
+ await repo.push();
72
+ }
73
+ catch {
74
+ // No remote
75
+ }
76
+ }
77
+ async function writeFileAtomic(path, content) {
78
+ const { writeFileSync, mkdirSync } = await import('fs');
79
+ const { dirname } = await import('path');
80
+ mkdirSync(dirname(path), { recursive: true });
81
+ writeFileSync(path, content, 'utf-8');
82
+ }
83
+ //# sourceMappingURL=reply-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-message.js","sourceRoot":"","sources":["../../src/app/reply-message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Config } from '../config/schema.js';
2
+ export interface DaemonOptions {
3
+ config: Config;
4
+ agentName?: string;
5
+ onNewMail?: (mail: {
6
+ agent: string;
7
+ filename: string;
8
+ from: string;
9
+ }) => Promise<void>;
10
+ }
11
+ export declare function runDaemon(opts: DaemonOptions): Promise<void>;
12
+ //# sourceMappingURL=run-daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-daemon.d.ts","sourceRoot":"","sources":["../../src/app/run-daemon.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxF;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlE"}
@@ -0,0 +1,98 @@
1
+ import { GitRepo } from '../git/repo.js';
2
+ import { GitWaterline } from '../git/waterline.js';
3
+ import { parseFrontmatter } from '../domain/frontmatter.js';
4
+ import { readFileSync } from 'fs';
5
+ import { resolve } from 'path';
6
+ export async function runDaemon(opts) {
7
+ const pollInterval = (opts.config.runtime?.poll_interval_seconds ?? 30) * 1000;
8
+ const agents = opts.agentName
9
+ ? { [opts.agentName]: opts.config.agents[opts.agentName] }
10
+ : opts.config.agents;
11
+ if (opts.onNewMail) {
12
+ // One-shot poll for testing
13
+ await runPoll(Object.entries(agents), opts.onNewMail);
14
+ return;
15
+ }
16
+ // Daemon loop
17
+ while (true) {
18
+ const start = Date.now();
19
+ try {
20
+ for (const [name, agent] of Object.entries(agents)) {
21
+ await watchAgent(name, agent, opts.onNewMail);
22
+ }
23
+ }
24
+ catch (e) {
25
+ console.error('[daemon] poll error:', e);
26
+ }
27
+ const elapsed = Date.now() - start;
28
+ const sleepTime = Math.max(0, pollInterval - elapsed);
29
+ await sleep(sleepTime);
30
+ }
31
+ }
32
+ async function watchAgent(name, agent, onNewMail) {
33
+ const repo = new GitRepo(agent.repo_path);
34
+ const valid = await repo.verify();
35
+ if (!valid)
36
+ return;
37
+ const waterline = new GitWaterline(repo);
38
+ try {
39
+ await repo.pull();
40
+ }
41
+ catch {
42
+ // ignore pull errors
43
+ }
44
+ const currentSha = await repo.getHeadSha();
45
+ const lastSeen = await waterline.read();
46
+ if (!lastSeen) {
47
+ // First run: set waterline, don't backfill
48
+ await waterline.write(currentSha);
49
+ return;
50
+ }
51
+ if (lastSeen === currentSha) {
52
+ // No new commits
53
+ return;
54
+ }
55
+ const diffOutput = await repo.diffNames(lastSeen, currentSha);
56
+ const newInboxFiles = parseDiff(diffOutput);
57
+ for (const filename of newInboxFiles) {
58
+ const from = await extractFrom(resolve(agent.repo_path, 'inbox', filename));
59
+ console.log(`[daemon] new mail for ${name}: from=${from} file=${filename}`);
60
+ if (onNewMail) {
61
+ await onNewMail({ agent: name, filename, from });
62
+ }
63
+ }
64
+ await waterline.write(currentSha);
65
+ }
66
+ async function runPoll(agents, onNewMail) {
67
+ for (const [name, agent] of agents) {
68
+ await watchAgent(name, agent, onNewMail);
69
+ }
70
+ }
71
+ function parseDiff(diffOutput) {
72
+ const files = [];
73
+ for (const line of diffOutput.split('\n')) {
74
+ const trimmed = line.trim();
75
+ if (!trimmed)
76
+ continue;
77
+ const match = trimmed.match(/^A\s+inbox\/(.+)$/);
78
+ if (match)
79
+ files.push(match[1]);
80
+ }
81
+ return files;
82
+ }
83
+ async function extractFrom(filePath) {
84
+ try {
85
+ const raw = readFileSync(filePath, 'utf-8');
86
+ const parsed = parseFrontmatter(raw);
87
+ if (parsed.ok)
88
+ return parsed.data.from;
89
+ }
90
+ catch {
91
+ // fall through
92
+ }
93
+ return 'unknown';
94
+ }
95
+ function sleep(ms) {
96
+ return new Promise(resolve => setTimeout(resolve, ms));
97
+ }
98
+ //# sourceMappingURL=run-daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-daemon.js","sourceRoot":"","sources":["../../src/app/run-daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAS/B,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAmB;IACjD,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,qBAAqB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS;QAC3B,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QAC1D,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAEvB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,4BAA4B;QAC5B,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,cAAc;IACd,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnD,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,IAAY,EACZ,KAA4B,EAC5B,SAAsF;IAEtF,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IAClC,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IAExC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,2CAA2C;QAC3C,MAAM,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,iBAAiB;QACjB,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IAE5C,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,UAAU,IAAI,SAAS,QAAQ,EAAE,CAAC,CAAC;QAC5E,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,MAAyC,EACzC,SAAqF;IAErF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACnC,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,UAAkB;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACjD,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface SendOptions {
2
+ from: string;
3
+ to: string;
4
+ subject: string;
5
+ bodyFile: string;
6
+ replyTo?: string;
7
+ expectsReply?: boolean;
8
+ configPath?: string;
9
+ }
10
+ export declare function sendMessage(opts: SendOptions): Promise<{
11
+ filename: string;
12
+ }>;
13
+ //# sourceMappingURL=send-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-message.d.ts","sourceRoot":"","sources":["../../src/app/send-message.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA0ClF"}
@@ -0,0 +1,59 @@
1
+ import { readFileSync } from 'fs';
2
+ import { resolve } from 'path';
3
+ import { GitRepo } from '../git/repo.js';
4
+ import { generateFilename, generateUniqueSuffix } from '../domain/filename.js';
5
+ import { serializeFrontmatter } from '../domain/frontmatter.js';
6
+ import { loadConfig } from '../config/load.js';
7
+ export async function sendMessage(opts) {
8
+ const config = loadConfig(opts.configPath);
9
+ const fromAgent = config.agents[opts.from];
10
+ const toAgent = config.agents[opts.to];
11
+ if (!fromAgent)
12
+ throw new Error(`Unknown agent: ${opts.from}`);
13
+ if (!toAgent)
14
+ throw new Error(`Unknown agent: ${opts.to}`);
15
+ const body = readFileSync(resolve(opts.bodyFile), 'utf-8');
16
+ const createdAt = new Date().toISOString().replace(/\.\d{3}/, '').replace(/:/g, '-');
17
+ const suffix = generateUniqueSuffix();
18
+ const filename = generateFilename({ from: opts.from, to: opts.to, createdAt, suffix });
19
+ const frontmatter = {
20
+ from: opts.from,
21
+ to: opts.to,
22
+ subject: opts.subject,
23
+ created_at: createdAt.replace(/-/g, ':').replace('+', '+'),
24
+ reply_to: opts.replyTo,
25
+ expects_reply: opts.expectsReply ?? false,
26
+ };
27
+ const senderRepo = new GitRepo(fromAgent.repo_path);
28
+ const recipientRepo = new GitRepo(toAgent.repo_path);
29
+ // Write to sender outbox
30
+ const senderContent = serializeFrontmatter(frontmatter) + '\n\n' + body;
31
+ const outboxPath = resolve(senderRepo['repoPath'], 'outbox', filename);
32
+ await writeFileAtomic(outboxPath, senderContent);
33
+ await senderRepo.add(`outbox/${filename}`);
34
+ await senderRepo.commit(`agm: send ${filename}`, `outbox/${filename}`);
35
+ await maybePush(senderRepo);
36
+ // Write to recipient inbox
37
+ const recipientContent = serializeFrontmatter(frontmatter) + '\n\n' + body;
38
+ const inboxPath = resolve(recipientRepo['repoPath'], 'inbox', filename);
39
+ await writeFileAtomic(inboxPath, recipientContent);
40
+ await recipientRepo.add(`inbox/${filename}`);
41
+ await recipientRepo.commit(`agm: deliver ${filename}`, `inbox/${filename}`);
42
+ await maybePush(recipientRepo);
43
+ return { filename };
44
+ }
45
+ async function maybePush(repo) {
46
+ try {
47
+ await repo.push();
48
+ }
49
+ catch {
50
+ // No remote configured, skip
51
+ }
52
+ }
53
+ async function writeFileAtomic(path, content) {
54
+ const { writeFileSync, mkdirSync } = await import('fs');
55
+ const { dirname } = await import('path');
56
+ mkdirSync(dirname(path), { recursive: true });
57
+ writeFileSync(path, content, 'utf-8');
58
+ }
59
+ //# sourceMappingURL=send-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../src/app/send-message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function cmdArchive(argv: {
2
+ filename: string;
3
+ agent: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/archive.ts"],"names":[],"mappings":"AAEA,wBAAsB,UAAU,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzF"}
@@ -0,0 +1,10 @@
1
+ import { archiveMessage } from '../../app/archive-message.js';
2
+ export async function cmdArchive(argv) {
3
+ await archiveMessage({
4
+ filename: argv.filename,
5
+ agent: argv.agent,
6
+ configPath: undefined,
7
+ });
8
+ console.log(`Archived: ${argv.filename}`);
9
+ }
10
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/cli/commands/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAyC;IACxE,MAAM,cAAc,CAAC;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,UAAU,EAAE,SAAS;KACtB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function cmdConfigShow(): Promise<void>;
2
+ export declare function cmdConfigGet(key: string): Promise<void>;
3
+ export declare function cmdConfigSet(key: string, value: string): Promise<void>;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAOnD;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc7D;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB5E"}
@@ -0,0 +1,48 @@
1
+ import { loadConfigSafe } from '../../config/load.js';
2
+ import { getConfigPath } from '../../config/paths.js';
3
+ import { writeFileSync } from 'fs';
4
+ import { parse as parseYaml } from 'yaml';
5
+ export async function cmdConfigShow() {
6
+ const result = loadConfigSafe();
7
+ if (!result.ok) {
8
+ console.error('Failed to load config:', result.error);
9
+ process.exit(1);
10
+ }
11
+ console.log(JSON.stringify(result.data, null, 2));
12
+ }
13
+ export async function cmdConfigGet(key) {
14
+ const result = loadConfigSafe();
15
+ if (!result.ok) {
16
+ console.error('Failed to load config:', result.error);
17
+ process.exit(1);
18
+ }
19
+ // Navigate dot-notation key
20
+ const keys = key.split('.');
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ let val = result.data;
23
+ for (const k of keys) {
24
+ val = val?.[k];
25
+ }
26
+ console.log(val ?? '');
27
+ }
28
+ export async function cmdConfigSet(key, value) {
29
+ const result = loadConfigSafe();
30
+ if (!result.ok) {
31
+ console.error('Failed to load config:', result.error);
32
+ process.exit(1);
33
+ }
34
+ const config = result.data;
35
+ // Navigate and set
36
+ const keys = key.split('.');
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ let obj = config;
39
+ for (let i = 0; i < keys.length - 1; i++) {
40
+ obj[keys[i]] = obj[keys[i]] ?? {};
41
+ obj = obj[keys[i]];
42
+ }
43
+ obj[keys[keys.length - 1]] = value;
44
+ const path = getConfigPath();
45
+ writeFileSync(path, parseYaml(JSON.stringify(config)), 'utf-8');
46
+ console.log(`Set ${key} = ${value} in ${path}`);
47
+ }
48
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,4BAA4B;IAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,8DAA8D;IAC9D,IAAI,GAAG,GAAQ,MAAM,CAAC,IAAI,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,KAAa;IAC3D,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;IAC3B,mBAAmB;IACnB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,8DAA8D;IAC9D,IAAI,GAAG,GAAQ,MAAM,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACnC,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function cmdList(argv: {
2
+ agent: string;
3
+ dir?: string;
4
+ format?: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAEA,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBnG"}
@@ -0,0 +1,23 @@
1
+ import { listMessages } from '../../app/list-messages.js';
2
+ export async function cmdList(argv) {
3
+ const entries = await listMessages({
4
+ agent: argv.agent,
5
+ dir: argv.dir,
6
+ format: argv.format,
7
+ configPath: undefined,
8
+ });
9
+ if (argv.format === 'json') {
10
+ console.log(JSON.stringify(entries, null, 2));
11
+ return;
12
+ }
13
+ if (entries.length === 0) {
14
+ console.log('(no messages)');
15
+ return;
16
+ }
17
+ console.log(`${'FILENAME'.padEnd(44)} ${'FROM'.padEnd(8)} ${'TO'.padEnd(8)} ${'SUBJECT'}`);
18
+ console.log('─'.repeat(100));
19
+ for (const e of entries) {
20
+ console.log(`${e.filename.padEnd(44)} ${e.from.padEnd(8)} ${e.to.padEnd(8)} ${e.subject}`);
21
+ }
22
+ }
23
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAsD;IAClF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC;QACjC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAiD;QAC3D,MAAM,EAAE,IAAI,CAAC,MAAsC;QACnD,UAAU,EAAE,SAAS;KACtB,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAC9E,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function cmdRead(argv: {
2
+ filename: string;
3
+ agent: string;
4
+ dir?: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/read.ts"],"names":[],"mappings":"AAGA,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpG"}