@zhin.js/plugin-calendar 0.0.0-stage → 0.1.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/CHANGELOG.md +14 -0
- package/README.md +189 -2
- package/commands/calendar/auth/index.js +26 -0
- package/commands/calendar/auth/index.ts +29 -0
- package/commands/calendar/logout/index.js +18 -0
- package/commands/calendar/logout/index.ts +18 -0
- package/commands/calendar/status/index.js +10 -0
- package/commands/calendar/status/index.ts +10 -0
- package/lib/caldav.d.ts +18 -0
- package/lib/caldav.d.ts.map +1 -0
- package/lib/caldav.js +232 -0
- package/lib/caldav.js.map +1 -0
- package/lib/chat-auth.d.ts +49 -0
- package/lib/chat-auth.d.ts.map +1 -0
- package/lib/chat-auth.js +247 -0
- package/lib/chat-auth.js.map +1 -0
- package/lib/cli/auth.d.ts +3 -0
- package/lib/cli/auth.d.ts.map +1 -0
- package/lib/cli/auth.js +182 -0
- package/lib/cli/auth.js.map +1 -0
- package/lib/config.d.ts +87 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +95 -0
- package/lib/config.js.map +1 -0
- package/lib/credential-store.d.ts +30 -0
- package/lib/credential-store.d.ts.map +1 -0
- package/lib/credential-store.js +42 -0
- package/lib/credential-store.js.map +1 -0
- package/lib/free-time.d.ts +13 -0
- package/lib/free-time.d.ts.map +1 -0
- package/lib/free-time.js +96 -0
- package/lib/free-time.js.map +1 -0
- package/lib/http-callback.d.ts +13 -0
- package/lib/http-callback.d.ts.map +1 -0
- package/lib/http-callback.js +26 -0
- package/lib/http-callback.js.map +1 -0
- package/lib/index.d.ts +32 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +122 -0
- package/lib/index.js.map +1 -0
- package/lib/oauth-auth.d.ts +37 -0
- package/lib/oauth-auth.d.ts.map +1 -0
- package/lib/oauth-auth.js +91 -0
- package/lib/oauth-auth.js.map +1 -0
- package/lib/oauth-session.d.ts +27 -0
- package/lib/oauth-session.d.ts.map +1 -0
- package/lib/oauth-session.js +43 -0
- package/lib/oauth-session.js.map +1 -0
- package/lib/oauth.d.ts +28 -0
- package/lib/oauth.d.ts.map +1 -0
- package/lib/oauth.js +200 -0
- package/lib/oauth.js.map +1 -0
- package/lib/runtime.d.ts +11 -0
- package/lib/runtime.d.ts.map +1 -0
- package/lib/runtime.js +3 -0
- package/lib/runtime.js.map +1 -0
- package/lib/secrets.d.ts +3 -0
- package/lib/secrets.d.ts.map +1 -0
- package/lib/secrets.js +6 -0
- package/lib/secrets.js.map +1 -0
- package/lib/time.d.ts +37 -0
- package/lib/time.d.ts.map +1 -0
- package/lib/time.js +118 -0
- package/lib/time.js.map +1 -0
- package/lib/token-manager.d.ts +71 -0
- package/lib/token-manager.d.ts.map +1 -0
- package/lib/token-manager.js +239 -0
- package/lib/token-manager.js.map +1 -0
- package/lib/tool-errors.d.ts +6 -0
- package/lib/tool-errors.d.ts.map +1 -0
- package/lib/tool-errors.js +17 -0
- package/lib/tool-errors.js.map +1 -0
- package/lib/types.d.ts +28 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/package.json +104 -3
- package/plugin.js +71 -0
- package/skills/calendar-scheduling/SKILL.md +38 -0
- package/skills/calendar-scheduling/tools/create_event/index.js +38 -0
- package/skills/calendar-scheduling/tools/create_event/index.ts +44 -0
- package/skills/calendar-scheduling/tools/find_free_time/index.js +46 -0
- package/skills/calendar-scheduling/tools/find_free_time/index.ts +50 -0
- package/skills/calendar-scheduling/tools/list_events/index.js +32 -0
- package/skills/calendar-scheduling/tools/list_events/index.ts +42 -0
- package/src/caldav.ts +263 -0
- package/src/chat-auth.ts +352 -0
- package/src/cli/auth.ts +235 -0
- package/src/config.ts +108 -0
- package/src/credential-store.ts +79 -0
- package/src/free-time.ts +128 -0
- package/src/http-callback.ts +55 -0
- package/src/index.ts +193 -0
- package/src/oauth-auth.ts +145 -0
- package/src/oauth-session.ts +65 -0
- package/src/oauth.ts +298 -0
- package/src/runtime.ts +16 -0
- package/src/secrets.ts +5 -0
- package/src/time.ts +167 -0
- package/src/token-manager.ts +358 -0
- package/src/tool-errors.ts +18 -0
- package/src/types.ts +37 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export const OAUTH_SESSION_TTL_MS = 10 * 60 * 1000;
|
|
2
|
+
export class OAuthSessionRegistry {
|
|
3
|
+
#sessions = new Map();
|
|
4
|
+
#now;
|
|
5
|
+
#ttlMs;
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
this.#now = options.now ?? Date.now;
|
|
8
|
+
this.#ttlMs = options.ttlMs ?? OAUTH_SESSION_TTL_MS;
|
|
9
|
+
}
|
|
10
|
+
create(session) {
|
|
11
|
+
this.pruneExpired();
|
|
12
|
+
const created = {
|
|
13
|
+
...session,
|
|
14
|
+
expiresAt: this.#now() + this.#ttlMs,
|
|
15
|
+
};
|
|
16
|
+
this.#sessions.set(session.state, created);
|
|
17
|
+
return created;
|
|
18
|
+
}
|
|
19
|
+
/** Removes and returns the session; a state can only be consumed once. */
|
|
20
|
+
consume(state) {
|
|
21
|
+
const session = this.#sessions.get(state);
|
|
22
|
+
if (!session) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
this.#sessions.delete(state);
|
|
26
|
+
if (session.expiresAt <= this.#now()) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
return session;
|
|
30
|
+
}
|
|
31
|
+
pruneExpired() {
|
|
32
|
+
const now = this.#now();
|
|
33
|
+
for (const [state, session] of this.#sessions) {
|
|
34
|
+
if (session.expiresAt <= now) {
|
|
35
|
+
this.#sessions.delete(state);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
get size() {
|
|
40
|
+
return this.#sessions.size;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=oauth-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-session.js","sourceRoot":"","sources":["../src/oauth-session.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAWnD,MAAM,OAAO,oBAAoB;IACtB,SAAS,GAAG,IAAI,GAAG,EAAmC,CAAC;IACvD,IAAI,CAAe;IACnB,MAAM,CAAS;IAExB,YAAY,UAAkD,EAAE;QAC9D,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,oBAAoB,CAAC;IACtD,CAAC;IAED,MAAM,CACJ,OAAmD;QAEnD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,OAAO,GAA4B;YACvC,GAAG,OAAO;YACV,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM;SACrC,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,0EAA0E;IAC1E,OAAO,CAAC,KAAa;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,YAAY;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9C,IAAI,OAAO,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;gBAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;CACF"}
|
package/lib/oauth.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Calendar and Microsoft Graph providers backed by OAuthTokenManager
|
|
3
|
+
* (refresh_token flow; access tokens are never stored in config).
|
|
4
|
+
*/
|
|
5
|
+
import type { CalendarProvider } from "./types.js";
|
|
6
|
+
import { OAuthTokenManager, type AuthorizationLostListener, type RefreshTokenStore, type TokenManagerLogger } from "./token-manager.js";
|
|
7
|
+
export interface OAuthCalendarOptions {
|
|
8
|
+
readonly clientId: string;
|
|
9
|
+
readonly clientSecret?: string;
|
|
10
|
+
/** Fallback refresh token from config/env. */
|
|
11
|
+
readonly refreshToken?: string;
|
|
12
|
+
readonly tokenStore?: RefreshTokenStore;
|
|
13
|
+
readonly onAuthorizationLost?: AuthorizationLostListener;
|
|
14
|
+
/** Use an existing manager (shared with the chat auth flow) instead of creating one. */
|
|
15
|
+
readonly tokenManager?: OAuthTokenManager;
|
|
16
|
+
readonly calendarId: string;
|
|
17
|
+
readonly timezone: string;
|
|
18
|
+
readonly tenant?: string;
|
|
19
|
+
/** Optional JSON file to persist rotated refresh tokens. */
|
|
20
|
+
readonly tokenFile?: string;
|
|
21
|
+
readonly fetchImpl?: typeof fetch;
|
|
22
|
+
readonly logger?: TokenManagerLogger;
|
|
23
|
+
}
|
|
24
|
+
export declare function createGoogleCalendarProvider(options: OAuthCalendarOptions): CalendarProvider;
|
|
25
|
+
/** Default calendar when id empty / primary / me. */
|
|
26
|
+
export declare function microsoftCalendarBase(calendarId: string): string;
|
|
27
|
+
export declare function createMicrosoftCalendarProvider(options: OAuthCalendarOptions): CalendarProvider;
|
|
28
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAEV,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,iBAAiB,EACjB,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,8CAA8C;IAC9C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,yBAAyB,CAAC;IACzD,wFAAwF;IACxF,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CACtC;AAwED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,oBAAoB,GAC5B,gBAAgB,CAkFlB;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAQhE;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,oBAAoB,GAC5B,gBAAgB,CA6FlB"}
|
package/lib/oauth.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { formatInZone } from "./time.js";
|
|
2
|
+
import { OAuthTokenManager, } from "./token-manager.js";
|
|
3
|
+
function mapGoogleEvent(item, timezone) {
|
|
4
|
+
const start = item.start ?? {};
|
|
5
|
+
const end = item.end ?? {};
|
|
6
|
+
const startDate = new Date(start.dateTime ?? start.date ?? "");
|
|
7
|
+
const endDate = new Date(end.dateTime ?? end.date ?? "");
|
|
8
|
+
return {
|
|
9
|
+
id: String(item.id ?? ""),
|
|
10
|
+
title: String(item.summary ?? "(无标题)"),
|
|
11
|
+
start: formatInZone(startDate, timezone),
|
|
12
|
+
end: formatInZone(endDate, timezone),
|
|
13
|
+
location: item.location ? String(item.location) : undefined,
|
|
14
|
+
description: item.description ? String(item.description) : undefined,
|
|
15
|
+
all_day: Boolean(start.date && !start.dateTime),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function mapMicrosoftEvent(item, timezone) {
|
|
19
|
+
const start = item.start ?? {};
|
|
20
|
+
const end = item.end ?? {};
|
|
21
|
+
const startRaw = start.dateTime ?? "";
|
|
22
|
+
const endRaw = end.dateTime ?? "";
|
|
23
|
+
const startDate = new Date(/[zZ]|[+-]\d{2}:?\d{2}$/.test(startRaw) ? startRaw : `${startRaw}Z`);
|
|
24
|
+
const endDate = new Date(/[zZ]|[+-]\d{2}:?\d{2}$/.test(endRaw) ? endRaw : `${endRaw}Z`);
|
|
25
|
+
return {
|
|
26
|
+
id: String(item.id ?? ""),
|
|
27
|
+
title: String(item.subject ?? "(无标题)"),
|
|
28
|
+
start: formatInZone(startDate, timezone),
|
|
29
|
+
end: formatInZone(endDate, timezone),
|
|
30
|
+
location: item.location
|
|
31
|
+
? String(item.location.displayName ?? "")
|
|
32
|
+
: undefined,
|
|
33
|
+
description: item.bodyPreview ? String(item.bodyPreview) : undefined,
|
|
34
|
+
all_day: Boolean(item.isAllDay),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async function withBearer(manager, fetchImpl, url, init, extraHeaders) {
|
|
38
|
+
const token = await manager.getAccessToken();
|
|
39
|
+
const headers = {
|
|
40
|
+
...init.headers,
|
|
41
|
+
...extraHeaders,
|
|
42
|
+
authorization: `Bearer ${token}`,
|
|
43
|
+
};
|
|
44
|
+
let response = await fetchImpl(url, { ...init, headers });
|
|
45
|
+
if (response.status === 401) {
|
|
46
|
+
const fresh = await manager.forceRefresh();
|
|
47
|
+
response = await fetchImpl(url, {
|
|
48
|
+
...init,
|
|
49
|
+
headers: { ...headers, authorization: `Bearer ${fresh}` },
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return response;
|
|
53
|
+
}
|
|
54
|
+
export function createGoogleCalendarProvider(options) {
|
|
55
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
56
|
+
const manager = options.tokenManager ??
|
|
57
|
+
new OAuthTokenManager({
|
|
58
|
+
provider: "google",
|
|
59
|
+
clientId: options.clientId,
|
|
60
|
+
clientSecret: options.clientSecret,
|
|
61
|
+
initialRefreshToken: options.refreshToken,
|
|
62
|
+
tokenFile: options.tokenFile,
|
|
63
|
+
fetchImpl,
|
|
64
|
+
logger: options.logger,
|
|
65
|
+
tokenStore: options.tokenStore,
|
|
66
|
+
onAuthorizationLost: options.onAuthorizationLost,
|
|
67
|
+
});
|
|
68
|
+
const calendarId = encodeURIComponent(options.calendarId.trim() || "primary");
|
|
69
|
+
let hydrated = false;
|
|
70
|
+
async function ensureHydrated() {
|
|
71
|
+
if (hydrated)
|
|
72
|
+
return;
|
|
73
|
+
await manager.hydrate();
|
|
74
|
+
hydrated = true;
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
name: "google",
|
|
78
|
+
async listEvents(from, to, signal) {
|
|
79
|
+
await ensureHydrated();
|
|
80
|
+
const url = new URL(`https://www.googleapis.com/calendar/v3/calendars/${calendarId}/events`);
|
|
81
|
+
url.searchParams.set("timeMin", from.toISOString());
|
|
82
|
+
url.searchParams.set("timeMax", to.toISOString());
|
|
83
|
+
url.searchParams.set("singleEvents", "true");
|
|
84
|
+
url.searchParams.set("orderBy", "startTime");
|
|
85
|
+
const response = await withBearer(manager, fetchImpl, url.toString(), {
|
|
86
|
+
signal,
|
|
87
|
+
});
|
|
88
|
+
if (!response.ok) {
|
|
89
|
+
const detail = (await response.text().catch(() => "")).slice(0, 300);
|
|
90
|
+
throw new Error(`Google Calendar 列表失败:HTTP ${response.status} ${detail}`);
|
|
91
|
+
}
|
|
92
|
+
const data = (await response.json());
|
|
93
|
+
return (data.items ?? []).map((item) => mapGoogleEvent(item, options.timezone));
|
|
94
|
+
},
|
|
95
|
+
async createEvent(input, signal) {
|
|
96
|
+
await ensureHydrated();
|
|
97
|
+
const body = {
|
|
98
|
+
summary: input.title,
|
|
99
|
+
description: input.description,
|
|
100
|
+
location: input.location,
|
|
101
|
+
start: input.all_day
|
|
102
|
+
? { date: input.start.toISOString().slice(0, 10) }
|
|
103
|
+
: { dateTime: input.start.toISOString(), timeZone: options.timezone },
|
|
104
|
+
end: input.all_day
|
|
105
|
+
? { date: input.end.toISOString().slice(0, 10) }
|
|
106
|
+
: { dateTime: input.end.toISOString(), timeZone: options.timezone },
|
|
107
|
+
};
|
|
108
|
+
const response = await withBearer(manager, fetchImpl, `https://www.googleapis.com/calendar/v3/calendars/${calendarId}/events`, {
|
|
109
|
+
method: "POST",
|
|
110
|
+
headers: { "content-type": "application/json" },
|
|
111
|
+
body: JSON.stringify(body),
|
|
112
|
+
signal,
|
|
113
|
+
});
|
|
114
|
+
if (!response.ok)
|
|
115
|
+
throw new Error(`Google Calendar 创建失败:HTTP ${response.status}`);
|
|
116
|
+
return mapGoogleEvent((await response.json()), options.timezone);
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/** Default calendar when id empty / primary / me. */
|
|
121
|
+
export function microsoftCalendarBase(calendarId) {
|
|
122
|
+
const id = calendarId.trim();
|
|
123
|
+
if (!id || id === "primary" || id === "me") {
|
|
124
|
+
return "https://graph.microsoft.com/v1.0/me/calendar";
|
|
125
|
+
}
|
|
126
|
+
return `https://graph.microsoft.com/v1.0/me/calendars/${encodeURIComponent(id)}`;
|
|
127
|
+
}
|
|
128
|
+
export function createMicrosoftCalendarProvider(options) {
|
|
129
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
130
|
+
const manager = options.tokenManager ??
|
|
131
|
+
new OAuthTokenManager({
|
|
132
|
+
provider: "microsoft",
|
|
133
|
+
clientId: options.clientId,
|
|
134
|
+
clientSecret: options.clientSecret,
|
|
135
|
+
tenant: options.tenant,
|
|
136
|
+
initialRefreshToken: options.refreshToken,
|
|
137
|
+
tokenFile: options.tokenFile,
|
|
138
|
+
fetchImpl,
|
|
139
|
+
logger: options.logger,
|
|
140
|
+
tokenStore: options.tokenStore,
|
|
141
|
+
onAuthorizationLost: options.onAuthorizationLost,
|
|
142
|
+
});
|
|
143
|
+
const base = microsoftCalendarBase(options.calendarId);
|
|
144
|
+
let hydrated = false;
|
|
145
|
+
async function ensureHydrated() {
|
|
146
|
+
if (hydrated)
|
|
147
|
+
return;
|
|
148
|
+
await manager.hydrate();
|
|
149
|
+
hydrated = true;
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
name: "microsoft",
|
|
153
|
+
async listEvents(from, to, signal) {
|
|
154
|
+
await ensureHydrated();
|
|
155
|
+
const url = new URL(`${base}/calendarView`);
|
|
156
|
+
url.searchParams.set("startDateTime", from.toISOString());
|
|
157
|
+
url.searchParams.set("endDateTime", to.toISOString());
|
|
158
|
+
url.searchParams.set("$orderby", "start/dateTime");
|
|
159
|
+
url.searchParams.set("$top", "50");
|
|
160
|
+
const response = await withBearer(manager, fetchImpl, url.toString(), { signal }, {
|
|
161
|
+
prefer: `outlook.timezone="${options.timezone}"`,
|
|
162
|
+
});
|
|
163
|
+
if (!response.ok) {
|
|
164
|
+
const detail = (await response.text().catch(() => "")).slice(0, 300);
|
|
165
|
+
throw new Error(`Microsoft Graph 列表失败:HTTP ${response.status} ${detail}`);
|
|
166
|
+
}
|
|
167
|
+
const data = (await response.json());
|
|
168
|
+
return (data.value ?? []).map((item) => mapMicrosoftEvent(item, options.timezone));
|
|
169
|
+
},
|
|
170
|
+
async createEvent(input, signal) {
|
|
171
|
+
await ensureHydrated();
|
|
172
|
+
const body = {
|
|
173
|
+
subject: input.title,
|
|
174
|
+
body: input.description
|
|
175
|
+
? { contentType: "Text", content: input.description }
|
|
176
|
+
: undefined,
|
|
177
|
+
location: input.location ? { displayName: input.location } : undefined,
|
|
178
|
+
start: {
|
|
179
|
+
dateTime: input.start.toISOString().replace(/\.\d{3}Z$/, ""),
|
|
180
|
+
timeZone: "UTC",
|
|
181
|
+
},
|
|
182
|
+
end: {
|
|
183
|
+
dateTime: input.end.toISOString().replace(/\.\d{3}Z$/, ""),
|
|
184
|
+
timeZone: "UTC",
|
|
185
|
+
},
|
|
186
|
+
isAllDay: Boolean(input.all_day),
|
|
187
|
+
};
|
|
188
|
+
const response = await withBearer(manager, fetchImpl, `${base}/events`, {
|
|
189
|
+
method: "POST",
|
|
190
|
+
headers: { "content-type": "application/json" },
|
|
191
|
+
body: JSON.stringify(body),
|
|
192
|
+
signal,
|
|
193
|
+
}, { prefer: `outlook.timezone="${options.timezone}"` });
|
|
194
|
+
if (!response.ok)
|
|
195
|
+
throw new Error(`Microsoft Graph 创建失败:HTTP ${response.status}`);
|
|
196
|
+
return mapMicrosoftEvent((await response.json()), options.timezone);
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=oauth.js.map
|
package/lib/oauth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,iBAAiB,GAIlB,MAAM,oBAAoB,CAAC;AAoB5B,SAAS,cAAc,CACrB,IAA6B,EAC7B,QAAgB;IAEhB,MAAM,KAAK,GAAI,IAAI,CAAC,KAA8C,IAAI,EAAE,CAAC;IACzE,MAAM,GAAG,GAAI,IAAI,CAAC,GAA4C,IAAI,EAAE,CAAC;IACrE,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACzD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;QACtC,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC;QACxC,GAAG,EAAE,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC;QACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3D,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;QACpE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,IAA6B,EAC7B,QAAgB;IAEhB,MAAM,KAAK,GAAI,IAAI,CAAC,KAA+B,IAAI,EAAE,CAAC;IAC1D,MAAM,GAAG,GAAI,IAAI,CAAC,GAA6B,IAAI,EAAE,CAAC;IACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,IAAI,CACxB,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,CACpE,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,IAAI,CACtB,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAC9D,CAAC;IACF,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;QACtC,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC;QACxC,GAAG,EAAE,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC;QACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACrB,CAAC,CAAC,MAAM,CAAE,IAAI,CAAC,QAAqC,CAAC,WAAW,IAAI,EAAE,CAAC;YACvE,CAAC,CAAC,SAAS;QACb,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;QACpE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,OAA0B,EAC1B,SAAuB,EACvB,GAAW,EACX,IAAiB,EACjB,YAAqC;IAErC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG;QACd,GAAI,IAAI,CAAC,OAA8C;QACvD,GAAG,YAAY;QACf,aAAa,EAAE,UAAU,KAAK,EAAE;KACjC,CAAC;IACF,IAAI,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;QAC3C,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YAC9B,GAAG,IAAI;YACP,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC1D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,OAA6B;IAE7B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC7C,MAAM,OAAO,GACX,OAAO,CAAC,YAAY;QACpB,IAAI,iBAAiB,CAAC;YACpB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,mBAAmB,EAAE,OAAO,CAAC,YAAY;YACzC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS;YACT,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;SACjD,CAAC,CAAC;IACL,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,CAAC;IAC9E,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,UAAU,cAAc;QAC3B,IAAI,QAAQ;YAAE,OAAO;QACrB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM;YAC/B,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,oDAAoD,UAAU,SAAS,CACxE,CAAC;YACF,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACpD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YAC7C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE;gBACpE,MAAM;aACP,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACrE,MAAM,IAAI,KAAK,CACb,6BAA6B,QAAQ,CAAC,MAAM,IAAI,MAAM,EAAE,CACzD,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACrC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CACvC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM;YAC7B,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG;gBACX,OAAO,EAAE,KAAK,CAAC,KAAK;gBACpB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,KAAK,EAAE,KAAK,CAAC,OAAO;oBAClB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;oBAClD,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;gBACvE,GAAG,EAAE,KAAK,CAAC,OAAO;oBAChB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;oBAChD,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;aACtE,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,OAAO,EACP,SAAS,EACT,oDAAoD,UAAU,SAAS,EACvE;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM;aACP,CACF,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBACd,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAClE,OAAO,cAAc,CACnB,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,EAClD,OAAO,CAAC,QAAQ,CACjB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO,8CAA8C,CAAC;IACxD,CAAC;IACD,OAAO,iDAAiD,kBAAkB,CACxE,EAAE,CACH,EAAE,CAAC;AACN,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,OAA6B;IAE7B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC7C,MAAM,OAAO,GACX,OAAO,CAAC,YAAY;QACpB,IAAI,iBAAiB,CAAC;YACpB,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,mBAAmB,EAAE,OAAO,CAAC,YAAY;YACzC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS;YACT,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;SACjD,CAAC,CAAC;IACL,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACvD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,UAAU,cAAc;QAC3B,IAAI,QAAQ;YAAE,OAAO;QACrB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM;YAC/B,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC;YAC5C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YACtD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;YACnD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,OAAO,EACP,SAAS,EACT,GAAG,CAAC,QAAQ,EAAE,EACd,EAAE,MAAM,EAAE,EACV;gBACE,MAAM,EAAE,qBAAqB,OAAO,CAAC,QAAQ,GAAG;aACjD,CACF,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACrE,MAAM,IAAI,KAAK,CACb,6BAA6B,QAAQ,CAAC,MAAM,IAAI,MAAM,EAAE,CACzD,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACrC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAC1C,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM;YAC7B,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG;gBACX,OAAO,EAAE,KAAK,CAAC,KAAK;gBACpB,IAAI,EAAE,KAAK,CAAC,WAAW;oBACrB,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE;oBACrD,CAAC,CAAC,SAAS;gBACb,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;gBACtE,KAAK,EAAE;oBACL,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC5D,QAAQ,EAAE,KAAK;iBAChB;gBACD,GAAG,EAAE;oBACH,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC1D,QAAQ,EAAE,KAAK;iBAChB;gBACD,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;aACjC,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,OAAO,EACP,SAAS,EACT,GAAG,IAAI,SAAS,EAChB;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM;aACP,EACD,EAAE,MAAM,EAAE,qBAAqB,OAAO,CAAC,QAAQ,GAAG,EAAE,CACrD,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBACd,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAClE,OAAO,iBAAiB,CACtB,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,EAClD,OAAO,CAAC,QAAQ,CACjB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/lib/runtime.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CalendarConfig } from "./config.js";
|
|
2
|
+
import type { CalendarProvider } from "./types.js";
|
|
3
|
+
import type { CalendarAuthService } from "./chat-auth.js";
|
|
4
|
+
export interface CalendarRuntime {
|
|
5
|
+
readonly config: CalendarConfig;
|
|
6
|
+
readonly provider: CalendarProvider | undefined;
|
|
7
|
+
/** Chat authorization flow used by the `calendar` commands. */
|
|
8
|
+
readonly auth: CalendarAuthService<unknown>;
|
|
9
|
+
}
|
|
10
|
+
export declare const calendarRuntimeToken: import("zhin.js").Token<CalendarRuntime>;
|
|
11
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAChD,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;CAC7C;AAED,eAAO,MAAM,oBAAoB,0CAGhC,CAAC"}
|
package/lib/runtime.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAYtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,WAAW,CAC7C,uBAAuB,EACvB,2CAA2C,CAC5C,CAAC"}
|
package/lib/secrets.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGjD"}
|
package/lib/secrets.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC"}
|
package/lib/time.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timezone helpers built on Intl (no dependencies).
|
|
3
|
+
*/
|
|
4
|
+
export interface ZonedParts {
|
|
5
|
+
year: number;
|
|
6
|
+
month: number;
|
|
7
|
+
day: number;
|
|
8
|
+
hour: number;
|
|
9
|
+
minute: number;
|
|
10
|
+
second: number;
|
|
11
|
+
weekday: number;
|
|
12
|
+
}
|
|
13
|
+
/** Throws a readable error for unknown IANA zones. */
|
|
14
|
+
export declare function assertTimeZone(timeZone: string): void;
|
|
15
|
+
/** Wall-clock parts of `date` in `timeZone`. */
|
|
16
|
+
export declare function zonedParts(date: Date, timeZone: string): ZonedParts;
|
|
17
|
+
/** Offset (ms) of `timeZone` from UTC at instant `date`. */
|
|
18
|
+
export declare function timeZoneOffsetMs(date: Date, timeZone: string): number;
|
|
19
|
+
/** Converts a wall-clock time in `timeZone` to a UTC instant. */
|
|
20
|
+
export declare function zonedTimeToUtc(wall: {
|
|
21
|
+
year: number;
|
|
22
|
+
month: number;
|
|
23
|
+
day: number;
|
|
24
|
+
hour: number;
|
|
25
|
+
minute: number;
|
|
26
|
+
second?: number;
|
|
27
|
+
}, timeZone: string): Date;
|
|
28
|
+
/** Formats an instant as `YYYY-MM-DD HH:mm` in `timeZone`. */
|
|
29
|
+
export declare function formatInZone(date: Date, timeZone: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Parses an ISO-8601 date-time. Without an explicit offset/`Z`, the value is
|
|
32
|
+
* interpreted as wall-clock time in `timeZone`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseDateTimeInZone(value: string, timeZone: string): Date;
|
|
35
|
+
/** Parses durations like `10m`, `2h30m`, `1d`, `90s`. */
|
|
36
|
+
export declare function parseDuration(value: string): number;
|
|
37
|
+
//# sourceMappingURL=time.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAiCD,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMrD;AAED,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAanE;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWrE;AAED,iEAAiE;AACjE,wBAAgB,cAAc,CAC5B,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,EACD,QAAQ,EAAE,MAAM,GACf,IAAI,CAYN;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMjE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAsBzE;AAED,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAmBnD"}
|
package/lib/time.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timezone helpers built on Intl (no dependencies).
|
|
3
|
+
*/
|
|
4
|
+
const formatterCache = new Map();
|
|
5
|
+
function formatterFor(timeZone) {
|
|
6
|
+
let formatter = formatterCache.get(timeZone);
|
|
7
|
+
if (!formatter) {
|
|
8
|
+
formatter = new Intl.DateTimeFormat("en-US", {
|
|
9
|
+
timeZone,
|
|
10
|
+
hourCycle: "h23",
|
|
11
|
+
year: "numeric",
|
|
12
|
+
month: "numeric",
|
|
13
|
+
day: "numeric",
|
|
14
|
+
hour: "numeric",
|
|
15
|
+
minute: "numeric",
|
|
16
|
+
second: "numeric",
|
|
17
|
+
weekday: "short",
|
|
18
|
+
});
|
|
19
|
+
formatterCache.set(timeZone, formatter);
|
|
20
|
+
}
|
|
21
|
+
return formatter;
|
|
22
|
+
}
|
|
23
|
+
const WEEKDAYS = {
|
|
24
|
+
Sun: 0,
|
|
25
|
+
Mon: 1,
|
|
26
|
+
Tue: 2,
|
|
27
|
+
Wed: 3,
|
|
28
|
+
Thu: 4,
|
|
29
|
+
Fri: 5,
|
|
30
|
+
Sat: 6,
|
|
31
|
+
};
|
|
32
|
+
/** Throws a readable error for unknown IANA zones. */
|
|
33
|
+
export function assertTimeZone(timeZone) {
|
|
34
|
+
try {
|
|
35
|
+
formatterFor(timeZone);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new Error(`未知时区:${timeZone}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Wall-clock parts of `date` in `timeZone`. */
|
|
42
|
+
export function zonedParts(date, timeZone) {
|
|
43
|
+
const parts = {};
|
|
44
|
+
for (const part of formatterFor(timeZone).formatToParts(date))
|
|
45
|
+
parts[part.type] = part.value;
|
|
46
|
+
return {
|
|
47
|
+
year: Number(parts.year),
|
|
48
|
+
month: Number(parts.month),
|
|
49
|
+
day: Number(parts.day),
|
|
50
|
+
hour: Number(parts.hour),
|
|
51
|
+
minute: Number(parts.minute),
|
|
52
|
+
second: Number(parts.second),
|
|
53
|
+
weekday: WEEKDAYS[parts.weekday ?? "Sun"] ?? 0,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Offset (ms) of `timeZone` from UTC at instant `date`. */
|
|
57
|
+
export function timeZoneOffsetMs(date, timeZone) {
|
|
58
|
+
const parts = zonedParts(date, timeZone);
|
|
59
|
+
const asUtc = Date.UTC(parts.year, parts.month - 1, parts.day, parts.hour, parts.minute, parts.second);
|
|
60
|
+
return asUtc - Math.floor(date.getTime() / 1000) * 1000;
|
|
61
|
+
}
|
|
62
|
+
/** Converts a wall-clock time in `timeZone` to a UTC instant. */
|
|
63
|
+
export function zonedTimeToUtc(wall, timeZone) {
|
|
64
|
+
const guess = Date.UTC(wall.year, wall.month - 1, wall.day, wall.hour, wall.minute, wall.second ?? 0);
|
|
65
|
+
const first = guess - timeZoneOffsetMs(new Date(guess), timeZone);
|
|
66
|
+
const second = guess - timeZoneOffsetMs(new Date(first), timeZone);
|
|
67
|
+
return new Date(second);
|
|
68
|
+
}
|
|
69
|
+
/** Formats an instant as `YYYY-MM-DD HH:mm` in `timeZone`. */
|
|
70
|
+
export function formatInZone(date, timeZone) {
|
|
71
|
+
const p = zonedParts(date, timeZone);
|
|
72
|
+
const pad = (value) => String(value).padStart(2, "0");
|
|
73
|
+
return `${p.year}-${pad(p.month)}-${pad(p.day)} ${pad(p.hour)}:${pad(p.minute)}`;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Parses an ISO-8601 date-time. Without an explicit offset/`Z`, the value is
|
|
77
|
+
* interpreted as wall-clock time in `timeZone`.
|
|
78
|
+
*/
|
|
79
|
+
export function parseDateTimeInZone(value, timeZone) {
|
|
80
|
+
const text = value.trim();
|
|
81
|
+
if (/([zZ]|[+-]\d{2}:?\d{2})$/.test(text)) {
|
|
82
|
+
const date = new Date(text);
|
|
83
|
+
if (Number.isNaN(date.getTime()))
|
|
84
|
+
throw new Error(`无法解析时间:${value}`);
|
|
85
|
+
return date;
|
|
86
|
+
}
|
|
87
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2}))?)?$/.exec(text);
|
|
88
|
+
if (!match)
|
|
89
|
+
throw new Error(`无法解析时间:${value}(请用 YYYY-MM-DDTHH:mm 格式)`);
|
|
90
|
+
return zonedTimeToUtc({
|
|
91
|
+
year: Number(match[1]),
|
|
92
|
+
month: Number(match[2]),
|
|
93
|
+
day: Number(match[3]),
|
|
94
|
+
hour: Number(match[4] ?? 0),
|
|
95
|
+
minute: Number(match[5] ?? 0),
|
|
96
|
+
second: Number(match[6] ?? 0),
|
|
97
|
+
}, timeZone);
|
|
98
|
+
}
|
|
99
|
+
/** Parses durations like `10m`, `2h30m`, `1d`, `90s`. */
|
|
100
|
+
export function parseDuration(value) {
|
|
101
|
+
const text = value.trim().toLowerCase();
|
|
102
|
+
const pattern = /(\d+)\s*(d|h|m|s)/g;
|
|
103
|
+
let total = 0;
|
|
104
|
+
let consumed = "";
|
|
105
|
+
for (const match of text.matchAll(pattern)) {
|
|
106
|
+
const amount = Number(match[1]);
|
|
107
|
+
const unit = match[2];
|
|
108
|
+
total +=
|
|
109
|
+
amount *
|
|
110
|
+
{ d: 86400000, h: 3600000, m: 60000, s: 1000 }[unit];
|
|
111
|
+
consumed += match[0];
|
|
112
|
+
}
|
|
113
|
+
if (total <= 0 || consumed.replace(/\s/g, "") !== text.replace(/\s/g, "")) {
|
|
114
|
+
throw new Error(`无法解析时长:${value}(示例:10m、2h30m、1d)`);
|
|
115
|
+
}
|
|
116
|
+
return total;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=time.js.map
|
package/lib/time.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export type OAuthProviderKind = "google" | "microsoft";
|
|
2
|
+
export interface TokenSet {
|
|
3
|
+
readonly accessToken: string;
|
|
4
|
+
readonly refreshToken: string;
|
|
5
|
+
/** Epoch ms when the access token expires. */
|
|
6
|
+
readonly expiresAt: number;
|
|
7
|
+
}
|
|
8
|
+
export interface TokenManagerLogger {
|
|
9
|
+
warn(message: string): void;
|
|
10
|
+
}
|
|
11
|
+
/** Persistent storage for the refresh token (e.g. zhin plugin database state). */
|
|
12
|
+
export interface RefreshTokenStore {
|
|
13
|
+
load(): Promise<string | undefined>;
|
|
14
|
+
save(refreshToken: string): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export type AuthorizationLostListener = (provider: OAuthProviderKind, message: string) => void | Promise<void>;
|
|
17
|
+
/** Chat command that (re-)authorizes a provider; shown in user-facing errors. */
|
|
18
|
+
export declare function authCommandFor(provider: OAuthProviderKind): string;
|
|
19
|
+
export interface TokenManagerOptions {
|
|
20
|
+
readonly provider: OAuthProviderKind;
|
|
21
|
+
readonly clientId: string;
|
|
22
|
+
/** Optional for Microsoft public/native clients. Required for Google. */
|
|
23
|
+
readonly clientSecret?: string;
|
|
24
|
+
readonly tenant?: string;
|
|
25
|
+
/** Fallback refresh token from config/env; the token store wins when it has a value. */
|
|
26
|
+
readonly initialRefreshToken?: string;
|
|
27
|
+
/** Refresh token persisted by the chat authorization flow. */
|
|
28
|
+
readonly tokenStore?: RefreshTokenStore;
|
|
29
|
+
/** Called once when the refresh token is rejected (invalid_grant). */
|
|
30
|
+
readonly onAuthorizationLost?: AuthorizationLostListener;
|
|
31
|
+
/**
|
|
32
|
+
* Optional path to persist rotated refresh tokens (JSON).
|
|
33
|
+
* When unset, rotation only logs a warning (update env manually).
|
|
34
|
+
*/
|
|
35
|
+
readonly tokenFile?: string;
|
|
36
|
+
readonly fetchImpl?: typeof fetch;
|
|
37
|
+
readonly now?: () => number;
|
|
38
|
+
readonly logger?: TokenManagerLogger;
|
|
39
|
+
/** Refresh this many ms before expiry. Default 5 minutes. */
|
|
40
|
+
readonly skewMs?: number;
|
|
41
|
+
}
|
|
42
|
+
export declare class OAuthTokenError extends Error {
|
|
43
|
+
readonly code: string;
|
|
44
|
+
constructor(code: string, message: string);
|
|
45
|
+
}
|
|
46
|
+
export declare class OAuthTokenManager {
|
|
47
|
+
#private;
|
|
48
|
+
constructor(options: TokenManagerOptions);
|
|
49
|
+
get provider(): OAuthProviderKind;
|
|
50
|
+
/** Whether a refresh token is available (stored or from config). */
|
|
51
|
+
get hasRefreshToken(): boolean;
|
|
52
|
+
/** Whether the last refresh attempt was rejected with invalid_grant. */
|
|
53
|
+
get authorizationLost(): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Loads persisted tokens: token_file overlay first, then the token store,
|
|
56
|
+
* which takes precedence over config/env because it is written by chat auth.
|
|
57
|
+
*/
|
|
58
|
+
hydrate(): Promise<void>;
|
|
59
|
+
/** Replaces the refresh token after a successful chat authorization. */
|
|
60
|
+
setRefreshToken(refreshToken: string): void;
|
|
61
|
+
/** Forgets all tokens held in memory (used by `calendar logout`). */
|
|
62
|
+
clearTokens(): void;
|
|
63
|
+
/** Current refresh token (may change after Microsoft rotation). */
|
|
64
|
+
get refreshToken(): string;
|
|
65
|
+
/** Load optional token file overlay (rotated refresh / cached access). */
|
|
66
|
+
hydrateFromFile(): Promise<void>;
|
|
67
|
+
getAccessToken(): Promise<string>;
|
|
68
|
+
/** Bypass cache (e.g. after HTTP 401). Still single-flight. */
|
|
69
|
+
forceRefresh(): Promise<string>;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=token-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../src/token-manager.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,MAAM,KACZ,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAElE;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,wFAAwF;IACxF,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,8DAA8D;IAC9D,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IACxC,sEAAsE;IACtE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,yBAAyB,CAAC;IACzD;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IACrC,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAUD,qBAAa,iBAAiB;;gBAkBhB,OAAO,EAAE,mBAAmB;IA0BxC,IAAI,QAAQ,IAAI,iBAAiB,CAEhC;IAED,oEAAoE;IACpE,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,wEAAwE;IACxE,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B,wEAAwE;IACxE,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAO3C,qEAAqE;IACrE,WAAW,IAAI,IAAI;IAInB,mEAAmE;IACnE,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,0EAA0E;IACpE,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BhC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAOvC,+DAA+D;IACzD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CAuJtC"}
|