@gmickel/gno 1.17.0 → 1.19.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 +18 -4
- package/assets/skill/SKILL.md +44 -1
- package/assets/skill/mcp-reference.md +21 -0
- package/package.json +3 -2
- package/spec/AGENTS.md +83 -0
- package/spec/CLAUDE.md +83 -0
- package/spec/bench-fixture.schema.json +137 -0
- package/spec/cli.md +2894 -0
- package/spec/db/schema.sql +442 -0
- package/spec/evals-agentic.md +510 -0
- package/spec/evals.md +1106 -0
- package/spec/mcp.md +2229 -0
- package/spec/output-schemas/activation-verification.schema.json +515 -0
- package/spec/output-schemas/ask.schema.json +366 -0
- package/spec/output-schemas/backlinks.schema.json +131 -0
- package/spec/output-schemas/bench-result.schema.json +120 -0
- package/spec/output-schemas/capture-receipt.schema.json +143 -0
- package/spec/output-schemas/collection-list.schema.json +45 -0
- package/spec/output-schemas/context-capsule-v1.schema.json +691 -0
- package/spec/output-schemas/context-capsule-verification.schema.json +1338 -0
- package/spec/output-schemas/context-list.schema.json +21 -0
- package/spec/output-schemas/doctor.schema.json +313 -0
- package/spec/output-schemas/error.schema.json +30 -0
- package/spec/output-schemas/expansion.schema.json +37 -0
- package/spec/output-schemas/get.schema.json +140 -0
- package/spec/output-schemas/graph-query.schema.json +99 -0
- package/spec/output-schemas/graph.schema.json +371 -0
- package/spec/output-schemas/links-list.schema.json +186 -0
- package/spec/output-schemas/mcp-add-collection-result.schema.json +23 -0
- package/spec/output-schemas/mcp-capture-result.schema.json +152 -0
- package/spec/output-schemas/mcp-http-error.schema.json +30 -0
- package/spec/output-schemas/mcp-job-list.schema.json +58 -0
- package/spec/output-schemas/mcp-job-status.schema.json +224 -0
- package/spec/output-schemas/mcp-remove-result.schema.json +39 -0
- package/spec/output-schemas/mcp-sync-result.schema.json +41 -0
- package/spec/output-schemas/mcp-tag-result.schema.json +33 -0
- package/spec/output-schemas/models-list.schema.json +93 -0
- package/spec/output-schemas/multi-get.schema.json +103 -0
- package/spec/output-schemas/process-status.schema.json +119 -0
- package/spec/output-schemas/query-diagnose.schema.json +123 -0
- package/spec/output-schemas/resident-status.schema.json +154 -0
- package/spec/output-schemas/retrieval-trace-common.schema.json +492 -0
- package/spec/output-schemas/retrieval-trace-delete.schema.json +16 -0
- package/spec/output-schemas/retrieval-trace-export.schema.json +61 -0
- package/spec/output-schemas/retrieval-trace-filters.schema.json +139 -0
- package/spec/output-schemas/retrieval-trace-judgment.schema.json +15 -0
- package/spec/output-schemas/retrieval-trace-list.schema.json +18 -0
- package/spec/output-schemas/retrieval-trace-payloads.schema.json +178 -0
- package/spec/output-schemas/retrieval-trace-purge.schema.json +31 -0
- package/spec/output-schemas/retrieval-trace-qrels.schema.json +303 -0
- package/spec/output-schemas/retrieval-trace-replay.schema.json +286 -0
- package/spec/output-schemas/retrieval-trace-show.schema.json +69 -0
- package/spec/output-schemas/retrieval-trace-summary.schema.json +65 -0
- package/spec/output-schemas/search-result.schema.json +154 -0
- package/spec/output-schemas/search-results.schema.json +338 -0
- package/spec/output-schemas/similar.schema.json +84 -0
- package/spec/output-schemas/status.schema.json +676 -0
- package/spec/output-schemas/tags-list.schema.json +48 -0
- package/src/app/context-runtime-types.ts +3 -0
- package/src/app/context-runtime.ts +15 -1
- package/src/cli/commands/ask.ts +106 -36
- package/src/cli/commands/context-build.ts +56 -9
- package/src/cli/commands/daemon.ts +69 -2
- package/src/cli/commands/get.ts +64 -3
- package/src/cli/commands/models/pull.ts +13 -3
- package/src/cli/commands/query.ts +62 -23
- package/src/cli/commands/replay.ts +140 -0
- package/src/cli/commands/search.ts +48 -3
- package/src/cli/commands/shared.ts +3 -1
- package/src/cli/commands/status.ts +2 -0
- package/src/cli/commands/trace.ts +200 -0
- package/src/cli/commands/vsearch.ts +75 -53
- package/src/cli/detach.ts +37 -20
- package/src/cli/program.ts +329 -27
- package/src/config/index.ts +12 -0
- package/src/config/retrieval-traces.ts +56 -0
- package/src/config/types.ts +41 -0
- package/src/core/context-compiler.ts +11 -4
- package/src/core/job-manager.ts +19 -0
- package/src/core/mutation-generations.ts +33 -0
- package/src/core/retrieval-qrels.ts +405 -0
- package/src/core/retrieval-replay-candidate.ts +368 -0
- package/src/core/retrieval-replay-types.ts +109 -0
- package/src/core/retrieval-replay-validation.ts +89 -0
- package/src/core/retrieval-replay.ts +441 -0
- package/src/core/retrieval-trace-evidence-origin.ts +175 -0
- package/src/core/retrieval-trace-export.ts +113 -0
- package/src/core/retrieval-trace-filter-normalization.ts +27 -0
- package/src/core/retrieval-trace-filters.ts +19 -0
- package/src/core/retrieval-trace-management-helpers.ts +247 -0
- package/src/core/retrieval-trace-management-types.ts +132 -0
- package/src/core/retrieval-trace-management.ts +422 -0
- package/src/core/retrieval-trace-request.ts +141 -0
- package/src/core/retrieval-trace-session.ts +494 -0
- package/src/core/retrieval-trace.ts +472 -0
- package/src/llm/cache.ts +13 -3
- package/src/llm/nodeLlamaCpp/adapter.ts +10 -1
- package/src/llm/nodeLlamaCpp/lifecycle.ts +71 -0
- package/src/mcp/context.ts +161 -0
- package/src/mcp/http-security.ts +477 -0
- package/src/mcp/http-session.ts +272 -0
- package/src/mcp/http-transport.ts +370 -0
- package/src/mcp/resources/index.ts +141 -134
- package/src/mcp/server.ts +19 -79
- package/src/mcp/tools/add-collection.ts +3 -1
- package/src/mcp/tools/capture.ts +3 -0
- package/src/mcp/tools/clear-collection-embeddings.ts +2 -0
- package/src/mcp/tools/context.ts +68 -16
- package/src/mcp/tools/embed.ts +62 -52
- package/src/mcp/tools/get.ts +35 -1
- package/src/mcp/tools/index-cmd.ts +88 -74
- package/src/mcp/tools/index.ts +96 -2
- package/src/mcp/tools/query.ts +95 -64
- package/src/mcp/tools/remove-collection.ts +2 -0
- package/src/mcp/tools/search.ts +36 -13
- package/src/mcp/tools/status.ts +11 -0
- package/src/mcp/tools/sync.ts +16 -14
- package/src/mcp/tools/trace.ts +143 -0
- package/src/mcp/tools/vsearch.ts +71 -38
- package/src/mcp/tools/workspace-write.ts +7 -3
- package/src/pipeline/answer.ts +167 -26
- package/src/pipeline/graph-retrieval.ts +15 -1
- package/src/pipeline/hybrid.ts +151 -43
- package/src/pipeline/search.ts +36 -3
- package/src/pipeline/trace-metadata.ts +47 -0
- package/src/pipeline/types.ts +43 -0
- package/src/pipeline/vsearch.ts +101 -38
- package/src/sdk/client.ts +380 -71
- package/src/sdk/documents.ts +48 -1
- package/src/sdk/index.ts +17 -0
- package/src/sdk/types.ts +28 -0
- package/src/serve/background-runtime.ts +12 -212
- package/src/serve/context-capsule.ts +67 -8
- package/src/serve/embed-scheduler.ts +74 -43
- package/src/serve/index.ts +9 -0
- package/src/serve/jobs.ts +78 -80
- package/src/serve/public/app.tsx +12 -1
- package/src/serve/public/components/HealthCenter.tsx +74 -1
- package/src/serve/public/globals.built.css +1 -1
- package/src/serve/public/lib/workspace-tabs.ts +2 -0
- package/src/serve/public/pages/Dashboard.tsx +11 -0
- package/src/serve/public/pages/TraceHistory.tsx +478 -0
- package/src/serve/public/pages/trace-history-detail.tsx +224 -0
- package/src/serve/resident-admission.ts +159 -0
- package/src/serve/resident-background-work.ts +39 -0
- package/src/serve/resident-request.ts +55 -0
- package/src/serve/resident-runtime.ts +490 -0
- package/src/serve/resident-status.ts +96 -0
- package/src/serve/retrieval-trace.ts +28 -0
- package/src/serve/routes/api.ts +629 -239
- package/src/serve/routes/mcp.ts +69 -0
- package/src/serve/routes/traces.ts +156 -0
- package/src/serve/server.ts +276 -37
- package/src/serve/status-model.ts +51 -0
- package/src/serve/status.ts +5 -0
- package/src/store/index.ts +31 -0
- package/src/store/migrations/014-retrieval-traces.ts +303 -0
- package/src/store/migrations/index.ts +2 -0
- package/src/store/retrieval-trace-codec.ts +384 -0
- package/src/store/sqlite/adapter.ts +179 -10
- package/src/store/sqlite/retrieval-trace-management-store.ts +341 -0
- package/src/store/sqlite/retrieval-trace-retention.ts +349 -0
- package/src/store/sqlite/retrieval-trace-rows.ts +267 -0
- package/src/store/sqlite/retrieval-trace-store.ts +515 -0
- package/src/store/types.ts +297 -0
- package/src/store/vector/sqlite-vec.ts +76 -1
- package/src/store/vector/types.ts +1 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/** Production route adapter for the secured resident MCP endpoint. */
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
HttpMcpPeerServer,
|
|
5
|
+
ResolvedHttpGatewayConfig,
|
|
6
|
+
} from "../../mcp/http-security";
|
|
7
|
+
import type { ResidentRuntime } from "../resident-runtime";
|
|
8
|
+
|
|
9
|
+
import { HttpMcpSecurity } from "../../mcp/http-security";
|
|
10
|
+
import { HttpMcpTransport } from "../../mcp/http-transport";
|
|
11
|
+
|
|
12
|
+
export type McpHttpRoute = (
|
|
13
|
+
request: Request,
|
|
14
|
+
server: HttpMcpPeerServer
|
|
15
|
+
) => Promise<Response>;
|
|
16
|
+
|
|
17
|
+
export interface McpHttpGateway {
|
|
18
|
+
readonly route: McpHttpRoute;
|
|
19
|
+
readonly security: HttpMcpSecurity;
|
|
20
|
+
readonly transport: HttpMcpTransport;
|
|
21
|
+
close(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Build the route only after startup policy and token-file checks succeed.
|
|
26
|
+
* Every method passes through the external boundary before transport dispatch.
|
|
27
|
+
*/
|
|
28
|
+
export async function createMcpHttpGateway(
|
|
29
|
+
runtime: ResidentRuntime,
|
|
30
|
+
config: ResolvedHttpGatewayConfig
|
|
31
|
+
): Promise<McpHttpGateway> {
|
|
32
|
+
runtime.mcpContext.enableWrite = config.enableWrite;
|
|
33
|
+
const transport = new HttpMcpTransport(runtime, {
|
|
34
|
+
enableWrite: config.enableWrite,
|
|
35
|
+
idleTimeoutMs: config.limits.sessionIdleTimeoutMs,
|
|
36
|
+
maxConcurrentRequests: config.limits.maxConcurrentRequests,
|
|
37
|
+
maxQueuedRequests: config.limits.maxQueuedRequests,
|
|
38
|
+
maxSessions: config.limits.maxSessions,
|
|
39
|
+
});
|
|
40
|
+
const security = new HttpMcpSecurity(config, {
|
|
41
|
+
onCredentialsChanged: () => transport.invalidateAuthenticatedSessions(),
|
|
42
|
+
});
|
|
43
|
+
await security.initialize();
|
|
44
|
+
(runtime as Partial<ResidentRuntime>).setTransportStatusProvider?.(() =>
|
|
45
|
+
transport.getStatus()
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const route: McpHttpRoute = async (request, server) => {
|
|
49
|
+
const authorization = await security.authorize(request, server);
|
|
50
|
+
if (!authorization.ok) return authorization.response;
|
|
51
|
+
|
|
52
|
+
// POST responses and GET streams may both be long-lived SSE responses.
|
|
53
|
+
server.timeout(request, 0);
|
|
54
|
+
return transport.handleRequest(authorization.value.request, {
|
|
55
|
+
identity: authorization.value.identity,
|
|
56
|
+
parsedBody: authorization.value.parsedBody,
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
route,
|
|
62
|
+
security,
|
|
63
|
+
transport,
|
|
64
|
+
close: async () => {
|
|
65
|
+
await transport.close();
|
|
66
|
+
(runtime as Partial<ResidentRuntime>).setTransportStatusProvider?.(null);
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/** Loopback REST handlers for private retrieval trace management. */
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
RetrievalTraceExportRequest,
|
|
5
|
+
RetrievalTraceLabelRequest,
|
|
6
|
+
} from "../../core/retrieval-trace-management";
|
|
7
|
+
import type { StoreError, StorePort, StoreResult } from "../../store/types";
|
|
8
|
+
|
|
9
|
+
import { RetrievalTraceManagementService } from "../../core/retrieval-trace-management";
|
|
10
|
+
|
|
11
|
+
const errorStatus = (error: StoreError): number => {
|
|
12
|
+
if (error.code === "NOT_FOUND") return 404;
|
|
13
|
+
if (error.code === "CONSTRAINT_VIOLATION") return 409;
|
|
14
|
+
if (error.code === "INVALID_INPUT") return 400;
|
|
15
|
+
return 500;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const response = <T>(result: StoreResult<T>): Response => {
|
|
19
|
+
if (result.ok) return Response.json(result.value);
|
|
20
|
+
return Response.json(
|
|
21
|
+
{
|
|
22
|
+
error: {
|
|
23
|
+
code: result.error.code,
|
|
24
|
+
message: result.error.message,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
{ status: errorStatus(result.error) }
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const parseJsonObject = async (
|
|
32
|
+
request: Request
|
|
33
|
+
): Promise<Record<string, unknown> | Response> => {
|
|
34
|
+
try {
|
|
35
|
+
const value = (await request.json()) as unknown;
|
|
36
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
37
|
+
return Response.json(
|
|
38
|
+
{
|
|
39
|
+
error: {
|
|
40
|
+
code: "INVALID_INPUT",
|
|
41
|
+
message: "Request body must be a JSON object",
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{ status: 400 }
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
return value as Record<string, unknown>;
|
|
48
|
+
} catch {
|
|
49
|
+
return Response.json(
|
|
50
|
+
{
|
|
51
|
+
error: {
|
|
52
|
+
code: "INVALID_INPUT",
|
|
53
|
+
message: "Request body must be valid JSON",
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
{ status: 400 }
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const parseOptionalInteger = (
|
|
62
|
+
value: string | null
|
|
63
|
+
): number | undefined | null => {
|
|
64
|
+
if (value === null) return undefined;
|
|
65
|
+
if (!/^\d+$/.test(value)) return null;
|
|
66
|
+
const parsed = Number(value);
|
|
67
|
+
return Number.isSafeInteger(parsed) ? parsed : null;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const handleTraceList = async (
|
|
71
|
+
store: StorePort,
|
|
72
|
+
request: Request
|
|
73
|
+
): Promise<Response> => {
|
|
74
|
+
const url = new URL(request.url);
|
|
75
|
+
const limit = parseOptionalInteger(url.searchParams.get("limit"));
|
|
76
|
+
if (limit === null) {
|
|
77
|
+
return Response.json(
|
|
78
|
+
{
|
|
79
|
+
error: {
|
|
80
|
+
code: "INVALID_INPUT",
|
|
81
|
+
message: "limit must be a positive integer",
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{ status: 400 }
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
return response(
|
|
88
|
+
await new RetrievalTraceManagementService(store).list({
|
|
89
|
+
limit,
|
|
90
|
+
cursor: url.searchParams.get("cursor") ?? undefined,
|
|
91
|
+
})
|
|
92
|
+
);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export const handleTraceShow = async (
|
|
96
|
+
store: StorePort,
|
|
97
|
+
traceId: string,
|
|
98
|
+
request: Request
|
|
99
|
+
): Promise<Response> => {
|
|
100
|
+
const detailLimit = parseOptionalInteger(
|
|
101
|
+
new URL(request.url).searchParams.get("detailLimit")
|
|
102
|
+
);
|
|
103
|
+
if (detailLimit === null) {
|
|
104
|
+
return Response.json(
|
|
105
|
+
{
|
|
106
|
+
error: {
|
|
107
|
+
code: "INVALID_INPUT",
|
|
108
|
+
message: "detailLimit must be a positive integer",
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
{ status: 400 }
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
return response(
|
|
115
|
+
await new RetrievalTraceManagementService(store).show(traceId, {
|
|
116
|
+
detailLimit,
|
|
117
|
+
})
|
|
118
|
+
);
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export const handleTraceLabel = async (
|
|
122
|
+
store: StorePort,
|
|
123
|
+
traceId: string,
|
|
124
|
+
request: Request
|
|
125
|
+
): Promise<Response> => {
|
|
126
|
+
const body = await parseJsonObject(request);
|
|
127
|
+
if (body instanceof Response) return body;
|
|
128
|
+
return response(
|
|
129
|
+
await new RetrievalTraceManagementService(store).label({
|
|
130
|
+
...body,
|
|
131
|
+
traceId,
|
|
132
|
+
} as unknown as RetrievalTraceLabelRequest)
|
|
133
|
+
);
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
export const handleTraceExport = async (
|
|
137
|
+
store: StorePort,
|
|
138
|
+
request: Request
|
|
139
|
+
): Promise<Response> => {
|
|
140
|
+
const body = await parseJsonObject(request);
|
|
141
|
+
if (body instanceof Response) return body;
|
|
142
|
+
return response(
|
|
143
|
+
await new RetrievalTraceManagementService(store).export(
|
|
144
|
+
body as unknown as RetrievalTraceExportRequest
|
|
145
|
+
)
|
|
146
|
+
);
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
export const handleTraceDelete = async (
|
|
150
|
+
store: StorePort,
|
|
151
|
+
traceId: string
|
|
152
|
+
): Promise<Response> =>
|
|
153
|
+
response(await new RetrievalTraceManagementService(store).delete(traceId));
|
|
154
|
+
|
|
155
|
+
export const handleTracePurge = async (store: StorePort): Promise<Response> =>
|
|
156
|
+
response(await new RetrievalTraceManagementService(store).purge());
|