@kansei-link/mcp-server 0.1.0 → 0.2.0
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/dist/db/schema.js +12 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/db/seed.js +55 -0
- package/dist/db/seed.js.map +1 -1
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/check-updates.d.ts +3 -0
- package/dist/tools/check-updates.js +81 -0
- package/dist/tools/check-updates.js.map +1 -0
- package/dist/tools/find-combinations.d.ts +4 -0
- package/dist/tools/find-combinations.js +105 -0
- package/dist/tools/find-combinations.js.map +1 -0
- package/dist/tools/search-services.js +159 -30
- package/dist/tools/search-services.js.map +1 -1
- package/dist/utils/pii-masker.js +16 -0
- package/dist/utils/pii-masker.js.map +1 -1
- package/package.json +1 -1
package/dist/db/schema.js
CHANGED
|
@@ -42,9 +42,21 @@ export function initializeDb(db) {
|
|
|
42
42
|
last_updated TEXT DEFAULT (datetime('now'))
|
|
43
43
|
);
|
|
44
44
|
|
|
45
|
+
CREATE TABLE IF NOT EXISTS service_changelog (
|
|
46
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
47
|
+
service_id TEXT NOT NULL REFERENCES services(id),
|
|
48
|
+
change_date TEXT NOT NULL,
|
|
49
|
+
change_type TEXT NOT NULL,
|
|
50
|
+
summary TEXT NOT NULL,
|
|
51
|
+
details TEXT,
|
|
52
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
53
|
+
);
|
|
54
|
+
|
|
45
55
|
CREATE INDEX IF NOT EXISTS idx_outcomes_service ON outcomes(service_id);
|
|
46
56
|
CREATE INDEX IF NOT EXISTS idx_outcomes_created ON outcomes(created_at);
|
|
47
57
|
CREATE INDEX IF NOT EXISTS idx_services_category ON services(category);
|
|
58
|
+
CREATE INDEX IF NOT EXISTS idx_changelog_service ON service_changelog(service_id);
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_changelog_date ON service_changelog(change_date);
|
|
48
60
|
`);
|
|
49
61
|
// FTS5 virtual table for full-text search on services
|
|
50
62
|
// Check if it already exists first (CREATE VIRTUAL TABLE IF NOT EXISTS not supported in all SQLite builds)
|
package/dist/db/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,EAAqB;IAChD,EAAE,CAAC,IAAI,CAAC
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,EAAqB;IAChD,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DP,CAAC,CAAC;IAEH,sDAAsD;IACtD,2GAA2G;IAC3G,MAAM,SAAS,GAAG,EAAE;SACjB,OAAO,CACN,2EAA2E,CAC5E;SACA,GAAG,EAAE,CAAC;IAET,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,EAAE,CAAC,IAAI,CAAC;;;;;KAKP,CAAC,CAAC;QAEH,+BAA+B;QAC/B,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;KAiBP,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
package/dist/db/seed.js
CHANGED
|
@@ -14,6 +14,48 @@ function loadJson(filename) {
|
|
|
14
14
|
export function seedDatabase(db) {
|
|
15
15
|
const services = loadJson("services-seed.json");
|
|
16
16
|
const recipes = loadJson("recipes-seed.json");
|
|
17
|
+
const changelogEntries = [
|
|
18
|
+
// freee
|
|
19
|
+
{ service_id: "freee", change_date: "2026-03-27", change_type: "feature", summary: "Remote MCP server version added", details: "freee now offers a hosted MCP endpoint in addition to the local npx runner, reducing setup friction for cloud-native agents." },
|
|
20
|
+
{ service_id: "freee", change_date: "2026-03-15", change_type: "feature", summary: "Invoice API v2 endpoint supported", details: "Added support for the new freee Invoice API v2 with line-item tax rounding options and PDF attachment." },
|
|
21
|
+
{ service_id: "freee", change_date: "2026-02-28", change_type: "fix", summary: "Bank sync retry logic improved", details: "Fixed intermittent 429 errors during bank account synchronization by adding exponential back-off." },
|
|
22
|
+
// smarthr
|
|
23
|
+
{ service_id: "smarthr", change_date: "2026-03-20", change_type: "feature", summary: "Employee bulk import tool added", details: "New bulk_import_employees tool accepts CSV payload and creates multiple employee records in a single call." },
|
|
24
|
+
{ service_id: "smarthr", change_date: "2026-03-05", change_type: "fix", summary: "Social insurance PDF generation fix", details: "Resolved issue where generated social insurance documents had incorrect fiscal year headers." },
|
|
25
|
+
{ service_id: "smarthr", change_date: "2026-02-18", change_type: "deprecation", summary: "Legacy employee list endpoint deprecated", details: "The v1 list_employees endpoint will be removed on 2026-06-01. Use list_employees_v2 instead." },
|
|
26
|
+
// chatwork
|
|
27
|
+
{ service_id: "chatwork", change_date: "2026-03-10", change_type: "feature", summary: "Thread reply support added", details: "Agents can now reply to specific messages in a thread using the new reply_to_message tool." },
|
|
28
|
+
{ service_id: "chatwork", change_date: "2026-02-20", change_type: "feature", summary: "File upload size limit increased to 50 MB" },
|
|
29
|
+
{ service_id: "chatwork", change_date: "2026-02-05", change_type: "fix", summary: "Room member list pagination corrected" },
|
|
30
|
+
// sansan
|
|
31
|
+
{ service_id: "sansan", change_date: "2026-03-22", change_type: "feature", summary: "Business card OCR accuracy improved to 98%", details: "Upgraded OCR model for Japanese vertical text and double-byte characters." },
|
|
32
|
+
{ service_id: "sansan", change_date: "2026-03-01", change_type: "breaking", summary: "Authentication switched to OAuth 2.0", details: "API key auth removed. All agents must use OAuth 2.0 client credentials flow. See migration guide." },
|
|
33
|
+
// moneyforward
|
|
34
|
+
{ service_id: "moneyforward", change_date: "2026-03-18", change_type: "feature", summary: "AI expense categorization tool added", details: "New auto_categorize_expenses tool uses ML to classify transactions into accounts." },
|
|
35
|
+
{ service_id: "moneyforward", change_date: "2026-03-02", change_type: "fix", summary: "Payroll calculation rounding error fixed" },
|
|
36
|
+
{ service_id: "moneyforward", change_date: "2026-02-10", change_type: "feature", summary: "Multi-currency journal entry support" },
|
|
37
|
+
// backlog
|
|
38
|
+
{ service_id: "backlog", change_date: "2026-03-25", change_type: "feature", summary: "Bulk issue update tool added", details: "Update status, assignee, or priority for multiple issues in a single API call." },
|
|
39
|
+
{ service_id: "backlog", change_date: "2026-03-08", change_type: "fix", summary: "Wiki markdown rendering fix for tables" },
|
|
40
|
+
// lineworks
|
|
41
|
+
{ service_id: "lineworks", change_date: "2026-03-12", change_type: "feature", summary: "Calendar event creation tool added", details: "Agents can now create, update, and delete LINE WORKS calendar events." },
|
|
42
|
+
{ service_id: "lineworks", change_date: "2026-02-25", change_type: "breaking", summary: "Bot API v1 removed", details: "Bot API v1 endpoints no longer respond. Migrate to Bot API v2." },
|
|
43
|
+
// kingoftime
|
|
44
|
+
{ service_id: "kingoftime", change_date: "2026-03-15", change_type: "feature", summary: "Overtime alert notification tool added" },
|
|
45
|
+
{ service_id: "kingoftime", change_date: "2026-02-28", change_type: "fix", summary: "Shift swap approval workflow fix", details: "Fixed edge case where overlapping shift swaps could both be approved." },
|
|
46
|
+
// base-ec
|
|
47
|
+
{ service_id: "base-ec", change_date: "2026-03-20", change_type: "feature", summary: "Inventory webhook support added" },
|
|
48
|
+
{ service_id: "base-ec", change_date: "2026-03-05", change_type: "fix", summary: "Order status filter returning stale data fixed" },
|
|
49
|
+
// stores-jp
|
|
50
|
+
{ service_id: "stores-jp", change_date: "2026-03-18", change_type: "feature", summary: "POS transaction sync tool added" },
|
|
51
|
+
{ service_id: "stores-jp", change_date: "2026-02-22", change_type: "feature", summary: "Reservation slot management tool added" },
|
|
52
|
+
// hubspot-jp
|
|
53
|
+
{ service_id: "hubspot-jp", change_date: "2026-03-28", change_type: "feature", summary: "Deal pipeline stage automation tool added" },
|
|
54
|
+
{ service_id: "hubspot-jp", change_date: "2026-03-10", change_type: "fix", summary: "Contact merge duplicate detection improved" },
|
|
55
|
+
// jooto
|
|
56
|
+
{ service_id: "jooto", change_date: "2026-03-14", change_type: "feature", summary: "Board template cloning tool added" },
|
|
57
|
+
{ service_id: "jooto", change_date: "2026-02-15", change_type: "fix", summary: "Label color sync issue resolved" },
|
|
58
|
+
];
|
|
17
59
|
const insertService = db.prepare(`
|
|
18
60
|
INSERT OR IGNORE INTO services (id, name, namespace, description, category, tags, mcp_endpoint, trust_score)
|
|
19
61
|
VALUES (@id, @name, @namespace, @description, @category, @tags, @mcp_endpoint, @trust_score)
|
|
@@ -24,6 +66,10 @@ export function seedDatabase(db) {
|
|
|
24
66
|
const insertRecipe = db.prepare(`
|
|
25
67
|
INSERT OR IGNORE INTO recipes (id, goal, description, steps, required_services)
|
|
26
68
|
VALUES (@id, @goal, @description, @steps, @required_services)
|
|
69
|
+
`);
|
|
70
|
+
const insertChangelog = db.prepare(`
|
|
71
|
+
INSERT OR IGNORE INTO service_changelog (service_id, change_date, change_type, summary, details)
|
|
72
|
+
VALUES (@service_id, @change_date, @change_type, @summary, @details)
|
|
27
73
|
`);
|
|
28
74
|
const seedAll = db.transaction(() => {
|
|
29
75
|
for (const service of services) {
|
|
@@ -37,6 +83,15 @@ export function seedDatabase(db) {
|
|
|
37
83
|
required_services: JSON.stringify(recipe.required_services),
|
|
38
84
|
});
|
|
39
85
|
}
|
|
86
|
+
for (const entry of changelogEntries) {
|
|
87
|
+
insertChangelog.run({
|
|
88
|
+
service_id: entry.service_id,
|
|
89
|
+
change_date: entry.change_date,
|
|
90
|
+
change_type: entry.change_type,
|
|
91
|
+
summary: entry.summary,
|
|
92
|
+
details: entry.details ?? null,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
40
95
|
});
|
|
41
96
|
seedAll();
|
|
42
97
|
// Rebuild FTS index
|
package/dist/db/seed.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/db/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/db/seed.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -5,6 +5,8 @@ import { register as registerSearchServices } from "./tools/search-services.js";
|
|
|
5
5
|
import { register as registerGetRecipe } from "./tools/get-recipe.js";
|
|
6
6
|
import { register as registerReportOutcome } from "./tools/report-outcome.js";
|
|
7
7
|
import { register as registerGetInsights } from "./tools/get-insights.js";
|
|
8
|
+
import { register as registerFindCombinations } from "./tools/find-combinations.js";
|
|
9
|
+
import { register as registerCheckUpdates } from "./tools/check-updates.js";
|
|
8
10
|
export function createServer() {
|
|
9
11
|
const server = new McpServer({
|
|
10
12
|
name: "kansei-link",
|
|
@@ -18,6 +20,8 @@ export function createServer() {
|
|
|
18
20
|
registerGetRecipe(server, db);
|
|
19
21
|
registerReportOutcome(server, db);
|
|
20
22
|
registerGetInsights(server, db);
|
|
23
|
+
registerFindCombinations(server, db);
|
|
24
|
+
registerCheckUpdates(server, db);
|
|
21
25
|
return server;
|
|
22
26
|
}
|
|
23
27
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAE5E,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,CAAC;IAEjB,qBAAqB;IACrB,sBAAsB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9B,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClC,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAChC,wBAAwB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrC,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEjC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function register(server, db) {
|
|
3
|
+
server.registerTool("check_updates", {
|
|
4
|
+
title: "Check Updates",
|
|
5
|
+
description: "Check if an MCP service has changed recently. Returns changelog information including new features, breaking changes, fixes, and deprecations.",
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
service: z
|
|
8
|
+
.string()
|
|
9
|
+
.describe("Service name or ID to look up (e.g., 'freee', 'smarthr', 'chatwork')"),
|
|
10
|
+
since_days: z
|
|
11
|
+
.number()
|
|
12
|
+
.optional()
|
|
13
|
+
.default(30)
|
|
14
|
+
.describe("How many days back to look for changes (default: 30)"),
|
|
15
|
+
}),
|
|
16
|
+
annotations: {
|
|
17
|
+
readOnlyHint: true,
|
|
18
|
+
openWorldHint: false,
|
|
19
|
+
},
|
|
20
|
+
}, async ({ service, since_days }) => {
|
|
21
|
+
const result = checkUpdates(db, service, since_days ?? 30);
|
|
22
|
+
return {
|
|
23
|
+
content: [
|
|
24
|
+
{
|
|
25
|
+
type: "text",
|
|
26
|
+
text: JSON.stringify(result, null, 2),
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function checkUpdates(db, service, sinceDays) {
|
|
33
|
+
// Fuzzy-match service by name or ID
|
|
34
|
+
const pattern = `%${service}%`;
|
|
35
|
+
const matchedService = db
|
|
36
|
+
.prepare(`SELECT id, name, namespace, description, category, mcp_endpoint, trust_score
|
|
37
|
+
FROM services
|
|
38
|
+
WHERE id LIKE ? OR name LIKE ?
|
|
39
|
+
LIMIT 1`)
|
|
40
|
+
.get(pattern, pattern);
|
|
41
|
+
if (!matchedService) {
|
|
42
|
+
return {
|
|
43
|
+
error: "service_not_found",
|
|
44
|
+
message: `No service matching '${service}' was found.`,
|
|
45
|
+
suggestion: "Use search_services to find available services, then retry with the exact service ID.",
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Calculate the cutoff date
|
|
49
|
+
const cutoffDate = new Date();
|
|
50
|
+
cutoffDate.setDate(cutoffDate.getDate() - sinceDays);
|
|
51
|
+
const cutoffIso = cutoffDate.toISOString().split("T")[0]; // YYYY-MM-DD
|
|
52
|
+
const changes = db
|
|
53
|
+
.prepare(`SELECT id, service_id, change_date, change_type, summary, details
|
|
54
|
+
FROM service_changelog
|
|
55
|
+
WHERE service_id = ? AND change_date >= ?
|
|
56
|
+
ORDER BY change_date DESC`)
|
|
57
|
+
.all(matchedService.id, cutoffIso);
|
|
58
|
+
const hasBreakingChanges = changes.some((c) => c.change_type === "breaking");
|
|
59
|
+
return {
|
|
60
|
+
service: {
|
|
61
|
+
id: matchedService.id,
|
|
62
|
+
name: matchedService.name,
|
|
63
|
+
namespace: matchedService.namespace,
|
|
64
|
+
category: matchedService.category,
|
|
65
|
+
mcp_endpoint: matchedService.mcp_endpoint,
|
|
66
|
+
},
|
|
67
|
+
period: {
|
|
68
|
+
since_days: sinceDays,
|
|
69
|
+
cutoff_date: cutoffIso,
|
|
70
|
+
},
|
|
71
|
+
has_breaking_changes: hasBreakingChanges,
|
|
72
|
+
total_changes: changes.length,
|
|
73
|
+
changes: changes.map((c) => ({
|
|
74
|
+
date: c.change_date,
|
|
75
|
+
type: c.change_type,
|
|
76
|
+
summary: c.summary,
|
|
77
|
+
...(c.details ? { details: c.details } : {}),
|
|
78
|
+
})),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=check-updates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-updates.js","sourceRoot":"","sources":["../../src/tools/check-updates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type Database from "better-sqlite3";
|
|
3
|
+
export declare function register(server: McpServer, db: Database.Database): void;
|
|
4
|
+
export declare function findCombinations(db: Database.Database, service: string): object[];
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function register(server, db) {
|
|
3
|
+
server.registerTool("find_combinations", {
|
|
4
|
+
title: "Find Combinations",
|
|
5
|
+
description: "Reverse recipe lookup — given a service or MCP name, find all recipes that include it and show what other services it can be combined with.",
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
service: z
|
|
8
|
+
.string()
|
|
9
|
+
.describe("The service name or ID to look up (e.g., 'freee', 'freee-mcp', 'chatwork')"),
|
|
10
|
+
}),
|
|
11
|
+
annotations: {
|
|
12
|
+
readOnlyHint: true,
|
|
13
|
+
openWorldHint: false,
|
|
14
|
+
},
|
|
15
|
+
}, async ({ service }) => {
|
|
16
|
+
const results = findCombinations(db, service);
|
|
17
|
+
return {
|
|
18
|
+
content: [
|
|
19
|
+
{
|
|
20
|
+
type: "text",
|
|
21
|
+
text: JSON.stringify(results, null, 2),
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export function findCombinations(db, service) {
|
|
28
|
+
const pattern = `%${service}%`;
|
|
29
|
+
// Find all recipes where the service appears in steps or required_services
|
|
30
|
+
const recipes = db
|
|
31
|
+
.prepare(`SELECT * FROM recipes
|
|
32
|
+
WHERE steps LIKE ? OR required_services LIKE ?`)
|
|
33
|
+
.all(pattern, pattern);
|
|
34
|
+
if (recipes.length === 0) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
// Also try to resolve the service against the services table for richer matching
|
|
38
|
+
const matchedServices = db
|
|
39
|
+
.prepare(`SELECT id, name, namespace FROM services
|
|
40
|
+
WHERE id LIKE ? OR name LIKE ?`)
|
|
41
|
+
.all(pattern, pattern);
|
|
42
|
+
const matchedIds = new Set(matchedServices.map((s) => s.id));
|
|
43
|
+
// Cache for service lookups
|
|
44
|
+
const serviceCache = new Map();
|
|
45
|
+
const getService = (id) => {
|
|
46
|
+
if (serviceCache.has(id))
|
|
47
|
+
return serviceCache.get(id);
|
|
48
|
+
const svc = db
|
|
49
|
+
.prepare("SELECT id, name, namespace FROM services WHERE id = ?")
|
|
50
|
+
.get(id);
|
|
51
|
+
if (svc)
|
|
52
|
+
serviceCache.set(id, svc);
|
|
53
|
+
return svc ?? null;
|
|
54
|
+
};
|
|
55
|
+
// Pre-populate cache with matched services
|
|
56
|
+
for (const svc of matchedServices) {
|
|
57
|
+
serviceCache.set(svc.id, svc);
|
|
58
|
+
}
|
|
59
|
+
const results = [];
|
|
60
|
+
for (const recipe of recipes) {
|
|
61
|
+
const steps = JSON.parse(recipe.steps);
|
|
62
|
+
const requiredServices = JSON.parse(recipe.required_services);
|
|
63
|
+
// Find which steps involve the queried service (by ID match or text match)
|
|
64
|
+
const matchingSteps = steps.filter((step) => {
|
|
65
|
+
if (matchedIds.has(step.service_id))
|
|
66
|
+
return true;
|
|
67
|
+
if (step.service_id.toLowerCase().includes(service.toLowerCase()))
|
|
68
|
+
return true;
|
|
69
|
+
return false;
|
|
70
|
+
});
|
|
71
|
+
// If no steps match, skip (the LIKE matched on something unrelated)
|
|
72
|
+
if (matchingSteps.length === 0)
|
|
73
|
+
continue;
|
|
74
|
+
// Build the role description for the matched service
|
|
75
|
+
const roles = matchingSteps.map((step) => ({
|
|
76
|
+
step_order: step.order,
|
|
77
|
+
action: step.action,
|
|
78
|
+
service_id: step.service_id,
|
|
79
|
+
service_name: getService(step.service_id)?.name ?? step.service_id,
|
|
80
|
+
}));
|
|
81
|
+
// Find the other services in this recipe (the combinations)
|
|
82
|
+
const matchingServiceIds = new Set(matchingSteps.map((s) => s.service_id));
|
|
83
|
+
const otherServices = requiredServices
|
|
84
|
+
.filter((id) => !matchingServiceIds.has(id))
|
|
85
|
+
.map((id) => {
|
|
86
|
+
const svc = getService(id);
|
|
87
|
+
return {
|
|
88
|
+
id,
|
|
89
|
+
name: svc?.name ?? id,
|
|
90
|
+
namespace: svc?.namespace ?? null,
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
results.push({
|
|
94
|
+
recipe_id: recipe.id,
|
|
95
|
+
recipe_name: recipe.goal,
|
|
96
|
+
description: recipe.description,
|
|
97
|
+
role_in_recipe: roles,
|
|
98
|
+
combines_with: otherServices,
|
|
99
|
+
total_services_needed: requiredServices.length,
|
|
100
|
+
coverage_hint: `You have 1 of ${requiredServices.length} services needed`,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return results;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=find-combinations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-combinations.js","sourceRoot":"","sources":["../../src/tools/find-combinations.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,16 +33,125 @@ export function register(server, db) {
|
|
|
33
33
|
};
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Intent-to-category mapping layer
|
|
38
|
+
// Maps keyword signals found in a user intent to the most likely service
|
|
39
|
+
// categories. When a service's category matches the detected intent category,
|
|
40
|
+
// it receives a relevance boost so that, e.g., "send invoice" ranks freee
|
|
41
|
+
// (accounting) above Chatwork (communication) even though "send" matches both.
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
const INTENT_CATEGORY_MAP = {
|
|
44
|
+
// Accounting / finance
|
|
45
|
+
invoice: ["accounting"],
|
|
46
|
+
invoicing: ["accounting"],
|
|
47
|
+
billing: ["accounting"],
|
|
48
|
+
receipt: ["accounting"],
|
|
49
|
+
expense: ["accounting"],
|
|
50
|
+
expenses: ["accounting"],
|
|
51
|
+
tax: ["accounting"],
|
|
52
|
+
taxes: ["accounting"],
|
|
53
|
+
bookkeeping: ["accounting"],
|
|
54
|
+
accounting: ["accounting"],
|
|
55
|
+
payment: ["accounting"],
|
|
56
|
+
payments: ["accounting"],
|
|
57
|
+
payroll: ["accounting", "hr"],
|
|
58
|
+
salary: ["accounting", "hr"],
|
|
59
|
+
ledger: ["accounting"],
|
|
60
|
+
journal: ["accounting"],
|
|
61
|
+
revenue: ["accounting"],
|
|
62
|
+
profit: ["accounting"],
|
|
63
|
+
refund: ["accounting"],
|
|
64
|
+
reimbursement: ["accounting"],
|
|
65
|
+
// HR
|
|
66
|
+
employee: ["hr"],
|
|
67
|
+
employees: ["hr"],
|
|
68
|
+
attendance: ["hr"],
|
|
69
|
+
leave: ["hr"],
|
|
70
|
+
hiring: ["hr"],
|
|
71
|
+
recruit: ["hr"],
|
|
72
|
+
recruitment: ["hr"],
|
|
73
|
+
onboarding: ["hr"],
|
|
74
|
+
talent: ["hr"],
|
|
75
|
+
hr: ["hr"],
|
|
76
|
+
workforce: ["hr"],
|
|
77
|
+
shift: ["hr"],
|
|
78
|
+
timecard: ["hr"],
|
|
79
|
+
// Communication / messaging
|
|
80
|
+
message: ["communication"],
|
|
81
|
+
messages: ["communication"],
|
|
82
|
+
chat: ["communication"],
|
|
83
|
+
messaging: ["communication"],
|
|
84
|
+
notify: ["communication"],
|
|
85
|
+
notification: ["communication"],
|
|
86
|
+
call: ["communication"],
|
|
87
|
+
meeting: ["communication"],
|
|
88
|
+
video: ["communication"],
|
|
89
|
+
// CRM
|
|
90
|
+
lead: ["crm"],
|
|
91
|
+
leads: ["crm"],
|
|
92
|
+
customer: ["crm"],
|
|
93
|
+
customers: ["crm"],
|
|
94
|
+
deal: ["crm"],
|
|
95
|
+
deals: ["crm"],
|
|
96
|
+
pipeline: ["crm"],
|
|
97
|
+
contact: ["crm"],
|
|
98
|
+
contacts: ["crm"],
|
|
99
|
+
prospect: ["crm"],
|
|
100
|
+
sales: ["crm"],
|
|
101
|
+
crm: ["crm"],
|
|
102
|
+
// Project management
|
|
103
|
+
task: ["project_management"],
|
|
104
|
+
tasks: ["project_management"],
|
|
105
|
+
project: ["project_management"],
|
|
106
|
+
projects: ["project_management"],
|
|
107
|
+
sprint: ["project_management"],
|
|
108
|
+
board: ["project_management"],
|
|
109
|
+
kanban: ["project_management"],
|
|
110
|
+
ticket: ["project_management"],
|
|
111
|
+
backlog: ["project_management"],
|
|
112
|
+
milestone: ["project_management"],
|
|
113
|
+
// E-commerce
|
|
114
|
+
product: ["ecommerce"],
|
|
115
|
+
products: ["ecommerce"],
|
|
116
|
+
order: ["ecommerce"],
|
|
117
|
+
orders: ["ecommerce"],
|
|
118
|
+
shipping: ["ecommerce"],
|
|
119
|
+
inventory: ["ecommerce"],
|
|
120
|
+
cart: ["ecommerce"],
|
|
121
|
+
store: ["ecommerce"],
|
|
122
|
+
shop: ["ecommerce"],
|
|
123
|
+
catalog: ["ecommerce"],
|
|
124
|
+
};
|
|
125
|
+
/** Category boost added to relevance_score when service category matches intent */
|
|
126
|
+
const CATEGORY_BOOST = 0.3;
|
|
127
|
+
/**
|
|
128
|
+
* Detect likely categories from an intent string by scanning for keyword
|
|
129
|
+
* signals. Returns a Set of category names (may be empty).
|
|
130
|
+
*/
|
|
131
|
+
function detectIntentCategories(intent) {
|
|
132
|
+
const categories = new Set();
|
|
133
|
+
const lower = intent.toLowerCase();
|
|
134
|
+
const tokens = lower.split(/\s+/);
|
|
135
|
+
for (const token of tokens) {
|
|
136
|
+
const mapped = INTENT_CATEGORY_MAP[token];
|
|
137
|
+
if (mapped) {
|
|
138
|
+
for (const cat of mapped)
|
|
139
|
+
categories.add(cat);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return categories;
|
|
143
|
+
}
|
|
36
144
|
export function searchServices(db, intent, category, limit = 5) {
|
|
145
|
+
const intentCategories = detectIntentCategories(intent);
|
|
37
146
|
// Try FTS5 search first
|
|
38
|
-
let results = ftsSearch(db, intent, category, limit);
|
|
147
|
+
let results = ftsSearch(db, intent, category, limit, intentCategories);
|
|
39
148
|
// Fallback to LIKE search if FTS returns nothing
|
|
40
149
|
if (results.length === 0) {
|
|
41
|
-
results = likeSearch(db, intent, category, limit);
|
|
150
|
+
results = likeSearch(db, intent, category, limit, intentCategories);
|
|
42
151
|
}
|
|
43
152
|
return results;
|
|
44
153
|
}
|
|
45
|
-
function ftsSearch(db, intent, category, limit) {
|
|
154
|
+
function ftsSearch(db, intent, category, limit, intentCategories) {
|
|
46
155
|
// Tokenize intent for FTS query (simple word splitting)
|
|
47
156
|
const tokens = intent
|
|
48
157
|
.split(/\s+/)
|
|
@@ -52,6 +161,8 @@ function ftsSearch(db, intent, category, limit) {
|
|
|
52
161
|
if (!tokens)
|
|
53
162
|
return [];
|
|
54
163
|
try {
|
|
164
|
+
// Fetch more than `limit` so we can re-rank with category boost before trimming
|
|
165
|
+
const fetchLimit = Math.max(limit * 3, 15);
|
|
55
166
|
// Join FTS results back to services table via rowid
|
|
56
167
|
let query = `
|
|
57
168
|
SELECT s.*, ss.total_calls, ss.success_rate, fts.rank as fts_rank
|
|
@@ -66,32 +177,43 @@ function ftsSearch(db, intent, category, limit) {
|
|
|
66
177
|
params.push(category);
|
|
67
178
|
}
|
|
68
179
|
query += ` ORDER BY fts.rank LIMIT ?`;
|
|
69
|
-
params.push(
|
|
180
|
+
params.push(fetchLimit);
|
|
70
181
|
const services = db.prepare(query).all(...params);
|
|
71
182
|
if (services.length === 0)
|
|
72
183
|
return [];
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
184
|
+
// Compute relevance with category boost, then sort descending
|
|
185
|
+
const scored = services.map((s) => {
|
|
186
|
+
const baseScore = 1 / (1 + Math.abs(s.fts_rank)) + s.trust_score * 0.3;
|
|
187
|
+
const categoryBoost = intentCategories.size > 0 && s.category && intentCategories.has(s.category)
|
|
188
|
+
? CATEGORY_BOOST
|
|
189
|
+
: 0;
|
|
190
|
+
return {
|
|
191
|
+
service_id: s.id,
|
|
192
|
+
name: s.name,
|
|
193
|
+
namespace: s.namespace,
|
|
194
|
+
description: s.description,
|
|
195
|
+
category: s.category,
|
|
196
|
+
mcp_endpoint: s.mcp_endpoint,
|
|
197
|
+
trust_score: s.trust_score,
|
|
198
|
+
usage_count: s.total_calls ?? 0,
|
|
199
|
+
success_rate: s.success_rate ?? null,
|
|
200
|
+
relevance_score: Math.round((baseScore + categoryBoost) * 100) / 100,
|
|
201
|
+
};
|
|
202
|
+
});
|
|
203
|
+
scored.sort((a, b) => b.relevance_score - a.relevance_score);
|
|
204
|
+
return scored.slice(0, limit);
|
|
85
205
|
}
|
|
86
206
|
catch {
|
|
87
207
|
// FTS query may fail on certain inputs, fall through to LIKE
|
|
88
208
|
return [];
|
|
89
209
|
}
|
|
90
210
|
}
|
|
91
|
-
function likeSearch(db, intent, category, limit) {
|
|
211
|
+
function likeSearch(db, intent, category, limit, intentCategories) {
|
|
92
212
|
const words = intent.split(/\s+/).filter((t) => t.length > 1);
|
|
93
213
|
if (words.length === 0)
|
|
94
214
|
return [];
|
|
215
|
+
// Fetch more rows so we can re-rank after category boost
|
|
216
|
+
const fetchLimit = Math.max(limit * 3, 15);
|
|
95
217
|
const conditions = words.map(() => `(s.name LIKE ? OR s.description LIKE ? OR s.tags LIKE ?)`);
|
|
96
218
|
const params = [];
|
|
97
219
|
for (const word of words) {
|
|
@@ -109,19 +231,26 @@ function likeSearch(db, intent, category, limit) {
|
|
|
109
231
|
params.push(category);
|
|
110
232
|
}
|
|
111
233
|
query += ` ORDER BY s.trust_score DESC LIMIT ?`;
|
|
112
|
-
params.push(
|
|
234
|
+
params.push(fetchLimit);
|
|
113
235
|
const services = db.prepare(query).all(...params);
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
236
|
+
const scored = services.map((s) => {
|
|
237
|
+
const categoryBoost = intentCategories.size > 0 && s.category && intentCategories.has(s.category)
|
|
238
|
+
? CATEGORY_BOOST
|
|
239
|
+
: 0;
|
|
240
|
+
return {
|
|
241
|
+
service_id: s.id,
|
|
242
|
+
name: s.name,
|
|
243
|
+
namespace: s.namespace,
|
|
244
|
+
description: s.description,
|
|
245
|
+
category: s.category,
|
|
246
|
+
mcp_endpoint: s.mcp_endpoint,
|
|
247
|
+
trust_score: s.trust_score,
|
|
248
|
+
usage_count: s.total_calls ?? 0,
|
|
249
|
+
success_rate: s.success_rate ?? null,
|
|
250
|
+
relevance_score: Math.round((s.trust_score + categoryBoost) * 100) / 100,
|
|
251
|
+
};
|
|
252
|
+
});
|
|
253
|
+
scored.sort((a, b) => b.relevance_score - a.relevance_score);
|
|
254
|
+
return scored.slice(0, limit);
|
|
126
255
|
}
|
|
127
256
|
//# sourceMappingURL=search-services.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-services.js","sourceRoot":"","sources":["../../src/tools/search-services.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqBxB,MAAM,UAAU,QAAQ,CAAC,MAAiB,EAAE,EAAqB;IAC/D,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,uHAAuH;QACzH,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,CAAC,4FAA4F,CAAC;YACzG,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,uFAAuF,CAAC;YACpG,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,CAAC,CAAC;iBACV,QAAQ,CAAC,oCAAoC,CAAC;SAClD,CAAC;QACF,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;QACjE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,EAAqB,EACrB,MAAc,EACd,QAAiB,EACjB,QAAgB,CAAC;IAEjB,wBAAwB;IACxB,IAAI,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"search-services.js","sourceRoot":"","sources":["../../src/tools/search-services.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqBxB,MAAM,UAAU,QAAQ,CAAC,MAAiB,EAAE,EAAqB;IAC/D,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,uHAAuH;QACzH,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,CAAC,4FAA4F,CAAC;YACzG,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,uFAAuF,CAAC;YACpG,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,CAAC,CAAC;iBACV,QAAQ,CAAC,oCAAoC,CAAC;SAClD,CAAC;QACF,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;QACjE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,mCAAmC;AACnC,yEAAyE;AACzE,8EAA8E;AAC9E,0EAA0E;AAC1E,+EAA+E;AAC/E,8EAA8E;AAE9E,MAAM,mBAAmB,GAA6B;IACpD,uBAAuB;IACvB,OAAO,EAAQ,CAAC,YAAY,CAAC;IAC7B,SAAS,EAAM,CAAC,YAAY,CAAC;IAC7B,OAAO,EAAQ,CAAC,YAAY,CAAC;IAC7B,OAAO,EAAQ,CAAC,YAAY,CAAC;IAC7B,OAAO,EAAQ,CAAC,YAAY,CAAC;IAC7B,QAAQ,EAAO,CAAC,YAAY,CAAC;IAC7B,GAAG,EAAY,CAAC,YAAY,CAAC;IAC7B,KAAK,EAAU,CAAC,YAAY,CAAC;IAC7B,WAAW,EAAI,CAAC,YAAY,CAAC;IAC7B,UAAU,EAAK,CAAC,YAAY,CAAC;IAC7B,OAAO,EAAQ,CAAC,YAAY,CAAC;IAC7B,QAAQ,EAAO,CAAC,YAAY,CAAC;IAC7B,OAAO,EAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IACnC,MAAM,EAAS,CAAC,YAAY,EAAE,IAAI,CAAC;IACnC,MAAM,EAAS,CAAC,YAAY,CAAC;IAC7B,OAAO,EAAQ,CAAC,YAAY,CAAC;IAC7B,OAAO,EAAQ,CAAC,YAAY,CAAC;IAC7B,MAAM,EAAS,CAAC,YAAY,CAAC;IAC7B,MAAM,EAAS,CAAC,YAAY,CAAC;IAC7B,aAAa,EAAE,CAAC,YAAY,CAAC;IAE7B,KAAK;IACL,QAAQ,EAAO,CAAC,IAAI,CAAC;IACrB,SAAS,EAAM,CAAC,IAAI,CAAC;IACrB,UAAU,EAAK,CAAC,IAAI,CAAC;IACrB,KAAK,EAAU,CAAC,IAAI,CAAC;IACrB,MAAM,EAAS,CAAC,IAAI,CAAC;IACrB,OAAO,EAAQ,CAAC,IAAI,CAAC;IACrB,WAAW,EAAI,CAAC,IAAI,CAAC;IACrB,UAAU,EAAK,CAAC,IAAI,CAAC;IACrB,MAAM,EAAS,CAAC,IAAI,CAAC;IACrB,EAAE,EAAa,CAAC,IAAI,CAAC;IACrB,SAAS,EAAM,CAAC,IAAI,CAAC;IACrB,KAAK,EAAU,CAAC,IAAI,CAAC;IACrB,QAAQ,EAAO,CAAC,IAAI,CAAC;IAErB,4BAA4B;IAC5B,OAAO,EAAQ,CAAC,eAAe,CAAC;IAChC,QAAQ,EAAO,CAAC,eAAe,CAAC;IAChC,IAAI,EAAW,CAAC,eAAe,CAAC;IAChC,SAAS,EAAM,CAAC,eAAe,CAAC;IAChC,MAAM,EAAS,CAAC,eAAe,CAAC;IAChC,YAAY,EAAG,CAAC,eAAe,CAAC;IAChC,IAAI,EAAW,CAAC,eAAe,CAAC;IAChC,OAAO,EAAQ,CAAC,eAAe,CAAC;IAChC,KAAK,EAAU,CAAC,eAAe,CAAC;IAEhC,MAAM;IACN,IAAI,EAAW,CAAC,KAAK,CAAC;IACtB,KAAK,EAAU,CAAC,KAAK,CAAC;IACtB,QAAQ,EAAO,CAAC,KAAK,CAAC;IACtB,SAAS,EAAM,CAAC,KAAK,CAAC;IACtB,IAAI,EAAW,CAAC,KAAK,CAAC;IACtB,KAAK,EAAU,CAAC,KAAK,CAAC;IACtB,QAAQ,EAAO,CAAC,KAAK,CAAC;IACtB,OAAO,EAAQ,CAAC,KAAK,CAAC;IACtB,QAAQ,EAAO,CAAC,KAAK,CAAC;IACtB,QAAQ,EAAO,CAAC,KAAK,CAAC;IACtB,KAAK,EAAU,CAAC,KAAK,CAAC;IACtB,GAAG,EAAY,CAAC,KAAK,CAAC;IAEtB,qBAAqB;IACrB,IAAI,EAAW,CAAC,oBAAoB,CAAC;IACrC,KAAK,EAAU,CAAC,oBAAoB,CAAC;IACrC,OAAO,EAAQ,CAAC,oBAAoB,CAAC;IACrC,QAAQ,EAAO,CAAC,oBAAoB,CAAC;IACrC,MAAM,EAAS,CAAC,oBAAoB,CAAC;IACrC,KAAK,EAAU,CAAC,oBAAoB,CAAC;IACrC,MAAM,EAAS,CAAC,oBAAoB,CAAC;IACrC,MAAM,EAAS,CAAC,oBAAoB,CAAC;IACrC,OAAO,EAAQ,CAAC,oBAAoB,CAAC;IACrC,SAAS,EAAM,CAAC,oBAAoB,CAAC;IAErC,aAAa;IACb,OAAO,EAAQ,CAAC,WAAW,CAAC;IAC5B,QAAQ,EAAO,CAAC,WAAW,CAAC;IAC5B,KAAK,EAAU,CAAC,WAAW,CAAC;IAC5B,MAAM,EAAS,CAAC,WAAW,CAAC;IAC5B,QAAQ,EAAO,CAAC,WAAW,CAAC;IAC5B,SAAS,EAAM,CAAC,WAAW,CAAC;IAC5B,IAAI,EAAW,CAAC,WAAW,CAAC;IAC5B,KAAK,EAAU,CAAC,WAAW,CAAC;IAC5B,IAAI,EAAW,CAAC,WAAW,CAAC;IAC5B,OAAO,EAAQ,CAAC,WAAW,CAAC;CAC7B,CAAC;AAEF,mFAAmF;AACnF,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B;;;GAGG;AACH,SAAS,sBAAsB,CAAC,MAAc;IAC5C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,GAAG,IAAI,MAAM;gBAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,EAAqB,EACrB,MAAc,EACd,QAAiB,EACjB,QAAgB,CAAC;IAEjB,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAExD,wBAAwB;IACxB,IAAI,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAEvE,iDAAiD;IACjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CAChB,EAAqB,EACrB,MAAc,EACd,QAA4B,EAC5B,KAAa,EACb,gBAA6B;IAE7B,wDAAwD;IACxD,MAAM,MAAM,GAAG,MAAM;SAClB,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;SACpB,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,IAAI,CAAC;QACH,gFAAgF;QAChF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAE3C,oDAAoD;QACpD,IAAI,KAAK,GAAG;;;;;;KAMX,CAAC;QACF,MAAM,MAAM,GAAc,CAAC,MAAM,CAAC,CAAC;QAEnC,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,IAAI,qBAAqB,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QAED,KAAK,IAAI,4BAA4B,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAExB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAA0C,CAAC;QAE3F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,8DAA8D;QAC9D,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAChC,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC;YACvE,MAAM,aAAa,GACjB,gBAAgB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACzE,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,CAAC,CAAC;YACR,OAAO;gBACL,UAAU,EAAE,CAAC,CAAC,EAAE;gBAChB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC;gBAC/B,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;gBACpC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;aACrE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;QAE7D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;QAC7D,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,EAAqB,EACrB,MAAc,EACd,QAA4B,EAC5B,KAAa,EACb,gBAA6B;IAE7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,yDAAyD;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAE3C,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAC1B,GAAG,EAAE,CAAC,0DAA0D,CACjE,CAAC;IACF,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,IAAI,GAAG,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,KAAK,GAAG;;;;aAID,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;GACjC,CAAC;IAEF,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,IAAI,qBAAqB,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,IAAI,sCAAsC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAExB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAiB,CAAC;IAElE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAChC,MAAM,aAAa,GACjB,gBAAgB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;YACzE,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,CAAC,CAAC;QACR,OAAO;YACL,UAAU,EAAE,CAAC,CAAC,EAAE;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC;YAC/B,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;YACpC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;SACzE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;IAE7D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/utils/pii-masker.js
CHANGED
|
@@ -1,4 +1,20 @@
|
|
|
1
|
+
const COMMON_SURNAMES = "佐藤|田中|鈴木|高橋|渡辺|伊藤|山本|中村|小林|加藤|吉田|山田|松本|井上|木村|林|清水|山口|阿部|池田|橋本|山下|石川|中島|前田|藤田|小川|岡田|村上|長谷川|近藤|石井|斎藤|坂本|遠藤|藤井|青木|福田|三浦|西村|太田|原|松田|中野|千葉|岩崎|河野|小野|田村|竹内";
|
|
1
2
|
const patterns = [
|
|
3
|
+
// Japanese kanji names with honorific suffix (さん, 様, 氏)
|
|
4
|
+
{
|
|
5
|
+
regex: /[\u4E00-\u9FFF]{2,4}(?:さん|さま|様|氏)/g,
|
|
6
|
+
replacement: "[NAME]",
|
|
7
|
+
},
|
|
8
|
+
// Japanese full name with space: 漢字surname + space + 漢字given name
|
|
9
|
+
{
|
|
10
|
+
regex: /[\u4E00-\u9FFF]{2,3}[\s\u3000][\u4E00-\u9FFF]{1,3}/g,
|
|
11
|
+
replacement: "[NAME]",
|
|
12
|
+
},
|
|
13
|
+
// Common Japanese surnames followed by optional given name characters
|
|
14
|
+
{
|
|
15
|
+
regex: new RegExp(`(?:${COMMON_SURNAMES})[\u4E00-\u9FFF]{1,3}`, "g"),
|
|
16
|
+
replacement: "[NAME]",
|
|
17
|
+
},
|
|
2
18
|
// Email addresses (must be before IP to avoid partial matches)
|
|
3
19
|
{
|
|
4
20
|
regex: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pii-masker.js","sourceRoot":"","sources":["../../src/utils/pii-masker.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAkD;IAC9D,+DAA+D;IAC/D;QACE,KAAK,EAAE,iDAAiD;QACxD,WAAW,EAAE,SAAS;KACvB;IACD,6EAA6E;IAC7E,EAAE,KAAK,EAAE,qCAAqC,EAAE,WAAW,EAAE,MAAM,EAAE;IACrE,oEAAoE;IACpE,EAAE,KAAK,EAAE,2BAA2B,EAAE,WAAW,EAAE,SAAS,EAAE;IAC9D,mFAAmF;IACnF;QACE,KAAK,EAAE,oDAAoD;QAC3D,WAAW,EAAE,SAAS;KACvB;IACD,sEAAsE;IACtE,EAAE,KAAK,EAAE,mDAAmD,EAAE,WAAW,EAAE,QAAQ,EAAE;CACtF,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,KAAK,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC9C,4CAA4C;QAC5C,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YACrD,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;YACpB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC1C,CAAC"}
|
|
1
|
+
{"version":3,"file":"pii-masker.js","sourceRoot":"","sources":["../../src/utils/pii-masker.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,sJAAsJ,CAAC;AAE/K,MAAM,QAAQ,GAAkD;IAC9D,wDAAwD;IACxD;QACE,KAAK,EAAE,oCAAoC;QAC3C,WAAW,EAAE,QAAQ;KACtB;IACD,kEAAkE;IAClE;QACE,KAAK,EAAE,qDAAqD;QAC5D,WAAW,EAAE,QAAQ;KACtB;IACD,sEAAsE;IACtE;QACE,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,eAAe,uBAAuB,EAAE,GAAG,CAAC;QACpE,WAAW,EAAE,QAAQ;KACtB;IACD,+DAA+D;IAC/D;QACE,KAAK,EAAE,iDAAiD;QACxD,WAAW,EAAE,SAAS;KACvB;IACD,6EAA6E;IAC7E,EAAE,KAAK,EAAE,qCAAqC,EAAE,WAAW,EAAE,MAAM,EAAE;IACrE,oEAAoE;IACpE,EAAE,KAAK,EAAE,2BAA2B,EAAE,WAAW,EAAE,SAAS,EAAE;IAC9D,mFAAmF;IACnF;QACE,KAAK,EAAE,oDAAoD;QAC3D,WAAW,EAAE,SAAS;KACvB;IACD,sEAAsE;IACtE,EAAE,KAAK,EAAE,mDAAmD,EAAE,WAAW,EAAE,QAAQ,EAAE;CACtF,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,KAAK,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC9C,4CAA4C;QAC5C,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YACrD,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;YACpB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC1C,CAAC"}
|