@cogitator-ai/channels 0.2.5 → 0.4.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 (133) hide show
  1. package/README.md +142 -40
  2. package/dist/assistant-config.d.ts +1 -0
  3. package/dist/assistant-config.d.ts.map +1 -1
  4. package/dist/assistant-config.js +1 -0
  5. package/dist/assistant-config.js.map +1 -1
  6. package/dist/channels/discord.d.ts +4 -0
  7. package/dist/channels/discord.d.ts.map +1 -1
  8. package/dist/channels/discord.js +123 -59
  9. package/dist/channels/discord.js.map +1 -1
  10. package/dist/channels/slack.d.ts +9 -0
  11. package/dist/channels/slack.d.ts.map +1 -1
  12. package/dist/channels/slack.js +153 -34
  13. package/dist/channels/slack.js.map +1 -1
  14. package/dist/channels/telegram.d.ts +13 -0
  15. package/dist/channels/telegram.d.ts.map +1 -1
  16. package/dist/channels/telegram.js +206 -111
  17. package/dist/channels/telegram.js.map +1 -1
  18. package/dist/channels/terminal.d.ts +10 -0
  19. package/dist/channels/terminal.d.ts.map +1 -1
  20. package/dist/channels/terminal.js +46 -10
  21. package/dist/channels/terminal.js.map +1 -1
  22. package/dist/channels/webchat.d.ts +7 -2
  23. package/dist/channels/webchat.d.ts.map +1 -1
  24. package/dist/channels/webchat.js +112 -50
  25. package/dist/channels/webchat.js.map +1 -1
  26. package/dist/channels/whatsapp.d.ts +19 -3
  27. package/dist/channels/whatsapp.d.ts.map +1 -1
  28. package/dist/channels/whatsapp.js +204 -66
  29. package/dist/channels/whatsapp.js.map +1 -1
  30. package/dist/cron.d.ts +2 -0
  31. package/dist/cron.d.ts.map +1 -0
  32. package/dist/cron.js +9 -0
  33. package/dist/cron.js.map +1 -0
  34. package/dist/envelope.d.ts.map +1 -1
  35. package/dist/envelope.js +7 -6
  36. package/dist/envelope.js.map +1 -1
  37. package/dist/formatters/code-protect.d.ts +2 -0
  38. package/dist/formatters/code-protect.d.ts.map +1 -0
  39. package/dist/formatters/code-protect.js +12 -0
  40. package/dist/formatters/code-protect.js.map +1 -0
  41. package/dist/formatters/markdown.d.ts +1 -1
  42. package/dist/formatters/markdown.d.ts.map +1 -1
  43. package/dist/formatters/markdown.js +79 -21
  44. package/dist/formatters/markdown.js.map +1 -1
  45. package/dist/formatters/whatsapp-markdown.d.ts.map +1 -1
  46. package/dist/formatters/whatsapp-markdown.js +7 -21
  47. package/dist/formatters/whatsapp-markdown.js.map +1 -1
  48. package/dist/gateway.d.ts +32 -3
  49. package/dist/gateway.d.ts.map +1 -1
  50. package/dist/gateway.js +275 -174
  51. package/dist/gateway.js.map +1 -1
  52. package/dist/heartbeat.d.ts +9 -2
  53. package/dist/heartbeat.d.ts.map +1 -1
  54. package/dist/heartbeat.js +121 -84
  55. package/dist/heartbeat.js.map +1 -1
  56. package/dist/inbound-debounce.js +2 -2
  57. package/dist/inbound-debounce.js.map +1 -1
  58. package/dist/index.d.ts +6 -3
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +2 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/media/audio-format.d.ts +3 -0
  63. package/dist/media/audio-format.d.ts.map +1 -0
  64. package/dist/media/audio-format.js +20 -0
  65. package/dist/media/audio-format.js.map +1 -0
  66. package/dist/media/deepgram-stt.d.ts +1 -1
  67. package/dist/media/deepgram-stt.d.ts.map +1 -1
  68. package/dist/media/deepgram-stt.js +4 -3
  69. package/dist/media/deepgram-stt.js.map +1 -1
  70. package/dist/media/media-processor.d.ts +12 -1
  71. package/dist/media/media-processor.d.ts.map +1 -1
  72. package/dist/media/media-processor.js +75 -18
  73. package/dist/media/media-processor.js.map +1 -1
  74. package/dist/media/whisper-api.d.ts.map +1 -1
  75. package/dist/media/whisper-api.js +21 -33
  76. package/dist/media/whisper-api.js.map +1 -1
  77. package/dist/media/whisper-local.d.ts +1 -0
  78. package/dist/media/whisper-local.d.ts.map +1 -1
  79. package/dist/media/whisper-local.js +106 -50
  80. package/dist/media/whisper-local.js.map +1 -1
  81. package/dist/message-queue.d.ts +1 -0
  82. package/dist/message-queue.d.ts.map +1 -1
  83. package/dist/message-queue.js +17 -10
  84. package/dist/message-queue.js.map +1 -1
  85. package/dist/middleware/auto-extract.d.ts +2 -0
  86. package/dist/middleware/auto-extract.d.ts.map +1 -1
  87. package/dist/middleware/auto-extract.js +94 -30
  88. package/dist/middleware/auto-extract.js.map +1 -1
  89. package/dist/middleware/dm-policy.d.ts +2 -1
  90. package/dist/middleware/dm-policy.d.ts.map +1 -1
  91. package/dist/middleware/dm-policy.js +26 -27
  92. package/dist/middleware/dm-policy.js.map +1 -1
  93. package/dist/middleware/owner-commands.d.ts +1 -1
  94. package/dist/middleware/owner-commands.d.ts.map +1 -1
  95. package/dist/middleware/owner-commands.js +8 -7
  96. package/dist/middleware/owner-commands.js.map +1 -1
  97. package/dist/middleware/pairing-codes.d.ts +12 -0
  98. package/dist/middleware/pairing-codes.d.ts.map +1 -0
  99. package/dist/middleware/pairing-codes.js +26 -0
  100. package/dist/middleware/pairing-codes.js.map +1 -0
  101. package/dist/middleware/pairing.d.ts +3 -3
  102. package/dist/middleware/pairing.d.ts.map +1 -1
  103. package/dist/middleware/pairing.js +18 -25
  104. package/dist/middleware/pairing.js.map +1 -1
  105. package/dist/middleware/rate-limit.d.ts +3 -1
  106. package/dist/middleware/rate-limit.d.ts.map +1 -1
  107. package/dist/middleware/rate-limit.js +21 -6
  108. package/dist/middleware/rate-limit.js.map +1 -1
  109. package/dist/runtime-builder.d.ts +11 -0
  110. package/dist/runtime-builder.d.ts.map +1 -1
  111. package/dist/runtime-builder.js +212 -62
  112. package/dist/runtime-builder.js.map +1 -1
  113. package/dist/simple-timer-store.d.ts +6 -0
  114. package/dist/simple-timer-store.d.ts.map +1 -1
  115. package/dist/simple-timer-store.js +8 -1
  116. package/dist/simple-timer-store.js.map +1 -1
  117. package/dist/stream-buffer.d.ts +14 -7
  118. package/dist/stream-buffer.d.ts.map +1 -1
  119. package/dist/stream-buffer.js +129 -84
  120. package/dist/stream-buffer.js.map +1 -1
  121. package/dist/tools/path-guard.d.ts +4 -0
  122. package/dist/tools/path-guard.d.ts.map +1 -0
  123. package/dist/tools/path-guard.js +53 -0
  124. package/dist/tools/path-guard.js.map +1 -0
  125. package/dist/tools/self-config.d.ts +12 -2
  126. package/dist/tools/self-config.d.ts.map +1 -1
  127. package/dist/tools/self-config.js +53 -16
  128. package/dist/tools/self-config.js.map +1 -1
  129. package/package.json +27 -21
  130. package/dist/media/index.d.ts +0 -7
  131. package/dist/media/index.d.ts.map +0 -1
  132. package/dist/media/index.js +0 -5
  133. package/dist/media/index.js.map +0 -1
@@ -1,6 +1,7 @@
1
- import { nanoid } from 'nanoid';
1
+ import { findPendingByUser, generatePairingCode, isPairCommand, parsePairCommand, prunePending, } from './pairing-codes.js';
2
2
  export class PairingMiddleware {
3
3
  name = 'pairing';
4
+ ownerKeys = new Set();
4
5
  approved = new Set();
5
6
  pending = new Map();
6
7
  codeLength;
@@ -9,57 +10,49 @@ export class PairingMiddleware {
9
10
  this.codeLength = config.codeLength ?? 6;
10
11
  this.expiresIn = (config.expiresIn ?? 300) * 1000;
11
12
  for (const [channelType, ownerId] of Object.entries(config.ownerIds)) {
12
- this.approved.add(`${channelType}:${ownerId}`);
13
+ const key = `${channelType}:${ownerId}`;
14
+ this.ownerKeys.add(key);
15
+ this.approved.add(key);
13
16
  }
14
17
  }
15
18
  async handle(msg, ctx, next) {
16
19
  const userKey = `${msg.channelType}:${msg.userId}`;
20
+ const now = Date.now();
21
+ prunePending(this.pending, now);
22
+ if (this.ownerKeys.has(userKey) && isPairCommand(msg.text)) {
23
+ await this.handleApproval(msg, ctx);
24
+ return;
25
+ }
17
26
  if (this.approved.has(userKey)) {
18
- if (msg.text.startsWith('/pair ')) {
19
- await this.handleApproval(msg, ctx);
20
- return;
21
- }
22
27
  await next();
23
28
  return;
24
29
  }
25
- const existing = this.findPendingByUser(userKey);
26
- if (existing && existing.expiresAt > Date.now()) {
30
+ const existing = findPendingByUser(this.pending, userKey);
31
+ if (existing) {
27
32
  await ctx.channel.sendText(msg.channelId, `Waiting for approval. Your code: \`${existing.code}\``);
28
33
  return;
29
34
  }
30
- const code = nanoid(this.codeLength).toUpperCase();
35
+ const code = generatePairingCode(this.codeLength);
31
36
  this.pending.set(code, {
32
37
  code,
33
38
  userId: msg.userId,
34
39
  channelType: msg.channelType,
35
- expiresAt: Date.now() + this.expiresIn,
40
+ expiresAt: now + this.expiresIn,
36
41
  });
37
42
  await ctx.channel.sendText(msg.channelId, `Hi! Ask the bot owner to approve you with: \`/pair ${code}\``);
38
43
  }
39
44
  async handleApproval(msg, ctx) {
40
- const code = msg.text.replace('/pair ', '').trim().toUpperCase();
41
- const pairing = this.pending.get(code);
42
- if (!pairing) {
45
+ const code = parsePairCommand(msg.text);
46
+ const pairing = code ? this.pending.get(code) : undefined;
47
+ if (!code || !pairing) {
43
48
  await ctx.channel.sendText(msg.channelId, 'Invalid or expired pairing code.');
44
49
  return;
45
50
  }
46
- if (pairing.expiresAt < Date.now()) {
47
- this.pending.delete(code);
48
- await ctx.channel.sendText(msg.channelId, 'Pairing code expired.');
49
- return;
50
- }
51
51
  const userKey = `${pairing.channelType}:${pairing.userId}`;
52
52
  this.approved.add(userKey);
53
53
  this.pending.delete(code);
54
54
  await ctx.channel.sendText(msg.channelId, `User approved (${userKey}).`);
55
55
  }
56
- findPendingByUser(userKey) {
57
- for (const p of this.pending.values()) {
58
- if (`${p.channelType}:${p.userId}` === userKey)
59
- return p;
60
- }
61
- return undefined;
62
- }
63
56
  isApproved(channelType, userId) {
64
57
  return this.approved.has(`${channelType}:${userId}`);
65
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pairing.js","sourceRoot":"","sources":["../../src/middleware/pairing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pairing.js","sourceRoot":"","sources":["../../src/middleware/pairing.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,YAAY,GAEb,MAAM,iBAAiB,CAAC;AAQzB,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,SAAS,CAAC;IACT,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAC7B,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,UAAU,CAAS;IACnB,SAAS,CAAS;IAEnC,YAAY,MAAqB;QAC/B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;QAElD,KAAK,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrE,MAAM,GAAG,GAAG,GAAG,WAAW,IAAI,OAAO,EAAE,CAAC;YACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAmB,EACnB,GAAsB,EACtB,IAAyB;QAEzB,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CACxB,GAAG,CAAC,SAAS,EACb,sCAAsC,QAAQ,CAAC,IAAI,IAAI,CACxD,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;YACrB,IAAI;YACJ,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,SAAS;SAChC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CACxB,GAAG,CAAC,SAAS,EACb,sDAAsD,IAAI,IAAI,CAC/D,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAAmB,EAAE,GAAsB;QACtE,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1D,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE1B,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,kBAAkB,OAAO,IAAI,CAAC,CAAC;IAC3E,CAAC;IAED,UAAU,CAAC,WAAmB,EAAE,MAAc;QAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,WAAW,IAAI,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;CACF;AAED,MAAM,UAAU,OAAO,CAAC,MAAqB;IAC3C,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
@@ -6,9 +6,11 @@ export interface RateLimitConfig {
6
6
  export declare class RateLimitMiddleware implements GatewayMiddleware {
7
7
  private readonly config;
8
8
  readonly name = "rate-limit";
9
- private buckets;
9
+ private readonly buckets;
10
+ private lastSweep;
10
11
  constructor(config: RateLimitConfig);
11
12
  handle(msg: ChannelMessage, ctx: MiddlewareContext, next: () => Promise<void>): Promise<void>;
13
+ private sweep;
12
14
  }
13
15
  export declare function rateLimit(config: RateLimitConfig): GatewayMiddleware;
14
16
  //# sourceMappingURL=rate-limit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEhG,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,qBAAa,mBAAoB,YAAW,iBAAiB;IAI/C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,OAAO,CAAC,OAAO,CAAiC;gBAEnB,MAAM,EAAE,eAAe;IAE9C,MAAM,CACV,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACxB,OAAO,CAAC,IAAI,CAAC;CAwBjB;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB,CAEpE"}
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEhG,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD,qBAAa,mBAAoB,YAAW,iBAAiB;IAK/C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,SAAS,CAAK;gBAEO,MAAM,EAAE,eAAe;IAE9C,MAAM,CACV,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACxB,OAAO,CAAC,IAAI,CAAC;IA8BhB,OAAO,CAAC,KAAK;CASd;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB,CAEpE"}
@@ -1,29 +1,44 @@
1
+ const WINDOW_MS = 60_000;
1
2
  export class RateLimitMiddleware {
2
3
  config;
3
4
  name = 'rate-limit';
4
5
  buckets = new Map();
6
+ lastSweep = 0;
5
7
  constructor(config) {
6
8
  this.config = config;
7
9
  }
8
10
  async handle(msg, ctx, next) {
9
11
  const userKey = `${msg.channelType}:${msg.userId}`;
10
12
  const now = Date.now();
11
- const windowMs = 60_000;
13
+ this.sweep(now);
12
14
  let bucket = this.buckets.get(userKey);
13
15
  if (!bucket) {
14
- bucket = { timestamps: [] };
16
+ bucket = { timestamps: [], notified: false };
15
17
  this.buckets.set(userKey, bucket);
16
18
  }
17
- bucket.timestamps = bucket.timestamps.filter((t) => now - t < windowMs);
19
+ bucket.timestamps = bucket.timestamps.filter((t) => now - t < WINDOW_MS);
18
20
  if (bucket.timestamps.length >= this.config.maxPerMinute) {
19
- const replyText = this.config.message ??
20
- `Rate limit exceeded. Please wait a moment before sending another message.`;
21
- await ctx.channel.sendText(msg.channelId, replyText);
21
+ if (!bucket.notified) {
22
+ bucket.notified = true;
23
+ await ctx.channel.sendText(msg.channelId, this.config.message ??
24
+ 'Rate limit exceeded. Please wait a moment before sending another message.');
25
+ }
22
26
  return;
23
27
  }
28
+ bucket.notified = false;
24
29
  bucket.timestamps.push(now);
25
30
  await next();
26
31
  }
32
+ sweep(now) {
33
+ if (now - this.lastSweep < WINDOW_MS)
34
+ return;
35
+ this.lastSweep = now;
36
+ for (const [key, bucket] of this.buckets) {
37
+ if (bucket.timestamps.every((t) => now - t >= WINDOW_MS)) {
38
+ this.buckets.delete(key);
39
+ }
40
+ }
41
+ }
27
42
  }
28
43
  export function rateLimit(config) {
29
44
  return new RateLimitMiddleware(config);
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,mBAAmB;IAID;IAHpB,IAAI,GAAG,YAAY,CAAC;IACrB,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEhD,YAA6B,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAExD,KAAK,CAAC,MAAM,CACV,GAAmB,EACnB,GAAsB,EACtB,IAAyB;QAEzB,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,CAAC;QAExB,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QAExE,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzD,MAAM,SAAS,GACb,IAAI,CAAC,MAAM,CAAC,OAAO;gBACnB,2EAA2E,CAAC;YAC9E,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;CACF;AAED,MAAM,UAAU,SAAS,CAAC,MAAuB;IAC/C,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAYA,MAAM,SAAS,GAAG,MAAM,CAAC;AAEzB,MAAM,OAAO,mBAAmB;IAKD;IAJpB,IAAI,GAAG,YAAY,CAAC;IACZ,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IACjD,SAAS,GAAG,CAAC,CAAC;IAEtB,YAA6B,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAExD,KAAK,CAAC,MAAM,CACV,GAAmB,EACnB,GAAsB,EACtB,IAAyB;QAEzB,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEhB,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;QAEzE,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACvB,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CACxB,GAAG,CAAC,SAAS,EACb,IAAI,CAAC,MAAM,CAAC,OAAO;oBACjB,2EAA2E,CAC9E,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,GAAW;QACvB,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,SAAS;YAAE,OAAO;QAC7C,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,SAAS,CAAC,MAAuB;IAC/C,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC"}
@@ -17,16 +17,27 @@ export interface RuntimeBuilderOpts {
17
17
  stringifyYaml: (o: unknown) => string;
18
18
  validateConfig: (o: unknown) => unknown;
19
19
  };
20
+ /**
21
+ * Invoked when the assistant needs to restart (config change, `/restart`).
22
+ * Defaults to exiting the process with code 78, which `cogitator up` treats as a restart request.
23
+ */
24
+ onRestart?: () => void;
20
25
  }
26
+ export declare const RESTART_EXIT_CODE = 78;
21
27
  export declare class RuntimeBuilder {
22
28
  private config;
23
29
  private env;
24
30
  private opts?;
25
31
  constructor(config: AssistantConfig, env: Record<string, string | undefined>, opts?: RuntimeBuilderOpts | undefined);
26
32
  build(): Promise<BuiltRuntime>;
33
+ private requestRestart;
34
+ private collectOwnerIds;
35
+ private resolveFileSystemRoots;
36
+ private buildMemoryBackends;
27
37
  private createExtractorBackend;
28
38
  private wireBrowser;
29
39
  private ensurePlaywright;
40
+ private playwrightCacheDir;
30
41
  private wireRAG;
31
42
  private wireMCPServers;
32
43
  private resolveEmbeddingConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-builder.d.ts","sourceRoot":"","sources":["../src/runtime-builder.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,EACL,SAAS,EAUV,MAAM,oBAAoB,CAAC;AAY5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAkBjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAOD,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAClC,aAAa,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;QACtC,cAAc,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;KACzC,CAAC;CACH;AAED,qBAAa,cAAc;IAEvB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,IAAI,CAAC;gBAFL,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,IAAI,CAAC,EAAE,kBAAkB,YAAA;IAG7B,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC;IA6PpC,OAAO,CAAC,sBAAsB;YAqBhB,WAAW;YAiEX,gBAAgB;YAchB,OAAO;YAqDP,cAAc;IA6B5B,OAAO,CAAC,sBAAsB;IAkC9B,OAAO,KAAK,WAAW,GAItB;IAED,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,aAAa;IAuCrB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,iBAAiB;IA+FzB,OAAO,CAAC,gBAAgB;YAaV,kBAAkB;IAgBhC,OAAO,CAAC,eAAe;CAOxB"}
1
+ {"version":3,"file":"runtime-builder.d.ts","sourceRoot":"","sources":["../src/runtime-builder.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,EACL,SAAS,EAUV,MAAM,oBAAoB,CAAC;AAe5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAkBjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAgBD,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAClC,aAAa,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;QACtC,cAAc,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;KACzC,CAAC;IACF;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,iBAAiB,KAAK,CAAC;AA2BpC,qBAAa,cAAc;IAEvB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,IAAI,CAAC;gBAFL,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,IAAI,CAAC,EAAE,kBAAkB,YAAA;IAG7B,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC;IA6SpC,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,sBAAsB;YAMhB,mBAAmB;IAoDjC,OAAO,CAAC,sBAAsB;YAqBhB,WAAW;YAiEX,gBAAgB;IAQ9B,OAAO,CAAC,kBAAkB;YAeZ,OAAO;YA4DP,cAAc;IAoC5B,OAAO,CAAC,sBAAsB;IAkC9B,OAAO,KAAK,WAAW,GAItB;IAED,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,aAAa;IAuCrB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,iBAAiB;IA0FzB,OAAO,CAAC,gBAAgB;YAaV,kBAAkB;IAgBhC,OAAO,CAAC,eAAe;CAOxB"}