@chatcops/server 0.4.0 → 0.6.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 (77) hide show
  1. package/README.md +35 -7
  2. package/dist/adapters/ai-sdk.d.ts +12 -0
  3. package/dist/adapters/ai-sdk.d.ts.map +1 -0
  4. package/dist/adapters/ai-sdk.js +27 -0
  5. package/dist/adapters/ai-sdk.js.map +1 -0
  6. package/dist/adapters/cloudflare.d.ts +3 -1
  7. package/dist/adapters/cloudflare.d.ts.map +1 -1
  8. package/dist/adapters/cloudflare.js +11 -58
  9. package/dist/adapters/cloudflare.js.map +1 -1
  10. package/dist/adapters/express.d.ts +6 -2
  11. package/dist/adapters/express.d.ts.map +1 -1
  12. package/dist/adapters/express.js +109 -26
  13. package/dist/adapters/express.js.map +1 -1
  14. package/dist/adapters/index.d.ts +1 -0
  15. package/dist/adapters/index.d.ts.map +1 -1
  16. package/dist/adapters/index.js +1 -0
  17. package/dist/adapters/index.js.map +1 -1
  18. package/dist/adapters/vercel.d.ts.map +1 -1
  19. package/dist/adapters/vercel.js +7 -60
  20. package/dist/adapters/vercel.js.map +1 -1
  21. package/dist/client-ip.d.ts +36 -0
  22. package/dist/client-ip.d.ts.map +1 -0
  23. package/dist/client-ip.js +62 -0
  24. package/dist/client-ip.js.map +1 -0
  25. package/dist/config.d.ts +110 -8
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/config.js +5 -1
  28. package/dist/config.js.map +1 -1
  29. package/dist/handler.d.ts +53 -2
  30. package/dist/handler.d.ts.map +1 -1
  31. package/dist/handler.js +410 -127
  32. package/dist/handler.js.map +1 -1
  33. package/dist/http.d.ts +66 -0
  34. package/dist/http.d.ts.map +1 -0
  35. package/dist/http.js +262 -0
  36. package/dist/http.js.map +1 -0
  37. package/dist/index.d.ts +4 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +2 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/rate-limit.d.ts +5 -0
  42. package/dist/rate-limit.d.ts.map +1 -1
  43. package/dist/rate-limit.js +5 -0
  44. package/dist/rate-limit.js.map +1 -1
  45. package/dist/security/origin-policy.d.ts +19 -0
  46. package/dist/security/origin-policy.d.ts.map +1 -0
  47. package/dist/security/origin-policy.js +58 -0
  48. package/dist/security/origin-policy.js.map +1 -0
  49. package/dist/security/origin.d.ts +5 -0
  50. package/dist/security/origin.d.ts.map +1 -0
  51. package/dist/security/origin.js +47 -0
  52. package/dist/security/origin.js.map +1 -0
  53. package/dist/security/session-token.d.ts +65 -0
  54. package/dist/security/session-token.d.ts.map +1 -0
  55. package/dist/security/session-token.js +338 -0
  56. package/dist/security/session-token.js.map +1 -0
  57. package/dist/security/sessions.d.ts +49 -0
  58. package/dist/security/sessions.d.ts.map +1 -0
  59. package/dist/security/sessions.js +159 -0
  60. package/dist/security/sessions.js.map +1 -0
  61. package/dist/security/startup-checks.d.ts +44 -0
  62. package/dist/security/startup-checks.d.ts.map +1 -0
  63. package/dist/security/startup-checks.js +134 -0
  64. package/dist/security/startup-checks.js.map +1 -0
  65. package/dist/security/turnstile.d.ts +24 -0
  66. package/dist/security/turnstile.d.ts.map +1 -0
  67. package/dist/security/turnstile.js +93 -0
  68. package/dist/security/turnstile.js.map +1 -0
  69. package/dist/visitor-context.d.ts +20 -0
  70. package/dist/visitor-context.d.ts.map +1 -0
  71. package/dist/visitor-context.js +60 -0
  72. package/dist/visitor-context.js.map +1 -0
  73. package/dist/webhook.d.ts +48 -2
  74. package/dist/webhook.d.ts.map +1 -1
  75. package/dist/webhook.js +159 -31
  76. package/dist/webhook.js.map +1 -1
  77. package/package.json +22 -5
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AASpD,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,aAAa,EAAE,EAAE,SAAS,GAAE,MAAmC;IAQ9E,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAQ7C,IAAI;YAmCJ,IAAI;CAcnB"}
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;GAGG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,uFAAuF;IACvF,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;IACR,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AACvD,6EAA6E;AAC7E,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAKnD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,UAAQ,GAAG,GAAG,CAiBrF;AAqCD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,aAAa,EAAE,EAAE,SAAS,GAAE,MAAmC;IAQ9E,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAkB7C,IAAI;CA4CnB;AAoBD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,SAAgC,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7H;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBnB"}
package/dist/webhook.js CHANGED
@@ -1,59 +1,187 @@
1
1
  export const DEFAULT_WEBHOOK_TIMEOUT_MS = 5000;
2
+ export const SIGNATURE_HEADER = 'X-ChatCops-Signature';
3
+ /** Signatures older than this are rejected by `verifyWebhook` by default. */
4
+ export const DEFAULT_SIGNATURE_TOLERANCE_SEC = 300;
5
+ const MAX_ATTEMPTS = 3;
6
+ const MAX_RETRY_AFTER_MS = 10_000;
7
+ /**
8
+ * Throws when a webhook URL isn't safe to call from a server: anything other
9
+ * than https, and hosts on loopback, private or link-local networks (which
10
+ * includes cloud metadata endpoints such as 169.254.169.254). Set
11
+ * `allowPrivateNetwork: true` on the webhook to call one of those on purpose,
12
+ * for example a receiver on localhost during development.
13
+ *
14
+ * Only literal addresses are checked; a hostname that resolves to a private
15
+ * address isn't. Hosted deployments should also block private ranges at the
16
+ * network level.
17
+ */
18
+ export function assertSafeWebhookUrl(rawUrl, allowPrivateNetwork = false) {
19
+ const url = new URL(rawUrl); // throws on invalid URL
20
+ if (allowPrivateNetwork) {
21
+ if (url.protocol !== 'https:' && url.protocol !== 'http:') {
22
+ throw new Error(`Webhook URL must use https or http: ${rawUrl}`);
23
+ }
24
+ return url;
25
+ }
26
+ if (url.protocol !== 'https:') {
27
+ throw new Error(`Webhook URL must use https: ${rawUrl}. Set allowPrivateNetwork: true for a local http receiver.`);
28
+ }
29
+ if (isPrivateHost(url.hostname)) {
30
+ throw new Error(`Webhook URL points at a private or local address: ${rawUrl}. Set allowPrivateNetwork: true if that's intended.`);
31
+ }
32
+ return url;
33
+ }
34
+ function isPrivateHost(hostname) {
35
+ const host = hostname.replace(/^\[|\]$/g, '').toLowerCase();
36
+ if (host === 'localhost' || host.endsWith('.localhost') || host.endsWith('.local') || host.endsWith('.internal')) {
37
+ return true;
38
+ }
39
+ const v4 = host.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
40
+ if (v4) {
41
+ const [a, b] = [Number(v4[1]), Number(v4[2])];
42
+ return (a === 0 || a === 10 || a === 127 ||
43
+ (a === 100 && b >= 64 && b <= 127) || // carrier-grade NAT
44
+ (a === 169 && b === 254) || // link-local, cloud metadata
45
+ (a === 172 && b >= 16 && b <= 31) ||
46
+ (a === 192 && b === 168) ||
47
+ a >= 224 // multicast and reserved
48
+ );
49
+ }
50
+ if (host.includes(':')) {
51
+ if (host === '::' || host === '::1')
52
+ return true;
53
+ // IPv4-mapped addresses. URL parsing turns ::ffff:10.0.0.1 into ::ffff:a00:1.
54
+ const mappedDotted = host.match(/^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/);
55
+ if (mappedDotted)
56
+ return isPrivateHost(mappedDotted[1]);
57
+ const mappedHex = host.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);
58
+ if (mappedHex) {
59
+ const [high, low] = [parseInt(mappedHex[1], 16), parseInt(mappedHex[2], 16)];
60
+ return isPrivateHost(`${high >> 8}.${high & 255}.${low >> 8}.${low & 255}`);
61
+ }
62
+ return /^(fc|fd|fe8|fe9|fea|feb)/.test(host); // unique local, link-local
63
+ }
64
+ return false;
65
+ }
2
66
  export class WebhookDispatcher {
3
67
  configs;
4
- maxRetries = 3;
5
68
  timeoutMs;
6
69
  constructor(configs, timeoutMs = DEFAULT_WEBHOOK_TIMEOUT_MS) {
7
70
  for (const config of configs) {
8
- new URL(config.url); // throws on invalid URL
71
+ assertSafeWebhookUrl(config.url, config.allowPrivateNetwork);
9
72
  }
10
73
  this.configs = configs;
11
74
  this.timeoutMs = timeoutMs;
12
75
  }
13
76
  async dispatch(event, data) {
14
77
  const matching = this.configs.filter((c) => c.events.includes(event) || c.events.includes('*'));
15
- await Promise.allSettled(matching.map((config) => this.send(config, event, data)));
16
- }
17
- async send(config, event, data) {
18
- const payload = {
19
- event,
78
+ if (matching.length === 0)
79
+ return;
80
+ const created = Date.now();
81
+ const envelope = {
82
+ id: `evt_${crypto.randomUUID()}`,
83
+ type: event,
84
+ created,
20
85
  data,
21
- timestamp: Date.now(),
86
+ event,
87
+ timestamp: created,
22
88
  };
23
- if (config.secret) {
24
- payload.signature = await this.sign(JSON.stringify(payload), config.secret);
25
- }
26
- for (let attempt = 0; attempt < this.maxRetries; attempt++) {
89
+ const body = JSON.stringify(envelope);
90
+ await Promise.allSettled(matching.map((config) => this.send(config, envelope, body)));
91
+ }
92
+ async send(config, envelope, body) {
93
+ let lastProblem = '';
94
+ for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
95
+ let retryAfterMs;
27
96
  try {
97
+ const headers = {
98
+ 'Content-Type': 'application/json',
99
+ 'X-ChatCops-Event': envelope.type,
100
+ 'X-ChatCops-Event-Id': envelope.id,
101
+ };
102
+ if (config.secret) {
103
+ headers[SIGNATURE_HEADER] = await signWebhook(body, config.secret);
104
+ }
28
105
  const response = await fetch(config.url, {
29
106
  method: 'POST',
30
- headers: {
31
- 'Content-Type': 'application/json',
32
- ...(payload.signature ? { 'X-ChatCops-Signature': payload.signature } : {}),
33
- },
34
- body: JSON.stringify(payload),
107
+ headers,
108
+ body,
109
+ // A redirect could point anywhere, including a private address.
110
+ redirect: 'manual',
35
111
  signal: AbortSignal.timeout(this.timeoutMs),
36
112
  });
37
113
  if (response.ok)
38
114
  return;
39
- if (response.status >= 400 && response.status < 500)
40
- return; // Don't retry client errors
115
+ lastProblem = `HTTP ${response.status}`;
116
+ const retryable = response.status === 429 || response.status >= 500;
117
+ if (!retryable)
118
+ break;
119
+ retryAfterMs = parseRetryAfter(response.headers.get('Retry-After'));
41
120
  }
42
- catch {
43
- // Retry on network errors
121
+ catch (error) {
122
+ lastProblem = error instanceof Error ? error.name : 'network error';
44
123
  }
45
- if (attempt < this.maxRetries - 1) {
46
- await new Promise((r) => setTimeout(r, Math.pow(2, attempt) * 1000));
124
+ if (attempt < MAX_ATTEMPTS) {
125
+ await new Promise((r) => setTimeout(r, retryAfterMs ?? 2 ** (attempt - 1) * 1000));
47
126
  }
48
127
  }
128
+ // Never log the body or the secret; they can hold lead details.
129
+ console.error(`[chatcops] Webhook delivery failed: ${envelope.type} (${envelope.id}) to ${new URL(config.url).origin}: ${lastProblem}`);
49
130
  }
50
- async sign(payload, secret) {
51
- const encoder = new TextEncoder();
52
- const key = await crypto.subtle.importKey('raw', encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
53
- const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(payload));
54
- return Array.from(new Uint8Array(signature))
55
- .map((b) => b.toString(16).padStart(2, '0'))
56
- .join('');
57
- }
131
+ }
132
+ function parseRetryAfter(value) {
133
+ if (!value)
134
+ return undefined;
135
+ const seconds = Number(value);
136
+ if (!Number.isFinite(seconds) || seconds < 0)
137
+ return undefined;
138
+ return Math.min(seconds * 1000, MAX_RETRY_AFTER_MS);
139
+ }
140
+ async function hmacHex(secret, message) {
141
+ const encoder = new TextEncoder();
142
+ const key = await crypto.subtle.importKey('raw', encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, [
143
+ 'sign',
144
+ ]);
145
+ const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(message));
146
+ return Array.from(new Uint8Array(signature))
147
+ .map((b) => b.toString(16).padStart(2, '0'))
148
+ .join('');
149
+ }
150
+ /**
151
+ * Builds the signature header value for a raw body:
152
+ * `t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<body>">`.
153
+ */
154
+ export async function signWebhook(body, secret, timestampSec = Math.floor(Date.now() / 1000)) {
155
+ return `t=${timestampSec},v1=${await hmacHex(secret, `${timestampSec}.${body}`)}`;
156
+ }
157
+ /**
158
+ * Checks a delivery on the receiving side. Pass the raw request body exactly
159
+ * as received (not re-serialized JSON) and the `X-ChatCops-Signature` header.
160
+ * Returns false for a bad signature or one older than `toleranceSec`.
161
+ */
162
+ export async function verifyWebhook(options) {
163
+ const { body, signature, secret, toleranceSec = DEFAULT_SIGNATURE_TOLERANCE_SEC } = options;
164
+ if (!signature)
165
+ return false;
166
+ const parts = Object.fromEntries(signature.split(',').map((part) => {
167
+ const index = part.indexOf('=');
168
+ return [part.slice(0, index).trim(), part.slice(index + 1).trim()];
169
+ }));
170
+ const timestamp = Number(parts.t);
171
+ if (!Number.isInteger(timestamp) || !parts.v1)
172
+ return false;
173
+ const nowSec = Math.floor((options.now ?? Date.now()) / 1000);
174
+ if (Math.abs(nowSec - timestamp) > toleranceSec)
175
+ return false;
176
+ const expected = await hmacHex(secret, `${timestamp}.${body}`);
177
+ return constantTimeEqual(expected, parts.v1);
178
+ }
179
+ function constantTimeEqual(a, b) {
180
+ if (a.length !== b.length)
181
+ return false;
182
+ let diff = 0;
183
+ for (let i = 0; i < a.length; i++)
184
+ diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
185
+ return diff === 0;
58
186
  }
59
187
  //# sourceMappingURL=webhook.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AACvD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,CAAC;AAEnD,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,mBAAmB,GAAG,KAAK;IAC9E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,wBAAwB;IACrD,IAAI,mBAAmB,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,4DAA4D,CAAC,CAAC;IACrH,CAAC;IACD,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,qDAAqD,MAAM,qDAAqD,CACjH,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5D,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACjH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACtE,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,CACL,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG;YAChC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,oBAAoB;YAC1D,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,6BAA6B;YACzD,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;YACxB,CAAC,IAAI,GAAG,CAAC,yBAAyB;SACnC,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QACjD,8EAA8E;QAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACtE,IAAI,YAAY;YAAE,OAAO,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACzE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7E,OAAO,aAAa,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,2BAA2B;IAC3E,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,OAAO,iBAAiB;IACpB,OAAO,CAAkB;IACzB,SAAS,CAAS;IAE1B,YAAY,OAAwB,EAAE,YAAoB,0BAA0B;QAClF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,IAAa;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAChG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAElC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAiB;YAC7B,EAAE,EAAE,OAAO,MAAM,CAAC,UAAU,EAAE,EAAE;YAChC,IAAI,EAAE,KAAK;YACX,OAAO;YACP,IAAI;YACJ,KAAK;YACL,SAAS,EAAE,OAAO;SACnB,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEtC,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,MAAqB,EAAE,QAAsB,EAAE,IAAY;QAC5E,IAAI,WAAW,GAAG,EAAE,CAAC;QAErB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;YACzD,IAAI,YAAgC,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,OAAO,GAA2B;oBACtC,cAAc,EAAE,kBAAkB;oBAClC,kBAAkB,EAAE,QAAQ,CAAC,IAAI;oBACjC,qBAAqB,EAAE,QAAQ,CAAC,EAAE;iBACnC,CAAC;gBACF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACrE,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;oBACvC,MAAM,EAAE,MAAM;oBACd,OAAO;oBACP,IAAI;oBACJ,gEAAgE;oBAChE,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;iBAC5C,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,EAAE;oBAAE,OAAO;gBACxB,WAAW,GAAG,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAExC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC;gBACpE,IAAI,CAAC,SAAS;oBAAE,MAAM;gBACtB,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;YACtE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,WAAW,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;YACtE,CAAC;YAED,IAAI,OAAO,GAAG,YAAY,EAAE,CAAC;gBAC3B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,OAAO,CAAC,KAAK,CACX,uCAAuC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE,CACzH,CAAC;IACJ,CAAC;CACF;AAED,SAAS,eAAe,CAAC,KAAoB;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,EAAE,kBAAkB,CAAC,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,OAAe;IACpD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE;QACjH,MAAM;KACP,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc,EAAE,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1G,OAAO,KAAK,YAAY,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,GAAG,YAAY,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;AACpF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAMnC;IACC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,+BAA+B,EAAE,GAAG,OAAO,CAAC;IAC5F,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE7B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CACH,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAE5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,YAAY;QAAE,OAAO,KAAK,CAAC;IAE9D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/D,OAAO,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAS,EAAE,CAAS;IAC7C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,IAAI,KAAK,CAAC,CAAC;AACpB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,19 @@
1
1
  {
2
2
  "name": "@chatcops/server",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Server-side handler and adapters for ChatCops",
5
+ "keywords": [
6
+ "chatcops",
7
+ "ai",
8
+ "chatbot",
9
+ "llm",
10
+ "sse",
11
+ "express",
12
+ "vercel",
13
+ "cloudflare-workers"
14
+ ],
15
+ "homepage": "https://chat.codercops.com",
16
+ "bugs": "https://github.com/codercops/chatcops/issues",
5
17
  "type": "module",
6
18
  "main": "dist/index.js",
7
19
  "types": "dist/index.d.ts",
@@ -28,7 +40,7 @@
28
40
  ],
29
41
  "dependencies": {
30
42
  "zod": "^3.24.0",
31
- "@chatcops/core": "0.3.2"
43
+ "@chatcops/core": "0.5.0"
32
44
  },
33
45
  "peerDependencies": {
34
46
  "express": "^4.0.0 || ^5.0.0"
@@ -39,19 +51,24 @@
39
51
  }
40
52
  },
41
53
  "devDependencies": {
54
+ "@types/express": "^5.0.0",
55
+ "ai": "7.0.122",
42
56
  "typescript": "^5.7.0",
43
- "vitest": "^4.1.11",
44
- "@types/express": "^5.0.0"
57
+ "vitest": "^4.1.11"
45
58
  },
46
59
  "repository": {
47
60
  "type": "git",
48
- "url": "https://github.com/codercops/chatcops",
61
+ "url": "git+https://github.com/codercops/chatcops.git",
49
62
  "directory": "packages/server"
50
63
  },
51
64
  "publishConfig": {
52
65
  "access": "public"
53
66
  },
54
67
  "license": "MIT",
68
+ "engines": {
69
+ "node": ">=22"
70
+ },
71
+ "sideEffects": false,
55
72
  "scripts": {
56
73
  "build": "tsc",
57
74
  "typecheck": "tsc --noEmit",