@sanity/cli 8.26.0 → 8.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/context/mcpEndpoint.js +165 -0
- package/dist/actions/context/mcpEndpoint.js.map +1 -0
- package/dist/actions/context/resolveOrganizationId.js +8 -1
- package/dist/actions/context/resolveOrganizationId.js.map +1 -1
- package/dist/commands/context/create.js +8 -22
- package/dist/commands/context/create.js.map +1 -1
- package/dist/commands/context/delete.js +2 -2
- package/dist/commands/context/delete.js.map +1 -1
- package/dist/commands/context/issues/list.js +0 -5
- package/dist/commands/context/issues/list.js.map +1 -1
- package/dist/commands/context/list.js +6 -14
- package/dist/commands/context/list.js.map +1 -1
- package/dist/commands/context/mcp/create.js +152 -0
- package/dist/commands/context/mcp/create.js.map +1 -0
- package/dist/commands/context/mcp/delete.js +82 -0
- package/dist/commands/context/mcp/delete.js.map +1 -0
- package/dist/commands/context/mcp/get.js +42 -0
- package/dist/commands/context/mcp/get.js.map +1 -0
- package/dist/commands/context/mcp/list.js +87 -0
- package/dist/commands/context/mcp/list.js.map +1 -0
- package/dist/commands/context/mcp/status.js +98 -0
- package/dist/commands/context/mcp/status.js.map +1 -0
- package/dist/commands/context/mcp/update.js +225 -0
- package/dist/commands/context/mcp/update.js.map +1 -0
- package/dist/commands/context/query.js +6 -14
- package/dist/commands/context/query.js.map +1 -1
- package/dist/commands/context/update.js +2 -2
- package/dist/commands/context/update.js.map +1 -1
- package/dist/exports/invokeSanityCli/commandPolicies/mcpPolicy.js +6 -0
- package/dist/exports/invokeSanityCli/commandPolicies/mcpPolicy.js.map +1 -1
- package/dist/prompts/promptForText.js +12 -0
- package/dist/prompts/promptForText.js.map +1 -0
- package/dist/services/context.js +107 -6
- package/dist/services/context.js.map +1 -1
- package/dist/util/sharedFlags.js.map +1 -1
- package/dist/util/telemetry/cliCommandIdentity.js +6 -0
- package/dist/util/telemetry/cliCommandIdentity.js.map +1 -1
- package/oclif.config.js +1 -1
- package/oclif.manifest.json +2527 -1977
- package/package.json +2 -2
package/dist/services/context.js
CHANGED
|
@@ -3,6 +3,8 @@ import { EXPERIMENTAL_API_WARNING, isHttpError } from '@sanity/client';
|
|
|
3
3
|
const CONTEXT_API_VERSION = 'v2026-08-25';
|
|
4
4
|
const BLUEPRINTS_API_VERSION = 'vX';
|
|
5
5
|
const BLUEPRINTS_LOOKUP_TIMEOUT_MS = 5000;
|
|
6
|
+
// The version in the URLs the Context API returns for agents to connect to MCP endpoints
|
|
7
|
+
const MCP_CONNECT_API_VERSION = 'v2026-11-10';
|
|
6
8
|
const blueprintOwnershipDebug = subdebug('context:blueprint-ownership');
|
|
7
9
|
/**
|
|
8
10
|
* Knowledge-base-scoped methods on `client.context` operate on the client's
|
|
@@ -69,12 +71,40 @@ const blueprintOwnershipDebug = subdebug('context:blueprint-ownership');
|
|
|
69
71
|
return client.context.knowledgeBases.edit(knowledgeBaseId, params);
|
|
70
72
|
}
|
|
71
73
|
/**
|
|
72
|
-
*
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
* Who manages a resource, for refusal messages: the stack by name when the caller can read it
|
|
75
|
+
*/ export function describeBlueprintManager(stackName) {
|
|
76
|
+
return stackName ? `The blueprint stack "${stackName}"` : 'A blueprint';
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Whether a live blueprint stack manages the knowledge base
|
|
80
|
+
*/ export function getKnowledgeBaseBlueprintOwnership(knowledgeBaseId) {
|
|
81
|
+
return getBlueprintOwnership('sanity.context.knowledge-base', async ()=>{
|
|
77
82
|
const { organizationId, publicId } = await getKnowledgeBase(knowledgeBaseId);
|
|
83
|
+
return {
|
|
84
|
+
organizationId,
|
|
85
|
+
publicId
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Whether a live blueprint stack manages the MCP endpoint
|
|
91
|
+
*/ export function getMcpEndpointBlueprintOwnership(organizationId, { id }) {
|
|
92
|
+
return getBlueprintOwnership('sanity.context.mcp', async ()=>({
|
|
93
|
+
organizationId,
|
|
94
|
+
publicId: id
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Looks the resource up in the Blueprints resource search. Fails open: a
|
|
99
|
+
* failed lookup answers not managed, so a Blueprints outage never blocks a
|
|
100
|
+
* command. A resource that doesn't exist isn't managed either.
|
|
101
|
+
*/ async function getBlueprintOwnership(type, resolveResource) {
|
|
102
|
+
try {
|
|
103
|
+
const resource = await resolveResource();
|
|
104
|
+
if (!resource) return {
|
|
105
|
+
managed: false
|
|
106
|
+
};
|
|
107
|
+
const { organizationId, publicId } = resource;
|
|
78
108
|
const client = await getGlobalCliClient({
|
|
79
109
|
apiVersion: BLUEPRINTS_API_VERSION,
|
|
80
110
|
// The Blueprints API has no stable version yet, and the warning would interrupt command output.
|
|
@@ -96,7 +126,7 @@ const blueprintOwnershipDebug = subdebug('context:blueprint-ownership');
|
|
|
96
126
|
headers,
|
|
97
127
|
query: {
|
|
98
128
|
id: publicId,
|
|
99
|
-
type
|
|
129
|
+
type
|
|
100
130
|
},
|
|
101
131
|
url: '/blueprints/resources/search'
|
|
102
132
|
});
|
|
@@ -293,5 +323,76 @@ function errorCode(error) {
|
|
|
293
323
|
const client = await getContextClient(undefined, organizationId);
|
|
294
324
|
return client.context.fetch(query, params);
|
|
295
325
|
}
|
|
326
|
+
/**
|
|
327
|
+
* List an organization's MCP endpoints, oldest first
|
|
328
|
+
*/ export async function listMcpEndpoints(organizationId) {
|
|
329
|
+
const client = await getContextClient(undefined, organizationId);
|
|
330
|
+
const docs = await client.context.mcpEndpoints.list();
|
|
331
|
+
const connectClient = client.withConfig({
|
|
332
|
+
apiVersion: MCP_CONNECT_API_VERSION
|
|
333
|
+
});
|
|
334
|
+
return docs.map((doc)=>toMcpEndpoint(connectClient, doc));
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Get an MCP endpoint by name or ID, or `null` when the organization has none.
|
|
338
|
+
* Update and delete accept either, so the lookups guarding them must too.
|
|
339
|
+
*/ export async function getMcpEndpoint(organizationId, nameOrId) {
|
|
340
|
+
const client = await getContextClient(undefined, organizationId);
|
|
341
|
+
const doc = await client.context.fetch('*[_type == "sanity.context.mcp" && organizationId == $org && (name == $nameOrId || publicId == $nameOrId)][0]', {
|
|
342
|
+
nameOrId,
|
|
343
|
+
org: organizationId
|
|
344
|
+
});
|
|
345
|
+
return doc && toMcpEndpoint(client.withConfig({
|
|
346
|
+
apiVersion: MCP_CONNECT_API_VERSION
|
|
347
|
+
}), doc);
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* The stored configuration in the shape create and edit return, so every command outputs the
|
|
351
|
+
* same fields. The URL isn't stored, so it is built from the same route and API version.
|
|
352
|
+
*/ function toMcpEndpoint(connectClient, doc) {
|
|
353
|
+
return {
|
|
354
|
+
createdAt: doc._createdAt,
|
|
355
|
+
groqFilter: doc.groqFilter ?? null,
|
|
356
|
+
id: doc.publicId,
|
|
357
|
+
instructions: doc.instructions ?? null,
|
|
358
|
+
name: doc.name,
|
|
359
|
+
organizationId: doc.organizationId,
|
|
360
|
+
sources: doc.sources,
|
|
361
|
+
title: doc.title,
|
|
362
|
+
updatedAt: doc._updatedAt,
|
|
363
|
+
url: connectClient.getUrl(`/context/organizations/${encodeURIComponent(doc.organizationId)}/mcp/${encodeURIComponent(doc.name)}`)
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Create an MCP endpoint
|
|
368
|
+
*/ export async function createMcpEndpoint(organizationId, params) {
|
|
369
|
+
const client = await getContextClient(undefined, organizationId);
|
|
370
|
+
return client.context.mcpEndpoints.create(params);
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Update an MCP endpoint's configuration
|
|
374
|
+
*/ export async function updateMcpEndpoint(organizationId, name, params) {
|
|
375
|
+
const client = await getContextClient(undefined, organizationId);
|
|
376
|
+
return client.context.mcpEndpoints.edit({
|
|
377
|
+
...params,
|
|
378
|
+
name
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Delete an MCP endpoint
|
|
383
|
+
*/ export async function deleteMcpEndpoint(organizationId, name) {
|
|
384
|
+
const client = await getContextClient(undefined, organizationId);
|
|
385
|
+
await client.context.mcpEndpoints.delete({
|
|
386
|
+
name
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Check whether an agent connecting with the current credentials can use an MCP endpoint
|
|
391
|
+
*/ export async function getMcpEndpointStatus(organizationId, name) {
|
|
392
|
+
const client = await getContextClient(undefined, organizationId);
|
|
393
|
+
return client.context.mcpEndpoints.status({
|
|
394
|
+
name
|
|
395
|
+
});
|
|
396
|
+
}
|
|
296
397
|
|
|
297
398
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/context.ts"],"sourcesContent":["import {getGlobalCliClient, subdebug} from '@sanity/cli-core'\nimport {type Context, EXPERIMENTAL_API_WARNING, isHttpError} from '@sanity/client'\n\nconst CONTEXT_API_VERSION = 'v2026-08-25'\nconst BLUEPRINTS_API_VERSION = 'vX'\nconst BLUEPRINTS_LOOKUP_TIMEOUT_MS = 5000\n\nconst blueprintOwnershipDebug = subdebug('context:blueprint-ownership')\n\n/**\n * Knowledge-base-scoped methods on `client.context` operate on the client's\n * configured `resource`; collection-level methods\n * (`client.context.knowledgeBases.*`) are addressed per call and need none.\n * GROQ-backed reads also need `context.organizationId`.\n */\nasync function getContextClient(knowledgeBaseId?: string, organizationId?: string) {\n return getGlobalCliClient({\n apiVersion: CONTEXT_API_VERSION,\n requireUser: true,\n ...(knowledgeBaseId === undefined\n ? {}\n : {resource: {id: knowledgeBaseId, type: 'knowledge-base' as const}}),\n ...(organizationId === undefined ? {} : {context: {organizationId}}),\n })\n}\n\n/**\n * GROQ-backed reads (issues, entries) query the organization's\n * document store, where documents are keyed by the knowledge base's public ID.\n * Fetching the knowledge base resolves both, whichever of its IDs was passed.\n */\nasync function getContextStoreClient(knowledgeBaseId: string) {\n const {organizationId, publicId} = await getKnowledgeBase(knowledgeBaseId)\n return getContextClient(publicId, organizationId)\n}\n\n/**\n * Create a knowledge base in an organization\n */\nexport async function createKnowledgeBase(\n params: Context.CreateKnowledgeBaseParams,\n): Promise<Context.KnowledgeBase> {\n const client = await getContextClient()\n return client.context.knowledgeBases.create(params)\n}\n\n/**\n * List all knowledge bases in an organization (drains pagination)\n */\nexport async function listKnowledgeBases(organizationId: string): Promise<Context.KnowledgeBase[]> {\n const client = await getContextClient()\n\n const knowledgeBases: Context.KnowledgeBase[] = []\n let cursor: string | undefined\n do {\n const page = await client.context.knowledgeBases.list({\n cursor,\n organizationId,\n })\n knowledgeBases.push(...page.data)\n cursor = page.nextCursor ?? undefined\n } while (cursor !== undefined)\n\n return knowledgeBases\n}\n\n/**\n * Get a single knowledge base by ID\n */\nexport async function getKnowledgeBase(knowledgeBaseId: string): Promise<Context.KnowledgeBase> {\n const client = await getContextClient()\n return client.context.knowledgeBases.get(knowledgeBaseId)\n}\n\n/**\n * Update a knowledge base's configuration\n */\nexport async function updateKnowledgeBase(\n knowledgeBaseId: string,\n params: Context.EditKnowledgeBaseParams,\n): Promise<Context.KnowledgeBase> {\n const client = await getContextClient()\n return client.context.knowledgeBases.edit(knowledgeBaseId, params)\n}\n\n/**\n * `stackName` is `null` when the caller can't read Blueprints: the search then\n * only says whether a blueprint manages the resource.\n */\nexport type BlueprintOwnership = {managed: false} | {managed: true; stackName: string | null}\n\n/**\n * Whether a live blueprint stack manages the knowledge base, from the\n * Blueprints resource search. Fails open: a failed lookup answers not managed,\n * so a Blueprints outage never blocks a command.\n */\nexport async function getKnowledgeBaseBlueprintOwnership(\n knowledgeBaseId: string,\n): Promise<BlueprintOwnership> {\n try {\n const {organizationId, publicId} = await getKnowledgeBase(knowledgeBaseId)\n const client = await getGlobalCliClient({\n apiVersion: BLUEPRINTS_API_VERSION,\n // The Blueprints API has no stable version yet, and the warning would interrupt command output.\n // The client splits the warning header on commas, so its second clause is matched separately.\n ignoreWarnings: [EXPERIMENTAL_API_WARNING, 'which will change without warning'],\n // The lookup fails open, so an unreachable Blueprints API must not hold the command for the client's defaults.\n maxRetries: 0,\n requireUser: true,\n timeout: BLUEPRINTS_LOOKUP_TIMEOUT_MS,\n })\n const headers = {\n 'x-sanity-scope-id': organizationId,\n 'x-sanity-scope-type': 'organization',\n }\n const matches = await client.request<{stackId?: string}[]>({\n headers,\n query: {id: publicId, type: 'sanity.context.knowledge-base'},\n url: '/blueprints/resources/search',\n })\n const stackId = matches.find((match) => typeof match.stackId === 'string')?.stackId\n if (!stackId) return {managed: false}\n const stackName = await client\n .request<{name?: string}>({\n headers,\n url: `/blueprints/stacks/${encodeURIComponent(stackId)}`,\n })\n .then((stack) => stack.name ?? null)\n .catch(() => null)\n return {managed: true, stackName}\n } catch (error) {\n if (isHttpError(error)) {\n if (error.statusCode === 403 && errorCode(error) === 'RESOURCE_MANAGED') {\n return {managed: true, stackName: null}\n }\n if (error.statusCode === 404 && errorCode(error) === 'RESOURCE_NOT_MANAGED') {\n return {managed: false}\n }\n }\n blueprintOwnershipDebug('Blueprint ownership lookup failed, treating as not managed', error)\n return {managed: false}\n }\n}\n\nfunction errorCode(error: {response: {body: unknown}}): unknown {\n const {body} = error.response\n return body && typeof body === 'object' && 'errorCode' in body ? body.errorCode : undefined\n}\n\n/**\n * Delete a knowledge base and its generated content\n */\nexport async function deleteKnowledgeBase(knowledgeBaseId: string): Promise<void> {\n const client = await getContextClient()\n await client.context.knowledgeBases.delete(knowledgeBaseId)\n}\n\n/**\n * Import content into a knowledge base. File imports are staged and uploaded\n * to signed storage by the client.\n */\nexport async function createImport(\n knowledgeBaseId: string,\n params: Context.CreateFileImportParams | Context.CreateImportParams,\n): Promise<Context.JobAccepted> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.imports.create(params)\n}\n\n/**\n * List all imports for a knowledge base (drains pagination)\n */\nexport async function listImports(knowledgeBaseId: string): Promise<Context.Import[]> {\n const client = await getContextClient(knowledgeBaseId)\n\n const imports: Context.Import[] = []\n let cursor: string | undefined\n do {\n const page = await client.context.imports.list({cursor})\n imports.push(...page.data)\n cursor = page.nextCursor ?? undefined\n } while (cursor !== undefined)\n\n return imports\n}\n\n/**\n * Get a single import by ID\n */\nexport async function getImport(\n knowledgeBaseId: string,\n importId: string,\n): Promise<Context.ImportDetail> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.imports.get({importId})\n}\n\n/**\n * Get a short-lived signed URL for an import's original uploaded bytes\n */\nexport async function downloadImport(\n knowledgeBaseId: string,\n importId: string,\n): Promise<Context.ImportDownloadResponse> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.imports.download({importId})\n}\n\n/**\n * Delete an import from a knowledge base\n */\nexport async function deleteImport(knowledgeBaseId: string, importId: string): Promise<void> {\n const client = await getContextClient(knowledgeBaseId)\n await client.context.imports.delete({importId})\n}\n\n/**\n * Start a build of a knowledge base\n */\nexport async function buildKnowledgeBase(knowledgeBaseId: string): Promise<Context.JobAccepted> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.build()\n}\n\n/**\n * Cancel the running build of a knowledge base, if any\n */\nexport async function cancelKnowledgeBaseBuild(\n knowledgeBaseId: string,\n): Promise<{cancelled: boolean}> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.cancelBuild()\n}\n\n/**\n * Run an incremental refresh: re-check sources and apply what changed\n */\nexport async function refreshKnowledgeBase(\n knowledgeBaseId: string,\n): Promise<{jobId: string; started: boolean}> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.refresh()\n}\n\n/**\n * Get an async job (build, import) by ID\n */\nexport async function getJob(knowledgeBaseId: string, jobId: string): Promise<Context.Job> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.jobs.get({jobId})\n}\n\n/**\n * List all issues for a knowledge base, optionally narrowed to one status\n */\nexport async function listIssues(\n knowledgeBaseId: string,\n status?: Context.IssueDoc['status'],\n): Promise<Context.IssueDoc[]> {\n const client = await getContextStoreClient(knowledgeBaseId)\n return client.context.issues.list({status})\n}\n\n/**\n * Get a single issue by ID, or `null` when it does not exist\n */\nexport async function getIssue(\n knowledgeBaseId: string,\n issueId: string,\n): Promise<Context.IssueDoc | null> {\n const client = await getContextStoreClient(knowledgeBaseId)\n return client.context.issues.get({issueId})\n}\n\n/**\n * Resolve a conflict issue by choosing one of its sides (by index). Choosing\n * a side other than the entry's current content starts a rewrite job.\n */\nexport async function resolveIssue(\n knowledgeBaseId: string,\n issueId: string,\n resolution: number,\n): Promise<Context.ResolveIssueResponse> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.issues.resolve({issueId, resolution})\n}\n\n/**\n * Dismiss an issue\n */\nexport async function dismissIssue(\n knowledgeBaseId: string,\n issueId: string,\n): Promise<Context.DismissIssueResponse> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.issues.dismiss({issueId})\n}\n\n/**\n * Reopen a resolved conflict issue\n */\nexport async function reopenIssue(\n knowledgeBaseId: string,\n issueId: string,\n): Promise<Context.ReopenIssueResponse> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.issues.reopen({issueId})\n}\n\n/**\n * Apply accepted issues to a knowledge base in one batch\n */\nexport async function applyIssues(\n knowledgeBaseId: string,\n issueIds: string[],\n): Promise<Context.ApplyIssuesResponse> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.issues.apply({issueIds})\n}\n\n/**\n * List all entries for a knowledge base, path-ordered, without bodies\n */\nexport async function listEntries(knowledgeBaseId: string): Promise<Context.Entry[]> {\n const client = await getContextStoreClient(knowledgeBaseId)\n return client.context.entries.list()\n}\n\n/**\n * Get a single entry with its body and citations by outline path, or `null`\n * when no entry sits at that path\n */\nexport async function getEntry(\n knowledgeBaseId: string,\n path: string,\n): Promise<Context.EntryDoc | null> {\n const client = await getContextStoreClient(knowledgeBaseId)\n return client.context.entries.get({path})\n}\n\n/**\n * Rebuild one entry from its sources by outline path\n */\nexport async function rebuildEntry(\n knowledgeBaseId: string,\n path: string,\n): Promise<Context.RebuildEntryResponse> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.entries.rebuild({path})\n}\n\n/**\n * Run a GROQ query against an organization's Context documents\n */\nexport async function queryContext(\n organizationId: string,\n query: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n const client = await getContextClient(undefined, organizationId)\n return client.context.fetch(query, params)\n}\n"],"names":["getGlobalCliClient","subdebug","EXPERIMENTAL_API_WARNING","isHttpError","CONTEXT_API_VERSION","BLUEPRINTS_API_VERSION","BLUEPRINTS_LOOKUP_TIMEOUT_MS","blueprintOwnershipDebug","getContextClient","knowledgeBaseId","organizationId","apiVersion","requireUser","undefined","resource","id","type","context","getContextStoreClient","publicId","getKnowledgeBase","createKnowledgeBase","params","client","knowledgeBases","create","listKnowledgeBases","cursor","page","list","push","data","nextCursor","get","updateKnowledgeBase","edit","getKnowledgeBaseBlueprintOwnership","ignoreWarnings","maxRetries","timeout","headers","matches","request","query","url","stackId","find","match","managed","stackName","encodeURIComponent","then","stack","name","catch","error","statusCode","errorCode","body","response","deleteKnowledgeBase","delete","createImport","imports","listImports","getImport","importId","downloadImport","download","deleteImport","buildKnowledgeBase","build","cancelKnowledgeBaseBuild","cancelBuild","refreshKnowledgeBase","refresh","getJob","jobId","jobs","listIssues","status","issues","getIssue","issueId","resolveIssue","resolution","resolve","dismissIssue","dismiss","reopenIssue","reopen","applyIssues","issueIds","apply","listEntries","entries","getEntry","path","rebuildEntry","rebuild","queryContext","fetch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/services/context.ts"],"sourcesContent":["import {getGlobalCliClient, subdebug} from '@sanity/cli-core'\nimport {type Context, EXPERIMENTAL_API_WARNING, isHttpError} from '@sanity/client'\n\nconst CONTEXT_API_VERSION = 'v2026-08-25'\nconst BLUEPRINTS_API_VERSION = 'vX'\nconst BLUEPRINTS_LOOKUP_TIMEOUT_MS = 5000\n// The version in the URLs the Context API returns for agents to connect to MCP endpoints\nconst MCP_CONNECT_API_VERSION = 'v2026-11-10'\n\nconst blueprintOwnershipDebug = subdebug('context:blueprint-ownership')\n\n/**\n * Knowledge-base-scoped methods on `client.context` operate on the client's\n * configured `resource`; collection-level methods\n * (`client.context.knowledgeBases.*`) are addressed per call and need none.\n * GROQ-backed reads also need `context.organizationId`.\n */\nasync function getContextClient(knowledgeBaseId?: string, organizationId?: string) {\n return getGlobalCliClient({\n apiVersion: CONTEXT_API_VERSION,\n requireUser: true,\n ...(knowledgeBaseId === undefined\n ? {}\n : {resource: {id: knowledgeBaseId, type: 'knowledge-base' as const}}),\n ...(organizationId === undefined ? {} : {context: {organizationId}}),\n })\n}\n\n/**\n * GROQ-backed reads (issues, entries) query the organization's\n * document store, where documents are keyed by the knowledge base's public ID.\n * Fetching the knowledge base resolves both, whichever of its IDs was passed.\n */\nasync function getContextStoreClient(knowledgeBaseId: string) {\n const {organizationId, publicId} = await getKnowledgeBase(knowledgeBaseId)\n return getContextClient(publicId, organizationId)\n}\n\n/**\n * Create a knowledge base in an organization\n */\nexport async function createKnowledgeBase(\n params: Context.CreateKnowledgeBaseParams,\n): Promise<Context.KnowledgeBase> {\n const client = await getContextClient()\n return client.context.knowledgeBases.create(params)\n}\n\n/**\n * List all knowledge bases in an organization (drains pagination)\n */\nexport async function listKnowledgeBases(organizationId: string): Promise<Context.KnowledgeBase[]> {\n const client = await getContextClient()\n\n const knowledgeBases: Context.KnowledgeBase[] = []\n let cursor: string | undefined\n do {\n const page = await client.context.knowledgeBases.list({\n cursor,\n organizationId,\n })\n knowledgeBases.push(...page.data)\n cursor = page.nextCursor ?? undefined\n } while (cursor !== undefined)\n\n return knowledgeBases\n}\n\n/**\n * Get a single knowledge base by ID\n */\nexport async function getKnowledgeBase(knowledgeBaseId: string): Promise<Context.KnowledgeBase> {\n const client = await getContextClient()\n return client.context.knowledgeBases.get(knowledgeBaseId)\n}\n\n/**\n * Update a knowledge base's configuration\n */\nexport async function updateKnowledgeBase(\n knowledgeBaseId: string,\n params: Context.EditKnowledgeBaseParams,\n): Promise<Context.KnowledgeBase> {\n const client = await getContextClient()\n return client.context.knowledgeBases.edit(knowledgeBaseId, params)\n}\n\n/**\n * `stackName` is `null` when the caller can't read Blueprints: the search then\n * only says whether a blueprint manages the resource.\n */\nexport type BlueprintOwnership = {managed: false} | {managed: true; stackName: string | null}\n\n/**\n * Who manages a resource, for refusal messages: the stack by name when the caller can read it\n */\nexport function describeBlueprintManager(stackName: string | null): string {\n return stackName ? `The blueprint stack \"${stackName}\"` : 'A blueprint'\n}\n\n/**\n * Whether a live blueprint stack manages the knowledge base\n */\nexport function getKnowledgeBaseBlueprintOwnership(\n knowledgeBaseId: string,\n): Promise<BlueprintOwnership> {\n return getBlueprintOwnership('sanity.context.knowledge-base', async () => {\n const {organizationId, publicId} = await getKnowledgeBase(knowledgeBaseId)\n return {organizationId, publicId}\n })\n}\n\n/**\n * Whether a live blueprint stack manages the MCP endpoint\n */\nexport function getMcpEndpointBlueprintOwnership(\n organizationId: string,\n {id}: Pick<Context.McpEndpoint, 'id'>,\n): Promise<BlueprintOwnership> {\n return getBlueprintOwnership('sanity.context.mcp', async () => ({organizationId, publicId: id}))\n}\n\n/**\n * Looks the resource up in the Blueprints resource search. Fails open: a\n * failed lookup answers not managed, so a Blueprints outage never blocks a\n * command. A resource that doesn't exist isn't managed either.\n */\nasync function getBlueprintOwnership(\n type: string,\n resolveResource: () => Promise<{organizationId: string; publicId: string} | null>,\n): Promise<BlueprintOwnership> {\n try {\n const resource = await resolveResource()\n if (!resource) return {managed: false}\n const {organizationId, publicId} = resource\n const client = await getGlobalCliClient({\n apiVersion: BLUEPRINTS_API_VERSION,\n // The Blueprints API has no stable version yet, and the warning would interrupt command output.\n // The client splits the warning header on commas, so its second clause is matched separately.\n ignoreWarnings: [EXPERIMENTAL_API_WARNING, 'which will change without warning'],\n // The lookup fails open, so an unreachable Blueprints API must not hold the command for the client's defaults.\n maxRetries: 0,\n requireUser: true,\n timeout: BLUEPRINTS_LOOKUP_TIMEOUT_MS,\n })\n const headers = {\n 'x-sanity-scope-id': organizationId,\n 'x-sanity-scope-type': 'organization',\n }\n const matches = await client.request<{stackId?: string}[]>({\n headers,\n query: {id: publicId, type},\n url: '/blueprints/resources/search',\n })\n const stackId = matches.find((match) => typeof match.stackId === 'string')?.stackId\n if (!stackId) return {managed: false}\n const stackName = await client\n .request<{name?: string}>({\n headers,\n url: `/blueprints/stacks/${encodeURIComponent(stackId)}`,\n })\n .then((stack) => stack.name ?? null)\n .catch(() => null)\n return {managed: true, stackName}\n } catch (error) {\n if (isHttpError(error)) {\n if (error.statusCode === 403 && errorCode(error) === 'RESOURCE_MANAGED') {\n return {managed: true, stackName: null}\n }\n if (error.statusCode === 404 && errorCode(error) === 'RESOURCE_NOT_MANAGED') {\n return {managed: false}\n }\n }\n blueprintOwnershipDebug('Blueprint ownership lookup failed, treating as not managed', error)\n return {managed: false}\n }\n}\n\nfunction errorCode(error: {response: {body: unknown}}): unknown {\n const {body} = error.response\n return body && typeof body === 'object' && 'errorCode' in body ? body.errorCode : undefined\n}\n\n/**\n * Delete a knowledge base and its generated content\n */\nexport async function deleteKnowledgeBase(knowledgeBaseId: string): Promise<void> {\n const client = await getContextClient()\n await client.context.knowledgeBases.delete(knowledgeBaseId)\n}\n\n/**\n * Import content into a knowledge base. File imports are staged and uploaded\n * to signed storage by the client.\n */\nexport async function createImport(\n knowledgeBaseId: string,\n params: Context.CreateFileImportParams | Context.CreateImportParams,\n): Promise<Context.JobAccepted> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.imports.create(params)\n}\n\n/**\n * List all imports for a knowledge base (drains pagination)\n */\nexport async function listImports(knowledgeBaseId: string): Promise<Context.Import[]> {\n const client = await getContextClient(knowledgeBaseId)\n\n const imports: Context.Import[] = []\n let cursor: string | undefined\n do {\n const page = await client.context.imports.list({cursor})\n imports.push(...page.data)\n cursor = page.nextCursor ?? undefined\n } while (cursor !== undefined)\n\n return imports\n}\n\n/**\n * Get a single import by ID\n */\nexport async function getImport(\n knowledgeBaseId: string,\n importId: string,\n): Promise<Context.ImportDetail> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.imports.get({importId})\n}\n\n/**\n * Get a short-lived signed URL for an import's original uploaded bytes\n */\nexport async function downloadImport(\n knowledgeBaseId: string,\n importId: string,\n): Promise<Context.ImportDownloadResponse> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.imports.download({importId})\n}\n\n/**\n * Delete an import from a knowledge base\n */\nexport async function deleteImport(knowledgeBaseId: string, importId: string): Promise<void> {\n const client = await getContextClient(knowledgeBaseId)\n await client.context.imports.delete({importId})\n}\n\n/**\n * Start a build of a knowledge base\n */\nexport async function buildKnowledgeBase(knowledgeBaseId: string): Promise<Context.JobAccepted> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.build()\n}\n\n/**\n * Cancel the running build of a knowledge base, if any\n */\nexport async function cancelKnowledgeBaseBuild(\n knowledgeBaseId: string,\n): Promise<{cancelled: boolean}> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.cancelBuild()\n}\n\n/**\n * Run an incremental refresh: re-check sources and apply what changed\n */\nexport async function refreshKnowledgeBase(\n knowledgeBaseId: string,\n): Promise<{jobId: string; started: boolean}> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.refresh()\n}\n\n/**\n * Get an async job (build, import) by ID\n */\nexport async function getJob(knowledgeBaseId: string, jobId: string): Promise<Context.Job> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.jobs.get({jobId})\n}\n\n/**\n * List all issues for a knowledge base, optionally narrowed to one status\n */\nexport async function listIssues(\n knowledgeBaseId: string,\n status?: Context.IssueDoc['status'],\n): Promise<Context.IssueDoc[]> {\n const client = await getContextStoreClient(knowledgeBaseId)\n return client.context.issues.list({status})\n}\n\n/**\n * Get a single issue by ID, or `null` when it does not exist\n */\nexport async function getIssue(\n knowledgeBaseId: string,\n issueId: string,\n): Promise<Context.IssueDoc | null> {\n const client = await getContextStoreClient(knowledgeBaseId)\n return client.context.issues.get({issueId})\n}\n\n/**\n * Resolve a conflict issue by choosing one of its sides (by index). Choosing\n * a side other than the entry's current content starts a rewrite job.\n */\nexport async function resolveIssue(\n knowledgeBaseId: string,\n issueId: string,\n resolution: number,\n): Promise<Context.ResolveIssueResponse> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.issues.resolve({issueId, resolution})\n}\n\n/**\n * Dismiss an issue\n */\nexport async function dismissIssue(\n knowledgeBaseId: string,\n issueId: string,\n): Promise<Context.DismissIssueResponse> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.issues.dismiss({issueId})\n}\n\n/**\n * Reopen a resolved conflict issue\n */\nexport async function reopenIssue(\n knowledgeBaseId: string,\n issueId: string,\n): Promise<Context.ReopenIssueResponse> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.issues.reopen({issueId})\n}\n\n/**\n * Apply accepted issues to a knowledge base in one batch\n */\nexport async function applyIssues(\n knowledgeBaseId: string,\n issueIds: string[],\n): Promise<Context.ApplyIssuesResponse> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.issues.apply({issueIds})\n}\n\n/**\n * List all entries for a knowledge base, path-ordered, without bodies\n */\nexport async function listEntries(knowledgeBaseId: string): Promise<Context.Entry[]> {\n const client = await getContextStoreClient(knowledgeBaseId)\n return client.context.entries.list()\n}\n\n/**\n * Get a single entry with its body and citations by outline path, or `null`\n * when no entry sits at that path\n */\nexport async function getEntry(\n knowledgeBaseId: string,\n path: string,\n): Promise<Context.EntryDoc | null> {\n const client = await getContextStoreClient(knowledgeBaseId)\n return client.context.entries.get({path})\n}\n\n/**\n * Rebuild one entry from its sources by outline path\n */\nexport async function rebuildEntry(\n knowledgeBaseId: string,\n path: string,\n): Promise<Context.RebuildEntryResponse> {\n const client = await getContextClient(knowledgeBaseId)\n return client.context.entries.rebuild({path})\n}\n\n/**\n * Run a GROQ query against an organization's Context documents\n */\nexport async function queryContext(\n organizationId: string,\n query: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n const client = await getContextClient(undefined, organizationId)\n return client.context.fetch(query, params)\n}\n\n/**\n * List an organization's MCP endpoints, oldest first\n */\nexport async function listMcpEndpoints(organizationId: string): Promise<Context.McpEndpoint[]> {\n const client = await getContextClient(undefined, organizationId)\n const docs = await client.context.mcpEndpoints.list()\n const connectClient = client.withConfig({apiVersion: MCP_CONNECT_API_VERSION})\n return docs.map((doc) => toMcpEndpoint(connectClient, doc))\n}\n\n/**\n * Get an MCP endpoint by name or ID, or `null` when the organization has none.\n * Update and delete accept either, so the lookups guarding them must too.\n */\nexport async function getMcpEndpoint(\n organizationId: string,\n nameOrId: string,\n): Promise<Context.McpEndpoint | null> {\n const client = await getContextClient(undefined, organizationId)\n const doc = await client.context.fetch<Context.McpDoc | null>(\n '*[_type == \"sanity.context.mcp\" && organizationId == $org && (name == $nameOrId || publicId == $nameOrId)][0]',\n {nameOrId, org: organizationId},\n )\n return doc && toMcpEndpoint(client.withConfig({apiVersion: MCP_CONNECT_API_VERSION}), doc)\n}\n\n/**\n * The stored configuration in the shape create and edit return, so every command outputs the\n * same fields. The URL isn't stored, so it is built from the same route and API version.\n */\nfunction toMcpEndpoint(\n connectClient: {getUrl: (uri: string) => string},\n doc: Context.McpDoc,\n): Context.McpEndpoint {\n return {\n createdAt: doc._createdAt,\n groqFilter: doc.groqFilter ?? null,\n id: doc.publicId,\n instructions: doc.instructions ?? null,\n name: doc.name,\n organizationId: doc.organizationId,\n sources: doc.sources,\n title: doc.title,\n updatedAt: doc._updatedAt,\n url: connectClient.getUrl(\n `/context/organizations/${encodeURIComponent(doc.organizationId)}/mcp/${encodeURIComponent(doc.name)}`,\n ),\n }\n}\n\n/**\n * Create an MCP endpoint\n */\nexport async function createMcpEndpoint(\n organizationId: string,\n params: Context.CreateMcpEndpointParams,\n): Promise<Context.McpEndpoint> {\n const client = await getContextClient(undefined, organizationId)\n return client.context.mcpEndpoints.create(params)\n}\n\n/**\n * Update an MCP endpoint's configuration\n */\nexport async function updateMcpEndpoint(\n organizationId: string,\n name: string,\n params: Context.EditMcpEndpointParams,\n): Promise<Context.McpEndpoint> {\n const client = await getContextClient(undefined, organizationId)\n return client.context.mcpEndpoints.edit({...params, name})\n}\n\n/**\n * Delete an MCP endpoint\n */\nexport async function deleteMcpEndpoint(organizationId: string, name: string): Promise<void> {\n const client = await getContextClient(undefined, organizationId)\n await client.context.mcpEndpoints.delete({name})\n}\n\n/**\n * Check whether an agent connecting with the current credentials can use an MCP endpoint\n */\nexport async function getMcpEndpointStatus(\n organizationId: string,\n name: string,\n): Promise<Context.McpEndpointStatus> {\n const client = await getContextClient(undefined, organizationId)\n return client.context.mcpEndpoints.status({name})\n}\n"],"names":["getGlobalCliClient","subdebug","EXPERIMENTAL_API_WARNING","isHttpError","CONTEXT_API_VERSION","BLUEPRINTS_API_VERSION","BLUEPRINTS_LOOKUP_TIMEOUT_MS","MCP_CONNECT_API_VERSION","blueprintOwnershipDebug","getContextClient","knowledgeBaseId","organizationId","apiVersion","requireUser","undefined","resource","id","type","context","getContextStoreClient","publicId","getKnowledgeBase","createKnowledgeBase","params","client","knowledgeBases","create","listKnowledgeBases","cursor","page","list","push","data","nextCursor","get","updateKnowledgeBase","edit","describeBlueprintManager","stackName","getKnowledgeBaseBlueprintOwnership","getBlueprintOwnership","getMcpEndpointBlueprintOwnership","resolveResource","managed","ignoreWarnings","maxRetries","timeout","headers","matches","request","query","url","stackId","find","match","encodeURIComponent","then","stack","name","catch","error","statusCode","errorCode","body","response","deleteKnowledgeBase","delete","createImport","imports","listImports","getImport","importId","downloadImport","download","deleteImport","buildKnowledgeBase","build","cancelKnowledgeBaseBuild","cancelBuild","refreshKnowledgeBase","refresh","getJob","jobId","jobs","listIssues","status","issues","getIssue","issueId","resolveIssue","resolution","resolve","dismissIssue","dismiss","reopenIssue","reopen","applyIssues","issueIds","apply","listEntries","entries","getEntry","path","rebuildEntry","rebuild","queryContext","fetch","listMcpEndpoints","docs","mcpEndpoints","connectClient","withConfig","map","doc","toMcpEndpoint","getMcpEndpoint","nameOrId","org","createdAt","_createdAt","groqFilter","instructions","sources","title","updatedAt","_updatedAt","getUrl","createMcpEndpoint","updateMcpEndpoint","deleteMcpEndpoint","getMcpEndpointStatus"],"mappings":"AAAA,SAAQA,kBAAkB,EAAEC,QAAQ,QAAO,mBAAkB;AAC7D,SAAsBC,wBAAwB,EAAEC,WAAW,QAAO,iBAAgB;AAElF,MAAMC,sBAAsB;AAC5B,MAAMC,yBAAyB;AAC/B,MAAMC,+BAA+B;AACrC,yFAAyF;AACzF,MAAMC,0BAA0B;AAEhC,MAAMC,0BAA0BP,SAAS;AAEzC;;;;;CAKC,GACD,eAAeQ,iBAAiBC,eAAwB,EAAEC,cAAuB;IAC/E,OAAOX,mBAAmB;QACxBY,YAAYR;QACZS,aAAa;QACb,GAAIH,oBAAoBI,YACpB,CAAC,IACD;YAACC,UAAU;gBAACC,IAAIN;gBAAiBO,MAAM;YAAyB;QAAC,CAAC;QACtE,GAAIN,mBAAmBG,YAAY,CAAC,IAAI;YAACI,SAAS;gBAACP;YAAc;QAAC,CAAC;IACrE;AACF;AAEA;;;;CAIC,GACD,eAAeQ,sBAAsBT,eAAuB;IAC1D,MAAM,EAACC,cAAc,EAAES,QAAQ,EAAC,GAAG,MAAMC,iBAAiBX;IAC1D,OAAOD,iBAAiBW,UAAUT;AACpC;AAEA;;CAEC,GACD,OAAO,eAAeW,oBACpBC,MAAyC;IAEzC,MAAMC,SAAS,MAAMf;IACrB,OAAOe,OAAON,OAAO,CAACO,cAAc,CAACC,MAAM,CAACH;AAC9C;AAEA;;CAEC,GACD,OAAO,eAAeI,mBAAmBhB,cAAsB;IAC7D,MAAMa,SAAS,MAAMf;IAErB,MAAMgB,iBAA0C,EAAE;IAClD,IAAIG;IACJ,GAAG;QACD,MAAMC,OAAO,MAAML,OAAON,OAAO,CAACO,cAAc,CAACK,IAAI,CAAC;YACpDF;YACAjB;QACF;QACAc,eAAeM,IAAI,IAAIF,KAAKG,IAAI;QAChCJ,SAASC,KAAKI,UAAU,IAAInB;IAC9B,QAASc,WAAWd,UAAU;IAE9B,OAAOW;AACT;AAEA;;CAEC,GACD,OAAO,eAAeJ,iBAAiBX,eAAuB;IAC5D,MAAMc,SAAS,MAAMf;IACrB,OAAOe,OAAON,OAAO,CAACO,cAAc,CAACS,GAAG,CAACxB;AAC3C;AAEA;;CAEC,GACD,OAAO,eAAeyB,oBACpBzB,eAAuB,EACvBa,MAAuC;IAEvC,MAAMC,SAAS,MAAMf;IACrB,OAAOe,OAAON,OAAO,CAACO,cAAc,CAACW,IAAI,CAAC1B,iBAAiBa;AAC7D;AAQA;;CAEC,GACD,OAAO,SAASc,yBAAyBC,SAAwB;IAC/D,OAAOA,YAAY,CAAC,qBAAqB,EAAEA,UAAU,CAAC,CAAC,GAAG;AAC5D;AAEA;;CAEC,GACD,OAAO,SAASC,mCACd7B,eAAuB;IAEvB,OAAO8B,sBAAsB,iCAAiC;QAC5D,MAAM,EAAC7B,cAAc,EAAES,QAAQ,EAAC,GAAG,MAAMC,iBAAiBX;QAC1D,OAAO;YAACC;YAAgBS;QAAQ;IAClC;AACF;AAEA;;CAEC,GACD,OAAO,SAASqB,iCACd9B,cAAsB,EACtB,EAACK,EAAE,EAAkC;IAErC,OAAOwB,sBAAsB,sBAAsB,UAAa,CAAA;YAAC7B;YAAgBS,UAAUJ;QAAE,CAAA;AAC/F;AAEA;;;;CAIC,GACD,eAAewB,sBACbvB,IAAY,EACZyB,eAAiF;IAEjF,IAAI;QACF,MAAM3B,WAAW,MAAM2B;QACvB,IAAI,CAAC3B,UAAU,OAAO;YAAC4B,SAAS;QAAK;QACrC,MAAM,EAAChC,cAAc,EAAES,QAAQ,EAAC,GAAGL;QACnC,MAAMS,SAAS,MAAMxB,mBAAmB;YACtCY,YAAYP;YACZ,gGAAgG;YAChG,8FAA8F;YAC9FuC,gBAAgB;gBAAC1C;gBAA0B;aAAoC;YAC/E,+GAA+G;YAC/G2C,YAAY;YACZhC,aAAa;YACbiC,SAASxC;QACX;QACA,MAAMyC,UAAU;YACd,qBAAqBpC;YACrB,uBAAuB;QACzB;QACA,MAAMqC,UAAU,MAAMxB,OAAOyB,OAAO,CAAuB;YACzDF;YACAG,OAAO;gBAAClC,IAAII;gBAAUH;YAAI;YAC1BkC,KAAK;QACP;QACA,MAAMC,UAAUJ,QAAQK,IAAI,CAAC,CAACC,QAAU,OAAOA,MAAMF,OAAO,KAAK,WAAWA;QAC5E,IAAI,CAACA,SAAS,OAAO;YAACT,SAAS;QAAK;QACpC,MAAML,YAAY,MAAMd,OACrByB,OAAO,CAAkB;YACxBF;YACAI,KAAK,CAAC,mBAAmB,EAAEI,mBAAmBH,UAAU;QAC1D,GACCI,IAAI,CAAC,CAACC,QAAUA,MAAMC,IAAI,IAAI,MAC9BC,KAAK,CAAC,IAAM;QACf,OAAO;YAAChB,SAAS;YAAML;QAAS;IAClC,EAAE,OAAOsB,OAAO;QACd,IAAIzD,YAAYyD,QAAQ;YACtB,IAAIA,MAAMC,UAAU,KAAK,OAAOC,UAAUF,WAAW,oBAAoB;gBACvE,OAAO;oBAACjB,SAAS;oBAAML,WAAW;gBAAI;YACxC;YACA,IAAIsB,MAAMC,UAAU,KAAK,OAAOC,UAAUF,WAAW,wBAAwB;gBAC3E,OAAO;oBAACjB,SAAS;gBAAK;YACxB;QACF;QACAnC,wBAAwB,8DAA8DoD;QACtF,OAAO;YAACjB,SAAS;QAAK;IACxB;AACF;AAEA,SAASmB,UAAUF,KAAkC;IACnD,MAAM,EAACG,IAAI,EAAC,GAAGH,MAAMI,QAAQ;IAC7B,OAAOD,QAAQ,OAAOA,SAAS,YAAY,eAAeA,OAAOA,KAAKD,SAAS,GAAGhD;AACpF;AAEA;;CAEC,GACD,OAAO,eAAemD,oBAAoBvD,eAAuB;IAC/D,MAAMc,SAAS,MAAMf;IACrB,MAAMe,OAAON,OAAO,CAACO,cAAc,CAACyC,MAAM,CAACxD;AAC7C;AAEA;;;CAGC,GACD,OAAO,eAAeyD,aACpBzD,eAAuB,EACvBa,MAAmE;IAEnE,MAAMC,SAAS,MAAMf,iBAAiBC;IACtC,OAAOc,OAAON,OAAO,CAACkD,OAAO,CAAC1C,MAAM,CAACH;AACvC;AAEA;;CAEC,GACD,OAAO,eAAe8C,YAAY3D,eAAuB;IACvD,MAAMc,SAAS,MAAMf,iBAAiBC;IAEtC,MAAM0D,UAA4B,EAAE;IACpC,IAAIxC;IACJ,GAAG;QACD,MAAMC,OAAO,MAAML,OAAON,OAAO,CAACkD,OAAO,CAACtC,IAAI,CAAC;YAACF;QAAM;QACtDwC,QAAQrC,IAAI,IAAIF,KAAKG,IAAI;QACzBJ,SAASC,KAAKI,UAAU,IAAInB;IAC9B,QAASc,WAAWd,UAAU;IAE9B,OAAOsD;AACT;AAEA;;CAEC,GACD,OAAO,eAAeE,UACpB5D,eAAuB,EACvB6D,QAAgB;IAEhB,MAAM/C,SAAS,MAAMf,iBAAiBC;IACtC,OAAOc,OAAON,OAAO,CAACkD,OAAO,CAAClC,GAAG,CAAC;QAACqC;IAAQ;AAC7C;AAEA;;CAEC,GACD,OAAO,eAAeC,eACpB9D,eAAuB,EACvB6D,QAAgB;IAEhB,MAAM/C,SAAS,MAAMf,iBAAiBC;IACtC,OAAOc,OAAON,OAAO,CAACkD,OAAO,CAACK,QAAQ,CAAC;QAACF;IAAQ;AAClD;AAEA;;CAEC,GACD,OAAO,eAAeG,aAAahE,eAAuB,EAAE6D,QAAgB;IAC1E,MAAM/C,SAAS,MAAMf,iBAAiBC;IACtC,MAAMc,OAAON,OAAO,CAACkD,OAAO,CAACF,MAAM,CAAC;QAACK;IAAQ;AAC/C;AAEA;;CAEC,GACD,OAAO,eAAeI,mBAAmBjE,eAAuB;IAC9D,MAAMc,SAAS,MAAMf,iBAAiBC;IACtC,OAAOc,OAAON,OAAO,CAAC0D,KAAK;AAC7B;AAEA;;CAEC,GACD,OAAO,eAAeC,yBACpBnE,eAAuB;IAEvB,MAAMc,SAAS,MAAMf,iBAAiBC;IACtC,OAAOc,OAAON,OAAO,CAAC4D,WAAW;AACnC;AAEA;;CAEC,GACD,OAAO,eAAeC,qBACpBrE,eAAuB;IAEvB,MAAMc,SAAS,MAAMf,iBAAiBC;IACtC,OAAOc,OAAON,OAAO,CAAC8D,OAAO;AAC/B;AAEA;;CAEC,GACD,OAAO,eAAeC,OAAOvE,eAAuB,EAAEwE,KAAa;IACjE,MAAM1D,SAAS,MAAMf,iBAAiBC;IACtC,OAAOc,OAAON,OAAO,CAACiE,IAAI,CAACjD,GAAG,CAAC;QAACgD;IAAK;AACvC;AAEA;;CAEC,GACD,OAAO,eAAeE,WACpB1E,eAAuB,EACvB2E,MAAmC;IAEnC,MAAM7D,SAAS,MAAML,sBAAsBT;IAC3C,OAAOc,OAAON,OAAO,CAACoE,MAAM,CAACxD,IAAI,CAAC;QAACuD;IAAM;AAC3C;AAEA;;CAEC,GACD,OAAO,eAAeE,SACpB7E,eAAuB,EACvB8E,OAAe;IAEf,MAAMhE,SAAS,MAAML,sBAAsBT;IAC3C,OAAOc,OAAON,OAAO,CAACoE,MAAM,CAACpD,GAAG,CAAC;QAACsD;IAAO;AAC3C;AAEA;;;CAGC,GACD,OAAO,eAAeC,aACpB/E,eAAuB,EACvB8E,OAAe,EACfE,UAAkB;IAElB,MAAMlE,SAAS,MAAMf,iBAAiBC;IACtC,OAAOc,OAAON,OAAO,CAACoE,MAAM,CAACK,OAAO,CAAC;QAACH;QAASE;IAAU;AAC3D;AAEA;;CAEC,GACD,OAAO,eAAeE,aACpBlF,eAAuB,EACvB8E,OAAe;IAEf,MAAMhE,SAAS,MAAMf,iBAAiBC;IACtC,OAAOc,OAAON,OAAO,CAACoE,MAAM,CAACO,OAAO,CAAC;QAACL;IAAO;AAC/C;AAEA;;CAEC,GACD,OAAO,eAAeM,YACpBpF,eAAuB,EACvB8E,OAAe;IAEf,MAAMhE,SAAS,MAAMf,iBAAiBC;IACtC,OAAOc,OAAON,OAAO,CAACoE,MAAM,CAACS,MAAM,CAAC;QAACP;IAAO;AAC9C;AAEA;;CAEC,GACD,OAAO,eAAeQ,YACpBtF,eAAuB,EACvBuF,QAAkB;IAElB,MAAMzE,SAAS,MAAMf,iBAAiBC;IACtC,OAAOc,OAAON,OAAO,CAACoE,MAAM,CAACY,KAAK,CAAC;QAACD;IAAQ;AAC9C;AAEA;;CAEC,GACD,OAAO,eAAeE,YAAYzF,eAAuB;IACvD,MAAMc,SAAS,MAAML,sBAAsBT;IAC3C,OAAOc,OAAON,OAAO,CAACkF,OAAO,CAACtE,IAAI;AACpC;AAEA;;;CAGC,GACD,OAAO,eAAeuE,SACpB3F,eAAuB,EACvB4F,IAAY;IAEZ,MAAM9E,SAAS,MAAML,sBAAsBT;IAC3C,OAAOc,OAAON,OAAO,CAACkF,OAAO,CAAClE,GAAG,CAAC;QAACoE;IAAI;AACzC;AAEA;;CAEC,GACD,OAAO,eAAeC,aACpB7F,eAAuB,EACvB4F,IAAY;IAEZ,MAAM9E,SAAS,MAAMf,iBAAiBC;IACtC,OAAOc,OAAON,OAAO,CAACkF,OAAO,CAACI,OAAO,CAAC;QAACF;IAAI;AAC7C;AAEA;;CAEC,GACD,OAAO,eAAeG,aACpB9F,cAAsB,EACtBuC,KAAa,EACb3B,MAAgC;IAEhC,MAAMC,SAAS,MAAMf,iBAAiBK,WAAWH;IACjD,OAAOa,OAAON,OAAO,CAACwF,KAAK,CAACxD,OAAO3B;AACrC;AAEA;;CAEC,GACD,OAAO,eAAeoF,iBAAiBhG,cAAsB;IAC3D,MAAMa,SAAS,MAAMf,iBAAiBK,WAAWH;IACjD,MAAMiG,OAAO,MAAMpF,OAAON,OAAO,CAAC2F,YAAY,CAAC/E,IAAI;IACnD,MAAMgF,gBAAgBtF,OAAOuF,UAAU,CAAC;QAACnG,YAAYL;IAAuB;IAC5E,OAAOqG,KAAKI,GAAG,CAAC,CAACC,MAAQC,cAAcJ,eAAeG;AACxD;AAEA;;;CAGC,GACD,OAAO,eAAeE,eACpBxG,cAAsB,EACtByG,QAAgB;IAEhB,MAAM5F,SAAS,MAAMf,iBAAiBK,WAAWH;IACjD,MAAMsG,MAAM,MAAMzF,OAAON,OAAO,CAACwF,KAAK,CACpC,iHACA;QAACU;QAAUC,KAAK1G;IAAc;IAEhC,OAAOsG,OAAOC,cAAc1F,OAAOuF,UAAU,CAAC;QAACnG,YAAYL;IAAuB,IAAI0G;AACxF;AAEA;;;CAGC,GACD,SAASC,cACPJ,aAAgD,EAChDG,GAAmB;IAEnB,OAAO;QACLK,WAAWL,IAAIM,UAAU;QACzBC,YAAYP,IAAIO,UAAU,IAAI;QAC9BxG,IAAIiG,IAAI7F,QAAQ;QAChBqG,cAAcR,IAAIQ,YAAY,IAAI;QAClC/D,MAAMuD,IAAIvD,IAAI;QACd/C,gBAAgBsG,IAAItG,cAAc;QAClC+G,SAAST,IAAIS,OAAO;QACpBC,OAAOV,IAAIU,KAAK;QAChBC,WAAWX,IAAIY,UAAU;QACzB1E,KAAK2D,cAAcgB,MAAM,CACvB,CAAC,uBAAuB,EAAEvE,mBAAmB0D,IAAItG,cAAc,EAAE,KAAK,EAAE4C,mBAAmB0D,IAAIvD,IAAI,GAAG;IAE1G;AACF;AAEA;;CAEC,GACD,OAAO,eAAeqE,kBACpBpH,cAAsB,EACtBY,MAAuC;IAEvC,MAAMC,SAAS,MAAMf,iBAAiBK,WAAWH;IACjD,OAAOa,OAAON,OAAO,CAAC2F,YAAY,CAACnF,MAAM,CAACH;AAC5C;AAEA;;CAEC,GACD,OAAO,eAAeyG,kBACpBrH,cAAsB,EACtB+C,IAAY,EACZnC,MAAqC;IAErC,MAAMC,SAAS,MAAMf,iBAAiBK,WAAWH;IACjD,OAAOa,OAAON,OAAO,CAAC2F,YAAY,CAACzE,IAAI,CAAC;QAAC,GAAGb,MAAM;QAAEmC;IAAI;AAC1D;AAEA;;CAEC,GACD,OAAO,eAAeuE,kBAAkBtH,cAAsB,EAAE+C,IAAY;IAC1E,MAAMlC,SAAS,MAAMf,iBAAiBK,WAAWH;IACjD,MAAMa,OAAON,OAAO,CAAC2F,YAAY,CAAC3C,MAAM,CAAC;QAACR;IAAI;AAChD;AAEA;;CAEC,GACD,OAAO,eAAewE,qBACpBvH,cAAsB,EACtB+C,IAAY;IAEZ,MAAMlC,SAAS,MAAMf,iBAAiBK,WAAWH;IACjD,OAAOa,OAAON,OAAO,CAAC2F,YAAY,CAACxB,MAAM,CAAC;QAAC3B;IAAI;AACjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/util/sharedFlags.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\n\n/**\n * Controls how the flag relates to CLI configuration:\n *\n * - `'override'` — The command falls back to CLI config (sanity.cli.ts) when the flag is not\n * provided. The flag description automatically gets an \" (overrides CLI configuration)\" suffix,\n * and `helpGroup` defaults to `'OVERRIDE'`.\n *\n * - `'specify'` — The command does NOT fall back to CLI config; the flag is simply how the user\n * provides the value. No suffix is appended, and no default `helpGroup` is set.\n */\ntype FlagSemantics = 'override' | 'specify'\n\n/**\n * Options accepted by the shared flag getters.\n * Locked properties (char, parse, name, helpValue) are excluded to ensure\n * consistent behavior across all commands.\n */\ninterface SharedFlagOptions {\n /**\n * Controls description suffix and default helpGroup.\n * @see {@link FlagSemantics}\n */\n semantics: FlagSemantics\n\n dependsOn?: string[]\n description?: string\n env?: string\n exclusive?: string[]\n helpGroup?: string\n hidden?: boolean\n required?: boolean\n}\n\nconst OVERRIDE_SUFFIX = ' (overrides CLI configuration)'\n\n/**\n * Returns a `--project` / `-p` flag definition with a deprecated `--project-id` alias.\n *\n * Locked: flag name (`project`), char (`p`), `helpValue` (`<id>`), and parse (trims + validates non-empty).\n */\nexport function getProjectIdFlag(options: SharedFlagOptions) {\n const {description: baseDescription, helpGroup, semantics, ...rest} = options\n const isOverride = semantics === 'override'\n const description = (baseDescription ?? 'Project ID to use') + (isOverride ? OVERRIDE_SUFFIX : '')\n\n return {\n project: Flags.string({\n aliases: ['project-id'],\n deprecateAliases: true,\n description,\n helpGroup: helpGroup ?? (isOverride ? 'OVERRIDE' : undefined),\n helpValue: '<id>',\n ...rest,\n char: 'p',\n parse: async (input: string) => {\n const trimmed = input.trim()\n if (trimmed === '') {\n throw new Error('`--project` cannot be empty if provided')\n }\n return trimmed\n },\n }),\n }\n}\n\n/**\n * Returns an `--organization` flag definition.\n *\n * Locked: flag name (`organization`), `helpValue` (`<id>`), and parse (trims + validates non-empty).\n */\nexport function getOrganizationFlag(options: SharedFlagOptions) {\n const {description: baseDescription, helpGroup, semantics, ...rest} = options\n const isOverride = semantics === 'override'\n const description =\n (baseDescription ?? 'Organization ID to use') + (isOverride ? OVERRIDE_SUFFIX : '')\n\n return {\n organization: Flags.string({\n description,\n helpGroup: helpGroup ?? (isOverride ? 'OVERRIDE' : undefined),\n helpValue: '<id>',\n ...rest,\n parse: async (input: string) => {\n const trimmed = input.trim()\n if (trimmed === '') {\n throw new Error('`--organization` cannot be empty if provided')\n }\n return trimmed\n },\n }),\n }\n}\n\n/**\n * Returns a `--dataset` / `-d` flag definition.\n *\n * Locked: flag name (`dataset`), char (`d`), `helpValue` (`<name>`), and parse (trims + validates non-empty).\n */\nexport function getDatasetFlag(options: SharedFlagOptions) {\n const {description: baseDescription, helpGroup, semantics, ...rest} = options\n const isOverride = semantics === 'override'\n const description = (baseDescription ?? 'Dataset to use') + (isOverride ? OVERRIDE_SUFFIX : '')\n\n return {\n dataset: Flags.string({\n description,\n helpGroup: helpGroup ?? (isOverride ? 'OVERRIDE' : undefined),\n helpValue: '<name>',\n ...rest,\n char: 'd',\n parse: async (input: string) => {\n const trimmed = input.trim()\n if (trimmed === '') {\n throw new Error('`--dataset` cannot be empty if provided')\n }\n return trimmed\n },\n }),\n }\n}\n"],"names":["Flags","OVERRIDE_SUFFIX","getProjectIdFlag","options","description","baseDescription","helpGroup","semantics","rest","isOverride","project","string","aliases","deprecateAliases","undefined","helpValue","char","parse","input","trimmed","trim","Error","getOrganizationFlag","organization","getDatasetFlag","dataset"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;
|
|
1
|
+
{"version":3,"sources":["../../src/util/sharedFlags.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\n\n/**\n * Controls how the flag relates to CLI configuration:\n *\n * - `'override'` — The command falls back to CLI config (sanity.cli.ts) when the flag is not\n * provided. The flag description automatically gets an \" (overrides CLI configuration)\" suffix,\n * and `helpGroup` defaults to `'OVERRIDE'`.\n *\n * - `'specify'` — The command does NOT fall back to CLI config; the flag is simply how the user\n * provides the value. No suffix is appended, and no default `helpGroup` is set.\n */\ntype FlagSemantics = 'override' | 'specify'\n\n/**\n * Options accepted by the shared flag getters.\n * Locked properties (char, parse, name, helpValue) are excluded to ensure\n * consistent behavior across all commands.\n */\ninterface SharedFlagOptions {\n /**\n * Controls description suffix and default helpGroup.\n * @see {@link FlagSemantics}\n */\n semantics: FlagSemantics\n\n atLeastOne?: string[]\n dependsOn?: string[]\n description?: string\n env?: string\n exclusive?: string[]\n helpGroup?: string\n hidden?: boolean\n required?: boolean\n}\n\nconst OVERRIDE_SUFFIX = ' (overrides CLI configuration)'\n\n/**\n * Returns a `--project` / `-p` flag definition with a deprecated `--project-id` alias.\n *\n * Locked: flag name (`project`), char (`p`), `helpValue` (`<id>`), and parse (trims + validates non-empty).\n */\nexport function getProjectIdFlag(options: SharedFlagOptions) {\n const {description: baseDescription, helpGroup, semantics, ...rest} = options\n const isOverride = semantics === 'override'\n const description = (baseDescription ?? 'Project ID to use') + (isOverride ? OVERRIDE_SUFFIX : '')\n\n return {\n project: Flags.string({\n aliases: ['project-id'],\n deprecateAliases: true,\n description,\n helpGroup: helpGroup ?? (isOverride ? 'OVERRIDE' : undefined),\n helpValue: '<id>',\n ...rest,\n char: 'p',\n parse: async (input: string) => {\n const trimmed = input.trim()\n if (trimmed === '') {\n throw new Error('`--project` cannot be empty if provided')\n }\n return trimmed\n },\n }),\n }\n}\n\n/**\n * Returns an `--organization` flag definition.\n *\n * Locked: flag name (`organization`), `helpValue` (`<id>`), and parse (trims + validates non-empty).\n */\nexport function getOrganizationFlag(options: SharedFlagOptions) {\n const {description: baseDescription, helpGroup, semantics, ...rest} = options\n const isOverride = semantics === 'override'\n const description =\n (baseDescription ?? 'Organization ID to use') + (isOverride ? OVERRIDE_SUFFIX : '')\n\n return {\n organization: Flags.string({\n description,\n helpGroup: helpGroup ?? (isOverride ? 'OVERRIDE' : undefined),\n helpValue: '<id>',\n ...rest,\n parse: async (input: string) => {\n const trimmed = input.trim()\n if (trimmed === '') {\n throw new Error('`--organization` cannot be empty if provided')\n }\n return trimmed\n },\n }),\n }\n}\n\n/**\n * Returns a `--dataset` / `-d` flag definition.\n *\n * Locked: flag name (`dataset`), char (`d`), `helpValue` (`<name>`), and parse (trims + validates non-empty).\n */\nexport function getDatasetFlag(options: SharedFlagOptions) {\n const {description: baseDescription, helpGroup, semantics, ...rest} = options\n const isOverride = semantics === 'override'\n const description = (baseDescription ?? 'Dataset to use') + (isOverride ? OVERRIDE_SUFFIX : '')\n\n return {\n dataset: Flags.string({\n description,\n helpGroup: helpGroup ?? (isOverride ? 'OVERRIDE' : undefined),\n helpValue: '<name>',\n ...rest,\n char: 'd',\n parse: async (input: string) => {\n const trimmed = input.trim()\n if (trimmed === '') {\n throw new Error('`--dataset` cannot be empty if provided')\n }\n return trimmed\n },\n }),\n }\n}\n"],"names":["Flags","OVERRIDE_SUFFIX","getProjectIdFlag","options","description","baseDescription","helpGroup","semantics","rest","isOverride","project","string","aliases","deprecateAliases","undefined","helpValue","char","parse","input","trimmed","trim","Error","getOrganizationFlag","organization","getDatasetFlag","dataset"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AAoCjC,MAAMC,kBAAkB;AAExB;;;;CAIC,GACD,OAAO,SAASC,iBAAiBC,OAA0B;IACzD,MAAM,EAACC,aAAaC,eAAe,EAAEC,SAAS,EAAEC,SAAS,EAAE,GAAGC,MAAK,GAAGL;IACtE,MAAMM,aAAaF,cAAc;IACjC,MAAMH,cAAc,AAACC,CAAAA,mBAAmB,mBAAkB,IAAMI,CAAAA,aAAaR,kBAAkB,EAAC;IAEhG,OAAO;QACLS,SAASV,MAAMW,MAAM,CAAC;YACpBC,SAAS;gBAAC;aAAa;YACvBC,kBAAkB;YAClBT;YACAE,WAAWA,aAAcG,CAAAA,aAAa,aAAaK,SAAQ;YAC3DC,WAAW;YACX,GAAGP,IAAI;YACPQ,MAAM;YACNC,OAAO,OAAOC;gBACZ,MAAMC,UAAUD,MAAME,IAAI;gBAC1B,IAAID,YAAY,IAAI;oBAClB,MAAM,IAAIE,MAAM;gBAClB;gBACA,OAAOF;YACT;QACF;IACF;AACF;AAEA;;;;CAIC,GACD,OAAO,SAASG,oBAAoBnB,OAA0B;IAC5D,MAAM,EAACC,aAAaC,eAAe,EAAEC,SAAS,EAAEC,SAAS,EAAE,GAAGC,MAAK,GAAGL;IACtE,MAAMM,aAAaF,cAAc;IACjC,MAAMH,cACJ,AAACC,CAAAA,mBAAmB,wBAAuB,IAAMI,CAAAA,aAAaR,kBAAkB,EAAC;IAEnF,OAAO;QACLsB,cAAcvB,MAAMW,MAAM,CAAC;YACzBP;YACAE,WAAWA,aAAcG,CAAAA,aAAa,aAAaK,SAAQ;YAC3DC,WAAW;YACX,GAAGP,IAAI;YACPS,OAAO,OAAOC;gBACZ,MAAMC,UAAUD,MAAME,IAAI;gBAC1B,IAAID,YAAY,IAAI;oBAClB,MAAM,IAAIE,MAAM;gBAClB;gBACA,OAAOF;YACT;QACF;IACF;AACF;AAEA;;;;CAIC,GACD,OAAO,SAASK,eAAerB,OAA0B;IACvD,MAAM,EAACC,aAAaC,eAAe,EAAEC,SAAS,EAAEC,SAAS,EAAE,GAAGC,MAAK,GAAGL;IACtE,MAAMM,aAAaF,cAAc;IACjC,MAAMH,cAAc,AAACC,CAAAA,mBAAmB,gBAAe,IAAMI,CAAAA,aAAaR,kBAAkB,EAAC;IAE7F,OAAO;QACLwB,SAASzB,MAAMW,MAAM,CAAC;YACpBP;YACAE,WAAWA,aAAcG,CAAAA,aAAa,aAAaK,SAAQ;YAC3DC,WAAW;YACX,GAAGP,IAAI;YACPQ,MAAM;YACNC,OAAO,OAAOC;gBACZ,MAAMC,UAAUD,MAAME,IAAI;gBAC1B,IAAID,YAAY,IAAI;oBAClB,MAAM,IAAIE,MAAM;gBAClB;gBACA,OAAOF;YACT;QACF;IACF;AACF"}
|
|
@@ -45,6 +45,12 @@ const commandPaths = new Set([
|
|
|
45
45
|
'context issues resolve',
|
|
46
46
|
'context jobs get',
|
|
47
47
|
'context list',
|
|
48
|
+
'context mcp create',
|
|
49
|
+
'context mcp delete',
|
|
50
|
+
'context mcp get',
|
|
51
|
+
'context mcp list',
|
|
52
|
+
'context mcp status',
|
|
53
|
+
'context mcp update',
|
|
48
54
|
'context query',
|
|
49
55
|
'context refresh',
|
|
50
56
|
'context update',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/util/telemetry/cliCommandIdentity.ts"],"sourcesContent":["// Command paths only: positional user input must never become command identity.\nconst commandPaths = new Set([\n 'api',\n 'assets upload',\n 'backup disable',\n 'backup download',\n 'backup enable',\n 'backup list',\n 'backups disable',\n 'backups download',\n 'backups enable',\n 'backups list',\n 'blueprints add',\n 'blueprints config',\n 'blueprints deploy',\n 'blueprints destroy',\n 'blueprints doctor',\n 'blueprints info',\n 'blueprints init',\n 'blueprints logs',\n 'blueprints mint-deploy-token',\n 'blueprints plan',\n 'blueprints promote',\n 'blueprints stacks',\n 'build',\n 'check',\n 'codemod',\n 'context build',\n 'context create',\n 'context delete',\n 'context entries get',\n 'context entries list',\n 'context entries rebuild',\n 'context get',\n 'context imports create',\n 'context imports delete',\n 'context imports download',\n 'context imports get',\n 'context imports list',\n 'context issues apply',\n 'context issues dismiss',\n 'context issues get',\n 'context issues list',\n 'context issues reopen',\n 'context issues resolve',\n 'context jobs get',\n 'context list',\n 'context query',\n 'context refresh',\n 'context update',\n 'cors add',\n 'cors delete',\n 'cors list',\n 'dataset alias create',\n 'dataset alias delete',\n 'dataset alias link',\n 'dataset alias unlink',\n 'dataset copy',\n 'dataset create',\n 'dataset delete',\n 'dataset export',\n 'dataset import',\n 'dataset list',\n 'datasets alias create',\n 'datasets alias delete',\n 'datasets alias link',\n 'datasets alias unlink',\n 'datasets copy',\n 'datasets create',\n 'datasets delete',\n 'datasets embeddings disable',\n 'datasets embeddings enable',\n 'datasets embeddings status',\n 'datasets export',\n 'datasets import',\n 'datasets list',\n 'datasets visibility get',\n 'datasets visibility set',\n 'dataset visibility get',\n 'dataset visibility set',\n 'debug',\n 'deploy',\n 'dev',\n 'docs browse',\n 'docs read',\n 'docs search',\n 'doctor',\n 'documents create',\n 'documents delete',\n 'documents get',\n 'documents query',\n 'documents validate',\n 'exec',\n 'functions add',\n 'functions build',\n 'functions deploy',\n 'functions dev',\n 'functions env add',\n 'functions env list',\n 'functions env remove',\n 'functions list',\n 'functions logs',\n 'functions test',\n 'graphql deploy',\n 'graphql list',\n 'graphql undeploy',\n 'help',\n 'hook list',\n 'hooks attempt',\n 'hooks create',\n 'hooks delete',\n 'hooks list',\n 'hooks logs',\n 'init',\n 'init plugin',\n 'install',\n 'learn',\n 'login',\n 'logout',\n 'manage',\n 'manifest extract',\n 'mcp configure',\n 'media create-aspect',\n 'media delete-aspect',\n 'media deploy-aspect',\n 'media export',\n 'media import',\n 'media prune-aspect-data',\n 'media pull-aspects',\n 'migration create',\n 'migration list',\n 'migration run',\n 'migrations create',\n 'migrations list',\n 'migrations run',\n 'new',\n 'openapi get',\n 'openapi list',\n 'organizations create',\n 'organizations delete',\n 'organizations get',\n 'organizations list',\n 'organizations update',\n 'preview',\n 'projects create',\n 'projects list',\n 'projects unclaimed',\n 'schema delete',\n 'schema deploy',\n 'schema extract',\n 'schema list',\n 'schemas delete',\n 'schemas deploy',\n 'schemas extract',\n 'schemas list',\n 'schemas validate',\n 'schema validate',\n 'skills install',\n 'telemetry disable',\n 'telemetry enable',\n 'telemetry status',\n 'tokens create',\n 'tokens delete',\n 'tokens list',\n 'tokens rotate',\n 'typegen generate',\n 'undeploy',\n 'uninstall',\n 'upgrade',\n 'users invite',\n 'users list',\n 'versions',\n 'whoami',\n 'workflows abort',\n 'workflows blueprint generate',\n 'workflows definition delete',\n 'workflows definition diff',\n 'workflows definition list',\n 'workflows definition show',\n 'workflows deploy',\n 'workflows diagnose',\n 'workflows fire-action',\n 'workflows list',\n 'workflows nuke',\n 'workflows reset-activity',\n 'workflows set-stage',\n 'workflows show',\n 'workflows start',\n 'workflows tail',\n])\n\nconst knownRoots = new Set([...commandPaths].map((path) => path.split(' ')[0]))\n\nexport function commandIdentity(group: unknown, args: unknown) {\n const root = typeof group === 'string' ? group.split(':') : []\n const parts = [...root, ...(Array.isArray(args) ? args : [])]\n if (!knownRoots.has(root[0])) return {commandArguments: [], groupOrCommand: 'unknown'}\n\n let commandArguments: string[] = []\n for (let length = 2; length <= Math.min(parts.length, 4); length++) {\n const candidate = parts.slice(0, length)\n if (!candidate.every((part) => typeof part === 'string')) break\n if (commandPaths.has(candidate.join(' '))) commandArguments = candidate.slice(1)\n }\n return {commandArguments, groupOrCommand: root[0]}\n}\n"],"names":["commandPaths","Set","knownRoots","map","path","split","commandIdentity","group","args","root","parts","Array","isArray","has","commandArguments","groupOrCommand","length","Math","min","candidate","slice","every","part","join"],"mappings":"AAAA,gFAAgF;AAChF,MAAMA,eAAe,IAAIC,IAAI;IAC3B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAED,MAAMC,aAAa,IAAID,IAAI;OAAID;CAAa,CAACG,GAAG,CAAC,CAACC,OAASA,KAAKC,KAAK,CAAC,IAAI,CAAC,EAAE;AAE7E,OAAO,SAASC,gBAAgBC,KAAc,EAAEC,IAAa;IAC3D,MAAMC,OAAO,OAAOF,UAAU,WAAWA,MAAMF,KAAK,CAAC,OAAO,EAAE;IAC9D,MAAMK,QAAQ;WAAID;WAAUE,MAAMC,OAAO,CAACJ,QAAQA,OAAO,EAAE;KAAE;IAC7D,IAAI,CAACN,WAAWW,GAAG,CAACJ,IAAI,CAAC,EAAE,GAAG,OAAO;QAACK,kBAAkB,EAAE;QAAEC,gBAAgB;IAAS;IAErF,IAAID,mBAA6B,EAAE;IACnC,IAAK,IAAIE,SAAS,GAAGA,UAAUC,KAAKC,GAAG,CAACR,MAAMM,MAAM,EAAE,IAAIA,SAAU;QAClE,MAAMG,YAAYT,MAAMU,KAAK,CAAC,GAAGJ;QACjC,IAAI,CAACG,UAAUE,KAAK,CAAC,CAACC,OAAS,OAAOA,SAAS,WAAW;QAC1D,IAAItB,aAAaa,GAAG,CAACM,UAAUI,IAAI,CAAC,OAAOT,mBAAmBK,UAAUC,KAAK,CAAC;IAChF;IACA,OAAO;QAACN;QAAkBC,gBAAgBN,IAAI,CAAC,EAAE;IAAA;AACnD"}
|
|
1
|
+
{"version":3,"sources":["../../../src/util/telemetry/cliCommandIdentity.ts"],"sourcesContent":["// Command paths only: positional user input must never become command identity.\nconst commandPaths = new Set([\n 'api',\n 'assets upload',\n 'backup disable',\n 'backup download',\n 'backup enable',\n 'backup list',\n 'backups disable',\n 'backups download',\n 'backups enable',\n 'backups list',\n 'blueprints add',\n 'blueprints config',\n 'blueprints deploy',\n 'blueprints destroy',\n 'blueprints doctor',\n 'blueprints info',\n 'blueprints init',\n 'blueprints logs',\n 'blueprints mint-deploy-token',\n 'blueprints plan',\n 'blueprints promote',\n 'blueprints stacks',\n 'build',\n 'check',\n 'codemod',\n 'context build',\n 'context create',\n 'context delete',\n 'context entries get',\n 'context entries list',\n 'context entries rebuild',\n 'context get',\n 'context imports create',\n 'context imports delete',\n 'context imports download',\n 'context imports get',\n 'context imports list',\n 'context issues apply',\n 'context issues dismiss',\n 'context issues get',\n 'context issues list',\n 'context issues reopen',\n 'context issues resolve',\n 'context jobs get',\n 'context list',\n 'context mcp create',\n 'context mcp delete',\n 'context mcp get',\n 'context mcp list',\n 'context mcp status',\n 'context mcp update',\n 'context query',\n 'context refresh',\n 'context update',\n 'cors add',\n 'cors delete',\n 'cors list',\n 'dataset alias create',\n 'dataset alias delete',\n 'dataset alias link',\n 'dataset alias unlink',\n 'dataset copy',\n 'dataset create',\n 'dataset delete',\n 'dataset export',\n 'dataset import',\n 'dataset list',\n 'datasets alias create',\n 'datasets alias delete',\n 'datasets alias link',\n 'datasets alias unlink',\n 'datasets copy',\n 'datasets create',\n 'datasets delete',\n 'datasets embeddings disable',\n 'datasets embeddings enable',\n 'datasets embeddings status',\n 'datasets export',\n 'datasets import',\n 'datasets list',\n 'datasets visibility get',\n 'datasets visibility set',\n 'dataset visibility get',\n 'dataset visibility set',\n 'debug',\n 'deploy',\n 'dev',\n 'docs browse',\n 'docs read',\n 'docs search',\n 'doctor',\n 'documents create',\n 'documents delete',\n 'documents get',\n 'documents query',\n 'documents validate',\n 'exec',\n 'functions add',\n 'functions build',\n 'functions deploy',\n 'functions dev',\n 'functions env add',\n 'functions env list',\n 'functions env remove',\n 'functions list',\n 'functions logs',\n 'functions test',\n 'graphql deploy',\n 'graphql list',\n 'graphql undeploy',\n 'help',\n 'hook list',\n 'hooks attempt',\n 'hooks create',\n 'hooks delete',\n 'hooks list',\n 'hooks logs',\n 'init',\n 'init plugin',\n 'install',\n 'learn',\n 'login',\n 'logout',\n 'manage',\n 'manifest extract',\n 'mcp configure',\n 'media create-aspect',\n 'media delete-aspect',\n 'media deploy-aspect',\n 'media export',\n 'media import',\n 'media prune-aspect-data',\n 'media pull-aspects',\n 'migration create',\n 'migration list',\n 'migration run',\n 'migrations create',\n 'migrations list',\n 'migrations run',\n 'new',\n 'openapi get',\n 'openapi list',\n 'organizations create',\n 'organizations delete',\n 'organizations get',\n 'organizations list',\n 'organizations update',\n 'preview',\n 'projects create',\n 'projects list',\n 'projects unclaimed',\n 'schema delete',\n 'schema deploy',\n 'schema extract',\n 'schema list',\n 'schemas delete',\n 'schemas deploy',\n 'schemas extract',\n 'schemas list',\n 'schemas validate',\n 'schema validate',\n 'skills install',\n 'telemetry disable',\n 'telemetry enable',\n 'telemetry status',\n 'tokens create',\n 'tokens delete',\n 'tokens list',\n 'tokens rotate',\n 'typegen generate',\n 'undeploy',\n 'uninstall',\n 'upgrade',\n 'users invite',\n 'users list',\n 'versions',\n 'whoami',\n 'workflows abort',\n 'workflows blueprint generate',\n 'workflows definition delete',\n 'workflows definition diff',\n 'workflows definition list',\n 'workflows definition show',\n 'workflows deploy',\n 'workflows diagnose',\n 'workflows fire-action',\n 'workflows list',\n 'workflows nuke',\n 'workflows reset-activity',\n 'workflows set-stage',\n 'workflows show',\n 'workflows start',\n 'workflows tail',\n])\n\nconst knownRoots = new Set([...commandPaths].map((path) => path.split(' ')[0]))\n\nexport function commandIdentity(group: unknown, args: unknown) {\n const root = typeof group === 'string' ? group.split(':') : []\n const parts = [...root, ...(Array.isArray(args) ? args : [])]\n if (!knownRoots.has(root[0])) return {commandArguments: [], groupOrCommand: 'unknown'}\n\n let commandArguments: string[] = []\n for (let length = 2; length <= Math.min(parts.length, 4); length++) {\n const candidate = parts.slice(0, length)\n if (!candidate.every((part) => typeof part === 'string')) break\n if (commandPaths.has(candidate.join(' '))) commandArguments = candidate.slice(1)\n }\n return {commandArguments, groupOrCommand: root[0]}\n}\n"],"names":["commandPaths","Set","knownRoots","map","path","split","commandIdentity","group","args","root","parts","Array","isArray","has","commandArguments","groupOrCommand","length","Math","min","candidate","slice","every","part","join"],"mappings":"AAAA,gFAAgF;AAChF,MAAMA,eAAe,IAAIC,IAAI;IAC3B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAED,MAAMC,aAAa,IAAID,IAAI;OAAID;CAAa,CAACG,GAAG,CAAC,CAACC,OAASA,KAAKC,KAAK,CAAC,IAAI,CAAC,EAAE;AAE7E,OAAO,SAASC,gBAAgBC,KAAc,EAAEC,IAAa;IAC3D,MAAMC,OAAO,OAAOF,UAAU,WAAWA,MAAMF,KAAK,CAAC,OAAO,EAAE;IAC9D,MAAMK,QAAQ;WAAID;WAAUE,MAAMC,OAAO,CAACJ,QAAQA,OAAO,EAAE;KAAE;IAC7D,IAAI,CAACN,WAAWW,GAAG,CAACJ,IAAI,CAAC,EAAE,GAAG,OAAO;QAACK,kBAAkB,EAAE;QAAEC,gBAAgB;IAAS;IAErF,IAAID,mBAA6B,EAAE;IACnC,IAAK,IAAIE,SAAS,GAAGA,UAAUC,KAAKC,GAAG,CAACR,MAAMM,MAAM,EAAE,IAAIA,SAAU;QAClE,MAAMG,YAAYT,MAAMU,KAAK,CAAC,GAAGJ;QACjC,IAAI,CAACG,UAAUE,KAAK,CAAC,CAACC,OAAS,OAAOA,SAAS,WAAW;QAC1D,IAAItB,aAAaa,GAAG,CAACM,UAAUI,IAAI,CAAC,OAAOT,mBAAmBK,UAAUC,KAAK,CAAC;IAChF;IACA,OAAO;QAACN;QAAkBC,gBAAgBN,IAAI,CAAC,EAAE;IAAA;AACnD"}
|
package/oclif.config.js
CHANGED
|
@@ -16,7 +16,7 @@ export default {
|
|
|
16
16
|
plugins: ['@oclif/plugin-help', '@sanity/runtime-cli', '@sanity/workflow-cli'],
|
|
17
17
|
topics: {
|
|
18
18
|
backups: {description: 'Manage dataset backups'},
|
|
19
|
-
context: {description: 'Manage Context knowledge bases'},
|
|
19
|
+
context: {description: 'Manage Context knowledge bases and MCP endpoints'},
|
|
20
20
|
cors: {description: 'Manage CORS origins for your project'},
|
|
21
21
|
datasets: {description: 'Manage datasets in your project'},
|
|
22
22
|
docs: {description: 'Browse and search Sanity documentation'},
|