vault-go 0.26.0 → 0.28.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/README.md +3 -1
- package/dist/capabilities.d.ts +4 -4
- package/dist/capabilities.js +1 -1
- package/dist/cloud.d.ts +2 -0
- package/dist/cloud.js +3 -0
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.js +14 -5
- package/dist/knowledge-agent.d.ts +2 -2
- package/dist/project-scope.d.ts +13 -0
- package/dist/project-scope.js +22 -0
- package/dist/server.js +61 -7
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -148,7 +148,9 @@ Projects and sessions: `vault_go_projects`, `vault_go_project_create`, `vault_go
|
|
|
148
148
|
|
|
149
149
|
Capture and recall: `vault_go_event`, `vault_go_remember`, `vault_go_forget`, `vault_go_search`, `vault_go_search_index`, `vault_go_retrieve`, `vault_go_observations`, `vault_go_timeline`, `vault_go_context`, `vault_go_file_context`, `vault_go_feed`, `vault_go_memory`, `vault_go_tool_uses`, `vault_go_stats`.
|
|
150
150
|
|
|
151
|
-
`vault_go_retrieve`
|
|
151
|
+
Read tools (`vault_go_search`, `vault_go_search_index`, `vault_go_feed`, `vault_go_retrieve` and query-anchored `vault_go_timeline`) are scoped to the project of the MCP server's working directory when no `projectId` is given; a git worktree maps to its main checkout. Pass `scope: "account"` to search every project of the account. Outside a known project they fall back to the account, and no project is created. Memories marked private stay out of search and feed results unless `includePrivate: true` is set.
|
|
152
|
+
|
|
153
|
+
`vault_go_retrieve` lets the central memory engine choose a bounded retrieval path while every explicit retrieval tool remains available. `vault_go_decision_status` reports sanitized rollout/circuit state. Jev and its credential remain in the engine; a healthy deployment does not by itself prove provider availability or decision quality. `vault_go_decide` sends a caller-authored state plus up to 8 typed questions (`noul`, `choice`, `score`) to the central Jev and returns probabilities; it runs only in `full` rollout, one call at a time, refuses secrets, e-mails, identifiers, URLs and absolute local paths before anything leaves Vault, and persists nothing. The caller still owns the decision.
|
|
152
154
|
|
|
153
155
|
Knowledge bases: `vault_go_knowledge_bases`, `vault_go_knowledge_base`, `vault_go_knowledge_build`, `vault_go_knowledge_rebuild`, `vault_go_knowledge_query`, `vault_go_knowledge_delete`, `vault_go_prime_corpus`, `vault_go_query_corpus`, `vault_go_reprime_corpus`.
|
|
154
156
|
|
package/dist/capabilities.d.ts
CHANGED
|
@@ -26,8 +26,8 @@ export declare const CAPABILITIES: {
|
|
|
26
26
|
}, {
|
|
27
27
|
readonly upstream: readonly ["automatic retrieval routing", "typed memory decisions"];
|
|
28
28
|
readonly status: "available";
|
|
29
|
-
readonly tools: readonly ["vault_go_retrieve", "vault_go_decision_status"];
|
|
30
|
-
readonly requires: "Jev runs only in the central memory engine. Status is sanitized; deployment availability does not prove provider health or decision quality. Explicit retrieval tools remain available.";
|
|
29
|
+
readonly tools: readonly ["vault_go_retrieve", "vault_go_decision_status", "vault_go_decide"];
|
|
30
|
+
readonly requires: "Jev runs only in the central memory engine. Status is sanitized; deployment availability does not prove provider health or decision quality. vault_go_decide forwards caller-authored typed questions only in full rollout and refuses protected content. Explicit retrieval tools remain available.";
|
|
31
31
|
}, {
|
|
32
32
|
readonly upstream: readonly ["get_tool_uses"];
|
|
33
33
|
readonly status: "available";
|
|
@@ -142,8 +142,8 @@ export declare function getCapabilities(home: string, cloud: VaultMemoryApi, ver
|
|
|
142
142
|
}, {
|
|
143
143
|
readonly upstream: readonly ["automatic retrieval routing", "typed memory decisions"];
|
|
144
144
|
readonly status: "available";
|
|
145
|
-
readonly tools: readonly ["vault_go_retrieve", "vault_go_decision_status"];
|
|
146
|
-
readonly requires: "Jev runs only in the central memory engine. Status is sanitized; deployment availability does not prove provider health or decision quality. Explicit retrieval tools remain available.";
|
|
145
|
+
readonly tools: readonly ["vault_go_retrieve", "vault_go_decision_status", "vault_go_decide"];
|
|
146
|
+
readonly requires: "Jev runs only in the central memory engine. Status is sanitized; deployment availability does not prove provider health or decision quality. vault_go_decide forwards caller-authored typed questions only in full rollout and refuses protected content. Explicit retrieval tools remain available.";
|
|
147
147
|
}, {
|
|
148
148
|
readonly upstream: readonly ["get_tool_uses"];
|
|
149
149
|
readonly status: "available";
|
package/dist/capabilities.js
CHANGED
|
@@ -11,7 +11,7 @@ export const CAPABILITIES = {
|
|
|
11
11
|
capabilities: [
|
|
12
12
|
{ upstream: ['important_workflow'], status: 'available', tools: ['vault_go_workflow'] },
|
|
13
13
|
{ upstream: ['search', 'get_observations', 'timeline'], status: 'available', tools: ['vault_go_search_index', 'vault_go_observations', 'vault_go_timeline', 'vault_go_feed'], difference: 'Vault uses UUID identifiers. Search accepts an optional query, offset and date ordering; timeline accepts an explicit UUID or resolves an anchor from a query; feed uses stable cursor pagination.' },
|
|
14
|
-
{ upstream: ['automatic retrieval routing', 'typed memory decisions'], status: 'available', tools: ['vault_go_retrieve', 'vault_go_decision_status'], requires: 'Jev runs only in the central memory engine. Status is sanitized; deployment availability does not prove provider health or decision quality. Explicit retrieval tools remain available.' },
|
|
14
|
+
{ upstream: ['automatic retrieval routing', 'typed memory decisions'], status: 'available', tools: ['vault_go_retrieve', 'vault_go_decision_status', 'vault_go_decide'], requires: 'Jev runs only in the central memory engine. Status is sanitized; deployment availability does not prove provider health or decision quality. vault_go_decide forwards caller-authored typed questions only in full rollout and refuses protected content. Explicit retrieval tools remain available.' },
|
|
15
15
|
{ upstream: ['get_tool_uses'], status: 'available', tools: ['vault_go_tool_uses'], requires: 'Verified POST /memory/events/batch contract. Historical output exists only when captured; private fields and secrets are redacted from retrieval.' },
|
|
16
16
|
{ upstream: ['session_start_context', 'multi-project context'], status: 'available', tools: ['vault_go_session_start_context', 'vault_go_context', 'vault_go_file_context', 'vault_go_context_chain', 'vault_go_context_chain_configure'], requires: 'Context chains require explicit local configuration and share one bounded character budget. Native hooks cover Claude, Codex, Grok, Agy and Gemini; OpenCode 1.x remains context-only.' },
|
|
17
17
|
{ upstream: ['smart_search', 'smart_outline', 'smart_unfold'], status: 'available', tools: ['vault_go_smart_search', 'vault_go_smart_outline', 'vault_go_smart_unfold', 'vault_go_smart_languages'], requires: 'Real grammars for all 24 upstream languages plus HTML. Availability is reported per running platform; SCSS has no Linux ARM64 prebuild. Workspace reads and results are bounded.' },
|
package/dist/cloud.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ export interface VaultMemoryApi {
|
|
|
26
26
|
search(input: Record<string, unknown>): Promise<unknown>;
|
|
27
27
|
retrieve?(input: Record<string, unknown>): Promise<unknown>;
|
|
28
28
|
decisionStatus?(): Promise<unknown>;
|
|
29
|
+
decide?(input: Record<string, unknown>): Promise<unknown>;
|
|
29
30
|
searchIndex(input: Record<string, unknown>): Promise<unknown>;
|
|
30
31
|
observations(ids: string[]): Promise<unknown>;
|
|
31
32
|
timeline(input: Record<string, unknown>): Promise<unknown>;
|
|
@@ -73,6 +74,7 @@ export declare class VaultCloudClient implements VaultMemoryApi {
|
|
|
73
74
|
search(input: Record<string, unknown>): Promise<unknown>;
|
|
74
75
|
retrieve(input: Record<string, unknown>): Promise<unknown>;
|
|
75
76
|
decisionStatus(): Promise<unknown>;
|
|
77
|
+
decide(input: Record<string, unknown>): Promise<unknown>;
|
|
76
78
|
searchIndex(input: Record<string, unknown>): Promise<unknown>;
|
|
77
79
|
observations(ids: string[]): Promise<unknown>;
|
|
78
80
|
timeline(input: Record<string, unknown>): Promise<unknown>;
|
package/dist/cloud.js
CHANGED
|
@@ -108,6 +108,9 @@ export class VaultCloudClient {
|
|
|
108
108
|
async decisionStatus() {
|
|
109
109
|
return this.request('/memory/decisions/status');
|
|
110
110
|
}
|
|
111
|
+
async decide(input) {
|
|
112
|
+
return this.request('/memory/decisions/evaluate', { method: 'POST', body: input });
|
|
113
|
+
}
|
|
111
114
|
async searchIndex(input) {
|
|
112
115
|
return this.request('/memory/search/index', { method: 'POST', body: input });
|
|
113
116
|
}
|
package/dist/hooks.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ import { type VaultMemoryApi } from "./cloud.js";
|
|
|
3
3
|
export declare const HOOK_EVENTS: readonly ["context", "session-init", "observation", "file-context", "summarize"];
|
|
4
4
|
export type HookEvent = (typeof HOOK_EVENTS)[number];
|
|
5
5
|
type RecordValue = Record<string, unknown>;
|
|
6
|
+
/** The existing project for a working directory (worktrees map to their main checkout); never creates one. */
|
|
7
|
+
export declare function findWorkspaceProject(cloud: Pick<VaultMemoryApi, "projects">, cwd: string): Promise<RecordValue | undefined>;
|
|
6
8
|
export declare function normalizeHookInput(adapter: string, value: unknown): RecordValue;
|
|
7
9
|
export declare function hookOutput(event: HookEvent, context?: string, adapter?: string): RecordValue;
|
|
8
10
|
export declare function executeHook(adapter: string, event: HookEvent, value: unknown, cloud?: VaultMemoryApi, home?: string, options?: {
|
package/dist/hooks.js
CHANGED
|
@@ -66,6 +66,19 @@ function projectRoots(workspace) {
|
|
|
66
66
|
return fallback;
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
+
function matchWorkspaceProject(projects, roots) {
|
|
70
|
+
if (!Array.isArray(projects))
|
|
71
|
+
throw new Error("Resposta de projetos inválida");
|
|
72
|
+
return roots.map((cwd) => projects.find((item) => item &&
|
|
73
|
+
typeof item === "object" &&
|
|
74
|
+
typeof item.rootPath === "string" &&
|
|
75
|
+
Boolean(String(item.rootPath).trim()) &&
|
|
76
|
+
resolvedPath(String(item.rootPath)) === cwd)).find(Boolean);
|
|
77
|
+
}
|
|
78
|
+
/** The existing project for a working directory (worktrees map to their main checkout); never creates one. */
|
|
79
|
+
export async function findWorkspaceProject(cloud, cwd) {
|
|
80
|
+
return matchWorkspaceProject(await cloud.projects(), projectRoots(root(cwd)));
|
|
81
|
+
}
|
|
69
82
|
function canonicalFile(file, workspace, project) {
|
|
70
83
|
const absolute = resolve(workspace, file);
|
|
71
84
|
for (const directory of [workspace, resolvedPath(workspace)]) {
|
|
@@ -173,11 +186,7 @@ export async function executeHook(adapter, event, value, cloud = new VaultCloudC
|
|
|
173
186
|
const projects = await cloud.projects();
|
|
174
187
|
if (!Array.isArray(projects))
|
|
175
188
|
throw new Error("Resposta de projetos inválida");
|
|
176
|
-
let project =
|
|
177
|
-
typeof item === "object" &&
|
|
178
|
-
typeof item.rootPath === "string" &&
|
|
179
|
-
Boolean(String(item.rootPath).trim()) &&
|
|
180
|
-
resolvedPath(String(item.rootPath)) === cwd)).find(Boolean);
|
|
189
|
+
let project = matchWorkspaceProject(projects, roots);
|
|
181
190
|
const cwd = project ? resolvedPath(String(project.rootPath)) : roots[0];
|
|
182
191
|
if (!project && reading)
|
|
183
192
|
return hookOutput(event, "", adapter);
|
|
@@ -10,7 +10,7 @@ export declare function primeKnowledgeAgent(home: string, cloud: VaultMemoryApi,
|
|
|
10
10
|
primed: boolean;
|
|
11
11
|
memoryCount: number;
|
|
12
12
|
conversationReset: boolean;
|
|
13
|
-
engine: "vault-ai-resume" | "claude-subscription" | "openai-subscription" | "openrouter"
|
|
13
|
+
engine: "gemini" | "vault-ai-resume" | "claude-subscription" | "openai-subscription" | "openrouter";
|
|
14
14
|
model: string;
|
|
15
15
|
}>;
|
|
16
16
|
export declare function queryKnowledgeAgent(home: string, cloud: VaultMemoryApi, id: string, question: string, dependencies?: Dependencies): Promise<{
|
|
@@ -31,7 +31,7 @@ export declare function queryKnowledgeAgent(home: string, cloud: VaultMemoryApi,
|
|
|
31
31
|
title: string;
|
|
32
32
|
}[];
|
|
33
33
|
generated: boolean;
|
|
34
|
-
engine: "vault-ai-resume" | "claude-subscription" | "openai-subscription" | "openrouter"
|
|
34
|
+
engine: "gemini" | "vault-ai-resume" | "claude-subscription" | "openai-subscription" | "openrouter";
|
|
35
35
|
model: string;
|
|
36
36
|
conversationTurns: number;
|
|
37
37
|
contextTruncated: boolean;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { VaultMemoryApi } from './cloud.js';
|
|
2
|
+
export type ProjectScope = 'project' | 'account';
|
|
3
|
+
type ScopedInput = Record<string, unknown> & {
|
|
4
|
+
projectId?: string | undefined;
|
|
5
|
+
scope?: ProjectScope | undefined;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Why: MCP reads used to span every project of the account, so an agent in one
|
|
9
|
+
* repository received memories from unrelated clients. Reads now default to the
|
|
10
|
+
* project of the MCP server's working directory; `scope: "account"` widens them.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createProjectScope(cloud: VaultMemoryApi, cwd?: () => string): (input: ScopedInput) => Promise<Record<string, unknown>>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { findWorkspaceProject } from './hooks.js';
|
|
2
|
+
const CACHE_MS = 60_000;
|
|
3
|
+
/**
|
|
4
|
+
* Why: MCP reads used to span every project of the account, so an agent in one
|
|
5
|
+
* repository received memories from unrelated clients. Reads now default to the
|
|
6
|
+
* project of the MCP server's working directory; `scope: "account"` widens them.
|
|
7
|
+
*/
|
|
8
|
+
export function createProjectScope(cloud, cwd = () => process.cwd()) {
|
|
9
|
+
let cached;
|
|
10
|
+
return async (input) => {
|
|
11
|
+
const { scope = 'project', ...rest } = input;
|
|
12
|
+
if (rest.projectId || scope === 'account')
|
|
13
|
+
return rest;
|
|
14
|
+
const workspace = cwd();
|
|
15
|
+
if (!cached || cached.cwd !== workspace || Date.now() - cached.at > CACHE_MS) {
|
|
16
|
+
const project = await findWorkspaceProject(cloud, workspace);
|
|
17
|
+
cached = { cwd: workspace, at: Date.now(), projectId: typeof project?.id === 'string' ? project.id : undefined };
|
|
18
|
+
}
|
|
19
|
+
// Outside a known project there is nothing narrower to scope to.
|
|
20
|
+
return cached.projectId ? { ...rest, projectId: cached.projectId } : rest;
|
|
21
|
+
};
|
|
22
|
+
}
|
package/dist/server.js
CHANGED
|
@@ -9,6 +9,7 @@ import { registerCrystalTools } from './crystal-tools.js';
|
|
|
9
9
|
import { registerModeIntegrations } from './mode-integrations.js';
|
|
10
10
|
import { registerKnowledgeAgentTools } from './knowledge-tools.js';
|
|
11
11
|
import { redact } from './hooks.js';
|
|
12
|
+
import { createProjectScope } from './project-scope.js';
|
|
12
13
|
import { VaultCloudClient } from './cloud.js';
|
|
13
14
|
import { getStatus, vaultHome } from './config.js';
|
|
14
15
|
import { createPrivateBackup, restorePrivateBackup } from './backup.js';
|
|
@@ -172,12 +173,23 @@ export function createVaultGoServer(home = vaultHome(), cloud = new VaultCloudCl
|
|
|
172
173
|
inputSchema: { id: uuid },
|
|
173
174
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
|
|
174
175
|
}, async ({ id }) => run(() => cloud.forget(id)));
|
|
176
|
+
const scoped = createProjectScope(cloud);
|
|
177
|
+
const scope = z
|
|
178
|
+
.enum(['project', 'account'])
|
|
179
|
+
.default('project')
|
|
180
|
+
.describe('project (padrão): só o projeto do diretório atual quando projectId não é informado; account: todos os projetos da conta.');
|
|
181
|
+
const includePrivate = z
|
|
182
|
+
.boolean()
|
|
183
|
+
.default(false)
|
|
184
|
+
.describe('Inclui memórias marcadas como privadas (por padrão ficam de fora).');
|
|
175
185
|
server.registerTool('vault_go_search', {
|
|
176
186
|
title: 'Pesquisar no Vault',
|
|
177
187
|
description: 'Pesquisa memórias persistidas na plataforma Vault.',
|
|
178
188
|
inputSchema: {
|
|
179
189
|
query: z.string().trim().max(1_000).default(''),
|
|
180
190
|
projectId: uuid.optional(),
|
|
191
|
+
scope,
|
|
192
|
+
includePrivate,
|
|
181
193
|
kind: z.string().trim().max(100).optional(),
|
|
182
194
|
memoryType: z.string().trim().max(100).optional(),
|
|
183
195
|
platformSource: z.string().trim().max(100).optional(),
|
|
@@ -190,23 +202,24 @@ export function createVaultGoServer(home = vaultHome(), cloud = new VaultCloudCl
|
|
|
190
202
|
orderBy: z.enum(['date_asc', 'date_desc']).optional(),
|
|
191
203
|
},
|
|
192
204
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
193
|
-
}, async (input) => run(() => cloud.search(input)));
|
|
205
|
+
}, async (input) => run(async () => cloud.search(await scoped(input))));
|
|
194
206
|
server.registerTool('vault_go_retrieve', {
|
|
195
207
|
title: 'Recuperação automática do Vault',
|
|
196
208
|
description: 'Delega ao motor central a escolha tipada entre busca, contexto de arquivo, linha do tempo, base de conhecimento, grafo ou nenhum resultado. Falhas usam busca determinística.',
|
|
197
209
|
inputSchema: {
|
|
198
210
|
query: z.string().trim().min(1).max(1_000),
|
|
199
211
|
projectId: uuid.optional(),
|
|
212
|
+
scope,
|
|
200
213
|
files: z.array(z.string().trim().min(1).max(2_000)).max(50).default([]),
|
|
201
214
|
knowledgeBaseId: uuid.optional(),
|
|
202
215
|
limit: z.number().int().min(1).max(200).default(20),
|
|
203
216
|
maxChars: z.number().int().min(1_000).max(100_000).optional(),
|
|
204
217
|
},
|
|
205
218
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
206
|
-
}, async (input) => run(() => {
|
|
219
|
+
}, async (input) => run(async () => {
|
|
207
220
|
if (!cloud.retrieve)
|
|
208
221
|
throw new Error('Native retrieval is unavailable on this deployment.');
|
|
209
|
-
return cloud.retrieve(input);
|
|
222
|
+
return cloud.retrieve(await scoped(input));
|
|
210
223
|
}));
|
|
211
224
|
server.registerTool('vault_go_decision_status', {
|
|
212
225
|
title: 'Status da camada de decisão',
|
|
@@ -218,12 +231,48 @@ export function createVaultGoServer(home = vaultHome(), cloud = new VaultCloudCl
|
|
|
218
231
|
throw new Error('Decision status is unavailable on this deployment.');
|
|
219
232
|
return cloud.decisionStatus();
|
|
220
233
|
}));
|
|
234
|
+
const decisionText = (max) => z.string().trim().min(1).max(max);
|
|
235
|
+
const decisionQuestion = z.discriminatedUnion('type', [
|
|
236
|
+
z.object({
|
|
237
|
+
type: z.literal('noul'),
|
|
238
|
+
instructions: decisionText(2_000),
|
|
239
|
+
criteria: z.object({ true: decisionText(500), false: decisionText(500) }).strict().optional(),
|
|
240
|
+
}).strict(),
|
|
241
|
+
z.object({
|
|
242
|
+
type: z.literal('choice'),
|
|
243
|
+
instructions: decisionText(2_000),
|
|
244
|
+
criteria: z.record(z.string().regex(/^[a-z0-9][a-z0-9_-]{0,47}$/), decisionText(500))
|
|
245
|
+
.refine((options) => Object.keys(options).length >= 2 && Object.keys(options).length <= 32, 'choice needs 2 to 32 options'),
|
|
246
|
+
}).strict(),
|
|
247
|
+
z.object({
|
|
248
|
+
type: z.literal('score'),
|
|
249
|
+
instructions: decisionText(2_000),
|
|
250
|
+
criteria: z.array(decisionText(500)).min(2).max(10),
|
|
251
|
+
}).strict(),
|
|
252
|
+
]);
|
|
253
|
+
server.registerTool('vault_go_decide', {
|
|
254
|
+
title: 'Decidir com o Jev',
|
|
255
|
+
description: 'Envia ao Jev central um estado e até 8 perguntas tipadas (noul = probabilidade de sim; choice = uma opção entre 2–32; score = nível entre 2–10) e retorna respostas com probabilidades. '
|
|
256
|
+
+ 'Exige rollout full. Segredos, e-mails, UUIDs, URLs e caminhos locais absolutos são recusados antes de sair do Vault. Nada é persistido; a decisão final continua sendo de quem chama.',
|
|
257
|
+
inputSchema: {
|
|
258
|
+
state: z.union([z.string().trim().min(1), z.record(z.string(), z.unknown()), z.array(z.unknown()).min(1)]),
|
|
259
|
+
questions: z.record(z.string().regex(/^[a-z][a-z0-9_]{0,47}$/), decisionQuestion)
|
|
260
|
+
.refine((questions) => Object.keys(questions).length >= 1 && Object.keys(questions).length <= 8, 'questions must contain 1 to 8 entries'),
|
|
261
|
+
},
|
|
262
|
+
annotations: { readOnlyHint: true, idempotentHint: false, openWorldHint: true },
|
|
263
|
+
}, async (input) => run(() => {
|
|
264
|
+
if (!cloud.decide)
|
|
265
|
+
throw new Error('Jev decisions are unavailable on this deployment.');
|
|
266
|
+
return cloud.decide(input);
|
|
267
|
+
}));
|
|
221
268
|
server.registerTool('vault_go_search_index', {
|
|
222
269
|
title: 'Pesquisar índice compacto',
|
|
223
270
|
description: 'Primeira camada de recuperação: retorna metadados, trechos e custo estimado sem carregar o conteúdo completo.',
|
|
224
271
|
inputSchema: {
|
|
225
272
|
query: z.string().trim().max(1_000).default(''),
|
|
226
273
|
projectId: uuid.optional(),
|
|
274
|
+
scope,
|
|
275
|
+
includePrivate,
|
|
227
276
|
kind: z.string().trim().max(100).optional(),
|
|
228
277
|
memoryType: z.string().trim().max(100).optional(),
|
|
229
278
|
platformSource: z.string().trim().max(100).optional(),
|
|
@@ -236,7 +285,7 @@ export function createVaultGoServer(home = vaultHome(), cloud = new VaultCloudCl
|
|
|
236
285
|
orderBy: z.enum(['date_asc', 'date_desc']).optional(),
|
|
237
286
|
},
|
|
238
287
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
239
|
-
}, async (input) => run(() => cloud.searchIndex(input)));
|
|
288
|
+
}, async (input) => run(async () => cloud.searchIndex(await scoped(input))));
|
|
240
289
|
server.registerTool('vault_go_observations', {
|
|
241
290
|
title: 'Carregar observações por ID',
|
|
242
291
|
description: 'Terceira camada de recuperação: carrega em lote somente as observações escolhidas no índice ou na linha do tempo.',
|
|
@@ -252,15 +301,18 @@ export function createVaultGoServer(home = vaultHome(), cloud = new VaultCloudCl
|
|
|
252
301
|
anchorId: uuid.optional(),
|
|
253
302
|
query: z.string().trim().min(1).max(1_000).optional(),
|
|
254
303
|
projectId: uuid.optional(),
|
|
304
|
+
scope,
|
|
255
305
|
platformSource: z.string().trim().min(1).max(100).optional(),
|
|
256
306
|
before: z.number().int().min(0).max(100).default(5),
|
|
257
307
|
after: z.number().int().min(0).max(100).default(5),
|
|
258
308
|
},
|
|
259
309
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
260
|
-
}, async (input) => run(() => {
|
|
310
|
+
}, async (input) => run(async () => {
|
|
261
311
|
if (Boolean(input.anchorId) === Boolean(input.query))
|
|
262
312
|
throw new Error('Informe exatamente anchorId ou query.');
|
|
263
|
-
|
|
313
|
+
// An anchor already identifies its project; only query anchors are scoped.
|
|
314
|
+
const { scope: _scope, ...anchored } = input;
|
|
315
|
+
return cloud.timeline(input.anchorId ? anchored : await scoped(input));
|
|
264
316
|
}));
|
|
265
317
|
server.registerTool('vault_go_context', {
|
|
266
318
|
title: 'Montar contexto',
|
|
@@ -295,6 +347,8 @@ export function createVaultGoServer(home = vaultHome(), cloud = new VaultCloudCl
|
|
|
295
347
|
description: 'Lista memórias recentes com paginação estável por cursor.',
|
|
296
348
|
inputSchema: {
|
|
297
349
|
projectId: uuid.optional(),
|
|
350
|
+
scope,
|
|
351
|
+
includePrivate,
|
|
298
352
|
kind: z.string().trim().max(100).optional(),
|
|
299
353
|
memoryType: z.string().trim().max(100).optional(),
|
|
300
354
|
platformSource: z.string().trim().max(100).optional(),
|
|
@@ -302,7 +356,7 @@ export function createVaultGoServer(home = vaultHome(), cloud = new VaultCloudCl
|
|
|
302
356
|
limit: z.number().int().min(1).max(100).default(20),
|
|
303
357
|
},
|
|
304
358
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
305
|
-
}, async (input) => run(() => cloud.feed(input)));
|
|
359
|
+
}, async (input) => run(async () => cloud.feed(await scoped(input))));
|
|
306
360
|
server.registerTool('vault_go_knowledge_bases', {
|
|
307
361
|
title: 'Listar bases de conhecimento',
|
|
308
362
|
description: 'Lista bases filtradas e persistidas na plataforma Vault.',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vault-go",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.28.0",
|
|
4
4
|
"description": "MCP server and installer for Vault Memory: search, capture, and use account memory across AI clients.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -84,7 +84,9 @@
|
|
|
84
84
|
"dist/mcp-clients.js",
|
|
85
85
|
"dist/mcp-clients.d.ts",
|
|
86
86
|
"dist/mcp-result.js",
|
|
87
|
+
"dist/project-scope.js",
|
|
87
88
|
"dist/mcp-result.d.ts",
|
|
89
|
+
"dist/project-scope.d.ts",
|
|
88
90
|
"dist/parity-tools.js",
|
|
89
91
|
"dist/parity-tools.d.ts",
|
|
90
92
|
"dist/capabilities.js",
|
|
@@ -133,7 +135,7 @@
|
|
|
133
135
|
],
|
|
134
136
|
"scripts": {
|
|
135
137
|
"clean": "bun -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
136
|
-
"build": "bun run clean && tsc -p tsconfig.json",
|
|
138
|
+
"build": "bun run clean && tsc -p tsconfig.build.json",
|
|
137
139
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
138
140
|
"test": "bun run build && bun test src",
|
|
139
141
|
"pack:check": "npm pack --dry-run",
|