@aaronsb/google-workspace-mcp 4.2.1 → 4.3.2
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.
- package/README.md +6 -5
- package/build/accounts/auth.d.ts +18 -2
- package/build/accounts/auth.js +31 -7
- package/build/accounts/auth.js.map +1 -1
- package/build/accounts/credentials.d.ts +20 -0
- package/build/accounts/credentials.js.map +1 -1
- package/build/accounts/oauth.d.ts +51 -1
- package/build/accounts/oauth.js +69 -5
- package/build/accounts/oauth.js.map +1 -1
- package/build/accounts/registry.d.ts +2 -1
- package/build/accounts/registry.js +2 -2
- package/build/accounts/registry.js.map +1 -1
- package/build/factory/manifest/contacts.yaml +247 -0
- package/build/factory/manifest/meet.yaml +78 -0
- package/build/factory/patches.js +2 -0
- package/build/factory/patches.js.map +1 -1
- package/build/factory/safety.js +4 -0
- package/build/factory/safety.js.map +1 -1
- package/build/google/descriptor.d.ts +8 -0
- package/build/google/descriptor.js +9 -2
- package/build/google/descriptor.js.map +1 -1
- package/build/google/descriptor.json +1883 -0
- package/build/google/methods.d.ts +4 -1
- package/build/server/handler.js +16 -1
- package/build/server/handler.js.map +1 -1
- package/build/server/handlers/accounts.js +100 -6
- package/build/server/handlers/accounts.js.map +1 -1
- package/build/server/queue.d.ts +1 -1
- package/build/server/queue.js +16 -1
- package/build/server/queue.js.map +1 -1
- package/build/server/tools.js +31 -1
- package/build/server/tools.js.map +1 -1
- package/build/services/contacts/patch.d.ts +31 -0
- package/build/services/contacts/patch.js +496 -0
- package/build/services/contacts/patch.js.map +1 -0
- package/build/services/meet/patch.js +202 -0
- package/build/services/meet/patch.js.map +1 -1
- package/build/version.d.ts +1 -1
- package/build/version.js +1 -1
- package/package.json +1 -1
|
@@ -19,12 +19,14 @@ export type DriveMethod = 'about.get' | 'accessproposals.get' | 'accessproposals
|
|
|
19
19
|
export type GmailMethod = 'users.drafts.create' | 'users.drafts.delete' | 'users.drafts.get' | 'users.drafts.list' | 'users.drafts.send' | 'users.drafts.update' | 'users.getProfile' | 'users.history.list' | 'users.labels.create' | 'users.labels.delete' | 'users.labels.get' | 'users.labels.list' | 'users.labels.patch' | 'users.labels.update' | 'users.messages.attachments.get' | 'users.messages.batchDelete' | 'users.messages.batchModify' | 'users.messages.delete' | 'users.messages.get' | 'users.messages.import' | 'users.messages.insert' | 'users.messages.list' | 'users.messages.modify' | 'users.messages.send' | 'users.messages.trash' | 'users.messages.untrash' | 'users.settings.cse.identities.create' | 'users.settings.cse.identities.delete' | 'users.settings.cse.identities.get' | 'users.settings.cse.identities.list' | 'users.settings.cse.identities.patch' | 'users.settings.cse.keypairs.create' | 'users.settings.cse.keypairs.disable' | 'users.settings.cse.keypairs.enable' | 'users.settings.cse.keypairs.get' | 'users.settings.cse.keypairs.list' | 'users.settings.cse.keypairs.obliterate' | 'users.settings.delegates.create' | 'users.settings.delegates.delete' | 'users.settings.delegates.get' | 'users.settings.delegates.list' | 'users.settings.filters.create' | 'users.settings.filters.delete' | 'users.settings.filters.get' | 'users.settings.filters.list' | 'users.settings.forwardingAddresses.create' | 'users.settings.forwardingAddresses.delete' | 'users.settings.forwardingAddresses.get' | 'users.settings.forwardingAddresses.list' | 'users.settings.getAutoForwarding' | 'users.settings.getImap' | 'users.settings.getLanguage' | 'users.settings.getPop' | 'users.settings.getVacation' | 'users.settings.sendAs.create' | 'users.settings.sendAs.delete' | 'users.settings.sendAs.get' | 'users.settings.sendAs.list' | 'users.settings.sendAs.patch' | 'users.settings.sendAs.smimeInfo.delete' | 'users.settings.sendAs.smimeInfo.get' | 'users.settings.sendAs.smimeInfo.insert' | 'users.settings.sendAs.smimeInfo.list' | 'users.settings.sendAs.smimeInfo.setDefault' | 'users.settings.sendAs.update' | 'users.settings.sendAs.verify' | 'users.settings.updateAutoForwarding' | 'users.settings.updateImap' | 'users.settings.updateLanguage' | 'users.settings.updatePop' | 'users.settings.updateVacation' | 'users.stop' | 'users.threads.delete' | 'users.threads.get' | 'users.threads.list' | 'users.threads.modify' | 'users.threads.trash' | 'users.threads.untrash' | 'users.watch';
|
|
20
20
|
/** 18 methods declared by Google for meet v2. */
|
|
21
21
|
export type MeetMethod = 'conferenceRecords.get' | 'conferenceRecords.list' | 'conferenceRecords.participants.get' | 'conferenceRecords.participants.list' | 'conferenceRecords.participants.participantSessions.get' | 'conferenceRecords.participants.participantSessions.list' | 'conferenceRecords.recordings.get' | 'conferenceRecords.recordings.list' | 'conferenceRecords.smartNotes.get' | 'conferenceRecords.smartNotes.list' | 'conferenceRecords.transcripts.entries.get' | 'conferenceRecords.transcripts.entries.list' | 'conferenceRecords.transcripts.get' | 'conferenceRecords.transcripts.list' | 'spaces.create' | 'spaces.endActiveConference' | 'spaces.get' | 'spaces.patch';
|
|
22
|
+
/** 24 methods declared by Google for people v1. */
|
|
23
|
+
export type PeopleMethod = 'contactGroups.batchGet' | 'contactGroups.create' | 'contactGroups.delete' | 'contactGroups.get' | 'contactGroups.list' | 'contactGroups.members.modify' | 'contactGroups.update' | 'otherContacts.copyOtherContactToMyContactsGroup' | 'otherContacts.list' | 'otherContacts.search' | 'people.batchCreateContacts' | 'people.batchDeleteContacts' | 'people.batchUpdateContacts' | 'people.connections.list' | 'people.createContact' | 'people.deleteContact' | 'people.deleteContactPhoto' | 'people.get' | 'people.getBatchGet' | 'people.listDirectoryPeople' | 'people.searchContacts' | 'people.searchDirectoryPeople' | 'people.updateContact' | 'people.updateContactPhoto';
|
|
22
24
|
/** 17 methods declared by Google for sheets v4. */
|
|
23
25
|
export type SheetsMethod = 'spreadsheets.batchUpdate' | 'spreadsheets.create' | 'spreadsheets.developerMetadata.get' | 'spreadsheets.developerMetadata.search' | 'spreadsheets.get' | 'spreadsheets.getByDataFilter' | 'spreadsheets.sheets.copyTo' | 'spreadsheets.values.append' | 'spreadsheets.values.batchClear' | 'spreadsheets.values.batchClearByDataFilter' | 'spreadsheets.values.batchGet' | 'spreadsheets.values.batchGetByDataFilter' | 'spreadsheets.values.batchUpdate' | 'spreadsheets.values.batchUpdateByDataFilter' | 'spreadsheets.values.clear' | 'spreadsheets.values.get' | 'spreadsheets.values.update';
|
|
24
26
|
/** 14 methods declared by Google for tasks v1. */
|
|
25
27
|
export type TasksMethod = 'tasklists.delete' | 'tasklists.get' | 'tasklists.insert' | 'tasklists.list' | 'tasklists.patch' | 'tasklists.update' | 'tasks.clear' | 'tasks.delete' | 'tasks.get' | 'tasks.insert' | 'tasks.list' | 'tasks.move' | 'tasks.patch' | 'tasks.update';
|
|
26
28
|
/** Every service in the descriptor. */
|
|
27
|
-
export type GoogleService = 'calendar' | 'docs' | 'drive' | 'gmail' | 'meet' | 'sheets' | 'tasks';
|
|
29
|
+
export type GoogleService = 'calendar' | 'docs' | 'drive' | 'gmail' | 'meet' | 'people' | 'sheets' | 'tasks';
|
|
28
30
|
/** service -> the methods it declares. Indexing this is what makes `call()` safe. */
|
|
29
31
|
export interface ServiceMethods {
|
|
30
32
|
calendar: CalendarMethod;
|
|
@@ -32,6 +34,7 @@ export interface ServiceMethods {
|
|
|
32
34
|
drive: DriveMethod;
|
|
33
35
|
gmail: GmailMethod;
|
|
34
36
|
meet: MeetMethod;
|
|
37
|
+
people: PeopleMethod;
|
|
35
38
|
sheets: SheetsMethod;
|
|
36
39
|
tasks: TasksMethod;
|
|
37
40
|
}
|
package/build/server/handler.js
CHANGED
|
@@ -26,12 +26,27 @@ const domainHandlers = {
|
|
|
26
26
|
for (const tool of generatedTools) {
|
|
27
27
|
domainHandlers[tool.schema.name] = tool.handler;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* What a queued operation may call: every tool, including `queue_operations`.
|
|
31
|
+
*
|
|
32
|
+
* A queue is a tool call like any other, so the set of things it can name is the set of
|
|
33
|
+
* tools — no carve-out, and nothing for a caller to discover by being refused. Nesting is
|
|
34
|
+
* bounded by depth inside handleQueue rather than by omission here, so the limit arrives
|
|
35
|
+
* as a sentence saying what it is instead of an "Unknown tool" for something the server
|
|
36
|
+
* plainly advertises.
|
|
37
|
+
*/
|
|
38
|
+
function queueableHandlers(depth) {
|
|
39
|
+
return {
|
|
40
|
+
...domainHandlers,
|
|
41
|
+
queue_operations: (params) => handleQueue(params, queueableHandlers(depth + 1), depth + 1),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
29
44
|
export async function handleToolCall(toolName, params) {
|
|
30
45
|
const currentEpoch = advanceEpoch();
|
|
31
46
|
const tracker = getSessionTracker();
|
|
32
47
|
// Queue wraps the domain handlers (each queued op also advances the epoch)
|
|
33
48
|
if (toolName === 'queue_operations') {
|
|
34
|
-
const result = await handleQueue(params,
|
|
49
|
+
const result = await handleQueue(params, queueableHandlers(1), 1);
|
|
35
50
|
const queueEmail = extractEmailFromQueue(params);
|
|
36
51
|
if (queueEmail) {
|
|
37
52
|
await tracker.ensureBaseline(queueEmail, currentEpoch);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/server/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAOvE,6DAA6D;AAC7D,gEAAgE;AAChE,mEAAmE;AAEnE,IAAI,KAAK,GAAG,CAAC,CAAC;AAEd,2BAA2B;AAC3B,MAAM,UAAU,QAAQ;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,KAAK,CAAC;AACjB,CAAC;AAED,6DAA6D;AAE7D,MAAM,cAAc,GAAgC;IAClD,eAAe,EAAE,cAAc;IAC/B,gBAAgB,EAAE,eAAe;IACjC,iBAAiB,EAAE,gBAAgB;CACpC,CAAC;AAEF,sCAAsC;AACtC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;IAClC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,MAA+B;IAE/B,MAAM,YAAY,GAAG,YAAY,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IAEpC,2EAA2E;IAC3E,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/server/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { listAccounts, removeAccount, authenticateAndAddAccount } from '../../accounts/registry.js';
|
|
2
2
|
import { checkAccountStatus, reauthWithServices } from '../../accounts/auth.js';
|
|
3
|
+
import { scopesForServices, ALL_SERVICES } from '../../accounts/oauth.js';
|
|
3
4
|
import { getAccessToken, invalidateToken } from '../../accounts/token-service.js';
|
|
4
5
|
import { nextSteps } from '../formatting/next-steps.js';
|
|
5
6
|
import { getActivePolicies } from '../../factory/safety.js';
|
|
@@ -24,6 +25,19 @@ function formatAccountList(accounts) {
|
|
|
24
25
|
function formatStatus(status) {
|
|
25
26
|
const valid = status.tokenValid ? '[x] Token valid' : '[ ] Token invalid';
|
|
26
27
|
const refresh = status.hasRefreshToken ? '[x] Has refresh token' : '[ ] No refresh token';
|
|
28
|
+
// Say what this account can DO, not just which scope strings it holds — the scope list
|
|
29
|
+
// below is accurate and takes a Google reference to read.
|
|
30
|
+
//
|
|
31
|
+
// `access` is the level ASKED FOR. An account confirmed through confirmWriteAccess is
|
|
32
|
+
// stored as 'read' while holding write scopes for the services that had no read-only
|
|
33
|
+
// option, so the declared level alone would assert something false. The services that
|
|
34
|
+
// stayed writable are stored with it and named here.
|
|
35
|
+
const stillWritable = status.stillAllowWrites ?? [];
|
|
36
|
+
const level = status.access === 'read'
|
|
37
|
+
? (stillWritable.length
|
|
38
|
+
? `[~] Read-only, except: **${stillWritable.join(', ')}** — those have no read-only option and can still be changed`
|
|
39
|
+
: '[x] Read-only — this account cannot send, edit or delete')
|
|
40
|
+
: '[x] Full access — this account can create, edit and delete';
|
|
27
41
|
const scopeList = status.scopes.length > 0
|
|
28
42
|
? status.scopes.map(s => `- ${s.replace('https://www.googleapis.com/auth/', '')}`).join('\n')
|
|
29
43
|
: '(no scopes)';
|
|
@@ -33,6 +47,7 @@ function formatStatus(status) {
|
|
|
33
47
|
'',
|
|
34
48
|
valid,
|
|
35
49
|
refresh,
|
|
50
|
+
level,
|
|
36
51
|
`**Scopes (${status.scopeCount}):**`,
|
|
37
52
|
scopeList,
|
|
38
53
|
].join('\n'),
|
|
@@ -41,9 +56,66 @@ function formatStatus(status) {
|
|
|
41
56
|
tokenValid: status.tokenValid,
|
|
42
57
|
scopeCount: status.scopeCount,
|
|
43
58
|
scopes: status.scopes,
|
|
59
|
+
access: status.access,
|
|
60
|
+
stillAllowWrites: status.stillAllowWrites ?? [],
|
|
44
61
|
},
|
|
45
62
|
};
|
|
46
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Read the requested access level, rejecting anything that is not one of the two.
|
|
66
|
+
*
|
|
67
|
+
* This was a cast. The server registers tools through the low-level
|
|
68
|
+
* `setRequestHandler(CallToolRequestSchema, …)` path, which does NOT validate arguments
|
|
69
|
+
* against `inputSchema` — the enum in tools.ts is advertisement, not enforcement. So
|
|
70
|
+
* `access: 'read-only'` (a plausible thing to send, since the description says "read-only"
|
|
71
|
+
* three times) fell through `|| 'readwrite'` unchanged, requested FULL scopes, produced an
|
|
72
|
+
* empty stillAllowWrites, skipped the confirmation gate entirely, and wrote a credential
|
|
73
|
+
* claiming read. Asking for read and silently receiving write is the one thing this
|
|
74
|
+
* feature exists to prevent.
|
|
75
|
+
*/
|
|
76
|
+
function requestedAccess(params) {
|
|
77
|
+
const raw = params.access ?? 'readwrite';
|
|
78
|
+
if (raw !== 'read' && raw !== 'readwrite') {
|
|
79
|
+
throw new Error(`access must be 'read' or 'readwrite', got '${String(raw)}'. ` +
|
|
80
|
+
`Use 'read' for an account that should only look things up.`);
|
|
81
|
+
}
|
|
82
|
+
return raw;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Stop before the browser opens when read-only access was asked for and some services
|
|
86
|
+
* cannot provide it.
|
|
87
|
+
*
|
|
88
|
+
* Reporting this afterwards is too late: by then the token exists carrying write
|
|
89
|
+
* permissions, and taking it back means a manual trip to Google's permissions page. So
|
|
90
|
+
* the first call returns this instead of authorizing anything, and the caller either
|
|
91
|
+
* confirms or drops those services from the list.
|
|
92
|
+
*
|
|
93
|
+
* Returns null when there is nothing to warn about.
|
|
94
|
+
*/
|
|
95
|
+
function writeAccessWarning(stillAllowWrites, params, retry,
|
|
96
|
+
/**
|
|
97
|
+
* `authenticate` has no `services` parameter — it always requests every service — so
|
|
98
|
+
* telling its caller to drop one from `services` is advice they cannot take. That path
|
|
99
|
+
* gets pointed at `scopes`, which does take a list.
|
|
100
|
+
*/
|
|
101
|
+
canNarrowServices) {
|
|
102
|
+
if (stillAllowWrites.length === 0)
|
|
103
|
+
return null;
|
|
104
|
+
if (params.confirmWriteAccess === true)
|
|
105
|
+
return null;
|
|
106
|
+
const names = stillAllowWrites.join(', ');
|
|
107
|
+
return {
|
|
108
|
+
text: `Read-only access was requested, but Google has no read-only permission for: **${names}**.\n\n` +
|
|
109
|
+
`Authorizing anyway would let this account change ${stillAllowWrites.length === 1 ? 'that service' : 'those services'}, ` +
|
|
110
|
+
`not just read from ${stillAllowWrites.length === 1 ? 'it' : 'them'}. Nothing has been authorized yet.\n\n` +
|
|
111
|
+
`Either:\n` +
|
|
112
|
+
(canNarrowServices
|
|
113
|
+
? `- Leave ${names} out of \`services\` and re-run, to keep this account read-only.\n`
|
|
114
|
+
: `- Authorize with \`operation: 'scopes'\` instead, listing only the services you want read-only.\n`) +
|
|
115
|
+
`- Or re-run with \`confirmWriteAccess: true\` to accept it: ${retry}\n`,
|
|
116
|
+
refs: { status: 'needs-confirmation', stillAllowWrites },
|
|
117
|
+
};
|
|
118
|
+
}
|
|
47
119
|
export async function handleAccounts(params) {
|
|
48
120
|
const operation = params.operation;
|
|
49
121
|
switch (operation) {
|
|
@@ -72,13 +144,24 @@ export async function handleAccounts(params) {
|
|
|
72
144
|
}
|
|
73
145
|
const category = params.category || 'personal';
|
|
74
146
|
const description = params.description;
|
|
75
|
-
const
|
|
147
|
+
const access = requestedAccess(params);
|
|
148
|
+
// Check what this access level would actually grant BEFORE opening a browser.
|
|
149
|
+
const warning = writeAccessWarning(scopesForServices(ALL_SERVICES, access).stillAllowWrites, params, `manage_accounts {"operation":"authenticate","access":"read","confirmWriteAccess":true}`, false);
|
|
150
|
+
if (warning)
|
|
151
|
+
return warning;
|
|
152
|
+
const result = await authenticateAndAddAccount(clientId, clientSecret, category, description, access);
|
|
153
|
+
const grantNote = result.stillAllowWrites?.length
|
|
154
|
+
? `\n\n> Read-only was requested. ${result.stillAllowWrites.join(', ')} had no read-only option and can still be changed by this account.`
|
|
155
|
+
: '';
|
|
76
156
|
const statusText = result.status === 'success'
|
|
77
|
-
? `Account authenticated: **${result.account}
|
|
157
|
+
? `Account authenticated: **${result.account}** (${access === 'read' ? 'read-only' : 'full access'})${grantNote}`
|
|
78
158
|
: `Authentication failed: ${result.error}`;
|
|
79
159
|
return {
|
|
80
160
|
text: statusText + nextSteps('accounts', 'authenticate'),
|
|
81
|
-
refs: {
|
|
161
|
+
refs: {
|
|
162
|
+
status: result.status, account: result.account, email: result.account,
|
|
163
|
+
access, stillAllowWrites: result.stillAllowWrites ?? [],
|
|
164
|
+
},
|
|
82
165
|
};
|
|
83
166
|
}
|
|
84
167
|
case 'remove': {
|
|
@@ -125,13 +208,24 @@ export async function handleAccounts(params) {
|
|
|
125
208
|
if (!clientId || !clientSecret) {
|
|
126
209
|
throw new Error('GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET environment variables are required');
|
|
127
210
|
}
|
|
128
|
-
const
|
|
211
|
+
const access = requestedAccess(params);
|
|
212
|
+
// Same gate as authenticate — say it before the browser opens, not after.
|
|
213
|
+
const warning = writeAccessWarning(scopesForServices(services, access).stillAllowWrites, params, `manage_accounts {"operation":"scopes","email":"${email}","services":"${services}","access":"read","confirmWriteAccess":true}`, true);
|
|
214
|
+
if (warning)
|
|
215
|
+
return warning;
|
|
216
|
+
const result = await reauthWithServices(clientId, clientSecret, services, access);
|
|
217
|
+
const grantNote = result.stillAllowWrites?.length
|
|
218
|
+
? `\n\n> Read-only was requested. ${result.stillAllowWrites.join(', ')} had no read-only option and can still be changed by this account.`
|
|
219
|
+
: '';
|
|
129
220
|
const statusText = result.status === 'success'
|
|
130
|
-
? `Scopes updated for **${result.account}
|
|
221
|
+
? `Scopes updated for **${result.account}**: ${services} (${access === 'read' ? 'read-only' : 'full access'})${grantNote}`
|
|
131
222
|
: `Scope update failed: ${result.error}`;
|
|
132
223
|
return {
|
|
133
224
|
text: statusText + nextSteps('accounts', 'scopes', { email }),
|
|
134
|
-
refs: {
|
|
225
|
+
refs: {
|
|
226
|
+
status: result.status, email: result.account, services,
|
|
227
|
+
access, stillAllowWrites: result.stillAllowWrites ?? [],
|
|
228
|
+
},
|
|
135
229
|
};
|
|
136
230
|
}
|
|
137
231
|
case 'capabilities': {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/server/handlers/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,yBAAyB,EAAgB,MAAM,4BAA4B,CAAC;AAClH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAO3C,SAAS,iBAAiB,CAAC,QAA2B;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7C,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,gBAAgB,QAAQ,CAAC,MAAM,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC/D,IAAI,EAAE;YACJ,KAAK,EAAE,QAAQ,CAAC,MAAM;YACtB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YACpC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK;SAC1B;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/server/handlers/accounts.ts"],"names":[],"mappings":"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"}
|
package/build/server/queue.d.ts
CHANGED
|
@@ -7,5 +7,5 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { HandlerResponse } from './handler.js';
|
|
9
9
|
type ToolHandler = (params: Record<string, unknown>) => Promise<HandlerResponse>;
|
|
10
|
-
export declare function handleQueue(params: Record<string, unknown>, handlers: Record<string, ToolHandler
|
|
10
|
+
export declare function handleQueue(params: Record<string, unknown>, handlers: Record<string, ToolHandler>, depth?: number): Promise<HandlerResponse>;
|
|
11
11
|
export {};
|
package/build/server/queue.js
CHANGED
|
@@ -11,7 +11,22 @@ function stripNextSteps(text) {
|
|
|
11
11
|
const idx = text.indexOf(NEXT_STEPS_SEPARATOR);
|
|
12
12
|
return idx >= 0 ? text.slice(0, idx) : text;
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* How deeply queues may nest.
|
|
16
|
+
*
|
|
17
|
+
* A queue is a tool call, so a queue can hold one — that is what makes the tool list
|
|
18
|
+
* uniform, and it is useful: a nested queue with `onError: 'continue'` fails inside
|
|
19
|
+
* itself without bailing its parent. What it cannot be is unbounded, because each level
|
|
20
|
+
* multiplies: 10 operations per queue means this ceiling is 1,000 calls, which is already
|
|
21
|
+
* more than any real workflow and enough to be worth naming.
|
|
22
|
+
*/
|
|
23
|
+
const MAX_QUEUE_DEPTH = 3;
|
|
24
|
+
export async function handleQueue(params, handlers, depth = 1) {
|
|
25
|
+
if (depth > MAX_QUEUE_DEPTH) {
|
|
26
|
+
throw new Error(`queue_operations nested more than ${MAX_QUEUE_DEPTH} deep. Each level multiplies the ` +
|
|
27
|
+
`work — at 10 operations per queue that ceiling is already 1,000 calls. Flatten the ` +
|
|
28
|
+
`inner queues into their parent.`);
|
|
29
|
+
}
|
|
15
30
|
const operations = params.operations;
|
|
16
31
|
if (!Array.isArray(operations) || operations.length === 0) {
|
|
17
32
|
throw new Error('operations array is required and must not be empty');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/server/queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAoB5C,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAExD,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC/C,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAA+B,EAC/B,QAAqC;
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/server/queue.ts"],"names":[],"mappings":"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"}
|
package/build/server/tools.js
CHANGED
|
@@ -22,6 +22,15 @@ const handCodedSchemas = [
|
|
|
22
22
|
category: { type: 'string', enum: ['personal', 'work', 'other'], description: 'For authenticate (default: personal)' },
|
|
23
23
|
description: { type: 'string', description: 'For authenticate — optional label' },
|
|
24
24
|
services: { type: 'string', description: 'For scopes — comma-separated service names (e.g. gmail,drive,calendar,sheets)' },
|
|
25
|
+
access: {
|
|
26
|
+
type: 'string',
|
|
27
|
+
enum: ['read', 'readwrite'],
|
|
28
|
+
description: "How much this account may do. 'readwrite' (default) is full access. 'read' asks Google for read-only permissions instead, so the account can look things up but cannot send, edit or delete. Some services have no read-only option — you will be told which before the browser opens, and nothing is authorized until you confirm.",
|
|
29
|
+
},
|
|
30
|
+
confirmWriteAccess: {
|
|
31
|
+
type: 'boolean',
|
|
32
|
+
description: "Set true to go ahead when 'read' was asked for but some services can only be granted full access. Only needed after a first call has told you which ones.",
|
|
33
|
+
},
|
|
25
34
|
},
|
|
26
35
|
required: ['operation'],
|
|
27
36
|
additionalProperties: false,
|
|
@@ -108,7 +117,11 @@ const handCodedSchemas = [
|
|
|
108
117
|
properties: {
|
|
109
118
|
tool: {
|
|
110
119
|
type: 'string',
|
|
111
|
-
|
|
120
|
+
// Filled in below from the tools this server actually advertises. Written
|
|
121
|
+
// out by hand, this list silently omitted every tool added after it: a new
|
|
122
|
+
// tool worked on its own and was unreachable from a queue, with nothing to
|
|
123
|
+
// say why. manage_contacts was the one that surfaced it.
|
|
124
|
+
enum: [],
|
|
112
125
|
description: 'Tool to call',
|
|
113
126
|
},
|
|
114
127
|
args: {
|
|
@@ -143,6 +156,23 @@ export const toolSchemas = [
|
|
|
143
156
|
...handCodedSchemas,
|
|
144
157
|
...factorySchemas,
|
|
145
158
|
];
|
|
159
|
+
/**
|
|
160
|
+
* Point queue_operations at every tool this server advertises — itself included.
|
|
161
|
+
*
|
|
162
|
+
* Done here rather than in the literal above because the factory schemas are not built
|
|
163
|
+
* until `generatedTools` has run, and queue_operations is declared alongside the
|
|
164
|
+
* hand-coded tools that come first.
|
|
165
|
+
*
|
|
166
|
+
* There is no carve-out. A queue is a tool call, so the tools a queue may name are the
|
|
167
|
+
* tools; nesting is bounded by depth in handleQueue, which answers with a sentence saying
|
|
168
|
+
* what the limit is, rather than by omission here, which would answer a plainly
|
|
169
|
+
* advertised tool with "Unknown tool".
|
|
170
|
+
*/
|
|
171
|
+
const queueTool = handCodedSchemas.find(t => t.name === 'queue_operations');
|
|
172
|
+
if (queueTool) {
|
|
173
|
+
const operations = queueTool.inputSchema.properties.operations;
|
|
174
|
+
operations.items.properties.tool.enum = toolSchemas.map(t => t.name);
|
|
175
|
+
}
|
|
146
176
|
export function getToolSchema(name) {
|
|
147
177
|
return toolSchemas.find(t => t.name === name);
|
|
148
178
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAQxD,qDAAqD;AACrD,MAAM,gBAAgB,GAAiB;IACrC;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,sIAAsI;QACnJ,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC;oBACvF,WAAW,EAAE,kTAAkT;iBAChU;gBACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8CAA8C,EAAE;gBACtF,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,sCAAsC,EAAE;gBACtH,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mCAAmC,EAAE;gBACjF,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+EAA+E,EAAE;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contacts patch — domain-specific hooks for the People API.
|
|
3
|
+
*
|
|
4
|
+
* The People API returns a Person as PARALLEL ARRAYS. A name is not a string, it is
|
|
5
|
+
* `names: [{ displayName, metadata: { primary } }, ...]`; an email is not a string, it
|
|
6
|
+
* is `emailAddresses: [...]`. Every field works this way, one array per field, each
|
|
7
|
+
* entry carrying its own metadata, and the entry that counts is flagged rather than
|
|
8
|
+
* ordered. Handed to the generic formatter this renders as a person with no name and
|
|
9
|
+
* no address — the same failure mode as a Docs read that returned metadata and no text.
|
|
10
|
+
*
|
|
11
|
+
* The second reshaping job is the envelope. Six read operations, four different keys
|
|
12
|
+
* for "the people you asked for":
|
|
13
|
+
*
|
|
14
|
+
* people.connections.list -> { connections: [Person] }
|
|
15
|
+
* otherContacts.list -> { otherContacts: [Person] }
|
|
16
|
+
* people.*DirectoryPeople -> { people: [Person] }
|
|
17
|
+
* *.search -> { results: [{ person: Person }] }
|
|
18
|
+
*
|
|
19
|
+
* The agent picks an operation; it should not then have to know which of four shapes
|
|
20
|
+
* came back.
|
|
21
|
+
*/
|
|
22
|
+
import type { ServicePatch } from '../../factory/types.js';
|
|
23
|
+
/**
|
|
24
|
+
* Google's sort values are LAST_MODIFIED_DESCENDING and friends. The manifest advertises
|
|
25
|
+
* `firstName` / `lastName` / `lastModified` and this maps them, so the agent does not
|
|
26
|
+
* carry an API constant it can only get subtly wrong.
|
|
27
|
+
*/
|
|
28
|
+
export declare const SORT_ORDERS: Record<string, string>;
|
|
29
|
+
/** Test seam: the warmup is per-process state, and a test must be able to reset it. */
|
|
30
|
+
export declare function resetWarmupCache(): void;
|
|
31
|
+
export declare const contactsPatch: ServicePatch;
|