camelagi 0.5.41 → 0.5.45

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 (190) hide show
  1. package/README.md +116 -25
  2. package/dashboard/404.html +1 -0
  3. package/dashboard/__next.__PAGE__.txt +9 -0
  4. package/dashboard/__next._full.txt +19 -0
  5. package/dashboard/__next._head.txt +6 -0
  6. package/dashboard/__next._index.txt +5 -0
  7. package/dashboard/__next._tree.txt +3 -0
  8. package/dashboard/_next/_next/static/T-oVqD_b6KFHCZwRKsnRE/_buildManifest.js +11 -0
  9. package/dashboard/_next/_next/static/T-oVqD_b6KFHCZwRKsnRE/_clientMiddlewareManifest.js +1 -0
  10. package/dashboard/_next/_next/static/T-oVqD_b6KFHCZwRKsnRE/_ssgManifest.js +1 -0
  11. package/dashboard/_next/_next/static/chunks/0.9wqq91a2h.e.js +3 -0
  12. package/dashboard/_next/_next/static/chunks/00-nlsz4ud071.js +11 -0
  13. package/dashboard/_next/_next/static/chunks/00noe7du3vxk9.js +1 -0
  14. package/dashboard/_next/_next/static/chunks/04wr2uisy8870.js +5 -0
  15. package/dashboard/_next/_next/static/chunks/05f.w0h0j~.3g.js +1 -0
  16. package/dashboard/_next/_next/static/chunks/0geaa8~wrpcj6.js +1 -0
  17. package/dashboard/_next/_next/static/chunks/0nrlwe_~wde44.js +1 -0
  18. package/dashboard/_next/_next/static/chunks/12l48lp-434~..js +31 -0
  19. package/dashboard/_next/_next/static/chunks/14qcm-bqojrb9.js +1 -0
  20. package/dashboard/_next/_next/static/chunks/15~vsexhgsteo.js +1 -0
  21. package/dashboard/_next/_next/static/chunks/turbopack-173kubfog5kol.js +1 -0
  22. package/dashboard/_next/static/8Qf-y5Z4kUHAaWZgy3BFF/_buildManifest.js +11 -0
  23. package/dashboard/_next/static/8Qf-y5Z4kUHAaWZgy3BFF/_clientMiddlewareManifest.js +1 -0
  24. package/dashboard/_next/static/8Qf-y5Z4kUHAaWZgy3BFF/_ssgManifest.js +1 -0
  25. package/dashboard/_next/static/IQ8CU45QQ3REnyUqiqjou/_buildManifest.js +11 -0
  26. package/dashboard/_next/static/IQ8CU45QQ3REnyUqiqjou/_clientMiddlewareManifest.js +1 -0
  27. package/dashboard/_next/static/IQ8CU45QQ3REnyUqiqjou/_ssgManifest.js +1 -0
  28. package/dashboard/_next/static/PXgzS7j3kuwIb14Ph3vgL/_buildManifest.js +11 -0
  29. package/dashboard/_next/static/PXgzS7j3kuwIb14Ph3vgL/_clientMiddlewareManifest.js +1 -0
  30. package/dashboard/_next/static/PXgzS7j3kuwIb14Ph3vgL/_ssgManifest.js +1 -0
  31. package/dashboard/_next/static/S6BdJ1Ro25a6twuts7gHi/_buildManifest.js +11 -0
  32. package/dashboard/_next/static/S6BdJ1Ro25a6twuts7gHi/_clientMiddlewareManifest.js +1 -0
  33. package/dashboard/_next/static/S6BdJ1Ro25a6twuts7gHi/_ssgManifest.js +1 -0
  34. package/dashboard/_next/static/T-oVqD_b6KFHCZwRKsnRE/_buildManifest.js +11 -0
  35. package/dashboard/_next/static/T-oVqD_b6KFHCZwRKsnRE/_clientMiddlewareManifest.js +1 -0
  36. package/dashboard/_next/static/T-oVqD_b6KFHCZwRKsnRE/_ssgManifest.js +1 -0
  37. package/dashboard/_next/static/bvUynE5XeBkbLQynmgHa8/_buildManifest.js +11 -0
  38. package/dashboard/_next/static/bvUynE5XeBkbLQynmgHa8/_clientMiddlewareManifest.js +1 -0
  39. package/dashboard/_next/static/bvUynE5XeBkbLQynmgHa8/_ssgManifest.js +1 -0
  40. package/dashboard/_next/static/chunks/0.9wqq91a2h.e.js +3 -0
  41. package/dashboard/_next/static/chunks/00-nlsz4ud071.js +11 -0
  42. package/dashboard/_next/static/chunks/00noe7du3vxk9.js +1 -0
  43. package/dashboard/_next/static/chunks/03~yq9q893hmn.js +1 -0
  44. package/dashboard/_next/static/chunks/04wr2uisy8870.js +5 -0
  45. package/dashboard/_next/static/chunks/05f.w0h0j~.3g.js +1 -0
  46. package/dashboard/_next/static/chunks/08ug0khjvhl6m.js +11 -0
  47. package/dashboard/_next/static/chunks/0d1s5w1cd08~7.js +11 -0
  48. package/dashboard/_next/static/chunks/0geaa8~wrpcj6.js +1 -0
  49. package/dashboard/_next/static/chunks/0lyajo4_yki3f.js +11 -0
  50. package/dashboard/_next/static/chunks/0nrlwe_~wde44.js +1 -0
  51. package/dashboard/_next/static/chunks/0pd15v2_1spxb.js +11 -0
  52. package/dashboard/_next/static/chunks/0vnhcfh7g1u6i.js +11 -0
  53. package/dashboard/_next/static/chunks/0ynuwcqa7w3o..css +2 -0
  54. package/dashboard/_next/static/chunks/11dfqgfbc8fk2.js +11 -0
  55. package/dashboard/_next/static/chunks/12l48lp-434~..js +31 -0
  56. package/dashboard/_next/static/chunks/14qcm-bqojrb9.js +1 -0
  57. package/dashboard/_next/static/chunks/15~vsexhgsteo.js +1 -0
  58. package/dashboard/_next/static/chunks/turbopack-173kubfog5kol.js +1 -0
  59. package/dashboard/_next/static/media/1bffadaabf893a1e-s.16ipb6fqu393i.woff2 +0 -0
  60. package/dashboard/_next/static/media/2bbe8d2671613f1f-s.067x_6k0k23tk.woff2 +0 -0
  61. package/dashboard/_next/static/media/2c55a0e60120577a-s.0bjc5tiuqdqro.woff2 +0 -0
  62. package/dashboard/_next/static/media/5476f68d60460930-s.0wxq9webf.ew4.woff2 +0 -0
  63. package/dashboard/_next/static/media/83afe278b6a6bb3c-s.p.0q-301v4kxxnr.woff2 +0 -0
  64. package/dashboard/_next/static/media/9c72aa0f40e4eef8-s.0m6w47a4e5dy9.woff2 +0 -0
  65. package/dashboard/_next/static/media/ad66f9afd8947f86-s.11u06r12fd6v_.woff2 +0 -0
  66. package/dashboard/_next/static/media/favicon.0x3dzn~oxb6tn.ico +0 -0
  67. package/dashboard/_next/static/uQ6ZB7JlP8tE93mlzKtXM/_buildManifest.js +11 -0
  68. package/dashboard/_next/static/uQ6ZB7JlP8tE93mlzKtXM/_clientMiddlewareManifest.js +1 -0
  69. package/dashboard/_next/static/uQ6ZB7JlP8tE93mlzKtXM/_ssgManifest.js +1 -0
  70. package/dashboard/_not-found/__next._full.txt +16 -0
  71. package/dashboard/_not-found/__next._head.txt +6 -0
  72. package/dashboard/_not-found/__next._index.txt +5 -0
  73. package/dashboard/_not-found/__next._not-found.__PAGE__.txt +5 -0
  74. package/dashboard/_not-found/__next._not-found.txt +5 -0
  75. package/dashboard/_not-found/__next._tree.txt +2 -0
  76. package/dashboard/_not-found.html +1 -0
  77. package/dashboard/_not-found.txt +16 -0
  78. package/dashboard/favicon.ico +0 -0
  79. package/dashboard/file.svg +1 -0
  80. package/dashboard/globe.svg +1 -0
  81. package/dashboard/index.html +1 -1
  82. package/dashboard/index.txt +18 -27
  83. package/dashboard/next.svg +1 -0
  84. package/dashboard/vercel.svg +1 -0
  85. package/dashboard/window.svg +1 -0
  86. package/dist/agent/agent-cursor.js +138 -0
  87. package/dist/agent/agent-cursor.js.map +1 -0
  88. package/dist/agent/agent-sdk.js +6 -2
  89. package/dist/agent/agent-sdk.js.map +1 -1
  90. package/dist/agent/types.js +1 -1
  91. package/dist/agent/types.js.map +1 -1
  92. package/dist/agent.js +11 -7
  93. package/dist/agent.js.map +1 -1
  94. package/dist/cli/cmd-dashboard.js +63 -0
  95. package/dist/cli/cmd-dashboard.js.map +1 -0
  96. package/dist/cli/cmd-projects.js +128 -0
  97. package/dist/cli/cmd-projects.js.map +1 -0
  98. package/dist/cli/cmd-team.js +587 -0
  99. package/dist/cli/cmd-team.js.map +1 -0
  100. package/dist/cli.js +2 -1
  101. package/dist/cli.js.map +1 -1
  102. package/dist/core/config.js +4 -0
  103. package/dist/core/config.js.map +1 -1
  104. package/dist/core/version.js +1 -1
  105. package/dist/extensions/team-coordinator.js +63 -0
  106. package/dist/extensions/team-coordinator.js.map +1 -0
  107. package/dist/gateway/routes.js +167 -3
  108. package/dist/gateway/routes.js.map +1 -1
  109. package/dist/gateway/ws-handler.js +11 -3
  110. package/dist/gateway/ws-handler.js.map +1 -1
  111. package/dist/runtime/orchestrate.js +19 -8
  112. package/dist/runtime/orchestrate.js.map +1 -1
  113. package/dist/serve.js +15 -17
  114. package/dist/serve.js.map +1 -1
  115. package/dist/session.js +14 -2
  116. package/dist/session.js.map +1 -1
  117. package/dist/team.js +203 -0
  118. package/dist/team.js.map +1 -0
  119. package/dist/telegram/dir-browser.js +9 -0
  120. package/dist/telegram/dir-browser.js.map +1 -1
  121. package/dist/telegram/draft-stream.js +4 -2
  122. package/dist/telegram/draft-stream.js.map +1 -1
  123. package/dist/telegram/terminal.js +65 -31
  124. package/dist/telegram/terminal.js.map +1 -1
  125. package/dist/telegram.js +4 -3
  126. package/dist/telegram.js.map +1 -1
  127. package/dist/tools/admin.js +841 -0
  128. package/dist/tools/admin.js.map +1 -0
  129. package/dist/tools/team.js +182 -0
  130. package/dist/tools/team.js.map +1 -0
  131. package/dist/tui/commands.js +15 -0
  132. package/dist/tui/commands.js.map +1 -1
  133. package/dist/tui/components/welcome.js +2 -1
  134. package/dist/tui/components/welcome.js.map +1 -1
  135. package/dist/tui/tui.js +13 -1
  136. package/dist/tui/tui.js.map +1 -1
  137. package/package.json +3 -1
  138. package/dashboard/_next/static/chunks/172-a2787ae03f0db2b4.js +0 -12
  139. package/dashboard/_next/static/chunks/239-49a9ac3789f8c41c.js +0 -1
  140. package/dashboard/_next/static/chunks/255-102f2e5b2e3dc2ef.js +0 -1
  141. package/dashboard/_next/static/chunks/413-89d8e4554f461999.js +0 -1
  142. package/dashboard/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +0 -1
  143. package/dashboard/_next/static/chunks/619-ba102abea3e3d0e4.js +0 -1
  144. package/dashboard/_next/static/chunks/909-aed3aa549e59d0fb.js +0 -1
  145. package/dashboard/_next/static/chunks/app/_not-found/page-121b856ce9a0ddcd.js +0 -1
  146. package/dashboard/_next/static/chunks/app/dashboard/agents/page-aa6e6fb2a1df7d63.js +0 -1
  147. package/dashboard/_next/static/chunks/app/dashboard/chat/page-feeb17fdc08b91e5.js +0 -1
  148. package/dashboard/_next/static/chunks/app/dashboard/config/page-afad9f4da82a343e.js +0 -1
  149. package/dashboard/_next/static/chunks/app/dashboard/layout-853ce5dfe3461735.js +0 -1
  150. package/dashboard/_next/static/chunks/app/dashboard/monitor/page-1b3d112c49b3a383.js +0 -1
  151. package/dashboard/_next/static/chunks/app/dashboard/page-b15605f3b21f7467.js +0 -1
  152. package/dashboard/_next/static/chunks/app/dashboard/sessions/page-e11d3f3e6ad99067.js +0 -1
  153. package/dashboard/_next/static/chunks/app/docs/[slug]/page-baf0632d98082d10.js +0 -1
  154. package/dashboard/_next/static/chunks/app/docs/page-5933496f46ff00ec.js +0 -1
  155. package/dashboard/_next/static/chunks/app/download/page-da533b5f543dfd66.js +0 -1
  156. package/dashboard/_next/static/chunks/app/layout-1112267c08c875b5.js +0 -1
  157. package/dashboard/_next/static/chunks/app/page-d69c17b39431e2c5.js +0 -1
  158. package/dashboard/_next/static/chunks/framework-de98b93a850cfc71.js +0 -1
  159. package/dashboard/_next/static/chunks/main-8d9a106db393efcf.js +0 -1
  160. package/dashboard/_next/static/chunks/main-app-e38cb42677e65e59.js +0 -1
  161. package/dashboard/_next/static/chunks/pages/_app-7d307437aca18ad4.js +0 -1
  162. package/dashboard/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +0 -1
  163. package/dashboard/_next/static/chunks/webpack-b2507a6fba7be451.js +0 -1
  164. package/dashboard/_next/static/css/c60b60dc84892a8b.css +0 -5
  165. package/dashboard/_next/static/css/d4ea3c83e49eb5e1.css +0 -4
  166. package/dashboard/_next/static/jjqY4ybx1hNTX-bnJfS2f/_buildManifest.js +0 -1
  167. package/dashboard/_next/static/jjqY4ybx1hNTX-bnJfS2f/_ssgManifest.js +0 -1
  168. package/dashboard/_next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  169. package/dashboard/_next/static/media/4da3161b738b07dd-s.woff2 +0 -0
  170. package/dashboard/_next/static/media/8d697b304b401681-s.woff2 +0 -0
  171. package/dashboard/_next/static/media/af4bf8399d1aacdf-s.p.woff2 +0 -0
  172. package/dashboard/_next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  173. package/dashboard/_next/static/media/fb526027db1fc1ae-s.woff2 +0 -0
  174. package/dashboard/agents/index.html +0 -1
  175. package/dashboard/agents/index.txt +0 -28
  176. package/dashboard/chat/index.html +0 -1
  177. package/dashboard/chat/index.txt +0 -28
  178. package/dashboard/config/index.html +0 -1
  179. package/dashboard/config/index.txt +0 -28
  180. package/dashboard/monitor/index.html +0 -1
  181. package/dashboard/monitor/index.txt +0 -28
  182. package/dashboard/sessions/index.html +0 -1
  183. package/dashboard/sessions/index.txt +0 -28
  184. package/dist/cli/cmd-install.js +0 -80
  185. package/dist/cli/cmd-install.js.map +0 -1
  186. package/dist/telegram/bot-approval.js +0 -63
  187. package/dist/telegram/bot-approval.js.map +0 -1
  188. package/dist/telegram/pairing.js +0 -138
  189. package/dist/telegram/pairing.js.map +0 -1
  190. /package/dashboard/_next/{static/chunks/polyfills-42372ed130431b0a.js → _next/static/chunks/03~yq9q893hmn.js} +0 -0
@@ -1,80 +0,0 @@
1
- // CLI command: camelagi install — self-install to ~/.camelagi/versions/ with symlinks
2
- import { register } from "./registry.js";
3
- import { VERSION } from "../core/version.js";
4
- import fs from "node:fs";
5
- import path from "node:path";
6
- import os from "node:os";
7
- const VERSIONS_DIR = path.join(os.homedir(), ".camelagi", "versions");
8
- const BIN_DIR = path.join(os.homedir(), ".camelagi", "bin");
9
- register({
10
- name: "install",
11
- description: "Install camelagi to ~/.camelagi/versions/ and add to PATH",
12
- async run() {
13
- // 1. Create directories
14
- fs.mkdirSync(VERSIONS_DIR, { recursive: true });
15
- fs.mkdirSync(BIN_DIR, { recursive: true });
16
- // 2. Copy current binary to versions directory
17
- const currentBin = process.argv[0];
18
- const destBin = path.join(VERSIONS_DIR, VERSION);
19
- try {
20
- fs.copyFileSync(currentBin, destBin);
21
- fs.chmodSync(destBin, 0o755);
22
- }
23
- catch (err) {
24
- console.error(`Failed to copy binary: ${err instanceof Error ? err.message : err}`);
25
- process.exit(1);
26
- }
27
- // 3. Create symlinks in bin directory
28
- const camelLink = path.join(BIN_DIR, "camel");
29
- const camelagiLink = path.join(BIN_DIR, "camelagi");
30
- try {
31
- fs.unlinkSync(camelLink);
32
- }
33
- catch { }
34
- try {
35
- fs.unlinkSync(camelagiLink);
36
- }
37
- catch { }
38
- fs.symlinkSync(destBin, camelLink);
39
- fs.symlinkSync(destBin, camelagiLink);
40
- console.log(` Installed v${VERSION} to ${destBin}`);
41
- // 4. Symlink to /usr/local/bin if possible
42
- try {
43
- if (fs.existsSync("/usr/local/bin")) {
44
- fs.unlinkSync("/usr/local/bin/camel");
45
- }
46
- }
47
- catch { }
48
- try {
49
- if (fs.existsSync("/usr/local/bin")) {
50
- fs.unlinkSync("/usr/local/bin/camelagi");
51
- }
52
- }
53
- catch { }
54
- try {
55
- fs.symlinkSync(destBin, "/usr/local/bin/camel");
56
- fs.symlinkSync(destBin, "/usr/local/bin/camelagi");
57
- console.log(` Linked to /usr/local/bin/`);
58
- }
59
- catch {
60
- // Fallback to shell profile
61
- const shellProfiles = [
62
- path.join(os.homedir(), ".zshrc"),
63
- path.join(os.homedir(), ".bashrc"),
64
- path.join(os.homedir(), ".bash_profile"),
65
- ];
66
- const pathLine = `export PATH="${BIN_DIR}:$PATH" # CamelAGI`;
67
- for (const profile of shellProfiles) {
68
- if (!fs.existsSync(profile))
69
- continue;
70
- const content = fs.readFileSync(profile, "utf-8");
71
- if (content.includes("# CamelAGI"))
72
- continue;
73
- fs.appendFileSync(profile, `\n${pathLine}\n`);
74
- console.log(` Added to PATH in ${profile}`);
75
- break;
76
- }
77
- }
78
- },
79
- });
80
- //# sourceMappingURL=cmd-install.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cmd-install.js","sourceRoot":"","sources":["../../src/cli/cmd-install.ts"],"names":[],"mappings":"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"}
@@ -1,63 +0,0 @@
1
- // Bot approval: admin must approve before a new agent's Telegram bot starts polling.
2
- // When a new agent with a bot token is created, it goes into pending state.
3
- // Admin approves via inline button in admin bot or macOS app → bot starts.
4
- import fs from "node:fs";
5
- import path from "node:path";
6
- import { paths } from "../core/config.js";
7
- const APPROVAL_FILE = path.join(paths.configDir, "bot-approvals.json");
8
- function loadApprovals() {
9
- try {
10
- if (!fs.existsSync(APPROVAL_FILE))
11
- return [];
12
- return JSON.parse(fs.readFileSync(APPROVAL_FILE, "utf-8"));
13
- }
14
- catch {
15
- return [];
16
- }
17
- }
18
- function saveApprovals(approvals) {
19
- fs.mkdirSync(path.dirname(APPROVAL_FILE), { recursive: true });
20
- fs.writeFileSync(APPROVAL_FILE, JSON.stringify(approvals, null, 2));
21
- }
22
- /** Add a bot to the pending approval queue */
23
- export function requestBotApproval(approval) {
24
- const approvals = loadApprovals();
25
- // Replace if already pending for this agent
26
- const idx = approvals.findIndex((a) => a.agentId === approval.agentId);
27
- if (idx !== -1) {
28
- approvals[idx] = approval;
29
- }
30
- else {
31
- approvals.push(approval);
32
- }
33
- saveApprovals(approvals);
34
- }
35
- /** List all pending bot approvals */
36
- export function listPendingBotApprovals() {
37
- return loadApprovals();
38
- }
39
- /** Approve a bot: remove from pending, return the approval for starting */
40
- export function approveBotApproval(agentId) {
41
- const approvals = loadApprovals();
42
- const idx = approvals.findIndex((a) => a.agentId === agentId);
43
- if (idx === -1)
44
- return undefined;
45
- const [approval] = approvals.splice(idx, 1);
46
- saveApprovals(approvals);
47
- return approval;
48
- }
49
- /** Deny a bot: remove from pending */
50
- export function denyBotApproval(agentId) {
51
- const approvals = loadApprovals();
52
- const idx = approvals.findIndex((a) => a.agentId === agentId);
53
- if (idx === -1)
54
- return undefined;
55
- const [approval] = approvals.splice(idx, 1);
56
- saveApprovals(approvals);
57
- return approval;
58
- }
59
- /** Check if an agent has a pending bot approval */
60
- export function hasPendingBotApproval(agentId) {
61
- return loadApprovals().some((a) => a.agentId === agentId);
62
- }
63
- //# sourceMappingURL=bot-approval.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bot-approval.js","sourceRoot":"","sources":["../../src/telegram/bot-approval.ts"],"names":[],"mappings":"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"}
@@ -1,138 +0,0 @@
1
- // Telegram pairing: approval flow for new users
2
- // Unauthorized users get a pairing code, admin approves, user gets access.
3
- import fs from "node:fs";
4
- import path from "node:path";
5
- import { randomBytes } from "node:crypto";
6
- import { paths, saveConfig, loadConfig } from "../core/config.js";
7
- const PAIRING_FILE = path.join(paths.configDir, "pairing.json");
8
- const CODE_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // no O/0/I/1
9
- const CODE_LENGTH = 6;
10
- const TTL_MS = 60 * 60 * 1000; // 1 hour
11
- const MAX_PENDING = 10;
12
- function loadRequests() {
13
- try {
14
- if (!fs.existsSync(PAIRING_FILE))
15
- return [];
16
- const raw = JSON.parse(fs.readFileSync(PAIRING_FILE, "utf-8"));
17
- return raw.map((r) => ({ ...r, status: r.status ?? "pending" }));
18
- }
19
- catch {
20
- return [];
21
- }
22
- }
23
- function saveRequests(requests) {
24
- fs.mkdirSync(path.dirname(PAIRING_FILE), { recursive: true });
25
- fs.writeFileSync(PAIRING_FILE, JSON.stringify(requests, null, 2));
26
- }
27
- function generateCode(existing) {
28
- for (let i = 0; i < 100; i++) {
29
- const bytes = randomBytes(CODE_LENGTH);
30
- const code = Array.from(bytes).map((b) => CODE_ALPHABET[b % CODE_ALPHABET.length]).join("");
31
- if (!existing.has(code))
32
- return code;
33
- }
34
- throw new Error("Failed to generate unique pairing code");
35
- }
36
- /** Prune expired requests */
37
- function prune(requests) {
38
- const now = Date.now();
39
- return requests.filter((r) => now - r.requestedAt < TTL_MS);
40
- }
41
- /** Check if user already has a pending request for this agent */
42
- export function hasPendingRequest(userId, agentId) {
43
- const requests = prune(loadRequests());
44
- return requests.find((r) => r.userId === userId && r.agentId === agentId && r.status === "pending");
45
- }
46
- /** Create a new pairing request. Returns the request with code. */
47
- export function createPairingRequest(userId, agentId, chatId, username, firstName) {
48
- let requests = prune(loadRequests());
49
- // If user already has a pending request for this agent, return it
50
- const existing = requests.find((r) => r.userId === userId && r.agentId === agentId);
51
- if (existing)
52
- return existing;
53
- // Cap pending requests
54
- if (requests.length >= MAX_PENDING) {
55
- requests = requests.slice(-MAX_PENDING + 1);
56
- }
57
- const codes = new Set(requests.map((r) => r.code));
58
- const request = {
59
- code: generateCode(codes),
60
- userId,
61
- username,
62
- firstName,
63
- agentId,
64
- chatId,
65
- requestedAt: Date.now(),
66
- status: "pending",
67
- };
68
- requests.push(request);
69
- saveRequests(requests);
70
- return request;
71
- }
72
- /** Find a request by code */
73
- export function findByCode(code) {
74
- const requests = prune(loadRequests());
75
- return requests.find((r) => r.code === code.toUpperCase());
76
- }
77
- /** List all pending requests */
78
- export function listPendingRequests() {
79
- const requests = prune(loadRequests());
80
- saveRequests(requests); // persist pruned list
81
- return requests.filter((r) => r.status === "pending");
82
- }
83
- /**
84
- * Approve a pairing request: add user to allowedUsers immediately and remove request.
85
- */
86
- export function approveRequest(code) {
87
- const requests = prune(loadRequests());
88
- const idx = requests.findIndex((r) => r.code === code.toUpperCase());
89
- if (idx === -1)
90
- return undefined;
91
- const request = requests[idx];
92
- if (request.status !== "pending")
93
- return undefined;
94
- // Add to allowedUsers immediately
95
- addUserToAllowedList(request);
96
- // Remove request
97
- requests.splice(idx, 1);
98
- saveRequests(requests);
99
- return request;
100
- }
101
- /** Add user to the appropriate allowedUsers list in config */
102
- function addUserToAllowedList(request) {
103
- const config = loadConfig();
104
- const agentId = request.agentId;
105
- if (agentId === "telegram") {
106
- const current = config.telegram.allowedUsers ?? [];
107
- if (!current.includes(request.userId)) {
108
- saveConfig({ telegram: { ...config.telegram, allowedUsers: [...current, request.userId] } });
109
- console.log(`[pairing] Added userId=${request.userId} to telegram.allowedUsers`);
110
- }
111
- }
112
- else {
113
- const agent = config.agents[agentId];
114
- if (agent?.telegram) {
115
- const current = agent.telegram.allowedUsers ?? [];
116
- if (!current.includes(request.userId)) {
117
- const agents = { ...config.agents };
118
- agents[agentId] = {
119
- ...agent,
120
- telegram: { ...agent.telegram, allowedUsers: [...current, request.userId] },
121
- };
122
- saveConfig({ agents });
123
- console.log(`[pairing] Added userId=${request.userId} to agents.${agentId}.telegram.allowedUsers`);
124
- }
125
- }
126
- }
127
- }
128
- /** Deny a pairing request: just remove it */
129
- export function denyRequest(code) {
130
- let requests = prune(loadRequests());
131
- const idx = requests.findIndex((r) => r.code === code.toUpperCase());
132
- if (idx === -1)
133
- return undefined;
134
- const [request] = requests.splice(idx, 1);
135
- saveRequests(requests);
136
- return request;
137
- }
138
- //# sourceMappingURL=pairing.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pairing.js","sourceRoot":"","sources":["../../src/telegram/pairing.ts"],"names":[],"mappings":"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"}