[eric] fix packaged Mac boot: splash icon path, ship OAuth-only .env, exempt tools oauth callback from auth

This commit is contained in:
ciregenz
2026-04-26 01:17:01 -07:00
parent d8f69bb23d
commit ee91092284
10 changed files with 772 additions and 223 deletions
+7
View File
@@ -88,6 +88,13 @@ _AUTH_EXEMPT_EXACT = {
# Google/Anthropic/etc). The `state` query param is already a # Google/Anthropic/etc). The `state` query param is already a
# one-time nonce validated against `_pending_oauth`. # one-time nonce validated against `_pending_oauth`.
"/api/subscriptions/callback", "/api/subscriptions/callback",
# Same pattern for the per-tool OAuth flow (Notion / Google Workspace /
# Airtable / HubSpot / Discord). The browser hits this with ?code=...&state=...
# after the user approves on the provider's site; the `state` param is
# the tool_id which we cross-check against _pending_oauth in tools_lib.py.
# Without this exemption the redirect lands a 401 page in the user's
# browser — see tools_lib.py:1156 where redirect_uri is constructed.
"/api/tools/oauth/callback",
"/api/version", "/api/version",
} }
@@ -640,6 +640,30 @@
"toolName": "get-onenote-page-content", "toolName": "get-onenote-page-content",
"scopes": ["Notes.Read"] "scopes": ["Notes.Read"]
}, },
{
"pathPattern": "/sites/{site-id}/onenote/notebooks",
"method": "get",
"toolName": "list-sharepoint-site-onenote-notebooks",
"workScopes": ["Notes.Read"]
},
{
"pathPattern": "/sites/{site-id}/onenote/notebooks/{notebook-id}/sections",
"method": "get",
"toolName": "list-sharepoint-site-onenote-notebook-sections",
"workScopes": ["Notes.Read"]
},
{
"pathPattern": "/sites/{site-id}/onenote/sections/{onenoteSection-id}/pages",
"method": "get",
"toolName": "list-sharepoint-site-onenote-section-pages",
"workScopes": ["Notes.Read"]
},
{
"pathPattern": "/sites/{site-id}/onenote/pages/{onenotePage-id}/content",
"method": "get",
"toolName": "get-sharepoint-site-onenote-page-content",
"workScopes": ["Notes.Read"]
},
{ {
"pathPattern": "/me/onenote/pages", "pathPattern": "/me/onenote/pages",
"method": "post", "method": "post",
@@ -777,6 +801,39 @@
"scopes": ["Tasks.ReadWrite"], "scopes": ["Tasks.ReadWrite"],
"llmTip": "CRITICAL: Requires If-Match header with ETag from get-planner-task-details (use includeHeaders=true). Checklist items use GUID keys: {\"checklist\": {\"<guid>\": {\"title\": \"...\", \"isChecked\": false}}}." "llmTip": "CRITICAL: Requires If-Match header with ETag from get-planner-task-details (use includeHeaders=true). Checklist items use GUID keys: {\"checklist\": {\"<guid>\": {\"title\": \"...\", \"isChecked\": false}}}."
}, },
{
"pathPattern": "/planner/plans/{plannerPlan-id}/buckets",
"method": "get",
"toolName": "list-plan-buckets",
"scopes": ["Tasks.Read"]
},
{
"pathPattern": "/planner/buckets/{plannerBucket-id}",
"method": "get",
"toolName": "get-planner-bucket",
"scopes": ["Tasks.Read"],
"llmTip": "Response includes @odata.etag — required as If-Match for update-planner-bucket and delete-planner-bucket. Use includeHeaders=true."
},
{
"pathPattern": "/planner/buckets",
"method": "post",
"toolName": "create-planner-bucket",
"scopes": ["Tasks.ReadWrite"]
},
{
"pathPattern": "/planner/buckets/{plannerBucket-id}",
"method": "patch",
"toolName": "update-planner-bucket",
"scopes": ["Tasks.ReadWrite"],
"llmTip": "CRITICAL: Requires If-Match header with ETag from get-planner-bucket (use includeHeaders=true)."
},
{
"pathPattern": "/planner/buckets/{plannerBucket-id}",
"method": "delete",
"toolName": "delete-planner-bucket",
"scopes": ["Tasks.ReadWrite"],
"llmTip": "CRITICAL: Requires If-Match header with ETag from get-planner-bucket (use includeHeaders=true)."
},
{ {
"pathPattern": "/me/contacts", "pathPattern": "/me/contacts",
"method": "get", "method": "get",
@@ -901,6 +958,20 @@
"workScopes": ["Group.Read.All"], "workScopes": ["Group.Read.All"],
"llmTip": "Gets a specific group's details: displayName, description, mail, visibility, groupTypes, membershipRule, createdDateTime. Use $select to limit returned properties." "llmTip": "Gets a specific group's details: displayName, description, mail, visibility, groupTypes, membershipRule, createdDateTime. Use $select to limit returned properties."
}, },
{
"pathPattern": "/groups/{group-id}/calendarView",
"method": "get",
"toolName": "get-group-calendar-view",
"workScopes": ["Group.Read.All"],
"supportsTimezone": true
},
{
"pathPattern": "/groups/{group-id}/events",
"method": "get",
"toolName": "list-group-events",
"workScopes": ["Group.Read.All"],
"supportsTimezone": true
},
{ {
"pathPattern": "/groups/{group-id}/members", "pathPattern": "/groups/{group-id}/members",
"method": "get", "method": "get",
+615 -215
View File
@@ -104496,11 +104496,12 @@ var microsoft_graph_groupCollectionResponse = external_exports.object({
"@odata.nextLink": external_exports.string().nullable(), "@odata.nextLink": external_exports.string().nullable(),
value: external_exports.array(microsoft_graph_group) value: external_exports.array(microsoft_graph_group)
}).partial().passthrough(); }).partial().passthrough();
var microsoft_graph_emailAddress = external_exports.object({ var microsoft_graph_eventType = external_exports.enum([
address: external_exports.string().describe("The email address of the person or entity.").nullish(), "singleInstance",
name: external_exports.string().describe("The display name of the person or entity.").nullish() "occurrence",
}).passthrough(); "exception",
var microsoft_graph_recipient = external_exports.object({ emailAddress: microsoft_graph_emailAddress.optional() }).passthrough(); "seriesMaster"
]);
var microsoft_graph_attachment = external_exports.object({ var microsoft_graph_attachment = external_exports.object({
id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(), id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(),
contentType: external_exports.string().describe("The MIME type.").nullish(), contentType: external_exports.string().describe("The MIME type.").nullish(),
@@ -104513,15 +104514,213 @@ var microsoft_graph_attachment = external_exports.object({
name: external_exports.string().describe("The attachment's file name.").nullish(), name: external_exports.string().describe("The attachment's file name.").nullish(),
size: external_exports.number().gte(-2147483648).lte(2147483647).describe("The length of the attachment in bytes.").optional() size: external_exports.number().gte(-2147483648).lte(2147483647).describe("The length of the attachment in bytes.").optional()
}).passthrough(); }).passthrough();
var microsoft_graph_extension = external_exports.object({ id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional() }).passthrough();
var microsoft_graph_multiValueLegacyExtendedProperty = external_exports.object({
id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(),
value: external_exports.array(external_exports.string().nullable()).describe("A collection of property values.").optional()
}).passthrough();
var microsoft_graph_singleValueLegacyExtendedProperty = external_exports.object({ var microsoft_graph_singleValueLegacyExtendedProperty = external_exports.object({
id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(), id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(),
value: external_exports.string().describe("A property value.").nullish() value: external_exports.string().describe("A property value.").nullish()
}).passthrough(); }).passthrough();
var microsoft_graph_multiValueLegacyExtendedProperty = external_exports.object({
id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(),
value: external_exports.array(external_exports.string().nullable()).describe("A collection of property values.").optional()
}).passthrough();
var microsoft_graph_physicalAddress = external_exports.object({
city: external_exports.string().describe("The city.").nullish(),
countryOrRegion: external_exports.string().describe(
"The country or region. It's a free-format string value, for example, 'United States'."
).nullish(),
postalCode: external_exports.string().describe("The postal code.").nullish(),
state: external_exports.string().describe("The state.").nullish(),
street: external_exports.string().describe("The street.").nullish()
}).passthrough();
var microsoft_graph_outlookGeoCoordinates = external_exports.object({
accuracy: external_exports.number().describe(
"The accuracy of the latitude and longitude. As an example, the accuracy can be measured in meters, such as the latitude and longitude are accurate to within 50 meters. [Simplified from 3 options]"
).nullish(),
altitude: external_exports.number().describe("The altitude of the location. [Simplified from 3 options]").nullish(),
altitudeAccuracy: external_exports.number().describe("The accuracy of the altitude. [Simplified from 3 options]").nullish(),
latitude: external_exports.number().describe("The latitude of the location. [Simplified from 3 options]").nullish(),
longitude: external_exports.number().describe("The longitude of the location. [Simplified from 3 options]").nullish()
}).passthrough();
var microsoft_graph_locationType = external_exports.enum([
"default",
"conferenceRoom",
"homeAddress",
"businessAddress",
"geoCoordinates",
"streetAddress",
"hotel",
"restaurant",
"localBusiness",
"postalAddress"
]);
var microsoft_graph_locationUniqueIdType = external_exports.enum([
"unknown",
"locationStore",
"directory",
"private",
"bing"
]);
var microsoft_graph_location = external_exports.object({
address: microsoft_graph_physicalAddress.optional(),
coordinates: microsoft_graph_outlookGeoCoordinates.optional(),
displayName: external_exports.string().describe("The name associated with the location.").nullish(),
locationEmailAddress: external_exports.string().describe("Optional email address of the location.").nullish(),
locationType: microsoft_graph_locationType.optional(),
locationUri: external_exports.string().describe("Optional URI representing the location.").nullish(),
uniqueId: external_exports.string().describe("For internal use only.").nullish(),
uniqueIdType: microsoft_graph_locationUniqueIdType.optional()
}).passthrough();
var microsoft_graph_freeBusyStatus = external_exports.enum([
"unknown",
"free",
"tentative",
"busy",
"oof",
"workingElsewhere"
]);
var microsoft_graph_sensitivity = external_exports.enum(["normal", "personal", "private", "confidential"]);
var microsoft_graph_importance = external_exports.enum(["low", "normal", "high"]);
var microsoft_graph_emailAddress = external_exports.object({
address: external_exports.string().describe("The email address of the person or entity.").nullish(),
name: external_exports.string().describe("The display name of the person or entity.").nullish()
}).passthrough();
var microsoft_graph_attendeeType = external_exports.enum(["required", "optional", "resource"]);
var microsoft_graph_timeSlot = external_exports.object({
end: microsoft_graph_dateTimeTimeZone.optional(),
start: microsoft_graph_dateTimeTimeZone.optional()
}).passthrough();
var microsoft_graph_responseType = external_exports.enum([
"none",
"organizer",
"tentativelyAccepted",
"accepted",
"declined",
"notResponded"
]);
var microsoft_graph_responseStatus = external_exports.object({
response: microsoft_graph_responseType.optional(),
time: external_exports.string().regex(
/^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$/
).datetime({ offset: true }).describe(
"The date and time when the response was returned. It uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z"
).nullish()
}).passthrough();
var microsoft_graph_attendee = external_exports.object({
emailAddress: microsoft_graph_emailAddress.optional(),
type: microsoft_graph_attendeeType.optional(),
proposedNewTime: microsoft_graph_timeSlot.optional(),
status: microsoft_graph_responseStatus.optional()
}).passthrough();
var microsoft_graph_dayOfWeek = external_exports.enum([
"sunday",
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday"
]);
var microsoft_graph_weekIndex = external_exports.enum(["first", "second", "third", "fourth", "last"]);
var microsoft_graph_recurrencePatternType = external_exports.enum([
"daily",
"weekly",
"absoluteMonthly",
"relativeMonthly",
"absoluteYearly",
"relativeYearly"
]);
var microsoft_graph_recurrencePattern = external_exports.object({
dayOfMonth: external_exports.number().gte(-2147483648).lte(2147483647).describe(
"The day of the month on which the event occurs. Required if type is absoluteMonthly or absoluteYearly."
).optional(),
daysOfWeek: external_exports.array(external_exports.union([microsoft_graph_dayOfWeek, external_exports.object({}).partial().passthrough()])).describe(
"A collection of the days of the week on which the event occurs. The possible values are: sunday, monday, tuesday, wednesday, thursday, friday, saturday. If type is relativeMonthly or relativeYearly, and daysOfWeek specifies more than one day, the event falls on the first day that satisfies the pattern. Required if type is weekly, relativeMonthly, or relativeYearly."
).optional(),
firstDayOfWeek: microsoft_graph_dayOfWeek.optional(),
index: microsoft_graph_weekIndex.optional(),
interval: external_exports.number().gte(-2147483648).lte(2147483647).describe(
"The number of units between occurrences, where units can be in days, weeks, months, or years, depending on the type. Required."
).optional(),
month: external_exports.number().gte(-2147483648).lte(2147483647).describe("The month in which the event occurs. This is a number from 1 to 12.").optional(),
type: microsoft_graph_recurrencePatternType.optional()
}).passthrough();
var microsoft_graph_recurrenceRangeType = external_exports.enum(["endDate", "noEnd", "numbered"]);
var microsoft_graph_recurrenceRange = external_exports.object({
endDate: external_exports.string().regex(/^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/).describe(
"The date to stop applying the recurrence pattern. Depending on the recurrence pattern of the event, the last occurrence of the meeting may not be this date. Required if type is endDate."
).nullish(),
numberOfOccurrences: external_exports.number().gte(-2147483648).lte(2147483647).describe(
"The number of times to repeat the event. Required and must be positive if type is numbered."
).optional(),
recurrenceTimeZone: external_exports.string().describe(
"Time zone for the startDate and endDate properties. Optional. If not specified, the time zone of the event is used."
).nullish(),
startDate: external_exports.string().regex(/^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/).describe(
"The date to start applying the recurrence pattern. The first occurrence of the meeting may be this date or later, depending on the recurrence pattern of the event. Must be the same value as the start property of the recurring event. Required."
).nullish(),
type: microsoft_graph_recurrenceRangeType.optional()
}).passthrough();
var microsoft_graph_patternedRecurrence = external_exports.object({
pattern: microsoft_graph_recurrencePattern.optional(),
range: microsoft_graph_recurrenceRange.optional()
}).passthrough();
var microsoft_graph_event = external_exports.object({
id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(),
createdDateTime: external_exports.string().regex(
/^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$/
).datetime({ offset: true }).describe(
"The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z"
).nullish(),
lastModifiedDateTime: external_exports.string().regex(
/^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$/
).datetime({ offset: true }).describe(
"The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z"
).nullish(),
type: microsoft_graph_eventType.optional(),
body: microsoft_graph_itemBody.optional(),
subject: external_exports.string().describe("The text of the event's subject line.").nullish(),
attachments: external_exports.array(microsoft_graph_attachment).describe(
"The collection of FileAttachment, ItemAttachment, and referenceAttachment attachments for the event. Navigation property. Read-only. Nullable."
).optional(),
singleValueExtendedProperties: external_exports.array(microsoft_graph_singleValueLegacyExtendedProperty).describe(
"The collection of single-value extended properties defined for the event. Read-only. Nullable."
).optional(),
multiValueExtendedProperties: external_exports.array(microsoft_graph_multiValueLegacyExtendedProperty).describe(
"The collection of multi-value extended properties defined for the event. Read-only. Nullable."
).optional(),
start: microsoft_graph_dateTimeTimeZone.optional(),
end: microsoft_graph_dateTimeTimeZone.optional(),
location: microsoft_graph_location.optional(),
showAs: microsoft_graph_freeBusyStatus.optional(),
sensitivity: microsoft_graph_sensitivity.optional(),
isAllDay: external_exports.boolean().describe(
"Set to true if the event lasts all day. If true, regardless of whether it's a single-day or multi-day event, start, and endtime must be set to midnight and be in the same time zone."
).nullish(),
importance: microsoft_graph_importance.optional(),
isOnlineMeeting: external_exports.boolean().describe(
"True if this event has online meeting information (that is, onlineMeeting points to an onlineMeetingInfo resource), false otherwise. Default is false (onlineMeeting is null). Optional. After you set isOnlineMeeting to true, Microsoft Graph initializes onlineMeeting. Subsequently, Outlook ignores any further changes to isOnlineMeeting, and the meeting remains available online."
).nullish(),
isReminderOn: external_exports.boolean().describe("Set to true if an alert is set to remind the user of the event.").nullish(),
attendees: external_exports.array(microsoft_graph_attendee).describe("The collection of attendees for the event.").optional(),
recurrence: microsoft_graph_patternedRecurrence.optional(),
reminderMinutesBeforeStart: external_exports.number().gte(-2147483648).lte(2147483647).describe("The number of minutes before the event start time that the reminder alert occurs.").nullish(),
allowNewTimeProposals: external_exports.boolean().describe(
"true if the meeting organizer allows invitees to propose a new time when responding; otherwise, false. Optional. The default is true."
).nullish(),
responseRequested: external_exports.boolean().describe(
"Default is true, which represents the organizer would like an invitee to send a response to the event."
).nullish(),
categories: external_exports.array(external_exports.string().nullable()).describe("The categories associated with the item").optional(),
changeKey: external_exports.string().describe(
"Identifies the version of the item. Every time the item is changed, changeKey changes as well. This allows Exchange to apply changes to the correct version of the object. Read-only."
).nullish()
}).passthrough().passthrough();
var microsoft_graph_eventCollectionResponse = external_exports.object({
"@odata.count": external_exports.number().int().nullable(),
"@odata.nextLink": external_exports.string().nullable(),
value: external_exports.array(microsoft_graph_event)
}).partial().passthrough();
var microsoft_graph_recipient = external_exports.object({ emailAddress: microsoft_graph_emailAddress.optional() }).passthrough();
var microsoft_graph_extension = external_exports.object({ id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional() }).passthrough();
var microsoft_graph_post = external_exports.lazy( var microsoft_graph_post = external_exports.lazy(
() => external_exports.object({ () => external_exports.object({
id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(), id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(),
@@ -104646,14 +104845,6 @@ var microsoft_graph_freeBusyError = external_exports.object({
"The response code from querying for the availability of the user, distribution list, or resource." "The response code from querying for the availability of the user, distribution list, or resource."
).nullish() ).nullish()
}).passthrough(); }).passthrough();
var microsoft_graph_freeBusyStatus = external_exports.enum([
"unknown",
"free",
"tentative",
"busy",
"oof",
"workingElsewhere"
]);
var microsoft_graph_scheduleItem = external_exports.object({ var microsoft_graph_scheduleItem = external_exports.object({
end: microsoft_graph_dateTimeTimeZone.optional(), end: microsoft_graph_dateTimeTimeZone.optional(),
isPrivate: external_exports.boolean().describe( isPrivate: external_exports.boolean().describe(
@@ -104664,15 +104855,6 @@ var microsoft_graph_scheduleItem = external_exports.object({
status: microsoft_graph_freeBusyStatus.optional(), status: microsoft_graph_freeBusyStatus.optional(),
subject: external_exports.string().describe("The corresponding event's subject line. Optional.").nullish() subject: external_exports.string().describe("The corresponding event's subject line. Optional.").nullish()
}).passthrough(); }).passthrough();
var microsoft_graph_dayOfWeek = external_exports.enum([
"sunday",
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday"
]);
var microsoft_graph_timeZoneBase = external_exports.object({ var microsoft_graph_timeZoneBase = external_exports.object({
name: external_exports.string().describe( name: external_exports.string().describe(
"The name of a time zone. It can be a standard time zone name such as 'Hawaii-Aleutian Standard Time', or 'Customized Time Zone' for a custom time zone." "The name of a time zone. It can be a standard time zone name such as 'Hawaii-Aleutian Standard Time', or 'Customized Time Zone' for a custom time zone."
@@ -104738,183 +104920,6 @@ var microsoft_graph_calendarPermission = external_exports.object({
).nullish(), ).nullish(),
role: microsoft_graph_calendarRoleType.optional() role: microsoft_graph_calendarRoleType.optional()
}).passthrough(); }).passthrough();
var microsoft_graph_eventType = external_exports.enum([
"singleInstance",
"occurrence",
"exception",
"seriesMaster"
]);
var microsoft_graph_physicalAddress = external_exports.object({
city: external_exports.string().describe("The city.").nullish(),
countryOrRegion: external_exports.string().describe(
"The country or region. It's a free-format string value, for example, 'United States'."
).nullish(),
postalCode: external_exports.string().describe("The postal code.").nullish(),
state: external_exports.string().describe("The state.").nullish(),
street: external_exports.string().describe("The street.").nullish()
}).passthrough();
var microsoft_graph_outlookGeoCoordinates = external_exports.object({
accuracy: external_exports.number().describe(
"The accuracy of the latitude and longitude. As an example, the accuracy can be measured in meters, such as the latitude and longitude are accurate to within 50 meters. [Simplified from 3 options]"
).nullish(),
altitude: external_exports.number().describe("The altitude of the location. [Simplified from 3 options]").nullish(),
altitudeAccuracy: external_exports.number().describe("The accuracy of the altitude. [Simplified from 3 options]").nullish(),
latitude: external_exports.number().describe("The latitude of the location. [Simplified from 3 options]").nullish(),
longitude: external_exports.number().describe("The longitude of the location. [Simplified from 3 options]").nullish()
}).passthrough();
var microsoft_graph_locationType = external_exports.enum([
"default",
"conferenceRoom",
"homeAddress",
"businessAddress",
"geoCoordinates",
"streetAddress",
"hotel",
"restaurant",
"localBusiness",
"postalAddress"
]);
var microsoft_graph_locationUniqueIdType = external_exports.enum([
"unknown",
"locationStore",
"directory",
"private",
"bing"
]);
var microsoft_graph_location = external_exports.object({
address: microsoft_graph_physicalAddress.optional(),
coordinates: microsoft_graph_outlookGeoCoordinates.optional(),
displayName: external_exports.string().describe("The name associated with the location.").nullish(),
locationEmailAddress: external_exports.string().describe("Optional email address of the location.").nullish(),
locationType: microsoft_graph_locationType.optional(),
locationUri: external_exports.string().describe("Optional URI representing the location.").nullish(),
uniqueId: external_exports.string().describe("For internal use only.").nullish(),
uniqueIdType: microsoft_graph_locationUniqueIdType.optional()
}).passthrough();
var microsoft_graph_sensitivity = external_exports.enum(["normal", "personal", "private", "confidential"]);
var microsoft_graph_importance = external_exports.enum(["low", "normal", "high"]);
var microsoft_graph_attendeeType = external_exports.enum(["required", "optional", "resource"]);
var microsoft_graph_timeSlot = external_exports.object({
end: microsoft_graph_dateTimeTimeZone.optional(),
start: microsoft_graph_dateTimeTimeZone.optional()
}).passthrough();
var microsoft_graph_responseType = external_exports.enum([
"none",
"organizer",
"tentativelyAccepted",
"accepted",
"declined",
"notResponded"
]);
var microsoft_graph_responseStatus = external_exports.object({
response: microsoft_graph_responseType.optional(),
time: external_exports.string().regex(
/^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$/
).datetime({ offset: true }).describe(
"The date and time when the response was returned. It uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z"
).nullish()
}).passthrough();
var microsoft_graph_attendee = external_exports.object({
emailAddress: microsoft_graph_emailAddress.optional(),
type: microsoft_graph_attendeeType.optional(),
proposedNewTime: microsoft_graph_timeSlot.optional(),
status: microsoft_graph_responseStatus.optional()
}).passthrough();
var microsoft_graph_weekIndex = external_exports.enum(["first", "second", "third", "fourth", "last"]);
var microsoft_graph_recurrencePatternType = external_exports.enum([
"daily",
"weekly",
"absoluteMonthly",
"relativeMonthly",
"absoluteYearly",
"relativeYearly"
]);
var microsoft_graph_recurrencePattern = external_exports.object({
dayOfMonth: external_exports.number().gte(-2147483648).lte(2147483647).describe(
"The day of the month on which the event occurs. Required if type is absoluteMonthly or absoluteYearly."
).optional(),
daysOfWeek: external_exports.array(external_exports.union([microsoft_graph_dayOfWeek, external_exports.object({}).partial().passthrough()])).describe(
"A collection of the days of the week on which the event occurs. The possible values are: sunday, monday, tuesday, wednesday, thursday, friday, saturday. If type is relativeMonthly or relativeYearly, and daysOfWeek specifies more than one day, the event falls on the first day that satisfies the pattern. Required if type is weekly, relativeMonthly, or relativeYearly."
).optional(),
firstDayOfWeek: microsoft_graph_dayOfWeek.optional(),
index: microsoft_graph_weekIndex.optional(),
interval: external_exports.number().gte(-2147483648).lte(2147483647).describe(
"The number of units between occurrences, where units can be in days, weeks, months, or years, depending on the type. Required."
).optional(),
month: external_exports.number().gte(-2147483648).lte(2147483647).describe("The month in which the event occurs. This is a number from 1 to 12.").optional(),
type: microsoft_graph_recurrencePatternType.optional()
}).passthrough();
var microsoft_graph_recurrenceRangeType = external_exports.enum(["endDate", "noEnd", "numbered"]);
var microsoft_graph_recurrenceRange = external_exports.object({
endDate: external_exports.string().regex(/^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/).describe(
"The date to stop applying the recurrence pattern. Depending on the recurrence pattern of the event, the last occurrence of the meeting may not be this date. Required if type is endDate."
).nullish(),
numberOfOccurrences: external_exports.number().gte(-2147483648).lte(2147483647).describe(
"The number of times to repeat the event. Required and must be positive if type is numbered."
).optional(),
recurrenceTimeZone: external_exports.string().describe(
"Time zone for the startDate and endDate properties. Optional. If not specified, the time zone of the event is used."
).nullish(),
startDate: external_exports.string().regex(/^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/).describe(
"The date to start applying the recurrence pattern. The first occurrence of the meeting may be this date or later, depending on the recurrence pattern of the event. Must be the same value as the start property of the recurring event. Required."
).nullish(),
type: microsoft_graph_recurrenceRangeType.optional()
}).passthrough();
var microsoft_graph_patternedRecurrence = external_exports.object({
pattern: microsoft_graph_recurrencePattern.optional(),
range: microsoft_graph_recurrenceRange.optional()
}).passthrough();
var microsoft_graph_event = external_exports.object({
id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(),
createdDateTime: external_exports.string().regex(
/^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$/
).datetime({ offset: true }).describe(
"The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z"
).nullish(),
lastModifiedDateTime: external_exports.string().regex(
/^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$/
).datetime({ offset: true }).describe(
"The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z"
).nullish(),
type: microsoft_graph_eventType.optional(),
body: microsoft_graph_itemBody.optional(),
subject: external_exports.string().describe("The text of the event's subject line.").nullish(),
attachments: external_exports.array(microsoft_graph_attachment).describe(
"The collection of FileAttachment, ItemAttachment, and referenceAttachment attachments for the event. Navigation property. Read-only. Nullable."
).optional(),
singleValueExtendedProperties: external_exports.array(microsoft_graph_singleValueLegacyExtendedProperty).describe(
"The collection of single-value extended properties defined for the event. Read-only. Nullable."
).optional(),
multiValueExtendedProperties: external_exports.array(microsoft_graph_multiValueLegacyExtendedProperty).describe(
"The collection of multi-value extended properties defined for the event. Read-only. Nullable."
).optional(),
start: microsoft_graph_dateTimeTimeZone.optional(),
end: microsoft_graph_dateTimeTimeZone.optional(),
location: microsoft_graph_location.optional(),
showAs: microsoft_graph_freeBusyStatus.optional(),
sensitivity: microsoft_graph_sensitivity.optional(),
isAllDay: external_exports.boolean().describe(
"Set to true if the event lasts all day. If true, regardless of whether it's a single-day or multi-day event, start, and endtime must be set to midnight and be in the same time zone."
).nullish(),
importance: microsoft_graph_importance.optional(),
isOnlineMeeting: external_exports.boolean().describe(
"True if this event has online meeting information (that is, onlineMeeting points to an onlineMeetingInfo resource), false otherwise. Default is false (onlineMeeting is null). Optional. After you set isOnlineMeeting to true, Microsoft Graph initializes onlineMeeting. Subsequently, Outlook ignores any further changes to isOnlineMeeting, and the meeting remains available online."
).nullish(),
isReminderOn: external_exports.boolean().describe("Set to true if an alert is set to remind the user of the event.").nullish(),
attendees: external_exports.array(microsoft_graph_attendee).describe("The collection of attendees for the event.").optional(),
recurrence: microsoft_graph_patternedRecurrence.optional(),
reminderMinutesBeforeStart: external_exports.number().gte(-2147483648).lte(2147483647).describe("The number of minutes before the event start time that the reminder alert occurs.").nullish(),
allowNewTimeProposals: external_exports.boolean().describe(
"true if the meeting organizer allows invitees to propose a new time when responding; otherwise, false. Optional. The default is true."
).nullish(),
responseRequested: external_exports.boolean().describe(
"Default is true, which represents the organizer would like an invitee to send a response to the event."
).nullish(),
categories: external_exports.array(external_exports.string().nullable()).describe("The categories associated with the item").optional(),
changeKey: external_exports.string().describe(
"Identifies the version of the item. Every time the item is changed, changeKey changes as well. This allows Exchange to apply changes to the correct version of the object. Read-only."
).nullish()
}).passthrough().passthrough();
var microsoft_graph_calendar = external_exports.object({ var microsoft_graph_calendar = external_exports.object({
id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(), id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(),
allowedOnlineMeetingProviders: external_exports.array(external_exports.union([microsoft_graph_onlineMeetingProviderType, external_exports.object({}).partial().passthrough()])).describe( allowedOnlineMeetingProviders: external_exports.array(external_exports.union([microsoft_graph_onlineMeetingProviderType, external_exports.object({}).partial().passthrough()])).describe(
@@ -104961,11 +104966,6 @@ var microsoft_graph_calendarCollectionResponse = external_exports.object({
"@odata.nextLink": external_exports.string().nullable(), "@odata.nextLink": external_exports.string().nullable(),
value: external_exports.array(microsoft_graph_calendar) value: external_exports.array(microsoft_graph_calendar)
}).partial().passthrough(); }).partial().passthrough();
var microsoft_graph_eventCollectionResponse = external_exports.object({
"@odata.count": external_exports.number().int().nullable(),
"@odata.nextLink": external_exports.string().nullable(),
value: external_exports.array(microsoft_graph_event)
}).partial().passthrough();
var microsoft_graph_chatCollectionResponse = external_exports.object({ var microsoft_graph_chatCollectionResponse = external_exports.object({
"@odata.count": external_exports.number().int().nullable(), "@odata.count": external_exports.number().int().nullable(),
"@odata.nextLink": external_exports.string().nullable(), "@odata.nextLink": external_exports.string().nullable(),
@@ -106811,12 +106811,6 @@ var microsoft_graph_roomCollectionResponse = external_exports.object({
"@odata.nextLink": external_exports.string().nullable(), "@odata.nextLink": external_exports.string().nullable(),
value: external_exports.array(microsoft_graph_room) value: external_exports.array(microsoft_graph_room)
}).partial().passthrough(); }).partial().passthrough();
var microsoft_graph_plannerContainerType = external_exports.enum(["group", "unknownFutureValue", "roster"]);
var microsoft_graph_plannerPlanContainer = external_exports.object({
containerId: external_exports.string().describe("The identifier of the resource that contains the plan. Optional.").nullish(),
type: microsoft_graph_plannerContainerType.optional(),
url: external_exports.string().describe("The full canonical URL of the container. Optional.").nullish()
}).passthrough();
var microsoft_graph_plannerBucket = external_exports.object({ var microsoft_graph_plannerBucket = external_exports.object({
id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(), id: external_exports.string().describe("The unique identifier for an entity. Read-only.").optional(),
name: external_exports.string().describe("Name of the bucket.").optional(), name: external_exports.string().describe("Name of the bucket.").optional(),
@@ -106826,6 +106820,12 @@ var microsoft_graph_plannerBucket = external_exports.object({
planId: external_exports.string().describe("Plan ID to which the bucket belongs.").nullish(), planId: external_exports.string().describe("Plan ID to which the bucket belongs.").nullish(),
tasks: external_exports.array(microsoft_graph_plannerTask).describe("Read-only. Nullable. The collection of tasks in the bucket.").optional() tasks: external_exports.array(microsoft_graph_plannerTask).describe("Read-only. Nullable. The collection of tasks in the bucket.").optional()
}).passthrough(); }).passthrough();
var microsoft_graph_plannerContainerType = external_exports.enum(["group", "unknownFutureValue", "roster"]);
var microsoft_graph_plannerPlanContainer = external_exports.object({
containerId: external_exports.string().describe("The identifier of the resource that contains the plan. Optional.").nullish(),
type: microsoft_graph_plannerContainerType.optional(),
url: external_exports.string().describe("The full canonical URL of the container. Optional.").nullish()
}).passthrough();
var microsoft_graph_plannerCategoryDescriptions = external_exports.object({ var microsoft_graph_plannerCategoryDescriptions = external_exports.object({
category1: external_exports.string().describe("The label associated with Category 1").nullish(), category1: external_exports.string().describe("The label associated with Category 1").nullish(),
category10: external_exports.string().describe("The label associated with Category 10").nullish(), category10: external_exports.string().describe("The label associated with Category 10").nullish(),
@@ -106876,6 +106876,11 @@ var microsoft_graph_plannerPlan = external_exports.object({
details: microsoft_graph_plannerPlanDetails.optional(), details: microsoft_graph_plannerPlanDetails.optional(),
tasks: external_exports.array(microsoft_graph_plannerTask).describe("Read-only. Nullable. Collection of tasks in the plan.").optional() tasks: external_exports.array(microsoft_graph_plannerTask).describe("Read-only. Nullable. Collection of tasks in the plan.").optional()
}).passthrough(); }).passthrough();
var microsoft_graph_plannerBucketCollectionResponse = external_exports.object({
"@odata.count": external_exports.number().int().nullable(),
"@odata.nextLink": external_exports.string().nullable(),
value: external_exports.array(microsoft_graph_plannerBucket)
}).partial().passthrough();
var microsoft_graph_bucketAggregationRange = external_exports.object({ var microsoft_graph_bucketAggregationRange = external_exports.object({
from: external_exports.string().describe( from: external_exports.string().describe(
"Defines the lower bound from which to compute the aggregation. This can be a numeric value or a string representation of a date using the YYYY-MM-DDTHH:mm:ss.sssZ format. Required." "Defines the lower bound from which to compute the aggregation. This can be a numeric value or a string representation of a date using the YYYY-MM-DDTHH:mm:ss.sssZ format. Required."
@@ -108790,6 +108795,71 @@ You can create or update the following types of group: By default, this operatio
], ],
response: external_exports.void() response: external_exports.void()
}, },
{
method: "get",
path: "/groups/:groupId/calendarView",
alias: "get-group-calendar-view",
description: `Get the occurrences, exceptions, and single instances of events in a calendar view defined by a time range,
from the default calendar of a group.`,
requestFormat: "json",
parameters: [
{
name: "startDateTime",
type: "Query",
schema: external_exports.string().describe(
"The start date and time of the time range, represented in ISO 8601 format. For example, 2019-11-08T19:00:00-08:00"
)
},
{
name: "endDateTime",
type: "Query",
schema: external_exports.string().describe(
"The end date and time of the time range, represented in ISO 8601 format. For example, 2019-11-08T20:00:00-08:00"
)
},
{
name: "$top",
type: "Query",
schema: external_exports.number().int().gte(0).describe("Show only the first n items").optional()
},
{
name: "$skip",
type: "Query",
schema: external_exports.number().int().gte(0).describe("Skip the first n items").optional()
},
{
name: "$search",
type: "Query",
schema: external_exports.string().describe("Search items by search phrases").optional()
},
{
name: "$filter",
type: "Query",
schema: external_exports.string().describe("Filter items by property values").optional()
},
{
name: "$count",
type: "Query",
schema: external_exports.boolean().describe("Include count of items").optional()
},
{
name: "$orderby",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Order items by property values").optional()
},
{
name: "$select",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Select properties to be returned").optional()
},
{
name: "$expand",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Expand related entities").optional()
}
],
response: external_exports.void()
},
{ {
method: "get", method: "get",
path: "/groups/:groupId/conversations", path: "/groups/:groupId/conversations",
@@ -108840,6 +108910,56 @@ You can create or update the following types of group: By default, this operatio
], ],
response: external_exports.void() response: external_exports.void()
}, },
{
method: "get",
path: "/groups/:groupId/events",
alias: "list-group-events",
description: `Retrieve a list of event objects.`,
requestFormat: "json",
parameters: [
{
name: "$top",
type: "Query",
schema: external_exports.number().int().gte(0).describe("Show only the first n items").optional()
},
{
name: "$skip",
type: "Query",
schema: external_exports.number().int().gte(0).describe("Skip the first n items").optional()
},
{
name: "$search",
type: "Query",
schema: external_exports.string().describe("Search items by search phrases").optional()
},
{
name: "$filter",
type: "Query",
schema: external_exports.string().describe("Filter items by property values").optional()
},
{
name: "$count",
type: "Query",
schema: external_exports.boolean().describe("Include count of items").optional()
},
{
name: "$orderby",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Order items by property values").optional()
},
{
name: "$select",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Select properties to be returned").optional()
},
{
name: "$expand",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Expand related entities").optional()
}
],
response: external_exports.void()
},
{ {
method: "get", method: "get",
path: "/groups/:groupId/members", path: "/groups/:groupId/members",
@@ -112778,6 +112898,78 @@ For example, if the user uploads a photo that is 504x504 pixels, all but the 648
], ],
response: external_exports.void() response: external_exports.void()
}, },
{
method: "post",
path: "/planner/buckets",
alias: "create-planner-bucket",
description: `Create a new plannerBucket object.`,
requestFormat: "json",
parameters: [
{
name: "body",
description: `New navigation property`,
type: "Body",
schema: microsoft_graph_plannerBucket
}
],
response: external_exports.void()
},
{
method: "get",
path: "/planner/buckets/:plannerBucketId",
alias: "get-planner-bucket",
description: `Retrieve the properties and relationships of a plannerBucket object.`,
requestFormat: "json",
parameters: [
{
name: "$select",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Select properties to be returned").optional()
},
{
name: "$expand",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Expand related entities").optional()
}
],
response: external_exports.void()
},
{
method: "patch",
path: "/planner/buckets/:plannerBucketId",
alias: "update-planner-bucket",
description: `Update the properties of plannerbucket object.`,
requestFormat: "json",
parameters: [
{
name: "body",
description: `New navigation property values`,
type: "Body",
schema: microsoft_graph_plannerBucket
},
{
name: "If-Match",
type: "Header",
schema: external_exports.string().describe("ETag value.")
}
],
response: external_exports.void()
},
{
method: "delete",
path: "/planner/buckets/:plannerBucketId",
alias: "delete-planner-bucket",
description: `Delete plannerBucket.`,
requestFormat: "json",
parameters: [
{
name: "If-Match",
type: "Header",
schema: external_exports.string().describe("ETag").optional()
}
],
response: external_exports.void()
},
{ {
method: "get", method: "get",
path: "/planner/plans/:plannerPlanId", path: "/planner/plans/:plannerPlanId",
@@ -112798,6 +112990,56 @@ For example, if the user uploads a photo that is 504x504 pixels, all but the 648
], ],
response: external_exports.void() response: external_exports.void()
}, },
{
method: "get",
path: "/planner/plans/:plannerPlanId/buckets",
alias: "list-plan-buckets",
description: `Retrieve a list of plannerBucket objects contained by a plannerPlan object.`,
requestFormat: "json",
parameters: [
{
name: "$top",
type: "Query",
schema: external_exports.number().int().gte(0).describe("Show only the first n items").optional()
},
{
name: "$skip",
type: "Query",
schema: external_exports.number().int().gte(0).describe("Skip the first n items").optional()
},
{
name: "$search",
type: "Query",
schema: external_exports.string().describe("Search items by search phrases").optional()
},
{
name: "$filter",
type: "Query",
schema: external_exports.string().describe("Filter items by property values").optional()
},
{
name: "$count",
type: "Query",
schema: external_exports.boolean().describe("Include count of items").optional()
},
{
name: "$orderby",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Order items by property values").optional()
},
{
name: "$select",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Select properties to be returned").optional()
},
{
name: "$expand",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Expand related entities").optional()
}
],
response: external_exports.void()
},
{ {
method: "get", method: "get",
path: "/planner/plans/:plannerPlanId/tasks", path: "/planner/plans/:plannerPlanId/tasks",
@@ -113486,6 +113728,164 @@ To list them, include system in your $select statement.`,
], ],
response: external_exports.void() response: external_exports.void()
}, },
{
method: "get",
path: "/sites/:siteId/onenote/notebooks",
alias: "list-sharepoint-site-onenote-notebooks",
description: `The collection of OneNote notebooks that are owned by the user or group. Read-only. Nullable.`,
requestFormat: "json",
parameters: [
{
name: "$top",
type: "Query",
schema: external_exports.number().int().gte(0).describe("Show only the first n items").optional()
},
{
name: "$skip",
type: "Query",
schema: external_exports.number().int().gte(0).describe("Skip the first n items").optional()
},
{
name: "$search",
type: "Query",
schema: external_exports.string().describe("Search items by search phrases").optional()
},
{
name: "$filter",
type: "Query",
schema: external_exports.string().describe("Filter items by property values").optional()
},
{
name: "$count",
type: "Query",
schema: external_exports.boolean().describe("Include count of items").optional()
},
{
name: "$orderby",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Order items by property values").optional()
},
{
name: "$select",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Select properties to be returned").optional()
},
{
name: "$expand",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Expand related entities").optional()
}
],
response: external_exports.void()
},
{
method: "get",
path: "/sites/:siteId/onenote/notebooks/:notebookId/sections",
alias: "list-sharepoint-site-onenote-notebook-sections",
description: `The sections in the notebook. Read-only. Nullable.`,
requestFormat: "json",
parameters: [
{
name: "$top",
type: "Query",
schema: external_exports.number().int().gte(0).describe("Show only the first n items").optional()
},
{
name: "$skip",
type: "Query",
schema: external_exports.number().int().gte(0).describe("Skip the first n items").optional()
},
{
name: "$search",
type: "Query",
schema: external_exports.string().describe("Search items by search phrases").optional()
},
{
name: "$filter",
type: "Query",
schema: external_exports.string().describe("Filter items by property values").optional()
},
{
name: "$count",
type: "Query",
schema: external_exports.boolean().describe("Include count of items").optional()
},
{
name: "$orderby",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Order items by property values").optional()
},
{
name: "$select",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Select properties to be returned").optional()
},
{
name: "$expand",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Expand related entities").optional()
}
],
response: external_exports.void()
},
{
method: "get",
path: "/sites/:siteId/onenote/pages/:onenotePageId/content",
alias: "get-sharepoint-site-onenote-page-content",
description: `The page's HTML content.`,
requestFormat: "json",
response: external_exports.void()
},
{
method: "get",
path: "/sites/:siteId/onenote/sections/:onenoteSectionId/pages",
alias: "list-sharepoint-site-onenote-section-pages",
description: `The collection of pages in the section. Read-only. Nullable.`,
requestFormat: "json",
parameters: [
{
name: "$top",
type: "Query",
schema: external_exports.number().int().gte(0).describe("Show only the first n items").optional()
},
{
name: "$skip",
type: "Query",
schema: external_exports.number().int().gte(0).describe("Skip the first n items").optional()
},
{
name: "$search",
type: "Query",
schema: external_exports.string().describe("Search items by search phrases").optional()
},
{
name: "$filter",
type: "Query",
schema: external_exports.string().describe("Filter items by property values").optional()
},
{
name: "$count",
type: "Query",
schema: external_exports.boolean().describe("Include count of items").optional()
},
{
name: "$orderby",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Order items by property values").optional()
},
{
name: "$select",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Select properties to be returned").optional()
},
{
name: "$expand",
type: "Query",
schema: external_exports.array(external_exports.string()).describe("Expand related entities").optional()
}
],
response: external_exports.void()
},
{ {
method: "get", method: "get",
path: "/sites/delta()", path: "/sites/delta()",
@@ -1 +1 @@
{"name":"@softeria/ms-365-mcp-server","version":"0.85.2"} {"name":"@softeria/ms-365-mcp-server","version":"0.86.0"}
+8 -3
View File
@@ -92,9 +92,14 @@ const isDev = process.env.ELECTRON_DEV === '1';
const iconPath = process.platform === 'win32' const iconPath = process.platform === 'win32'
? path.join(__dirname, 'build', 'icon.ico') ? path.join(__dirname, 'build', 'icon.ico')
: path.join(__dirname, 'build', 'icon.png'); : path.join(__dirname, 'build', 'icon.png');
// PNG version of the icon for the splash (icon.ico isn't a valid <img src> // PNG version of the icon for the splash. We ship a copy at splash/icon.png
// payload across platforms, but icon.png works everywhere). // because electron-builder's `build/` directory is its inputs folder (used
const iconPngPath = path.join(__dirname, 'build', 'icon.png'); // to GENERATE the .icns bundled icon) and is NOT included in the shipped
// asar archive — so `build/icon.png` exists in dev but ENOENTs in packaged
// builds. `splash/` IS shipped (alongside splash.html), so reading from
// there works in both modes. See the kept-in-sync copy command in the
// build scripts (or just commit both).
const iconPngPath = path.join(__dirname, 'splash', 'icon.png');
function loadSplashDataUrl() { function loadSplashDataUrl() {
if (splashDataUrlCache) return splashDataUrlCache; if (splashDataUrlCache) return splashDataUrlCache;
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "openswarm", "name": "openswarm",
"version": "1.0.25", "version": "1.0.26",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "openswarm", "name": "openswarm",
"version": "1.0.25", "version": "1.0.26",
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"electron-updater": "^6.3.0", "electron-updater": "^6.3.0",
-2
View File
@@ -97,8 +97,6 @@
"to": "backend", "to": "backend",
"filter": [ "filter": [
"**/*", "**/*",
"!**/.env",
"!**/.env.*",
"!**/tests/**", "!**/tests/**",
"!**/__pycache__/**" "!**/__pycache__/**"
] ]
Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

+39
View File
@@ -91,6 +91,15 @@ if (-not (Test-Path (Join-Path $UvBinDir 'uvx.exe'))) {
} }
Write-Host "" Write-Host ""
# --- Step 0a: Sync the splash icon ---
# electron-builder excludes `build/` from the shipped asar (it's the icon-
# source directory used to generate .ico). The splash window needs to read
# the icon at runtime, so we keep a copy at electron\splash\icon.png which
# IS shipped. See electron/main.js comment at iconPngPath for context.
Copy-Item -Force `
(Join-Path $ProjectRoot 'electron\build\icon.png') `
(Join-Path $ProjectRoot 'electron\splash\icon.png')
# --- Step 0b: Bundle npm MCP servers via esbuild --- # --- Step 0b: Bundle npm MCP servers via esbuild ---
# Each bundle compiles down to a single ~5-15 MB CommonJS file under # Each bundle compiles down to a single ~5-15 MB CommonJS file under
# backend\mcp-bundles\, runs on Electron's bundled Node at runtime # backend\mcp-bundles\, runs on Electron's bundled Node at runtime
@@ -289,6 +298,36 @@ function Copy-Excluded($Source, $Dest, $Exclude) {
Copy-Excluded ` Copy-Excluded `
(Join-Path $ProjectRoot 'backend') (Join-Path $Staging 'backend') ` (Join-Path $ProjectRoot 'backend') (Join-Path $Staging 'backend') `
@{ Dirs = @('__pycache__','.venv','tools','tests'); Files = @('*.pyc','.env','.env.*') } @{ Dirs = @('__pycache__','.venv','tools','tests'); Files = @('*.pyc','.env','.env.*') }
# Generate a SAFE production .env containing ONLY OAuth provider credentials.
# Drops APPLE_*/GH_TOKEN/BACKEND_PORT/etc. so signing keys + personal tokens
# never ship to users. Per-user API keys (Anthropic/OpenAI/Gemini) come from
# the in-app Settings UI. Backend's tools_lib.py:34 auto-loads this file.
$ShipEnvKeys = @(
'GOOGLE_OAUTH_CLIENT_ID','GOOGLE_OAUTH_CLIENT_SECRET',
'NOTION_OAUTH_CLIENT_ID','NOTION_OAUTH_CLIENT_SECRET',
'AIRTABLE_OAUTH_CLIENT_ID','AIRTABLE_OAUTH_CLIENT_SECRET',
'HUBSPOT_OAUTH_CLIENT_ID','HUBSPOT_OAUTH_CLIENT_SECRET',
'DISCORD_OAUTH_CLIENT_ID','DISCORD_OAUTH_CLIENT_SECRET',
'DISCORD_BOT_TOKEN'
)
$DevEnvPath = Join-Path $ProjectRoot 'backend\.env'
$ShipEnvPath = Join-Path $Staging 'backend\.env'
if (Test-Path $DevEnvPath) {
$kept = Get-Content $DevEnvPath | Where-Object {
$line = $_
$keep = $false
foreach ($k in $ShipEnvKeys) {
if ($line -match "^$k=") { $keep = $true; break }
}
$keep
}
Set-Content -Path $ShipEnvPath -Value $kept
Write-Host "Staged OAuth credentials: $($kept.Count) keys (release secrets + personal API keys excluded)"
} else {
Write-Host "WARNING: backend\.env not found — packaged build will have no OAuth credentials configured."
Set-Content -Path $ShipEnvPath -Value '' -NoNewline
}
New-Item -ItemType Directory -Force -Path (Join-Path $Staging 'backend\data\tools') | Out-Null New-Item -ItemType Directory -Force -Path (Join-Path $Staging 'backend\data\tools') | Out-Null
Copy-Excluded ` Copy-Excluded `
+29
View File
@@ -97,6 +97,13 @@ else
fi fi
echo "" echo ""
# Step 0a: Sync the splash icon. electron-builder excludes `build/` from
# the shipped asar (it's the icon-source directory used to generate .icns/.ico),
# so the splash window can't read build/icon.png at runtime. We keep a copy
# at electron/splash/icon.png which IS shipped. See electron/main.js comment
# at iconPngPath for context.
cp "$PROJECT_ROOT/electron/build/icon.png" "$PROJECT_ROOT/electron/splash/icon.png"
# Step 0b: Bundle npm MCP servers via esbuild # Step 0b: Bundle npm MCP servers via esbuild
# Each bundle compiles down to a single ~5-15 MB CommonJS file under # Each bundle compiles down to a single ~5-15 MB CommonJS file under
# backend/mcp-bundles/, runs on Electron's bundled Node at runtime # backend/mcp-bundles/, runs on Electron's bundled Node at runtime
@@ -283,6 +290,28 @@ rsync -a \
--exclude='tests' --exclude='**/tests' \ --exclude='tests' --exclude='**/tests' \
--exclude='.env' --exclude='.env.*' --exclude='**/.env' --exclude='**/.env.*' \ --exclude='.env' --exclude='.env.*' --exclude='**/.env' --exclude='**/.env.*' \
"$PROJECT_ROOT/backend/" "$STAGING_DIR/backend/" "$PROJECT_ROOT/backend/" "$STAGING_DIR/backend/"
# Generate a SAFE production .env containing ONLY the OAuth provider
# credentials (the "OpenSwarm public OAuth app" identifiers — these are
# the desktop-app pattern where the client secret isn't truly secret).
# We deliberately DROP everything else from the dev .env:
# - APPLE_ID / APPLE_APP_SPECIFIC_PASSWORD / APPLE_TEAM_ID (signing creds — must NOT ship)
# - GH_TOKEN (release upload token — must NOT ship)
# - BACKEND_PORT / DISCORD_BOT_PERMISSIONS (dev-only or trivially recomputable)
# Backend's tools_lib.py:34 calls load_dotenv() on this path at startup,
# so the OAuth flows pick these up automatically. Per-user API keys
# (Anthropic, OpenAI, Gemini) come from the user's Settings UI, not from .env.
SHIP_ENV_KEYS='^(GOOGLE_OAUTH_CLIENT_ID|GOOGLE_OAUTH_CLIENT_SECRET|NOTION_OAUTH_CLIENT_ID|NOTION_OAUTH_CLIENT_SECRET|AIRTABLE_OAUTH_CLIENT_ID|AIRTABLE_OAUTH_CLIENT_SECRET|HUBSPOT_OAUTH_CLIENT_ID|HUBSPOT_OAUTH_CLIENT_SECRET|DISCORD_OAUTH_CLIENT_ID|DISCORD_OAUTH_CLIENT_SECRET|DISCORD_BOT_TOKEN)='
if [[ -f "$PROJECT_ROOT/backend/.env" ]]; then
# Only emit lines whose key matches the allow-list. Comment lines and
# blank lines are dropped (they're not needed in the shipped file).
grep -E "$SHIP_ENV_KEYS" "$PROJECT_ROOT/backend/.env" > "$STAGING_DIR/backend/.env" || true
KEY_COUNT=$(wc -l < "$STAGING_DIR/backend/.env" | tr -d ' ')
echo "Staged OAuth credentials: $KEY_COUNT keys (release secrets + personal API keys excluded)"
else
echo "WARNING: backend/.env not found — packaged build will have no OAuth credentials configured."
: > "$STAGING_DIR/backend/.env"
fi
# Create empty tools directory so the app has a place to write # Create empty tools directory so the app has a place to write
mkdir -p "$STAGING_DIR/backend/data/tools" mkdir -p "$STAGING_DIR/backend/data/tools"