exovault-mcp-server 1.0.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/auth.d.ts +41 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +236 -0
- package/dist/auth.js.map +1 -0
- package/dist/auto-session.d.ts +39 -0
- package/dist/auto-session.d.ts.map +1 -0
- package/dist/auto-session.js +128 -0
- package/dist/auto-session.js.map +1 -0
- package/dist/buffer-persistence.d.ts +35 -0
- package/dist/buffer-persistence.d.ts.map +1 -0
- package/dist/buffer-persistence.js +110 -0
- package/dist/buffer-persistence.js.map +1 -0
- package/dist/coerce-params.d.ts +36 -0
- package/dist/coerce-params.d.ts.map +1 -0
- package/dist/coerce-params.js +120 -0
- package/dist/coerce-params.js.map +1 -0
- package/dist/crypto.d.ts +39 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +119 -0
- package/dist/crypto.js.map +1 -0
- package/dist/db.d.ts +350 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +866 -0
- package/dist/db.js.map +1 -0
- package/dist/embedding-config.d.ts +11 -0
- package/dist/embedding-config.d.ts.map +1 -0
- package/dist/embedding-config.js +24 -0
- package/dist/embedding-config.js.map +1 -0
- package/dist/entity-extraction.d.ts +22 -0
- package/dist/entity-extraction.d.ts.map +1 -0
- package/dist/entity-extraction.js +140 -0
- package/dist/entity-extraction.js.map +1 -0
- package/dist/episodic-headline.d.ts +6 -0
- package/dist/episodic-headline.d.ts.map +1 -0
- package/dist/episodic-headline.js +62 -0
- package/dist/episodic-headline.js.map +1 -0
- package/dist/error-sanitizer.d.ts +20 -0
- package/dist/error-sanitizer.d.ts.map +1 -0
- package/dist/error-sanitizer.js +54 -0
- package/dist/error-sanitizer.js.map +1 -0
- package/dist/extraction-budget.d.ts +39 -0
- package/dist/extraction-budget.d.ts.map +1 -0
- package/dist/extraction-budget.js +122 -0
- package/dist/extraction-budget.js.map +1 -0
- package/dist/extraction-llm.d.ts +22 -0
- package/dist/extraction-llm.d.ts.map +1 -0
- package/dist/extraction-llm.js +32 -0
- package/dist/extraction-llm.js.map +1 -0
- package/dist/extraction-prompt.d.ts +40 -0
- package/dist/extraction-prompt.d.ts.map +1 -0
- package/dist/extraction-prompt.js +176 -0
- package/dist/extraction-prompt.js.map +1 -0
- package/dist/gateway-client.d.ts +303 -0
- package/dist/gateway-client.d.ts.map +1 -0
- package/dist/gateway-client.js +285 -0
- package/dist/gateway-client.js.map +1 -0
- package/dist/gateway-init.d.ts +32 -0
- package/dist/gateway-init.d.ts.map +1 -0
- package/dist/gateway-init.js +71 -0
- package/dist/gateway-init.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1242 -0
- package/dist/index.js.map +1 -0
- package/dist/infer-task-status.d.ts +7 -0
- package/dist/infer-task-status.d.ts.map +1 -0
- package/dist/infer-task-status.js +23 -0
- package/dist/infer-task-status.js.map +1 -0
- package/dist/normalize-agent-id.d.ts +21 -0
- package/dist/normalize-agent-id.d.ts.map +1 -0
- package/dist/normalize-agent-id.js +54 -0
- package/dist/normalize-agent-id.js.map +1 -0
- package/dist/openai.d.ts +14 -0
- package/dist/openai.d.ts.map +1 -0
- package/dist/openai.js +43 -0
- package/dist/openai.js.map +1 -0
- package/dist/rlm/actions.d.ts +31 -0
- package/dist/rlm/actions.d.ts.map +1 -0
- package/dist/rlm/actions.js +241 -0
- package/dist/rlm/actions.js.map +1 -0
- package/dist/rlm/benchmark.d.ts +2 -0
- package/dist/rlm/benchmark.d.ts.map +1 -0
- package/dist/rlm/benchmark.js +215 -0
- package/dist/rlm/benchmark.js.map +1 -0
- package/dist/rlm/execute.d.ts +13 -0
- package/dist/rlm/execute.d.ts.map +1 -0
- package/dist/rlm/execute.js +366 -0
- package/dist/rlm/execute.js.map +1 -0
- package/dist/rlm/index.d.ts +6 -0
- package/dist/rlm/index.d.ts.map +1 -0
- package/dist/rlm/index.js +147 -0
- package/dist/rlm/index.js.map +1 -0
- package/dist/rlm/profiles.d.ts +9 -0
- package/dist/rlm/profiles.d.ts.map +1 -0
- package/dist/rlm/profiles.js +46 -0
- package/dist/rlm/profiles.js.map +1 -0
- package/dist/rlm/types.d.ts +98 -0
- package/dist/rlm/types.d.ts.map +1 -0
- package/dist/rlm/types.js +6 -0
- package/dist/rlm/types.js.map +1 -0
- package/dist/rlm/verify.d.ts +13 -0
- package/dist/rlm/verify.d.ts.map +1 -0
- package/dist/rlm/verify.js +58 -0
- package/dist/rlm/verify.js.map +1 -0
- package/dist/rlm/writeback.d.ts +7 -0
- package/dist/rlm/writeback.d.ts.map +1 -0
- package/dist/rlm/writeback.js +77 -0
- package/dist/rlm/writeback.js.map +1 -0
- package/dist/scripts/backfill-memory-embeddings.d.ts +2 -0
- package/dist/scripts/backfill-memory-embeddings.d.ts.map +1 -0
- package/dist/scripts/backfill-memory-embeddings.js +153 -0
- package/dist/scripts/backfill-memory-embeddings.js.map +1 -0
- package/dist/session-buffer.d.ts +104 -0
- package/dist/session-buffer.d.ts.map +1 -0
- package/dist/session-buffer.js +466 -0
- package/dist/session-buffer.js.map +1 -0
- package/dist/session-dedup.d.ts +30 -0
- package/dist/session-dedup.d.ts.map +1 -0
- package/dist/session-dedup.js +67 -0
- package/dist/session-dedup.js.map +1 -0
- package/dist/session-flush.d.ts +81 -0
- package/dist/session-flush.d.ts.map +1 -0
- package/dist/session-flush.js +169 -0
- package/dist/session-flush.js.map +1 -0
- package/dist/session-lifecycle.d.ts +72 -0
- package/dist/session-lifecycle.d.ts.map +1 -0
- package/dist/session-lifecycle.js +247 -0
- package/dist/session-lifecycle.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +260 -0
- package/dist/setup.js.map +1 -0
- package/dist/stopwords.d.ts +2 -0
- package/dist/stopwords.d.ts.map +1 -0
- package/dist/stopwords.js +20 -0
- package/dist/stopwords.js.map +1 -0
- package/dist/strip-html.d.ts +5 -0
- package/dist/strip-html.d.ts.map +1 -0
- package/dist/strip-html.js +35 -0
- package/dist/strip-html.js.map +1 -0
- package/dist/task-completion-flush.d.ts +36 -0
- package/dist/task-completion-flush.d.ts.map +1 -0
- package/dist/task-completion-flush.js +97 -0
- package/dist/task-completion-flush.js.map +1 -0
- package/dist/task-lifecycle-types.d.ts +13 -0
- package/dist/task-lifecycle-types.d.ts.map +1 -0
- package/dist/task-lifecycle-types.js +12 -0
- package/dist/task-lifecycle-types.js.map +1 -0
- package/dist/task-lifecycle.d.ts +78 -0
- package/dist/task-lifecycle.d.ts.map +1 -0
- package/dist/task-lifecycle.js +256 -0
- package/dist/task-lifecycle.js.map +1 -0
- package/dist/tools/agent-messages.d.ts +26 -0
- package/dist/tools/agent-messages.d.ts.map +1 -0
- package/dist/tools/agent-messages.js +123 -0
- package/dist/tools/agent-messages.js.map +1 -0
- package/dist/tools/agent-tasks.d.ts +24 -0
- package/dist/tools/agent-tasks.d.ts.map +1 -0
- package/dist/tools/agent-tasks.js +162 -0
- package/dist/tools/agent-tasks.js.map +1 -0
- package/dist/tools/archive-memory.d.ts +2 -0
- package/dist/tools/archive-memory.d.ts.map +1 -0
- package/dist/tools/archive-memory.js +19 -0
- package/dist/tools/archive-memory.js.map +1 -0
- package/dist/tools/blind-index.d.ts +29 -0
- package/dist/tools/blind-index.d.ts.map +1 -0
- package/dist/tools/blind-index.js +53 -0
- package/dist/tools/blind-index.js.map +1 -0
- package/dist/tools/cleanup-memories.d.ts +44 -0
- package/dist/tools/cleanup-memories.d.ts.map +1 -0
- package/dist/tools/cleanup-memories.js +126 -0
- package/dist/tools/cleanup-memories.js.map +1 -0
- package/dist/tools/context-checkpoint.d.ts +28 -0
- package/dist/tools/context-checkpoint.d.ts.map +1 -0
- package/dist/tools/context-checkpoint.js +140 -0
- package/dist/tools/context-checkpoint.js.map +1 -0
- package/dist/tools/context-profiles.d.ts +67 -0
- package/dist/tools/context-profiles.d.ts.map +1 -0
- package/dist/tools/context-profiles.js +30 -0
- package/dist/tools/context-profiles.js.map +1 -0
- package/dist/tools/create-note.d.ts +2 -0
- package/dist/tools/create-note.d.ts.map +1 -0
- package/dist/tools/create-note.js +60 -0
- package/dist/tools/create-note.js.map +1 -0
- package/dist/tools/create-vault.d.ts +5 -0
- package/dist/tools/create-vault.d.ts.map +1 -0
- package/dist/tools/create-vault.js +121 -0
- package/dist/tools/create-vault.js.map +1 -0
- package/dist/tools/decrypt-helpers.d.ts +31 -0
- package/dist/tools/decrypt-helpers.d.ts.map +1 -0
- package/dist/tools/decrypt-helpers.js +33 -0
- package/dist/tools/decrypt-helpers.js.map +1 -0
- package/dist/tools/delete-note.d.ts +2 -0
- package/dist/tools/delete-note.d.ts.map +1 -0
- package/dist/tools/delete-note.js +21 -0
- package/dist/tools/delete-note.js.map +1 -0
- package/dist/tools/explore-graph.d.ts +11 -0
- package/dist/tools/explore-graph.d.ts.map +1 -0
- package/dist/tools/explore-graph.js +169 -0
- package/dist/tools/explore-graph.js.map +1 -0
- package/dist/tools/get-related-memories.d.ts +2 -0
- package/dist/tools/get-related-memories.d.ts.map +1 -0
- package/dist/tools/get-related-memories.js +59 -0
- package/dist/tools/get-related-memories.js.map +1 -0
- package/dist/tools/knowledge-links.d.ts +17 -0
- package/dist/tools/knowledge-links.d.ts.map +1 -0
- package/dist/tools/knowledge-links.js +102 -0
- package/dist/tools/knowledge-links.js.map +1 -0
- package/dist/tools/list-active-agents.d.ts +5 -0
- package/dist/tools/list-active-agents.d.ts.map +1 -0
- package/dist/tools/list-active-agents.js +15 -0
- package/dist/tools/list-active-agents.js.map +1 -0
- package/dist/tools/list-notes.d.ts +2 -0
- package/dist/tools/list-notes.d.ts.map +1 -0
- package/dist/tools/list-notes.js +19 -0
- package/dist/tools/list-notes.js.map +1 -0
- package/dist/tools/list-vaults.d.ts +2 -0
- package/dist/tools/list-vaults.d.ts.map +1 -0
- package/dist/tools/list-vaults.js +19 -0
- package/dist/tools/list-vaults.js.map +1 -0
- package/dist/tools/mmr.d.ts +18 -0
- package/dist/tools/mmr.d.ts.map +1 -0
- package/dist/tools/mmr.js +67 -0
- package/dist/tools/mmr.js.map +1 -0
- package/dist/tools/read-memories.d.ts +2 -0
- package/dist/tools/read-memories.d.ts.map +1 -0
- package/dist/tools/read-memories.js +46 -0
- package/dist/tools/read-memories.js.map +1 -0
- package/dist/tools/read-note.d.ts +2 -0
- package/dist/tools/read-note.d.ts.map +1 -0
- package/dist/tools/read-note.js +35 -0
- package/dist/tools/read-note.js.map +1 -0
- package/dist/tools/read-notes.d.ts +6 -0
- package/dist/tools/read-notes.d.ts.map +1 -0
- package/dist/tools/read-notes.js +45 -0
- package/dist/tools/read-notes.js.map +1 -0
- package/dist/tools/resolve-vault-id.d.ts +6 -0
- package/dist/tools/resolve-vault-id.d.ts.map +1 -0
- package/dist/tools/resolve-vault-id.js +7 -0
- package/dist/tools/resolve-vault-id.js.map +1 -0
- package/dist/tools/rrf.d.ts +28 -0
- package/dist/tools/rrf.d.ts.map +1 -0
- package/dist/tools/rrf.js +19 -0
- package/dist/tools/rrf.js.map +1 -0
- package/dist/tools/search-and-read.d.ts +11 -0
- package/dist/tools/search-and-read.d.ts.map +1 -0
- package/dist/tools/search-and-read.js +208 -0
- package/dist/tools/search-and-read.js.map +1 -0
- package/dist/tools/search-memories.d.ts +13 -0
- package/dist/tools/search-memories.d.ts.map +1 -0
- package/dist/tools/search-memories.js +272 -0
- package/dist/tools/search-memories.js.map +1 -0
- package/dist/tools/search-notes.d.ts +2 -0
- package/dist/tools/search-notes.d.ts.map +1 -0
- package/dist/tools/search-notes.js +94 -0
- package/dist/tools/search-notes.js.map +1 -0
- package/dist/tools/semantic-search.d.ts +7 -0
- package/dist/tools/semantic-search.d.ts.map +1 -0
- package/dist/tools/semantic-search.js +85 -0
- package/dist/tools/semantic-search.js.map +1 -0
- package/dist/tools/session-start.d.ts +24 -0
- package/dist/tools/session-start.d.ts.map +1 -0
- package/dist/tools/session-start.js +256 -0
- package/dist/tools/session-start.js.map +1 -0
- package/dist/tools/stale-tasks.d.ts +22 -0
- package/dist/tools/stale-tasks.d.ts.map +1 -0
- package/dist/tools/stale-tasks.js +39 -0
- package/dist/tools/stale-tasks.js.map +1 -0
- package/dist/tools/temporal-decay.d.ts +21 -0
- package/dist/tools/temporal-decay.d.ts.map +1 -0
- package/dist/tools/temporal-decay.js +32 -0
- package/dist/tools/temporal-decay.js.map +1 -0
- package/dist/tools/update-memory.d.ts +19 -0
- package/dist/tools/update-memory.d.ts.map +1 -0
- package/dist/tools/update-memory.js +230 -0
- package/dist/tools/update-memory.js.map +1 -0
- package/dist/tools/update-note.d.ts +2 -0
- package/dist/tools/update-note.d.ts.map +1 -0
- package/dist/tools/update-note.js +79 -0
- package/dist/tools/update-note.js.map +1 -0
- package/dist/tools/vault-instruction-template.d.ts +17 -0
- package/dist/tools/vault-instruction-template.d.ts.map +1 -0
- package/dist/tools/vault-instruction-template.js +77 -0
- package/dist/tools/vault-instruction-template.js.map +1 -0
- package/dist/tools/wiki-link-sync.d.ts +34 -0
- package/dist/tools/wiki-link-sync.d.ts.map +1 -0
- package/dist/tools/wiki-link-sync.js +132 -0
- package/dist/tools/wiki-link-sync.js.map +1 -0
- package/dist/tools/wrap-tool-handler.d.ts +8 -0
- package/dist/tools/wrap-tool-handler.d.ts.map +1 -0
- package/dist/tools/wrap-tool-handler.js +32 -0
- package/dist/tools/wrap-tool-handler.js.map +1 -0
- package/dist/tools/write-memory.d.ts +34 -0
- package/dist/tools/write-memory.d.ts.map +1 -0
- package/dist/tools/write-memory.js +359 -0
- package/dist/tools/write-memory.js.map +1 -0
- package/dist/usage.d.ts +11 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +38 -0
- package/dist/usage.js.map +1 -0
- package/dist/wiki-link-parser.d.ts +27 -0
- package/dist/wiki-link-parser.d.ts.map +1 -0
- package/dist/wiki-link-parser.js +93 -0
- package/dist/wiki-link-parser.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type coercion for MCP tool parameters.
|
|
3
|
+
*
|
|
4
|
+
* LLM clients (Claude Code, Cursor, etc.) sometimes pass all MCP tool
|
|
5
|
+
* parameters as strings, even when the schema declares number, boolean,
|
|
6
|
+
* or array types. This module provides Zod preprocess wrappers that
|
|
7
|
+
* coerce string values to their intended types before validation.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* // Wrap individual schemas
|
|
11
|
+
* const schema = coerceSchema(z.number().int().min(1));
|
|
12
|
+
* schema.parse("10"); // → 10
|
|
13
|
+
*
|
|
14
|
+
* // Or coerce an entire inputSchema record
|
|
15
|
+
* const inputSchema = coerceInputSchema({
|
|
16
|
+
* topK: s(z.number().optional()),
|
|
17
|
+
* compact: s(z.boolean().optional()),
|
|
18
|
+
* memoryIds: s(z.array(z.string().uuid())),
|
|
19
|
+
* });
|
|
20
|
+
*/
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
type AnySchema = import("@modelcontextprotocol/sdk/server/zod-compat.js").AnySchema;
|
|
23
|
+
/**
|
|
24
|
+
* Wrap a Zod schema with a preprocess step that coerces string inputs
|
|
25
|
+
* to the appropriate type (number, boolean, or array) before validation.
|
|
26
|
+
*
|
|
27
|
+
* For types that don't need coercion (strings, enums, etc.), returns
|
|
28
|
+
* the original schema unchanged.
|
|
29
|
+
*/
|
|
30
|
+
export declare function coerceSchema<T extends z.ZodType>(schema: T): z.ZodType;
|
|
31
|
+
/**
|
|
32
|
+
* Coerce all schemas in an inputSchema record (as used by `server.registerTool`).
|
|
33
|
+
* Applies `coerceSchema` to each value in the record.
|
|
34
|
+
*/
|
|
35
|
+
export declare function coerceInputSchema(record: Record<string, AnySchema>): Record<string, AnySchema>;
|
|
36
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coerce-params.d.ts","sourceRoot":"","sources":["../src/coerce-params.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,KAAK,SAAS,GAAG,OAAO,gDAAgD,EAAE,SAAS,CAAC;AAoCpF;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAgDtE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAChC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAM3B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type coercion for MCP tool parameters.
|
|
3
|
+
*
|
|
4
|
+
* LLM clients (Claude Code, Cursor, etc.) sometimes pass all MCP tool
|
|
5
|
+
* parameters as strings, even when the schema declares number, boolean,
|
|
6
|
+
* or array types. This module provides Zod preprocess wrappers that
|
|
7
|
+
* coerce string values to their intended types before validation.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* // Wrap individual schemas
|
|
11
|
+
* const schema = coerceSchema(z.number().int().min(1));
|
|
12
|
+
* schema.parse("10"); // → 10
|
|
13
|
+
*
|
|
14
|
+
* // Or coerce an entire inputSchema record
|
|
15
|
+
* const inputSchema = coerceInputSchema({
|
|
16
|
+
* topK: s(z.number().optional()),
|
|
17
|
+
* compact: s(z.boolean().optional()),
|
|
18
|
+
* memoryIds: s(z.array(z.string().uuid())),
|
|
19
|
+
* });
|
|
20
|
+
*/
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
/**
|
|
23
|
+
* Detect the "inner" Zod type, unwrapping ZodOptional/ZodDefault/ZodNullable.
|
|
24
|
+
*/
|
|
25
|
+
function getInnerType(schema) {
|
|
26
|
+
if (schema instanceof z.ZodOptional || schema instanceof z.ZodNullable) {
|
|
27
|
+
return getInnerType(schema._def.innerType);
|
|
28
|
+
}
|
|
29
|
+
if (schema instanceof z.ZodDefault) {
|
|
30
|
+
return getInnerType(schema._def.innerType);
|
|
31
|
+
}
|
|
32
|
+
return schema;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Returns true if the inner type is a ZodNumber.
|
|
36
|
+
*/
|
|
37
|
+
function isNumberType(schema) {
|
|
38
|
+
return getInnerType(schema) instanceof z.ZodNumber;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns true if the inner type is a ZodBoolean.
|
|
42
|
+
*/
|
|
43
|
+
function isBooleanType(schema) {
|
|
44
|
+
return getInnerType(schema) instanceof z.ZodBoolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Returns true if the inner type is a ZodArray.
|
|
48
|
+
*/
|
|
49
|
+
function isArrayType(schema) {
|
|
50
|
+
return getInnerType(schema) instanceof z.ZodArray;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Wrap a Zod schema with a preprocess step that coerces string inputs
|
|
54
|
+
* to the appropriate type (number, boolean, or array) before validation.
|
|
55
|
+
*
|
|
56
|
+
* For types that don't need coercion (strings, enums, etc.), returns
|
|
57
|
+
* the original schema unchanged.
|
|
58
|
+
*/
|
|
59
|
+
export function coerceSchema(schema) {
|
|
60
|
+
if (isNumberType(schema)) {
|
|
61
|
+
return z.preprocess((val) => {
|
|
62
|
+
if (typeof val === "string") {
|
|
63
|
+
const num = Number(val);
|
|
64
|
+
if (Number.isNaN(num))
|
|
65
|
+
return val; // let Zod reject it
|
|
66
|
+
return num;
|
|
67
|
+
}
|
|
68
|
+
return val;
|
|
69
|
+
}, schema);
|
|
70
|
+
}
|
|
71
|
+
if (isBooleanType(schema)) {
|
|
72
|
+
return z.preprocess((val) => {
|
|
73
|
+
if (typeof val === "string") {
|
|
74
|
+
if (val === "true")
|
|
75
|
+
return true;
|
|
76
|
+
if (val === "false")
|
|
77
|
+
return false;
|
|
78
|
+
return val; // let Zod reject it
|
|
79
|
+
}
|
|
80
|
+
return val;
|
|
81
|
+
}, schema);
|
|
82
|
+
}
|
|
83
|
+
if (isArrayType(schema)) {
|
|
84
|
+
return z.preprocess((val) => {
|
|
85
|
+
if (typeof val === "string") {
|
|
86
|
+
// Try JSON.parse first (handles '["a","b"]')
|
|
87
|
+
if (val.startsWith("[")) {
|
|
88
|
+
try {
|
|
89
|
+
const parsed = JSON.parse(val);
|
|
90
|
+
if (Array.isArray(parsed))
|
|
91
|
+
return parsed;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// fall through
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Try comma-separated (handles "uuid1,uuid2")
|
|
98
|
+
if (val.includes(",")) {
|
|
99
|
+
return val.split(",").map((s) => s.trim());
|
|
100
|
+
}
|
|
101
|
+
// Single value — don't coerce, let Zod reject "expected array"
|
|
102
|
+
return val;
|
|
103
|
+
}
|
|
104
|
+
return val;
|
|
105
|
+
}, schema);
|
|
106
|
+
}
|
|
107
|
+
// String, enum, object, etc. — no coercion needed
|
|
108
|
+
return schema;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Coerce all schemas in an inputSchema record (as used by `server.registerTool`).
|
|
112
|
+
* Applies `coerceSchema` to each value in the record.
|
|
113
|
+
*/
|
|
114
|
+
export function coerceInputSchema(record) {
|
|
115
|
+
const result = {};
|
|
116
|
+
for (const [key, schema] of Object.entries(record)) {
|
|
117
|
+
result[key] = coerceSchema(schema);
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coerce-params.js","sourceRoot":"","sources":["../src/coerce-params.ts"],"names":[],"mappings":"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"}
|
package/dist/crypto.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ported crypto functions from ExoVault web app (src/lib/crypto/).
|
|
3
|
+
* Uses Web Crypto API — works in Node.js 20+ via globalThis.crypto.
|
|
4
|
+
*/
|
|
5
|
+
export declare function bufferToHex(buffer: Uint8Array): string;
|
|
6
|
+
export declare function hexToBuffer(hex: string): Uint8Array;
|
|
7
|
+
export declare function bufferToBase64(buffer: Uint8Array): string;
|
|
8
|
+
export declare function base64ToBuffer(base64: string): Uint8Array;
|
|
9
|
+
/**
|
|
10
|
+
* Derives a wrapping key from a password using PBKDF2.
|
|
11
|
+
* Used to encrypt/decrypt the raw MEK bytes.
|
|
12
|
+
*/
|
|
13
|
+
export declare function deriveWrappingKey(password: string, saltHex: string, iterations: number): Promise<CryptoKey>;
|
|
14
|
+
/**
|
|
15
|
+
* Unwraps (decrypts) the MEK bytes using AES-GCM with the wrapping key.
|
|
16
|
+
*/
|
|
17
|
+
export declare function unwrapMasterKey(wrappedKeyHex: string, ivHex: string, wrappingKey: CryptoKey): Promise<Uint8Array>;
|
|
18
|
+
/**
|
|
19
|
+
* Imports raw MEK bytes as a non-extractable AES-GCM CryptoKey.
|
|
20
|
+
*/
|
|
21
|
+
export declare function importMasterKey(mekBytes: Uint8Array): Promise<CryptoKey>;
|
|
22
|
+
/**
|
|
23
|
+
* Hashes a pending wiki-link target name for privacy-preserving matching.
|
|
24
|
+
* Normalizes (trim + lowercase) before hashing so "My Note" and " my note "
|
|
25
|
+
* produce the same hash. Uses SHA-256 — one-way, no plaintext stored in DB.
|
|
26
|
+
*/
|
|
27
|
+
export declare function hashPendingTarget(name: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Encrypts plaintext using AES-256-GCM with a fresh random IV.
|
|
30
|
+
* Returns base64-encoded ciphertext and hex-encoded IV.
|
|
31
|
+
*/
|
|
32
|
+
export declare function encrypt(plaintext: string, key: CryptoKey): Promise<{
|
|
33
|
+
ciphertext: string;
|
|
34
|
+
iv: string;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Decrypts AES-256-GCM ciphertext back to plaintext.
|
|
38
|
+
*/
|
|
39
|
+
export declare function decrypt(ciphertextBase64: string, ivHex: string, key: CryptoKey): Promise<string>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAMtD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAYnD;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAEzD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAEzD;AAID;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,CAAC,CAyBpB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,SAAS,GACrB,OAAO,CAAC,UAAU,CAAC,CAerB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,UAAU,GACnB,OAAO,CAAC,SAAS,CAAC,CAQpB;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD;AAID;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,SAAS,GACb,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB7C;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,SAAS,GACb,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
|
package/dist/crypto.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ported crypto functions from ExoVault web app (src/lib/crypto/).
|
|
3
|
+
* Uses Web Crypto API — works in Node.js 20+ via globalThis.crypto.
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from "node:crypto";
|
|
6
|
+
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
7
|
+
const ALGORITHM = "AES-GCM";
|
|
8
|
+
const KEY_LENGTH = 256;
|
|
9
|
+
const IV_LENGTH = 12; // bytes (96 bits for GCM)
|
|
10
|
+
const TAG_LENGTH = 128; // bits
|
|
11
|
+
const KDF_ALGORITHM = "PBKDF2";
|
|
12
|
+
const KDF_HASH = "SHA-256";
|
|
13
|
+
// ─── Buffer ↔ Hex ─────────────────────────────────────────────────────────────
|
|
14
|
+
export function bufferToHex(buffer) {
|
|
15
|
+
const hexParts = [];
|
|
16
|
+
for (const byte of buffer) {
|
|
17
|
+
hexParts.push(byte.toString(16).padStart(2, "0"));
|
|
18
|
+
}
|
|
19
|
+
return hexParts.join("");
|
|
20
|
+
}
|
|
21
|
+
export function hexToBuffer(hex) {
|
|
22
|
+
if (hex.length % 2 !== 0) {
|
|
23
|
+
throw new Error("Invalid hex string: length must be even");
|
|
24
|
+
}
|
|
25
|
+
if (!/^[0-9a-fA-F]*$/.test(hex)) {
|
|
26
|
+
throw new Error("Invalid hex string: contains non-hex characters");
|
|
27
|
+
}
|
|
28
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
29
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
30
|
+
bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);
|
|
31
|
+
}
|
|
32
|
+
return bytes;
|
|
33
|
+
}
|
|
34
|
+
// ─── Buffer ↔ Base64 ──────────────────────────────────────────────────────────
|
|
35
|
+
export function bufferToBase64(buffer) {
|
|
36
|
+
return Buffer.from(buffer).toString("base64");
|
|
37
|
+
}
|
|
38
|
+
export function base64ToBuffer(base64) {
|
|
39
|
+
return new Uint8Array(Buffer.from(base64, "base64"));
|
|
40
|
+
}
|
|
41
|
+
// ─── Key Wrapping (PBKDF2 → AES-GCM) ─────────────────────────────────────────
|
|
42
|
+
/**
|
|
43
|
+
* Derives a wrapping key from a password using PBKDF2.
|
|
44
|
+
* Used to encrypt/decrypt the raw MEK bytes.
|
|
45
|
+
*/
|
|
46
|
+
export async function deriveWrappingKey(password, saltHex, iterations) {
|
|
47
|
+
const encoder = new TextEncoder();
|
|
48
|
+
const passwordBytes = encoder.encode(password);
|
|
49
|
+
const salt = hexToBuffer(saltHex);
|
|
50
|
+
const baseKey = await globalThis.crypto.subtle.importKey("raw", passwordBytes.buffer, KDF_ALGORITHM, false, ["deriveKey"]);
|
|
51
|
+
return globalThis.crypto.subtle.deriveKey({
|
|
52
|
+
name: KDF_ALGORITHM,
|
|
53
|
+
salt: salt.buffer,
|
|
54
|
+
iterations,
|
|
55
|
+
hash: KDF_HASH,
|
|
56
|
+
}, baseKey, { name: ALGORITHM, length: KEY_LENGTH }, false, ["encrypt", "decrypt"]);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Unwraps (decrypts) the MEK bytes using AES-GCM with the wrapping key.
|
|
60
|
+
*/
|
|
61
|
+
export async function unwrapMasterKey(wrappedKeyHex, ivHex, wrappingKey) {
|
|
62
|
+
const wrappedKeyBuffer = hexToBuffer(wrappedKeyHex);
|
|
63
|
+
const iv = hexToBuffer(ivHex);
|
|
64
|
+
const decrypted = await globalThis.crypto.subtle.decrypt({
|
|
65
|
+
name: ALGORITHM,
|
|
66
|
+
iv: iv.buffer,
|
|
67
|
+
tagLength: TAG_LENGTH,
|
|
68
|
+
}, wrappingKey, wrappedKeyBuffer.buffer);
|
|
69
|
+
return new Uint8Array(decrypted);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Imports raw MEK bytes as a non-extractable AES-GCM CryptoKey.
|
|
73
|
+
*/
|
|
74
|
+
export async function importMasterKey(mekBytes) {
|
|
75
|
+
return globalThis.crypto.subtle.importKey("raw", mekBytes.buffer, { name: ALGORITHM, length: KEY_LENGTH }, false, ["encrypt", "decrypt"]);
|
|
76
|
+
}
|
|
77
|
+
// ─── Hashing ─────────────────────────────────────────────────────────────────
|
|
78
|
+
/**
|
|
79
|
+
* Hashes a pending wiki-link target name for privacy-preserving matching.
|
|
80
|
+
* Normalizes (trim + lowercase) before hashing so "My Note" and " my note "
|
|
81
|
+
* produce the same hash. Uses SHA-256 — one-way, no plaintext stored in DB.
|
|
82
|
+
*/
|
|
83
|
+
export function hashPendingTarget(name) {
|
|
84
|
+
const normalized = name.trim().toLowerCase();
|
|
85
|
+
return createHash("sha256").update(normalized, "utf-8").digest("hex");
|
|
86
|
+
}
|
|
87
|
+
// ─── Encrypt / Decrypt ────────────────────────────────────────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* Encrypts plaintext using AES-256-GCM with a fresh random IV.
|
|
90
|
+
* Returns base64-encoded ciphertext and hex-encoded IV.
|
|
91
|
+
*/
|
|
92
|
+
export async function encrypt(plaintext, key) {
|
|
93
|
+
const encoder = new TextEncoder();
|
|
94
|
+
const plaintextBytes = encoder.encode(plaintext);
|
|
95
|
+
const iv = globalThis.crypto.getRandomValues(new Uint8Array(IV_LENGTH));
|
|
96
|
+
const ciphertextBuffer = await globalThis.crypto.subtle.encrypt({
|
|
97
|
+
name: ALGORITHM,
|
|
98
|
+
iv: iv.buffer,
|
|
99
|
+
tagLength: TAG_LENGTH,
|
|
100
|
+
}, key, plaintextBytes.buffer);
|
|
101
|
+
return {
|
|
102
|
+
ciphertext: bufferToBase64(new Uint8Array(ciphertextBuffer)),
|
|
103
|
+
iv: bufferToHex(iv),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Decrypts AES-256-GCM ciphertext back to plaintext.
|
|
108
|
+
*/
|
|
109
|
+
export async function decrypt(ciphertextBase64, ivHex, key) {
|
|
110
|
+
const ciphertextBytes = base64ToBuffer(ciphertextBase64);
|
|
111
|
+
const iv = hexToBuffer(ivHex);
|
|
112
|
+
const plaintextBuffer = await globalThis.crypto.subtle.decrypt({
|
|
113
|
+
name: ALGORITHM,
|
|
114
|
+
iv: iv.buffer,
|
|
115
|
+
tagLength: TAG_LENGTH,
|
|
116
|
+
}, key, ciphertextBytes.buffer);
|
|
117
|
+
const decoder = new TextDecoder();
|
|
118
|
+
return decoder.decode(plaintextBuffer);
|
|
119
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
|