@herbertgao/pi-extensions 2026.9.11 → 2026.9.13
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 +4 -4
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +1 -1
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +8 -0
- package/node_modules/@herbertgao/pi-subagents/package.json +1 -1
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +5 -4
- package/node_modules/@herbertgao/pi-subagents/src/mention-clone.ts +39 -16
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
- package/node_modules/@narumitw/pi-btw/README.md +21 -4
- package/node_modules/@narumitw/pi-btw/dist/index.ts +1668 -958
- package/node_modules/@narumitw/pi-btw/dist/index.ts.map +4 -4
- package/node_modules/@narumitw/pi-btw/docs/workflows.md +10 -2
- package/node_modules/@narumitw/pi-btw/package.json +1 -1
- package/node_modules/@narumitw/pi-btw/src/btw.ts +17 -79
- package/node_modules/@narumitw/pi-btw/src/conversation-context.ts +74 -0
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +196 -7
- package/node_modules/@narumitw/pi-btw/src/main-thread-updates.ts +40 -0
- package/node_modules/@narumitw/pi-btw/src/menu.ts +34 -2
- package/node_modules/@narumitw/pi-btw/src/settings.ts +49 -0
- package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +9 -1
- package/node_modules/@narumitw/pi-btw/src/workspace-layout.ts +559 -0
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +62 -0
- package/node_modules/pi-mcp-adapter/README.md +75 -7
- package/node_modules/pi-mcp-adapter/bearer-command-resolver.ts +193 -0
- package/node_modules/pi-mcp-adapter/cli.js +56 -5
- package/node_modules/pi-mcp-adapter/commands.ts +96 -5
- package/node_modules/pi-mcp-adapter/config.ts +73 -6
- package/node_modules/pi-mcp-adapter/direct-tool-surface.ts +22 -28
- package/node_modules/pi-mcp-adapter/direct-tools.ts +13 -5
- package/node_modules/pi-mcp-adapter/dist/abort.d.ts +2 -0
- package/node_modules/pi-mcp-adapter/dist/abort.js +36 -0
- package/node_modules/pi-mcp-adapter/dist/abort.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/bearer-command-resolver.d.ts +6 -0
- package/node_modules/pi-mcp-adapter/dist/bearer-command-resolver.js +194 -0
- package/node_modules/pi-mcp-adapter/dist/bearer-command-resolver.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/config.d.ts +5 -0
- package/node_modules/pi-mcp-adapter/dist/config.js +75 -6
- package/node_modules/pi-mcp-adapter/dist/config.js.map +1 -1
- package/node_modules/pi-mcp-adapter/dist/consent-manager.d.ts +18 -0
- package/node_modules/pi-mcp-adapter/dist/consent-manager.js +88 -0
- package/node_modules/pi-mcp-adapter/dist/consent-manager.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/elicitation-handler.d.ts +17 -0
- package/node_modules/pi-mcp-adapter/dist/elicitation-handler.js +316 -0
- package/node_modules/pi-mcp-adapter/dist/elicitation-handler.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/errors.d.ts +131 -0
- package/node_modules/pi-mcp-adapter/dist/errors.js +278 -0
- package/node_modules/pi-mcp-adapter/dist/errors.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/http-ca.d.ts +8 -0
- package/node_modules/pi-mcp-adapter/dist/http-ca.js +88 -0
- package/node_modules/pi-mcp-adapter/dist/http-ca.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/jev-client.d.ts +15 -0
- package/node_modules/pi-mcp-adapter/dist/jev-client.js +340 -0
- package/node_modules/pi-mcp-adapter/dist/jev-client.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/jev-contracts.d.ts +77 -0
- package/node_modules/pi-mcp-adapter/dist/jev-contracts.js +2 -0
- package/node_modules/pi-mcp-adapter/dist/jev-contracts.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/jev-key-store.d.ts +22 -0
- package/node_modules/pi-mcp-adapter/dist/jev-key-store.js +85 -0
- package/node_modules/pi-mcp-adapter/dist/jev-key-store.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/json-schema-validator.d.ts +2 -0
- package/node_modules/pi-mcp-adapter/dist/json-schema-validator.js +55 -0
- package/node_modules/pi-mcp-adapter/dist/json-schema-validator.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/lifecycle.d.ts +56 -0
- package/node_modules/pi-mcp-adapter/dist/lifecycle.js +410 -0
- package/node_modules/pi-mcp-adapter/dist/lifecycle.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/logger.d.ts +51 -0
- package/node_modules/pi-mcp-adapter/dist/logger.js +131 -0
- package/node_modules/pi-mcp-adapter/dist/logger.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-auth-fetch.d.ts +26 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-auth-fetch.js +103 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-auth-fetch.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-auth-flow.d.ts +118 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-auth-flow.js +1098 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-auth-flow.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-auth.d.ts +168 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-auth.js +1117 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-auth.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-bearer-store.js +7 -140
- package/node_modules/pi-mcp-adapter/dist/mcp-bearer-store.js.map +1 -1
- package/node_modules/pi-mcp-adapter/dist/mcp-callback-server.d.ts +53 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-callback-server.js +441 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-callback-server.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-oauth-provider.d.ts +148 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-oauth-provider.js +689 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-oauth-provider.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-probe.d.ts +6 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-probe.js +166 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-probe.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-tasks.d.ts +102 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-tasks.js +369 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-tasks.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-trace.d.ts +95 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-trace.js +242 -0
- package/node_modules/pi-mcp-adapter/dist/mcp-trace.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.js +2 -11
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.js.map +1 -1
- package/node_modules/pi-mcp-adapter/dist/npx-resolver.d.ts +6 -0
- package/node_modules/pi-mcp-adapter/dist/npx-resolver.js +505 -0
- package/node_modules/pi-mcp-adapter/dist/npx-resolver.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/request-headers-command.d.ts +10 -0
- package/node_modules/pi-mcp-adapter/dist/request-headers-command.js +312 -0
- package/node_modules/pi-mcp-adapter/dist/request-headers-command.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/runtime-owner.d.ts +13 -0
- package/node_modules/pi-mcp-adapter/dist/runtime-owner.js +97 -0
- package/node_modules/pi-mcp-adapter/dist/runtime-owner.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/sampling-handler.d.ts +17 -0
- package/node_modules/pi-mcp-adapter/dist/sampling-handler.js +203 -0
- package/node_modules/pi-mcp-adapter/dist/sampling-handler.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/secure-keyring.d.ts +11 -0
- package/node_modules/pi-mcp-adapter/dist/secure-keyring.js +172 -0
- package/node_modules/pi-mcp-adapter/dist/secure-keyring.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/server-manager.d.ts +157 -0
- package/node_modules/pi-mcp-adapter/dist/server-manager.js +1743 -0
- package/node_modules/pi-mcp-adapter/dist/server-manager.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/session-approvals.d.ts +34 -0
- package/node_modules/pi-mcp-adapter/dist/session-approvals.js +140 -0
- package/node_modules/pi-mcp-adapter/dist/session-approvals.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/session-recovery.d.ts +26 -0
- package/node_modules/pi-mcp-adapter/dist/session-recovery.js +142 -0
- package/node_modules/pi-mcp-adapter/dist/session-recovery.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/state.d.ts +73 -0
- package/node_modules/pi-mcp-adapter/dist/state.js +2 -0
- package/node_modules/pi-mcp-adapter/dist/state.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/types.d.ts +36 -0
- package/node_modules/pi-mcp-adapter/dist/types.js +18 -0
- package/node_modules/pi-mcp-adapter/dist/types.js.map +1 -1
- package/node_modules/pi-mcp-adapter/dist/ui-resource-handler.d.ts +17 -0
- package/node_modules/pi-mcp-adapter/dist/ui-resource-handler.js +219 -0
- package/node_modules/pi-mcp-adapter/dist/ui-resource-handler.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/unix-socket-transport.d.ts +15 -0
- package/node_modules/pi-mcp-adapter/dist/unix-socket-transport.js +85 -0
- package/node_modules/pi-mcp-adapter/dist/unix-socket-transport.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/utils.d.ts +1 -0
- package/node_modules/pi-mcp-adapter/dist/utils.js +13 -0
- package/node_modules/pi-mcp-adapter/dist/utils.js.map +1 -1
- package/node_modules/pi-mcp-adapter/elicitation-handler.ts +29 -19
- package/node_modules/pi-mcp-adapter/examples/jev-accessibility-loop.mjs +85 -0
- package/node_modules/pi-mcp-adapter/examples/jev-semantic-filter.mjs +34 -0
- package/node_modules/pi-mcp-adapter/index.ts +129 -6
- package/node_modules/pi-mcp-adapter/init.ts +6 -19
- package/node_modules/pi-mcp-adapter/jev-client.ts +273 -0
- package/node_modules/pi-mcp-adapter/jev-contracts.ts +53 -0
- package/node_modules/pi-mcp-adapter/jev-key-store.ts +79 -0
- package/node_modules/pi-mcp-adapter/lifecycle.ts +14 -3
- package/node_modules/pi-mcp-adapter/mcp-bearer-store.ts +7 -142
- package/node_modules/pi-mcp-adapter/mcp-code.ts +119 -11
- package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +4 -0
- package/node_modules/pi-mcp-adapter/mcp-references.ts +5 -3
- package/node_modules/pi-mcp-adapter/mcp-script-worker.mjs +5 -0
- package/node_modules/pi-mcp-adapter/mcp-tasks.ts +467 -0
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +2 -13
- package/node_modules/pi-mcp-adapter/namespace-tools.ts +1 -1
- package/node_modules/pi-mcp-adapter/package.json +17 -9
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +319 -166
- package/node_modules/pi-mcp-adapter/request-headers-command.ts +6 -3
- package/node_modules/pi-mcp-adapter/search-ranking.ts +38 -7
- package/node_modules/pi-mcp-adapter/secure-keyring.ts +170 -0
- package/node_modules/pi-mcp-adapter/semantic-search.ts +186 -0
- package/node_modules/pi-mcp-adapter/server-manager.ts +293 -50
- package/node_modules/pi-mcp-adapter/session-approvals.ts +14 -0
- package/node_modules/pi-mcp-adapter/skills/mcp-scripting/SKILL.md +2 -0
- package/node_modules/pi-mcp-adapter/state.ts +3 -1
- package/node_modules/pi-mcp-adapter/tool-approval.ts +26 -4
- package/node_modules/pi-mcp-adapter/tool-metadata.ts +6 -14
- package/node_modules/pi-mcp-adapter/tool-registrar.ts +8 -6
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +4 -1
- package/node_modules/pi-mcp-adapter/types.ts +53 -0
- package/node_modules/pi-mcp-adapter/ui-server.ts +17 -9
- package/node_modules/pi-mcp-adapter/utils.ts +16 -0
- package/node_modules/pi-multi-account/CHANGELOG.md +23 -0
- package/node_modules/pi-multi-account/README.md +38 -11
- package/node_modules/pi-multi-account/index.ts +371 -96
- package/node_modules/pi-multi-account/package.json +5 -4
- package/node_modules/pi-multi-account/provider-payload-stream.ts +36 -28
- package/node_modules/pi-multi-account/usage.ts +31 -2
- package/node_modules/pi-typesafe/README.md +3 -1
- package/node_modules/pi-typesafe/dist/auth.d.ts +10 -3
- package/node_modules/pi-typesafe/dist/auth.js +13 -7
- package/node_modules/pi-typesafe/dist/backends.d.ts +31 -0
- package/node_modules/pi-typesafe/dist/backends.js +33 -0
- package/node_modules/pi-typesafe/dist/client.d.ts +3 -9
- package/node_modules/pi-typesafe/dist/client.js +63 -39
- package/node_modules/pi-typesafe/dist/credentials.d.ts +11 -5
- package/node_modules/pi-typesafe/dist/credentials.js +15 -8
- package/node_modules/pi-typesafe/dist/extension.js +4 -1
- package/node_modules/pi-typesafe/dist/index.d.ts +1 -1
- package/node_modules/pi-typesafe/dist/index.js +1 -1
- package/node_modules/pi-typesafe/dist/login.d.ts +13 -7
- package/node_modules/pi-typesafe/dist/login.js +17 -8
- package/node_modules/pi-typesafe/dist/schema.js +19 -13
- package/node_modules/pi-typesafe/package.json +1 -1
- package/package.json +11 -10
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import { TypeSafeClient } from "@typesafe-ai/sdk";
|
|
2
|
+
import { isServerDisabled } from "./types.js";
|
|
3
|
+
import { combineAbortSignals } from "./runtime-owner.js";
|
|
4
|
+
import { resolveJevCredential, TYPESAFE_API_ORIGIN } from "./jev-key-store.js";
|
|
5
|
+
export { TYPESAFE_API_ORIGIN };
|
|
6
|
+
const DEFAULTS = {
|
|
7
|
+
semanticSearch: false, scriptEvaluation: false, allowedServers: [], model: "jev-1.13.0",
|
|
8
|
+
requestTimeoutMs: 5_000, maxRetries: 0, maxStateBytes: 262_144,
|
|
9
|
+
maxQuestionsPerRequest: 64, maxEvaluationsPerScript: 8,
|
|
10
|
+
maxEvaluationBytesPerScript: 524_288, maxEvaluationTokensPerScript: 32_768, semanticCandidateLimit: 127,
|
|
11
|
+
semanticMinProbability: 0.2,
|
|
12
|
+
};
|
|
13
|
+
const DANGEROUS_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
14
|
+
const hosts = new WeakMap();
|
|
15
|
+
const credentials = new WeakMap();
|
|
16
|
+
function resolveCredential(state) {
|
|
17
|
+
const existing = credentials.get(state);
|
|
18
|
+
if (existing)
|
|
19
|
+
return existing;
|
|
20
|
+
const credential = resolveJevCredential();
|
|
21
|
+
if (credential.status === "present")
|
|
22
|
+
credentials.set(state, credential);
|
|
23
|
+
return credential;
|
|
24
|
+
}
|
|
25
|
+
export function areJevSourcesAllowed(state, settings, sources) {
|
|
26
|
+
for (const source of sources) {
|
|
27
|
+
const server = state.config.mcpServers[source];
|
|
28
|
+
if (!settings.allowedServers.includes(source) || !server || isServerDisabled(server))
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
function record(value, label) {
|
|
34
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
35
|
+
throw new Error(`${label} must be an object`);
|
|
36
|
+
const prototype = Object.getPrototypeOf(value);
|
|
37
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
38
|
+
throw new Error(`${label} must be a plain object`);
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
function boolean(value, fallback, label) {
|
|
42
|
+
if (value === undefined)
|
|
43
|
+
return fallback;
|
|
44
|
+
if (typeof value !== "boolean")
|
|
45
|
+
throw new Error(`${label} must be a boolean`);
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
function integer(value, fallback, min, max, label) {
|
|
49
|
+
if (value === undefined)
|
|
50
|
+
return fallback;
|
|
51
|
+
if (!Number.isInteger(value) || value < min || value > max)
|
|
52
|
+
throw new Error(`${label} must be an integer from ${min} to ${max}`);
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
export function validateJevSettings(value) {
|
|
56
|
+
if (value === undefined || value === false)
|
|
57
|
+
return { ...DEFAULTS, allowedServers: [...DEFAULTS.allowedServers] };
|
|
58
|
+
const input = record(value, "settings.jev");
|
|
59
|
+
const allowed = new Set(Object.keys(DEFAULTS));
|
|
60
|
+
for (const key of Object.keys(input))
|
|
61
|
+
if (!allowed.has(key))
|
|
62
|
+
throw new Error(`settings.jev.${key} is not supported`);
|
|
63
|
+
if (input.allowedServers !== undefined && (!Array.isArray(input.allowedServers) || input.allowedServers.some(name => typeof name !== "string" || name.length === 0 || DANGEROUS_KEYS.has(name) || /[\u0000-\u001f\u007f]/.test(name)))) {
|
|
64
|
+
throw new Error("settings.jev.allowedServers must contain non-empty safe server names");
|
|
65
|
+
}
|
|
66
|
+
const model = input.model ?? DEFAULTS.model;
|
|
67
|
+
if (typeof model !== "string" || model.length === 0 || model.length > 128 || /(?:latest|preview)/i.test(model))
|
|
68
|
+
throw new Error("settings.jev.model must be a pinned model name");
|
|
69
|
+
const probability = input.semanticMinProbability ?? DEFAULTS.semanticMinProbability;
|
|
70
|
+
if (typeof probability !== "number" || !Number.isFinite(probability) || probability < 0 || probability > 1)
|
|
71
|
+
throw new Error("settings.jev.semanticMinProbability must be from 0 to 1");
|
|
72
|
+
return {
|
|
73
|
+
semanticSearch: boolean(input.semanticSearch, DEFAULTS.semanticSearch, "settings.jev.semanticSearch"),
|
|
74
|
+
scriptEvaluation: boolean(input.scriptEvaluation, DEFAULTS.scriptEvaluation, "settings.jev.scriptEvaluation"),
|
|
75
|
+
allowedServers: [...new Set(input.allowedServers ?? DEFAULTS.allowedServers)], model,
|
|
76
|
+
requestTimeoutMs: integer(input.requestTimeoutMs, DEFAULTS.requestTimeoutMs, 100, 30_000, "settings.jev.requestTimeoutMs"),
|
|
77
|
+
maxRetries: integer(input.maxRetries, DEFAULTS.maxRetries, 0, 2, "settings.jev.maxRetries"),
|
|
78
|
+
maxStateBytes: integer(input.maxStateBytes, DEFAULTS.maxStateBytes, 1, 1_048_576, "settings.jev.maxStateBytes"),
|
|
79
|
+
maxQuestionsPerRequest: integer(input.maxQuestionsPerRequest, DEFAULTS.maxQuestionsPerRequest, 1, 128, "settings.jev.maxQuestionsPerRequest"),
|
|
80
|
+
maxEvaluationsPerScript: integer(input.maxEvaluationsPerScript, DEFAULTS.maxEvaluationsPerScript, 1, 32, "settings.jev.maxEvaluationsPerScript"),
|
|
81
|
+
maxEvaluationBytesPerScript: integer(input.maxEvaluationBytesPerScript, DEFAULTS.maxEvaluationBytesPerScript, 1, 4_194_304, "settings.jev.maxEvaluationBytesPerScript"),
|
|
82
|
+
maxEvaluationTokensPerScript: integer(input.maxEvaluationTokensPerScript, DEFAULTS.maxEvaluationTokensPerScript, 1, 1_000_000, "settings.jev.maxEvaluationTokensPerScript"),
|
|
83
|
+
semanticCandidateLimit: integer(input.semanticCandidateLimit, DEFAULTS.semanticCandidateLimit, 2, 127, "settings.jev.semanticCandidateLimit"),
|
|
84
|
+
semanticMinProbability: probability,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export function resolveSemanticJevSettings(state, credentialResolver) {
|
|
88
|
+
const configured = state.config.settings?.jev;
|
|
89
|
+
const settings = validateJevSettings(configured);
|
|
90
|
+
if (configured === false || configured?.semanticSearch === false)
|
|
91
|
+
return settings;
|
|
92
|
+
const semanticSearch = settings.semanticSearch || (credentialResolver ? credentialResolver() : resolveCredential(state)).status === "present";
|
|
93
|
+
const hasExplicitAllowlist = configured !== undefined && Object.hasOwn(configured, "allowedServers");
|
|
94
|
+
const allowedServers = hasExplicitAllowlist
|
|
95
|
+
? settings.allowedServers
|
|
96
|
+
: Object.keys(state.config.mcpServers).filter((name) => !isServerDisabled(state.config.mcpServers[name]));
|
|
97
|
+
return { ...settings, semanticSearch, allowedServers };
|
|
98
|
+
}
|
|
99
|
+
function validateJson(value, path, seen = new Set()) {
|
|
100
|
+
if (value === null || typeof value === "string" || typeof value === "boolean")
|
|
101
|
+
return;
|
|
102
|
+
if (typeof value === "number") {
|
|
103
|
+
if (Number.isFinite(value))
|
|
104
|
+
return;
|
|
105
|
+
throw new Error(`${path} contains a non-finite number`);
|
|
106
|
+
}
|
|
107
|
+
if (typeof value !== "object")
|
|
108
|
+
throw new Error(`${path} is not JSON-compatible`);
|
|
109
|
+
if (seen.has(value))
|
|
110
|
+
throw new Error(`${path} contains a cycle`);
|
|
111
|
+
seen.add(value);
|
|
112
|
+
if (Array.isArray(value))
|
|
113
|
+
value.forEach((item, index) => validateJson(item, `${path}[${index}]`, seen));
|
|
114
|
+
else {
|
|
115
|
+
const prototype = Object.getPrototypeOf(value);
|
|
116
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
117
|
+
throw new Error(`${path} contains a non-plain object`);
|
|
118
|
+
for (const [key, item] of Object.entries(value)) {
|
|
119
|
+
if (DANGEROUS_KEYS.has(key))
|
|
120
|
+
throw new Error(`${path} contains an unsafe key`);
|
|
121
|
+
validateJson(item, `${path}.${key}`, seen);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
seen.delete(value);
|
|
125
|
+
}
|
|
126
|
+
function validateId(id, label) {
|
|
127
|
+
if (id.length === 0 || id.length > 128 || DANGEROUS_KEYS.has(id) || /[\u0000-\u001f\u007f]/.test(id))
|
|
128
|
+
throw new Error(`${label} contains an invalid identifier`);
|
|
129
|
+
}
|
|
130
|
+
function validateSource(source) {
|
|
131
|
+
if (source.length === 0 || DANGEROUS_KEYS.has(source) || /[\u0000-\u001f\u007f]/.test(source))
|
|
132
|
+
throw new Error("sources contains an invalid server name");
|
|
133
|
+
}
|
|
134
|
+
function exactKeys(value, allowed, label) {
|
|
135
|
+
if (Object.keys(value).some(key => !allowed.includes(key)))
|
|
136
|
+
throw new Error(`${label} contains unsupported fields`);
|
|
137
|
+
}
|
|
138
|
+
export function validateJevEvaluateInput(value, limits) {
|
|
139
|
+
const input = record(value, "Jev evaluation input");
|
|
140
|
+
exactKeys(input, ["state", "questions", "sources"], "Jev evaluation input");
|
|
141
|
+
if (!("state" in input))
|
|
142
|
+
throw new Error("Jev evaluation input requires state");
|
|
143
|
+
validateJson(input.state, "state");
|
|
144
|
+
const stateBytes = Buffer.byteLength(JSON.stringify(input.state));
|
|
145
|
+
if (stateBytes > limits.maxStateBytes)
|
|
146
|
+
throw new Error("Jev state exceeds maxStateBytes");
|
|
147
|
+
const questions = record(input.questions, "questions");
|
|
148
|
+
const entries = Object.entries(questions);
|
|
149
|
+
if (entries.length < 1 || entries.length > limits.maxQuestionsPerRequest)
|
|
150
|
+
throw new Error("Jev question count is outside the configured limit");
|
|
151
|
+
for (const [id, raw] of entries) {
|
|
152
|
+
validateId(id, "questions");
|
|
153
|
+
const question = record(raw, `question ${id}`);
|
|
154
|
+
if (question.type === "choice") {
|
|
155
|
+
exactKeys(question, ["type", "instructions", "criteria"], `question ${id}`);
|
|
156
|
+
const criteria = record(question.criteria, `question ${id} criteria`);
|
|
157
|
+
const labels = Object.keys(criteria);
|
|
158
|
+
if (labels.length < 2 || labels.length > 128)
|
|
159
|
+
throw new Error(`question ${id} choice criteria must have 2 to 128 labels`);
|
|
160
|
+
for (const label of labels) {
|
|
161
|
+
validateId(label, `question ${id} criteria`);
|
|
162
|
+
validateJson(criteria[label], `question ${id} criteria.${label}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else if (question.type === "score") {
|
|
166
|
+
exactKeys(question, ["type", "instructions", "criteria"], `question ${id}`);
|
|
167
|
+
if (!Array.isArray(question.criteria) || question.criteria.length < 2 || question.criteria.length > 16)
|
|
168
|
+
throw new Error(`question ${id} score criteria must have 2 to 16 entries`);
|
|
169
|
+
validateJson(question.criteria, `question ${id} criteria`);
|
|
170
|
+
}
|
|
171
|
+
else if (question.type === "noul") {
|
|
172
|
+
exactKeys(question, ["type", "instructions", "criteria"], `question ${id}`);
|
|
173
|
+
if (question.criteria !== undefined) {
|
|
174
|
+
const criteria = record(question.criteria, `question ${id} criteria`);
|
|
175
|
+
exactKeys(criteria, ["true", "false"], `question ${id} criteria`);
|
|
176
|
+
validateJson(criteria, `question ${id} criteria`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else
|
|
180
|
+
throw new Error(`question ${id} has an invalid type`);
|
|
181
|
+
if (question.instructions !== undefined)
|
|
182
|
+
validateJson(question.instructions, `question ${id} instructions`);
|
|
183
|
+
}
|
|
184
|
+
let sources;
|
|
185
|
+
if (input.sources !== undefined) {
|
|
186
|
+
if (!Array.isArray(input.sources))
|
|
187
|
+
throw new Error("sources must be an array");
|
|
188
|
+
sources = input.sources.map((source, index) => { if (typeof source !== "string")
|
|
189
|
+
throw new Error(`sources[${index}] must be a string`); validateSource(source); return source; });
|
|
190
|
+
if (new Set(sources).size !== sources.length)
|
|
191
|
+
throw new Error("sources must not contain duplicates");
|
|
192
|
+
}
|
|
193
|
+
const normalized = { state: input.state, questions: questions, ...(sources ? { sources } : {}) };
|
|
194
|
+
if (Buffer.byteLength(JSON.stringify(normalized)) > limits.maxEvaluationBytesPerScript)
|
|
195
|
+
throw new Error("Jev request exceeds the configured byte limit");
|
|
196
|
+
return normalized;
|
|
197
|
+
}
|
|
198
|
+
function safeNumber(value, label, integerOnly = false) {
|
|
199
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0 || (integerOnly && !Number.isInteger(value)))
|
|
200
|
+
throw new Error(`Invalid ${label}`);
|
|
201
|
+
return value;
|
|
202
|
+
}
|
|
203
|
+
function probability(value, label) {
|
|
204
|
+
const number = safeNumber(value, label);
|
|
205
|
+
if (number > 1)
|
|
206
|
+
throw new Error(`Invalid ${label}`);
|
|
207
|
+
return number;
|
|
208
|
+
}
|
|
209
|
+
function sameKeys(actual, expected) {
|
|
210
|
+
const keys = Object.keys(actual);
|
|
211
|
+
return keys.length === expected.length && expected.every(key => Object.hasOwn(actual, key));
|
|
212
|
+
}
|
|
213
|
+
function validateResponse(value, input) {
|
|
214
|
+
const response = record(value, "response");
|
|
215
|
+
exactKeys(response, ["model", "answers", "usage"], "response");
|
|
216
|
+
const answers = record(response.answers, "response answers");
|
|
217
|
+
const questionNames = Object.keys(input.questions);
|
|
218
|
+
if (!sameKeys(answers, questionNames))
|
|
219
|
+
throw new Error("Response answer keys do not match questions");
|
|
220
|
+
const validated = {};
|
|
221
|
+
for (const name of questionNames) {
|
|
222
|
+
const question = input.questions[name];
|
|
223
|
+
const answer = record(answers[name], `answer ${name}`);
|
|
224
|
+
if (answer.type !== question.type)
|
|
225
|
+
throw new Error(`Answer ${name} type does not match`);
|
|
226
|
+
if (question.type === "choice") {
|
|
227
|
+
exactKeys(answer, ["type", "choice", "confidence", "probabilities"], `answer ${name}`);
|
|
228
|
+
const labels = Object.keys(question.criteria);
|
|
229
|
+
if (typeof answer.choice !== "string" || !Object.hasOwn(question.criteria, answer.choice))
|
|
230
|
+
throw new Error(`Answer ${name} choice is invalid`);
|
|
231
|
+
const probabilities = record(answer.probabilities, `answer ${name} probabilities`);
|
|
232
|
+
if (!sameKeys(probabilities, labels))
|
|
233
|
+
throw new Error(`Answer ${name} probability keys are invalid`);
|
|
234
|
+
validated[name] = { type: "choice", choice: answer.choice, confidence: probability(answer.confidence, "confidence"), probabilities: Object.fromEntries(labels.map(label => [label, probability(probabilities[label], "probability")])) };
|
|
235
|
+
}
|
|
236
|
+
else if (question.type === "score") {
|
|
237
|
+
exactKeys(answer, ["type", "score", "confidence", "probabilities", "legend"], `answer ${name}`);
|
|
238
|
+
const labels = question.criteria.map((_, index) => String(index));
|
|
239
|
+
const probabilities = record(answer.probabilities, `answer ${name} probabilities`);
|
|
240
|
+
if (!sameKeys(probabilities, labels))
|
|
241
|
+
throw new Error(`Answer ${name} probability keys are invalid`);
|
|
242
|
+
const score = safeNumber(answer.score, "score");
|
|
243
|
+
if (score > question.criteria.length - 1)
|
|
244
|
+
throw new Error(`Answer ${name} score is invalid`);
|
|
245
|
+
validated[name] = { type: "score", score, confidence: probability(answer.confidence, "confidence"), probabilities: Object.fromEntries(labels.map(label => [label, probability(probabilities[label], "probability")])) };
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
exactKeys(answer, ["type", "noul"], `answer ${name}`);
|
|
249
|
+
validated[name] = { type: "noul", noul: probability(answer.noul, "noul") };
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (typeof response.model !== "string" || response.model.length === 0 || response.model.length > 128)
|
|
253
|
+
throw new Error("Invalid response model");
|
|
254
|
+
const usage = record(response.usage, "response usage");
|
|
255
|
+
if (!sameKeys(usage, ["input_tokens", "output_tokens"]))
|
|
256
|
+
throw new Error("Invalid response usage");
|
|
257
|
+
return { answers: validated, model: response.model, usage: { inputTokens: safeNumber(usage.input_tokens, "input tokens", true), outputTokens: safeNumber(usage.output_tokens, "output tokens", true) } };
|
|
258
|
+
}
|
|
259
|
+
function fixedOriginFetch(input, init) {
|
|
260
|
+
const url = new URL(input);
|
|
261
|
+
if (url.origin !== TYPESAFE_API_ORIGIN)
|
|
262
|
+
throw new Error("TypeSafe request origin rejected");
|
|
263
|
+
return fetch(input, { ...init, redirect: "error" });
|
|
264
|
+
}
|
|
265
|
+
function getHost(state, settings) {
|
|
266
|
+
const existing = hosts.get(state);
|
|
267
|
+
if (existing)
|
|
268
|
+
return existing;
|
|
269
|
+
const credential = resolveCredential(state);
|
|
270
|
+
if (credential.status === "missing")
|
|
271
|
+
return { ok: false, error: { code: "credential_missing", message: "TypeSafe API key is not configured." } };
|
|
272
|
+
if (credential.status === "unavailable")
|
|
273
|
+
return { ok: false, error: { code: "credential_unavailable", message: credential.message } };
|
|
274
|
+
const host = { client: new TypeSafeClient({ apiKey: credential.apiKey, baseURL: TYPESAFE_API_ORIGIN, defaultModel: settings.model, logLevel: "off", retry: { maxRetries: settings.maxRetries }, timeout: settings.requestTimeoutMs, defaultHeaders: {}, fetch: fixedOriginFetch }) };
|
|
275
|
+
hosts.set(state, host);
|
|
276
|
+
return host;
|
|
277
|
+
}
|
|
278
|
+
function failure(error, signal, timedOut) {
|
|
279
|
+
if (timedOut)
|
|
280
|
+
return { ok: false, error: { code: "timeout", message: "TypeSafe evaluation timed out.", retryable: true } };
|
|
281
|
+
if (signal?.aborted || (error instanceof Error && error.name === "APIUserAbortError"))
|
|
282
|
+
return { ok: false, error: { code: "aborted", message: "TypeSafe evaluation was aborted." } };
|
|
283
|
+
const status = typeof error === "object" && error !== null && "status" in error ? error.status : undefined;
|
|
284
|
+
if (status === 401 || status === 403)
|
|
285
|
+
return { ok: false, error: { code: "authentication_failed", message: "TypeSafe authentication failed." } };
|
|
286
|
+
if (status === 408)
|
|
287
|
+
return { ok: false, error: { code: "timeout", message: "TypeSafe evaluation timed out.", retryable: true } };
|
|
288
|
+
if (status === 429)
|
|
289
|
+
return { ok: false, error: { code: "rate_limited", message: "TypeSafe rate limit exceeded.", retryable: true } };
|
|
290
|
+
if (typeof status === "number" && status >= 500)
|
|
291
|
+
return { ok: false, error: { code: "service_unavailable", message: "TypeSafe service is unavailable.", retryable: true } };
|
|
292
|
+
if (status === 400 || status === 422)
|
|
293
|
+
return { ok: false, error: { code: "invalid_request", message: "TypeSafe rejected the evaluation request." } };
|
|
294
|
+
if (error instanceof Error && (error.name === "APIConnectionError" || error.name === "APITimeoutError"))
|
|
295
|
+
return { ok: false, error: { code: "service_unavailable", message: "TypeSafe service is unavailable.", retryable: true } };
|
|
296
|
+
return { ok: false, error: { code: "invalid_response", message: "TypeSafe returned an invalid response." } };
|
|
297
|
+
}
|
|
298
|
+
export async function evaluateJev(state, value, options) {
|
|
299
|
+
let settings;
|
|
300
|
+
let input;
|
|
301
|
+
try {
|
|
302
|
+
settings = options.purpose === "semantic-search" ? resolveSemanticJevSettings(state) : validateJevSettings(state.config.settings?.jev);
|
|
303
|
+
input = validateJevEvaluateInput(value, settings);
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
return { ok: false, error: { code: "invalid_request", message: "Invalid TypeSafe evaluation request or settings." } };
|
|
307
|
+
}
|
|
308
|
+
if ((options.purpose === "script" && !settings.scriptEvaluation) || (options.purpose === "semantic-search" && !settings.semanticSearch))
|
|
309
|
+
return { ok: false, error: { code: "disabled", message: "TypeSafe evaluation is disabled." } };
|
|
310
|
+
const sources = new Set([...(input.sources ?? []), ...(options.observedSources ?? [])]);
|
|
311
|
+
if (!areJevSourcesAllowed(state, settings, sources))
|
|
312
|
+
return { ok: false, error: { code: "data_policy_denied", message: "Evaluation sources are not allowed by policy." } };
|
|
313
|
+
const bytes = Buffer.byteLength(JSON.stringify(input));
|
|
314
|
+
if (options.budget && !options.budget.consume(bytes))
|
|
315
|
+
return { ok: false, error: { code: "budget_exhausted", message: "TypeSafe evaluation budget exhausted." } };
|
|
316
|
+
const resolved = getHost(state, settings);
|
|
317
|
+
if (!("client" in resolved))
|
|
318
|
+
return resolved;
|
|
319
|
+
const deadline = new AbortController();
|
|
320
|
+
let timedOut = false;
|
|
321
|
+
const timer = setTimeout(() => { timedOut = true; deadline.abort(new Error("TypeSafe evaluation deadline exceeded")); }, settings.requestTimeoutMs);
|
|
322
|
+
const signal = combineAbortSignals(options.signal, state.owner.signal, deadline.signal);
|
|
323
|
+
try {
|
|
324
|
+
const request = { state: input.state, questions: input.questions, model: settings.model };
|
|
325
|
+
const raw = await resolved.client.systemOne(request, { ...(signal ? { signal } : {}), timeout: settings.requestTimeoutMs, retry: { maxRetries: settings.maxRetries } });
|
|
326
|
+
try {
|
|
327
|
+
return { ok: true, data: validateResponse(raw, input) };
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return { ok: false, error: { code: "invalid_response", message: "TypeSafe returned an invalid response." } };
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
return failure(error, signal, timedOut);
|
|
335
|
+
}
|
|
336
|
+
finally {
|
|
337
|
+
clearTimeout(timer);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=jev-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev-client.js","sourceRoot":"","sources":["../jev-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export type JevJson = null | boolean | number | string | JevJson[] | {
|
|
2
|
+
[key: string]: JevJson;
|
|
3
|
+
};
|
|
4
|
+
export type JevQuestion = {
|
|
5
|
+
type: "choice";
|
|
6
|
+
instructions?: JevJson;
|
|
7
|
+
criteria: Record<string, JevJson>;
|
|
8
|
+
} | {
|
|
9
|
+
type: "score";
|
|
10
|
+
instructions?: JevJson;
|
|
11
|
+
criteria: [JevJson, JevJson, ...JevJson[]];
|
|
12
|
+
} | {
|
|
13
|
+
type: "noul";
|
|
14
|
+
instructions?: JevJson;
|
|
15
|
+
criteria?: {
|
|
16
|
+
true?: JevJson;
|
|
17
|
+
false?: JevJson;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export interface JevEvaluateInput {
|
|
21
|
+
state: JevJson;
|
|
22
|
+
questions: Record<string, JevQuestion>;
|
|
23
|
+
/** MCP servers whose metadata/results were copied into state. Empty/omitted means no MCP-derived data. */
|
|
24
|
+
sources?: string[];
|
|
25
|
+
}
|
|
26
|
+
export type JevAnswer = {
|
|
27
|
+
type: "choice";
|
|
28
|
+
choice: string;
|
|
29
|
+
confidence: number;
|
|
30
|
+
probabilities: Record<string, number>;
|
|
31
|
+
} | {
|
|
32
|
+
type: "score";
|
|
33
|
+
score: number;
|
|
34
|
+
confidence: number;
|
|
35
|
+
probabilities: Record<string, number>;
|
|
36
|
+
} | {
|
|
37
|
+
type: "noul";
|
|
38
|
+
noul: number;
|
|
39
|
+
};
|
|
40
|
+
export interface JevEvaluationData {
|
|
41
|
+
answers: Record<string, JevAnswer>;
|
|
42
|
+
model: string;
|
|
43
|
+
usage: {
|
|
44
|
+
inputTokens: number;
|
|
45
|
+
outputTokens: number;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export type JevErrorCode = "disabled" | "invalid_request" | "data_policy_denied" | "budget_exhausted" | "credential_missing" | "credential_unavailable" | "authentication_failed" | "timeout" | "aborted" | "rate_limited" | "service_unavailable" | "invalid_response";
|
|
49
|
+
export type JevEvaluationEnvelope = {
|
|
50
|
+
ok: true;
|
|
51
|
+
data: JevEvaluationData;
|
|
52
|
+
} | {
|
|
53
|
+
ok: false;
|
|
54
|
+
error: {
|
|
55
|
+
code: JevErrorCode;
|
|
56
|
+
message: string;
|
|
57
|
+
retryable?: boolean;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
export interface ResolvedJevSettings {
|
|
61
|
+
semanticSearch: boolean;
|
|
62
|
+
scriptEvaluation: boolean;
|
|
63
|
+
allowedServers: string[];
|
|
64
|
+
model: string;
|
|
65
|
+
requestTimeoutMs: number;
|
|
66
|
+
maxRetries: number;
|
|
67
|
+
maxStateBytes: number;
|
|
68
|
+
maxQuestionsPerRequest: number;
|
|
69
|
+
maxEvaluationsPerScript: number;
|
|
70
|
+
maxEvaluationBytesPerScript: number;
|
|
71
|
+
maxEvaluationTokensPerScript: number;
|
|
72
|
+
semanticCandidateLimit: number;
|
|
73
|
+
semanticMinProbability: number;
|
|
74
|
+
}
|
|
75
|
+
export interface JevBudget {
|
|
76
|
+
consume(bytes: number): boolean;
|
|
77
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev-contracts.js","sourceRoot":"","sources":["../jev-contracts.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type SecureKeyringStore } from "./secure-keyring.ts";
|
|
2
|
+
export declare const TYPESAFE_API_ORIGIN = "https://api.typesafe.ai";
|
|
3
|
+
export declare const JEV_KEYRING_SERVICE = "pi-mcp-adapter.service-key";
|
|
4
|
+
export declare const JEV_KEYRING_ACCOUNT = "typesafe@sha256(https://api.typesafe.ai)";
|
|
5
|
+
export declare class JevCredentialStoreError extends Error {
|
|
6
|
+
readonly operation: "read" | "write" | "remove";
|
|
7
|
+
readonly code = "JEV_CREDENTIAL_STORE_UNAVAILABLE";
|
|
8
|
+
constructor(operation: "read" | "write" | "remove", cause: unknown);
|
|
9
|
+
}
|
|
10
|
+
export type JevCredentialResolution = {
|
|
11
|
+
status: "present";
|
|
12
|
+
source: "environment" | "keyring";
|
|
13
|
+
apiKey: string;
|
|
14
|
+
} | {
|
|
15
|
+
status: "missing";
|
|
16
|
+
} | {
|
|
17
|
+
status: "unavailable";
|
|
18
|
+
message: string;
|
|
19
|
+
};
|
|
20
|
+
export declare function resolveJevCredential(env?: NodeJS.ProcessEnv, secretStore?: SecureKeyringStore): JevCredentialResolution;
|
|
21
|
+
export declare function saveJevApiKey(apiKey: string, secretStore?: SecureKeyringStore): void;
|
|
22
|
+
export declare function removeJevApiKey(secretStore?: SecureKeyringStore): void;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createSecureKeyringStore } from "./secure-keyring.js";
|
|
2
|
+
export const TYPESAFE_API_ORIGIN = "https://api.typesafe.ai";
|
|
3
|
+
export const JEV_KEYRING_SERVICE = "pi-mcp-adapter.service-key";
|
|
4
|
+
export const JEV_KEYRING_ACCOUNT = "typesafe@sha256(https://api.typesafe.ai)";
|
|
5
|
+
export class JevCredentialStoreError extends Error {
|
|
6
|
+
operation;
|
|
7
|
+
code = "JEV_CREDENTIAL_STORE_UNAVAILABLE";
|
|
8
|
+
constructor(operation, cause) {
|
|
9
|
+
super(`TypeSafe API key secure credential store unavailable during ${operation}. Configure or unlock the OS credential store and retry.`, { cause });
|
|
10
|
+
this.operation = operation;
|
|
11
|
+
this.name = "JevCredentialStoreError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function validateApiKey(value) {
|
|
15
|
+
if (typeof value !== "string" || value.trim().length === 0 || /[\u0000-\u001f\u007f]/.test(value)) {
|
|
16
|
+
throw new Error("TypeSafe API key must be a non-empty string without control characters");
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function store() {
|
|
21
|
+
return createSecureKeyringStore(JEV_KEYRING_SERVICE);
|
|
22
|
+
}
|
|
23
|
+
function readStoredKey(secretStore = store()) {
|
|
24
|
+
let payload;
|
|
25
|
+
try {
|
|
26
|
+
payload = secretStore.read(JEV_KEYRING_ACCOUNT);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
throw new JevCredentialStoreError("read", error);
|
|
30
|
+
}
|
|
31
|
+
if (payload === undefined)
|
|
32
|
+
return undefined;
|
|
33
|
+
try {
|
|
34
|
+
const value = JSON.parse(payload);
|
|
35
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
36
|
+
throw new Error("invalid record");
|
|
37
|
+
const record = value;
|
|
38
|
+
const keys = Object.keys(record);
|
|
39
|
+
if (keys.length !== 4 || !["version", "provider", "origin", "apiKey"].every(key => Object.hasOwn(record, key)))
|
|
40
|
+
throw new Error("invalid record fields");
|
|
41
|
+
if (record.version !== 1 || record.provider !== "typesafe" || record.origin !== TYPESAFE_API_ORIGIN)
|
|
42
|
+
throw new Error("invalid or mismatched record");
|
|
43
|
+
return validateApiKey(record.apiKey);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
throw new JevCredentialStoreError("read", error);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function resolveJevCredential(env = process.env, secretStore) {
|
|
50
|
+
if (Object.hasOwn(env, "TYPESAFE_API_KEY")) {
|
|
51
|
+
try {
|
|
52
|
+
return { status: "present", source: "environment", apiKey: validateApiKey(env.TYPESAFE_API_KEY) };
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return { status: "unavailable", message: "TYPESAFE_API_KEY is present but invalid." };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const apiKey = readStoredKey(secretStore ?? store());
|
|
60
|
+
return apiKey === undefined ? { status: "missing" } : { status: "present", source: "keyring", apiKey };
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (!(error instanceof JevCredentialStoreError))
|
|
64
|
+
throw error;
|
|
65
|
+
return { status: "unavailable", message: error.message };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function saveJevApiKey(apiKey, secretStore = store()) {
|
|
69
|
+
const record = { version: 1, provider: "typesafe", origin: TYPESAFE_API_ORIGIN, apiKey: validateApiKey(apiKey) };
|
|
70
|
+
try {
|
|
71
|
+
secretStore.write(JEV_KEYRING_ACCOUNT, JSON.stringify(record));
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
throw new JevCredentialStoreError("write", error);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function removeJevApiKey(secretStore = store()) {
|
|
78
|
+
try {
|
|
79
|
+
secretStore.remove(JEV_KEYRING_ACCOUNT);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
throw new JevCredentialStoreError("remove", error);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=jev-key-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev-key-store.js","sourceRoot":"","sources":["../jev-key-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Ajv } from "ajv";
|
|
2
|
+
import Ajv2020Import from "ajv/dist/2020.js";
|
|
3
|
+
import addFormatsImport from "ajv-formats";
|
|
4
|
+
import { AjvJsonSchemaValidator } from "@modelcontextprotocol/client/validators/ajv";
|
|
5
|
+
// ajv-formats types target its bundled ajv; the runtime accepts both instances.
|
|
6
|
+
const addFormats = addFormatsImport;
|
|
7
|
+
const DRAFT_07_SCHEMA_URIS = new Set([
|
|
8
|
+
"http://json-schema.org/draft-07/schema",
|
|
9
|
+
"https://json-schema.org/draft-07/schema",
|
|
10
|
+
]);
|
|
11
|
+
const DRAFT_2020_12_SCHEMA_URIS = new Set([
|
|
12
|
+
"https://json-schema.org/draft/2020-12/schema",
|
|
13
|
+
]);
|
|
14
|
+
function schemaDialect(schema) {
|
|
15
|
+
if (!("$schema" in schema) || typeof schema.$schema !== "string") {
|
|
16
|
+
return { status: "unstamped" };
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
status: "stamped",
|
|
20
|
+
uri: schema.$schema.endsWith("#") ? schema.$schema.slice(0, -1) : schema.$schema,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function createJsonSchemaValidator() {
|
|
24
|
+
let draft07Validator;
|
|
25
|
+
let draft2020Validator;
|
|
26
|
+
return {
|
|
27
|
+
getValidator(schema) {
|
|
28
|
+
const dialect = schemaDialect(schema);
|
|
29
|
+
if (dialect.status === "unstamped" || DRAFT_2020_12_SCHEMA_URIS.has(dialect.uri)) {
|
|
30
|
+
draft2020Validator ??= (() => {
|
|
31
|
+
const Ajv2020 = Ajv2020Import;
|
|
32
|
+
const ajv = new Ajv2020({ strict: false, allErrors: true });
|
|
33
|
+
addFormats(ajv);
|
|
34
|
+
return new AjvJsonSchemaValidator(ajv);
|
|
35
|
+
})();
|
|
36
|
+
return draft2020Validator.getValidator(schema);
|
|
37
|
+
}
|
|
38
|
+
if (!DRAFT_07_SCHEMA_URIS.has(dialect.uri)) {
|
|
39
|
+
throw new Error(`Unsupported JSON Schema dialect: ${dialect.uri}`);
|
|
40
|
+
}
|
|
41
|
+
draft07Validator ??= (() => {
|
|
42
|
+
const ajv = new Ajv({
|
|
43
|
+
strict: false,
|
|
44
|
+
validateFormats: true,
|
|
45
|
+
validateSchema: false,
|
|
46
|
+
allErrors: true,
|
|
47
|
+
});
|
|
48
|
+
addFormats(ajv);
|
|
49
|
+
return new AjvJsonSchemaValidator(ajv);
|
|
50
|
+
})();
|
|
51
|
+
return draft07Validator.getValidator(schema);
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=json-schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema-validator.js","sourceRoot":"","sources":["../json-schema-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAC7C,OAAO,gBAAgB,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAOrF,gFAAgF;AAChF,MAAM,UAAU,GAAG,gBAAsD,CAAC;AAM1E,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IACxD,wCAAwC;IACxC,yCAAyC;CAC1C,CAAC,CAAC;AACH,MAAM,yBAAyB,GAAwB,IAAI,GAAG,CAAC;IAC7D,8CAA8C;CAC/C,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,MAAsB;IAC3C,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IACD,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;KACjF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,IAAI,gBAAoD,CAAC;IACzD,IAAI,kBAAsD,CAAC;IAE3D,OAAO;QACL,YAAY,CAAI,MAAsB;YACpC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjF,kBAAkB,KAAK,CAAC,GAAG,EAAE;oBAC3B,MAAM,OAAO,GAAG,aAAsC,CAAC;oBACvD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC5D,UAAU,CAAC,GAAG,CAAC,CAAC;oBAChB,OAAO,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAC;gBACzC,CAAC,CAAC,EAAE,CAAC;gBACL,OAAO,kBAAkB,CAAC,YAAY,CAAI,MAAM,CAAC,CAAC;YACpD,CAAC;YACD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,gBAAgB,KAAK,CAAC,GAAG,EAAE;gBACzB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;oBAClB,MAAM,EAAE,KAAK;oBACb,eAAe,EAAE,IAAI;oBACrB,cAAc,EAAE,KAAK;oBACrB,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;gBACH,UAAU,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC,CAAC,EAAE,CAAC;YACL,OAAO,gBAAgB,CAAC,YAAY,CAAI,MAAM,CAAC,CAAC;QAClD,CAAC;KACF,CAAC;AACJ,CAAC"}
|