@alisio/plugin-google-chat 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/.agents/skills/google-chat-context/SKILL.md +63 -0
  2. package/LICENSE +21 -0
  3. package/README.md +170 -0
  4. package/cover.svg +25 -0
  5. package/dist/commands.d.ts +10 -0
  6. package/dist/commands.d.ts.map +1 -0
  7. package/dist/commands.js +86 -0
  8. package/dist/commands.js.map +1 -0
  9. package/dist/config.d.ts +86 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +179 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/errors.d.ts +22 -0
  14. package/dist/errors.d.ts.map +1 -0
  15. package/dist/errors.js +44 -0
  16. package/dist/errors.js.map +1 -0
  17. package/dist/http.d.ts +66 -0
  18. package/dist/http.d.ts.map +1 -0
  19. package/dist/http.js +208 -0
  20. package/dist/http.js.map +1 -0
  21. package/dist/index.d.ts +49 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +71 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/oauth.d.ts +78 -0
  26. package/dist/oauth.d.ts.map +1 -0
  27. package/dist/oauth.js +290 -0
  28. package/dist/oauth.js.map +1 -0
  29. package/dist/render.d.ts +18 -0
  30. package/dist/render.d.ts.map +1 -0
  31. package/dist/render.js +50 -0
  32. package/dist/render.js.map +1 -0
  33. package/dist/text.d.ts +26 -0
  34. package/dist/text.d.ts.map +1 -0
  35. package/dist/text.js +63 -0
  36. package/dist/text.js.map +1 -0
  37. package/dist/time.d.ts +12 -0
  38. package/dist/time.d.ts.map +1 -0
  39. package/dist/time.js +24 -0
  40. package/dist/time.js.map +1 -0
  41. package/dist/token-set.d.ts +26 -0
  42. package/dist/token-set.d.ts.map +1 -0
  43. package/dist/token-set.js +62 -0
  44. package/dist/token-set.js.map +1 -0
  45. package/dist/token.d.ts +30 -0
  46. package/dist/token.d.ts.map +1 -0
  47. package/dist/token.js +119 -0
  48. package/dist/token.js.map +1 -0
  49. package/dist/toolkit.d.ts +14 -0
  50. package/dist/toolkit.d.ts.map +1 -0
  51. package/dist/toolkit.js +39 -0
  52. package/dist/toolkit.js.map +1 -0
  53. package/dist/tools.d.ts +5 -0
  54. package/dist/tools.d.ts.map +1 -0
  55. package/dist/tools.js +298 -0
  56. package/dist/tools.js.map +1 -0
  57. package/dist/transport.d.ts +36 -0
  58. package/dist/transport.d.ts.map +1 -0
  59. package/dist/transport.js +114 -0
  60. package/dist/transport.js.map +1 -0
  61. package/dist/validation.d.ts +70 -0
  62. package/dist/validation.d.ts.map +1 -0
  63. package/dist/validation.js +201 -0
  64. package/dist/validation.js.map +1 -0
  65. package/dist/version.d.ts +3 -0
  66. package/dist/version.d.ts.map +1 -0
  67. package/dist/version.js +3 -0
  68. package/dist/version.js.map +1 -0
  69. package/package.json +53 -0
package/dist/tools.js ADDED
@@ -0,0 +1,298 @@
1
+ import { array, bounded, joinLines, kv, moreLine, pagingLine, pathText, record, text, } from "./render.js";
2
+ import { frameUntrusted, sanitizeRemoteText } from "./text.js";
3
+ import { externalTool, writeTool } from "./toolkit.js";
4
+ import { parseDeleteMessageInput, parseEditMessageInput, parseListMembershipsInput, parseListMessagesInput, parseListSpacesInput, parseSearchMessagesInput, parseSendMessageInput, } from "./validation.js";
5
+ function objectSchema(properties, required = []) {
6
+ return {
7
+ type: "object",
8
+ additionalProperties: false,
9
+ ...(required.length > 0 ? { required } : {}),
10
+ properties,
11
+ };
12
+ }
13
+ const SPACE_SCHEMA = {
14
+ type: "string",
15
+ minLength: 1,
16
+ maxLength: 250,
17
+ description: 'A space id like "AAAAAAAAAAA" or a resource name like "spaces/AAAAAAAAAAA".',
18
+ };
19
+ const PAGE_TOKEN_SCHEMA = { type: "string", minLength: 1, maxLength: 4096 };
20
+ const MESSAGE_SCHEMA = {
21
+ type: "string",
22
+ minLength: 1,
23
+ maxLength: 420,
24
+ description: 'A full message resource name like "spaces/AAA/messages/BBB".',
25
+ };
26
+ const TEXT_SCHEMA = { type: "string", minLength: 1, maxLength: 32000 };
27
+ /** Build the seven Google Chat tools. Reads are `external`; mutations are `write`. */
28
+ export function createGoogleChatTools(client) {
29
+ const reads = [
30
+ {
31
+ name: "google_chat_list_spaces",
32
+ description: "List Google Chat spaces the authenticated user is a member of, one bounded page per call. Requires OAuth user mode.",
33
+ inputSchema: objectSchema({
34
+ pageSize: { type: "integer", minimum: 1, maximum: 1000 },
35
+ pageToken: PAGE_TOKEN_SCHEMA,
36
+ spaceType: { type: "string", enum: ["SPACE", "GROUP_CHAT", "DIRECT_MESSAGE"] },
37
+ }),
38
+ run: async (input, context) => {
39
+ const parsed = parseListSpacesInput(input);
40
+ const query = {
41
+ pageSize: parsed.pageSize,
42
+ pageToken: parsed.pageToken,
43
+ };
44
+ if (parsed.spaceType !== undefined)
45
+ query.filter = `spaceType = "${parsed.spaceType}"`;
46
+ const value = await client.request({
47
+ method: "GET",
48
+ path: "/v1/spaces",
49
+ query,
50
+ signal: context.signal,
51
+ idempotent: true,
52
+ });
53
+ const payload = record(value) ?? {};
54
+ const spaces = bounded(array(payload.spaces), 25);
55
+ const lines = spaces.shown.map((item) => {
56
+ const name = text(record(item)?.name) ?? "?";
57
+ const type = text(record(item)?.spaceType) ?? text(record(item)?.type) ?? "";
58
+ const display = text(record(item)?.displayName) ?? "";
59
+ return `- ${sanitizeRemoteText(name, 120)}${type ? ` [${sanitizeRemoteText(type, 40)}]` : ""}: ${sanitizeRemoteText(display, 300)}`;
60
+ });
61
+ return frameUntrusted([
62
+ `## Spaces (${spaces.shown.length})`,
63
+ ...lines,
64
+ moreLine(spaces.hidden),
65
+ pagingLine(spaces.shown.length, text(payload.nextPageToken)),
66
+ ].join("\n"));
67
+ },
68
+ },
69
+ {
70
+ name: "google_chat_list_messages",
71
+ description: "List messages in a Google Chat space, newest or oldest first, one bounded page per call. Requires OAuth user mode.",
72
+ inputSchema: objectSchema({
73
+ space: SPACE_SCHEMA,
74
+ pageSize: { type: "integer", minimum: 1, maximum: 1000 },
75
+ pageToken: PAGE_TOKEN_SCHEMA,
76
+ filter: { type: "string", minLength: 1, maxLength: 1024 },
77
+ orderBy: { type: "string", enum: ["createTime ASC", "createTime DESC"] },
78
+ showDeleted: { type: "boolean" },
79
+ }, ["space"]),
80
+ run: async (input, context) => {
81
+ const parsed = parseListMessagesInput(input);
82
+ const value = await client.request({
83
+ method: "GET",
84
+ path: `/v1/${parsed.space}/messages`,
85
+ query: {
86
+ pageSize: parsed.pageSize,
87
+ pageToken: parsed.pageToken,
88
+ filter: parsed.filter,
89
+ orderBy: parsed.orderBy,
90
+ showDeleted: parsed.showDeleted,
91
+ },
92
+ signal: context.signal,
93
+ idempotent: true,
94
+ });
95
+ const payload = record(value) ?? {};
96
+ const messages = bounded(array(payload.messages), 25);
97
+ const lines = messages.shown.map((item) => {
98
+ const name = text(record(item)?.name) ?? "?";
99
+ const sender = pathText(item, "sender", "displayName") ?? "unknown";
100
+ const when = text(record(item)?.createTime) ?? "";
101
+ const body = sanitizeRemoteText(record(item)?.text ?? record(item)?.formattedText ?? record(item)?.argumentText, 1000);
102
+ return `- ${sanitizeRemoteText(name, 160)} ${sanitizeRemoteText(when, 40)} ${sanitizeRemoteText(sender, 80)}: ${body}`;
103
+ });
104
+ return frameUntrusted([
105
+ `## Messages (${messages.shown.length})`,
106
+ ...lines,
107
+ moreLine(messages.hidden),
108
+ pagingLine(messages.shown.length, text(payload.nextPageToken)),
109
+ ].join("\n"));
110
+ },
111
+ },
112
+ {
113
+ name: "google_chat_search_messages",
114
+ description: "Search Google Chat messages the authenticated user can access, using the Chat search filter syntax. Developer Preview and user-auth only.",
115
+ inputSchema: objectSchema({
116
+ query: {
117
+ type: "string",
118
+ minLength: 1,
119
+ maxLength: 1000,
120
+ description: "A Chat search query, for example a phrase or `is_unread()`.",
121
+ },
122
+ sender: {
123
+ type: "string",
124
+ minLength: 1,
125
+ maxLength: 220,
126
+ description: "Optional sender email, user id, or users/{user}; a leading @ is accepted and stripped.",
127
+ },
128
+ pageSize: { type: "integer", minimum: 1, maximum: 100 },
129
+ pageToken: PAGE_TOKEN_SCHEMA,
130
+ orderBy: { type: "string", enum: ["createTime desc", "relevance desc"] },
131
+ view: {
132
+ type: "string",
133
+ enum: ["SEARCH_MESSAGES_VIEW_BASIC", "SEARCH_MESSAGES_VIEW_FULL"],
134
+ },
135
+ }, ["query"]),
136
+ run: async (input, context) => {
137
+ const parsed = parseSearchMessagesInput(input);
138
+ const value = await client.request({
139
+ method: "POST",
140
+ path: "/v1/spaces/-/messages:search",
141
+ body: {
142
+ filter: parsed.filter,
143
+ pageSize: parsed.pageSize,
144
+ ...(parsed.pageToken === undefined ? {} : { pageToken: parsed.pageToken }),
145
+ ...(parsed.orderBy === undefined ? {} : { orderBy: parsed.orderBy }),
146
+ ...(parsed.view === undefined ? {} : { view: parsed.view }),
147
+ },
148
+ signal: context.signal,
149
+ });
150
+ const payload = record(value) ?? {};
151
+ const results = bounded(array(payload.results), 25);
152
+ const lines = results.shown.map((item) => {
153
+ const message = record(record(item)?.message) ?? {};
154
+ const name = text(message.name) ?? "?";
155
+ const sender = pathText(message, "sender", "displayName") ?? "unknown";
156
+ const when = text(message.createTime) ?? "";
157
+ const body = sanitizeRemoteText(message.text ?? message.formattedText ?? message.argumentText, 1000);
158
+ return `- ${sanitizeRemoteText(name, 160)} ${sanitizeRemoteText(when, 40)} ${sanitizeRemoteText(sender, 80)}: ${body}`;
159
+ });
160
+ return frameUntrusted([
161
+ `## Search results (${results.shown.length})`,
162
+ ...lines,
163
+ moreLine(results.hidden),
164
+ pagingLine(results.shown.length, text(payload.nextPageToken)),
165
+ ].join("\n"));
166
+ },
167
+ },
168
+ {
169
+ name: "google_chat_list_memberships",
170
+ description: "List members of a Google Chat space, optionally filtered by role or member type. Requires OAuth user mode.",
171
+ inputSchema: objectSchema({
172
+ space: SPACE_SCHEMA,
173
+ pageSize: { type: "integer", minimum: 1, maximum: 1000 },
174
+ pageToken: PAGE_TOKEN_SCHEMA,
175
+ role: { type: "string", enum: ["ROLE_MEMBER", "ROLE_MANAGER"] },
176
+ memberType: { type: "string", enum: ["HUMAN", "BOT"] },
177
+ }, ["space"]),
178
+ run: async (input, context) => {
179
+ const parsed = parseListMembershipsInput(input);
180
+ const value = await client.request({
181
+ method: "GET",
182
+ path: `/v1/${parsed.space}/members`,
183
+ query: {
184
+ pageSize: parsed.pageSize,
185
+ pageToken: parsed.pageToken,
186
+ filter: parsed.filter,
187
+ },
188
+ signal: context.signal,
189
+ idempotent: true,
190
+ });
191
+ const payload = record(value) ?? {};
192
+ const members = bounded(array(payload.memberships), 25);
193
+ const lines = members.shown.map((item) => {
194
+ const name = text(record(item)?.name) ?? "?";
195
+ const role = text(record(item)?.role) ?? "";
196
+ const type = pathText(item, "member", "type") ?? "";
197
+ const display = pathText(item, "member", "displayName") ?? "";
198
+ const member = pathText(item, "member", "name") ?? "";
199
+ return `- ${sanitizeRemoteText(name, 160)} ${sanitizeRemoteText(role, 40)} [${sanitizeRemoteText(type, 20)}] ${sanitizeRemoteText(display, 120)} ${sanitizeRemoteText(member, 160)}`;
200
+ });
201
+ return frameUntrusted([
202
+ `## Memberships (${members.shown.length})`,
203
+ ...lines,
204
+ moreLine(members.hidden),
205
+ pagingLine(members.shown.length, text(payload.nextPageToken)),
206
+ ].join("\n"));
207
+ },
208
+ },
209
+ ];
210
+ const writes = [
211
+ {
212
+ name: "google_chat_send_message",
213
+ description: "Send a message to a Google Chat space. Uses OAuth user identity when authenticated, otherwise the configured incoming webhook. Supports thread replies.",
214
+ inputSchema: objectSchema({
215
+ space: {
216
+ type: "string",
217
+ minLength: 1,
218
+ maxLength: 250,
219
+ description: "Required in OAuth user mode; with a webhook it must match the webhook's space when provided.",
220
+ },
221
+ text: TEXT_SCHEMA,
222
+ threadKey: {
223
+ type: "string",
224
+ minLength: 1,
225
+ maxLength: 4000,
226
+ description: "Starts or replies to a thread by key.",
227
+ },
228
+ replyOption: {
229
+ type: "string",
230
+ enum: ["REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD", "REPLY_MESSAGE_OR_FAIL"],
231
+ },
232
+ messageId: {
233
+ type: "string",
234
+ pattern: "^client-[a-z0-9-]{1,56}$",
235
+ description: "Client-assigned message id; OAuth user mode only.",
236
+ },
237
+ }, ["text"]),
238
+ run: async (input, context) => {
239
+ const parsed = parseSendMessageInput(input);
240
+ const result = await client.send({
241
+ space: parsed.space,
242
+ text: parsed.text,
243
+ threadKey: parsed.threadKey,
244
+ replyOption: parsed.replyOption,
245
+ messageId: parsed.messageId,
246
+ signal: context.signal,
247
+ });
248
+ const message = record(result.message) ?? {};
249
+ return frameUntrusted(joinLines([
250
+ `Sent via ${result.via}.`,
251
+ kv("Message", text(message.name), 160),
252
+ kv("Thread", pathText(message, "thread", "name"), 160),
253
+ kv("Text", parsed.text, 2000),
254
+ ]));
255
+ },
256
+ },
257
+ {
258
+ name: "google_chat_edit_message",
259
+ description: "Edit the text of a Google Chat message the authenticated user owns. Requires OAuth user mode; only the text field can be changed.",
260
+ inputSchema: objectSchema({ message: MESSAGE_SCHEMA, text: TEXT_SCHEMA }, [
261
+ "message",
262
+ "text",
263
+ ]),
264
+ run: async (input, context) => {
265
+ const parsed = parseEditMessageInput(input);
266
+ const value = await client.request({
267
+ method: "PATCH",
268
+ path: `/v1/${parsed.message}`,
269
+ query: { updateMask: "text" },
270
+ body: { text: parsed.text },
271
+ signal: context.signal,
272
+ });
273
+ const message = record(value) ?? {};
274
+ return frameUntrusted(joinLines([
275
+ `Edited message ${sanitizeRemoteText(parsed.message, 160)}.`,
276
+ kv("Updated", text(message.lastUpdateTime), 40),
277
+ kv("Text", text(message.text) ?? parsed.text, 2000),
278
+ ]));
279
+ },
280
+ },
281
+ {
282
+ name: "google_chat_delete_message",
283
+ description: "Delete a Google Chat message the authenticated user owns. Requires OAuth user mode.",
284
+ inputSchema: objectSchema({ message: MESSAGE_SCHEMA }, ["message"]),
285
+ run: async (input, context) => {
286
+ const parsed = parseDeleteMessageInput(input);
287
+ await client.request({
288
+ method: "DELETE",
289
+ path: `/v1/${parsed.message}`,
290
+ signal: context.signal,
291
+ });
292
+ return `Deleted ${parsed.message}.`;
293
+ },
294
+ },
295
+ ];
296
+ return [...reads.map(externalTool), ...writes.map(writeTool)];
297
+ }
298
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /** Transport seam for tests and embedders; defaults to the global `fetch`. */
2
+ export type Fetcher = typeof fetch;
3
+ export declare const REQUEST_TIMEOUT_MS = 30000;
4
+ export declare const MAX_RESPONSE_BYTES: number;
5
+ export declare const MAX_RETRY_AFTER_SECONDS = 3600;
6
+ export interface RawRequest {
7
+ fetcher: Fetcher;
8
+ method: "GET" | "POST" | "PATCH" | "DELETE";
9
+ url: string;
10
+ headers: Record<string, string>;
11
+ body?: string;
12
+ signal: AbortSignal;
13
+ /** The single origin this request is allowed to reach. */
14
+ origin: string;
15
+ }
16
+ export interface RawResponse {
17
+ status: number;
18
+ headers: Headers;
19
+ text: string;
20
+ redirected: boolean;
21
+ url: string;
22
+ }
23
+ /**
24
+ * Perform one bounded HTTP request against a fixed origin. No redirects are
25
+ * followed, no cookies, proxy, or user agent are set, the host signal is
26
+ * combined with a hard timeout, and the body is read through a byte cap that
27
+ * cancels the reader on overflow. The raw URL, headers, and body never appear in
28
+ * a thrown message.
29
+ */
30
+ export declare function rawRequest(spec: RawRequest): Promise<RawResponse>;
31
+ /**
32
+ * Parse a bounded `Retry-After` header (seconds or HTTP-date) without ever
33
+ * sleeping on it. HTTP-dates are interpreted with the supplied current time.
34
+ */
35
+ export declare function retryAfterSeconds(headers: Headers, now: number, maximum: number): number | undefined;
36
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,MAAM,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC;AAEnC,eAAO,MAAM,kBAAkB,QAAS,CAAC;AACzC,eAAO,MAAM,kBAAkB,QAAc,CAAC;AAC9C,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAqCvE;AAuCD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAYpB"}
@@ -0,0 +1,114 @@
1
+ import { GoogleChatError } from "./errors.js";
2
+ export const REQUEST_TIMEOUT_MS = 30_000;
3
+ export const MAX_RESPONSE_BYTES = 1024 * 1024;
4
+ export const MAX_RETRY_AFTER_SECONDS = 3600;
5
+ /**
6
+ * Perform one bounded HTTP request against a fixed origin. No redirects are
7
+ * followed, no cookies, proxy, or user agent are set, the host signal is
8
+ * combined with a hard timeout, and the body is read through a byte cap that
9
+ * cancels the reader on overflow. The raw URL, headers, and body never appear in
10
+ * a thrown message.
11
+ */
12
+ export async function rawRequest(spec) {
13
+ const signal = AbortSignal.any([spec.signal, AbortSignal.timeout(REQUEST_TIMEOUT_MS)]);
14
+ let response;
15
+ try {
16
+ const init = {
17
+ method: spec.method,
18
+ redirect: "error",
19
+ headers: spec.headers,
20
+ signal,
21
+ };
22
+ if (spec.body !== undefined)
23
+ init.body = spec.body;
24
+ response = await spec.fetcher(spec.url, init);
25
+ }
26
+ catch (error) {
27
+ if (error instanceof GoogleChatError)
28
+ throw error;
29
+ throw new GoogleChatError("temporarily unavailable");
30
+ }
31
+ if (response.redirected)
32
+ throw new GoogleChatError("invalid response", "redirected");
33
+ const finalUrl = response.url;
34
+ if (finalUrl !== "") {
35
+ let origin;
36
+ try {
37
+ origin = new URL(finalUrl).origin;
38
+ }
39
+ catch {
40
+ throw new GoogleChatError("invalid response");
41
+ }
42
+ if (origin !== spec.origin)
43
+ throw new GoogleChatError("invalid response", "unexpected destination");
44
+ }
45
+ return {
46
+ status: response.status,
47
+ headers: response.headers,
48
+ text: await readBounded(response),
49
+ redirected: response.redirected,
50
+ url: finalUrl,
51
+ };
52
+ }
53
+ /** Read a response body with a hard byte cap, cancelling the reader on overflow. */
54
+ async function readBounded(response) {
55
+ const body = response.body;
56
+ if (!body) {
57
+ const text = await response.text();
58
+ if (Buffer.byteLength(text, "utf8") > MAX_RESPONSE_BYTES)
59
+ throw new GoogleChatError("response exceeded limit");
60
+ return text;
61
+ }
62
+ const reader = body.getReader();
63
+ const chunks = [];
64
+ let bytes = 0;
65
+ try {
66
+ for (;;) {
67
+ const { done, value } = await reader.read();
68
+ if (done)
69
+ break;
70
+ if (!value)
71
+ continue;
72
+ bytes += value.byteLength;
73
+ if (bytes > MAX_RESPONSE_BYTES) {
74
+ await reader.cancel().catch(() => undefined);
75
+ throw new GoogleChatError("response exceeded limit");
76
+ }
77
+ chunks.push(value);
78
+ }
79
+ }
80
+ catch (error) {
81
+ if (error instanceof GoogleChatError)
82
+ throw error;
83
+ throw new GoogleChatError("temporarily unavailable");
84
+ }
85
+ finally {
86
+ try {
87
+ reader.releaseLock();
88
+ }
89
+ catch {
90
+ // The reader is already closed or cancelled; nothing to release.
91
+ }
92
+ }
93
+ return Buffer.concat(chunks).toString("utf8");
94
+ }
95
+ /**
96
+ * Parse a bounded `Retry-After` header (seconds or HTTP-date) without ever
97
+ * sleeping on it. HTTP-dates are interpreted with the supplied current time.
98
+ */
99
+ export function retryAfterSeconds(headers, now, maximum) {
100
+ const raw = headers.get("retry-after");
101
+ if (raw === null)
102
+ return undefined;
103
+ const trimmed = raw.trim();
104
+ if (/^[0-9]{1,10}$/.test(trimmed)) {
105
+ const seconds = Number.parseInt(trimmed, 10);
106
+ return seconds >= 0 ? Math.min(seconds, maximum) : undefined;
107
+ }
108
+ const when = Date.parse(trimmed);
109
+ if (Number.isNaN(when))
110
+ return undefined;
111
+ const seconds = Math.ceil((when - now) / 1000);
112
+ return seconds > 0 ? Math.min(seconds, maximum) : undefined;
113
+ }
114
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /** Stable identifier grammars shared by the JSON schemas and local validation. */
2
+ export declare const PATTERNS: {
3
+ readonly spaceId: RegExp;
4
+ readonly messageName: RegExp;
5
+ readonly userReference: RegExp;
6
+ readonly pageToken: RegExp;
7
+ readonly clientMessageId: RegExp;
8
+ };
9
+ /** Google Chat's documented maximum message size. */
10
+ export declare const MAX_MESSAGE_BYTES = 32000;
11
+ export declare function invalid(detail: string): never;
12
+ /** Reject unknown fields so every tool object is closed. */
13
+ export declare function parseInput(input: unknown, allowed: readonly string[]): Record<string, unknown>;
14
+ /** Accept a bare space id or a `spaces/{id}` resource name; return the latter. */
15
+ export declare function normalizeSpace(value: unknown): string;
16
+ /** Require a full `spaces/{space}/messages/{message}` resource name. */
17
+ export declare function normalizeMessageName(value: unknown): string;
18
+ /**
19
+ * Normalize a user reference to `users/{user}`. Accepts an email, a user id, a
20
+ * `users/{user}` resource name, and a leading `@` (the Chat mention form).
21
+ */
22
+ export declare function normalizeUserReference(value: unknown): string;
23
+ export interface ListSpacesInput {
24
+ pageSize: number;
25
+ pageToken: string | undefined;
26
+ spaceType: "SPACE" | "GROUP_CHAT" | "DIRECT_MESSAGE" | undefined;
27
+ }
28
+ export declare function parseListSpacesInput(input: unknown): ListSpacesInput;
29
+ export interface ListMessagesInput {
30
+ space: string;
31
+ pageSize: number;
32
+ pageToken: string | undefined;
33
+ filter: string | undefined;
34
+ orderBy: "createTime ASC" | "createTime DESC" | undefined;
35
+ showDeleted: boolean | undefined;
36
+ }
37
+ export declare function parseListMessagesInput(input: unknown): ListMessagesInput;
38
+ export interface SearchMessagesInput {
39
+ filter: string;
40
+ pageSize: number;
41
+ pageToken: string | undefined;
42
+ orderBy: "createTime desc" | "relevance desc" | undefined;
43
+ view: "SEARCH_MESSAGES_VIEW_BASIC" | "SEARCH_MESSAGES_VIEW_FULL" | undefined;
44
+ }
45
+ export declare function parseSearchMessagesInput(input: unknown): SearchMessagesInput;
46
+ export interface ListMembershipsInput {
47
+ space: string;
48
+ pageSize: number;
49
+ pageToken: string | undefined;
50
+ filter: string | undefined;
51
+ }
52
+ export declare function parseListMembershipsInput(input: unknown): ListMembershipsInput;
53
+ export interface SendMessageInput {
54
+ space: string | undefined;
55
+ text: string;
56
+ threadKey: string | undefined;
57
+ replyOption: "REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD" | "REPLY_MESSAGE_OR_FAIL" | undefined;
58
+ messageId: string | undefined;
59
+ }
60
+ export declare function parseSendMessageInput(input: unknown): SendMessageInput;
61
+ export interface EditMessageInput {
62
+ message: string;
63
+ text: string;
64
+ }
65
+ export declare function parseEditMessageInput(input: unknown): EditMessageInput;
66
+ export interface DeleteMessageInput {
67
+ message: string;
68
+ }
69
+ export declare function parseDeleteMessageInput(input: unknown): DeleteMessageInput;
70
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}