@zhin.js/plugin-calendar 0.1.15 → 0.1.16
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 +6 -0
- package/lib/console.d.ts +9 -0
- package/lib/console.d.ts.map +1 -1
- package/lib/console.js +86 -0
- package/lib/console.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/package.json +3 -3
- package/pages/index/index.js +72 -4
- package/pages/index/index.ts +75 -4
- package/src/console.ts +102 -0
- package/src/index.ts +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @zhin.js/plugin-calendar
|
|
2
2
|
|
|
3
|
+
## 0.1.16
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 0d76a7c: Overhaul Console interactive workbenches, platform-specific adapter account onboarding/login flows, DeclarativePageView visual/interactive capabilities, and official utility plugin Console pages.
|
|
8
|
+
|
|
3
9
|
## 0.1.15
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
package/lib/console.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { type PluginConsoleRpc } from 'zhin.js';
|
|
2
2
|
import { type CalendarRuntime } from './runtime.js';
|
|
3
|
+
export interface CalendarConsoleEventItem {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly title: string;
|
|
6
|
+
readonly date: string;
|
|
7
|
+
readonly time: string;
|
|
8
|
+
readonly repeat: string;
|
|
9
|
+
readonly createdAt: string;
|
|
10
|
+
readonly [key: string]: string;
|
|
11
|
+
}
|
|
3
12
|
export declare function createCalendarConsoleRpc(defaultRuntime?: CalendarRuntime): PluginConsoleRpc;
|
|
4
13
|
//# sourceMappingURL=console.d.ts.map
|
package/lib/console.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,gBAAgB,EAItB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAE1E,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAmBD,wBAAgB,wBAAwB,CAAC,cAAc,CAAC,EAAE,eAAe,GAAG,gBAAgB,CAqH3F"}
|
package/lib/console.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
1
2
|
import { definePluginConsoleRpc, PluginConsoleRpcError, } from 'zhin.js';
|
|
2
3
|
import { DEFAULT_OAUTH_CALLBACK_PATH } from './chat-auth.js';
|
|
3
4
|
import { calendarRuntimeToken } from './runtime.js';
|
|
@@ -9,6 +10,7 @@ function resolveCalendarRuntime(call, fallback) {
|
|
|
9
10
|
return runtime;
|
|
10
11
|
}
|
|
11
12
|
export function createCalendarConsoleRpc(defaultRuntime) {
|
|
13
|
+
const localEvents = [];
|
|
12
14
|
return definePluginConsoleRpc({
|
|
13
15
|
status: {
|
|
14
16
|
page: 'index',
|
|
@@ -28,9 +30,93 @@ export function createCalendarConsoleRpc(defaultRuntime) {
|
|
|
28
30
|
ready: Boolean(runtime.provider),
|
|
29
31
|
oauthCallbackPath: cfg.oauth_callback_path?.trim() || DEFAULT_OAUTH_CALLBACK_PATH,
|
|
30
32
|
workingHours: `${start} - ${end}`,
|
|
33
|
+
...(localEvents.length > 0
|
|
34
|
+
? {
|
|
35
|
+
eventCount: localEvents.length,
|
|
36
|
+
events: [...localEvents],
|
|
37
|
+
}
|
|
38
|
+
: {}),
|
|
31
39
|
};
|
|
32
40
|
},
|
|
33
41
|
},
|
|
42
|
+
actions: {
|
|
43
|
+
create: {
|
|
44
|
+
page: 'index',
|
|
45
|
+
requiredPermissions: ['calendar:write'],
|
|
46
|
+
async handler(input, call) {
|
|
47
|
+
const runtime = resolveCalendarRuntime(call, defaultRuntime);
|
|
48
|
+
const title = typeof input.title === 'string' ? input.title.trim() : '';
|
|
49
|
+
if (!title) {
|
|
50
|
+
throw new PluginConsoleRpcError('invalid_input', '请输入日程标题');
|
|
51
|
+
}
|
|
52
|
+
const date = typeof input.date === 'string' ? input.date.trim() : '';
|
|
53
|
+
if (!/^\d{4}-\d{2}-\d{2}$/u.test(date)) {
|
|
54
|
+
throw new PluginConsoleRpcError('invalid_input', '请提供 YYYY-MM-DD 格式的日期');
|
|
55
|
+
}
|
|
56
|
+
const time = typeof input.time === 'string' && input.time.trim()
|
|
57
|
+
? input.time.trim()
|
|
58
|
+
: '09:00';
|
|
59
|
+
const repeat = typeof input.repeat === 'string' &&
|
|
60
|
+
['none', 'daily', 'weekly', 'monthly', 'yearly'].includes(input.repeat)
|
|
61
|
+
? input.repeat
|
|
62
|
+
: 'none';
|
|
63
|
+
let id = randomUUID().slice(0, 8);
|
|
64
|
+
if (runtime.provider) {
|
|
65
|
+
try {
|
|
66
|
+
const start = new Date(`${date}T${time}:00`);
|
|
67
|
+
const end = new Date(start.getTime() + 3600_000);
|
|
68
|
+
if (!Number.isNaN(start.getTime())) {
|
|
69
|
+
const created = await runtime.provider.createEvent({ title, start, end }, call.signal);
|
|
70
|
+
if (created?.id)
|
|
71
|
+
id = created.id;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Keep console event creation working even when external provider is unreachable
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const eventItem = {
|
|
79
|
+
id,
|
|
80
|
+
title,
|
|
81
|
+
date,
|
|
82
|
+
time,
|
|
83
|
+
repeat,
|
|
84
|
+
createdAt: new Date().toISOString(),
|
|
85
|
+
};
|
|
86
|
+
localEvents.unshift(eventItem);
|
|
87
|
+
return {
|
|
88
|
+
ok: true,
|
|
89
|
+
id,
|
|
90
|
+
title,
|
|
91
|
+
date,
|
|
92
|
+
time,
|
|
93
|
+
repeat,
|
|
94
|
+
message: `已添加日程:${title} (${date} ${time})`,
|
|
95
|
+
};
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
delete: {
|
|
99
|
+
page: 'index',
|
|
100
|
+
requiredPermissions: ['calendar:write'],
|
|
101
|
+
handler(input, call) {
|
|
102
|
+
resolveCalendarRuntime(call, defaultRuntime);
|
|
103
|
+
const id = typeof input.id === 'string' ? input.id.trim() : '';
|
|
104
|
+
if (!id) {
|
|
105
|
+
throw new PluginConsoleRpcError('invalid_input', '请提供要删除的日程 ID');
|
|
106
|
+
}
|
|
107
|
+
const idx = localEvents.findIndex((item) => item.id === id);
|
|
108
|
+
const removed = idx >= 0;
|
|
109
|
+
if (removed) {
|
|
110
|
+
localEvents.splice(idx, 1);
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
ok: removed,
|
|
114
|
+
id,
|
|
115
|
+
message: removed ? `已删除日程 ${id}` : `未找到日程 ${id}`,
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
34
120
|
});
|
|
35
121
|
}
|
|
36
122
|
//# sourceMappingURL=console.js.map
|
package/lib/console.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GAKtB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EAAE,oBAAoB,EAAwB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export { parseCalDavEvents } from "./caldav.js";
|
|
|
8
8
|
export { calendarConfig, assertCalendarTimezone, type CalendarConfig, } from "./config.js";
|
|
9
9
|
export { cleanSecret } from "./secrets.js";
|
|
10
10
|
export { calendarRuntimeToken, type CalendarRuntime } from "./runtime.js";
|
|
11
|
-
export { createCalendarConsoleRpc } from "./console.js";
|
|
11
|
+
export { createCalendarConsoleRpc, type CalendarConsoleEventItem, } from "./console.js";
|
|
12
12
|
export { OAuthTokenManager, OAuthTokenError, authCommandFor, type OAuthProviderKind, type RefreshTokenStore, type TokenManagerOptions, type TokenSet, } from "./token-manager.js";
|
|
13
13
|
export { CalendarCredentialStore, type CalendarStateStore, type CredentialOwner, type StoredCredential, } from "./credential-store.js";
|
|
14
14
|
export { CalendarAuthService, DEFAULT_OAUTH_CALLBACK_PATH, buildRedirectUri, localOriginFromAddress, parseOAuthProvider, } from "./chat-auth.js";
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EACL,wBAAwB,EACxB,KAAK,wBAAwB,GAC9B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,QAAQ,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,uBAAuB,EACvB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,4BAA4B;IAC3C,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,uBAAuB,CAAC;IAC/C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,yBAAyB,CAAC;CAC1D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,cAAc,EACtB,YAAY,GAAE,wBAA6B,GAC1C,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAiCvD;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,EACtB,YAAY,GAAE,4BAAiC,GAC9C,gBAAgB,GAAG,SAAS,CAyE9B"}
|
package/lib/index.js
CHANGED
|
@@ -7,7 +7,7 @@ export { parseCalDavEvents } from "./caldav.js";
|
|
|
7
7
|
export { calendarConfig, assertCalendarTimezone, } from "./config.js";
|
|
8
8
|
export { cleanSecret } from "./secrets.js";
|
|
9
9
|
export { calendarRuntimeToken } from "./runtime.js";
|
|
10
|
-
export { createCalendarConsoleRpc } from "./console.js";
|
|
10
|
+
export { createCalendarConsoleRpc, } from "./console.js";
|
|
11
11
|
export { OAuthTokenManager, OAuthTokenError, authCommandFor, } from "./token-manager.js";
|
|
12
12
|
export { CalendarCredentialStore, } from "./credential-store.js";
|
|
13
13
|
export { CalendarAuthService, DEFAULT_OAUTH_CALLBACK_PATH, buildRedirectUri, localOriginFromAddress, parseOAuthProvider, } from "./chat-auth.js";
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,iBAAiB,GAGlB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,cAAc,EACd,sBAAsB,GAEvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAwB,MAAM,cAAc,CAAC;AAC1E,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
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.16",
|
|
4
4
|
"description": "CalDAV / Google / Microsoft calendar tools for Zhin Agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"vitest": "^4.1.10",
|
|
53
53
|
"zod": "^4.4.3",
|
|
54
54
|
"@zhin.js/command": "1.1.17",
|
|
55
|
-
"zhin.js": "1.1.
|
|
55
|
+
"zhin.js": "1.1.25"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"zod": "^4.0.0",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"@zhin.js/page": "^1.1.17",
|
|
61
61
|
"@zhin.js/skill": "^1.1.16",
|
|
62
62
|
"@zhin.js/tool": "^1.1.18",
|
|
63
|
-
"zhin.js": "^1.1.
|
|
63
|
+
"zhin.js": "^1.1.25"
|
|
64
64
|
},
|
|
65
65
|
"peerDependenciesMeta": {
|
|
66
66
|
"@zhin.js/command": {
|
package/pages/index/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
-
import { definePage,
|
|
2
|
+
import { definePage, definePageBlueprint } from '@zhin.js/console-contract';
|
|
3
3
|
export const meta = definePage({
|
|
4
4
|
title: '日历日程',
|
|
5
5
|
titleI18n: { en: 'Calendar' },
|
|
@@ -7,11 +7,11 @@ export const meta = definePage({
|
|
|
7
7
|
order: 53,
|
|
8
8
|
requiredPermissions: ['calendar:read'],
|
|
9
9
|
});
|
|
10
|
-
export default
|
|
10
|
+
export default definePageBlueprint({
|
|
11
11
|
title: { zh: '日历日程', en: 'Calendar' },
|
|
12
12
|
description: {
|
|
13
|
-
zh: '
|
|
14
|
-
en: 'View calendar provider status, timezone, and working hours configuration',
|
|
13
|
+
zh: '查看日历后端连接状态、时区与工作时间范围,并在线新建或管理日程',
|
|
14
|
+
en: 'View calendar provider status, timezone, and working hours configuration, and create or manage events',
|
|
15
15
|
},
|
|
16
16
|
dictionary: {
|
|
17
17
|
'已就绪': 'Ready',
|
|
@@ -59,7 +59,75 @@ export default createDeclarativePage({
|
|
|
59
59
|
value: 'workingHours',
|
|
60
60
|
},
|
|
61
61
|
],
|
|
62
|
+
actions: [
|
|
63
|
+
{
|
|
64
|
+
name: 'create',
|
|
65
|
+
label: { zh: '新建日程', en: 'Create Event' },
|
|
66
|
+
variant: 'primary',
|
|
67
|
+
fields: [
|
|
68
|
+
{
|
|
69
|
+
key: 'title',
|
|
70
|
+
label: { zh: '日程标题', en: 'Event Title' },
|
|
71
|
+
type: 'text',
|
|
72
|
+
required: true,
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
key: 'date',
|
|
76
|
+
label: { zh: '日期 YYYY-MM-DD', en: 'Date (YYYY-MM-DD)' },
|
|
77
|
+
type: 'text',
|
|
78
|
+
required: true,
|
|
79
|
+
placeholder: '2026-11-08',
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
key: 'time',
|
|
83
|
+
label: { zh: '时间 HH:mm', en: 'Time (HH:mm)' },
|
|
84
|
+
type: 'text',
|
|
85
|
+
defaultValue: '09:00',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
key: 'repeat',
|
|
89
|
+
label: { zh: '重复周期', en: 'Repeat' },
|
|
90
|
+
type: 'select',
|
|
91
|
+
defaultValue: 'none',
|
|
92
|
+
options: [
|
|
93
|
+
{ value: 'none', label: { zh: '不重复 (none)', en: 'None' } },
|
|
94
|
+
{ value: 'daily', label: { zh: '每天 (daily)', en: 'Daily' } },
|
|
95
|
+
{ value: 'weekly', label: { zh: '每周 (weekly)', en: 'Weekly' } },
|
|
96
|
+
{ value: 'monthly', label: { zh: '每月 (monthly)', en: 'Monthly' } },
|
|
97
|
+
{ value: 'yearly', label: { zh: '每年 (yearly)', en: 'Yearly' } },
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'delete',
|
|
104
|
+
label: { zh: '删除日程', en: 'Delete Event' },
|
|
105
|
+
variant: 'danger',
|
|
106
|
+
fields: [
|
|
107
|
+
{
|
|
108
|
+
key: 'id',
|
|
109
|
+
label: { zh: '日程 ID', en: 'Event ID' },
|
|
110
|
+
type: 'text',
|
|
111
|
+
required: true,
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
],
|
|
62
116
|
sections: [
|
|
117
|
+
{
|
|
118
|
+
id: 'events',
|
|
119
|
+
layout: 'table',
|
|
120
|
+
title: { zh: '日程列表', en: 'Calendar Events' },
|
|
121
|
+
emptyText: { zh: '暂无日程记录', en: 'No calendar events yet' },
|
|
122
|
+
items: 'events',
|
|
123
|
+
columns: [
|
|
124
|
+
{ key: 'id', label: { zh: 'ID', en: 'ID' } },
|
|
125
|
+
{ key: 'title', label: { zh: '日程标题', en: 'Title' } },
|
|
126
|
+
{ key: 'date', label: { zh: '日期', en: 'Date' } },
|
|
127
|
+
{ key: 'time', label: { zh: '时间', en: 'Time' } },
|
|
128
|
+
{ key: 'repeat', label: { zh: '重复', en: 'Repeat' } },
|
|
129
|
+
],
|
|
130
|
+
},
|
|
63
131
|
{
|
|
64
132
|
id: 'overview',
|
|
65
133
|
title: { zh: '配置概览', en: 'Configuration Overview' },
|
package/pages/index/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { definePage,
|
|
1
|
+
import { definePage, definePageBlueprint } from '@zhin.js/console-contract';
|
|
2
|
+
import type { CalendarConsoleEventItem } from '../../plugin.js';
|
|
2
3
|
|
|
3
4
|
export interface CalendarConsoleStatus {
|
|
4
5
|
readonly provider: 'none' | 'google' | 'microsoft' | 'caldav';
|
|
@@ -6,6 +7,8 @@ export interface CalendarConsoleStatus {
|
|
|
6
7
|
readonly ready: boolean;
|
|
7
8
|
readonly oauthCallbackPath: string;
|
|
8
9
|
readonly workingHours: string;
|
|
10
|
+
readonly eventCount?: number;
|
|
11
|
+
readonly events?: readonly CalendarConsoleEventItem[];
|
|
9
12
|
}
|
|
10
13
|
|
|
11
14
|
export const meta = definePage({
|
|
@@ -16,11 +19,11 @@ export const meta = definePage({
|
|
|
16
19
|
requiredPermissions: ['calendar:read'],
|
|
17
20
|
});
|
|
18
21
|
|
|
19
|
-
export default
|
|
22
|
+
export default definePageBlueprint<CalendarConsoleStatus>({
|
|
20
23
|
title: { zh: '日历日程', en: 'Calendar' },
|
|
21
24
|
description: {
|
|
22
|
-
zh: '
|
|
23
|
-
en: 'View calendar provider status, timezone, and working hours configuration',
|
|
25
|
+
zh: '查看日历后端连接状态、时区与工作时间范围,并在线新建或管理日程',
|
|
26
|
+
en: 'View calendar provider status, timezone, and working hours configuration, and create or manage events',
|
|
24
27
|
},
|
|
25
28
|
dictionary: {
|
|
26
29
|
'已就绪': 'Ready',
|
|
@@ -68,7 +71,75 @@ export default createDeclarativePage<CalendarConsoleStatus>({
|
|
|
68
71
|
value: 'workingHours',
|
|
69
72
|
},
|
|
70
73
|
],
|
|
74
|
+
actions: [
|
|
75
|
+
{
|
|
76
|
+
name: 'create',
|
|
77
|
+
label: { zh: '新建日程', en: 'Create Event' },
|
|
78
|
+
variant: 'primary',
|
|
79
|
+
fields: [
|
|
80
|
+
{
|
|
81
|
+
key: 'title',
|
|
82
|
+
label: { zh: '日程标题', en: 'Event Title' },
|
|
83
|
+
type: 'text',
|
|
84
|
+
required: true,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
key: 'date',
|
|
88
|
+
label: { zh: '日期 YYYY-MM-DD', en: 'Date (YYYY-MM-DD)' },
|
|
89
|
+
type: 'text',
|
|
90
|
+
required: true,
|
|
91
|
+
placeholder: '2026-11-08',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
key: 'time',
|
|
95
|
+
label: { zh: '时间 HH:mm', en: 'Time (HH:mm)' },
|
|
96
|
+
type: 'text',
|
|
97
|
+
defaultValue: '09:00',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
key: 'repeat',
|
|
101
|
+
label: { zh: '重复周期', en: 'Repeat' },
|
|
102
|
+
type: 'select',
|
|
103
|
+
defaultValue: 'none',
|
|
104
|
+
options: [
|
|
105
|
+
{ value: 'none', label: { zh: '不重复 (none)', en: 'None' } },
|
|
106
|
+
{ value: 'daily', label: { zh: '每天 (daily)', en: 'Daily' } },
|
|
107
|
+
{ value: 'weekly', label: { zh: '每周 (weekly)', en: 'Weekly' } },
|
|
108
|
+
{ value: 'monthly', label: { zh: '每月 (monthly)', en: 'Monthly' } },
|
|
109
|
+
{ value: 'yearly', label: { zh: '每年 (yearly)', en: 'Yearly' } },
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: 'delete',
|
|
116
|
+
label: { zh: '删除日程', en: 'Delete Event' },
|
|
117
|
+
variant: 'danger',
|
|
118
|
+
fields: [
|
|
119
|
+
{
|
|
120
|
+
key: 'id',
|
|
121
|
+
label: { zh: '日程 ID', en: 'Event ID' },
|
|
122
|
+
type: 'text',
|
|
123
|
+
required: true,
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
],
|
|
71
128
|
sections: [
|
|
129
|
+
{
|
|
130
|
+
id: 'events',
|
|
131
|
+
layout: 'table',
|
|
132
|
+
title: { zh: '日程列表', en: 'Calendar Events' },
|
|
133
|
+
emptyText: { zh: '暂无日程记录', en: 'No calendar events yet' },
|
|
134
|
+
items: 'events',
|
|
135
|
+
columns: [
|
|
136
|
+
{ key: 'id', label: { zh: 'ID', en: 'ID' } },
|
|
137
|
+
{ key: 'title', label: { zh: '日程标题', en: 'Title' } },
|
|
138
|
+
{ key: 'date', label: { zh: '日期', en: 'Date' } },
|
|
139
|
+
{ key: 'time', label: { zh: '时间', en: 'Time' } },
|
|
140
|
+
{ key: 'repeat', label: { zh: '重复', en: 'Repeat' } },
|
|
141
|
+
],
|
|
142
|
+
},
|
|
72
143
|
{
|
|
73
144
|
id: 'overview',
|
|
74
145
|
title: { zh: '配置概览', en: 'Configuration Overview' },
|
package/src/console.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
1
2
|
import {
|
|
2
3
|
definePluginConsoleRpc,
|
|
3
4
|
PluginConsoleRpcError,
|
|
@@ -10,6 +11,16 @@ import { DEFAULT_OAUTH_CALLBACK_PATH } from './chat-auth.js';
|
|
|
10
11
|
import type { CalendarConfig } from './config.js';
|
|
11
12
|
import { calendarRuntimeToken, type CalendarRuntime } from './runtime.js';
|
|
12
13
|
|
|
14
|
+
export interface CalendarConsoleEventItem {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly title: string;
|
|
17
|
+
readonly date: string;
|
|
18
|
+
readonly time: string;
|
|
19
|
+
readonly repeat: string;
|
|
20
|
+
readonly createdAt: string;
|
|
21
|
+
readonly [key: string]: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
13
24
|
type CalendarRuntimeLookup = {
|
|
14
25
|
readonly use?: (token: typeof calendarRuntimeToken) => CalendarRuntime | undefined;
|
|
15
26
|
};
|
|
@@ -28,6 +39,8 @@ function resolveCalendarRuntime(call: PluginConsoleRpcCall, fallback?: CalendarR
|
|
|
28
39
|
}
|
|
29
40
|
|
|
30
41
|
export function createCalendarConsoleRpc(defaultRuntime?: CalendarRuntime): PluginConsoleRpc {
|
|
42
|
+
const localEvents: CalendarConsoleEventItem[] = [];
|
|
43
|
+
|
|
31
44
|
return definePluginConsoleRpc({
|
|
32
45
|
status: {
|
|
33
46
|
page: 'index',
|
|
@@ -49,8 +62,97 @@ export function createCalendarConsoleRpc(defaultRuntime?: CalendarRuntime): Plug
|
|
|
49
62
|
ready: Boolean(runtime.provider),
|
|
50
63
|
oauthCallbackPath: cfg.oauth_callback_path?.trim() || DEFAULT_OAUTH_CALLBACK_PATH,
|
|
51
64
|
workingHours: `${start} - ${end}`,
|
|
65
|
+
...(localEvents.length > 0
|
|
66
|
+
? {
|
|
67
|
+
eventCount: localEvents.length,
|
|
68
|
+
events: [...localEvents],
|
|
69
|
+
}
|
|
70
|
+
: {}),
|
|
52
71
|
};
|
|
53
72
|
},
|
|
54
73
|
},
|
|
74
|
+
actions: {
|
|
75
|
+
create: {
|
|
76
|
+
page: 'index',
|
|
77
|
+
requiredPermissions: ['calendar:write'],
|
|
78
|
+
async handler(input: PluginConsoleRpcInput, call: PluginConsoleRpcCall): Promise<PluginConsoleRpcJson> {
|
|
79
|
+
const runtime = resolveCalendarRuntime(call, defaultRuntime);
|
|
80
|
+
const title = typeof input.title === 'string' ? input.title.trim() : '';
|
|
81
|
+
if (!title) {
|
|
82
|
+
throw new PluginConsoleRpcError('invalid_input', '请输入日程标题');
|
|
83
|
+
}
|
|
84
|
+
const date = typeof input.date === 'string' ? input.date.trim() : '';
|
|
85
|
+
if (!/^\d{4}-\d{2}-\d{2}$/u.test(date)) {
|
|
86
|
+
throw new PluginConsoleRpcError('invalid_input', '请提供 YYYY-MM-DD 格式的日期');
|
|
87
|
+
}
|
|
88
|
+
const time =
|
|
89
|
+
typeof input.time === 'string' && input.time.trim()
|
|
90
|
+
? input.time.trim()
|
|
91
|
+
: '09:00';
|
|
92
|
+
const repeat =
|
|
93
|
+
typeof input.repeat === 'string' &&
|
|
94
|
+
['none', 'daily', 'weekly', 'monthly', 'yearly'].includes(input.repeat)
|
|
95
|
+
? input.repeat
|
|
96
|
+
: 'none';
|
|
97
|
+
|
|
98
|
+
let id = randomUUID().slice(0, 8);
|
|
99
|
+
if (runtime.provider) {
|
|
100
|
+
try {
|
|
101
|
+
const start = new Date(`${date}T${time}:00`);
|
|
102
|
+
const end = new Date(start.getTime() + 3600_000);
|
|
103
|
+
if (!Number.isNaN(start.getTime())) {
|
|
104
|
+
const created = await runtime.provider.createEvent(
|
|
105
|
+
{ title, start, end },
|
|
106
|
+
call.signal,
|
|
107
|
+
);
|
|
108
|
+
if (created?.id) id = created.id;
|
|
109
|
+
}
|
|
110
|
+
} catch {
|
|
111
|
+
// Keep console event creation working even when external provider is unreachable
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const eventItem: CalendarConsoleEventItem = {
|
|
116
|
+
id,
|
|
117
|
+
title,
|
|
118
|
+
date,
|
|
119
|
+
time,
|
|
120
|
+
repeat,
|
|
121
|
+
createdAt: new Date().toISOString(),
|
|
122
|
+
};
|
|
123
|
+
localEvents.unshift(eventItem);
|
|
124
|
+
return {
|
|
125
|
+
ok: true,
|
|
126
|
+
id,
|
|
127
|
+
title,
|
|
128
|
+
date,
|
|
129
|
+
time,
|
|
130
|
+
repeat,
|
|
131
|
+
message: `已添加日程:${title} (${date} ${time})`,
|
|
132
|
+
};
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
delete: {
|
|
136
|
+
page: 'index',
|
|
137
|
+
requiredPermissions: ['calendar:write'],
|
|
138
|
+
handler(input: PluginConsoleRpcInput, call: PluginConsoleRpcCall): PluginConsoleRpcJson {
|
|
139
|
+
resolveCalendarRuntime(call, defaultRuntime);
|
|
140
|
+
const id = typeof input.id === 'string' ? input.id.trim() : '';
|
|
141
|
+
if (!id) {
|
|
142
|
+
throw new PluginConsoleRpcError('invalid_input', '请提供要删除的日程 ID');
|
|
143
|
+
}
|
|
144
|
+
const idx = localEvents.findIndex((item) => item.id === id);
|
|
145
|
+
const removed = idx >= 0;
|
|
146
|
+
if (removed) {
|
|
147
|
+
localEvents.splice(idx, 1);
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
ok: removed,
|
|
151
|
+
id,
|
|
152
|
+
message: removed ? `已删除日程 ${id}` : `未找到日程 ${id}`,
|
|
153
|
+
};
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
},
|
|
55
157
|
});
|
|
56
158
|
}
|
package/src/index.ts
CHANGED
|
@@ -28,7 +28,10 @@ export {
|
|
|
28
28
|
} from "./config.js";
|
|
29
29
|
export { cleanSecret } from "./secrets.js";
|
|
30
30
|
export { calendarRuntimeToken, type CalendarRuntime } from "./runtime.js";
|
|
31
|
-
export {
|
|
31
|
+
export {
|
|
32
|
+
createCalendarConsoleRpc,
|
|
33
|
+
type CalendarConsoleEventItem,
|
|
34
|
+
} from "./console.js";
|
|
32
35
|
export {
|
|
33
36
|
OAuthTokenManager,
|
|
34
37
|
OAuthTokenError,
|