@xiaolinstar/ai-todo-cli 0.4.0 → 0.4.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/README.md +2 -2
- package/dist/index.js +230 -130
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
- package/settings.example.json +1 -1
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ Create `~/.ai-todo/settings.json` (see `settings.example.json` in this package):
|
|
|
16
16
|
|
|
17
17
|
```json
|
|
18
18
|
{
|
|
19
|
-
"url": "https://
|
|
19
|
+
"url": "https://xingxiaolin.cn",
|
|
20
20
|
"token": "aitodo_your_personal_access_token"
|
|
21
21
|
}
|
|
22
22
|
```
|
|
@@ -27,7 +27,7 @@ Environment variables override the file (useful for CI / agents):
|
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
29
|
export AI_TODO_TOKEN=aitodo_xxx
|
|
30
|
-
export AI_TODO_API_URL=https://
|
|
30
|
+
export AI_TODO_API_URL=https://xingxiaolin.cn
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
## Usage
|
package/dist/index.js
CHANGED
|
@@ -80,6 +80,9 @@ var AiTodoClient = class {
|
|
|
80
80
|
if (params.limit) {
|
|
81
81
|
search.set("limit", String(params.limit));
|
|
82
82
|
}
|
|
83
|
+
if (params.cursor) {
|
|
84
|
+
search.set("cursor", params.cursor);
|
|
85
|
+
}
|
|
83
86
|
const query = search.toString();
|
|
84
87
|
return this.request(`/v1/reminders${query ? `?${query}` : ""}`);
|
|
85
88
|
}
|
|
@@ -126,6 +129,9 @@ var AiTodoClient = class {
|
|
|
126
129
|
if (params.limit) {
|
|
127
130
|
search.set("limit", String(params.limit));
|
|
128
131
|
}
|
|
132
|
+
if (params.cursor) {
|
|
133
|
+
search.set("cursor", params.cursor);
|
|
134
|
+
}
|
|
129
135
|
const query = search.toString();
|
|
130
136
|
return this.request(
|
|
131
137
|
`/v1/calendar/events${query ? `?${query}` : ""}`
|
|
@@ -172,9 +178,19 @@ var AiTodoClient = class {
|
|
|
172
178
|
body: JSON.stringify(input)
|
|
173
179
|
});
|
|
174
180
|
}
|
|
175
|
-
searchContacts(
|
|
176
|
-
const
|
|
177
|
-
|
|
181
|
+
searchContacts(params = {}) {
|
|
182
|
+
const search = new URLSearchParams();
|
|
183
|
+
if (params.query) {
|
|
184
|
+
search.set("q", params.query);
|
|
185
|
+
}
|
|
186
|
+
if (params.limit !== void 0) {
|
|
187
|
+
search.set("limit", String(params.limit));
|
|
188
|
+
}
|
|
189
|
+
if (params.cursor) {
|
|
190
|
+
search.set("cursor", params.cursor);
|
|
191
|
+
}
|
|
192
|
+
const query = search.toString();
|
|
193
|
+
return this.request(`/v1/contacts${query ? `?${query}` : ""}`);
|
|
178
194
|
}
|
|
179
195
|
getContact(contactId) {
|
|
180
196
|
return this.request(`/v1/contacts/${encodeURIComponent(contactId)}`);
|
|
@@ -225,8 +241,24 @@ var path = __toESM(require("node:path"));
|
|
|
225
241
|
var SETTINGS_DIR = path.join(os.homedir(), ".ai-todo");
|
|
226
242
|
var SETTINGS_PATH = path.join(SETTINGS_DIR, "settings.json");
|
|
227
243
|
var LEGACY_CONFIG_PATH = path.join(SETTINGS_DIR, "config.json");
|
|
244
|
+
var PRODUCTION_API_URL = "https://xingxiaolin.cn";
|
|
245
|
+
function normalizeApiUrl(url) {
|
|
246
|
+
if (!url) {
|
|
247
|
+
return void 0;
|
|
248
|
+
}
|
|
249
|
+
const trimmed = url.trim();
|
|
250
|
+
if (!trimmed) {
|
|
251
|
+
return void 0;
|
|
252
|
+
}
|
|
253
|
+
if (/wodi\.games/i.test(trimmed)) {
|
|
254
|
+
return PRODUCTION_API_URL;
|
|
255
|
+
}
|
|
256
|
+
return trimmed;
|
|
257
|
+
}
|
|
228
258
|
function normalizeSettings(raw) {
|
|
229
|
-
const url =
|
|
259
|
+
const url = normalizeApiUrl(
|
|
260
|
+
typeof raw.url === "string" ? raw.url : typeof raw.apiUrl === "string" ? raw.apiUrl : void 0
|
|
261
|
+
);
|
|
230
262
|
const token = typeof raw.token === "string" ? raw.token : void 0;
|
|
231
263
|
return { url, token };
|
|
232
264
|
}
|
|
@@ -252,7 +284,12 @@ function settingsPath() {
|
|
|
252
284
|
function loadSettings() {
|
|
253
285
|
const current = readJsonFile(SETTINGS_PATH);
|
|
254
286
|
if (current) {
|
|
255
|
-
|
|
287
|
+
const settings = normalizeSettings(current);
|
|
288
|
+
const rawUrl = typeof current.url === "string" ? current.url : typeof current.apiUrl === "string" ? current.apiUrl : void 0;
|
|
289
|
+
if (rawUrl && normalizeApiUrl(rawUrl) !== rawUrl.trim()) {
|
|
290
|
+
writeSettingsFile(settings);
|
|
291
|
+
}
|
|
292
|
+
return settings;
|
|
256
293
|
}
|
|
257
294
|
const legacy = readJsonFile(LEGACY_CONFIG_PATH);
|
|
258
295
|
if (legacy) {
|
|
@@ -273,11 +310,11 @@ function clearToken() {
|
|
|
273
310
|
writeSettingsFile(rest);
|
|
274
311
|
}
|
|
275
312
|
function resolveApiUrl(settings = loadSettings()) {
|
|
276
|
-
const fromEnv = process.env.AI_TODO_API_URL
|
|
313
|
+
const fromEnv = normalizeApiUrl(process.env.AI_TODO_API_URL);
|
|
277
314
|
if (fromEnv) {
|
|
278
315
|
return fromEnv;
|
|
279
316
|
}
|
|
280
|
-
const fromFile = settings.url
|
|
317
|
+
const fromFile = normalizeApiUrl(settings.url);
|
|
281
318
|
if (fromFile) {
|
|
282
319
|
return fromFile;
|
|
283
320
|
}
|
|
@@ -296,7 +333,7 @@ function resolveTokenSource() {
|
|
|
296
333
|
}
|
|
297
334
|
return { source: "none" };
|
|
298
335
|
}
|
|
299
|
-
function settingsExample(apiUrl = "https://
|
|
336
|
+
function settingsExample(apiUrl = "https://xingxiaolin.cn") {
|
|
300
337
|
return JSON.stringify({ url: apiUrl, token: "aitodo_xxx" }, null, 2);
|
|
301
338
|
}
|
|
302
339
|
function printAuthHint(reason = "missing") {
|
|
@@ -311,7 +348,7 @@ function printAuthHint(reason = "missing") {
|
|
|
311
348
|
"",
|
|
312
349
|
"Agent / CI \u4E5F\u53EF\u4F7F\u7528\u73AF\u5883\u53D8\u91CF\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E\u914D\u7F6E\u6587\u4EF6\uFF09\uFF1A",
|
|
313
350
|
" export AI_TODO_TOKEN=aitodo_xxx",
|
|
314
|
-
" export AI_TODO_API_URL=https://
|
|
351
|
+
" export AI_TODO_API_URL=https://xingxiaolin.cn",
|
|
315
352
|
"",
|
|
316
353
|
"\u751F\u4EA7\u73AF\u5883\u8BF7\u5728\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\u300C\u6211\u7684 \u2192 CLI / Agent \u8BBF\u95EE\u4EE4\u724C\u300D\u521B\u5EFA\u65B0 PAT\u3002"
|
|
317
354
|
] : [
|
|
@@ -449,65 +486,129 @@ function persistApiUrl(apiUrl) {
|
|
|
449
486
|
|
|
450
487
|
// src/help.ts
|
|
451
488
|
function printHelp() {
|
|
452
|
-
console.log(`ai-todo \u2014
|
|
453
|
-
|
|
454
|
-
Install:
|
|
455
|
-
npm install -g @xiaolinstar/ai-todo-cli
|
|
489
|
+
console.log(`ai-todo \u2014 reminders, calendar, and contacts
|
|
456
490
|
|
|
457
|
-
|
|
458
|
-
{
|
|
459
|
-
"url": "https://wodi.games",
|
|
460
|
-
"token": "aitodo_xxx"
|
|
461
|
-
}
|
|
491
|
+
Config ${settingsPath()}:
|
|
492
|
+
{ "url": "https://xingxiaolin.cn", "token": "aitodo_xxx" }
|
|
462
493
|
|
|
463
|
-
|
|
464
|
-
|
|
494
|
+
Token: WeChat miniapp \u2192 Mine \u2192 CLI / Agent tokens
|
|
495
|
+
Override: AI_TODO_TOKEN, AI_TODO_API_URL (else local http://127.0.0.1:3100)
|
|
465
496
|
|
|
466
|
-
|
|
497
|
+
Flags: --json --limit <n> --cursor <token> --idempotency-key <uuid>
|
|
467
498
|
|
|
468
|
-
|
|
499
|
+
Core:
|
|
500
|
+
ai-todo today
|
|
469
501
|
ai-todo whoami
|
|
470
502
|
ai-todo version
|
|
471
503
|
|
|
472
|
-
|
|
473
|
-
ai-todo
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
--
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
Today:
|
|
480
|
-
ai-todo today
|
|
481
|
-
|
|
482
|
-
Reminders (aliases: add, list, done, reschedule):
|
|
483
|
-
ai-todo reminder create --title <text> [--due <iso>] [--remind <iso>] [--notes <text>] [--contact <id_or_handle> ...]
|
|
484
|
-
ai-todo reminder list [--status pending|completed|cancelled] [--from YYYY-MM-DD] [--to YYYY-MM-DD]
|
|
485
|
-
ai-todo reminder show <reminder_id>
|
|
486
|
-
ai-todo reminder done <reminder_id>
|
|
487
|
-
ai-todo reminder update <reminder_id> [--title <text>] [--notes <text>] [--due <iso>] [--remind <iso>] [--contact <id_or_handle> ...]
|
|
488
|
-
ai-todo reminder reschedule <reminder_id> --due <iso> [--remind <iso>]
|
|
489
|
-
ai-todo reminder delete <reminder_id>
|
|
490
|
-
ai-todo add <title> # shorthand create (title only)
|
|
504
|
+
Reminders:
|
|
505
|
+
ai-todo reminder create --title <text> [--due <iso>] [--remind <iso>] [--notes <text>] [--contact <id> ...]
|
|
506
|
+
ai-todo reminder list [--status pending|completed|cancelled] [--from YYYY-MM-DD] [--to YYYY-MM-DD] [--limit <n>] [--cursor <token>]
|
|
507
|
+
ai-todo reminder show|done|delete <id>
|
|
508
|
+
ai-todo reminder update <id> [--title <text>] [--notes <text>] [--due <iso>] [--remind <iso>] [--contact <id> ...]
|
|
509
|
+
ai-todo reminder reschedule <id> --due <iso> [--remind <iso>]
|
|
510
|
+
ai-todo add <title>
|
|
491
511
|
|
|
492
512
|
Calendar:
|
|
493
|
-
ai-todo calendar today
|
|
494
|
-
ai-todo calendar list [--date YYYY-MM-DD]
|
|
513
|
+
ai-todo calendar today|list|add|show|update|delete ...
|
|
514
|
+
ai-todo calendar list [--date YYYY-MM-DD] [--limit <n>] [--cursor <token>]
|
|
495
515
|
ai-todo calendar add --title <text> --start <iso> [--end <iso>] [--location <text>]
|
|
496
|
-
ai-todo calendar show <event_id>
|
|
497
|
-
ai-todo calendar update <event_id> [--title <text>] [--start <iso>] [--end <iso>]
|
|
498
|
-
ai-todo calendar delete <event_id>
|
|
499
516
|
|
|
500
517
|
Contacts:
|
|
501
|
-
ai-todo contact add
|
|
502
|
-
ai-todo contact list
|
|
503
|
-
ai-todo contact search <query>
|
|
504
|
-
ai-todo contact show <contact_id_or_handle>
|
|
505
|
-
ai-todo contact update <contact_id_or_handle> [--handle <handle>] [--name <text>] [--email <v>] [--phone <v>] [--company <text>] [--job-title <text>] [--notes <text>]
|
|
506
|
-
ai-todo contact delete <contact_id_or_handle>
|
|
518
|
+
ai-todo contact add|list|search|show|update|delete ...
|
|
519
|
+
ai-todo contact list [--limit <n>] [--cursor <token>]
|
|
520
|
+
ai-todo contact search <query> [--limit <n>] [--cursor <token>]
|
|
507
521
|
|
|
508
|
-
|
|
522
|
+
Agents: https://github.com/xiaolinstar/ai-todo/blob/main/docs/agent-usage.md`);
|
|
523
|
+
}
|
|
509
524
|
|
|
510
|
-
|
|
525
|
+
// src/pagination.ts
|
|
526
|
+
var DEFAULT_LIST_LIMIT = 50;
|
|
527
|
+
function readListLimit(argv2) {
|
|
528
|
+
const raw = readFlagValue(argv2, "--limit");
|
|
529
|
+
if (!raw) {
|
|
530
|
+
return DEFAULT_LIST_LIMIT;
|
|
531
|
+
}
|
|
532
|
+
const parsed = Number.parseInt(raw, 10);
|
|
533
|
+
if (!Number.isFinite(parsed) || parsed < 1 || parsed > 100) {
|
|
534
|
+
console.error("Usage: --limit must be an integer between 1 and 100.");
|
|
535
|
+
process.exitCode = 1;
|
|
536
|
+
return DEFAULT_LIST_LIMIT;
|
|
537
|
+
}
|
|
538
|
+
return parsed;
|
|
539
|
+
}
|
|
540
|
+
function readListCursor(argv2) {
|
|
541
|
+
return readFlagValue(argv2, "--cursor");
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
// src/list-output.ts
|
|
545
|
+
function printListSummary(meta) {
|
|
546
|
+
const { label, pageCount, totalCount, hasMore, nextCursor, query, nextPageHint } = meta;
|
|
547
|
+
const titleParts = [label];
|
|
548
|
+
if (query) {
|
|
549
|
+
titleParts.push(`\u641C\u7D22\u300C${query}\u300D`);
|
|
550
|
+
}
|
|
551
|
+
if (!hasMore && pageCount === totalCount) {
|
|
552
|
+
titleParts.push(`\u5171 ${totalCount} \u6761`);
|
|
553
|
+
} else {
|
|
554
|
+
titleParts.push(`\u672C\u9875 ${pageCount} \u6761 / \u5171 ${totalCount} \u6761`);
|
|
555
|
+
}
|
|
556
|
+
console.log(titleParts.join(" \xB7 "));
|
|
557
|
+
if (hasMore && nextCursor && nextPageHint) {
|
|
558
|
+
console.log(`\u4E0B\u4E00\u9875\uFF1A${nextPageHint} --cursor ${nextCursor}`);
|
|
559
|
+
}
|
|
560
|
+
if (pageCount > 0) {
|
|
561
|
+
console.log("\u2500".repeat(32));
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
function printEmptyList(message) {
|
|
565
|
+
console.log(message);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// src/render-list.ts
|
|
569
|
+
function renderContactListPage(items, meta) {
|
|
570
|
+
if (items.length === 0) {
|
|
571
|
+
printEmptyList(meta.query ? "\u672A\u627E\u5230\u5339\u914D\u7684\u8054\u7CFB\u4EBA" : "\u6682\u65E0\u8054\u7CFB\u4EBA");
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
printListSummary({ ...meta, pageCount: items.length });
|
|
575
|
+
for (const contact of items) {
|
|
576
|
+
const detailParts = [
|
|
577
|
+
contact.company,
|
|
578
|
+
contact.primaryEmail ? `<${contact.primaryEmail}>` : void 0,
|
|
579
|
+
contact.primaryPhone || void 0
|
|
580
|
+
].filter(Boolean);
|
|
581
|
+
console.log(`\u2022 ${contact.displayName}`);
|
|
582
|
+
console.log(` @${contact.handle}${detailParts.length > 0 ? ` \xB7 ${detailParts.join(" \xB7 ")}` : ""}`);
|
|
583
|
+
console.log(` ${contact.id}`);
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
function renderReminderListPage(items, meta) {
|
|
587
|
+
if (items.length === 0) {
|
|
588
|
+
printEmptyList("\u6682\u65E0\u63D0\u9192");
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
printListSummary({ ...meta, pageCount: items.length });
|
|
592
|
+
for (const reminder of items) {
|
|
593
|
+
const due = reminder.dueAt ? ` \xB7 ${reminder.dueAt}` : "";
|
|
594
|
+
const contacts = reminder.contacts && reminder.contacts.length > 0 ? ` \xB7 ${reminder.contacts.map((contact) => contact.displayName).join("\u3001")}` : "";
|
|
595
|
+
console.log(`\u2022 [${reminder.status}] ${reminder.title}${due}${contacts}`);
|
|
596
|
+
console.log(` ${reminder.id}`);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
function renderCalendarListPage(items, meta) {
|
|
600
|
+
if (items.length === 0) {
|
|
601
|
+
printEmptyList("\u6682\u65E0\u65E5\u7A0B");
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
printListSummary({ ...meta, pageCount: items.length });
|
|
605
|
+
for (const event of items) {
|
|
606
|
+
const end = event.endAt ? ` \u2192 ${event.endAt}` : "";
|
|
607
|
+
const place = event.location ? ` \xB7 ${event.location}` : "";
|
|
608
|
+
console.log(`\u2022 ${event.title}`);
|
|
609
|
+
console.log(` ${event.startAt}${end}${place}`);
|
|
610
|
+
console.log(` ${event.id}`);
|
|
611
|
+
}
|
|
511
612
|
}
|
|
512
613
|
|
|
513
614
|
// src/commands/calendar.ts
|
|
@@ -529,23 +630,27 @@ async function runCalendarToday(ctx2) {
|
|
|
529
630
|
}
|
|
530
631
|
async function runCalendarList(ctx2, argv2) {
|
|
531
632
|
const date = readFlagValue(argv2, "--date");
|
|
633
|
+
const limit = readListLimit(argv2);
|
|
634
|
+
const cursor = readListCursor(argv2);
|
|
635
|
+
if (process.exitCode) {
|
|
636
|
+
return;
|
|
637
|
+
}
|
|
532
638
|
await handleApi(
|
|
533
639
|
ctx2,
|
|
534
640
|
await ctx2.client.listCalendarEvents(
|
|
535
|
-
date ? { from: date, to: date } : {}
|
|
641
|
+
date ? { from: date, to: date, limit, cursor } : { limit, cursor }
|
|
536
642
|
),
|
|
537
643
|
(data) => {
|
|
538
644
|
if (ctx2.json) {
|
|
539
645
|
return;
|
|
540
646
|
}
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
}
|
|
647
|
+
renderCalendarListPage(data.items, {
|
|
648
|
+
label: date ? `\u65E5\u7A0B \xB7 ${date}` : "\u65E5\u7A0B",
|
|
649
|
+
totalCount: data.totalCount,
|
|
650
|
+
hasMore: data.hasMore,
|
|
651
|
+
nextCursor: data.nextCursor,
|
|
652
|
+
nextPageHint: date ? "ai-todo calendar list --date <YYYY-MM-DD>" : "ai-todo calendar list"
|
|
653
|
+
});
|
|
549
654
|
}
|
|
550
655
|
);
|
|
551
656
|
}
|
|
@@ -702,24 +807,55 @@ async function runContactAdd(ctx2, argv2) {
|
|
|
702
807
|
async function runContactSearch(ctx2, argv2) {
|
|
703
808
|
const query = positionalAfter(argv2, "contact", "search");
|
|
704
809
|
if (!query) {
|
|
705
|
-
console.error("Usage: ai-todo contact search <query>");
|
|
810
|
+
console.error("Usage: ai-todo contact search <query> [--limit <n>] [--cursor <token>]");
|
|
706
811
|
process.exitCode = 1;
|
|
707
812
|
return;
|
|
708
813
|
}
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
814
|
+
if (process.exitCode) {
|
|
815
|
+
return;
|
|
816
|
+
}
|
|
817
|
+
const limit = readListLimit(argv2);
|
|
818
|
+
const cursor = readListCursor(argv2);
|
|
819
|
+
await handleApi(
|
|
820
|
+
ctx2,
|
|
821
|
+
await ctx2.client.searchContacts({ query, limit, cursor }),
|
|
822
|
+
(data) => {
|
|
823
|
+
if (ctx2.json) {
|
|
824
|
+
return;
|
|
825
|
+
}
|
|
826
|
+
renderContactListPage(data.items, {
|
|
827
|
+
label: "\u8054\u7CFB\u4EBA",
|
|
828
|
+
totalCount: data.totalCount,
|
|
829
|
+
hasMore: data.hasMore,
|
|
830
|
+
nextCursor: data.nextCursor,
|
|
831
|
+
query,
|
|
832
|
+
nextPageHint: "ai-todo contact search <query>"
|
|
833
|
+
});
|
|
712
834
|
}
|
|
713
|
-
|
|
714
|
-
});
|
|
835
|
+
);
|
|
715
836
|
}
|
|
716
|
-
async function runContactList(ctx2) {
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
837
|
+
async function runContactList(ctx2, argv2) {
|
|
838
|
+
const limit = readListLimit(argv2);
|
|
839
|
+
const cursor = readListCursor(argv2);
|
|
840
|
+
if (process.exitCode) {
|
|
841
|
+
return;
|
|
842
|
+
}
|
|
843
|
+
await handleApi(
|
|
844
|
+
ctx2,
|
|
845
|
+
await ctx2.client.searchContacts({ limit, cursor }),
|
|
846
|
+
(data) => {
|
|
847
|
+
if (ctx2.json) {
|
|
848
|
+
return;
|
|
849
|
+
}
|
|
850
|
+
renderContactListPage(data.items, {
|
|
851
|
+
label: "\u8054\u7CFB\u4EBA",
|
|
852
|
+
totalCount: data.totalCount,
|
|
853
|
+
hasMore: data.hasMore,
|
|
854
|
+
nextCursor: data.nextCursor,
|
|
855
|
+
nextPageHint: "ai-todo contact list"
|
|
856
|
+
});
|
|
720
857
|
}
|
|
721
|
-
|
|
722
|
-
});
|
|
858
|
+
);
|
|
723
859
|
}
|
|
724
860
|
async function runContactShow(ctx2, argv2) {
|
|
725
861
|
const id = positionalAfter(argv2, "contact", "show");
|
|
@@ -831,18 +967,6 @@ async function runContactDelete(ctx2, argv2) {
|
|
|
831
967
|
}
|
|
832
968
|
});
|
|
833
969
|
}
|
|
834
|
-
function renderContactList(items) {
|
|
835
|
-
if (items.length === 0) {
|
|
836
|
-
console.log("\u672A\u627E\u5230\u8054\u7CFB\u4EBA");
|
|
837
|
-
return;
|
|
838
|
-
}
|
|
839
|
-
for (const contact of items) {
|
|
840
|
-
const email = contact.primaryEmail ? ` <${contact.primaryEmail}>` : "";
|
|
841
|
-
const phone = contact.primaryPhone ? ` ${contact.primaryPhone}` : "";
|
|
842
|
-
const company = contact.company ? ` \xB7 ${contact.company}` : "";
|
|
843
|
-
console.log(`- ${contact.displayName}${company}${email}${phone} (@${contact.handle}, ${contact.id})`);
|
|
844
|
-
}
|
|
845
|
-
}
|
|
846
970
|
|
|
847
971
|
// src/version.ts
|
|
848
972
|
var import_node_fs = require("node:fs");
|
|
@@ -1040,30 +1164,6 @@ async function runWhoami(ctx2) {
|
|
|
1040
1164
|
}
|
|
1041
1165
|
});
|
|
1042
1166
|
}
|
|
1043
|
-
async function runProfileUpdate(ctx2, argv2) {
|
|
1044
|
-
const displayName = readFlagValue(argv2, "--name") ?? readFlagValue(argv2, "--display-name");
|
|
1045
|
-
const avatarUrl = readFlagValue(argv2, "--avatar-url");
|
|
1046
|
-
if (!displayName && avatarUrl === void 0) {
|
|
1047
|
-
console.error("Usage: ai-todo profile update --name <text> [--avatar-url <url>]");
|
|
1048
|
-
process.exitCode = 1;
|
|
1049
|
-
return;
|
|
1050
|
-
}
|
|
1051
|
-
await handleApi(
|
|
1052
|
-
ctx2,
|
|
1053
|
-
await ctx2.client.updateProfile({
|
|
1054
|
-
displayName,
|
|
1055
|
-
avatarUrl
|
|
1056
|
-
}),
|
|
1057
|
-
(data) => {
|
|
1058
|
-
if (!ctx2.json) {
|
|
1059
|
-
console.log(`\u5DF2\u66F4\u65B0\u4E2A\u4EBA\u8D44\u6599\uFF1A${data.user.displayName} (${data.user.id})`);
|
|
1060
|
-
if (data.user.avatarUrl) {
|
|
1061
|
-
console.log(`\u5934\u50CF\uFF1A${data.user.avatarUrl}`);
|
|
1062
|
-
}
|
|
1063
|
-
}
|
|
1064
|
-
}
|
|
1065
|
-
);
|
|
1066
|
-
}
|
|
1067
1167
|
async function runToday(ctx2) {
|
|
1068
1168
|
await handleApi(ctx2, await ctx2.client.today(), (data) => {
|
|
1069
1169
|
if (ctx2.json) {
|
|
@@ -1131,25 +1231,31 @@ async function runReminderCreate(ctx2, argv2) {
|
|
|
1131
1231
|
}
|
|
1132
1232
|
async function runReminderList(ctx2, argv2) {
|
|
1133
1233
|
const status = readFlagValue(argv2, "--status");
|
|
1234
|
+
const limit = readListLimit(argv2);
|
|
1235
|
+
const cursor = readListCursor(argv2);
|
|
1236
|
+
if (process.exitCode) {
|
|
1237
|
+
return;
|
|
1238
|
+
}
|
|
1134
1239
|
await handleApi(
|
|
1135
1240
|
ctx2,
|
|
1136
1241
|
await ctx2.client.listReminders({
|
|
1137
1242
|
status,
|
|
1138
1243
|
from: readFlagValue(argv2, "--from"),
|
|
1139
|
-
to: readFlagValue(argv2, "--to")
|
|
1244
|
+
to: readFlagValue(argv2, "--to"),
|
|
1245
|
+
limit,
|
|
1246
|
+
cursor
|
|
1140
1247
|
}),
|
|
1141
1248
|
(data) => {
|
|
1142
1249
|
if (ctx2.json) {
|
|
1143
1250
|
return;
|
|
1144
1251
|
}
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
}
|
|
1252
|
+
renderReminderListPage(data.items, {
|
|
1253
|
+
label: "\u63D0\u9192",
|
|
1254
|
+
totalCount: data.totalCount,
|
|
1255
|
+
hasMore: data.hasMore,
|
|
1256
|
+
nextCursor: data.nextCursor,
|
|
1257
|
+
nextPageHint: "ai-todo reminder list"
|
|
1258
|
+
});
|
|
1153
1259
|
}
|
|
1154
1260
|
);
|
|
1155
1261
|
}
|
|
@@ -1412,16 +1518,10 @@ async function main() {
|
|
|
1412
1518
|
case "whoami":
|
|
1413
1519
|
await runWhoami(ctx);
|
|
1414
1520
|
break;
|
|
1415
|
-
case "profile":
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
await runProfileUpdate(ctx, argv);
|
|
1419
|
-
} else {
|
|
1420
|
-
console.error("Usage: ai-todo profile update --name <text> [--avatar-url <url>]");
|
|
1421
|
-
process.exitCode = 1;
|
|
1422
|
-
}
|
|
1521
|
+
case "profile":
|
|
1522
|
+
console.error("\u4E2A\u4EBA\u8D44\u6599\u8BF7\u5728\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\u300C\u6211\u7684\u300D\u4E2D\u4FEE\u6539\uFF0CCLI \u4E0D\u63D0\u4F9B profile \u547D\u4EE4\u3002");
|
|
1523
|
+
process.exitCode = 1;
|
|
1423
1524
|
break;
|
|
1424
|
-
}
|
|
1425
1525
|
case "logout":
|
|
1426
1526
|
await runLogout(ctx);
|
|
1427
1527
|
break;
|
|
@@ -1503,7 +1603,7 @@ async function main() {
|
|
|
1503
1603
|
if (action === "add") {
|
|
1504
1604
|
await runContactAdd(ctx, argv);
|
|
1505
1605
|
} else if (action === "list") {
|
|
1506
|
-
await runContactList(ctx);
|
|
1606
|
+
await runContactList(ctx, argv);
|
|
1507
1607
|
} else if (action === "search") {
|
|
1508
1608
|
await runContactSearch(ctx, argv);
|
|
1509
1609
|
} else if (action === "show") {
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../packages/api-client/src/index.ts", "../src/settings.ts", "../src/auth.ts", "../src/context.ts", "../src/help.ts", "../src/commands/calendar.ts", "../src/commands/contact.ts", "../src/version.ts", "../src/commands/core.ts", "../src/commands/reminder.ts", "../src/commands/token.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n ApiResponse,\n CalendarEventDetailResult,\n CalendarEventListResult,\n CompleteReminderResult,\n ContactDetailResult,\n ContactListResult,\n CreateCalendarEventInput,\n CreateCalendarEventResult,\n CreateContactInput,\n CreateContactResult,\n CreateApiTokenInput,\n CreateApiTokenResult,\n CreateReminderInput,\n CreateReminderResult,\n DeleteCalendarEventResult,\n DeleteContactResult,\n DeleteReminderResult,\n ListCalendarEventsParams,\n ListRemindersParams,\n MeResult,\n ApiTokenListResult,\n ReminderDetailResult,\n ReminderListResult,\n RevokeAllApiTokensResult,\n RevokeApiTokenResult,\n RescheduleReminderInput,\n RescheduleReminderResult,\n TodayResult,\n UpdateCalendarEventInput,\n UpdateCalendarEventResult,\n UpdateContactInput,\n UpdateContactResult,\n UpdateProfileInput,\n UpdateProfileResult,\n UpdateReminderInput,\n UpdateReminderResult\n} from \"@ai-todo/shared\";\n\nexport interface AiTodoClientOptions {\n apiUrl: string;\n token?: string;\n source?: \"miniapp\" | \"cli\" | \"agent\" | \"api\";\n idempotencyKey?: string;\n}\n\nexport interface RequestOptions {\n idempotencyKey?: string;\n}\n\nexport class AiTodoClient {\n private readonly apiUrl: string;\n private readonly token?: string;\n private readonly source?: string;\n private readonly defaultIdempotencyKey?: string;\n\n constructor(options: AiTodoClientOptions) {\n this.apiUrl = options.apiUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n this.source = options.source;\n this.defaultIdempotencyKey = options.idempotencyKey;\n }\n\n async request<T>(\n path: string,\n init: RequestInit = {},\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const headers = new Headers(init.headers);\n headers.set(\"content-type\", \"application/json\");\n\n if (this.token) {\n headers.set(\"authorization\", `Bearer ${this.token}`);\n }\n\n if (this.source) {\n headers.set(\"x-client-source\", this.source);\n }\n\n const idempotencyKey = options.idempotencyKey ?? this.defaultIdempotencyKey;\n if (idempotencyKey) {\n headers.set(\"idempotency-key\", idempotencyKey);\n }\n\n const response = await fetch(`${this.apiUrl}${path}`, {\n ...init,\n headers\n });\n\n return (await response.json()) as ApiResponse<T>;\n }\n\n createReminder(input: CreateReminderInput): Promise<ApiResponse<CreateReminderResult>> {\n return this.request<CreateReminderResult>(\"/v1/reminders\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n }\n\n completeReminder(reminderId: string): Promise<ApiResponse<CompleteReminderResult>> {\n return this.request<CompleteReminderResult>(`/v1/reminders/${reminderId}/complete`, {\n method: \"POST\",\n body: JSON.stringify({})\n });\n }\n\n listReminders(params: ListRemindersParams = {}): Promise<ApiResponse<ReminderListResult>> {\n const search = new URLSearchParams();\n if (params.status) {\n search.set(\"status\", params.status);\n }\n if (params.from) {\n search.set(\"from\", params.from);\n }\n if (params.to) {\n search.set(\"to\", params.to);\n }\n if (params.limit) {\n search.set(\"limit\", String(params.limit));\n }\n const query = search.toString();\n return this.request<ReminderListResult>(`/v1/reminders${query ? `?${query}` : \"\"}`);\n }\n\n listRemindersToday(): Promise<ApiResponse<ReminderListResult>> {\n return this.request<ReminderListResult>(\"/v1/reminders/today\");\n }\n\n getReminder(reminderId: string): Promise<ApiResponse<ReminderDetailResult>> {\n return this.request<ReminderDetailResult>(`/v1/reminders/${encodeURIComponent(reminderId)}`);\n }\n\n updateReminder(\n reminderId: string,\n input: UpdateReminderInput\n ): Promise<ApiResponse<UpdateReminderResult>> {\n return this.request<UpdateReminderResult>(`/v1/reminders/${encodeURIComponent(reminderId)}`, {\n method: \"PATCH\",\n body: JSON.stringify(input)\n });\n }\n\n rescheduleReminder(\n reminderId: string,\n input: RescheduleReminderInput\n ): Promise<ApiResponse<RescheduleReminderResult>> {\n return this.request<RescheduleReminderResult>(\n `/v1/reminders/${encodeURIComponent(reminderId)}/reschedule`,\n {\n method: \"POST\",\n body: JSON.stringify(input)\n }\n );\n }\n\n deleteReminder(reminderId: string): Promise<ApiResponse<DeleteReminderResult>> {\n return this.request<DeleteReminderResult>(`/v1/reminders/${encodeURIComponent(reminderId)}`, {\n method: \"DELETE\"\n });\n }\n\n createCalendarEvent(\n input: CreateCalendarEventInput\n ): Promise<ApiResponse<CreateCalendarEventResult>> {\n return this.request<CreateCalendarEventResult>(\"/v1/calendar/events\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n }\n\n listCalendarEvents(\n params: ListCalendarEventsParams = {}\n ): Promise<ApiResponse<CalendarEventListResult>> {\n const search = new URLSearchParams();\n if (params.from) {\n search.set(\"from\", params.from);\n }\n if (params.to) {\n search.set(\"to\", params.to);\n }\n if (params.limit) {\n search.set(\"limit\", String(params.limit));\n }\n const query = search.toString();\n return this.request<CalendarEventListResult>(\n `/v1/calendar/events${query ? `?${query}` : \"\"}`\n );\n }\n\n listCalendarToday(): Promise<ApiResponse<CalendarEventListResult>> {\n return this.request<CalendarEventListResult>(\"/v1/calendar/today\");\n }\n\n getCalendarEvent(eventId: string): Promise<ApiResponse<CalendarEventDetailResult>> {\n return this.request<CalendarEventDetailResult>(\n `/v1/calendar/events/${encodeURIComponent(eventId)}`\n );\n }\n\n updateCalendarEvent(\n eventId: string,\n input: UpdateCalendarEventInput\n ): Promise<ApiResponse<UpdateCalendarEventResult>> {\n return this.request<UpdateCalendarEventResult>(\n `/v1/calendar/events/${encodeURIComponent(eventId)}`,\n {\n method: \"PATCH\",\n body: JSON.stringify(input)\n }\n );\n }\n\n deleteCalendarEvent(eventId: string): Promise<ApiResponse<DeleteCalendarEventResult>> {\n return this.request<DeleteCalendarEventResult>(\n `/v1/calendar/events/${encodeURIComponent(eventId)}`,\n { method: \"DELETE\" }\n );\n }\n\n me(): Promise<ApiResponse<MeResult>> {\n return this.request<MeResult>(\"/v1/me\");\n }\n\n updateProfile(input: UpdateProfileInput): Promise<ApiResponse<UpdateProfileResult>> {\n return this.request<UpdateProfileResult>(\"/v1/me/profile\", {\n method: \"PATCH\",\n body: JSON.stringify(input)\n });\n }\n\n today(): Promise<ApiResponse<TodayResult>> {\n return this.request<TodayResult>(\"/v1/today\");\n }\n\n createContact(input: CreateContactInput): Promise<ApiResponse<CreateContactResult>> {\n return this.request<CreateContactResult>(\"/v1/contacts\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n }\n\n searchContacts(query?: string): Promise<ApiResponse<ContactListResult>> {\n const params = query ? `?q=${encodeURIComponent(query)}` : \"\";\n return this.request<ContactListResult>(`/v1/contacts${params}`);\n }\n\n getContact(contactId: string): Promise<ApiResponse<ContactDetailResult>> {\n return this.request<ContactDetailResult>(`/v1/contacts/${encodeURIComponent(contactId)}`);\n }\n\n updateContact(\n contactId: string,\n input: UpdateContactInput\n ): Promise<ApiResponse<UpdateContactResult>> {\n return this.request<UpdateContactResult>(`/v1/contacts/${encodeURIComponent(contactId)}`, {\n method: \"PATCH\",\n body: JSON.stringify(input)\n });\n }\n\n deleteContact(contactId: string): Promise<ApiResponse<DeleteContactResult>> {\n return this.request<DeleteContactResult>(`/v1/contacts/${encodeURIComponent(contactId)}`, {\n method: \"DELETE\"\n });\n }\n\n createApiToken(input: CreateApiTokenInput): Promise<ApiResponse<CreateApiTokenResult>> {\n return this.request<CreateApiTokenResult>(\"/v1/api-tokens\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n }\n\n listApiTokens(): Promise<ApiResponse<ApiTokenListResult>> {\n return this.request<ApiTokenListResult>(\"/v1/api-tokens\");\n }\n\n revokeApiToken(tokenId: string): Promise<ApiResponse<RevokeApiTokenResult>> {\n return this.request<RevokeApiTokenResult>(`/v1/api-tokens/${encodeURIComponent(tokenId)}`, {\n method: \"DELETE\"\n });\n }\n\n revokeAllApiTokens(): Promise<ApiResponse<RevokeAllApiTokensResult>> {\n return this.request<RevokeAllApiTokensResult>(\"/v1/api-tokens/revoke-all\", {\n method: \"POST\",\n body: JSON.stringify({})\n });\n }\n\n issueDevPat(input: { name: string }): Promise<ApiResponse<CreateApiTokenResult>> {\n return this.request<CreateApiTokenResult>(\"/v1/auth/dev/issue-pat\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n }\n}\n", "import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\n/** On-disk shape for ~/.ai-todo/settings.json */\nexport interface CliSettings {\n url?: string;\n token?: string;\n}\n\nconst SETTINGS_DIR = path.join(os.homedir(), \".ai-todo\");\nconst SETTINGS_PATH = path.join(SETTINGS_DIR, \"settings.json\");\nconst LEGACY_CONFIG_PATH = path.join(SETTINGS_DIR, \"config.json\");\n\nfunction normalizeSettings(raw: Record<string, unknown>): CliSettings {\n const url =\n typeof raw.url === \"string\"\n ? raw.url\n : typeof raw.apiUrl === \"string\"\n ? raw.apiUrl\n : undefined;\n const token = typeof raw.token === \"string\" ? raw.token : undefined;\n return { url, token };\n}\n\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf8\")) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction writeSettingsFile(settings: CliSettings): void {\n fs.mkdirSync(SETTINGS_DIR, { recursive: true });\n fs.writeFileSync(SETTINGS_PATH, `${JSON.stringify(settings, null, 2)}\\n`, \"utf8\");\n try {\n fs.chmodSync(SETTINGS_PATH, 0o600);\n } catch {\n // best-effort on platforms without chmod\n }\n}\n\nexport function settingsPath(): string {\n return SETTINGS_PATH;\n}\n\nexport function loadSettings(): CliSettings {\n const current = readJsonFile(SETTINGS_PATH);\n if (current) {\n return normalizeSettings(current);\n }\n\n const legacy = readJsonFile(LEGACY_CONFIG_PATH);\n if (legacy) {\n const migrated = normalizeSettings(legacy);\n writeSettingsFile(migrated);\n return migrated;\n }\n\n return {};\n}\n\nexport function saveSettings(patch: CliSettings): void {\n const current = loadSettings();\n const next: CliSettings = { ...current, ...patch };\n writeSettingsFile(next);\n}\n\nexport function clearToken(): void {\n const current = loadSettings();\n const { token: _removed, ...rest } = current;\n writeSettingsFile(rest);\n}\n\nexport function resolveApiUrl(settings: CliSettings = loadSettings()): string {\n const fromEnv = process.env.AI_TODO_API_URL?.trim();\n if (fromEnv) {\n return fromEnv;\n }\n\n const fromFile = settings.url?.trim();\n if (fromFile) {\n return fromFile;\n }\n\n return \"http://127.0.0.1:3100\";\n}\n\ndeclare const process: {\n env: Record<string, string | undefined>;\n};\n", "import { loadSettings, settingsPath } from \"./settings\";\n\nexport type TokenSource = \"env\" | \"settings\" | \"none\";\n\nexport function resolveTokenSource(): { token?: string; source: TokenSource } {\n const envToken = process.env.AI_TODO_TOKEN?.trim();\n if (envToken) {\n return { token: envToken, source: \"env\" };\n }\n\n const settingsToken = loadSettings().token?.trim();\n if (settingsToken) {\n return { token: settingsToken, source: \"settings\" };\n }\n\n return { source: \"none\" };\n}\n\nfunction settingsExample(apiUrl = \"https://wodi.games\"): string {\n return JSON.stringify({ url: apiUrl, token: \"aitodo_xxx\" }, null, 2);\n}\n\nexport function printAuthHint(reason: \"missing\" | \"invalid\" = \"missing\"): void {\n const settingsFile = settingsPath();\n const lines =\n reason === \"invalid\"\n ? [\n \"API Token \u65E0\u6548\u6216\u5DF2\u8FC7\u671F\u3002\",\n \"\",\n \"\u8BF7\u66F4\u65B0 Personal Access Token\uFF08PAT\uFF09\uFF1A\",\n \"\",\n `\u7F16\u8F91 ${settingsFile}\uFF1A`,\n settingsExample(),\n \"\",\n \"Agent / CI \u4E5F\u53EF\u4F7F\u7528\u73AF\u5883\u53D8\u91CF\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E\u914D\u7F6E\u6587\u4EF6\uFF09\uFF1A\",\n \" export AI_TODO_TOKEN=aitodo_xxx\",\n \" export AI_TODO_API_URL=https://wodi.games\",\n \"\",\n \"\u751F\u4EA7\u73AF\u5883\u8BF7\u5728\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\u300C\u6211\u7684 \u2192 CLI / Agent \u8BBF\u95EE\u4EE4\u724C\u300D\u521B\u5EFA\u65B0 PAT\u3002\"\n ]\n : [\n \"\u672A\u68C0\u6D4B\u5230 API Token\u3002\",\n \"\",\n \"\u9996\u6B21\u914D\u7F6E\uFF1A\u521B\u5EFA ~/.ai-todo/settings.json\",\n \"\",\n settingsExample(),\n \"\",\n \"1. \u5FAE\u4FE1\u5C0F\u7A0B\u5E8F \u2192 \u6211\u7684 \u2192 CLI / Agent \u8BBF\u95EE\u4EE4\u724C \u2192 \u521B\u5EFA\",\n \"2. \u5C06\u5B8C\u6574 token \u586B\u5165\u4E0A\u8FF0\u6587\u4EF6\u7684 token \u5B57\u6BB5\",\n \"3. \u8FD0\u884C ai-todo whoami \u9A8C\u8BC1\",\n \"\",\n `\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF1A${settingsFile}`\n ];\n\n for (const line of lines) {\n console.error(line);\n }\n}\n\ndeclare const process: {\n env: Record<string, string | undefined>;\n};\n", "import { AiTodoClient } from \"@ai-todo/api-client\";\nimport type { ApiResponse } from \"@ai-todo/shared\";\n\nimport { printAuthHint, resolveTokenSource } from \"./auth\";\nimport { loadSettings, resolveApiUrl, saveSettings } from \"./settings\";\n\nexport interface CliContext {\n json: boolean;\n apiUrl: string;\n client: AiTodoClient;\n}\n\nconst GLOBAL_FLAGS = new Set([\"--json\", \"--yes\", \"--api-url\", \"--url\", \"--idempotency-key\", \"--profile\"]);\nconst GLOBAL_FLAGS_WITH_VALUE = new Set([\"--api-url\", \"--url\", \"--idempotency-key\", \"--profile\"]);\n\n/** Strip global flags before resolving positional args (e.g. trailing --api-url). */\nexport function commandArgv(argv: string[]): string[] {\n const result: string[] = [];\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (GLOBAL_FLAGS.has(arg)) {\n if (GLOBAL_FLAGS_WITH_VALUE.has(arg)) {\n index += 1;\n }\n continue;\n }\n result.push(arg);\n }\n return result;\n}\n\nexport function buildContext(argv: string[]): CliContext {\n const json = argv.includes(\"--json\");\n const settings = loadSettings();\n const apiUrl = resolveApiUrl(settings);\n const { token } = resolveTokenSource();\n\n return {\n json,\n apiUrl,\n client: new AiTodoClient({\n apiUrl,\n token,\n source: \"cli\",\n idempotencyKey: readFlagValue(argv, \"--idempotency-key\")\n })\n };\n}\n\ndeclare const process: {\n exitCode?: number;\n};\n\nexport function readFlagValue(argv: string[], flag: string): string | undefined {\n const index = argv.indexOf(flag);\n return index >= 0 ? argv[index + 1] : undefined;\n}\n\nexport function readRepeatedFlag(argv: string[], flag: string): string[] {\n const values: string[] = [];\n const args = commandArgv(argv);\n for (let index = 0; index < args.length; index += 1) {\n const next = args[index + 1];\n if (args[index] === flag && next && !next.startsWith(\"-\")) {\n values.push(next);\n }\n }\n return values;\n}\n\nexport function hasFlag(argv: string[], flag: string): boolean {\n return commandArgv(argv).includes(flag);\n}\n\nexport function positionalAfter(argv: string[], ...anchors: string[]): string | undefined {\n const args = commandArgv(argv);\n let start = -1;\n for (const anchor of anchors) {\n const index = args.indexOf(anchor);\n if (index > start) {\n start = index;\n }\n }\n if (start < 0) {\n return undefined;\n }\n\n const values: string[] = [];\n for (let index = start + 1; index < args.length; index += 1) {\n const arg = args[index];\n if (\n arg === \"--email\" ||\n arg === \"--phone\" ||\n arg === \"--alias\" ||\n arg === \"--handle\" ||\n arg === \"--company\" ||\n arg === \"--job-title\" ||\n arg === \"--contact\" ||\n arg === \"--name\"\n ) {\n index += 1;\n continue;\n }\n if (\n [\n \"--title\",\n \"--due\",\n \"--remind\",\n \"--notes\",\n \"--start\",\n \"--end\",\n \"--location\",\n \"--description\",\n \"--status\",\n \"--date\",\n \"--from\",\n \"--to\"\n ].includes(arg)\n ) {\n index += 1;\n continue;\n }\n if (arg.startsWith(\"--\")) {\n continue;\n }\n values.push(arg);\n }\n\n return values.length > 0 ? values.join(\" \") : undefined;\n}\n\nexport async function handleApi<T>(\n ctx: CliContext,\n response: ApiResponse<T>,\n render: (data: T) => void\n): Promise<void> {\n if (ctx.json) {\n console.log(JSON.stringify(response, null, 2));\n process.exitCode = response.ok ? 0 : 1;\n return;\n }\n\n if (!response.ok) {\n const code = response.error.code ? `[${response.error.code}] ` : \"\";\n console.error(`${code}${response.error.message}`);\n if (response.error.code === \"UNAUTHORIZED\") {\n printAuthHint(\"invalid\");\n }\n process.exitCode = 1;\n return;\n }\n\n render(response.data);\n}\n\nexport function persistApiUrl(apiUrl: string): void {\n saveSettings({ url: apiUrl });\n}\n", "import { settingsPath } from \"./settings\";\n\nexport function printHelp(): void {\n console.log(`ai-todo \u2014 structured CLI for reminders, calendar, and contacts\n\nInstall:\n npm install -g @xiaolinstar/ai-todo-cli\n\nConfiguration (~/.ai-todo/settings.json):\n {\n \"url\": \"https://wodi.games\",\n \"token\": \"aitodo_xxx\"\n }\n\n Create a Personal Access Token in the WeChat miniapp (Mine \u2192 CLI / Agent tokens).\n Example file: settings.example.json (bundled with this package).\n\n Priority: AI_TODO_TOKEN / AI_TODO_API_URL env > settings.json > http://127.0.0.1:3100\n\nAuth check:\n ai-todo whoami\n ai-todo version\n\nProfile:\n ai-todo profile update --name <text> [--avatar-url <url>]\n\nGlobal flags (commands only):\n --json Output API JSON (recommended for agents)\n --idempotency-key <uuid> Recommended for agent write retries\n\nToday:\n ai-todo today\n\nReminders (aliases: add, list, done, reschedule):\n ai-todo reminder create --title <text> [--due <iso>] [--remind <iso>] [--notes <text>] [--contact <id_or_handle> ...]\n ai-todo reminder list [--status pending|completed|cancelled] [--from YYYY-MM-DD] [--to YYYY-MM-DD]\n ai-todo reminder show <reminder_id>\n ai-todo reminder done <reminder_id>\n ai-todo reminder update <reminder_id> [--title <text>] [--notes <text>] [--due <iso>] [--remind <iso>] [--contact <id_or_handle> ...]\n ai-todo reminder reschedule <reminder_id> --due <iso> [--remind <iso>]\n ai-todo reminder delete <reminder_id>\n ai-todo add <title> # shorthand create (title only)\n\nCalendar:\n ai-todo calendar today\n ai-todo calendar list [--date YYYY-MM-DD]\n ai-todo calendar add --title <text> --start <iso> [--end <iso>] [--location <text>]\n ai-todo calendar show <event_id>\n ai-todo calendar update <event_id> [--title <text>] [--start <iso>] [--end <iso>]\n ai-todo calendar delete <event_id>\n\nContacts:\n ai-todo contact add <name> [--handle <handle>] [--email <v>] [--phone <v>] [--company <text>] [--job-title <text>] [--notes <text>] [--alias <v>]\n ai-todo contact list\n ai-todo contact search <query>\n ai-todo contact show <contact_id_or_handle>\n ai-todo contact update <contact_id_or_handle> [--handle <handle>] [--name <text>] [--email <v>] [--phone <v>] [--company <text>] [--job-title <text>] [--notes <text>]\n ai-todo contact delete <contact_id_or_handle>\n\nSettings file: ${settingsPath()}\n\nAgents: see docs/agent-usage.md and skills/ai-todo/SKILL.md`);\n}\n", "import type { CliContext } from \"../context\";\nimport { handleApi, positionalAfter, readFlagValue, readRepeatedFlag } from \"../context\";\n\nexport async function runCalendarToday(ctx: CliContext): Promise<void> {\n await handleApi(ctx, await ctx.client.listCalendarToday(), (data) => {\n if (ctx.json) {\n return;\n }\n if (data.items.length === 0) {\n console.log(\"\u4ECA\u65E5\u6682\u65E0\u65E5\u7A0B\");\n return;\n }\n for (const event of data.items) {\n const end = event.endAt ? ` - ${event.endAt}` : \"\";\n const place = event.location ? ` @ ${event.location}` : \"\";\n console.log(`- ${event.title} (${event.startAt}${end})${place} (${event.id})`);\n }\n });\n}\n\nexport async function runCalendarList(ctx: CliContext, argv: string[]): Promise<void> {\n const date = readFlagValue(argv, \"--date\");\n await handleApi(\n ctx,\n await ctx.client.listCalendarEvents(\n date ? { from: date, to: date } : {}\n ),\n (data) => {\n if (ctx.json) {\n return;\n }\n if (data.items.length === 0) {\n console.log(\"\u6682\u65E0\u65E5\u7A0B\");\n return;\n }\n for (const event of data.items) {\n const end = event.endAt ? ` - ${event.endAt}` : \"\";\n console.log(`- ${event.title} (${event.startAt}${end}) (${event.id})`);\n }\n }\n );\n}\n\nexport async function runCalendarAdd(ctx: CliContext, argv: string[]): Promise<void> {\n const title = readFlagValue(argv, \"--title\");\n const start = readFlagValue(argv, \"--start\");\n const end = readFlagValue(argv, \"--end\");\n const location = readFlagValue(argv, \"--location\");\n\n if (!title || !start) {\n console.error(\n \"Usage: ai-todo calendar add --title <text> --start <iso> [--end <iso>] [--contact <contact_id> ...]\"\n );\n process.exitCode = 1;\n return;\n }\n\n await handleApi(\n ctx,\n await ctx.client.createCalendarEvent({\n title,\n startAt: start,\n endAt: end,\n location,\n contactIds: readRepeatedFlag(argv, \"--contact\")\n }),\n (data) => {\n if (!ctx.json) {\n const event = data.calendarEvent;\n console.log(`\u5DF2\u521B\u5EFA\u65E5\u7A0B\uFF1A${event.title}`);\n console.log(`ID\uFF1A${event.id}`);\n console.log(`\u5F00\u59CB\uFF1A${event.startAt}`);\n if (event.endAt) {\n console.log(`\u7ED3\u675F\uFF1A${event.endAt}`);\n }\n }\n }\n );\n}\n\nexport async function runCalendarShow(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"show\");\n if (!id) {\n console.error(\"Usage: ai-todo calendar show <event_id>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.getCalendarEvent(id), (data) => {\n if (ctx.json) {\n return;\n }\n const e = data.calendarEvent;\n console.log(`${e.title} (${e.id})`);\n console.log(`${e.startAt}${e.endAt ? ` \u2192 ${e.endAt}` : \"\"}`);\n if (e.location) {\n console.log(`\u5730\u70B9\uFF1A${e.location}`);\n }\n });\n}\n\nexport async function runCalendarDelete(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"delete\");\n if (!id) {\n console.error(\"Usage: ai-todo calendar delete <event_id>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.deleteCalendarEvent(id), (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u5220\u9664\u65E5\u7A0B\uFF1A${data.id}`);\n }\n });\n}\n\nexport async function runCalendarUpdate(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"update\");\n const title = readFlagValue(argv, \"--title\");\n const start = readFlagValue(argv, \"--start\");\n const end = readFlagValue(argv, \"--end\");\n const location = readFlagValue(argv, \"--location\");\n const description = readFlagValue(argv, \"--description\");\n const contactIds = readRepeatedFlag(argv, \"--contact\");\n const hasContacts = argv.includes(\"--contact\");\n\n if (!id) {\n console.error(\n \"Usage: ai-todo calendar update <event_id> [--title <text>] [--start <iso>] [--end <iso>] [--location <text>] [--contact <contact_id> ...]\"\n );\n process.exitCode = 1;\n return;\n }\n\n if (!title && !start && end === undefined && location === undefined && !description && !hasContacts) {\n console.error(\"Provide at least one field to update\");\n process.exitCode = 1;\n return;\n }\n\n await handleApi(\n ctx,\n await ctx.client.updateCalendarEvent(id, {\n title,\n startAt: start,\n endAt: end,\n location,\n description,\n contactIds: hasContacts ? contactIds : undefined\n }),\n (data) => {\n if (!ctx.json) {\n const event = data.calendarEvent;\n console.log(`\u5DF2\u66F4\u65B0\u65E5\u7A0B\uFF1A${event.title} (${event.id})`);\n }\n }\n );\n}\n\ndeclare const process: { exitCode?: number };\n", "import type { ContactSummary, CreateContactInput } from \"@ai-todo/shared\";\n\nimport type { CliContext } from \"../context\";\nimport { handleApi, positionalAfter, readFlagValue } from \"../context\";\n\nexport async function runContactAdd(ctx: CliContext, argv: string[]): Promise<void> {\n const displayName = positionalAfter(argv, \"contact\", \"add\");\n if (!displayName) {\n console.error(\n \"Usage: ai-todo contact add <name> [--handle <handle>] [--email <v>] [--phone <v>] [--company <text>] [--job-title <text>] [--notes <text>]\"\n );\n process.exitCode = 1;\n return;\n }\n\n const methods: CreateContactInput[\"methods\"] = [];\n const handle = readFlagValue(argv, \"--handle\");\n const email = readFlagValue(argv, \"--email\");\n const phone = readFlagValue(argv, \"--phone\");\n const alias = readFlagValue(argv, \"--alias\");\n const company = readFlagValue(argv, \"--company\");\n const jobTitle = readFlagValue(argv, \"--job-title\");\n const notes = readFlagValue(argv, \"--notes\");\n\n if (email) {\n methods.push({ type: \"email\", value: email, label: \"work\", isPrimary: true });\n }\n if (phone) {\n methods.push({ type: \"phone\", value: phone, label: \"mobile\", isPrimary: true });\n }\n\n await handleApi(\n ctx,\n await ctx.client.createContact({\n displayName,\n handle,\n company,\n title: jobTitle,\n notes,\n methods,\n aliases: alias ? [alias] : []\n }),\n (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u521B\u5EFA\u8054\u7CFB\u4EBA\uFF1A${data.contact.displayName}`);\n console.log(`\u6807\u8BC6\uFF1A${data.contact.handle}`);\n console.log(`ID\uFF1A${data.contact.id}`);\n }\n }\n );\n}\n\nexport async function runContactSearch(ctx: CliContext, argv: string[]): Promise<void> {\n const query = positionalAfter(argv, \"contact\", \"search\");\n if (!query) {\n console.error(\"Usage: ai-todo contact search <query>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.searchContacts(query), (data) => {\n if (ctx.json) {\n return;\n }\n renderContactList(data.items);\n });\n}\n\nexport async function runContactList(ctx: CliContext): Promise<void> {\n await handleApi(ctx, await ctx.client.searchContacts(), (data) => {\n if (ctx.json) {\n return;\n }\n renderContactList(data.items);\n });\n}\n\nexport async function runContactShow(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"contact\", \"show\");\n if (!id) {\n console.error(\"Usage: ai-todo contact show <contact_id_or_handle>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.getContact(id), (data) => {\n if (ctx.json) {\n return;\n }\n const c = data.contact;\n console.log(`${c.displayName} (@${c.handle}, ${c.id})`);\n console.log(`\u6807\u8BC6\u6765\u6E90\uFF1A${c.handleSource === \"generated\" ? \"\u81EA\u52A8\u751F\u6210\" : \"\u624B\u52A8\u8BBE\u7F6E\"}`);\n if (c.linkedUserId) {\n console.log(`\u5E73\u53F0\u7528\u6237\uFF1A${c.linkedUserId}`);\n }\n if (c.primaryEmail) {\n console.log(`\u90AE\u7BB1\uFF1A${c.primaryEmail}`);\n }\n if (c.primaryPhone) {\n console.log(`\u7535\u8BDD\uFF1A${c.primaryPhone}`);\n }\n if (c.company) {\n console.log(`\u516C\u53F8\uFF1A${c.company}`);\n }\n if (c.title) {\n console.log(`\u804C\u4F4D\uFF1A${c.title}`);\n }\n if (c.aliases.length > 0) {\n console.log(`\u522B\u540D\uFF1A${c.aliases.join(\", \")}`);\n }\n if (c.methods.length > 0) {\n console.log(\"\u8054\u7CFB\u65B9\u5F0F\uFF1A\");\n for (const method of c.methods) {\n const primary = method.isPrimary ? \"\uFF0C\u4E3B\u8981\" : \"\";\n const label = method.label ? `\uFF0C${method.label}` : \"\";\n console.log(`- ${method.type}${label}${primary}\uFF1A${method.value}`);\n }\n }\n if (c.notes) {\n console.log(`\u5907\u6CE8\uFF1A${c.notes}`);\n }\n });\n}\n\nexport async function runContactUpdate(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"contact\", \"update\");\n if (!id) {\n console.error(\n \"Usage: ai-todo contact update <contact_id_or_handle> [--handle <handle>] [--name <text>] [--email <v>] [--phone <v>] [--company <text>] [--job-title <text>] [--alias <v>] [--notes <text>]\"\n );\n process.exitCode = 1;\n return;\n }\n\n const displayName = readFlagValue(argv, \"--name\");\n const handle = readFlagValue(argv, \"--handle\");\n const email = readFlagValue(argv, \"--email\");\n const phone = readFlagValue(argv, \"--phone\");\n const alias = readFlagValue(argv, \"--alias\");\n const company = readFlagValue(argv, \"--company\");\n const jobTitle = readFlagValue(argv, \"--job-title\");\n const notes = readFlagValue(argv, \"--notes\");\n const hasCompany = argv.includes(\"--company\");\n const hasJobTitle = argv.includes(\"--job-title\");\n const hasNotes = argv.includes(\"--notes\");\n\n if (!displayName && !handle && !email && !phone && !alias && !hasCompany && !hasJobTitle && !hasNotes) {\n console.error(\"Provide at least one field to update\");\n process.exitCode = 1;\n return;\n }\n\n const methods: CreateContactInput[\"methods\"] = [];\n if (email) {\n methods.push({ type: \"email\", value: email, label: \"work\", isPrimary: true });\n }\n if (phone) {\n methods.push({ type: \"phone\", value: phone, label: \"mobile\", isPrimary: true });\n }\n\n await handleApi(\n ctx,\n await ctx.client.updateContact(id, {\n displayName,\n handle,\n company: hasCompany ? company : undefined,\n title: hasJobTitle ? jobTitle : undefined,\n notes: hasNotes ? notes : undefined,\n methods: methods.length > 0 ? methods : undefined,\n aliases: alias ? [alias] : undefined\n }),\n (data) => {\n if (!ctx.json) {\n console.log(\n `\u5DF2\u66F4\u65B0\u8054\u7CFB\u4EBA\uFF1A${data.contact.displayName} (@${data.contact.handle}, ${data.contact.id})`\n );\n }\n }\n );\n}\n\nexport async function runContactDelete(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"contact\", \"delete\");\n if (!id) {\n console.error(\"Usage: ai-todo contact delete <contact_id_or_handle>\");\n process.exitCode = 1;\n return;\n }\n\n await handleApi(ctx, await ctx.client.deleteContact(id), (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u5220\u9664\u8054\u7CFB\u4EBA\uFF1A${data.id}`);\n }\n });\n}\n\nfunction renderContactList(items: ContactSummary[]): void {\n if (items.length === 0) {\n console.log(\"\u672A\u627E\u5230\u8054\u7CFB\u4EBA\");\n return;\n }\n\n for (const contact of items) {\n const email = contact.primaryEmail ? ` <${contact.primaryEmail}>` : \"\";\n const phone = contact.primaryPhone ? ` ${contact.primaryPhone}` : \"\";\n const company = contact.company ? ` \u00B7 ${contact.company}` : \"\";\n console.log(`- ${contact.displayName}${company}${email}${phone} (@${contact.handle}, ${contact.id})`);\n }\n}\n\ndeclare const process: { exitCode?: number };\n", "import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst PACKAGE_JSON = join(__dirname, \"..\", \"package.json\");\n\nexport function getCliVersion(): string {\n const pkg = JSON.parse(readFileSync(PACKAGE_JSON, \"utf8\")) as { version: string };\n return pkg.version;\n}\n", "import type { CliContext } from \"../context\";\nimport { handleApi, persistApiUrl, readFlagValue } from \"../context\";\nimport { printAuthHint, resolveTokenSource } from \"../auth\";\nimport { clearToken, resolveApiUrl, saveSettings, settingsPath } from \"../settings\";\nimport { getCliVersion } from \"../version\";\n\nfunction readLoginUrl(argv: string[]): string | undefined {\n return readFlagValue(argv, \"--url\") ?? readFlagValue(argv, \"--api-url\");\n}\n\nexport async function runVersion(ctx: CliContext): Promise<void> {\n const cliVersion = getCliVersion();\n if (ctx.json) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n component: \"cli\",\n version: cliVersion,\n apiUrl: ctx.apiUrl\n },\n null,\n 2\n )\n );\n return;\n }\n console.log(`ai-todo CLI ${cliVersion}`);\n console.log(`API: ${ctx.apiUrl}`);\n}\n\nexport async function runLogin(ctx: CliContext, argv: string[]): Promise<void> {\n const apiUrl = readLoginUrl(argv) ?? ctx.apiUrl;\n persistApiUrl(apiUrl);\n\n const token = readFlagValue(argv, \"--token\");\n const issuePat = argv.includes(\"--issue-pat\");\n const name = readFlagValue(argv, \"--name\") ?? \"CLI Local\";\n\n if (issuePat) {\n await issuePersonalAccessToken(ctx, apiUrl, name);\n return;\n }\n\n if (token) {\n saveSettings({ token, url: apiUrl });\n }\n\n const resolved = resolveTokenSource();\n\n if (ctx.json) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n apiUrl,\n settingsPath: settingsPath(),\n tokenSource: resolved.source,\n hasToken: resolved.source !== \"none\"\n },\n null,\n 2\n )\n );\n return;\n }\n\n console.log(`\u5DF2\u4FDD\u5B58 API \u5730\u5740\uFF1A${apiUrl}`);\n if (token) {\n console.log(`\u5DF2\u5199\u5165 ${settingsPath()}`);\n console.log(\"\u540E\u7EED\u76F4\u63A5\u8FD0\u884C ai-todo whoami / ai-todo today \u7B49\u547D\u4EE4\u5373\u53EF\uFF0C\u65E0\u9700\u518D\u4F20 --url\u3002\");\n console.log(\"Agent \u73AF\u5883\u4ECD\u53EF\u7528 export AI_TODO_TOKEN=\u2026 \u8986\u76D6\u914D\u7F6E\u6587\u4EF6\u3002\");\n } else if (resolved.source === \"env\") {\n console.log(\"\u68C0\u6D4B\u5230 AI_TODO_TOKEN \u73AF\u5883\u53D8\u91CF\uFF08\u5DF2\u751F\u6548\uFF09\");\n } else {\n printAuthHint(\"missing\");\n }\n console.log(`\u914D\u7F6E\u6587\u4EF6\uFF1A${settingsPath()}`);\n}\n\nasync function issuePersonalAccessToken(\n ctx: CliContext,\n apiUrl: string,\n name: string\n): Promise<void> {\n if (!isLocalDevApiUrl(apiUrl)) {\n if (ctx.json) {\n console.log(\n JSON.stringify(\n {\n ok: false,\n error: {\n code: \"PAT_CREATE_NOT_SUPPORTED\",\n message:\n \"Create a Personal Access Token in the WeChat miniapp Mine tab, then write ~/.ai-todo/settings.json\"\n }\n },\n null,\n 2\n )\n );\n } else {\n console.error(\"\u751F\u4EA7/\u8FDC\u7A0B API \u4E0D\u652F\u6301 CLI \u76F4\u63A5\u7B7E\u53D1 PAT\u3002\");\n console.error(\"\u8BF7\u5728\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\u300C\u6211\u7684 \u2192 CLI / Agent \u8BBF\u95EE\u4EE4\u724C\u300D\u4E2D\u521B\u5EFA\uFF0C\u7136\u540E\u5199\u5165 ~/.ai-todo/settings.json\u3002\");\n }\n process.exitCode = 1;\n return;\n }\n\n const response = await ctx.client.issueDevPat({ name });\n\n if (!response.ok) {\n if (ctx.json) {\n console.log(JSON.stringify(response, null, 2));\n } else {\n console.error(`[${response.error.code}] ${response.error.message}`);\n console.error(\"\");\n console.error(\"\u7B7E\u53D1 PAT \u5931\u8D25\u3002\u8BF7\u786E\u8BA4 API \u5DF2\u542F\u52A8\u4E14 AI_TODO_ALLOW_DEV_AUTH=true\u3002\");\n }\n process.exitCode = 1;\n return;\n }\n\n const { token, id, scopes } = response.data;\n saveSettings({ token, url: apiUrl });\n\n if (ctx.json) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n apiUrl,\n tokenId: id,\n token,\n scopes,\n savedTo: settingsPath(),\n envHint: `export AI_TODO_TOKEN=${token}`\n },\n null,\n 2\n )\n );\n return;\n }\n\n console.log(\"\u5DF2\u7B7E\u53D1 Personal Access Token\uFF08\u4EC5\u663E\u793A\u4E00\u6B21\uFF0C\u8BF7\u59A5\u5584\u4FDD\u7BA1\uFF09\uFF1A\");\n console.log(\"\");\n console.log(token);\n console.log(\"\");\n console.log(\"\u63A8\u8350\u5199\u5165 Agent \u73AF\u5883\u53D8\u91CF\uFF1A\");\n console.log(` export AI_TODO_TOKEN=${token}`);\n console.log(\"\");\n console.log(`\u5DF2\u540C\u65F6\u4FDD\u5B58\u5230 ${settingsPath()}\uFF08\u53EF\u88AB\u73AF\u5883\u53D8\u91CF\u8986\u76D6\uFF09`);\n}\n\nexport async function runLogout(ctx: CliContext): Promise<void> {\n clearToken();\n const resolved = resolveTokenSource();\n\n if (ctx.json) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n clearedSettings: true,\n tokenSource: resolved.source,\n note:\n resolved.source === \"env\"\n ? \"AI_TODO_TOKEN \u73AF\u5883\u53D8\u91CF\u4ECD\u751F\u6548\uFF1Bunset AI_TODO_TOKEN \u53EF\u5B8C\u5168\u9000\u51FA\"\n : \"settings.json \u4E2D\u7684 token \u5DF2\u6E05\u9664\"\n },\n null,\n 2\n )\n );\n return;\n }\n\n console.log(`\u5DF2\u6E05\u9664 ${settingsPath()} \u4E2D\u7684 token`);\n if (resolved.source === \"env\") {\n console.log(\"\u6CE8\u610F\uFF1AAI_TODO_TOKEN \u73AF\u5883\u53D8\u91CF\u4ECD\u7136\u751F\u6548\");\n console.log(\"\u8FD0\u884C unset AI_TODO_TOKEN \u53EF\u5B8C\u5168\u9000\u51FA\u6388\u6743\");\n }\n}\n\nexport async function runWhoami(ctx: CliContext): Promise<void> {\n const resolved = resolveTokenSource();\n if (resolved.source === \"none\") {\n if (ctx.json) {\n console.log(\n JSON.stringify(\n {\n ok: false,\n error: {\n code: \"UNAUTHORIZED\",\n message: \"No API token configured.\"\n }\n },\n null,\n 2\n )\n );\n } else {\n printAuthHint(\"missing\");\n }\n process.exitCode = 1;\n return;\n }\n\n await handleApi(ctx, await ctx.client.me(), (data) => {\n if (!ctx.json) {\n const sourceLabel =\n resolved.source === \"env\"\n ? \"\u73AF\u5883\u53D8\u91CF AI_TODO_TOKEN\"\n : `\u914D\u7F6E\u6587\u4EF6 ${settingsPath()}`;\n console.log(`${data.user.displayName} (${data.user.id})`);\n console.log(`API\uFF1A${resolveApiUrl()}`);\n console.log(`\u65F6\u533A\uFF1A${data.user.timezone}`);\n console.log(`\u6388\u6743\u6765\u6E90\uFF1A${sourceLabel}`);\n }\n });\n}\n\nexport async function runProfileUpdate(ctx: CliContext, argv: string[]): Promise<void> {\n const displayName = readFlagValue(argv, \"--name\") ?? readFlagValue(argv, \"--display-name\");\n const avatarUrl = readFlagValue(argv, \"--avatar-url\");\n\n if (!displayName && avatarUrl === undefined) {\n console.error(\"Usage: ai-todo profile update --name <text> [--avatar-url <url>]\");\n process.exitCode = 1;\n return;\n }\n\n await handleApi(\n ctx,\n await ctx.client.updateProfile({\n displayName,\n avatarUrl\n }),\n (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u66F4\u65B0\u4E2A\u4EBA\u8D44\u6599\uFF1A${data.user.displayName} (${data.user.id})`);\n if (data.user.avatarUrl) {\n console.log(`\u5934\u50CF\uFF1A${data.user.avatarUrl}`);\n }\n }\n }\n );\n}\n\nexport async function runToday(ctx: CliContext): Promise<void> {\n await handleApi(ctx, await ctx.client.today(), (data) => {\n if (ctx.json) {\n return;\n }\n console.log(`${data.date} (${data.timezone})`);\n console.log(\"\u63D0\u9192\uFF1A\");\n if (data.reminders.length === 0) {\n console.log(\" \u6682\u65E0\");\n } else {\n for (const reminder of data.reminders) {\n console.log(` - [${reminder.status}] ${reminder.title} (${reminder.id})`);\n }\n }\n console.log(\"\u65E5\u7A0B\uFF1A\");\n if (data.calendarEvents.length === 0) {\n console.log(\" \u6682\u65E0\");\n } else {\n for (const event of data.calendarEvents) {\n const end = event.endAt ? ` - ${event.endAt}` : \"\";\n const place = event.location ? ` @ ${event.location}` : \"\";\n console.log(` - ${event.title} (${event.startAt}${end})${place} (${event.id})`);\n }\n }\n });\n}\n\ndeclare const process: { exitCode?: number };\n\nfunction isLocalDevApiUrl(apiUrl: string): boolean {\n try {\n const hostname = new URL(apiUrl).hostname;\n return hostname === \"127.0.0.1\" || hostname === \"localhost\";\n } catch {\n return false;\n }\n}\n", "import type { ReminderStatus } from \"@ai-todo/shared\";\n\nimport type { CliContext } from \"../context\";\nimport {\n handleApi,\n hasFlag,\n positionalAfter,\n readFlagValue,\n readRepeatedFlag\n} from \"../context\";\n\nexport async function runReminderCreate(ctx: CliContext, argv: string[]): Promise<void> {\n const title = readFlagValue(argv, \"--title\") ?? positionalAfter(argv, \"add\", \"create\");\n if (!title) {\n console.error(\n \"Usage: ai-todo reminder create --title <text> [--due <iso>] [--contact <contact_id> ...]\"\n );\n process.exitCode = 1;\n return;\n }\n\n await handleApi(\n ctx,\n await ctx.client.createReminder({\n title,\n dueAt: readFlagValue(argv, \"--due\"),\n remindAt: readFlagValue(argv, \"--remind\"),\n notes: readFlagValue(argv, \"--notes\"),\n contactIds: readRepeatedFlag(argv, \"--contact\")\n }),\n (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u521B\u5EFA\u63D0\u9192\uFF1A${data.reminder.title}`);\n console.log(`ID\uFF1A${data.reminder.id}`);\n if (data.reminder.dueAt) {\n console.log(`\u622A\u6B62\uFF1A${data.reminder.dueAt}`);\n }\n }\n }\n );\n}\n\nexport async function runReminderList(ctx: CliContext, argv: string[]): Promise<void> {\n const status = readFlagValue(argv, \"--status\") as ReminderStatus | undefined;\n await handleApi(\n ctx,\n await ctx.client.listReminders({\n status,\n from: readFlagValue(argv, \"--from\"),\n to: readFlagValue(argv, \"--to\")\n }),\n (data) => {\n if (ctx.json) {\n return;\n }\n if (data.items.length === 0) {\n console.log(\"\u6682\u65E0\u63D0\u9192\");\n return;\n }\n for (const reminder of data.items) {\n const due = reminder.dueAt ? ` @ ${reminder.dueAt}` : \"\";\n console.log(`- [${reminder.status}] ${reminder.title}${due} (${reminder.id})`);\n }\n }\n );\n}\n\nexport async function runReminderShow(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"show\");\n if (!id) {\n console.error(\"Usage: ai-todo reminder show <reminder_id>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.getReminder(id), (data) => {\n if (ctx.json) {\n return;\n }\n const r = data.reminder;\n console.log(`${r.title} (${r.id})`);\n console.log(`\u72B6\u6001\uFF1A${r.status}`);\n if (r.dueAt) {\n console.log(`\u622A\u6B62\uFF1A${r.dueAt}`);\n }\n if (r.remindAt) {\n console.log(`\u901A\u77E5\uFF1A${r.remindAt}`);\n }\n if (r.notes) {\n console.log(`\u5907\u6CE8\uFF1A${r.notes}`);\n }\n if (r.contacts && r.contacts.length > 0) {\n console.log(\n `\u8054\u7CFB\u4EBA\uFF1A${r.contacts.map((c) => `${c.displayName} (@${c.handle})`).join(\", \")}`\n );\n }\n });\n}\n\nexport async function runReminderDone(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"done\", \"complete\");\n if (!id) {\n console.error(\"Usage: ai-todo reminder done <reminder_id>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.completeReminder(id), (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u5B8C\u6210\u63D0\u9192\uFF1A${data.reminder.title}`);\n console.log(`ID\uFF1A${data.reminder.id}`);\n }\n });\n}\n\nexport async function runReminderUpdate(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"update\");\n if (!id) {\n console.error(\n \"Usage: ai-todo reminder update <reminder_id> [--title <text>] [--notes <text>] [--due <iso>] [--remind <iso>] [--contact <contact_id_or_handle> ...]\"\n );\n process.exitCode = 1;\n return;\n }\n const title = readFlagValue(argv, \"--title\");\n const notes = readFlagValue(argv, \"--notes\");\n const due = readFlagValue(argv, \"--due\");\n const remind = readFlagValue(argv, \"--remind\");\n const contactIds = readRepeatedFlag(argv, \"--contact\");\n const hasContacts = hasFlag(argv, \"--contact\");\n const hasNotes = hasFlag(argv, \"--notes\");\n\n if (\n !title &&\n notes === undefined &&\n due === undefined &&\n remind === undefined &&\n !hasContacts\n ) {\n console.error(\"Provide at least one field to update\");\n process.exitCode = 1;\n return;\n }\n await handleApi(\n ctx,\n await ctx.client.updateReminder(id, {\n title,\n notes: hasNotes ? notes : undefined,\n dueAt: due,\n remindAt: remind,\n contactIds: hasContacts ? contactIds : undefined\n }),\n (data) => {\n if (!ctx.json) {\n const r = data.reminder;\n console.log(`\u5DF2\u66F4\u65B0\u63D0\u9192\uFF1A${r.title} (${r.id})`);\n if (r.dueAt) {\n console.log(`\u622A\u6B62\uFF1A${r.dueAt}`);\n }\n if (r.remindAt) {\n console.log(`\u901A\u77E5\uFF1A${r.remindAt}`);\n }\n }\n }\n );\n}\n\nexport async function runReminderReschedule(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"reschedule\");\n const due = readFlagValue(argv, \"--due\");\n const remind = readFlagValue(argv, \"--remind\");\n if (!id || (!due && !remind)) {\n console.error(\"Usage: ai-todo reminder reschedule <reminder_id> --due <iso> [--remind <iso>]\");\n process.exitCode = 1;\n return;\n }\n await handleApi(\n ctx,\n await ctx.client.rescheduleReminder(id, { dueAt: due, remindAt: remind }),\n (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u6539\u671F\uFF1A${data.reminder.title}`);\n if (data.reminder.dueAt) {\n console.log(`\u65B0\u622A\u6B62\uFF1A${data.reminder.dueAt}`);\n }\n }\n }\n );\n}\n\nexport async function runReminderDelete(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"delete\");\n if (!id) {\n console.error(\"Usage: ai-todo reminder delete <reminder_id>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.deleteReminder(id), (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u5220\u9664\u63D0\u9192\uFF1A${data.id}`);\n }\n });\n}\n\ndeclare const process: { exitCode?: number };\n", "import type { ApiTokenSummary, CreateApiTokenInput } from \"@ai-todo/shared\";\n\nimport type { CliContext } from \"../context\";\nimport { handleApi, readFlagValue } from \"../context\";\n\nfunction readTokenName(argv: string[]): string | undefined {\n return readFlagValue(argv, \"--name\");\n}\n\nfunction readMaxIdleDays(argv: string[]): number | undefined {\n const raw = readFlagValue(argv, \"--max-idle-days\");\n if (!raw) {\n return undefined;\n }\n const value = Number(raw);\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(\"--max-idle-days must be a positive integer.\");\n }\n return value;\n}\n\nfunction readScopes(argv: string[]): string[] | undefined {\n const raw = readFlagValue(argv, \"--scopes\");\n if (!raw) {\n return undefined;\n }\n return raw\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction statusLabel(status: ApiTokenSummary[\"status\"]): string {\n switch (status) {\n case \"active\":\n return \"\u6709\u6548\";\n case \"expired\":\n return \"\u5DF2\u8FC7\u671F\";\n case \"idle_revoked\":\n return \"\u4E45\u672A\u4F7F\u7528\u5931\u6548\";\n case \"revoked\":\n return \"\u5DF2\u540A\u9500\";\n default:\n return status;\n }\n}\n\nfunction formatDate(value?: string): string {\n return value ?? \"-\";\n}\n\nexport async function runTokenList(ctx: CliContext): Promise<void> {\n await handleApi(ctx, await ctx.client.listApiTokens(), (data) => {\n if (ctx.json) {\n return;\n }\n if (data.items.length === 0) {\n console.log(\"\u6682\u65E0\u8BBF\u95EE\u4EE4\u724C\u3002\");\n return;\n }\n for (const item of data.items) {\n console.log(`${item.id} ${item.name} ${statusLabel(item.status)}`);\n console.log(` \u63D0\u793A\uFF1A${item.tokenHint ?? \"aitodo_****\"}`);\n console.log(` \u521B\u5EFA\uFF1A${formatDate(item.createdAt)} \u6700\u540E\u4F7F\u7528\uFF1A${formatDate(item.lastUsedAt)}`);\n console.log(\n ` \u5230\u671F\uFF1A${formatDate(item.expiresAt)} \u7A7A\u95F2\u5931\u6548\uFF1A${\n item.maxIdleDays ? `${item.maxIdleDays} \u5929` : \"-\"\n }`\n );\n }\n });\n}\n\nexport async function runTokenCreate(ctx: CliContext, argv: string[]): Promise<void> {\n const name = readTokenName(argv);\n if (!name) {\n console.error(\"Usage: ai-todo token create --name <text> [--expires-at <iso>] [--max-idle-days <days>]\");\n process.exitCode = 1;\n return;\n }\n\n let maxIdleDays: number | undefined;\n try {\n maxIdleDays = readMaxIdleDays(argv);\n } catch (error) {\n console.error(error instanceof Error ? error.message : \"Invalid --max-idle-days.\");\n process.exitCode = 1;\n return;\n }\n\n const input: CreateApiTokenInput = {\n name,\n scopes: readScopes(argv),\n expiresAt: readFlagValue(argv, \"--expires-at\"),\n maxIdleDays\n };\n\n await handleApi(ctx, await ctx.client.createApiToken(input), (data) => {\n if (ctx.json) {\n return;\n }\n console.log(\"\u5DF2\u521B\u5EFA\u8BBF\u95EE\u4EE4\u724C\uFF08\u4EC5\u663E\u793A\u4E00\u6B21\uFF0C\u8BF7\u59A5\u5584\u4FDD\u7BA1\uFF09\uFF1A\");\n console.log(\"\");\n console.log(data.token);\n console.log(\"\");\n console.log(`ID\uFF1A${data.id}`);\n console.log(`\u540D\u79F0\uFF1A${data.name}`);\n console.log(`\u5230\u671F\uFF1A${data.expiresAt ?? \"-\"}`);\n console.log(`\u7A7A\u95F2\u5931\u6548\uFF1A${data.maxIdleDays ? `${data.maxIdleDays} \u5929` : \"-\"}`);\n });\n}\n\nexport async function runTokenRevoke(ctx: CliContext, argv: string[]): Promise<void> {\n const tokenId = argv[2];\n if (!tokenId) {\n console.error(\"Usage: ai-todo token revoke <token_id>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.revokeApiToken(tokenId), (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u540A\u9500\u8BBF\u95EE\u4EE4\u724C\uFF1A${data.id}`);\n }\n });\n}\n\nexport async function runTokenRevokeAll(ctx: CliContext): Promise<void> {\n await handleApi(ctx, await ctx.client.revokeAllApiTokens(), (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u540A\u9500 ${data.revokedCount} \u4E2A\u8BBF\u95EE\u4EE4\u724C\u3002`);\n }\n });\n}\n\ndeclare const process: {\n exitCode?: number;\n};\n", "#!/usr/bin/env node\n\nimport { buildContext } from \"./context\";\nimport { printHelp } from \"./help\";\nimport * as calendar from \"./commands/calendar\";\nimport * as contact from \"./commands/contact\";\nimport * as core from \"./commands/core\";\nimport * as reminder from \"./commands/reminder\";\nimport * as token from \"./commands/token\";\n\nconst argv = process.argv.slice(2);\nconst command = argv[0] ?? \"help\";\nconst sub = argv[1];\nconst ctx = buildContext(argv);\n\nasync function main(): Promise<void> {\n switch (command) {\n case \"help\":\n case \"--help\":\n case \"-h\":\n printHelp();\n break;\n case \"login\":\n await core.runLogin(ctx, argv);\n break;\n case \"version\":\n await core.runVersion(ctx);\n break;\n case \"whoami\":\n await core.runWhoami(ctx);\n break;\n case \"profile\": {\n const action = sub ?? \"help\";\n if (action === \"update\") {\n await core.runProfileUpdate(ctx, argv);\n } else {\n console.error(\"Usage: ai-todo profile update --name <text> [--avatar-url <url>]\");\n process.exitCode = 1;\n }\n break;\n }\n case \"logout\":\n await core.runLogout(ctx);\n break;\n case \"token\": {\n const action = sub ?? \"help\";\n if (action === \"list\") {\n await token.runTokenList(ctx);\n } else if (action === \"create\") {\n await token.runTokenCreate(ctx, argv);\n } else if (action === \"revoke\") {\n await token.runTokenRevoke(ctx, argv);\n } else if (action === \"revoke-all\") {\n await token.runTokenRevokeAll(ctx);\n } else {\n console.error(\"Usage: ai-todo token <list|create|revoke|revoke-all>\");\n process.exitCode = 1;\n }\n break;\n }\n case \"today\":\n await core.runToday(ctx);\n break;\n case \"add\":\n await reminder.runReminderCreate(ctx, argv);\n break;\n case \"list\":\n await reminder.runReminderList(ctx, argv);\n break;\n case \"done\":\n await reminder.runReminderDone(ctx, argv);\n break;\n case \"reschedule\":\n await reminder.runReminderReschedule(ctx, argv);\n break;\n case \"reminder\": {\n const action = sub ?? \"help\";\n if (action === \"create\") {\n await reminder.runReminderCreate(ctx, argv);\n } else if (action === \"list\") {\n await reminder.runReminderList(ctx, argv);\n } else if (action === \"show\") {\n await reminder.runReminderShow(ctx, argv);\n } else if (action === \"done\" || action === \"complete\") {\n await reminder.runReminderDone(ctx, argv);\n } else if (action === \"update\") {\n await reminder.runReminderUpdate(ctx, argv);\n } else if (action === \"reschedule\") {\n await reminder.runReminderReschedule(ctx, argv);\n } else if (action === \"delete\") {\n await reminder.runReminderDelete(ctx, argv);\n } else {\n console.error(\"Usage: ai-todo reminder <create|list|show|done|update|reschedule|delete>\");\n process.exitCode = 1;\n }\n break;\n }\n case \"calendar\": {\n const action = sub ?? \"help\";\n if (action === \"today\") {\n await calendar.runCalendarToday(ctx);\n } else if (action === \"list\") {\n await calendar.runCalendarList(ctx, argv);\n } else if (action === \"add\") {\n await calendar.runCalendarAdd(ctx, argv);\n } else if (action === \"show\") {\n await calendar.runCalendarShow(ctx, argv);\n } else if (action === \"delete\") {\n await calendar.runCalendarDelete(ctx, argv);\n } else if (action === \"update\") {\n await calendar.runCalendarUpdate(ctx, argv);\n } else {\n console.error(\"Usage: ai-todo calendar <today|list|add|show|update|delete>\");\n process.exitCode = 1;\n }\n break;\n }\n case \"contact\": {\n const action = sub ?? \"help\";\n if (action === \"add\") {\n await contact.runContactAdd(ctx, argv);\n } else if (action === \"list\") {\n await contact.runContactList(ctx);\n } else if (action === \"search\") {\n await contact.runContactSearch(ctx, argv);\n } else if (action === \"show\") {\n await contact.runContactShow(ctx, argv);\n } else if (action === \"update\") {\n await contact.runContactUpdate(ctx, argv);\n } else if (action === \"delete\") {\n await contact.runContactDelete(ctx, argv);\n } else {\n console.error(\"Usage: ai-todo contact <add|list|search|show|update|delete>\");\n process.exitCode = 1;\n }\n break;\n }\n default:\n console.error(`Unknown command: ${command}`);\n printHelp();\n process.exitCode = 1;\n }\n}\n\nmain().catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : \"Unexpected CLI error.\");\n process.exitCode = 1;\n});\n\ndeclare const process: {\n argv: string[];\n exitCode?: number;\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["path", "argv", "ctx", "ctx", "argv", "ctx", "argv", "argv", "ctx", "ctx", "argv", "argv", "ctx"]
|
|
3
|
+
"sources": ["../../../packages/api-client/src/index.ts", "../src/settings.ts", "../src/auth.ts", "../src/context.ts", "../src/help.ts", "../src/pagination.ts", "../src/list-output.ts", "../src/render-list.ts", "../src/commands/calendar.ts", "../src/commands/contact.ts", "../src/version.ts", "../src/commands/core.ts", "../src/commands/reminder.ts", "../src/commands/token.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n ApiResponse,\n CalendarEventDetailResult,\n CalendarEventListResult,\n CompleteReminderResult,\n ContactDetailResult,\n ContactListResult,\n CreateCalendarEventInput,\n CreateCalendarEventResult,\n CreateContactInput,\n CreateContactResult,\n CreateApiTokenInput,\n CreateApiTokenResult,\n CreateReminderInput,\n CreateReminderResult,\n DeleteCalendarEventResult,\n DeleteContactResult,\n DeleteReminderResult,\n ListCalendarEventsParams,\n ListRemindersParams,\n MeResult,\n ApiTokenListResult,\n ReminderDetailResult,\n ReminderListResult,\n RevokeAllApiTokensResult,\n RevokeApiTokenResult,\n SearchContactsParams,\n RescheduleReminderInput,\n RescheduleReminderResult,\n TodayResult,\n UpdateCalendarEventInput,\n UpdateCalendarEventResult,\n UpdateContactInput,\n UpdateContactResult,\n UpdateProfileInput,\n UpdateProfileResult,\n UpdateReminderInput,\n UpdateReminderResult\n} from \"@ai-todo/shared\";\n\nexport interface AiTodoClientOptions {\n apiUrl: string;\n token?: string;\n source?: \"miniapp\" | \"cli\" | \"agent\" | \"api\";\n idempotencyKey?: string;\n}\n\nexport interface RequestOptions {\n idempotencyKey?: string;\n}\n\nexport class AiTodoClient {\n private readonly apiUrl: string;\n private readonly token?: string;\n private readonly source?: string;\n private readonly defaultIdempotencyKey?: string;\n\n constructor(options: AiTodoClientOptions) {\n this.apiUrl = options.apiUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n this.source = options.source;\n this.defaultIdempotencyKey = options.idempotencyKey;\n }\n\n async request<T>(\n path: string,\n init: RequestInit = {},\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const headers = new Headers(init.headers);\n headers.set(\"content-type\", \"application/json\");\n\n if (this.token) {\n headers.set(\"authorization\", `Bearer ${this.token}`);\n }\n\n if (this.source) {\n headers.set(\"x-client-source\", this.source);\n }\n\n const idempotencyKey = options.idempotencyKey ?? this.defaultIdempotencyKey;\n if (idempotencyKey) {\n headers.set(\"idempotency-key\", idempotencyKey);\n }\n\n const response = await fetch(`${this.apiUrl}${path}`, {\n ...init,\n headers\n });\n\n return (await response.json()) as ApiResponse<T>;\n }\n\n createReminder(input: CreateReminderInput): Promise<ApiResponse<CreateReminderResult>> {\n return this.request<CreateReminderResult>(\"/v1/reminders\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n }\n\n completeReminder(reminderId: string): Promise<ApiResponse<CompleteReminderResult>> {\n return this.request<CompleteReminderResult>(`/v1/reminders/${reminderId}/complete`, {\n method: \"POST\",\n body: JSON.stringify({})\n });\n }\n\n listReminders(params: ListRemindersParams = {}): Promise<ApiResponse<ReminderListResult>> {\n const search = new URLSearchParams();\n if (params.status) {\n search.set(\"status\", params.status);\n }\n if (params.from) {\n search.set(\"from\", params.from);\n }\n if (params.to) {\n search.set(\"to\", params.to);\n }\n if (params.limit) {\n search.set(\"limit\", String(params.limit));\n }\n if (params.cursor) {\n search.set(\"cursor\", params.cursor);\n }\n const query = search.toString();\n return this.request<ReminderListResult>(`/v1/reminders${query ? `?${query}` : \"\"}`);\n }\n\n listRemindersToday(): Promise<ApiResponse<ReminderListResult>> {\n return this.request<ReminderListResult>(\"/v1/reminders/today\");\n }\n\n getReminder(reminderId: string): Promise<ApiResponse<ReminderDetailResult>> {\n return this.request<ReminderDetailResult>(`/v1/reminders/${encodeURIComponent(reminderId)}`);\n }\n\n updateReminder(\n reminderId: string,\n input: UpdateReminderInput\n ): Promise<ApiResponse<UpdateReminderResult>> {\n return this.request<UpdateReminderResult>(`/v1/reminders/${encodeURIComponent(reminderId)}`, {\n method: \"PATCH\",\n body: JSON.stringify(input)\n });\n }\n\n rescheduleReminder(\n reminderId: string,\n input: RescheduleReminderInput\n ): Promise<ApiResponse<RescheduleReminderResult>> {\n return this.request<RescheduleReminderResult>(\n `/v1/reminders/${encodeURIComponent(reminderId)}/reschedule`,\n {\n method: \"POST\",\n body: JSON.stringify(input)\n }\n );\n }\n\n deleteReminder(reminderId: string): Promise<ApiResponse<DeleteReminderResult>> {\n return this.request<DeleteReminderResult>(`/v1/reminders/${encodeURIComponent(reminderId)}`, {\n method: \"DELETE\"\n });\n }\n\n createCalendarEvent(\n input: CreateCalendarEventInput\n ): Promise<ApiResponse<CreateCalendarEventResult>> {\n return this.request<CreateCalendarEventResult>(\"/v1/calendar/events\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n }\n\n listCalendarEvents(\n params: ListCalendarEventsParams = {}\n ): Promise<ApiResponse<CalendarEventListResult>> {\n const search = new URLSearchParams();\n if (params.from) {\n search.set(\"from\", params.from);\n }\n if (params.to) {\n search.set(\"to\", params.to);\n }\n if (params.limit) {\n search.set(\"limit\", String(params.limit));\n }\n if (params.cursor) {\n search.set(\"cursor\", params.cursor);\n }\n const query = search.toString();\n return this.request<CalendarEventListResult>(\n `/v1/calendar/events${query ? `?${query}` : \"\"}`\n );\n }\n\n listCalendarToday(): Promise<ApiResponse<CalendarEventListResult>> {\n return this.request<CalendarEventListResult>(\"/v1/calendar/today\");\n }\n\n getCalendarEvent(eventId: string): Promise<ApiResponse<CalendarEventDetailResult>> {\n return this.request<CalendarEventDetailResult>(\n `/v1/calendar/events/${encodeURIComponent(eventId)}`\n );\n }\n\n updateCalendarEvent(\n eventId: string,\n input: UpdateCalendarEventInput\n ): Promise<ApiResponse<UpdateCalendarEventResult>> {\n return this.request<UpdateCalendarEventResult>(\n `/v1/calendar/events/${encodeURIComponent(eventId)}`,\n {\n method: \"PATCH\",\n body: JSON.stringify(input)\n }\n );\n }\n\n deleteCalendarEvent(eventId: string): Promise<ApiResponse<DeleteCalendarEventResult>> {\n return this.request<DeleteCalendarEventResult>(\n `/v1/calendar/events/${encodeURIComponent(eventId)}`,\n { method: \"DELETE\" }\n );\n }\n\n me(): Promise<ApiResponse<MeResult>> {\n return this.request<MeResult>(\"/v1/me\");\n }\n\n updateProfile(input: UpdateProfileInput): Promise<ApiResponse<UpdateProfileResult>> {\n return this.request<UpdateProfileResult>(\"/v1/me/profile\", {\n method: \"PATCH\",\n body: JSON.stringify(input)\n });\n }\n\n today(): Promise<ApiResponse<TodayResult>> {\n return this.request<TodayResult>(\"/v1/today\");\n }\n\n createContact(input: CreateContactInput): Promise<ApiResponse<CreateContactResult>> {\n return this.request<CreateContactResult>(\"/v1/contacts\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n }\n\n searchContacts(params: SearchContactsParams = {}): Promise<ApiResponse<ContactListResult>> {\n const search = new URLSearchParams();\n if (params.query) {\n search.set(\"q\", params.query);\n }\n if (params.limit !== undefined) {\n search.set(\"limit\", String(params.limit));\n }\n if (params.cursor) {\n search.set(\"cursor\", params.cursor);\n }\n const query = search.toString();\n return this.request<ContactListResult>(`/v1/contacts${query ? `?${query}` : \"\"}`);\n }\n\n getContact(contactId: string): Promise<ApiResponse<ContactDetailResult>> {\n return this.request<ContactDetailResult>(`/v1/contacts/${encodeURIComponent(contactId)}`);\n }\n\n updateContact(\n contactId: string,\n input: UpdateContactInput\n ): Promise<ApiResponse<UpdateContactResult>> {\n return this.request<UpdateContactResult>(`/v1/contacts/${encodeURIComponent(contactId)}`, {\n method: \"PATCH\",\n body: JSON.stringify(input)\n });\n }\n\n deleteContact(contactId: string): Promise<ApiResponse<DeleteContactResult>> {\n return this.request<DeleteContactResult>(`/v1/contacts/${encodeURIComponent(contactId)}`, {\n method: \"DELETE\"\n });\n }\n\n createApiToken(input: CreateApiTokenInput): Promise<ApiResponse<CreateApiTokenResult>> {\n return this.request<CreateApiTokenResult>(\"/v1/api-tokens\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n }\n\n listApiTokens(): Promise<ApiResponse<ApiTokenListResult>> {\n return this.request<ApiTokenListResult>(\"/v1/api-tokens\");\n }\n\n revokeApiToken(tokenId: string): Promise<ApiResponse<RevokeApiTokenResult>> {\n return this.request<RevokeApiTokenResult>(`/v1/api-tokens/${encodeURIComponent(tokenId)}`, {\n method: \"DELETE\"\n });\n }\n\n revokeAllApiTokens(): Promise<ApiResponse<RevokeAllApiTokensResult>> {\n return this.request<RevokeAllApiTokensResult>(\"/v1/api-tokens/revoke-all\", {\n method: \"POST\",\n body: JSON.stringify({})\n });\n }\n\n issueDevPat(input: { name: string }): Promise<ApiResponse<CreateApiTokenResult>> {\n return this.request<CreateApiTokenResult>(\"/v1/auth/dev/issue-pat\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n }\n}\n", "import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\n/** On-disk shape for ~/.ai-todo/settings.json */\nexport interface CliSettings {\n url?: string;\n token?: string;\n}\n\nconst SETTINGS_DIR = path.join(os.homedir(), \".ai-todo\");\nconst SETTINGS_PATH = path.join(SETTINGS_DIR, \"settings.json\");\nconst LEGACY_CONFIG_PATH = path.join(SETTINGS_DIR, \"config.json\");\nconst PRODUCTION_API_URL = \"https://xingxiaolin.cn\";\n\nfunction normalizeApiUrl(url: string | undefined): string | undefined {\n if (!url) {\n return undefined;\n }\n const trimmed = url.trim();\n if (!trimmed) {\n return undefined;\n }\n if (/wodi\\.games/i.test(trimmed)) {\n return PRODUCTION_API_URL;\n }\n return trimmed;\n}\n\nfunction normalizeSettings(raw: Record<string, unknown>): CliSettings {\n const url = normalizeApiUrl(\n typeof raw.url === \"string\"\n ? raw.url\n : typeof raw.apiUrl === \"string\"\n ? raw.apiUrl\n : undefined\n );\n const token = typeof raw.token === \"string\" ? raw.token : undefined;\n return { url, token };\n}\n\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf8\")) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction writeSettingsFile(settings: CliSettings): void {\n fs.mkdirSync(SETTINGS_DIR, { recursive: true });\n fs.writeFileSync(SETTINGS_PATH, `${JSON.stringify(settings, null, 2)}\\n`, \"utf8\");\n try {\n fs.chmodSync(SETTINGS_PATH, 0o600);\n } catch {\n // best-effort on platforms without chmod\n }\n}\n\nexport function settingsPath(): string {\n return SETTINGS_PATH;\n}\n\nexport function loadSettings(): CliSettings {\n const current = readJsonFile(SETTINGS_PATH);\n if (current) {\n const settings = normalizeSettings(current);\n const rawUrl =\n typeof current.url === \"string\"\n ? current.url\n : typeof current.apiUrl === \"string\"\n ? current.apiUrl\n : undefined;\n if (rawUrl && normalizeApiUrl(rawUrl) !== rawUrl.trim()) {\n writeSettingsFile(settings);\n }\n return settings;\n }\n\n const legacy = readJsonFile(LEGACY_CONFIG_PATH);\n if (legacy) {\n const migrated = normalizeSettings(legacy);\n writeSettingsFile(migrated);\n return migrated;\n }\n\n return {};\n}\n\nexport function saveSettings(patch: CliSettings): void {\n const current = loadSettings();\n const next: CliSettings = { ...current, ...patch };\n writeSettingsFile(next);\n}\n\nexport function clearToken(): void {\n const current = loadSettings();\n const { token: _removed, ...rest } = current;\n writeSettingsFile(rest);\n}\n\nexport function resolveApiUrl(settings: CliSettings = loadSettings()): string {\n const fromEnv = normalizeApiUrl(process.env.AI_TODO_API_URL);\n if (fromEnv) {\n return fromEnv;\n }\n\n const fromFile = normalizeApiUrl(settings.url);\n if (fromFile) {\n return fromFile;\n }\n\n return \"http://127.0.0.1:3100\";\n}\n\ndeclare const process: {\n env: Record<string, string | undefined>;\n};\n", "import { loadSettings, settingsPath } from \"./settings\";\n\nexport type TokenSource = \"env\" | \"settings\" | \"none\";\n\nexport function resolveTokenSource(): { token?: string; source: TokenSource } {\n const envToken = process.env.AI_TODO_TOKEN?.trim();\n if (envToken) {\n return { token: envToken, source: \"env\" };\n }\n\n const settingsToken = loadSettings().token?.trim();\n if (settingsToken) {\n return { token: settingsToken, source: \"settings\" };\n }\n\n return { source: \"none\" };\n}\n\nfunction settingsExample(apiUrl = \"https://xingxiaolin.cn\"): string {\n return JSON.stringify({ url: apiUrl, token: \"aitodo_xxx\" }, null, 2);\n}\n\nexport function printAuthHint(reason: \"missing\" | \"invalid\" = \"missing\"): void {\n const settingsFile = settingsPath();\n const lines =\n reason === \"invalid\"\n ? [\n \"API Token \u65E0\u6548\u6216\u5DF2\u8FC7\u671F\u3002\",\n \"\",\n \"\u8BF7\u66F4\u65B0 Personal Access Token\uFF08PAT\uFF09\uFF1A\",\n \"\",\n `\u7F16\u8F91 ${settingsFile}\uFF1A`,\n settingsExample(),\n \"\",\n \"Agent / CI \u4E5F\u53EF\u4F7F\u7528\u73AF\u5883\u53D8\u91CF\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E\u914D\u7F6E\u6587\u4EF6\uFF09\uFF1A\",\n \" export AI_TODO_TOKEN=aitodo_xxx\",\n \" export AI_TODO_API_URL=https://xingxiaolin.cn\",\n \"\",\n \"\u751F\u4EA7\u73AF\u5883\u8BF7\u5728\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\u300C\u6211\u7684 \u2192 CLI / Agent \u8BBF\u95EE\u4EE4\u724C\u300D\u521B\u5EFA\u65B0 PAT\u3002\"\n ]\n : [\n \"\u672A\u68C0\u6D4B\u5230 API Token\u3002\",\n \"\",\n \"\u9996\u6B21\u914D\u7F6E\uFF1A\u521B\u5EFA ~/.ai-todo/settings.json\",\n \"\",\n settingsExample(),\n \"\",\n \"1. \u5FAE\u4FE1\u5C0F\u7A0B\u5E8F \u2192 \u6211\u7684 \u2192 CLI / Agent \u8BBF\u95EE\u4EE4\u724C \u2192 \u521B\u5EFA\",\n \"2. \u5C06\u5B8C\u6574 token \u586B\u5165\u4E0A\u8FF0\u6587\u4EF6\u7684 token \u5B57\u6BB5\",\n \"3. \u8FD0\u884C ai-todo whoami \u9A8C\u8BC1\",\n \"\",\n `\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF1A${settingsFile}`\n ];\n\n for (const line of lines) {\n console.error(line);\n }\n}\n\ndeclare const process: {\n env: Record<string, string | undefined>;\n};\n", "import { AiTodoClient } from \"@ai-todo/api-client\";\nimport type { ApiResponse } from \"@ai-todo/shared\";\n\nimport { printAuthHint, resolveTokenSource } from \"./auth\";\nimport { loadSettings, resolveApiUrl, saveSettings } from \"./settings\";\n\nexport interface CliContext {\n json: boolean;\n apiUrl: string;\n client: AiTodoClient;\n}\n\nconst GLOBAL_FLAGS = new Set([\"--json\", \"--yes\", \"--api-url\", \"--url\", \"--idempotency-key\", \"--profile\"]);\nconst GLOBAL_FLAGS_WITH_VALUE = new Set([\"--api-url\", \"--url\", \"--idempotency-key\", \"--profile\"]);\n\n/** Strip global flags before resolving positional args (e.g. trailing --api-url). */\nexport function commandArgv(argv: string[]): string[] {\n const result: string[] = [];\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (GLOBAL_FLAGS.has(arg)) {\n if (GLOBAL_FLAGS_WITH_VALUE.has(arg)) {\n index += 1;\n }\n continue;\n }\n result.push(arg);\n }\n return result;\n}\n\nexport function buildContext(argv: string[]): CliContext {\n const json = argv.includes(\"--json\");\n const settings = loadSettings();\n const apiUrl = resolveApiUrl(settings);\n const { token } = resolveTokenSource();\n\n return {\n json,\n apiUrl,\n client: new AiTodoClient({\n apiUrl,\n token,\n source: \"cli\",\n idempotencyKey: readFlagValue(argv, \"--idempotency-key\")\n })\n };\n}\n\ndeclare const process: {\n exitCode?: number;\n};\n\nexport function readFlagValue(argv: string[], flag: string): string | undefined {\n const index = argv.indexOf(flag);\n return index >= 0 ? argv[index + 1] : undefined;\n}\n\nexport function readRepeatedFlag(argv: string[], flag: string): string[] {\n const values: string[] = [];\n const args = commandArgv(argv);\n for (let index = 0; index < args.length; index += 1) {\n const next = args[index + 1];\n if (args[index] === flag && next && !next.startsWith(\"-\")) {\n values.push(next);\n }\n }\n return values;\n}\n\nexport function hasFlag(argv: string[], flag: string): boolean {\n return commandArgv(argv).includes(flag);\n}\n\nexport function positionalAfter(argv: string[], ...anchors: string[]): string | undefined {\n const args = commandArgv(argv);\n let start = -1;\n for (const anchor of anchors) {\n const index = args.indexOf(anchor);\n if (index > start) {\n start = index;\n }\n }\n if (start < 0) {\n return undefined;\n }\n\n const values: string[] = [];\n for (let index = start + 1; index < args.length; index += 1) {\n const arg = args[index];\n if (\n arg === \"--email\" ||\n arg === \"--phone\" ||\n arg === \"--alias\" ||\n arg === \"--handle\" ||\n arg === \"--company\" ||\n arg === \"--job-title\" ||\n arg === \"--contact\" ||\n arg === \"--name\"\n ) {\n index += 1;\n continue;\n }\n if (\n [\n \"--title\",\n \"--due\",\n \"--remind\",\n \"--notes\",\n \"--start\",\n \"--end\",\n \"--location\",\n \"--description\",\n \"--status\",\n \"--date\",\n \"--from\",\n \"--to\"\n ].includes(arg)\n ) {\n index += 1;\n continue;\n }\n if (arg.startsWith(\"--\")) {\n continue;\n }\n values.push(arg);\n }\n\n return values.length > 0 ? values.join(\" \") : undefined;\n}\n\nexport async function handleApi<T>(\n ctx: CliContext,\n response: ApiResponse<T>,\n render: (data: T) => void\n): Promise<void> {\n if (ctx.json) {\n console.log(JSON.stringify(response, null, 2));\n process.exitCode = response.ok ? 0 : 1;\n return;\n }\n\n if (!response.ok) {\n const code = response.error.code ? `[${response.error.code}] ` : \"\";\n console.error(`${code}${response.error.message}`);\n if (response.error.code === \"UNAUTHORIZED\") {\n printAuthHint(\"invalid\");\n }\n process.exitCode = 1;\n return;\n }\n\n render(response.data);\n}\n\nexport function persistApiUrl(apiUrl: string): void {\n saveSettings({ url: apiUrl });\n}\n", "import { settingsPath } from \"./settings\";\n\nexport function printHelp(): void {\n console.log(`ai-todo \u2014 reminders, calendar, and contacts\n\nConfig ${settingsPath()}:\n { \"url\": \"https://xingxiaolin.cn\", \"token\": \"aitodo_xxx\" }\n\n Token: WeChat miniapp \u2192 Mine \u2192 CLI / Agent tokens\n Override: AI_TODO_TOKEN, AI_TODO_API_URL (else local http://127.0.0.1:3100)\n\nFlags: --json --limit <n> --cursor <token> --idempotency-key <uuid>\n\nCore:\n ai-todo today\n ai-todo whoami\n ai-todo version\n\nReminders:\n ai-todo reminder create --title <text> [--due <iso>] [--remind <iso>] [--notes <text>] [--contact <id> ...]\n ai-todo reminder list [--status pending|completed|cancelled] [--from YYYY-MM-DD] [--to YYYY-MM-DD] [--limit <n>] [--cursor <token>]\n ai-todo reminder show|done|delete <id>\n ai-todo reminder update <id> [--title <text>] [--notes <text>] [--due <iso>] [--remind <iso>] [--contact <id> ...]\n ai-todo reminder reschedule <id> --due <iso> [--remind <iso>]\n ai-todo add <title>\n\nCalendar:\n ai-todo calendar today|list|add|show|update|delete ...\n ai-todo calendar list [--date YYYY-MM-DD] [--limit <n>] [--cursor <token>]\n ai-todo calendar add --title <text> --start <iso> [--end <iso>] [--location <text>]\n\nContacts:\n ai-todo contact add|list|search|show|update|delete ...\n ai-todo contact list [--limit <n>] [--cursor <token>]\n ai-todo contact search <query> [--limit <n>] [--cursor <token>]\n\nAgents: https://github.com/xiaolinstar/ai-todo/blob/main/docs/agent-usage.md`);\n}\n", "import { readFlagValue } from \"./context\";\n\nexport const DEFAULT_LIST_LIMIT = 50;\n\nexport function readListLimit(argv: string[]): number {\n const raw = readFlagValue(argv, \"--limit\");\n if (!raw) {\n return DEFAULT_LIST_LIMIT;\n }\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed < 1 || parsed > 100) {\n console.error(\"Usage: --limit must be an integer between 1 and 100.\");\n process.exitCode = 1;\n return DEFAULT_LIST_LIMIT;\n }\n return parsed;\n}\n\nexport function readListCursor(argv: string[]): string | undefined {\n return readFlagValue(argv, \"--cursor\");\n}\n\ndeclare const process: { exitCode?: number };\n", "export interface ListSummaryMeta {\n label: string;\n pageCount: number;\n totalCount: number;\n hasMore?: boolean;\n nextCursor?: string | null;\n query?: string;\n nextPageHint?: string;\n}\n\nexport function printListSummary(meta: ListSummaryMeta): void {\n const { label, pageCount, totalCount, hasMore, nextCursor, query, nextPageHint } = meta;\n const titleParts: string[] = [label];\n\n if (query) {\n titleParts.push(`\u641C\u7D22\u300C${query}\u300D`);\n }\n\n if (!hasMore && pageCount === totalCount) {\n titleParts.push(`\u5171 ${totalCount} \u6761`);\n } else {\n titleParts.push(`\u672C\u9875 ${pageCount} \u6761 / \u5171 ${totalCount} \u6761`);\n }\n\n console.log(titleParts.join(\" \u00B7 \"));\n\n if (hasMore && nextCursor && nextPageHint) {\n console.log(`\u4E0B\u4E00\u9875\uFF1A${nextPageHint} --cursor ${nextCursor}`);\n }\n\n if (pageCount > 0) {\n console.log(\"\u2500\".repeat(32));\n }\n}\n\nexport function printEmptyList(message: string): void {\n console.log(message);\n}\n", "import type { ContactSummary, ReminderSummary, CalendarEventSummary } from \"@ai-todo/shared\";\n\nimport { printEmptyList, printListSummary, type ListSummaryMeta } from \"./list-output\";\n\nexport function renderContactListPage(\n items: ContactSummary[],\n meta: Omit<ListSummaryMeta, \"pageCount\">\n): void {\n if (items.length === 0) {\n printEmptyList(meta.query ? \"\u672A\u627E\u5230\u5339\u914D\u7684\u8054\u7CFB\u4EBA\" : \"\u6682\u65E0\u8054\u7CFB\u4EBA\");\n return;\n }\n\n printListSummary({ ...meta, pageCount: items.length });\n\n for (const contact of items) {\n const detailParts = [\n contact.company,\n contact.primaryEmail ? `<${contact.primaryEmail}>` : undefined,\n contact.primaryPhone || undefined\n ].filter(Boolean);\n\n console.log(`\u2022 ${contact.displayName}`);\n console.log(` @${contact.handle}${detailParts.length > 0 ? ` \u00B7 ${detailParts.join(\" \u00B7 \")}` : \"\"}`);\n console.log(` ${contact.id}`);\n }\n}\n\nexport function renderReminderListPage(\n items: ReminderSummary[],\n meta: Omit<ListSummaryMeta, \"pageCount\">\n): void {\n if (items.length === 0) {\n printEmptyList(\"\u6682\u65E0\u63D0\u9192\");\n return;\n }\n\n printListSummary({ ...meta, pageCount: items.length });\n\n for (const reminder of items) {\n const due = reminder.dueAt ? ` \u00B7 ${reminder.dueAt}` : \"\";\n const contacts =\n reminder.contacts && reminder.contacts.length > 0\n ? ` \u00B7 ${reminder.contacts.map((contact) => contact.displayName).join(\"\u3001\")}`\n : \"\";\n console.log(`\u2022 [${reminder.status}] ${reminder.title}${due}${contacts}`);\n console.log(` ${reminder.id}`);\n }\n}\n\nexport function renderCalendarListPage(\n items: CalendarEventSummary[],\n meta: Omit<ListSummaryMeta, \"pageCount\">\n): void {\n if (items.length === 0) {\n printEmptyList(\"\u6682\u65E0\u65E5\u7A0B\");\n return;\n }\n\n printListSummary({ ...meta, pageCount: items.length });\n\n for (const event of items) {\n const end = event.endAt ? ` \u2192 ${event.endAt}` : \"\";\n const place = event.location ? ` \u00B7 ${event.location}` : \"\";\n console.log(`\u2022 ${event.title}`);\n console.log(` ${event.startAt}${end}${place}`);\n console.log(` ${event.id}`);\n }\n}\n", "import type { CliContext } from \"../context\";\nimport { handleApi, positionalAfter, readFlagValue, readRepeatedFlag } from \"../context\";\nimport { readListCursor, readListLimit } from \"../pagination\";\nimport { renderCalendarListPage } from \"../render-list\";\n\nexport async function runCalendarToday(ctx: CliContext): Promise<void> {\n await handleApi(ctx, await ctx.client.listCalendarToday(), (data) => {\n if (ctx.json) {\n return;\n }\n if (data.items.length === 0) {\n console.log(\"\u4ECA\u65E5\u6682\u65E0\u65E5\u7A0B\");\n return;\n }\n for (const event of data.items) {\n const end = event.endAt ? ` - ${event.endAt}` : \"\";\n const place = event.location ? ` @ ${event.location}` : \"\";\n console.log(`- ${event.title} (${event.startAt}${end})${place} (${event.id})`);\n }\n });\n}\n\nexport async function runCalendarList(ctx: CliContext, argv: string[]): Promise<void> {\n const date = readFlagValue(argv, \"--date\");\n const limit = readListLimit(argv);\n const cursor = readListCursor(argv);\n if (process.exitCode) {\n return;\n }\n\n await handleApi(\n ctx,\n await ctx.client.listCalendarEvents(\n date\n ? { from: date, to: date, limit, cursor }\n : { limit, cursor }\n ),\n (data) => {\n if (ctx.json) {\n return;\n }\n renderCalendarListPage(data.items, {\n label: date ? `\u65E5\u7A0B \u00B7 ${date}` : \"\u65E5\u7A0B\",\n totalCount: data.totalCount,\n hasMore: data.hasMore,\n nextCursor: data.nextCursor,\n nextPageHint: date\n ? \"ai-todo calendar list --date <YYYY-MM-DD>\"\n : \"ai-todo calendar list\"\n });\n }\n );\n}\n\nexport async function runCalendarAdd(ctx: CliContext, argv: string[]): Promise<void> {\n const title = readFlagValue(argv, \"--title\");\n const start = readFlagValue(argv, \"--start\");\n const end = readFlagValue(argv, \"--end\");\n const location = readFlagValue(argv, \"--location\");\n\n if (!title || !start) {\n console.error(\n \"Usage: ai-todo calendar add --title <text> --start <iso> [--end <iso>] [--contact <contact_id> ...]\"\n );\n process.exitCode = 1;\n return;\n }\n\n await handleApi(\n ctx,\n await ctx.client.createCalendarEvent({\n title,\n startAt: start,\n endAt: end,\n location,\n contactIds: readRepeatedFlag(argv, \"--contact\")\n }),\n (data) => {\n if (!ctx.json) {\n const event = data.calendarEvent;\n console.log(`\u5DF2\u521B\u5EFA\u65E5\u7A0B\uFF1A${event.title}`);\n console.log(`ID\uFF1A${event.id}`);\n console.log(`\u5F00\u59CB\uFF1A${event.startAt}`);\n if (event.endAt) {\n console.log(`\u7ED3\u675F\uFF1A${event.endAt}`);\n }\n }\n }\n );\n}\n\nexport async function runCalendarShow(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"show\");\n if (!id) {\n console.error(\"Usage: ai-todo calendar show <event_id>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.getCalendarEvent(id), (data) => {\n if (ctx.json) {\n return;\n }\n const e = data.calendarEvent;\n console.log(`${e.title} (${e.id})`);\n console.log(`${e.startAt}${e.endAt ? ` \u2192 ${e.endAt}` : \"\"}`);\n if (e.location) {\n console.log(`\u5730\u70B9\uFF1A${e.location}`);\n }\n });\n}\n\nexport async function runCalendarDelete(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"delete\");\n if (!id) {\n console.error(\"Usage: ai-todo calendar delete <event_id>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.deleteCalendarEvent(id), (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u5220\u9664\u65E5\u7A0B\uFF1A${data.id}`);\n }\n });\n}\n\nexport async function runCalendarUpdate(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"update\");\n const title = readFlagValue(argv, \"--title\");\n const start = readFlagValue(argv, \"--start\");\n const end = readFlagValue(argv, \"--end\");\n const location = readFlagValue(argv, \"--location\");\n const description = readFlagValue(argv, \"--description\");\n const contactIds = readRepeatedFlag(argv, \"--contact\");\n const hasContacts = argv.includes(\"--contact\");\n\n if (!id) {\n console.error(\n \"Usage: ai-todo calendar update <event_id> [--title <text>] [--start <iso>] [--end <iso>] [--location <text>] [--contact <contact_id> ...]\"\n );\n process.exitCode = 1;\n return;\n }\n\n if (!title && !start && end === undefined && location === undefined && !description && !hasContacts) {\n console.error(\"Provide at least one field to update\");\n process.exitCode = 1;\n return;\n }\n\n await handleApi(\n ctx,\n await ctx.client.updateCalendarEvent(id, {\n title,\n startAt: start,\n endAt: end,\n location,\n description,\n contactIds: hasContacts ? contactIds : undefined\n }),\n (data) => {\n if (!ctx.json) {\n const event = data.calendarEvent;\n console.log(`\u5DF2\u66F4\u65B0\u65E5\u7A0B\uFF1A${event.title} (${event.id})`);\n }\n }\n );\n}\n\ndeclare const process: { exitCode?: number };\n", "import type { CreateContactInput } from \"@ai-todo/shared\";\n\nimport type { CliContext } from \"../context\";\nimport { handleApi, positionalAfter, readFlagValue } from \"../context\";\nimport { readListCursor, readListLimit } from \"../pagination\";\nimport { renderContactListPage } from \"../render-list\";\n\nexport async function runContactAdd(ctx: CliContext, argv: string[]): Promise<void> {\n const displayName = positionalAfter(argv, \"contact\", \"add\");\n if (!displayName) {\n console.error(\n \"Usage: ai-todo contact add <name> [--handle <handle>] [--email <v>] [--phone <v>] [--company <text>] [--job-title <text>] [--notes <text>]\"\n );\n process.exitCode = 1;\n return;\n }\n\n const methods: CreateContactInput[\"methods\"] = [];\n const handle = readFlagValue(argv, \"--handle\");\n const email = readFlagValue(argv, \"--email\");\n const phone = readFlagValue(argv, \"--phone\");\n const alias = readFlagValue(argv, \"--alias\");\n const company = readFlagValue(argv, \"--company\");\n const jobTitle = readFlagValue(argv, \"--job-title\");\n const notes = readFlagValue(argv, \"--notes\");\n\n if (email) {\n methods.push({ type: \"email\", value: email, label: \"work\", isPrimary: true });\n }\n if (phone) {\n methods.push({ type: \"phone\", value: phone, label: \"mobile\", isPrimary: true });\n }\n\n await handleApi(\n ctx,\n await ctx.client.createContact({\n displayName,\n handle,\n company,\n title: jobTitle,\n notes,\n methods,\n aliases: alias ? [alias] : []\n }),\n (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u521B\u5EFA\u8054\u7CFB\u4EBA\uFF1A${data.contact.displayName}`);\n console.log(`\u6807\u8BC6\uFF1A${data.contact.handle}`);\n console.log(`ID\uFF1A${data.contact.id}`);\n }\n }\n );\n}\n\nexport async function runContactSearch(ctx: CliContext, argv: string[]): Promise<void> {\n const query = positionalAfter(argv, \"contact\", \"search\");\n if (!query) {\n console.error(\"Usage: ai-todo contact search <query> [--limit <n>] [--cursor <token>]\");\n process.exitCode = 1;\n return;\n }\n if (process.exitCode) {\n return;\n }\n\n const limit = readListLimit(argv);\n const cursor = readListCursor(argv);\n await handleApi(\n ctx,\n await ctx.client.searchContacts({ query, limit, cursor }),\n (data) => {\n if (ctx.json) {\n return;\n }\n renderContactListPage(data.items, {\n label: \"\u8054\u7CFB\u4EBA\",\n totalCount: data.totalCount,\n hasMore: data.hasMore,\n nextCursor: data.nextCursor,\n query,\n nextPageHint: \"ai-todo contact search <query>\"\n });\n }\n );\n}\n\nexport async function runContactList(ctx: CliContext, argv: string[]): Promise<void> {\n const limit = readListLimit(argv);\n const cursor = readListCursor(argv);\n if (process.exitCode) {\n return;\n }\n\n await handleApi(\n ctx,\n await ctx.client.searchContacts({ limit, cursor }),\n (data) => {\n if (ctx.json) {\n return;\n }\n renderContactListPage(data.items, {\n label: \"\u8054\u7CFB\u4EBA\",\n totalCount: data.totalCount,\n hasMore: data.hasMore,\n nextCursor: data.nextCursor,\n nextPageHint: \"ai-todo contact list\"\n });\n }\n );\n}\n\nexport async function runContactShow(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"contact\", \"show\");\n if (!id) {\n console.error(\"Usage: ai-todo contact show <contact_id_or_handle>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.getContact(id), (data) => {\n if (ctx.json) {\n return;\n }\n const c = data.contact;\n console.log(`${c.displayName} (@${c.handle}, ${c.id})`);\n console.log(`\u6807\u8BC6\u6765\u6E90\uFF1A${c.handleSource === \"generated\" ? \"\u81EA\u52A8\u751F\u6210\" : \"\u624B\u52A8\u8BBE\u7F6E\"}`);\n if (c.linkedUserId) {\n console.log(`\u5E73\u53F0\u7528\u6237\uFF1A${c.linkedUserId}`);\n }\n if (c.primaryEmail) {\n console.log(`\u90AE\u7BB1\uFF1A${c.primaryEmail}`);\n }\n if (c.primaryPhone) {\n console.log(`\u7535\u8BDD\uFF1A${c.primaryPhone}`);\n }\n if (c.company) {\n console.log(`\u516C\u53F8\uFF1A${c.company}`);\n }\n if (c.title) {\n console.log(`\u804C\u4F4D\uFF1A${c.title}`);\n }\n if (c.aliases.length > 0) {\n console.log(`\u522B\u540D\uFF1A${c.aliases.join(\", \")}`);\n }\n if (c.methods.length > 0) {\n console.log(\"\u8054\u7CFB\u65B9\u5F0F\uFF1A\");\n for (const method of c.methods) {\n const primary = method.isPrimary ? \"\uFF0C\u4E3B\u8981\" : \"\";\n const label = method.label ? `\uFF0C${method.label}` : \"\";\n console.log(`- ${method.type}${label}${primary}\uFF1A${method.value}`);\n }\n }\n if (c.notes) {\n console.log(`\u5907\u6CE8\uFF1A${c.notes}`);\n }\n });\n}\n\nexport async function runContactUpdate(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"contact\", \"update\");\n if (!id) {\n console.error(\n \"Usage: ai-todo contact update <contact_id_or_handle> [--handle <handle>] [--name <text>] [--email <v>] [--phone <v>] [--company <text>] [--job-title <text>] [--alias <v>] [--notes <text>]\"\n );\n process.exitCode = 1;\n return;\n }\n\n const displayName = readFlagValue(argv, \"--name\");\n const handle = readFlagValue(argv, \"--handle\");\n const email = readFlagValue(argv, \"--email\");\n const phone = readFlagValue(argv, \"--phone\");\n const alias = readFlagValue(argv, \"--alias\");\n const company = readFlagValue(argv, \"--company\");\n const jobTitle = readFlagValue(argv, \"--job-title\");\n const notes = readFlagValue(argv, \"--notes\");\n const hasCompany = argv.includes(\"--company\");\n const hasJobTitle = argv.includes(\"--job-title\");\n const hasNotes = argv.includes(\"--notes\");\n\n if (!displayName && !handle && !email && !phone && !alias && !hasCompany && !hasJobTitle && !hasNotes) {\n console.error(\"Provide at least one field to update\");\n process.exitCode = 1;\n return;\n }\n\n const methods: CreateContactInput[\"methods\"] = [];\n if (email) {\n methods.push({ type: \"email\", value: email, label: \"work\", isPrimary: true });\n }\n if (phone) {\n methods.push({ type: \"phone\", value: phone, label: \"mobile\", isPrimary: true });\n }\n\n await handleApi(\n ctx,\n await ctx.client.updateContact(id, {\n displayName,\n handle,\n company: hasCompany ? company : undefined,\n title: hasJobTitle ? jobTitle : undefined,\n notes: hasNotes ? notes : undefined,\n methods: methods.length > 0 ? methods : undefined,\n aliases: alias ? [alias] : undefined\n }),\n (data) => {\n if (!ctx.json) {\n console.log(\n `\u5DF2\u66F4\u65B0\u8054\u7CFB\u4EBA\uFF1A${data.contact.displayName} (@${data.contact.handle}, ${data.contact.id})`\n );\n }\n }\n );\n}\n\nexport async function runContactDelete(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"contact\", \"delete\");\n if (!id) {\n console.error(\"Usage: ai-todo contact delete <contact_id_or_handle>\");\n process.exitCode = 1;\n return;\n }\n\n await handleApi(ctx, await ctx.client.deleteContact(id), (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u5220\u9664\u8054\u7CFB\u4EBA\uFF1A${data.id}`);\n }\n });\n}\n\ndeclare const process: { exitCode?: number };\n", "import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst PACKAGE_JSON = join(__dirname, \"..\", \"package.json\");\n\nexport function getCliVersion(): string {\n const pkg = JSON.parse(readFileSync(PACKAGE_JSON, \"utf8\")) as { version: string };\n return pkg.version;\n}\n", "import type { CliContext } from \"../context\";\nimport { handleApi, persistApiUrl, readFlagValue } from \"../context\";\nimport { printAuthHint, resolveTokenSource } from \"../auth\";\nimport { clearToken, resolveApiUrl, saveSettings, settingsPath } from \"../settings\";\nimport { getCliVersion } from \"../version\";\n\nfunction readLoginUrl(argv: string[]): string | undefined {\n return readFlagValue(argv, \"--url\") ?? readFlagValue(argv, \"--api-url\");\n}\n\nexport async function runVersion(ctx: CliContext): Promise<void> {\n const cliVersion = getCliVersion();\n if (ctx.json) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n component: \"cli\",\n version: cliVersion,\n apiUrl: ctx.apiUrl\n },\n null,\n 2\n )\n );\n return;\n }\n console.log(`ai-todo CLI ${cliVersion}`);\n console.log(`API: ${ctx.apiUrl}`);\n}\n\nexport async function runLogin(ctx: CliContext, argv: string[]): Promise<void> {\n const apiUrl = readLoginUrl(argv) ?? ctx.apiUrl;\n persistApiUrl(apiUrl);\n\n const token = readFlagValue(argv, \"--token\");\n const issuePat = argv.includes(\"--issue-pat\");\n const name = readFlagValue(argv, \"--name\") ?? \"CLI Local\";\n\n if (issuePat) {\n await issuePersonalAccessToken(ctx, apiUrl, name);\n return;\n }\n\n if (token) {\n saveSettings({ token, url: apiUrl });\n }\n\n const resolved = resolveTokenSource();\n\n if (ctx.json) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n apiUrl,\n settingsPath: settingsPath(),\n tokenSource: resolved.source,\n hasToken: resolved.source !== \"none\"\n },\n null,\n 2\n )\n );\n return;\n }\n\n console.log(`\u5DF2\u4FDD\u5B58 API \u5730\u5740\uFF1A${apiUrl}`);\n if (token) {\n console.log(`\u5DF2\u5199\u5165 ${settingsPath()}`);\n console.log(\"\u540E\u7EED\u76F4\u63A5\u8FD0\u884C ai-todo whoami / ai-todo today \u7B49\u547D\u4EE4\u5373\u53EF\uFF0C\u65E0\u9700\u518D\u4F20 --url\u3002\");\n console.log(\"Agent \u73AF\u5883\u4ECD\u53EF\u7528 export AI_TODO_TOKEN=\u2026 \u8986\u76D6\u914D\u7F6E\u6587\u4EF6\u3002\");\n } else if (resolved.source === \"env\") {\n console.log(\"\u68C0\u6D4B\u5230 AI_TODO_TOKEN \u73AF\u5883\u53D8\u91CF\uFF08\u5DF2\u751F\u6548\uFF09\");\n } else {\n printAuthHint(\"missing\");\n }\n console.log(`\u914D\u7F6E\u6587\u4EF6\uFF1A${settingsPath()}`);\n}\n\nasync function issuePersonalAccessToken(\n ctx: CliContext,\n apiUrl: string,\n name: string\n): Promise<void> {\n if (!isLocalDevApiUrl(apiUrl)) {\n if (ctx.json) {\n console.log(\n JSON.stringify(\n {\n ok: false,\n error: {\n code: \"PAT_CREATE_NOT_SUPPORTED\",\n message:\n \"Create a Personal Access Token in the WeChat miniapp Mine tab, then write ~/.ai-todo/settings.json\"\n }\n },\n null,\n 2\n )\n );\n } else {\n console.error(\"\u751F\u4EA7/\u8FDC\u7A0B API \u4E0D\u652F\u6301 CLI \u76F4\u63A5\u7B7E\u53D1 PAT\u3002\");\n console.error(\"\u8BF7\u5728\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\u300C\u6211\u7684 \u2192 CLI / Agent \u8BBF\u95EE\u4EE4\u724C\u300D\u4E2D\u521B\u5EFA\uFF0C\u7136\u540E\u5199\u5165 ~/.ai-todo/settings.json\u3002\");\n }\n process.exitCode = 1;\n return;\n }\n\n const response = await ctx.client.issueDevPat({ name });\n\n if (!response.ok) {\n if (ctx.json) {\n console.log(JSON.stringify(response, null, 2));\n } else {\n console.error(`[${response.error.code}] ${response.error.message}`);\n console.error(\"\");\n console.error(\"\u7B7E\u53D1 PAT \u5931\u8D25\u3002\u8BF7\u786E\u8BA4 API \u5DF2\u542F\u52A8\u4E14 AI_TODO_ALLOW_DEV_AUTH=true\u3002\");\n }\n process.exitCode = 1;\n return;\n }\n\n const { token, id, scopes } = response.data;\n saveSettings({ token, url: apiUrl });\n\n if (ctx.json) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n apiUrl,\n tokenId: id,\n token,\n scopes,\n savedTo: settingsPath(),\n envHint: `export AI_TODO_TOKEN=${token}`\n },\n null,\n 2\n )\n );\n return;\n }\n\n console.log(\"\u5DF2\u7B7E\u53D1 Personal Access Token\uFF08\u4EC5\u663E\u793A\u4E00\u6B21\uFF0C\u8BF7\u59A5\u5584\u4FDD\u7BA1\uFF09\uFF1A\");\n console.log(\"\");\n console.log(token);\n console.log(\"\");\n console.log(\"\u63A8\u8350\u5199\u5165 Agent \u73AF\u5883\u53D8\u91CF\uFF1A\");\n console.log(` export AI_TODO_TOKEN=${token}`);\n console.log(\"\");\n console.log(`\u5DF2\u540C\u65F6\u4FDD\u5B58\u5230 ${settingsPath()}\uFF08\u53EF\u88AB\u73AF\u5883\u53D8\u91CF\u8986\u76D6\uFF09`);\n}\n\nexport async function runLogout(ctx: CliContext): Promise<void> {\n clearToken();\n const resolved = resolveTokenSource();\n\n if (ctx.json) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n clearedSettings: true,\n tokenSource: resolved.source,\n note:\n resolved.source === \"env\"\n ? \"AI_TODO_TOKEN \u73AF\u5883\u53D8\u91CF\u4ECD\u751F\u6548\uFF1Bunset AI_TODO_TOKEN \u53EF\u5B8C\u5168\u9000\u51FA\"\n : \"settings.json \u4E2D\u7684 token \u5DF2\u6E05\u9664\"\n },\n null,\n 2\n )\n );\n return;\n }\n\n console.log(`\u5DF2\u6E05\u9664 ${settingsPath()} \u4E2D\u7684 token`);\n if (resolved.source === \"env\") {\n console.log(\"\u6CE8\u610F\uFF1AAI_TODO_TOKEN \u73AF\u5883\u53D8\u91CF\u4ECD\u7136\u751F\u6548\");\n console.log(\"\u8FD0\u884C unset AI_TODO_TOKEN \u53EF\u5B8C\u5168\u9000\u51FA\u6388\u6743\");\n }\n}\n\nexport async function runWhoami(ctx: CliContext): Promise<void> {\n const resolved = resolveTokenSource();\n if (resolved.source === \"none\") {\n if (ctx.json) {\n console.log(\n JSON.stringify(\n {\n ok: false,\n error: {\n code: \"UNAUTHORIZED\",\n message: \"No API token configured.\"\n }\n },\n null,\n 2\n )\n );\n } else {\n printAuthHint(\"missing\");\n }\n process.exitCode = 1;\n return;\n }\n\n await handleApi(ctx, await ctx.client.me(), (data) => {\n if (!ctx.json) {\n const sourceLabel =\n resolved.source === \"env\"\n ? \"\u73AF\u5883\u53D8\u91CF AI_TODO_TOKEN\"\n : `\u914D\u7F6E\u6587\u4EF6 ${settingsPath()}`;\n console.log(`${data.user.displayName} (${data.user.id})`);\n console.log(`API\uFF1A${resolveApiUrl()}`);\n console.log(`\u65F6\u533A\uFF1A${data.user.timezone}`);\n console.log(`\u6388\u6743\u6765\u6E90\uFF1A${sourceLabel}`);\n }\n });\n}\n\nexport async function runToday(ctx: CliContext): Promise<void> {\n await handleApi(ctx, await ctx.client.today(), (data) => {\n if (ctx.json) {\n return;\n }\n console.log(`${data.date} (${data.timezone})`);\n console.log(\"\u63D0\u9192\uFF1A\");\n if (data.reminders.length === 0) {\n console.log(\" \u6682\u65E0\");\n } else {\n for (const reminder of data.reminders) {\n console.log(` - [${reminder.status}] ${reminder.title} (${reminder.id})`);\n }\n }\n console.log(\"\u65E5\u7A0B\uFF1A\");\n if (data.calendarEvents.length === 0) {\n console.log(\" \u6682\u65E0\");\n } else {\n for (const event of data.calendarEvents) {\n const end = event.endAt ? ` - ${event.endAt}` : \"\";\n const place = event.location ? ` @ ${event.location}` : \"\";\n console.log(` - ${event.title} (${event.startAt}${end})${place} (${event.id})`);\n }\n }\n });\n}\n\ndeclare const process: { exitCode?: number };\n\nfunction isLocalDevApiUrl(apiUrl: string): boolean {\n try {\n const hostname = new URL(apiUrl).hostname;\n return hostname === \"127.0.0.1\" || hostname === \"localhost\";\n } catch {\n return false;\n }\n}\n", "import type { ReminderStatus } from \"@ai-todo/shared\";\n\nimport type { CliContext } from \"../context\";\nimport {\n handleApi,\n hasFlag,\n positionalAfter,\n readFlagValue,\n readRepeatedFlag\n} from \"../context\";\nimport { readListCursor, readListLimit } from \"../pagination\";\nimport { renderReminderListPage } from \"../render-list\";\n\nexport async function runReminderCreate(ctx: CliContext, argv: string[]): Promise<void> {\n const title = readFlagValue(argv, \"--title\") ?? positionalAfter(argv, \"add\", \"create\");\n if (!title) {\n console.error(\n \"Usage: ai-todo reminder create --title <text> [--due <iso>] [--contact <contact_id> ...]\"\n );\n process.exitCode = 1;\n return;\n }\n\n await handleApi(\n ctx,\n await ctx.client.createReminder({\n title,\n dueAt: readFlagValue(argv, \"--due\"),\n remindAt: readFlagValue(argv, \"--remind\"),\n notes: readFlagValue(argv, \"--notes\"),\n contactIds: readRepeatedFlag(argv, \"--contact\")\n }),\n (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u521B\u5EFA\u63D0\u9192\uFF1A${data.reminder.title}`);\n console.log(`ID\uFF1A${data.reminder.id}`);\n if (data.reminder.dueAt) {\n console.log(`\u622A\u6B62\uFF1A${data.reminder.dueAt}`);\n }\n }\n }\n );\n}\n\nexport async function runReminderList(ctx: CliContext, argv: string[]): Promise<void> {\n const status = readFlagValue(argv, \"--status\") as ReminderStatus | undefined;\n const limit = readListLimit(argv);\n const cursor = readListCursor(argv);\n if (process.exitCode) {\n return;\n }\n\n await handleApi(\n ctx,\n await ctx.client.listReminders({\n status,\n from: readFlagValue(argv, \"--from\"),\n to: readFlagValue(argv, \"--to\"),\n limit,\n cursor\n }),\n (data) => {\n if (ctx.json) {\n return;\n }\n renderReminderListPage(data.items, {\n label: \"\u63D0\u9192\",\n totalCount: data.totalCount,\n hasMore: data.hasMore,\n nextCursor: data.nextCursor,\n nextPageHint: \"ai-todo reminder list\"\n });\n }\n );\n}\n\nexport async function runReminderShow(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"show\");\n if (!id) {\n console.error(\"Usage: ai-todo reminder show <reminder_id>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.getReminder(id), (data) => {\n if (ctx.json) {\n return;\n }\n const r = data.reminder;\n console.log(`${r.title} (${r.id})`);\n console.log(`\u72B6\u6001\uFF1A${r.status}`);\n if (r.dueAt) {\n console.log(`\u622A\u6B62\uFF1A${r.dueAt}`);\n }\n if (r.remindAt) {\n console.log(`\u901A\u77E5\uFF1A${r.remindAt}`);\n }\n if (r.notes) {\n console.log(`\u5907\u6CE8\uFF1A${r.notes}`);\n }\n if (r.contacts && r.contacts.length > 0) {\n console.log(\n `\u8054\u7CFB\u4EBA\uFF1A${r.contacts.map((c) => `${c.displayName} (@${c.handle})`).join(\", \")}`\n );\n }\n });\n}\n\nexport async function runReminderDone(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"done\", \"complete\");\n if (!id) {\n console.error(\"Usage: ai-todo reminder done <reminder_id>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.completeReminder(id), (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u5B8C\u6210\u63D0\u9192\uFF1A${data.reminder.title}`);\n console.log(`ID\uFF1A${data.reminder.id}`);\n }\n });\n}\n\nexport async function runReminderUpdate(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"update\");\n if (!id) {\n console.error(\n \"Usage: ai-todo reminder update <reminder_id> [--title <text>] [--notes <text>] [--due <iso>] [--remind <iso>] [--contact <contact_id_or_handle> ...]\"\n );\n process.exitCode = 1;\n return;\n }\n const title = readFlagValue(argv, \"--title\");\n const notes = readFlagValue(argv, \"--notes\");\n const due = readFlagValue(argv, \"--due\");\n const remind = readFlagValue(argv, \"--remind\");\n const contactIds = readRepeatedFlag(argv, \"--contact\");\n const hasContacts = hasFlag(argv, \"--contact\");\n const hasNotes = hasFlag(argv, \"--notes\");\n\n if (\n !title &&\n notes === undefined &&\n due === undefined &&\n remind === undefined &&\n !hasContacts\n ) {\n console.error(\"Provide at least one field to update\");\n process.exitCode = 1;\n return;\n }\n await handleApi(\n ctx,\n await ctx.client.updateReminder(id, {\n title,\n notes: hasNotes ? notes : undefined,\n dueAt: due,\n remindAt: remind,\n contactIds: hasContacts ? contactIds : undefined\n }),\n (data) => {\n if (!ctx.json) {\n const r = data.reminder;\n console.log(`\u5DF2\u66F4\u65B0\u63D0\u9192\uFF1A${r.title} (${r.id})`);\n if (r.dueAt) {\n console.log(`\u622A\u6B62\uFF1A${r.dueAt}`);\n }\n if (r.remindAt) {\n console.log(`\u901A\u77E5\uFF1A${r.remindAt}`);\n }\n }\n }\n );\n}\n\nexport async function runReminderReschedule(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"reschedule\");\n const due = readFlagValue(argv, \"--due\");\n const remind = readFlagValue(argv, \"--remind\");\n if (!id || (!due && !remind)) {\n console.error(\"Usage: ai-todo reminder reschedule <reminder_id> --due <iso> [--remind <iso>]\");\n process.exitCode = 1;\n return;\n }\n await handleApi(\n ctx,\n await ctx.client.rescheduleReminder(id, { dueAt: due, remindAt: remind }),\n (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u6539\u671F\uFF1A${data.reminder.title}`);\n if (data.reminder.dueAt) {\n console.log(`\u65B0\u622A\u6B62\uFF1A${data.reminder.dueAt}`);\n }\n }\n }\n );\n}\n\nexport async function runReminderDelete(ctx: CliContext, argv: string[]): Promise<void> {\n const id = positionalAfter(argv, \"delete\");\n if (!id) {\n console.error(\"Usage: ai-todo reminder delete <reminder_id>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.deleteReminder(id), (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u5220\u9664\u63D0\u9192\uFF1A${data.id}`);\n }\n });\n}\n\ndeclare const process: { exitCode?: number };\n", "import type { ApiTokenSummary, CreateApiTokenInput } from \"@ai-todo/shared\";\n\nimport type { CliContext } from \"../context\";\nimport { handleApi, readFlagValue } from \"../context\";\n\nfunction readTokenName(argv: string[]): string | undefined {\n return readFlagValue(argv, \"--name\");\n}\n\nfunction readMaxIdleDays(argv: string[]): number | undefined {\n const raw = readFlagValue(argv, \"--max-idle-days\");\n if (!raw) {\n return undefined;\n }\n const value = Number(raw);\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(\"--max-idle-days must be a positive integer.\");\n }\n return value;\n}\n\nfunction readScopes(argv: string[]): string[] | undefined {\n const raw = readFlagValue(argv, \"--scopes\");\n if (!raw) {\n return undefined;\n }\n return raw\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction statusLabel(status: ApiTokenSummary[\"status\"]): string {\n switch (status) {\n case \"active\":\n return \"\u6709\u6548\";\n case \"expired\":\n return \"\u5DF2\u8FC7\u671F\";\n case \"idle_revoked\":\n return \"\u4E45\u672A\u4F7F\u7528\u5931\u6548\";\n case \"revoked\":\n return \"\u5DF2\u540A\u9500\";\n default:\n return status;\n }\n}\n\nfunction formatDate(value?: string): string {\n return value ?? \"-\";\n}\n\nexport async function runTokenList(ctx: CliContext): Promise<void> {\n await handleApi(ctx, await ctx.client.listApiTokens(), (data) => {\n if (ctx.json) {\n return;\n }\n if (data.items.length === 0) {\n console.log(\"\u6682\u65E0\u8BBF\u95EE\u4EE4\u724C\u3002\");\n return;\n }\n for (const item of data.items) {\n console.log(`${item.id} ${item.name} ${statusLabel(item.status)}`);\n console.log(` \u63D0\u793A\uFF1A${item.tokenHint ?? \"aitodo_****\"}`);\n console.log(` \u521B\u5EFA\uFF1A${formatDate(item.createdAt)} \u6700\u540E\u4F7F\u7528\uFF1A${formatDate(item.lastUsedAt)}`);\n console.log(\n ` \u5230\u671F\uFF1A${formatDate(item.expiresAt)} \u7A7A\u95F2\u5931\u6548\uFF1A${\n item.maxIdleDays ? `${item.maxIdleDays} \u5929` : \"-\"\n }`\n );\n }\n });\n}\n\nexport async function runTokenCreate(ctx: CliContext, argv: string[]): Promise<void> {\n const name = readTokenName(argv);\n if (!name) {\n console.error(\"Usage: ai-todo token create --name <text> [--expires-at <iso>] [--max-idle-days <days>]\");\n process.exitCode = 1;\n return;\n }\n\n let maxIdleDays: number | undefined;\n try {\n maxIdleDays = readMaxIdleDays(argv);\n } catch (error) {\n console.error(error instanceof Error ? error.message : \"Invalid --max-idle-days.\");\n process.exitCode = 1;\n return;\n }\n\n const input: CreateApiTokenInput = {\n name,\n scopes: readScopes(argv),\n expiresAt: readFlagValue(argv, \"--expires-at\"),\n maxIdleDays\n };\n\n await handleApi(ctx, await ctx.client.createApiToken(input), (data) => {\n if (ctx.json) {\n return;\n }\n console.log(\"\u5DF2\u521B\u5EFA\u8BBF\u95EE\u4EE4\u724C\uFF08\u4EC5\u663E\u793A\u4E00\u6B21\uFF0C\u8BF7\u59A5\u5584\u4FDD\u7BA1\uFF09\uFF1A\");\n console.log(\"\");\n console.log(data.token);\n console.log(\"\");\n console.log(`ID\uFF1A${data.id}`);\n console.log(`\u540D\u79F0\uFF1A${data.name}`);\n console.log(`\u5230\u671F\uFF1A${data.expiresAt ?? \"-\"}`);\n console.log(`\u7A7A\u95F2\u5931\u6548\uFF1A${data.maxIdleDays ? `${data.maxIdleDays} \u5929` : \"-\"}`);\n });\n}\n\nexport async function runTokenRevoke(ctx: CliContext, argv: string[]): Promise<void> {\n const tokenId = argv[2];\n if (!tokenId) {\n console.error(\"Usage: ai-todo token revoke <token_id>\");\n process.exitCode = 1;\n return;\n }\n await handleApi(ctx, await ctx.client.revokeApiToken(tokenId), (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u540A\u9500\u8BBF\u95EE\u4EE4\u724C\uFF1A${data.id}`);\n }\n });\n}\n\nexport async function runTokenRevokeAll(ctx: CliContext): Promise<void> {\n await handleApi(ctx, await ctx.client.revokeAllApiTokens(), (data) => {\n if (!ctx.json) {\n console.log(`\u5DF2\u540A\u9500 ${data.revokedCount} \u4E2A\u8BBF\u95EE\u4EE4\u724C\u3002`);\n }\n });\n}\n\ndeclare const process: {\n exitCode?: number;\n};\n", "#!/usr/bin/env node\n\nimport { buildContext } from \"./context\";\nimport { printHelp } from \"./help\";\nimport * as calendar from \"./commands/calendar\";\nimport * as contact from \"./commands/contact\";\nimport * as core from \"./commands/core\";\nimport * as reminder from \"./commands/reminder\";\nimport * as token from \"./commands/token\";\n\nconst argv = process.argv.slice(2);\nconst command = argv[0] ?? \"help\";\nconst sub = argv[1];\nconst ctx = buildContext(argv);\n\nasync function main(): Promise<void> {\n switch (command) {\n case \"help\":\n case \"--help\":\n case \"-h\":\n printHelp();\n break;\n case \"login\":\n await core.runLogin(ctx, argv);\n break;\n case \"version\":\n await core.runVersion(ctx);\n break;\n case \"whoami\":\n await core.runWhoami(ctx);\n break;\n case \"profile\":\n console.error(\"\u4E2A\u4EBA\u8D44\u6599\u8BF7\u5728\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\u300C\u6211\u7684\u300D\u4E2D\u4FEE\u6539\uFF0CCLI \u4E0D\u63D0\u4F9B profile \u547D\u4EE4\u3002\");\n process.exitCode = 1;\n break;\n case \"logout\":\n await core.runLogout(ctx);\n break;\n case \"token\": {\n const action = sub ?? \"help\";\n if (action === \"list\") {\n await token.runTokenList(ctx);\n } else if (action === \"create\") {\n await token.runTokenCreate(ctx, argv);\n } else if (action === \"revoke\") {\n await token.runTokenRevoke(ctx, argv);\n } else if (action === \"revoke-all\") {\n await token.runTokenRevokeAll(ctx);\n } else {\n console.error(\"Usage: ai-todo token <list|create|revoke|revoke-all>\");\n process.exitCode = 1;\n }\n break;\n }\n case \"today\":\n await core.runToday(ctx);\n break;\n case \"add\":\n await reminder.runReminderCreate(ctx, argv);\n break;\n case \"list\":\n await reminder.runReminderList(ctx, argv);\n break;\n case \"done\":\n await reminder.runReminderDone(ctx, argv);\n break;\n case \"reschedule\":\n await reminder.runReminderReschedule(ctx, argv);\n break;\n case \"reminder\": {\n const action = sub ?? \"help\";\n if (action === \"create\") {\n await reminder.runReminderCreate(ctx, argv);\n } else if (action === \"list\") {\n await reminder.runReminderList(ctx, argv);\n } else if (action === \"show\") {\n await reminder.runReminderShow(ctx, argv);\n } else if (action === \"done\" || action === \"complete\") {\n await reminder.runReminderDone(ctx, argv);\n } else if (action === \"update\") {\n await reminder.runReminderUpdate(ctx, argv);\n } else if (action === \"reschedule\") {\n await reminder.runReminderReschedule(ctx, argv);\n } else if (action === \"delete\") {\n await reminder.runReminderDelete(ctx, argv);\n } else {\n console.error(\"Usage: ai-todo reminder <create|list|show|done|update|reschedule|delete>\");\n process.exitCode = 1;\n }\n break;\n }\n case \"calendar\": {\n const action = sub ?? \"help\";\n if (action === \"today\") {\n await calendar.runCalendarToday(ctx);\n } else if (action === \"list\") {\n await calendar.runCalendarList(ctx, argv);\n } else if (action === \"add\") {\n await calendar.runCalendarAdd(ctx, argv);\n } else if (action === \"show\") {\n await calendar.runCalendarShow(ctx, argv);\n } else if (action === \"delete\") {\n await calendar.runCalendarDelete(ctx, argv);\n } else if (action === \"update\") {\n await calendar.runCalendarUpdate(ctx, argv);\n } else {\n console.error(\"Usage: ai-todo calendar <today|list|add|show|update|delete>\");\n process.exitCode = 1;\n }\n break;\n }\n case \"contact\": {\n const action = sub ?? \"help\";\n if (action === \"add\") {\n await contact.runContactAdd(ctx, argv);\n } else if (action === \"list\") {\n await contact.runContactList(ctx, argv);\n } else if (action === \"search\") {\n await contact.runContactSearch(ctx, argv);\n } else if (action === \"show\") {\n await contact.runContactShow(ctx, argv);\n } else if (action === \"update\") {\n await contact.runContactUpdate(ctx, argv);\n } else if (action === \"delete\") {\n await contact.runContactDelete(ctx, argv);\n } else {\n console.error(\"Usage: ai-todo contact <add|list|search|show|update|delete>\");\n process.exitCode = 1;\n }\n break;\n }\n default:\n console.error(`Unknown command: ${command}`);\n printHelp();\n process.exitCode = 1;\n }\n}\n\nmain().catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : \"Unexpected CLI error.\");\n process.exitCode = 1;\n});\n\ndeclare const process: {\n argv: string[];\n exitCode?: number;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "argv", "ctx", "argv", "ctx", "argv", "ctx", "argv", "argv", "ctx", "ctx", "argv", "argv", "ctx"]
|
|
7
7
|
}
|
package/package.json
CHANGED
package/settings.example.json
CHANGED