@hydradb/mcp 1.1.0 → 1.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/CHANGELOG.md +167 -0
- package/README.md +92 -34
- package/dist/adapters.d.ts +27 -16
- package/dist/adapters.js +58 -54
- package/dist/adapters.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +27 -1
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +43 -3
- package/dist/context.js +374 -34
- package/dist/context.js.map +1 -1
- package/dist/descriptions.d.ts +57 -28
- package/dist/descriptions.js +203 -49
- package/dist/descriptions.js.map +1 -1
- package/dist/hydra/client.d.ts +69 -8
- package/dist/hydra/client.js +102 -20
- package/dist/hydra/client.js.map +1 -1
- package/dist/hydra/errors.js +91 -6
- package/dist/hydra/errors.js.map +1 -1
- package/dist/hydra/index.d.ts +2 -2
- package/dist/hydra/index.js +1 -1
- package/dist/hydra/index.js.map +1 -1
- package/dist/index.js +97 -10
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +18 -1
- package/dist/server.js +998 -106
- package/dist/server.js.map +1 -1
- package/dist/tool-names.d.ts +2 -1
- package/dist/tool-names.js +2 -0
- package/dist/tool-names.js.map +1 -1
- package/dist/types.d.ts +8 -51
- package/dist/types.js +6 -5
- package/dist/types.js.map +1 -1
- package/package.json +11 -6
package/dist/descriptions.d.ts
CHANGED
|
@@ -9,70 +9,97 @@
|
|
|
9
9
|
export declare const TOOL_DESCRIPTIONS: {
|
|
10
10
|
readonly hydradb_query: {
|
|
11
11
|
readonly title: "Query Hydra DB";
|
|
12
|
-
readonly description:
|
|
12
|
+
readonly description: "Search Hydra DB for anything the user has stored: memories (facts, preferences, decisions, past conversations) and ingested knowledge sources (documents, files, playbooks). Returns matching chunks with their source id, a relevance score, and knowledge-graph context — the entity paths and relations that connect facts across separate sources.\n\nCALL THIS BEFORE ANSWERING whenever the answer could depend on the user's history, preferences, prior decisions, project details, or a document they have ingested — including when you are merely unsure. A query that returns nothing costs one call; answering from a blank slate costs the user a correction.\n\nSearches both families by default. Every result carries `[id: …]` — pass it to hydradb_inspect for the full source, or to hydradb_delete to remove it.\n\nExamples:\n {\"query\": \"how does the user prefer code review feedback\"}\n {\"query\": \"postgres connection pooling decision\", \"kind\": \"knowledge\"}\n {\"query\": \"deploy checklist\", \"mode\": \"fast\", \"max_results\": 5}";
|
|
13
13
|
readonly params: {
|
|
14
|
-
readonly query:
|
|
15
|
-
readonly
|
|
16
|
-
readonly
|
|
17
|
-
readonly
|
|
14
|
+
readonly query: string;
|
|
15
|
+
readonly kind: string;
|
|
16
|
+
readonly max_results: string;
|
|
17
|
+
readonly mode: string;
|
|
18
|
+
readonly graph_context: string;
|
|
19
|
+
readonly detail: string;
|
|
20
|
+
readonly operator: string;
|
|
21
|
+
readonly source_ids: string;
|
|
22
|
+
readonly metadata_filters: string;
|
|
23
|
+
readonly num_related_chunks: string;
|
|
18
24
|
};
|
|
19
25
|
};
|
|
20
26
|
readonly hydradb_ingest: {
|
|
21
27
|
readonly title: "Ingest into Hydra DB";
|
|
22
|
-
readonly description:
|
|
28
|
+
readonly description: "Save information to Hydra DB so it outlives this session. Hydra DB extracts insights, preferences and knowledge-graph entities from what you store.\n\nProvide EXACTLY ONE of:\n `text` — a note, fact, decision, or document body\n `turns` — user/assistant pairs from a conversation\nPassing both is an error; passing neither is an error.\n\nSave proactively: when the user states a preference, makes a decision, corrects you, or reveals a durable fact about themselves or their work, store it without being asked. Store the distilled fact rather than the raw exchange, and always set `title` — it is the only label shown next to this entry in later search results. Before saving something you suspect is already stored, query for it first rather than adding a near-duplicate.\n\nNever store secrets, credentials, or anything the user asked you not to keep.\n\nExamples:\n {\"text\": \"Prefers tabs over spaces in every language; rejected two prettier configs that used spaces.\", \"title\": \"Indentation preference\"}\n {\"turns\": [{\"user\": \"let's go with Postgres\", \"assistant\": \"Agreed, I'll set up the schema.\"}], \"title\": \"Datastore decision\"}\n {\"text\": \"# Runbook\\n\\nRestart order: api, worker, scheduler.\", \"kind\": \"knowledge\", \"title\": \"Restart runbook\"}";
|
|
23
29
|
readonly params: {
|
|
24
|
-
readonly text:
|
|
25
|
-
readonly
|
|
30
|
+
readonly text: string;
|
|
31
|
+
readonly kind: string;
|
|
32
|
+
readonly title: string;
|
|
26
33
|
readonly source_id: string;
|
|
27
|
-
readonly infer:
|
|
28
|
-
readonly is_markdown:
|
|
29
|
-
readonly
|
|
30
|
-
readonly
|
|
34
|
+
readonly infer: string;
|
|
35
|
+
readonly is_markdown: string;
|
|
36
|
+
readonly overwrite: string;
|
|
37
|
+
readonly metadata: string;
|
|
38
|
+
readonly observation_date: string;
|
|
39
|
+
readonly turns: string;
|
|
40
|
+
readonly user_name: string;
|
|
31
41
|
};
|
|
32
42
|
};
|
|
33
43
|
readonly hydradb_list: {
|
|
34
44
|
readonly title: "List Hydra DB Context";
|
|
35
|
-
readonly description:
|
|
45
|
+
readonly description: "Enumerate what is stored in Hydra DB — every memory (kind: \"memory\") or every knowledge source (kind: \"knowledge\"). These are SEPARATE corpora and this tool returns one at a time: listing memories tells you nothing about which knowledge sources exist, and vice versa. Call it twice to see everything.\n\nUse it for inventory questions (\"what do you remember about me?\", \"which documents are indexed?\") and to obtain ids. For \"what do you know about X\", use hydradb_query instead — listing everything and reading it is far more expensive and loses relevance ranking.\n\nResults are paginated. The response says how many of the total it showed and how to reach the rest; do not treat the first page as the whole store.\n\nMemory rows come back as [id] content. Knowledge rows as [id] — title (type), with no content — pass an id to hydradb_inspect for the text.";
|
|
36
46
|
readonly params: {
|
|
37
|
-
readonly kind:
|
|
47
|
+
readonly kind: string;
|
|
38
48
|
readonly source_ids: "Optional array of specific source IDs to filter by. If omitted, lists all sources.";
|
|
49
|
+
readonly page: string;
|
|
50
|
+
readonly page_size: string;
|
|
39
51
|
};
|
|
40
52
|
};
|
|
41
53
|
readonly hydradb_inspect: {
|
|
42
54
|
readonly title: "Inspect Hydra DB Source";
|
|
43
|
-
readonly description:
|
|
55
|
+
readonly description: "Fetch the full original content of ONE stored item by its id. Use it after hydradb_query or hydradb_list when a truncated chunk or listing row is not enough and you need the whole document.\n\nThe id is the value shown as `[id: …]` in hydradb_query results and in [brackets] in hydradb_list output. Ids are not guessable — take one from those tools rather than constructing it.\n\nLong sources come back in slices; the response says where it stopped and what offset continues it. Binary sources are never inlined — you get their type and size, and `mode: \"url\"` returns a download link.";
|
|
44
56
|
readonly params: {
|
|
45
57
|
readonly source_id: "The source ID to fetch content for";
|
|
46
|
-
readonly mode:
|
|
58
|
+
readonly mode: string;
|
|
59
|
+
readonly offset: string;
|
|
60
|
+
readonly limit: string;
|
|
61
|
+
readonly expiry_seconds: string;
|
|
47
62
|
};
|
|
48
63
|
};
|
|
49
64
|
readonly hydradb_delete: {
|
|
50
65
|
readonly title: "Delete from Hydra DB";
|
|
51
|
-
readonly description:
|
|
66
|
+
readonly description: "Permanently remove one memory or one knowledge source from Hydra DB by id. This cannot be undone; there is no trash.\n\nTake the id from hydradb_query or hydradb_list — never guess one. Confirm with the user before deleting anything they did not name: \"forget that I use vim\" authorises deleting that memory; \"clean up my memories\" authorises nothing until they have seen the list.\n\n`kind` must match the family the id belongs to. A knowledge source id passed with kind \"memory\" reports that nothing was deleted while the source is still there.";
|
|
52
67
|
readonly params: {
|
|
53
|
-
readonly
|
|
68
|
+
readonly ids: string;
|
|
69
|
+
readonly id: "A single ID to delete. Prefer `ids` when removing more than one.";
|
|
54
70
|
readonly kind: "Which context family the ID belongs to: 'memory' or 'knowledge' (default: 'memory')";
|
|
55
71
|
};
|
|
56
72
|
};
|
|
73
|
+
readonly hydradb_status: {
|
|
74
|
+
readonly title: "Check Hydra DB Indexing Status";
|
|
75
|
+
readonly description: string;
|
|
76
|
+
readonly params: {
|
|
77
|
+
readonly ids: "The source IDs to check, as returned by hydradb_ingest.";
|
|
78
|
+
};
|
|
79
|
+
};
|
|
57
80
|
readonly hydra_db_search: {
|
|
58
81
|
readonly title: "Search Hydra DB Memory (deprecated)";
|
|
59
82
|
readonly description: string;
|
|
60
83
|
readonly params: {
|
|
61
|
-
readonly query:
|
|
62
|
-
readonly
|
|
63
|
-
readonly
|
|
64
|
-
readonly
|
|
84
|
+
readonly query: string;
|
|
85
|
+
readonly kind: string;
|
|
86
|
+
readonly max_results: string;
|
|
87
|
+
readonly mode: string;
|
|
88
|
+
readonly graph_context: string;
|
|
65
89
|
};
|
|
66
90
|
};
|
|
67
91
|
readonly hydra_db_store: {
|
|
68
92
|
readonly title: "Store to Hydra DB Memory (deprecated)";
|
|
69
93
|
readonly description: string;
|
|
70
94
|
readonly params: {
|
|
71
|
-
readonly text:
|
|
72
|
-
readonly title:
|
|
95
|
+
readonly text: string;
|
|
96
|
+
readonly title: string;
|
|
73
97
|
readonly source_id: string;
|
|
74
|
-
readonly
|
|
75
|
-
readonly
|
|
98
|
+
readonly metadata: string;
|
|
99
|
+
readonly observation_date: string;
|
|
100
|
+
readonly infer: string;
|
|
101
|
+
readonly is_markdown: string;
|
|
102
|
+
readonly overwrite: string;
|
|
76
103
|
};
|
|
77
104
|
};
|
|
78
105
|
readonly hydra_db_ingest_conversation: {
|
|
@@ -81,7 +108,7 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
81
108
|
readonly params: {
|
|
82
109
|
readonly turns: "Array of conversation turns, each with a 'user' and 'assistant' field";
|
|
83
110
|
readonly source_id: "Source identifier to group all turns from the same session together";
|
|
84
|
-
readonly user_name:
|
|
111
|
+
readonly user_name: string;
|
|
85
112
|
};
|
|
86
113
|
};
|
|
87
114
|
readonly hydra_db_list_memories: {
|
|
@@ -100,7 +127,9 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
100
127
|
readonly description: string;
|
|
101
128
|
readonly params: {
|
|
102
129
|
readonly source_id: "The source ID to fetch content for";
|
|
103
|
-
readonly mode:
|
|
130
|
+
readonly mode: string;
|
|
131
|
+
readonly offset: string;
|
|
132
|
+
readonly limit: string;
|
|
104
133
|
};
|
|
105
134
|
};
|
|
106
135
|
readonly hydra_db_delete_memory: {
|
package/dist/descriptions.js
CHANGED
|
@@ -9,38 +9,133 @@
|
|
|
9
9
|
import { ALIAS_REPLACEMENTS, TOOL_NAMES } from "./tool-names.js";
|
|
10
10
|
// Shared parameter blurbs, reused across canonical tools and their aliases.
|
|
11
11
|
const PARAM = {
|
|
12
|
-
query: "
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
query: "What you want to know, as a natural-language question or topic — this is semantic " +
|
|
13
|
+
"search, so a full question beats keywords. Search for the CONCEPT, not the words " +
|
|
14
|
+
"the user used: 'database migration decisions' will find a memory written as 'we " +
|
|
15
|
+
"settled on Atlas for schema changes'.",
|
|
16
|
+
query_kind: "Which context family to search: 'memory' for stored user memories, " +
|
|
17
|
+
"'knowledge' for ingested documents and sources, or 'all' for both " +
|
|
18
|
+
"(default: 'all'). Leave unset unless you specifically want to exclude one family.",
|
|
19
|
+
max_results: "Maximum CHUNKS to return (1-50, default: 10). Chunks, not whole memories or " +
|
|
20
|
+
"documents — several chunks often come from one source. Raise to 20-30 for broad " +
|
|
21
|
+
"coverage of a topic; drop to 3-5 when you want one specific fact and a small " +
|
|
22
|
+
"response.",
|
|
23
|
+
mode: "'thinking' (default) runs graph traversal and personalised reranking: a few " +
|
|
24
|
+
"seconds, best recall — use it when the answer matters or the question is about " +
|
|
25
|
+
"the user. 'fast' is plain semantic search and is markedly quicker — use it for a " +
|
|
26
|
+
"lookup you expect to hit, or when issuing several queries in a row. 'auto' lets " +
|
|
27
|
+
"Hydra DB pick based on the query.",
|
|
28
|
+
query_source_ids: "Restrict the search to these source IDs, taken from hydradb_query or " +
|
|
29
|
+
"hydradb_list. Turns a search into 'search inside these documents'. This is a " +
|
|
30
|
+
"hard filter: if none of them match, the result is empty rather than widened.",
|
|
31
|
+
metadata_filters: "Exact-match filters over stored metadata, as {key: value}. Exact match only — " +
|
|
32
|
+
"no ranges, no partial matches, no dates-since. Only useful for keys you know " +
|
|
33
|
+
"exist, typically because you set them when ingesting.",
|
|
34
|
+
num_related_chunks: "Adjacent chunks to attach to each match for surrounding context (default: 0). " +
|
|
35
|
+
"Each one multiplies the response size, so use 1-2 only when snippets are " +
|
|
36
|
+
"arriving mid-sentence; prefer hydradb_inspect when you want a whole source.",
|
|
37
|
+
operator: "How to combine the terms in your query: 'or' (default) matches any, 'and' " +
|
|
38
|
+
"requires all, 'phrase' matches the words together in order. Reach for 'phrase' " +
|
|
39
|
+
"when looking up an exact string such as an error message or a config key.",
|
|
40
|
+
expiry_seconds: "How long the download link stays valid, in seconds. Only meaningful with " +
|
|
41
|
+
"mode 'url' or 'both'; ignored otherwise.",
|
|
42
|
+
graph_context: "Include knowledge-graph relations (default: true). These are the entity paths — " +
|
|
43
|
+
"(Alice)-[prefers]->(Tea) — that connect facts across separate memories, and they " +
|
|
44
|
+
"often carry the answer the matching text alone does not. Set false only when you " +
|
|
45
|
+
"want the raw matching text and nothing else.",
|
|
46
|
+
text: "The information to store. Provide EXACTLY ONE of `text` or `turns` — passing " +
|
|
47
|
+
"both is an error, and so is passing neither. Write it standalone: it must still " +
|
|
48
|
+
"make sense months from now with no surrounding conversation, so resolve pronouns " +
|
|
49
|
+
"and relative dates ('in March 2026', not 'last week').",
|
|
50
|
+
ingest_kind: "What to write: 'memory' for a personal fact, preference or conversation " +
|
|
51
|
+
"(default), or 'knowledge' to store a document as a searchable source. " +
|
|
52
|
+
"Memory-only options (turns, source_id, infer, is_markdown, user_name) do not " +
|
|
53
|
+
"apply to knowledge and are rejected rather than ignored.",
|
|
54
|
+
title: "A short, specific label — always set it. This is the ONLY label shown next to " +
|
|
55
|
+
"this entry in later hydradb_query results, so 'Deployment rollback policy' is " +
|
|
56
|
+
"useful where a generic one tells you nothing. If omitted, a title is derived " +
|
|
57
|
+
"from the first line of the text, which is rarely as good as one you choose.",
|
|
58
|
+
source_id: "Optional identifier for this entry. Ingesting again with an existing source_id " +
|
|
59
|
+
"REPLACES everything previously stored under it — it does not add to it. Use a fresh " +
|
|
60
|
+
"id (or leave it unset) for each new fact, and reuse an id only when you deliberately " +
|
|
61
|
+
"mean to overwrite, such as correcting a memory you saved earlier. Leave unset if unsure.",
|
|
62
|
+
overwrite: "Whether ingesting with an existing source_id may replace what is stored there " +
|
|
63
|
+
"(default: true). Set false to have the server reject the write instead of " +
|
|
64
|
+
"overwriting, when you expect to be creating something new.",
|
|
65
|
+
metadata: "Key/value metadata to store with this entry, as {key: value}. These are the " +
|
|
66
|
+
"keys hydradb_query's metadata_filters can match on later, so set them when you " +
|
|
67
|
+
"expect to narrow by them — e.g. {\"project\": \"hydradb\", \"kind\": \"decision\"}.",
|
|
68
|
+
observation_date: "When the fact was true, as an RFC3339 date — distinct from when you stored it. " +
|
|
69
|
+
"Use it when saving something historical, so recency reflects the fact rather " +
|
|
70
|
+
"than the write.",
|
|
71
|
+
infer: "Let Hydra DB extract insights and knowledge-graph entities from this text " +
|
|
72
|
+
"(default: true). Keep it true for anything about the user or their work — that " +
|
|
73
|
+
"extraction is what makes the content findable by concept later. Set false only to " +
|
|
74
|
+
"store text verbatim with no interpretation (a config snippet, an exact error " +
|
|
75
|
+
"string, a code block).",
|
|
76
|
+
is_markdown: "Set true when `text` contains markdown (headings, lists, code fences) so Hydra DB " +
|
|
77
|
+
"chunks on structure instead of splitting mid-section. Default false.",
|
|
22
78
|
turns: "Array of conversation turns, each with a 'user' and 'assistant' field",
|
|
23
|
-
user_name: "
|
|
24
|
-
|
|
79
|
+
user_name: "What to call the user in the stored conversation (default: 'User'). Set it when " +
|
|
80
|
+
"you know their actual name, so extracted facts read as being about a person " +
|
|
81
|
+
"rather than about an anonymous participant. Applies to `turns` only.",
|
|
82
|
+
kind: "Which family to list: 'memory' (stored memories) or 'knowledge' (ingested " +
|
|
83
|
+
"sources). REQUIRED — these are separate corpora with different output, and no " +
|
|
84
|
+
"single listing covers both. Call this twice to see everything.",
|
|
25
85
|
source_ids: "Optional array of specific source IDs to filter by. If omitted, lists all sources.",
|
|
86
|
+
page: "Which page of results to return, 1-indexed (default: 1). The response reports how " +
|
|
87
|
+
"many of the total it showed; pass the next page to continue rather than assuming " +
|
|
88
|
+
"the first page is everything.",
|
|
89
|
+
page_size: "How many items to return per page (1-100). Defaults to the server's page size. " +
|
|
90
|
+
"Raise it to see more at once; lower it to keep the response small.",
|
|
91
|
+
detail: "How much of each matching chunk to return. 'compact' (default) trims each " +
|
|
92
|
+
"chunk to its first ~600 characters and omits the surrounding-context blocks — " +
|
|
93
|
+
"enough to judge relevance and pick a source to inspect. 'full' returns every " +
|
|
94
|
+
"chunk whole; use it when the snippets are being cut off mid-answer. Either way " +
|
|
95
|
+
"the response is capped, and hydradb_inspect returns any single source in full.",
|
|
26
96
|
fetch_source_id: "The source ID to fetch content for",
|
|
27
|
-
fetch_mode: "
|
|
28
|
-
|
|
97
|
+
fetch_mode: "'content' (default) returns the text — normally what you want. 'url' returns a " +
|
|
98
|
+
"short-lived presigned download link INSTEAD of the text, for binary sources or " +
|
|
99
|
+
"when handing the user a download. 'both' returns text and link.",
|
|
100
|
+
fetch_offset: "Character offset to start reading from (default: 0). Long sources are returned " +
|
|
101
|
+
"in slices; the response says where it stopped and what offset to pass next.",
|
|
102
|
+
fetch_limit: "Maximum characters of text to return (default and maximum: 20000). Lower it when " +
|
|
103
|
+
"you only need the beginning of a long document.",
|
|
104
|
+
delete_id: "A single ID to delete. Prefer `ids` when removing more than one.",
|
|
105
|
+
delete_ids: "The IDs to delete. Accepts several at once — cleaning up N stale entries is " +
|
|
106
|
+
"one call, not N. Each is reported separately, and the response says how many " +
|
|
107
|
+
"were actually removed. This is irreversible.",
|
|
29
108
|
delete_kind: "Which context family the ID belongs to: 'memory' or 'knowledge' (default: 'memory')",
|
|
30
109
|
memory_id: "The ID of the memory to delete",
|
|
31
110
|
};
|
|
32
111
|
function deprecated(alias, body) {
|
|
33
112
|
return `DEPRECATED — use \`${ALIAS_REPLACEMENTS[alias]}\` instead. ${body}`;
|
|
34
113
|
}
|
|
35
|
-
const SEARCH_BODY =
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
114
|
+
const SEARCH_BODY = `Search Hydra DB for anything the user has stored: memories (facts, preferences, decisions, past conversations) and ingested knowledge sources (documents, files, playbooks). Returns matching chunks with their source id, a relevance score, and knowledge-graph context — the entity paths and relations that connect facts across separate sources.
|
|
115
|
+
|
|
116
|
+
CALL THIS BEFORE ANSWERING whenever the answer could depend on the user's history, preferences, prior decisions, project details, or a document they have ingested — including when you are merely unsure. A query that returns nothing costs one call; answering from a blank slate costs the user a correction.
|
|
117
|
+
|
|
118
|
+
Searches both families by default. Every result carries \`[id: …]\` — pass it to hydradb_inspect for the full source, or to hydradb_delete to remove it.
|
|
119
|
+
|
|
120
|
+
Examples:
|
|
121
|
+
{"query": "how does the user prefer code review feedback"}
|
|
122
|
+
{"query": "postgres connection pooling decision", "kind": "knowledge"}
|
|
123
|
+
{"query": "deploy checklist", "mode": "fast", "max_results": 5}`;
|
|
124
|
+
const STORE_BODY = `Save information to Hydra DB so it outlives this session. Hydra DB extracts insights, preferences and knowledge-graph entities from what you store.
|
|
125
|
+
|
|
126
|
+
Provide EXACTLY ONE of:
|
|
127
|
+
\`text\` — a note, fact, decision, or document body
|
|
128
|
+
\`turns\` — user/assistant pairs from a conversation
|
|
129
|
+
Passing both is an error; passing neither is an error.
|
|
130
|
+
|
|
131
|
+
Save proactively: when the user states a preference, makes a decision, corrects you, or reveals a durable fact about themselves or their work, store it without being asked. Store the distilled fact rather than the raw exchange, and always set \`title\` — it is the only label shown next to this entry in later search results. Before saving something you suspect is already stored, query for it first rather than adding a near-duplicate.
|
|
132
|
+
|
|
133
|
+
Never store secrets, credentials, or anything the user asked you not to keep.
|
|
134
|
+
|
|
135
|
+
Examples:
|
|
136
|
+
{"text": "Prefers tabs over spaces in every language; rejected two prettier configs that used spaces.", "title": "Indentation preference"}
|
|
137
|
+
{"turns": [{"user": "let's go with Postgres", "assistant": "Agreed, I'll set up the schema."}], "title": "Datastore decision"}
|
|
138
|
+
{"text": "# Runbook\\n\\nRestart order: api, worker, scheduler.", "kind": "knowledge", "title": "Restart runbook"}`;
|
|
44
139
|
const CONVERSATION_BODY = "Ingest one or more user-assistant conversation turns into Hydra DB memory. " +
|
|
45
140
|
"Hydra DB will extract insights, preferences, and knowledge graph entities from the " +
|
|
46
141
|
"conversation. Use this to store conversation history so it can be recalled later. " +
|
|
@@ -51,9 +146,11 @@ const LIST_MEMORIES_BODY = "List all stored user memories in Hydra DB. Returns m
|
|
|
51
146
|
const LIST_SOURCES_BODY = "List all ingested sources in Hydra DB memory. Returns source IDs, titles, types, " +
|
|
52
147
|
"and metadata. Use this to see what data sources have been ingested and to find " +
|
|
53
148
|
"source IDs for fetching content.";
|
|
54
|
-
const INSPECT_BODY =
|
|
55
|
-
|
|
56
|
-
|
|
149
|
+
const INSPECT_BODY = `Fetch the full original content of ONE stored item by its id. Use it after hydradb_query or hydradb_list when a truncated chunk or listing row is not enough and you need the whole document.
|
|
150
|
+
|
|
151
|
+
The id is the value shown as \`[id: …]\` in hydradb_query results and in [brackets] in hydradb_list output. Ids are not guessable — take one from those tools rather than constructing it.
|
|
152
|
+
|
|
153
|
+
Long sources come back in slices; the response says where it stopped and what offset continues it. Binary sources are never inlined — you get their type and size, and \`mode: "url"\` returns a download link.`;
|
|
57
154
|
export const TOOL_DESCRIPTIONS = {
|
|
58
155
|
// --- Canonical tools (CONTRACT §3) ---
|
|
59
156
|
[TOOL_NAMES.QUERY]: {
|
|
@@ -61,33 +158,55 @@ export const TOOL_DESCRIPTIONS = {
|
|
|
61
158
|
description: SEARCH_BODY,
|
|
62
159
|
params: {
|
|
63
160
|
query: PARAM.query,
|
|
161
|
+
kind: PARAM.query_kind,
|
|
64
162
|
max_results: PARAM.max_results,
|
|
65
163
|
mode: PARAM.mode,
|
|
66
164
|
graph_context: PARAM.graph_context,
|
|
165
|
+
detail: PARAM.detail,
|
|
166
|
+
operator: PARAM.operator,
|
|
167
|
+
source_ids: PARAM.query_source_ids,
|
|
168
|
+
metadata_filters: PARAM.metadata_filters,
|
|
169
|
+
num_related_chunks: PARAM.num_related_chunks,
|
|
67
170
|
},
|
|
68
171
|
},
|
|
69
172
|
[TOOL_NAMES.INGEST]: {
|
|
70
173
|
title: "Ingest into Hydra DB",
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
174
|
+
// STORE_BODY already states the text/turns rule as "exactly one of". The
|
|
175
|
+
// sentence that used to be appended here said "provide `turns` … rather
|
|
176
|
+
// than `text`", which reads as a preference between two allowed options
|
|
177
|
+
// and contradicts it.
|
|
178
|
+
description: STORE_BODY,
|
|
74
179
|
params: {
|
|
75
180
|
text: PARAM.text,
|
|
181
|
+
kind: PARAM.ingest_kind,
|
|
76
182
|
title: PARAM.title,
|
|
77
183
|
source_id: PARAM.source_id,
|
|
78
184
|
infer: PARAM.infer,
|
|
79
185
|
is_markdown: PARAM.is_markdown,
|
|
80
|
-
|
|
186
|
+
overwrite: PARAM.overwrite,
|
|
187
|
+
metadata: PARAM.metadata,
|
|
188
|
+
observation_date: PARAM.observation_date,
|
|
189
|
+
turns: "The conversation to ingest, oldest first, as [{user, assistant}, ...]. Provide " +
|
|
190
|
+
"EXACTLY ONE of `text` or `turns` — passing both is an error, and so is passing " +
|
|
191
|
+
"neither. Use this when the exchange itself is worth preserving; when only the " +
|
|
192
|
+
"conclusion matters, prefer `text` with the distilled fact.",
|
|
81
193
|
user_name: PARAM.user_name,
|
|
82
194
|
},
|
|
83
195
|
},
|
|
84
196
|
[TOOL_NAMES.LIST]: {
|
|
85
197
|
title: "List Hydra DB Context",
|
|
86
|
-
description:
|
|
87
|
-
|
|
198
|
+
description: `Enumerate what is stored in Hydra DB — every memory (kind: "memory") or every knowledge source (kind: "knowledge"). These are SEPARATE corpora and this tool returns one at a time: listing memories tells you nothing about which knowledge sources exist, and vice versa. Call it twice to see everything.
|
|
199
|
+
|
|
200
|
+
Use it for inventory questions ("what do you remember about me?", "which documents are indexed?") and to obtain ids. For "what do you know about X", use hydradb_query instead — listing everything and reading it is far more expensive and loses relevance ranking.
|
|
201
|
+
|
|
202
|
+
Results are paginated. The response says how many of the total it showed and how to reach the rest; do not treat the first page as the whole store.
|
|
203
|
+
|
|
204
|
+
Memory rows come back as [id] content. Knowledge rows as [id] — title (type), with no content — pass an id to hydradb_inspect for the text.`,
|
|
88
205
|
params: {
|
|
89
206
|
kind: PARAM.kind,
|
|
90
207
|
source_ids: PARAM.source_ids,
|
|
208
|
+
page: PARAM.page,
|
|
209
|
+
page_size: PARAM.page_size,
|
|
91
210
|
},
|
|
92
211
|
},
|
|
93
212
|
[TOOL_NAMES.INSPECT]: {
|
|
@@ -96,23 +215,43 @@ export const TOOL_DESCRIPTIONS = {
|
|
|
96
215
|
params: {
|
|
97
216
|
source_id: PARAM.fetch_source_id,
|
|
98
217
|
mode: PARAM.fetch_mode,
|
|
218
|
+
offset: PARAM.fetch_offset,
|
|
219
|
+
limit: PARAM.fetch_limit,
|
|
220
|
+
expiry_seconds: PARAM.expiry_seconds,
|
|
99
221
|
},
|
|
100
222
|
},
|
|
101
223
|
[TOOL_NAMES.DELETE]: {
|
|
102
224
|
title: "Delete from Hydra DB",
|
|
103
|
-
description:
|
|
104
|
-
|
|
225
|
+
description: `Permanently remove one memory or one knowledge source from Hydra DB by id. This cannot be undone; there is no trash.
|
|
226
|
+
|
|
227
|
+
Take the id from hydradb_query or hydradb_list — never guess one. Confirm with the user before deleting anything they did not name: "forget that I use vim" authorises deleting that memory; "clean up my memories" authorises nothing until they have seen the list.
|
|
228
|
+
|
|
229
|
+
\`kind\` must match the family the id belongs to. A knowledge source id passed with kind "memory" reports that nothing was deleted while the source is still there.`,
|
|
105
230
|
params: {
|
|
231
|
+
ids: PARAM.delete_ids,
|
|
106
232
|
id: PARAM.delete_id,
|
|
107
233
|
kind: PARAM.delete_kind,
|
|
108
234
|
},
|
|
109
235
|
},
|
|
236
|
+
[TOOL_NAMES.STATUS]: {
|
|
237
|
+
title: "Check Hydra DB Indexing Status",
|
|
238
|
+
description: "Check whether ingested sources have finished indexing. Ingestion is " +
|
|
239
|
+
"asynchronous: hydradb_ingest returns as soon as the source is queued, and " +
|
|
240
|
+
"the content is not searchable until indexing reaches a terminal state. " +
|
|
241
|
+
"Use this after ingesting when you need to confirm the write landed — " +
|
|
242
|
+
"an empty hydradb_query result shortly after an ingest usually means " +
|
|
243
|
+
"'still indexing', not 'the save failed'.",
|
|
244
|
+
params: {
|
|
245
|
+
ids: "The source IDs to check, as returned by hydradb_ingest.",
|
|
246
|
+
},
|
|
247
|
+
},
|
|
110
248
|
// --- Deprecated aliases ---
|
|
111
249
|
[TOOL_NAMES.SEARCH]: {
|
|
112
250
|
title: "Search Hydra DB Memory (deprecated)",
|
|
113
251
|
description: deprecated(TOOL_NAMES.SEARCH, SEARCH_BODY),
|
|
114
252
|
params: {
|
|
115
253
|
query: PARAM.query,
|
|
254
|
+
kind: PARAM.query_kind,
|
|
116
255
|
max_results: PARAM.max_results,
|
|
117
256
|
mode: PARAM.mode,
|
|
118
257
|
graph_context: PARAM.graph_context,
|
|
@@ -125,8 +264,15 @@ export const TOOL_DESCRIPTIONS = {
|
|
|
125
264
|
text: PARAM.text,
|
|
126
265
|
title: PARAM.title,
|
|
127
266
|
source_id: PARAM.source_id,
|
|
267
|
+
metadata: "Key/value metadata to store with this entry, as {key: value}. These are the " +
|
|
268
|
+
"keys hydradb_query's metadata_filters can match on later, so set them when you " +
|
|
269
|
+
"expect to narrow by them — e.g. {\"project\": \"hydradb\", \"kind\": \"decision\"}.",
|
|
270
|
+
observation_date: "When the fact was true, as an RFC3339 date — distinct from when you stored it. " +
|
|
271
|
+
"Use it when saving something historical, so recency reflects the fact rather " +
|
|
272
|
+
"than the write.",
|
|
128
273
|
infer: PARAM.infer,
|
|
129
274
|
is_markdown: PARAM.is_markdown,
|
|
275
|
+
overwrite: PARAM.overwrite,
|
|
130
276
|
},
|
|
131
277
|
},
|
|
132
278
|
[TOOL_NAMES.INGEST_CONVERSATION]: {
|
|
@@ -155,6 +301,8 @@ export const TOOL_DESCRIPTIONS = {
|
|
|
155
301
|
params: {
|
|
156
302
|
source_id: PARAM.fetch_source_id,
|
|
157
303
|
mode: PARAM.fetch_mode,
|
|
304
|
+
offset: PARAM.fetch_offset,
|
|
305
|
+
limit: PARAM.fetch_limit,
|
|
158
306
|
},
|
|
159
307
|
},
|
|
160
308
|
[TOOL_NAMES.DELETE_MEMORY]: {
|
|
@@ -165,19 +313,25 @@ export const TOOL_DESCRIPTIONS = {
|
|
|
165
313
|
},
|
|
166
314
|
},
|
|
167
315
|
};
|
|
168
|
-
export const SERVER_INSTRUCTIONS =
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
316
|
+
export const SERVER_INSTRUCTIONS = `Hydra DB is the user's persistent memory across sessions. It holds two separate families: memory (facts, preferences, decisions, past conversations) and knowledge (ingested documents and sources). ${TOOL_NAMES.QUERY} searches both together.
|
|
317
|
+
|
|
318
|
+
WHEN TO USE IT
|
|
319
|
+
|
|
320
|
+
- Before answering anything that could depend on the user's history, preferences, prior decisions, project details, or a document they have ingested, call ${TOOL_NAMES.QUERY} FIRST — including when you are merely unsure. One query at the start of a task is cheap; answering from a blank slate costs the user a correction. Never ask the user to repeat something Hydra DB may already hold.
|
|
321
|
+
- After the user states a preference, makes a decision, corrects you, or reveals a durable fact about themselves or their work, call ${TOOL_NAMES.INGEST} to save it without being asked. Save the distilled fact, not the transcript: "prefers pnpm over npm in every repo", not "user said maybe we should try pnpm".
|
|
322
|
+
- Never store secrets, credentials, one-off task chatter, or anything the user asked you not to keep.
|
|
323
|
+
- "Remember this" maps to ${TOOL_NAMES.INGEST}, "forget that" to ${TOOL_NAMES.DELETE}, and "what do you know about me" to ${TOOL_NAMES.QUERY} — do not answer that last one from the current conversation alone.
|
|
324
|
+
|
|
325
|
+
THE TOOLS
|
|
326
|
+
|
|
327
|
+
- ${TOOL_NAMES.QUERY} — semantic search across memory and knowledge, with knowledge-graph context. Your default read. Every result carries an id.
|
|
328
|
+
- ${TOOL_NAMES.INGEST} — write. A note or document via 'text', or a conversation via 'turns' (exactly one of the two).
|
|
329
|
+
- ${TOOL_NAMES.LIST} — the full inventory of ONE family. Use it for "what do you have?"; for "what do you know about X" use ${TOOL_NAMES.QUERY} instead.
|
|
330
|
+
- ${TOOL_NAMES.INSPECT} — the complete original content of one source you already have an id for.
|
|
331
|
+
- ${TOOL_NAMES.DELETE} — irreversible removal of one item by id.
|
|
332
|
+
- ${TOOL_NAMES.STATUS} — whether an ingested source has finished indexing. Ingestion is asynchronous, so a query issued straight after a save can legitimately return nothing.
|
|
333
|
+
|
|
334
|
+
Ids flow between these: ${TOOL_NAMES.QUERY} and ${TOOL_NAMES.LIST} emit them, ${TOOL_NAMES.INSPECT}, ${TOOL_NAMES.DELETE} and ${TOOL_NAMES.STATUS} accept them. Never invent one.
|
|
335
|
+
|
|
336
|
+
All tools require HYDRADB_API_KEY and HYDRADB_DATABASE in the environment.`;
|
|
183
337
|
//# sourceMappingURL=descriptions.js.map
|
package/dist/descriptions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"descriptions.js","sourceRoot":"","sources":["../src/descriptions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEjE,4EAA4E;AAC5E,MAAM,KAAK,GAAG;IACb,KAAK,
|
|
1
|
+
{"version":3,"file":"descriptions.js","sourceRoot":"","sources":["../src/descriptions.ts"],"names":[],"mappings":"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"}
|