@vat-mcp/daily-report 1.0.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -0
- package/dist/index.js +8 -10
- package/dist/index.js.map +1 -1
- package/dist/services/api.d.ts +5 -5
- package/dist/services/api.d.ts.map +1 -1
- package/dist/services/api.js +6 -11
- package/dist/services/api.js.map +1 -1
- package/dist/tools/kintai.d.ts +2 -2
- package/dist/tools/kintai.d.ts.map +1 -1
- package/dist/tools/kintai.js +4 -4
- package/dist/tools/kintai.js.map +1 -1
- package/dist/tools/report.d.ts +2 -2
- package/dist/tools/report.d.ts.map +1 -1
- package/dist/tools/report.js +6 -6
- package/dist/tools/report.js.map +1 -1
- package/dist/tools/task.d.ts +1 -1
- package/dist/tools/task.d.ts.map +1 -1
- package/dist/tools/task.js +2 -2
- package/dist/tools/task.js.map +1 -1
- package/dist/utils/auth.d.ts +4 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +50 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/request.d.ts +1 -6
- package/dist/utils/request.d.ts.map +1 -1
- package/dist/utils/request.js +30 -26
- package/dist/utils/request.js.map +1 -1
- package/package.json +3 -2
package/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# @vat-mcp/daily-report
|
|
2
|
+
|
|
3
|
+
MCP Server for daily report system(日报 MCP 服务)。
|
|
4
|
+
|
|
5
|
+
## 安装与配置
|
|
6
|
+
|
|
7
|
+
在 VS Code 的 `mcp.json`(用户全局:`%APPDATA%\Code\User\mcp.json`,或工作区:`.vscode/mcp.json`)中添加以下配置:
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"servers": {
|
|
12
|
+
"daily-report": {
|
|
13
|
+
"type": "stdio",
|
|
14
|
+
"command": "npx",
|
|
15
|
+
"args": ["-y", "@vat-mcp/daily-report"],
|
|
16
|
+
"env": {
|
|
17
|
+
"SMS_TOKEN": "${input:sms_token}",
|
|
18
|
+
"SMS_BASE_URL": "${input:sms_base_url}"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"inputs": [
|
|
23
|
+
{
|
|
24
|
+
"id": "sms_token",
|
|
25
|
+
"type": "promptString",
|
|
26
|
+
"description": "SMS Bearer Token(SMS_TOKEN)",
|
|
27
|
+
"password": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "sms_base_url",
|
|
31
|
+
"type": "promptString",
|
|
32
|
+
"description": "SMS API 地址(SMS_BASE_URL),例如 https://your-domain.com"
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
配置完成后,VS Code 启动 MCP 服务时会弹出输入框,填入 Token 和 API 地址即可。
|
|
39
|
+
|
|
40
|
+
## 环境变量
|
|
41
|
+
|
|
42
|
+
| 变量名 | 必填 | 说明 |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| `SMS_TOKEN` | 是 | Bearer 认证 Token |
|
|
45
|
+
| `SMS_BASE_URL` | 是 | API 服务器地址,如 `https://your-domain.com` |
|
|
46
|
+
|
|
47
|
+
## 提供的工具
|
|
48
|
+
|
|
49
|
+
| 工具名 | 说明 |
|
|
50
|
+
|---|---|
|
|
51
|
+
| `get_missing_dates` | 查询未填写日报的日期列表 |
|
|
52
|
+
| `get_kintai_by_date` | 查询指定日期的考勤记录 |
|
|
53
|
+
| `get_tasks` | 查询任务列表 |
|
|
54
|
+
| `get_reports_by_kintai` | 根据考勤查询日报 |
|
|
55
|
+
| `submit_daily_report` | 提交日报 |
|
package/dist/index.js
CHANGED
|
@@ -6,10 +6,8 @@ import { handleGetMissingDates, handleGetKintaiByDate } from "./tools/kintai.js"
|
|
|
6
6
|
import { handleGetTasks } from "./tools/task.js";
|
|
7
7
|
import { handleGetReportsByKintai, handleSubmitDailyReport, } from "./tools/report.js";
|
|
8
8
|
// ── 环境变量校验 ──────────────────────────────────────────────
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
console.error("[Error] 环境变量 SMS_TOKEN 未设置,服务无法启动。");
|
|
12
|
-
console.error(" 用法: SMS_TOKEN=<your_bearer_token> node dist/index.js");
|
|
9
|
+
if (!process.env.SMS_USERNAME || !process.env.SMS_PASSWORD) {
|
|
10
|
+
console.error("[Error] 环境变量 SMS_USERNAME 或 SMS_PASSWORD 未设置,服务无法启动。");
|
|
13
11
|
process.exit(1);
|
|
14
12
|
}
|
|
15
13
|
if (!process.env.SMS_BASE_URL) {
|
|
@@ -39,11 +37,11 @@ async function runTool(fn) {
|
|
|
39
37
|
// ── Tool 1: get_missing_dates ─────────────────────────────────
|
|
40
38
|
server.registerTool("get_missing_dates", {
|
|
41
39
|
description: "查询未填写日报的日期列表,返回所有需要补填日报的日期",
|
|
42
|
-
}, async () => runTool(() => handleGetMissingDates(
|
|
40
|
+
}, async () => runTool(() => handleGetMissingDates()));
|
|
43
41
|
// ── Tool 2: get_tasks ─────────────────────────────────────────
|
|
44
42
|
server.registerTool("get_tasks", {
|
|
45
43
|
description: "获取当前用户的工作任务列表(项目列表),提交日报时必须选择其中一个 proposalId",
|
|
46
|
-
}, async () => runTool(() => handleGetTasks(
|
|
44
|
+
}, async () => runTool(() => handleGetTasks()));
|
|
47
45
|
// ── Tool 3: get_kintai_by_date ────────────────────────────────
|
|
48
46
|
server.registerTool("get_kintai_by_date", {
|
|
49
47
|
description: "根据日期获取考勤信息(包含 kintaiId),日期格式为 YYYY/MM/DD",
|
|
@@ -53,7 +51,7 @@ server.registerTool("get_kintai_by_date", {
|
|
|
53
51
|
.regex(/^\d{4}\/\d{2}\/\d{2}$/, "日期格式必须为 YYYY/MM/DD")
|
|
54
52
|
.describe("日期,格式 YYYY/MM/DD,例如 2026/03/19"),
|
|
55
53
|
},
|
|
56
|
-
}, async ({ date }) => runTool(() => handleGetKintaiByDate(
|
|
54
|
+
}, async ({ date }) => runTool(() => handleGetKintaiByDate(date)));
|
|
57
55
|
// ── Tool 4: get_reports_by_kintai ─────────────────────────────
|
|
58
56
|
server.registerTool("get_reports_by_kintai", {
|
|
59
57
|
description: "根据考勤ID查询该天已有的日报列表,用于在提交前确认是否已存在日报",
|
|
@@ -64,7 +62,7 @@ server.registerTool("get_reports_by_kintai", {
|
|
|
64
62
|
.positive()
|
|
65
63
|
.describe("考勤记录ID,从 get_kintai_by_date 返回结果中获取"),
|
|
66
64
|
},
|
|
67
|
-
}, async ({ kintaiId }) => runTool(() => handleGetReportsByKintai(
|
|
65
|
+
}, async ({ kintaiId }) => runTool(() => handleGetReportsByKintai(kintaiId)));
|
|
68
66
|
// ── Tool 5: submit_daily_report ───────────────────────────────
|
|
69
67
|
server.registerTool("submit_daily_report", {
|
|
70
68
|
description: [
|
|
@@ -84,11 +82,11 @@ server.registerTool("submit_daily_report", {
|
|
|
84
82
|
.int()
|
|
85
83
|
.positive()
|
|
86
84
|
.describe("项目ID(必填),从 get_tasks 返回的 proposalId 字段获取"),
|
|
87
|
-
workName: z.string().min(1).describe("
|
|
85
|
+
workName: z.string().min(1).max(30).describe("工作摘要/标题(最多50字)"),
|
|
88
86
|
workTime: z.string().min(1).describe("工时,例如 '8.0' 或 '4.5'"),
|
|
89
87
|
memo: z.string().min(1).describe("日报正文内容(具体工作描述)"),
|
|
90
88
|
},
|
|
91
|
-
}, async ({ date, proposalId, workName, workTime, memo }) => runTool(() => handleSubmitDailyReport(
|
|
89
|
+
}, async ({ date, proposalId, workName, workTime, memo }) => runTool(() => handleSubmitDailyReport({
|
|
92
90
|
date,
|
|
93
91
|
proposalId,
|
|
94
92
|
workName,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,2DAA2D;AAC3D,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/services/api.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ApiResponse, MissingDateItem, WorkTask, KintaiDetail, DailyReport, SubmitReportPayload } from "../types/index.js";
|
|
2
|
-
export declare function getMissingDates(
|
|
3
|
-
export declare function getTasksByUser(
|
|
4
|
-
export declare function getKintaiByDate(
|
|
5
|
-
export declare function getReportsByKintai(
|
|
6
|
-
export declare function addDailyReport(
|
|
2
|
+
export declare function getMissingDates(): Promise<MissingDateItem[]>;
|
|
3
|
+
export declare function getTasksByUser(): Promise<WorkTask[]>;
|
|
4
|
+
export declare function getKintaiByDate(date: string): Promise<KintaiDetail>;
|
|
5
|
+
export declare function getReportsByKintai(kintaiId: number): Promise<DailyReport[]>;
|
|
6
|
+
export declare function addDailyReport(payload: SubmitReportPayload): Promise<ApiResponse<unknown>>;
|
|
7
7
|
//# sourceMappingURL=api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAG3B,wBAAsB,eAAe,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAG3B,wBAAsB,eAAe,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAQlE;AAGD,wBAAsB,cAAc,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAQ1D;AAGD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAYzE;AAGD,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CASjF;AAGD,wBAAsB,cAAc,CAClC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAQ/B"}
|
package/dist/services/api.js
CHANGED
|
@@ -1,26 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { client } from "../utils/request.js";
|
|
2
2
|
// ── 1. 查询未填写日报的日期 ────────────────────────────────────
|
|
3
|
-
export async function getMissingDates(
|
|
3
|
+
export async function getMissingDates() {
|
|
4
4
|
console.error("[API] getMissingDates → GET /smsapi/kintaiAdmin/application/checkLeaveWork");
|
|
5
|
-
const client = createApiClient(token);
|
|
6
5
|
const res = await client.get("/smsapi/kintaiAdmin/application/checkLeaveWork");
|
|
7
6
|
const data = res.data.data ?? [];
|
|
8
7
|
console.error(`[API] getMissingDates ← ${data.length} item(s)`);
|
|
9
8
|
return data;
|
|
10
9
|
}
|
|
11
10
|
// ── 2. 获取当前用户工作任务列表 ────────────────────────────────
|
|
12
|
-
export async function getTasksByUser(
|
|
11
|
+
export async function getTasksByUser() {
|
|
13
12
|
console.error("[API] getTasksByUser → GET /smsapi/projectWorkTask/getListByUser");
|
|
14
|
-
const client = createApiClient(token);
|
|
15
13
|
const res = await client.get("/smsapi/projectWorkTask/getListByUser");
|
|
16
14
|
const data = res.data.data ?? [];
|
|
17
15
|
console.error(`[API] getTasksByUser ← ${data.length} task(s)`);
|
|
18
16
|
return data;
|
|
19
17
|
}
|
|
20
18
|
// ── 3. 根据日期获取考勤信息 ────────────────────────────────────
|
|
21
|
-
export async function getKintaiByDate(
|
|
19
|
+
export async function getKintaiByDate(date) {
|
|
22
20
|
console.error(`[API] getKintaiByDate → GET /smsapi/kintaiAdmin/getDetail?time=${date}`);
|
|
23
|
-
const client = createApiClient(token);
|
|
24
21
|
const res = await client.get("/smsapi/kintaiAdmin/getDetail", { params: { time: date } });
|
|
25
22
|
const data = res.data.data;
|
|
26
23
|
if (!data || !data.kintaiId) {
|
|
@@ -30,18 +27,16 @@ export async function getKintaiByDate(token, date) {
|
|
|
30
27
|
return data;
|
|
31
28
|
}
|
|
32
29
|
// ── 4. 根据考勤ID获取日报列表 ──────────────────────────────────
|
|
33
|
-
export async function getReportsByKintai(
|
|
30
|
+
export async function getReportsByKintai(kintaiId) {
|
|
34
31
|
console.error(`[API] getReportsByKintai → GET /smsapi/kintaiWorkAdmin/getList?kintaiId=${kintaiId}`);
|
|
35
|
-
const client = createApiClient(token);
|
|
36
32
|
const res = await client.get("/smsapi/kintaiWorkAdmin/getList", { params: { kintaiId } });
|
|
37
33
|
const data = res.data.data ?? [];
|
|
38
34
|
console.error(`[API] getReportsByKintai ← ${data.length} report(s)`);
|
|
39
35
|
return data;
|
|
40
36
|
}
|
|
41
37
|
// ── 5. 添加日报 ───────────────────────────────────────────────
|
|
42
|
-
export async function addDailyReport(
|
|
38
|
+
export async function addDailyReport(payload) {
|
|
43
39
|
console.error(`[API] addDailyReport → POST /smsapi/kintaiWorkAdmin/doAdd (kintaiId=${payload.kintaiId})`);
|
|
44
|
-
const client = createApiClient(token);
|
|
45
40
|
const res = await client.post("/smsapi/kintaiWorkAdmin/doAdd", payload);
|
|
46
41
|
console.error(`[API] addDailyReport ← code=${res.data.code} message=${res.data.message}`);
|
|
47
42
|
return res.data;
|
package/dist/services/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAU7C,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAC5F,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAC1B,gDAAgD,CACjD,CAAC;IACF,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACjC,OAAO,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;IAClF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAC1B,uCAAuC,CACxC,CAAC;IACF,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACjC,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,OAAO,CAAC,KAAK,CAAC,kEAAkE,IAAI,EAAE,CAAC,CAAC;IACxF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAC1B,+BAA+B,EAC/B,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAC3B,CAAC;IACF,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,oCAAoC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,OAAO,CAAC,KAAK,CAAC,2EAA2E,QAAQ,EAAE,CAAC,CAAC;IACrG,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAC1B,iCAAiC,EACjC,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,CACzB,CAAC;IACF,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACjC,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,CAAC,MAAM,YAAY,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA4B;IAE5B,OAAO,CAAC,KAAK,CAAC,uEAAuE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC1G,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAC3B,+BAA+B,EAC/B,OAAO,CACR,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,CAAC,IAAI,CAAC,IAAI,YAAY,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1F,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC"}
|
package/dist/tools/kintai.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare function handleGetMissingDates(
|
|
2
|
-
export declare function handleGetKintaiByDate(
|
|
1
|
+
export declare function handleGetMissingDates(): Promise<string>;
|
|
2
|
+
export declare function handleGetKintaiByDate(date: string): Promise<string>;
|
|
3
3
|
//# sourceMappingURL=kintai.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kintai.d.ts","sourceRoot":"","sources":["../../src/tools/kintai.ts"],"names":[],"mappings":"AAGA,wBAAsB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"kintai.d.ts","sourceRoot":"","sources":["../../src/tools/kintai.ts"],"names":[],"mappings":"AAGA,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAW7D;AAGD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKzE"}
|
package/dist/tools/kintai.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getMissingDates, getKintaiByDate } from "../services/api.js";
|
|
2
2
|
// ── get_missing_dates ─────────────────────────────────────────
|
|
3
|
-
export async function handleGetMissingDates(
|
|
3
|
+
export async function handleGetMissingDates() {
|
|
4
4
|
console.error("[Tool] get_missing_dates: start");
|
|
5
|
-
const dates = await getMissingDates(
|
|
5
|
+
const dates = await getMissingDates();
|
|
6
6
|
if (dates.length === 0) {
|
|
7
7
|
console.error("[Tool] get_missing_dates: no missing dates found");
|
|
8
8
|
return "所有日期均已填写日报,无需补填。";
|
|
@@ -11,9 +11,9 @@ export async function handleGetMissingDates(token) {
|
|
|
11
11
|
return JSON.stringify({ count: dates.length, dates }, null, 2);
|
|
12
12
|
}
|
|
13
13
|
// ── get_kintai_by_date ────────────────────────────────────────
|
|
14
|
-
export async function handleGetKintaiByDate(
|
|
14
|
+
export async function handleGetKintaiByDate(date) {
|
|
15
15
|
console.error(`[Tool] get_kintai_by_date: date=${date}`);
|
|
16
|
-
const kintai = await getKintaiByDate(
|
|
16
|
+
const kintai = await getKintaiByDate(date);
|
|
17
17
|
console.error(`[Tool] get_kintai_by_date: kintaiId=${kintai.kintaiId}`);
|
|
18
18
|
return JSON.stringify(kintai, null, 2);
|
|
19
19
|
}
|
package/dist/tools/kintai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kintai.js","sourceRoot":"","sources":["../../src/tools/kintai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEtE,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,qBAAqB
|
|
1
|
+
{"version":3,"file":"kintai.js","sourceRoot":"","sources":["../../src/tools/kintai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEtE,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IAEtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,6BAA6B,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY;IACtD,OAAO,CAAC,KAAK,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,KAAK,CAAC,uCAAuC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/tools/report.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { SubmitReportParams } from "../types/index.js";
|
|
2
|
-
export declare function handleGetReportsByKintai(
|
|
3
|
-
export declare function handleSubmitDailyReport(
|
|
2
|
+
export declare function handleGetReportsByKintai(kintaiId: number): Promise<string>;
|
|
3
|
+
export declare function handleSubmitDailyReport(params: SubmitReportParams): Promise<string>;
|
|
4
4
|
//# sourceMappingURL=report.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/tools/report.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,wBAAsB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/tools/report.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,wBAAsB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWhF;AAGD,wBAAsB,uBAAuB,CAE3C,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,MAAM,CAAC,CAmDjB"}
|
package/dist/tools/report.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getReportsByKintai, getKintaiByDate, addDailyReport, } from "../services/api.js";
|
|
2
2
|
// ── get_reports_by_kintai ─────────────────────────────────────
|
|
3
|
-
export async function handleGetReportsByKintai(
|
|
3
|
+
export async function handleGetReportsByKintai(kintaiId) {
|
|
4
4
|
console.error(`[Tool] get_reports_by_kintai: kintaiId=${kintaiId}`);
|
|
5
|
-
const reports = await getReportsByKintai(
|
|
5
|
+
const reports = await getReportsByKintai(kintaiId);
|
|
6
6
|
if (reports.length === 0) {
|
|
7
7
|
console.error(`[Tool] get_reports_by_kintai: no reports for kintaiId=${kintaiId}`);
|
|
8
8
|
return `kintaiId=${kintaiId} 当天暂无日报记录。`;
|
|
@@ -11,17 +11,17 @@ export async function handleGetReportsByKintai(token, kintaiId) {
|
|
|
11
11
|
return JSON.stringify({ count: reports.length, reports }, null, 2);
|
|
12
12
|
}
|
|
13
13
|
// ── submit_daily_report ───────────────────────────────────────
|
|
14
|
-
export async function handleSubmitDailyReport(
|
|
14
|
+
export async function handleSubmitDailyReport(params) {
|
|
15
15
|
const { date, proposalId, workName, workTime, memo } = params;
|
|
16
16
|
console.error(`[Tool] submit_daily_report: date=${date} proposalId=${proposalId}`);
|
|
17
17
|
// Step 1: 根据日期获取 kintaiId
|
|
18
18
|
console.error("[Tool] submit_daily_report: [1/3] fetching kintaiId...");
|
|
19
|
-
const kintai = await getKintaiByDate(
|
|
19
|
+
const kintai = await getKintaiByDate(date);
|
|
20
20
|
const kintaiId = kintai.kintaiId;
|
|
21
21
|
console.error(`[Tool] submit_daily_report: kintaiId=${kintaiId}`);
|
|
22
22
|
// Step 2: 检查是否已有日报(避免重复提交)
|
|
23
23
|
console.error("[Tool] submit_daily_report: [2/3] checking existing reports...");
|
|
24
|
-
const existingReports = await getReportsByKintai(
|
|
24
|
+
const existingReports = await getReportsByKintai(kintaiId);
|
|
25
25
|
if (existingReports.length > 0) {
|
|
26
26
|
console.error(`[Tool] submit_daily_report: already has ${existingReports.length} report(s), aborting`);
|
|
27
27
|
return JSON.stringify({
|
|
@@ -32,7 +32,7 @@ export async function handleSubmitDailyReport(token, params) {
|
|
|
32
32
|
}
|
|
33
33
|
// Step 3: 提交日报
|
|
34
34
|
console.error("[Tool] submit_daily_report: [3/3] submitting report...");
|
|
35
|
-
const result = await addDailyReport(
|
|
35
|
+
const result = await addDailyReport({
|
|
36
36
|
workContents: 4,
|
|
37
37
|
kintaiId,
|
|
38
38
|
proposalId,
|
package/dist/tools/report.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/tools/report.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,wBAAwB,
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/tools/report.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,QAAgB;IAC7D,OAAO,CAAC,KAAK,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAEnD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,yDAAyD,QAAQ,EAAE,CAAC,CAAC;QACnF,OAAO,YAAY,QAAQ,YAAY,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,iCAAiC,OAAO,CAAC,MAAM,kBAAkB,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAE3C,MAA0B;IAE1B,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAC9D,OAAO,CAAC,KAAK,CACX,oCAAoC,IAAI,eAAe,UAAU,EAAE,CACpE,CAAC;IAEF,0BAA0B;IAC1B,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,OAAO,CAAC,KAAK,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;IAElE,2BAA2B;IAC3B,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAChF,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC3D,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CACX,2CAA2C,eAAe,CAAC,MAAM,sBAAsB,CACxF,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,YAAY,IAAI,SAAS,eAAe,CAAC,MAAM,gBAAgB;YACxE,eAAe;SAChB,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,eAAe;IACf,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;QAClC,YAAY,EAAE,CAAC;QACf,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,QAAQ;QACR,IAAI;KACL,CAAC,CAAC;IAEH,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,YAAY,IAAI,EAAE;QAC3B,MAAM;KACP,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/tools/task.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function handleGetTasks(
|
|
1
|
+
export declare function handleGetTasks(): Promise<string>;
|
|
2
2
|
//# sourceMappingURL=task.d.ts.map
|
package/dist/tools/task.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/tools/task.ts"],"names":[],"mappings":"AAGA,wBAAsB,cAAc,
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/tools/task.ts"],"names":[],"mappings":"AAGA,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAWtD"}
|
package/dist/tools/task.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getTasksByUser } from "../services/api.js";
|
|
2
2
|
// ── get_tasks ─────────────────────────────────────────────────
|
|
3
|
-
export async function handleGetTasks(
|
|
3
|
+
export async function handleGetTasks() {
|
|
4
4
|
console.error("[Tool] get_tasks: start");
|
|
5
|
-
const tasks = await getTasksByUser(
|
|
5
|
+
const tasks = await getTasksByUser();
|
|
6
6
|
if (tasks.length === 0) {
|
|
7
7
|
console.error("[Tool] get_tasks: no tasks found");
|
|
8
8
|
return "当前用户没有可用的工作任务(项目)。";
|
package/dist/tools/task.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/tools/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,cAAc
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/tools/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;IAErC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,qBAAqB,KAAK,CAAC,MAAM,gBAAgB,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAuBA,wBAAsB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAkC7C;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAGhD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { publicEncrypt, constants } from "crypto";
|
|
3
|
+
const BASE_URL = process.env.SMS_BASE_URL;
|
|
4
|
+
let cachedToken = null;
|
|
5
|
+
function buildPem(key) {
|
|
6
|
+
if (key.includes("-----BEGIN"))
|
|
7
|
+
return key;
|
|
8
|
+
const body = key.replace(/\s/g, "").match(/.{1,64}/g)?.join("\n") ?? key;
|
|
9
|
+
return `-----BEGIN PUBLIC KEY-----\n${body}\n-----END PUBLIC KEY-----`;
|
|
10
|
+
}
|
|
11
|
+
function rsaEncrypt(data, publicKey) {
|
|
12
|
+
const pem = buildPem(publicKey);
|
|
13
|
+
const encrypted = publicEncrypt({ key: pem, padding: constants.RSA_PKCS1_PADDING }, Buffer.from(data, "utf-8"));
|
|
14
|
+
return encrypted.toString("base64");
|
|
15
|
+
}
|
|
16
|
+
export async function login() {
|
|
17
|
+
const username = process.env.SMS_USERNAME;
|
|
18
|
+
const password = process.env.SMS_PASSWORD;
|
|
19
|
+
if (!username || !password) {
|
|
20
|
+
throw new Error("SMS_USERNAME 或 SMS_PASSWORD 未设置");
|
|
21
|
+
}
|
|
22
|
+
const http = axios.create({
|
|
23
|
+
baseURL: BASE_URL,
|
|
24
|
+
timeout: 30_000,
|
|
25
|
+
headers: { "Content-Type": "application/json" },
|
|
26
|
+
});
|
|
27
|
+
const pkRes = await http.get("/smsapi/publicKey");
|
|
28
|
+
if (pkRes.data.code !== 200) {
|
|
29
|
+
throw new Error(`获取公钥失败: ${pkRes.data.message}`);
|
|
30
|
+
}
|
|
31
|
+
const { publicKey, uuidKey } = pkRes.data.data;
|
|
32
|
+
const encryptedData = rsaEncrypt(JSON.stringify({ username, password }), publicKey);
|
|
33
|
+
const loginRes = await http.post("/smsapi/login", { data: encryptedData, uuidKey });
|
|
34
|
+
if (loginRes.data.code !== 200) {
|
|
35
|
+
throw new Error(`登录失败: ${loginRes.data.message}`);
|
|
36
|
+
}
|
|
37
|
+
cachedToken = loginRes.data.data.token;
|
|
38
|
+
console.error("[Auth] 登录成功,token 已缓存");
|
|
39
|
+
return cachedToken;
|
|
40
|
+
}
|
|
41
|
+
export async function getToken() {
|
|
42
|
+
if (cachedToken)
|
|
43
|
+
return cachedToken;
|
|
44
|
+
return login();
|
|
45
|
+
}
|
|
46
|
+
export function invalidateToken() {
|
|
47
|
+
console.error("[Auth] Token 失效,清除缓存");
|
|
48
|
+
cachedToken = null;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGlD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAE1C,IAAI,WAAW,GAAkB,IAAI,CAAC;AAEtC,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,GAAG,CAAC;IAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;IACzE,OAAO,+BAA+B,IAAI,4BAA4B,CAAC;AACzE,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,SAAiB;IACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,aAAa,CAC7B,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,iBAAiB,EAAE,EAClD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAC3B,CAAC;IACF,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC1C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;QACxB,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAC1B,mBAAmB,CACpB,CAAC;IACF,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAE/C,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAEpF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAC9B,eAAe,EACf,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CACjC,CAAC;IACF,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACvC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACvC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IACpC,OAAO,KAAK,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACtC,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC"}
|
package/dist/utils/request.d.ts
CHANGED
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* 创建带 Authorization 头的 Axios 实例。
|
|
4
|
-
* 所有日志输出到 stderr(避免干扰 MCP stdio 协议)。
|
|
5
|
-
*/
|
|
6
|
-
export declare function createApiClient(token: string): AxiosInstance;
|
|
1
|
+
export declare const client: import("axios").AxiosInstance;
|
|
7
2
|
//# sourceMappingURL=request.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/utils/request.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/utils/request.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,MAAM,+BAIjB,CAAC"}
|
package/dist/utils/request.js
CHANGED
|
@@ -1,30 +1,34 @@
|
|
|
1
1
|
import axios from "axios";
|
|
2
|
+
import { getToken, invalidateToken, login } from "./auth.js";
|
|
2
3
|
const BASE_URL = process.env.SMS_BASE_URL;
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
export const client = axios.create({
|
|
5
|
+
baseURL: BASE_URL,
|
|
6
|
+
timeout: 30_000,
|
|
7
|
+
headers: { "Content-Type": "application/json" },
|
|
8
|
+
});
|
|
9
|
+
// 请求拦截器:自动注入 token
|
|
10
|
+
client.interceptors.request.use(async (config) => {
|
|
11
|
+
const token = await getToken();
|
|
12
|
+
config.headers.Authorization = `Bearer ${token}`;
|
|
13
|
+
return config;
|
|
14
|
+
});
|
|
15
|
+
// 响应拦截器:401 时自动重新登录并重试一次
|
|
16
|
+
client.interceptors.response.use((response) => response, async (error) => {
|
|
17
|
+
const method = error.config?.method?.toUpperCase() ?? "?";
|
|
18
|
+
const url = error.config?.url ?? "?";
|
|
19
|
+
const status = error.response?.status ?? "network error";
|
|
20
|
+
console.error(`[HTTP Error] ${method} ${url} → ${status}: ${error.message}`);
|
|
21
|
+
if (error.config &&
|
|
22
|
+
!error.config.__retried &&
|
|
23
|
+
(error.response?.status === 401 ||
|
|
24
|
+
error.response?.data?.code === 401)) {
|
|
25
|
+
console.error("[Auth] 检测到 401,尝试重新登录...");
|
|
26
|
+
invalidateToken();
|
|
27
|
+
const newToken = await login();
|
|
28
|
+
error.config.__retried = true;
|
|
29
|
+
error.config.headers.Authorization = `Bearer ${newToken}`;
|
|
30
|
+
return client.request(error.config);
|
|
11
31
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
timeout: 30_000,
|
|
15
|
-
headers: {
|
|
16
|
-
"Content-Type": "application/json",
|
|
17
|
-
Authorization: `Bearer ${token}`,
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
// 响应拦截器:统一记录错误日志
|
|
21
|
-
client.interceptors.response.use((response) => response, (error) => {
|
|
22
|
-
const method = error.config?.method?.toUpperCase() ?? "?";
|
|
23
|
-
const url = error.config?.url ?? "?";
|
|
24
|
-
const status = error.response?.status ?? "network error";
|
|
25
|
-
console.error(`[HTTP Error] ${method} ${url} → ${status}: ${error.message}`);
|
|
26
|
-
return Promise.reject(error);
|
|
27
|
-
});
|
|
28
|
-
return client;
|
|
29
|
-
}
|
|
32
|
+
return Promise.reject(error);
|
|
33
|
+
});
|
|
30
34
|
//# sourceMappingURL=request.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/utils/request.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/utils/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAA2D,MAAM,OAAO,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAM7D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAE1C,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;CAChD,CAAC,CAAC;AAEH,mBAAmB;AACnB,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;IAC/C,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;IACjD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC,CAAC;AAEH,yBAAyB;AACzB,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC9B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,KAAK,EAAE,KAAiB,EAAE,EAAE;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC;IAC1D,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,eAAe,CAAC;IACzD,OAAO,CAAC,KAAK,CAAC,gBAAgB,MAAM,IAAI,GAAG,MAAM,MAAM,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7E,IACE,KAAK,CAAC,MAAM;QACZ,CAAE,KAAK,CAAC,MAA0B,CAAC,SAAS;QAC5C,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG;YAC5B,KAAK,CAAC,QAAQ,EAAE,IAAgC,EAAE,IAAI,KAAK,GAAG,CAAC,EAClE,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1C,eAAe,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,MAAM,KAAK,EAAE,CAAC;QAC9B,KAAK,CAAC,MAA0B,CAAC,SAAS,GAAG,IAAI,CAAC;QACnD,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,QAAQ,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC,CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vat-mcp/daily-report",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "MCP Server for daily report system",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
"vat-mcp-daily-report": "dist/index.js"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
|
-
"dist"
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
12
13
|
],
|
|
13
14
|
"keywords": [
|
|
14
15
|
"mcp",
|