@zhin.js/plugin-calendar 0.1.6 → 0.1.8
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 +37 -0
- package/README.md +6 -0
- package/commands/calendar/auth/index.js +7 -6
- package/commands/calendar/auth/index.ts +8 -6
- package/commands/calendar/logout/index.js +6 -5
- package/commands/calendar/logout/index.ts +6 -5
- package/commands/calendar/status/index.js +4 -3
- package/commands/calendar/status/index.ts +4 -3
- package/lib/caldav.d.ts.map +1 -1
- package/lib/caldav.js +4 -3
- package/lib/caldav.js.map +1 -1
- package/lib/chat-auth.d.ts +7 -5
- package/lib/chat-auth.d.ts.map +1 -1
- package/lib/chat-auth.js +48 -45
- package/lib/chat-auth.js.map +1 -1
- package/lib/config.d.ts +2 -2
- package/lib/config.js +9 -9
- package/lib/config.js.map +1 -1
- package/lib/credential-store.d.ts +3 -0
- package/lib/credential-store.d.ts.map +1 -1
- package/lib/credential-store.js.map +1 -1
- package/lib/errors.d.ts +72 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +32 -0
- package/lib/errors.js.map +1 -0
- package/lib/free-time.d.ts.map +1 -1
- package/lib/free-time.js +3 -2
- package/lib/free-time.js.map +1 -1
- package/lib/i18n.d.ts +2 -0
- package/lib/i18n.d.ts.map +1 -0
- package/lib/i18n.js +133 -0
- package/lib/i18n.js.map +1 -0
- package/lib/oauth-auth.d.ts.map +1 -1
- package/lib/oauth-auth.js +4 -3
- package/lib/oauth-auth.js.map +1 -1
- package/lib/oauth.d.ts.map +1 -1
- package/lib/oauth.js +7 -6
- package/lib/oauth.js.map +1 -1
- package/lib/time.d.ts.map +1 -1
- package/lib/time.js +5 -7
- package/lib/time.js.map +1 -1
- package/lib/token-manager.d.ts +4 -2
- package/lib/token-manager.d.ts.map +1 -1
- package/lib/token-manager.js +12 -9
- package/lib/token-manager.js.map +1 -1
- package/lib/tool-errors.d.ts +2 -1
- package/lib/tool-errors.d.ts.map +1 -1
- package/lib/tool-errors.js +8 -2
- package/lib/tool-errors.js.map +1 -1
- package/package.json +9 -9
- package/plugin.js +4 -2
- package/schema.json +45 -0
- package/skills/calendar-scheduling/tools/create_event/index.js +4 -3
- package/skills/calendar-scheduling/tools/create_event/index.ts +4 -3
- package/skills/calendar-scheduling/tools/find_free_time/index.js +4 -3
- package/skills/calendar-scheduling/tools/find_free_time/index.ts +4 -3
- package/skills/calendar-scheduling/tools/list_events/index.js +5 -4
- package/skills/calendar-scheduling/tools/list_events/index.ts +5 -4
- package/src/caldav.ts +4 -3
- package/src/chat-auth.ts +55 -50
- package/src/config.ts +9 -9
- package/src/credential-store.ts +3 -0
- package/src/errors.ts +34 -0
- package/src/free-time.ts +3 -2
- package/src/i18n.ts +133 -0
- package/src/oauth-auth.ts +4 -5
- package/src/oauth.ts +7 -10
- package/src/time.ts +5 -4
- package/src/token-manager.ts +16 -13
- package/src/tool-errors.ts +8 -2
package/lib/time.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Timezone helpers built on Intl (no dependencies).
|
|
3
|
-
*/
|
|
1
|
+
import { CalendarError } from './errors.js';
|
|
4
2
|
const formatterCache = new Map();
|
|
5
3
|
function formatterFor(timeZone) {
|
|
6
4
|
let formatter = formatterCache.get(timeZone);
|
|
@@ -35,7 +33,7 @@ export function assertTimeZone(timeZone) {
|
|
|
35
33
|
formatterFor(timeZone);
|
|
36
34
|
}
|
|
37
35
|
catch {
|
|
38
|
-
throw new
|
|
36
|
+
throw new CalendarError('timezone', { value: timeZone });
|
|
39
37
|
}
|
|
40
38
|
}
|
|
41
39
|
/** Wall-clock parts of `date` in `timeZone`. */
|
|
@@ -81,12 +79,12 @@ export function parseDateTimeInZone(value, timeZone) {
|
|
|
81
79
|
if (/([zZ]|[+-]\d{2}:?\d{2})$/.test(text)) {
|
|
82
80
|
const date = new Date(text);
|
|
83
81
|
if (Number.isNaN(date.getTime()))
|
|
84
|
-
throw new
|
|
82
|
+
throw new CalendarError('datetime', { value });
|
|
85
83
|
return date;
|
|
86
84
|
}
|
|
87
85
|
const match = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2}))?)?$/.exec(text);
|
|
88
86
|
if (!match)
|
|
89
|
-
throw new
|
|
87
|
+
throw new CalendarError('datetimeFormat', { value });
|
|
90
88
|
return zonedTimeToUtc({
|
|
91
89
|
year: Number(match[1]),
|
|
92
90
|
month: Number(match[2]),
|
|
@@ -111,7 +109,7 @@ export function parseDuration(value) {
|
|
|
111
109
|
consumed += match[0];
|
|
112
110
|
}
|
|
113
111
|
if (total <= 0 || consumed.replace(/\s/g, "") !== text.replace(/\s/g, "")) {
|
|
114
|
-
throw new
|
|
112
|
+
throw new CalendarError('duration', { value });
|
|
115
113
|
}
|
|
116
114
|
return total;
|
|
117
115
|
}
|
package/lib/time.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"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"}
|
package/lib/token-manager.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CalendarError } from './errors.js';
|
|
1
2
|
export type OAuthProviderKind = "google" | "microsoft";
|
|
2
3
|
export interface TokenSet {
|
|
3
4
|
readonly accessToken: string;
|
|
@@ -15,7 +16,7 @@ export interface RefreshTokenStore {
|
|
|
15
16
|
}
|
|
16
17
|
export type AuthorizationLostListener = (provider: OAuthProviderKind, message: string) => void | Promise<void>;
|
|
17
18
|
/** Chat command that (re-)authorizes a provider; shown in user-facing errors. */
|
|
18
|
-
export declare function authCommandFor(provider: OAuthProviderKind): string;
|
|
19
|
+
export declare function authCommandFor(provider: OAuthProviderKind, commandHead?: string): string | undefined;
|
|
19
20
|
export interface TokenManagerOptions {
|
|
20
21
|
readonly provider: OAuthProviderKind;
|
|
21
22
|
readonly clientId: string;
|
|
@@ -41,7 +42,8 @@ export interface TokenManagerOptions {
|
|
|
41
42
|
}
|
|
42
43
|
export declare class OAuthTokenError extends Error {
|
|
43
44
|
readonly code: string;
|
|
44
|
-
|
|
45
|
+
readonly presentation?: CalendarError;
|
|
46
|
+
constructor(code: string, message: string, presentation?: CalendarError);
|
|
45
47
|
}
|
|
46
48
|
export declare class OAuthTokenManager {
|
|
47
49
|
#private;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../src/token-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../src/token-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ5C,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,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpG;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;IACtB,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;gBAE1B,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,aAAa;CAMxE;AAUD,qBAAa,iBAAiB;;gBAkBhB,OAAO,EAAE,mBAAmB;IA2BxC,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;CAqJtC"}
|
package/lib/token-manager.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CalendarError } from './errors.js';
|
|
1
2
|
/**
|
|
2
3
|
* In-memory OAuth access-token cache with proactive refresh, single-flight,
|
|
3
4
|
* refresh-token rotation handling, and clear invalid_grant errors.
|
|
@@ -5,15 +6,17 @@
|
|
|
5
6
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
6
7
|
import path from "node:path";
|
|
7
8
|
/** Chat command that (re-)authorizes a provider; shown in user-facing errors. */
|
|
8
|
-
export function authCommandFor(provider) {
|
|
9
|
-
return
|
|
9
|
+
export function authCommandFor(provider, commandHead) {
|
|
10
|
+
return commandHead ? `${commandHead} ${provider}` : undefined;
|
|
10
11
|
}
|
|
11
12
|
export class OAuthTokenError extends Error {
|
|
12
13
|
code;
|
|
13
|
-
|
|
14
|
+
presentation;
|
|
15
|
+
constructor(code, message, presentation) {
|
|
14
16
|
super(message);
|
|
15
17
|
this.name = "OAuthTokenError";
|
|
16
18
|
this.code = code;
|
|
19
|
+
this.presentation = presentation;
|
|
17
20
|
}
|
|
18
21
|
}
|
|
19
22
|
const DEFAULT_SKEW_MS = 5 * 60 * 1000;
|
|
@@ -36,10 +39,10 @@ export class OAuthTokenManager {
|
|
|
36
39
|
#authorizationLostMessage = "";
|
|
37
40
|
constructor(options) {
|
|
38
41
|
if (!options.clientId.trim()) {
|
|
39
|
-
throw new OAuthTokenError("config", `${options.provider}: 缺少 client_id
|
|
42
|
+
throw new OAuthTokenError("config", `${options.provider}: 缺少 client_id`, new CalendarError('clientMissing', { provider: options.provider, field: 'client_id' }));
|
|
40
43
|
}
|
|
41
44
|
if (options.provider === "google" && !options.clientSecret?.trim()) {
|
|
42
|
-
throw new OAuthTokenError("config", "google: 缺少 client_secret");
|
|
45
|
+
throw new OAuthTokenError("config", "google: 缺少 client_secret", new CalendarError('clientMissing', { provider: 'google', field: 'client_secret' }));
|
|
43
46
|
}
|
|
44
47
|
this.#provider = options.provider;
|
|
45
48
|
this.#clientId = options.clientId.trim();
|
|
@@ -146,7 +149,7 @@ export class OAuthTokenManager {
|
|
|
146
149
|
throw new OAuthTokenError("invalid_grant", this.#authorizationLostMessage);
|
|
147
150
|
}
|
|
148
151
|
if (!this.#refreshToken) {
|
|
149
|
-
throw new OAuthTokenError("not_authorized", `${this.#provider}: 日历尚未授权。请 master
|
|
152
|
+
throw new OAuthTokenError("not_authorized", `${this.#provider}: 日历尚未授权。请 master 通过日历授权入口完成授权。`);
|
|
150
153
|
}
|
|
151
154
|
const body = new URLSearchParams({
|
|
152
155
|
client_id: this.#clientId,
|
|
@@ -178,16 +181,16 @@ export class OAuthTokenManager {
|
|
|
178
181
|
const errCode = String(data.error ?? "");
|
|
179
182
|
const errDesc = String(data.error_description ?? text.slice(0, 200));
|
|
180
183
|
if (errCode === "invalid_grant" || /invalid_grant/i.test(errDesc)) {
|
|
181
|
-
const message = `${this.#provider}: 日历授权已失效或被撤销(invalid_grant)。请 master
|
|
184
|
+
const message = `${this.#provider}: 日历授权已失效或被撤销(invalid_grant)。请 master 通过日历授权入口重新授权。详情:${errDesc}`;
|
|
182
185
|
this.#authorizationLostMessage = message;
|
|
183
186
|
await this.#notifyAuthorizationLost(message);
|
|
184
187
|
throw new OAuthTokenError("invalid_grant", message);
|
|
185
188
|
}
|
|
186
|
-
throw new OAuthTokenError(errCode || "http_error", `${this.#provider}: token 刷新失败 HTTP ${response.status}:${errDesc || response.statusText}
|
|
189
|
+
throw new OAuthTokenError(errCode || "http_error", `${this.#provider}: token 刷新失败 HTTP ${response.status}:${errDesc || response.statusText}`, new CalendarError('refreshHttp', { provider: this.#provider, status: response.status, detail: errDesc || response.statusText }));
|
|
187
190
|
}
|
|
188
191
|
const accessToken = String(data.access_token ?? "");
|
|
189
192
|
if (!accessToken) {
|
|
190
|
-
throw new OAuthTokenError("response", `${this.#provider}: 刷新响应缺少 access_token
|
|
193
|
+
throw new OAuthTokenError("response", `${this.#provider}: 刷新响应缺少 access_token`, new CalendarError('refreshAccessMissing', { provider: this.#provider }));
|
|
191
194
|
}
|
|
192
195
|
const expiresIn = Number(data.expires_in ?? 3600);
|
|
193
196
|
this.#accessToken = accessToken;
|
package/lib/token-manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../src/token-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AA0B7B,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,QAA2B;
|
|
1
|
+
{"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../src/token-manager.ts"],"names":[],"mappings":"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"}
|
package/lib/tool-errors.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { Locale } from 'zhin.js/i18n';
|
|
1
2
|
/**
|
|
2
3
|
* Runs a calendar tool body and turns OAuth authorization failures into a
|
|
3
4
|
* readable reply (e.g. "请 master 发送 calendar auth google") instead of a crash.
|
|
4
5
|
*/
|
|
5
|
-
export declare function runCalendarTool(operation: () => Promise<string
|
|
6
|
+
export declare function runCalendarTool(operation: () => Promise<string>, locale?: Locale): Promise<string>;
|
|
6
7
|
//# sourceMappingURL=tool-errors.d.ts.map
|
package/lib/tool-errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-errors.d.ts","sourceRoot":"","sources":["../src/tool-errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool-errors.d.ts","sourceRoot":"","sources":["../src/tool-errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C;;;GAGG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAChC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAWjB"}
|
package/lib/tool-errors.js
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
|
+
import { CalendarError } from './errors.js';
|
|
2
|
+
import { messages as t } from './i18n.js';
|
|
1
3
|
import { OAuthTokenError } from "./token-manager.js";
|
|
2
4
|
/**
|
|
3
5
|
* Runs a calendar tool body and turns OAuth authorization failures into a
|
|
4
6
|
* readable reply (e.g. "请 master 发送 calendar auth google") instead of a crash.
|
|
5
7
|
*/
|
|
6
|
-
export async function runCalendarTool(operation) {
|
|
8
|
+
export async function runCalendarTool(operation, locale) {
|
|
7
9
|
try {
|
|
8
10
|
return await operation();
|
|
9
11
|
}
|
|
10
12
|
catch (error) {
|
|
13
|
+
if (error instanceof CalendarError)
|
|
14
|
+
throw new CalendarError(error.code, error.params, locale);
|
|
11
15
|
if (error instanceof OAuthTokenError) {
|
|
12
|
-
|
|
16
|
+
if (error.code === 'invalid_grant' || error.code === 'not_authorized')
|
|
17
|
+
return t(locale, error.code === 'invalid_grant' ? 'lost' : 'notAuthorized', { provider: 'Calendar' });
|
|
18
|
+
return error.presentation?.format(locale) ?? error.message;
|
|
13
19
|
}
|
|
14
20
|
throw error;
|
|
15
21
|
}
|
package/lib/tool-errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-errors.js","sourceRoot":"","sources":["../src/tool-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAgC;
|
|
1
|
+
{"version":3,"file":"tool-errors.js","sourceRoot":"","sources":["../src/tool-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,QAAQ,IAAI,CAAC,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAgC,EAChC,MAAe;IAEf,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa;YAAE,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9F,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;gBAAE,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;YAC7K,OAAO,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC;QAC7D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/plugin-calendar",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "CalDAV / Google / Microsoft calendar tools for Zhin Agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -39,22 +39,22 @@
|
|
|
39
39
|
"url": "https://github.com/lc-cn"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@zhin.js/host-http": "1.1.
|
|
43
|
-
"@zhin.js/im-contract": "1.1.
|
|
44
|
-
"@zhin.js/skill": "1.1.
|
|
45
|
-
"@zhin.js/tool": "1.1.
|
|
42
|
+
"@zhin.js/host-http": "1.1.11",
|
|
43
|
+
"@zhin.js/im-contract": "1.1.8",
|
|
44
|
+
"@zhin.js/skill": "1.1.10",
|
|
45
|
+
"@zhin.js/tool": "1.1.11"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"typescript": "^6.0.3",
|
|
49
49
|
"vitest": "^4.1.10",
|
|
50
50
|
"zod": "^4.4.3",
|
|
51
|
-
"@zhin.js/command": "1.1.
|
|
52
|
-
"zhin.js": "1.1.
|
|
51
|
+
"@zhin.js/command": "1.1.11",
|
|
52
|
+
"zhin.js": "1.1.17"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
55
|
"zod": "^4.0.0",
|
|
56
|
-
"@zhin.js/command": "^1.1.
|
|
57
|
-
"zhin.js": "^1.1.
|
|
56
|
+
"@zhin.js/command": "^1.1.11",
|
|
57
|
+
"zhin.js": "^1.1.17"
|
|
58
58
|
},
|
|
59
59
|
"peerDependenciesMeta": {
|
|
60
60
|
"@zhin.js/command": {
|
package/plugin.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { projectLocaleToken } from 'zhin.js/i18n';
|
|
2
3
|
import { databaseHostToken, definePlugin, outboundHostToken, } from "zhin.js";
|
|
3
4
|
import { httpHostToken } from "@zhin.js/host-http";
|
|
4
5
|
import { assertCalendarTimezone, createCalendarProvider, createOAuthTokenManagers, } from "./lib/index.js";
|
|
@@ -24,8 +25,8 @@ export default definePlugin({
|
|
|
24
25
|
? resources.use(httpHostToken)
|
|
25
26
|
: undefined;
|
|
26
27
|
const notify = outbound?.sendTarget
|
|
27
|
-
? async (target, text) => {
|
|
28
|
-
await outbound.sendTarget(target, text);
|
|
28
|
+
? async (target, text, locale) => {
|
|
29
|
+
await outbound.sendTarget(target, text, { locale });
|
|
29
30
|
}
|
|
30
31
|
: undefined;
|
|
31
32
|
const callbackPath = config.oauth_callback_path?.trim() || DEFAULT_OAUTH_CALLBACK_PATH;
|
|
@@ -46,6 +47,7 @@ export default definePlugin({
|
|
|
46
47
|
});
|
|
47
48
|
const auth = new CalendarAuthService({
|
|
48
49
|
config,
|
|
50
|
+
locale: resources.use(projectLocaleToken),
|
|
49
51
|
managers,
|
|
50
52
|
credentials,
|
|
51
53
|
notify,
|
package/schema.json
CHANGED
|
@@ -22,6 +22,11 @@
|
|
|
22
22
|
}
|
|
23
23
|
],
|
|
24
24
|
"description": "日历后端;none 时工具返回未启用提示",
|
|
25
|
+
"x-i18n": {
|
|
26
|
+
"en": {
|
|
27
|
+
"description": "Calendar backend. Tools report that the calendar is disabled when set to none."
|
|
28
|
+
}
|
|
29
|
+
},
|
|
25
30
|
"default": "none",
|
|
26
31
|
"x-zhin-config": {
|
|
27
32
|
"effect": "reload"
|
|
@@ -30,6 +35,11 @@
|
|
|
30
35
|
"timezone": {
|
|
31
36
|
"type": "string",
|
|
32
37
|
"description": "解释无偏移时间与展示用的 IANA 时区",
|
|
38
|
+
"x-i18n": {
|
|
39
|
+
"en": {
|
|
40
|
+
"description": "IANA timezone for interpreting times without offsets and for display."
|
|
41
|
+
}
|
|
42
|
+
},
|
|
33
43
|
"default": "Asia/Manila",
|
|
34
44
|
"x-zhin-config": {
|
|
35
45
|
"effect": "reload"
|
|
@@ -76,6 +86,11 @@
|
|
|
76
86
|
"calendar_url": {
|
|
77
87
|
"type": "string",
|
|
78
88
|
"description": "日历 collection URL",
|
|
89
|
+
"x-i18n": {
|
|
90
|
+
"en": {
|
|
91
|
+
"description": "Calendar collection URL."
|
|
92
|
+
}
|
|
93
|
+
},
|
|
79
94
|
"default": "",
|
|
80
95
|
"x-zhin-config": {
|
|
81
96
|
"effect": "reload"
|
|
@@ -124,6 +139,11 @@
|
|
|
124
139
|
"refresh_token": {
|
|
125
140
|
"type": "string",
|
|
126
141
|
"description": "${GOOGLE_CALENDAR_REFRESH_TOKEN};用 auth google 获取",
|
|
142
|
+
"x-i18n": {
|
|
143
|
+
"en": {
|
|
144
|
+
"description": "${GOOGLE_CALENDAR_REFRESH_TOKEN}; obtain using the calendar authorization flow."
|
|
145
|
+
}
|
|
146
|
+
},
|
|
127
147
|
"default": "",
|
|
128
148
|
"x-zhin-config": {
|
|
129
149
|
"effect": "reload"
|
|
@@ -132,6 +152,11 @@
|
|
|
132
152
|
"calendar_id": {
|
|
133
153
|
"type": "string",
|
|
134
154
|
"description": "日历 ID,默认 primary;可换成其它日历的 id",
|
|
155
|
+
"x-i18n": {
|
|
156
|
+
"en": {
|
|
157
|
+
"description": "Calendar ID, primary by default; can be set to another calendar ID."
|
|
158
|
+
}
|
|
159
|
+
},
|
|
135
160
|
"default": "primary",
|
|
136
161
|
"x-zhin-config": {
|
|
137
162
|
"effect": "reload"
|
|
@@ -166,6 +191,11 @@
|
|
|
166
191
|
"client_secret": {
|
|
167
192
|
"type": "string",
|
|
168
193
|
"description": "可选;公共客户端可留空。${MS_GRAPH_CLIENT_SECRET}",
|
|
194
|
+
"x-i18n": {
|
|
195
|
+
"en": {
|
|
196
|
+
"description": "Optional for public clients. ${MS_GRAPH_CLIENT_SECRET}"
|
|
197
|
+
}
|
|
198
|
+
},
|
|
169
199
|
"default": "",
|
|
170
200
|
"x-zhin-config": {
|
|
171
201
|
"effect": "reload"
|
|
@@ -174,6 +204,11 @@
|
|
|
174
204
|
"refresh_token": {
|
|
175
205
|
"type": "string",
|
|
176
206
|
"description": "${MS_GRAPH_REFRESH_TOKEN};用 auth microsoft 获取",
|
|
207
|
+
"x-i18n": {
|
|
208
|
+
"en": {
|
|
209
|
+
"description": "${MS_GRAPH_REFRESH_TOKEN}; obtain using the calendar authorization flow."
|
|
210
|
+
}
|
|
211
|
+
},
|
|
177
212
|
"default": "",
|
|
178
213
|
"x-zhin-config": {
|
|
179
214
|
"effect": "reload"
|
|
@@ -182,6 +217,11 @@
|
|
|
182
217
|
"tenant": {
|
|
183
218
|
"type": "string",
|
|
184
219
|
"description": "Azure tenant,默认 common",
|
|
220
|
+
"x-i18n": {
|
|
221
|
+
"en": {
|
|
222
|
+
"description": "Azure tenant, common by default."
|
|
223
|
+
}
|
|
224
|
+
},
|
|
185
225
|
"default": "common",
|
|
186
226
|
"x-zhin-config": {
|
|
187
227
|
"effect": "reload"
|
|
@@ -190,6 +230,11 @@
|
|
|
190
230
|
"calendar_id": {
|
|
191
231
|
"type": "string",
|
|
192
232
|
"description": "留空或 primary/me = 默认日历;否则为 Graph calendar id",
|
|
233
|
+
"x-i18n": {
|
|
234
|
+
"en": {
|
|
235
|
+
"description": "Empty, primary or me selects the default calendar; otherwise a Graph calendar ID."
|
|
236
|
+
}
|
|
237
|
+
},
|
|
193
238
|
"default": "",
|
|
194
239
|
"x-zhin-config": {
|
|
195
240
|
"effect": "reload"
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { messages as t } from "../../../../lib/i18n.js";
|
|
2
3
|
import { defineAgentTool } from "@zhin.js/tool";
|
|
3
4
|
import { z } from "zod";
|
|
4
5
|
import { calendarRuntimeToken } from "../../../../lib/runtime.js";
|
|
@@ -22,7 +23,7 @@ export default defineAgentTool({
|
|
|
22
23
|
return runCalendarTool(async () => {
|
|
23
24
|
const runtime = context.use(calendarRuntimeToken);
|
|
24
25
|
if (!runtime.provider)
|
|
25
|
-
return
|
|
26
|
+
return t(context.locale, 'disabled');
|
|
26
27
|
const timezone = runtime.config.timezone;
|
|
27
28
|
const event = await runtime.provider.createEvent({
|
|
28
29
|
title,
|
|
@@ -32,7 +33,7 @@ export default defineAgentTool({
|
|
|
32
33
|
description,
|
|
33
34
|
all_day,
|
|
34
35
|
}, context.signal);
|
|
35
|
-
return
|
|
36
|
-
});
|
|
36
|
+
return t(context.locale, 'eventCreated', { id: event.id, title: event.title || t(context.locale, 'untitled'), start: event.start, end: event.end, timezone });
|
|
37
|
+
}, context.locale);
|
|
37
38
|
},
|
|
38
39
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { messages as t } from '../../../../src/i18n.js';
|
|
1
2
|
import { defineAgentTool } from "@zhin.js/tool";
|
|
2
3
|
import { z } from "zod";
|
|
3
4
|
import { calendarRuntimeToken } from "../../../../src/runtime.js";
|
|
@@ -25,7 +26,7 @@ export default defineAgentTool({
|
|
|
25
26
|
) {
|
|
26
27
|
return runCalendarTool(async () => {
|
|
27
28
|
const runtime = context.use(calendarRuntimeToken);
|
|
28
|
-
if (!runtime.provider) return
|
|
29
|
+
if (!runtime.provider) return t(context.locale, 'disabled');
|
|
29
30
|
const timezone = runtime.config.timezone;
|
|
30
31
|
const event = await runtime.provider.createEvent(
|
|
31
32
|
{
|
|
@@ -38,7 +39,7 @@ export default defineAgentTool({
|
|
|
38
39
|
},
|
|
39
40
|
context.signal
|
|
40
41
|
);
|
|
41
|
-
return
|
|
42
|
-
});
|
|
42
|
+
return t(context.locale, 'eventCreated', { id: event.id, title: event.title || t(context.locale, 'untitled'), start: event.start, end: event.end, timezone });
|
|
43
|
+
}, context.locale);
|
|
43
44
|
},
|
|
44
45
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { messages as t } from "../../../../lib/i18n.js";
|
|
2
3
|
import { defineAgentTool } from "@zhin.js/tool";
|
|
3
4
|
import { z } from "zod";
|
|
4
5
|
import { findFreeSlots } from "../../../../lib/free-time.js";
|
|
@@ -23,7 +24,7 @@ export default defineAgentTool({
|
|
|
23
24
|
return runCalendarTool(async () => {
|
|
24
25
|
const runtime = context.use(calendarRuntimeToken);
|
|
25
26
|
if (!runtime.provider)
|
|
26
|
-
return
|
|
27
|
+
return t(context.locale, 'disabled');
|
|
27
28
|
const timezone = runtime.config.timezone;
|
|
28
29
|
const fromDate = parseDateTimeInZone(from, timezone);
|
|
29
30
|
const toDate = parseDateTimeInZone(to, timezone);
|
|
@@ -38,9 +39,9 @@ export default defineAgentTool({
|
|
|
38
39
|
events,
|
|
39
40
|
});
|
|
40
41
|
if (slots.length === 0) {
|
|
41
|
-
return
|
|
42
|
+
return t(context.locale, 'noFreeTime', { start: runtime.config.work_day_start, end: runtime.config.work_day_end, timezone });
|
|
42
43
|
}
|
|
43
44
|
return slots.map((slot) => `• ${slot.start} → ${slot.end}`).join("\n");
|
|
44
|
-
});
|
|
45
|
+
}, context.locale);
|
|
45
46
|
},
|
|
46
47
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { messages as t } from '../../../../src/i18n.js';
|
|
1
2
|
import { defineAgentTool } from "@zhin.js/tool";
|
|
2
3
|
import { z } from "zod";
|
|
3
4
|
import { findFreeSlots } from "../../../../src/free-time.js";
|
|
@@ -23,7 +24,7 @@ export default defineAgentTool({
|
|
|
23
24
|
async execute({ from, to, duration_minutes }, context) {
|
|
24
25
|
return runCalendarTool(async () => {
|
|
25
26
|
const runtime = context.use(calendarRuntimeToken);
|
|
26
|
-
if (!runtime.provider) return
|
|
27
|
+
if (!runtime.provider) return t(context.locale, 'disabled');
|
|
27
28
|
const timezone = runtime.config.timezone;
|
|
28
29
|
const fromDate = parseDateTimeInZone(from, timezone);
|
|
29
30
|
const toDate = parseDateTimeInZone(to, timezone);
|
|
@@ -42,9 +43,9 @@ export default defineAgentTool({
|
|
|
42
43
|
events,
|
|
43
44
|
});
|
|
44
45
|
if (slots.length === 0) {
|
|
45
|
-
return
|
|
46
|
+
return t(context.locale, 'noFreeTime', { start: runtime.config.work_day_start, end: runtime.config.work_day_end, timezone });
|
|
46
47
|
}
|
|
47
48
|
return slots.map((slot) => `• ${slot.start} → ${slot.end}`).join("\n");
|
|
48
|
-
});
|
|
49
|
+
}, context.locale);
|
|
49
50
|
},
|
|
50
51
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { messages as t } from "../../../../lib/i18n.js";
|
|
2
3
|
import { defineAgentTool } from "@zhin.js/tool";
|
|
3
4
|
import { z } from "zod";
|
|
4
5
|
import { calendarRuntimeToken } from "../../../../lib/runtime.js";
|
|
@@ -19,14 +20,14 @@ export default defineAgentTool({
|
|
|
19
20
|
return runCalendarTool(async () => {
|
|
20
21
|
const runtime = context.use(calendarRuntimeToken);
|
|
21
22
|
if (!runtime.provider)
|
|
22
|
-
return
|
|
23
|
+
return t(context.locale, 'disabled');
|
|
23
24
|
const timezone = runtime.config.timezone;
|
|
24
25
|
const events = await runtime.provider.listEvents(parseDateTimeInZone(from, timezone), parseDateTimeInZone(to, timezone), context.signal);
|
|
25
26
|
if (events.length === 0)
|
|
26
|
-
return
|
|
27
|
+
return t(context.locale, 'noEvents', { provider: runtime.provider.name, from, to });
|
|
27
28
|
return events
|
|
28
|
-
.map((event) => `• ${event.start} → ${event.end} ${event.title}${event.location ? ` @ ${event.location}` : ""} [${event.id}]`)
|
|
29
|
+
.map((event) => `• ${event.start} → ${event.end} ${event.title || t(context.locale, 'untitled')}${event.location ? ` @ ${event.location}` : ""} [${event.id}]`)
|
|
29
30
|
.join("\n");
|
|
30
|
-
});
|
|
31
|
+
}, context.locale);
|
|
31
32
|
},
|
|
32
33
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { messages as t } from '../../../../src/i18n.js';
|
|
1
2
|
import { defineAgentTool } from "@zhin.js/tool";
|
|
2
3
|
import { z } from "zod";
|
|
3
4
|
import { calendarRuntimeToken } from "../../../../src/runtime.js";
|
|
@@ -20,7 +21,7 @@ export default defineAgentTool({
|
|
|
20
21
|
return runCalendarTool(async () => {
|
|
21
22
|
const runtime = context.use(calendarRuntimeToken);
|
|
22
23
|
if (!runtime.provider)
|
|
23
|
-
return
|
|
24
|
+
return t(context.locale, 'disabled');
|
|
24
25
|
const timezone = runtime.config.timezone;
|
|
25
26
|
const events = await runtime.provider.listEvents(
|
|
26
27
|
parseDateTimeInZone(from, timezone),
|
|
@@ -28,15 +29,15 @@ export default defineAgentTool({
|
|
|
28
29
|
context.signal
|
|
29
30
|
);
|
|
30
31
|
if (events.length === 0)
|
|
31
|
-
return
|
|
32
|
+
return t(context.locale, 'noEvents', { provider: runtime.provider.name, from, to });
|
|
32
33
|
return events
|
|
33
34
|
.map(
|
|
34
35
|
(event) =>
|
|
35
|
-
`• ${event.start} → ${event.end} ${event.title}${
|
|
36
|
+
`• ${event.start} → ${event.end} ${event.title || t(context.locale, 'untitled')}${
|
|
36
37
|
event.location ? ` @ ${event.location}` : ""
|
|
37
38
|
} [${event.id}]`
|
|
38
39
|
)
|
|
39
40
|
.join("\n");
|
|
40
|
-
});
|
|
41
|
+
}, context.locale);
|
|
41
42
|
},
|
|
42
43
|
});
|
package/src/caldav.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CalendarError } from './errors.js';
|
|
1
2
|
/**
|
|
2
3
|
* Minimal CalDAV client (RFC 4791) for listing and creating VEVENTs.
|
|
3
4
|
* Works with iCloud, Fastmail and Nextcloud calendars.
|
|
@@ -146,7 +147,7 @@ export function parseCalDavEvents(
|
|
|
146
147
|
const blocks = extractVeventBlocks(xml);
|
|
147
148
|
blocks.forEach((block, index) => {
|
|
148
149
|
const uid = extractField(block, "UID") ?? hrefs[index] ?? `event-${index}`;
|
|
149
|
-
const summary = extractField(block, "SUMMARY") ?? "
|
|
150
|
+
const summary = extractField(block, "SUMMARY") ?? "";
|
|
150
151
|
const startRaw = extractField(block, "DTSTART");
|
|
151
152
|
const endRaw = extractField(block, "DTEND") ?? startRaw;
|
|
152
153
|
if (!startRaw || !endRaw) return;
|
|
@@ -228,7 +229,7 @@ export function createCalDavProvider(options: CalDavOptions): CalendarProvider {
|
|
|
228
229
|
signal,
|
|
229
230
|
});
|
|
230
231
|
if (!response.ok)
|
|
231
|
-
throw new
|
|
232
|
+
throw new CalendarError('caldavHttp', { method: 'REPORT', status: response.status });
|
|
232
233
|
return parseCalDavEvents(await response.text(), options.timezone);
|
|
233
234
|
},
|
|
234
235
|
async createEvent(input, signal) {
|
|
@@ -245,7 +246,7 @@ export function createCalDavProvider(options: CalDavOptions): CalendarProvider {
|
|
|
245
246
|
signal,
|
|
246
247
|
});
|
|
247
248
|
if (response.status !== 201 && response.status !== 204) {
|
|
248
|
-
throw new
|
|
249
|
+
throw new CalendarError('caldavHttp', { method: 'PUT', status: response.status });
|
|
249
250
|
}
|
|
250
251
|
return {
|
|
251
252
|
id: uid,
|