@zhin.js/plugin-calendar 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +6 -0
  3. package/commands/calendar/auth/index.js +7 -6
  4. package/commands/calendar/auth/index.ts +8 -6
  5. package/commands/calendar/logout/index.js +6 -5
  6. package/commands/calendar/logout/index.ts +6 -5
  7. package/commands/calendar/status/index.js +4 -3
  8. package/commands/calendar/status/index.ts +4 -3
  9. package/lib/caldav.d.ts.map +1 -1
  10. package/lib/caldav.js +4 -3
  11. package/lib/caldav.js.map +1 -1
  12. package/lib/chat-auth.d.ts +7 -5
  13. package/lib/chat-auth.d.ts.map +1 -1
  14. package/lib/chat-auth.js +48 -45
  15. package/lib/chat-auth.js.map +1 -1
  16. package/lib/config.d.ts +2 -2
  17. package/lib/config.js +9 -9
  18. package/lib/config.js.map +1 -1
  19. package/lib/credential-store.d.ts +3 -0
  20. package/lib/credential-store.d.ts.map +1 -1
  21. package/lib/credential-store.js.map +1 -1
  22. package/lib/errors.d.ts +72 -0
  23. package/lib/errors.d.ts.map +1 -0
  24. package/lib/errors.js +32 -0
  25. package/lib/errors.js.map +1 -0
  26. package/lib/free-time.d.ts.map +1 -1
  27. package/lib/free-time.js +3 -2
  28. package/lib/free-time.js.map +1 -1
  29. package/lib/i18n.d.ts +2 -0
  30. package/lib/i18n.d.ts.map +1 -0
  31. package/lib/i18n.js +133 -0
  32. package/lib/i18n.js.map +1 -0
  33. package/lib/oauth-auth.d.ts.map +1 -1
  34. package/lib/oauth-auth.js +4 -3
  35. package/lib/oauth-auth.js.map +1 -1
  36. package/lib/oauth.d.ts.map +1 -1
  37. package/lib/oauth.js +7 -6
  38. package/lib/oauth.js.map +1 -1
  39. package/lib/time.d.ts.map +1 -1
  40. package/lib/time.js +5 -7
  41. package/lib/time.js.map +1 -1
  42. package/lib/token-manager.d.ts +4 -2
  43. package/lib/token-manager.d.ts.map +1 -1
  44. package/lib/token-manager.js +12 -9
  45. package/lib/token-manager.js.map +1 -1
  46. package/lib/tool-errors.d.ts +2 -1
  47. package/lib/tool-errors.d.ts.map +1 -1
  48. package/lib/tool-errors.js +8 -2
  49. package/lib/tool-errors.js.map +1 -1
  50. package/package.json +9 -9
  51. package/plugin.js +4 -2
  52. package/schema.json +45 -0
  53. package/skills/calendar-scheduling/tools/create_event/index.js +4 -3
  54. package/skills/calendar-scheduling/tools/create_event/index.ts +4 -3
  55. package/skills/calendar-scheduling/tools/find_free_time/index.js +4 -3
  56. package/skills/calendar-scheduling/tools/find_free_time/index.ts +4 -3
  57. package/skills/calendar-scheduling/tools/list_events/index.js +5 -4
  58. package/skills/calendar-scheduling/tools/list_events/index.ts +5 -4
  59. package/src/caldav.ts +4 -3
  60. package/src/chat-auth.ts +55 -50
  61. package/src/config.ts +9 -9
  62. package/src/credential-store.ts +3 -0
  63. package/src/errors.ts +34 -0
  64. package/src/free-time.ts +3 -2
  65. package/src/i18n.ts +133 -0
  66. package/src/oauth-auth.ts +4 -5
  67. package/src/oauth.ts +7 -10
  68. package/src/time.ts +5 -4
  69. package/src/token-manager.ts +16 -13
  70. 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 Error(`未知时区:${timeZone}`);
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 Error(`无法解析时间:${value}`);
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 Error(`无法解析时间:${value}(请用 YYYY-MM-DDTHH:mm 格式)`);
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 Error(`无法解析时长:${value}(示例:10m、2h30m、1d)`);
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":"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"}
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"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"}
@@ -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
- constructor(code: string, message: string);
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":"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"}
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"}
@@ -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 `calendar auth ${provider}`;
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
- constructor(code, message) {
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 在聊天中发送「${authCommandFor(this.#provider)}」完成授权。`);
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 在聊天中发送「${authCommandFor(this.#provider)}」重新授权。详情:${errDesc}`;
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;
@@ -1 +1 @@
1
- {"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../src/token-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../src/token-manager.ts"],"names":[],"mappings":"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"}
@@ -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>): Promise<string>;
6
+ export declare function runCalendarTool(operation: () => Promise<string>, locale?: Locale): Promise<string>;
6
7
  //# sourceMappingURL=tool-errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-errors.d.ts","sourceRoot":"","sources":["../src/tool-errors.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC,CASjB"}
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"}
@@ -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
- return error.message;
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
  }
@@ -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;IAEhC,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC,OAAO,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
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.6",
3
+ "version": "0.1.7",
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.9",
43
- "@zhin.js/im-contract": "1.1.6",
44
- "@zhin.js/skill": "1.1.9",
45
- "@zhin.js/tool": "1.1.9"
42
+ "@zhin.js/host-http": "1.1.10",
43
+ "@zhin.js/im-contract": "1.1.7",
44
+ "@zhin.js/skill": "1.1.10",
45
+ "@zhin.js/tool": "1.1.10"
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.10",
52
- "zhin.js": "1.1.15"
51
+ "@zhin.js/command": "1.1.11",
52
+ "zhin.js": "1.1.16"
53
53
  },
54
54
  "peerDependencies": {
55
55
  "zod": "^4.0.0",
56
- "@zhin.js/command": "^1.1.10",
57
- "zhin.js": "^1.1.15"
56
+ "@zhin.js/command": "^1.1.11",
57
+ "zhin.js": "^1.1.16"
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 "日历未启用:请先配置 provider 与凭据";
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 `已创建事件 [${event.id}]\n${event.title}\n${event.start} → ${event.end}(${timezone})`;
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 "日历未启用:请先配置 provider 与凭据";
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 `已创建事件 [${event.id}]\n${event.title}\n${event.start} → ${event.end}(${timezone})`;
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 "日历未启用:请先配置 provider 与凭据";
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 `在工作时段(${runtime.config.work_day_start}-${runtime.config.work_day_end} ${timezone})没有足够的空闲`;
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 "日历未启用:请先配置 provider 与凭据";
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 `在工作时段(${runtime.config.work_day_start}-${runtime.config.work_day_end} ${timezone})没有足够的空闲`;
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 "日历未启用:请在 plugins.calendar 配置 provider(caldav / google / microsoft)与凭据";
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 `(${runtime.provider.name})${from} ~ ${to} 没有事件`;
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 "日历未启用:请在 plugins.calendar 配置 provider(caldav / google / microsoft)与凭据";
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 `(${runtime.provider.name})${from} ~ ${to} 没有事件`;
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 Error(`CalDAV REPORT 失败:HTTP ${response.status}`);
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 Error(`CalDAV PUT 失败:HTTP ${response.status}`);
249
+ throw new CalendarError('caldavHttp', { method: 'PUT', status: response.status });
249
250
  }
250
251
  return {
251
252
  id: uid,