@matthias-hausberger/beige 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/LICENSE.md +8 -0
  2. package/README.md +183 -0
  3. package/dist/channels/registry.d.ts +14 -0
  4. package/dist/channels/registry.d.ts.map +1 -0
  5. package/dist/channels/registry.js +14 -0
  6. package/dist/channels/registry.js.map +1 -0
  7. package/dist/channels/telegram.d.ts +92 -0
  8. package/dist/channels/telegram.d.ts.map +1 -0
  9. package/dist/channels/telegram.js +469 -0
  10. package/dist/channels/telegram.js.map +1 -0
  11. package/dist/channels/tui.d.ts +8 -0
  12. package/dist/channels/tui.d.ts.map +1 -0
  13. package/dist/channels/tui.js +574 -0
  14. package/dist/channels/tui.js.map +1 -0
  15. package/dist/cli.d.ts +23 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +571 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config/loader.d.ts +6 -0
  20. package/dist/config/loader.d.ts.map +1 -0
  21. package/dist/config/loader.js +103 -0
  22. package/dist/config/loader.js.map +1 -0
  23. package/dist/config/loader.spec.d.ts +2 -0
  24. package/dist/config/loader.spec.d.ts.map +1 -0
  25. package/dist/config/loader.spec.js +195 -0
  26. package/dist/config/loader.spec.js.map +1 -0
  27. package/dist/config/schema.d.ts +107 -0
  28. package/dist/config/schema.d.ts.map +1 -0
  29. package/dist/config/schema.js +42 -0
  30. package/dist/config/schema.js.map +1 -0
  31. package/dist/config/schema.spec.d.ts +2 -0
  32. package/dist/config/schema.spec.d.ts.map +1 -0
  33. package/dist/config/schema.spec.js +180 -0
  34. package/dist/config/schema.spec.js.map +1 -0
  35. package/dist/gateway/agent-manager.d.ts +138 -0
  36. package/dist/gateway/agent-manager.d.ts.map +1 -0
  37. package/dist/gateway/agent-manager.js +532 -0
  38. package/dist/gateway/agent-manager.js.map +1 -0
  39. package/dist/gateway/api.d.ts +43 -0
  40. package/dist/gateway/api.d.ts.map +1 -0
  41. package/dist/gateway/api.js +256 -0
  42. package/dist/gateway/api.js.map +1 -0
  43. package/dist/gateway/api.spec.d.ts +2 -0
  44. package/dist/gateway/api.spec.d.ts.map +1 -0
  45. package/dist/gateway/api.spec.js +256 -0
  46. package/dist/gateway/api.spec.js.map +1 -0
  47. package/dist/gateway/audit.d.ts +38 -0
  48. package/dist/gateway/audit.d.ts.map +1 -0
  49. package/dist/gateway/audit.js +82 -0
  50. package/dist/gateway/audit.js.map +1 -0
  51. package/dist/gateway/audit.spec.d.ts +2 -0
  52. package/dist/gateway/audit.spec.d.ts.map +1 -0
  53. package/dist/gateway/audit.spec.js +212 -0
  54. package/dist/gateway/audit.spec.js.map +1 -0
  55. package/dist/gateway/gateway.d.ts +27 -0
  56. package/dist/gateway/gateway.d.ts.map +1 -0
  57. package/dist/gateway/gateway.js +158 -0
  58. package/dist/gateway/gateway.js.map +1 -0
  59. package/dist/gateway/policy.d.ts +27 -0
  60. package/dist/gateway/policy.d.ts.map +1 -0
  61. package/dist/gateway/policy.js +40 -0
  62. package/dist/gateway/policy.js.map +1 -0
  63. package/dist/gateway/policy.spec.d.ts +2 -0
  64. package/dist/gateway/policy.spec.d.ts.map +1 -0
  65. package/dist/gateway/policy.spec.js +121 -0
  66. package/dist/gateway/policy.spec.js.map +1 -0
  67. package/dist/gateway/provider-health.d.ts +83 -0
  68. package/dist/gateway/provider-health.d.ts.map +1 -0
  69. package/dist/gateway/provider-health.js +219 -0
  70. package/dist/gateway/provider-health.js.map +1 -0
  71. package/dist/gateway/provider-health.spec.d.ts +2 -0
  72. package/dist/gateway/provider-health.spec.d.ts.map +1 -0
  73. package/dist/gateway/provider-health.spec.js +278 -0
  74. package/dist/gateway/provider-health.spec.js.map +1 -0
  75. package/dist/gateway/session-settings.d.ts +62 -0
  76. package/dist/gateway/session-settings.d.ts.map +1 -0
  77. package/dist/gateway/session-settings.js +91 -0
  78. package/dist/gateway/session-settings.js.map +1 -0
  79. package/dist/gateway/session-settings.spec.d.ts +2 -0
  80. package/dist/gateway/session-settings.spec.d.ts.map +1 -0
  81. package/dist/gateway/session-settings.spec.js +141 -0
  82. package/dist/gateway/session-settings.spec.js.map +1 -0
  83. package/dist/gateway/sessions.d.ts +68 -0
  84. package/dist/gateway/sessions.d.ts.map +1 -0
  85. package/dist/gateway/sessions.js +177 -0
  86. package/dist/gateway/sessions.js.map +1 -0
  87. package/dist/gateway/sessions.spec.d.ts +2 -0
  88. package/dist/gateway/sessions.spec.d.ts.map +1 -0
  89. package/dist/gateway/sessions.spec.js +190 -0
  90. package/dist/gateway/sessions.spec.js.map +1 -0
  91. package/dist/index.d.ts +11 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +10 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/install.d.ts +39 -0
  96. package/dist/install.d.ts.map +1 -0
  97. package/dist/install.js +144 -0
  98. package/dist/install.js.map +1 -0
  99. package/dist/sandbox/manager.d.ts +63 -0
  100. package/dist/sandbox/manager.d.ts.map +1 -0
  101. package/dist/sandbox/manager.js +294 -0
  102. package/dist/sandbox/manager.js.map +1 -0
  103. package/dist/skills/index.d.ts +2 -0
  104. package/dist/skills/index.d.ts.map +1 -0
  105. package/dist/skills/index.js +2 -0
  106. package/dist/skills/index.js.map +1 -0
  107. package/dist/skills/registry.d.ts +11 -0
  108. package/dist/skills/registry.d.ts.map +1 -0
  109. package/dist/skills/registry.js +86 -0
  110. package/dist/skills/registry.js.map +1 -0
  111. package/dist/skills/registry.spec.d.ts +2 -0
  112. package/dist/skills/registry.spec.d.ts.map +1 -0
  113. package/dist/skills/registry.spec.js +220 -0
  114. package/dist/skills/registry.spec.js.map +1 -0
  115. package/dist/socket/protocol.d.ts +21 -0
  116. package/dist/socket/protocol.d.ts.map +1 -0
  117. package/dist/socket/protocol.js +7 -0
  118. package/dist/socket/protocol.js.map +1 -0
  119. package/dist/socket/protocol.spec.d.ts +2 -0
  120. package/dist/socket/protocol.spec.d.ts.map +1 -0
  121. package/dist/socket/protocol.spec.js +135 -0
  122. package/dist/socket/protocol.spec.js.map +1 -0
  123. package/dist/socket/server.d.ts +21 -0
  124. package/dist/socket/server.d.ts.map +1 -0
  125. package/dist/socket/server.js +133 -0
  126. package/dist/socket/server.js.map +1 -0
  127. package/dist/socket/server.spec.d.ts +2 -0
  128. package/dist/socket/server.spec.d.ts.map +1 -0
  129. package/dist/socket/server.spec.js +333 -0
  130. package/dist/socket/server.spec.js.map +1 -0
  131. package/dist/test/fixtures.d.ts +47 -0
  132. package/dist/test/fixtures.d.ts.map +1 -0
  133. package/dist/test/fixtures.js +144 -0
  134. package/dist/test/fixtures.js.map +1 -0
  135. package/dist/toolkit/index.d.ts +4 -0
  136. package/dist/toolkit/index.d.ts.map +1 -0
  137. package/dist/toolkit/index.js +4 -0
  138. package/dist/toolkit/index.js.map +1 -0
  139. package/dist/toolkit/installer.d.ts +26 -0
  140. package/dist/toolkit/installer.d.ts.map +1 -0
  141. package/dist/toolkit/installer.js +247 -0
  142. package/dist/toolkit/installer.js.map +1 -0
  143. package/dist/toolkit/registry.d.ts +19 -0
  144. package/dist/toolkit/registry.d.ts.map +1 -0
  145. package/dist/toolkit/registry.js +119 -0
  146. package/dist/toolkit/registry.js.map +1 -0
  147. package/dist/toolkit/registry.spec.d.ts +2 -0
  148. package/dist/toolkit/registry.spec.d.ts.map +1 -0
  149. package/dist/toolkit/registry.spec.js +194 -0
  150. package/dist/toolkit/registry.spec.js.map +1 -0
  151. package/dist/toolkit/schema.d.ts +61 -0
  152. package/dist/toolkit/schema.d.ts.map +1 -0
  153. package/dist/toolkit/schema.js +116 -0
  154. package/dist/toolkit/schema.js.map +1 -0
  155. package/dist/toolkit/schema.spec.d.ts +2 -0
  156. package/dist/toolkit/schema.spec.d.ts.map +1 -0
  157. package/dist/toolkit/schema.spec.js +202 -0
  158. package/dist/toolkit/schema.spec.js.map +1 -0
  159. package/dist/tools/core.d.ts +10 -0
  160. package/dist/tools/core.d.ts.map +1 -0
  161. package/dist/tools/core.js +246 -0
  162. package/dist/tools/core.js.map +1 -0
  163. package/dist/tools/core.spec.d.ts +2 -0
  164. package/dist/tools/core.spec.d.ts.map +1 -0
  165. package/dist/tools/core.spec.js +315 -0
  166. package/dist/tools/core.spec.js.map +1 -0
  167. package/dist/tools/registry.d.ts +15 -0
  168. package/dist/tools/registry.d.ts.map +1 -0
  169. package/dist/tools/registry.js +62 -0
  170. package/dist/tools/registry.js.map +1 -0
  171. package/dist/tools/registry.spec.d.ts +2 -0
  172. package/dist/tools/registry.spec.d.ts.map +1 -0
  173. package/dist/tools/registry.spec.js +228 -0
  174. package/dist/tools/registry.spec.js.map +1 -0
  175. package/dist/tools/runner.d.ts +25 -0
  176. package/dist/tools/runner.d.ts.map +1 -0
  177. package/dist/tools/runner.js +35 -0
  178. package/dist/tools/runner.js.map +1 -0
  179. package/dist/tools/runner.spec.d.ts +2 -0
  180. package/dist/tools/runner.spec.d.ts.map +1 -0
  181. package/dist/tools/runner.spec.js +129 -0
  182. package/dist/tools/runner.spec.js.map +1 -0
  183. package/dist/types/session.d.ts +8 -0
  184. package/dist/types/session.d.ts.map +1 -0
  185. package/dist/types/session.js +23 -0
  186. package/dist/types/session.js.map +1 -0
  187. package/package.json +76 -0
  188. package/tools/README.md +1 -0
  189. package/tools/kv/README.md +150 -0
  190. package/tools/kv/index.ts +149 -0
  191. package/tools/kv/tool.json +23 -0
  192. package/tools/message/README.md +53 -0
  193. package/tools/message/index.ts +183 -0
  194. package/tools/message/tool.json +11 -0
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Beige session store.
3
+ *
4
+ * Maps external identifiers (Telegram chat+thread, TUI session name, etc.)
5
+ * to pi session files on disk.
6
+ *
7
+ * Session files are stored at:
8
+ * ~/.beige/sessions/<agent>/<session-id>.jsonl
9
+ *
10
+ * A mapping file tracks which external key maps to which session:
11
+ * ~/.beige/sessions/session-map.json
12
+ */
13
+ export declare class BeigeSessionStore {
14
+ private beigeDir;
15
+ private sessionsDir;
16
+ private mapFile;
17
+ private sessionMap;
18
+ constructor();
19
+ /**
20
+ * Get the session file path for a given key, or undefined if no session exists.
21
+ */
22
+ getSessionFile(key: string): string | undefined;
23
+ /**
24
+ * Create a new session file for a given key and agent.
25
+ * Returns the path to the new session file.
26
+ */
27
+ createSession(key: string, agentName: string): string;
28
+ /**
29
+ * Reset a key's session — creates a new session file.
30
+ * The old session file is kept on disk for history.
31
+ */
32
+ resetSession(key: string, agentName: string): string;
33
+ /**
34
+ * Get the agent name for a session key.
35
+ */
36
+ getAgentName(key: string): string | undefined;
37
+ /**
38
+ * List all sessions for a given agent.
39
+ */
40
+ listSessions(agentName: string): SessionInfo[];
41
+ /**
42
+ * List all sessions across all agents.
43
+ */
44
+ listAllSessions(): SessionInfo[];
45
+ /**
46
+ * Build a session key for Telegram.
47
+ */
48
+ static telegramKey(chatId: number, threadId?: number): string;
49
+ /**
50
+ * Build a session key for TUI.
51
+ */
52
+ static tuiKey(agentName: string, sessionId?: string): string;
53
+ private loadMap;
54
+ private saveMap;
55
+ }
56
+ export interface SessionMapEntry {
57
+ agentName: string;
58
+ sessionFile: string;
59
+ createdAt: string;
60
+ }
61
+ export interface SessionInfo {
62
+ sessionFile: string;
63
+ sessionId: string;
64
+ agentName: string;
65
+ firstMessage: string;
66
+ createdAt: string;
67
+ }
68
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/gateway/sessions.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAkC;;IAUpD;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAY/C;;;OAGG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAiBrD;;;OAGG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAKpD;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI7C;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;IAkB9C;;OAEG;IACH,eAAe,IAAI,WAAW,EAAE;IAehC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAI7D;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAM5D,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,OAAO;CAGhB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,177 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync } from "fs";
2
+ import { resolve } from "path";
3
+ import { homedir } from "os";
4
+ /**
5
+ * Beige session store.
6
+ *
7
+ * Maps external identifiers (Telegram chat+thread, TUI session name, etc.)
8
+ * to pi session files on disk.
9
+ *
10
+ * Session files are stored at:
11
+ * ~/.beige/sessions/<agent>/<session-id>.jsonl
12
+ *
13
+ * A mapping file tracks which external key maps to which session:
14
+ * ~/.beige/sessions/session-map.json
15
+ */
16
+ export class BeigeSessionStore {
17
+ beigeDir;
18
+ sessionsDir;
19
+ mapFile;
20
+ sessionMap;
21
+ constructor() {
22
+ this.beigeDir = resolve(homedir(), ".beige");
23
+ this.sessionsDir = resolve(this.beigeDir, "sessions");
24
+ this.mapFile = resolve(this.sessionsDir, "session-map.json");
25
+ mkdirSync(this.sessionsDir, { recursive: true });
26
+ this.sessionMap = this.loadMap();
27
+ }
28
+ /**
29
+ * Get the session file path for a given key, or undefined if no session exists.
30
+ */
31
+ getSessionFile(key) {
32
+ const entry = this.sessionMap[key];
33
+ if (!entry)
34
+ return undefined;
35
+ // Verify the file still exists
36
+ if (!existsSync(entry.sessionFile)) {
37
+ delete this.sessionMap[key];
38
+ this.saveMap();
39
+ return undefined;
40
+ }
41
+ return entry.sessionFile;
42
+ }
43
+ /**
44
+ * Create a new session file for a given key and agent.
45
+ * Returns the path to the new session file.
46
+ */
47
+ createSession(key, agentName) {
48
+ const agentDir = resolve(this.sessionsDir, agentName);
49
+ mkdirSync(agentDir, { recursive: true });
50
+ const sessionId = generateSessionId();
51
+ const sessionFile = resolve(agentDir, `${sessionId}.jsonl`);
52
+ this.sessionMap[key] = {
53
+ agentName,
54
+ sessionFile,
55
+ createdAt: new Date().toISOString(),
56
+ };
57
+ this.saveMap();
58
+ return sessionFile;
59
+ }
60
+ /**
61
+ * Reset a key's session — creates a new session file.
62
+ * The old session file is kept on disk for history.
63
+ */
64
+ resetSession(key, agentName) {
65
+ // Don't delete old file — keep it for /resume
66
+ return this.createSession(key, agentName);
67
+ }
68
+ /**
69
+ * Get the agent name for a session key.
70
+ */
71
+ getAgentName(key) {
72
+ return this.sessionMap[key]?.agentName;
73
+ }
74
+ /**
75
+ * List all sessions for a given agent.
76
+ */
77
+ listSessions(agentName) {
78
+ const agentDir = resolve(this.sessionsDir, agentName);
79
+ if (!existsSync(agentDir))
80
+ return [];
81
+ const files = readdirSync(agentDir).filter((f) => f.endsWith(".jsonl"));
82
+ return files.map((f) => {
83
+ const filePath = resolve(agentDir, f);
84
+ const firstLine = readFirstLine(filePath);
85
+ return {
86
+ sessionFile: filePath,
87
+ sessionId: f.replace(".jsonl", ""),
88
+ agentName,
89
+ firstMessage: extractFirstMessage(firstLine),
90
+ createdAt: extractTimestamp(firstLine),
91
+ };
92
+ }).sort((a, b) => b.createdAt.localeCompare(a.createdAt)); // newest first
93
+ }
94
+ /**
95
+ * List all sessions across all agents.
96
+ */
97
+ listAllSessions() {
98
+ if (!existsSync(this.sessionsDir))
99
+ return [];
100
+ const agents = readdirSync(this.sessionsDir).filter((f) => {
101
+ const fullPath = resolve(this.sessionsDir, f);
102
+ try {
103
+ return readdirSync(fullPath).some((file) => file.endsWith(".jsonl"));
104
+ }
105
+ catch {
106
+ return false;
107
+ }
108
+ });
109
+ return agents.flatMap((agent) => this.listSessions(agent));
110
+ }
111
+ /**
112
+ * Build a session key for Telegram.
113
+ */
114
+ static telegramKey(chatId, threadId) {
115
+ return threadId ? `telegram:${chatId}:${threadId}` : `telegram:${chatId}`;
116
+ }
117
+ /**
118
+ * Build a session key for TUI.
119
+ */
120
+ static tuiKey(agentName, sessionId) {
121
+ return sessionId ? `tui:${agentName}:${sessionId}` : `tui:${agentName}:default`;
122
+ }
123
+ // ── Private ────────────────────────────────────────────
124
+ loadMap() {
125
+ try {
126
+ return JSON.parse(readFileSync(this.mapFile, "utf-8"));
127
+ }
128
+ catch {
129
+ return {};
130
+ }
131
+ }
132
+ saveMap() {
133
+ writeFileSync(this.mapFile, JSON.stringify(this.sessionMap, null, 2));
134
+ }
135
+ }
136
+ function generateSessionId() {
137
+ const now = new Date();
138
+ const date = now.toISOString().slice(0, 10).replace(/-/g, "");
139
+ const time = now.toISOString().slice(11, 19).replace(/:/g, "");
140
+ const rand = Math.random().toString(36).slice(2, 8);
141
+ return `${date}-${time}-${rand}`;
142
+ }
143
+ function readFirstLine(filePath) {
144
+ try {
145
+ const content = readFileSync(filePath, "utf-8");
146
+ return content.split("\n")[0] || "";
147
+ }
148
+ catch {
149
+ return "";
150
+ }
151
+ }
152
+ function extractFirstMessage(line) {
153
+ try {
154
+ const parsed = JSON.parse(line);
155
+ // pi session files have different entry formats
156
+ if (parsed.content && typeof parsed.content === "string") {
157
+ return parsed.content.slice(0, 100);
158
+ }
159
+ if (parsed.firstMessage) {
160
+ return parsed.firstMessage.slice(0, 100);
161
+ }
162
+ return "(session)";
163
+ }
164
+ catch {
165
+ return "(session)";
166
+ }
167
+ }
168
+ function extractTimestamp(line) {
169
+ try {
170
+ const parsed = JSON.parse(line);
171
+ return parsed.timestamp ? new Date(parsed.timestamp).toISOString() : new Date().toISOString();
172
+ }
173
+ catch {
174
+ return new Date().toISOString();
175
+ }
176
+ }
177
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/gateway/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sessions.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.spec.d.ts","sourceRoot":"","sources":["../../src/gateway/sessions.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,190 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { BeigeSessionStore, } from "./sessions.js";
3
+ import { mkdirSync, rmSync, writeFileSync, existsSync } from "fs";
4
+ import { join, dirname } from "path";
5
+ import { tmpdir } from "os";
6
+ describe("BeigeSessionStore", () => {
7
+ let tempDir;
8
+ let store;
9
+ let originalHome;
10
+ beforeEach(() => {
11
+ tempDir = join(tmpdir(), `beige-session-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
12
+ mkdirSync(tempDir, { recursive: true });
13
+ // Save and override HOME
14
+ originalHome = process.env.HOME;
15
+ process.env.HOME = tempDir;
16
+ store = new BeigeSessionStore();
17
+ });
18
+ afterEach(() => {
19
+ // Restore HOME
20
+ if (originalHome !== undefined) {
21
+ process.env.HOME = originalHome;
22
+ }
23
+ else {
24
+ delete process.env.HOME;
25
+ }
26
+ rmSync(tempDir, { recursive: true, force: true });
27
+ });
28
+ // Helper to create a session with an actual file on disk
29
+ const createSessionWithFile = (key, agentName) => {
30
+ const sessionFile = store.createSession(key, agentName);
31
+ // Create the actual file (the store only creates the mapping)
32
+ writeFileSync(sessionFile, "");
33
+ return sessionFile;
34
+ };
35
+ describe("getSessionFile", () => {
36
+ it("returns undefined for unknown session key", () => {
37
+ const result = store.getSessionFile("unknown-key");
38
+ expect(result).toBeUndefined();
39
+ });
40
+ it("returns session file path for existing session", () => {
41
+ const key = "telegram:123:456";
42
+ const sessionFile = createSessionWithFile(key, "assistant");
43
+ const result = store.getSessionFile(key);
44
+ expect(result).toBe(sessionFile);
45
+ });
46
+ it("returns undefined if session file was deleted", () => {
47
+ const key = "telegram:123:456";
48
+ const sessionFile = createSessionWithFile(key, "assistant");
49
+ // Delete the session file
50
+ rmSync(sessionFile, { force: true });
51
+ const result = store.getSessionFile(key);
52
+ expect(result).toBeUndefined();
53
+ });
54
+ });
55
+ describe("createSession", () => {
56
+ it("creates session file path in correct directory", () => {
57
+ const key = "telegram:123";
58
+ const sessionFile = store.createSession(key, "assistant");
59
+ expect(sessionFile).toContain("assistant");
60
+ expect(sessionFile).toContain(".jsonl");
61
+ // Directory should exist
62
+ expect(existsSync(dirname(sessionFile))).toBe(true);
63
+ });
64
+ it("creates unique session IDs", () => {
65
+ const key1 = "telegram:1";
66
+ const key2 = "telegram:2";
67
+ const file1 = store.createSession(key1, "assistant");
68
+ const file2 = store.createSession(key2, "assistant");
69
+ expect(file1).not.toBe(file2);
70
+ });
71
+ it("creates agent directory if it doesn't exist", () => {
72
+ const key = "telegram:new";
73
+ const sessionFile = store.createSession(key, "new-agent");
74
+ expect(existsSync(dirname(sessionFile))).toBe(true);
75
+ });
76
+ });
77
+ describe("resetSession", () => {
78
+ it("creates new session file for key", () => {
79
+ const key = "telegram:123";
80
+ const originalFile = createSessionWithFile(key, "assistant");
81
+ const newFile = store.resetSession(key, "assistant");
82
+ writeFileSync(newFile, ""); // Create the file
83
+ expect(newFile).not.toBe(originalFile);
84
+ expect(existsSync(originalFile)).toBe(true); // Old file still exists
85
+ expect(existsSync(newFile)).toBe(true);
86
+ });
87
+ it("updates session mapping to new file", () => {
88
+ const key = "telegram:123";
89
+ createSessionWithFile(key, "assistant");
90
+ const newFile = store.resetSession(key, "assistant");
91
+ writeFileSync(newFile, ""); // Create the file
92
+ const currentFile = store.getSessionFile(key);
93
+ expect(currentFile).toBe(newFile);
94
+ });
95
+ });
96
+ describe("getAgentName", () => {
97
+ it("returns agent name for session key", () => {
98
+ store.createSession("telegram:123", "assistant");
99
+ const result = store.getAgentName("telegram:123");
100
+ expect(result).toBe("assistant");
101
+ });
102
+ it("returns undefined for unknown key", () => {
103
+ const result = store.getAgentName("unknown");
104
+ expect(result).toBeUndefined();
105
+ });
106
+ });
107
+ describe("listSessions", () => {
108
+ it("returns empty array for agent with no sessions", () => {
109
+ const sessions = store.listSessions("unknown-agent");
110
+ expect(sessions).toEqual([]);
111
+ });
112
+ it("returns sessions for agent", () => {
113
+ createSessionWithFile("key1", "assistant");
114
+ createSessionWithFile("key2", "assistant");
115
+ const sessions = store.listSessions("assistant");
116
+ expect(sessions.length).toBe(2);
117
+ });
118
+ it("sorts sessions newest first", async () => {
119
+ // Create sessions with slight delay
120
+ createSessionWithFile("session-1", "assistant");
121
+ await new Promise((r) => setTimeout(r, 10));
122
+ createSessionWithFile("session-2", "assistant");
123
+ const sessions = store.listSessions("assistant");
124
+ // Sessions are sorted by createdAt descending (newest first)
125
+ // The second session was created later, so it should be first
126
+ expect(new Date(sessions[0].createdAt).getTime()).toBeGreaterThanOrEqual(new Date(sessions[1].createdAt).getTime());
127
+ });
128
+ it("includes session metadata", () => {
129
+ createSessionWithFile("key", "assistant");
130
+ const sessions = store.listSessions("assistant");
131
+ expect(sessions[0].agentName).toBe("assistant");
132
+ expect(sessions[0].sessionId).toBeTruthy();
133
+ expect(sessions[0].sessionFile).toBeTruthy();
134
+ });
135
+ });
136
+ describe("listAllSessions", () => {
137
+ it("returns sessions across all agents", () => {
138
+ createSessionWithFile("key1", "assistant");
139
+ createSessionWithFile("key2", "researcher");
140
+ const sessions = store.listAllSessions();
141
+ expect(sessions.length).toBe(2);
142
+ const agentNames = sessions.map((s) => s.agentName);
143
+ expect(agentNames).toContain("assistant");
144
+ expect(agentNames).toContain("researcher");
145
+ });
146
+ it("returns empty array when no sessions", () => {
147
+ const sessions = store.listAllSessions();
148
+ expect(sessions).toEqual([]);
149
+ });
150
+ });
151
+ describe("static key builders", () => {
152
+ describe("telegramKey", () => {
153
+ it("builds key for chat without thread", () => {
154
+ const key = BeigeSessionStore.telegramKey(123456);
155
+ expect(key).toBe("telegram:123456");
156
+ });
157
+ it("builds key for chat with thread", () => {
158
+ const key = BeigeSessionStore.telegramKey(123456, 789);
159
+ expect(key).toBe("telegram:123456:789");
160
+ });
161
+ });
162
+ describe("tuiKey", () => {
163
+ it("builds key for agent without session", () => {
164
+ const key = BeigeSessionStore.tuiKey("assistant");
165
+ expect(key).toBe("tui:assistant:default");
166
+ });
167
+ it("builds key for agent with session", () => {
168
+ const key = BeigeSessionStore.tuiKey("assistant", "session-123");
169
+ expect(key).toBe("tui:assistant:session-123");
170
+ });
171
+ });
172
+ });
173
+ describe("persistence", () => {
174
+ it("persists session map across store instances", () => {
175
+ const key = "telegram:persistence-test";
176
+ createSessionWithFile(key, "assistant");
177
+ // Create a new store
178
+ const newStore = new BeigeSessionStore();
179
+ expect(newStore.getSessionFile(key)).toBeDefined();
180
+ expect(newStore.getAgentName(key)).toBe("assistant");
181
+ });
182
+ it("persists session-map.json file", () => {
183
+ const key = "telegram:persist";
184
+ store.createSession(key, "assistant");
185
+ const mapPath = join(tempDir, ".beige", "sessions", "session-map.json");
186
+ expect(existsSync(mapPath)).toBe(true);
187
+ });
188
+ });
189
+ });
190
+ //# sourceMappingURL=sessions.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.spec.js","sourceRoot":"","sources":["../../src/gateway/sessions.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Programmatic entry point.
3
+ * For CLI usage, see src/cli.ts.
4
+ */
5
+ export { Gateway } from "./gateway/gateway.js";
6
+ export { GatewayAPI } from "./gateway/api.js";
7
+ export { loadConfig } from "./config/loader.js";
8
+ export { BeigeSessionStore } from "./gateway/sessions.js";
9
+ export { launchTUI } from "./channels/tui.js";
10
+ export type { BeigeConfig } from "./config/schema.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Programmatic entry point.
3
+ * For CLI usage, see src/cli.ts.
4
+ */
5
+ export { Gateway } from "./gateway/gateway.js";
6
+ export { GatewayAPI } from "./gateway/api.js";
7
+ export { loadConfig } from "./config/loader.js";
8
+ export { BeigeSessionStore } from "./gateway/sessions.js";
9
+ export { launchTUI } from "./channels/tui.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Beige first-time setup.
3
+ *
4
+ * Copies bundled tool packages into ~/.beige/tools/ and writes a default
5
+ * config.json5 when none exists. All operations are safe to re-run: existing
6
+ * files/directories are never overwritten.
7
+ *
8
+ * Source-install detection
9
+ * ────────────────────────
10
+ * When beige is run from a git clone (i.e. the developer installed deps with
11
+ * `npm install` / `pnpm install` but did not publish to npm) there is a `.git`
12
+ * directory sitting next to `package.json`. In that case we skip automatic
13
+ * first-run setup entirely — the developer works directly from the repo.
14
+ *
15
+ * npm-global-install detection
16
+ * ────────────────────────────
17
+ * When installed via `npm install -g beige` there is no `.git` directory in the
18
+ * package root, so `isSourceInstall()` returns false and setup can proceed.
19
+ */
20
+ /**
21
+ * Returns true when beige is being run directly from a git checkout.
22
+ * A `.git` entry at the package root is the canonical signal.
23
+ */
24
+ export declare function isSourceInstall(): boolean;
25
+ export interface SetupResult {
26
+ /** Paths that were newly created. */
27
+ created: string[];
28
+ /** Paths that already existed and were skipped. */
29
+ skipped: string[];
30
+ }
31
+ /**
32
+ * Run beige first-time setup.
33
+ *
34
+ * @param force When true, run even on a source install (used by `beige setup`).
35
+ */
36
+ export declare function runSetup(options?: {
37
+ force?: boolean;
38
+ }): Promise<SetupResult>;
39
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAyBH;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAqED,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mDAAmD;IACnD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CA8CtF"}