@sanity/cli 6.0.0-alpha.6 → 6.0.0-alpha.8
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 +2907 -109
- package/dist/actions/build/renderDocumentWorker/tryLoadDocumentComponent.js +2 -1
- package/dist/actions/build/renderDocumentWorker/tryLoadDocumentComponent.js.map +1 -1
- package/dist/actions/init/bootstrapLocalTemplate.d.ts +13 -0
- package/dist/actions/init/bootstrapLocalTemplate.js +136 -0
- package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -0
- package/dist/actions/init/bootstrapRemoteTemplate.d.ts +12 -0
- package/dist/actions/init/bootstrapRemoteTemplate.js +109 -0
- package/dist/actions/init/bootstrapRemoteTemplate.js.map +1 -0
- package/dist/actions/init/bootstrapTemplate.d.ts +18 -0
- package/dist/actions/init/bootstrapTemplate.js +32 -0
- package/dist/actions/init/bootstrapTemplate.js.map +1 -0
- package/dist/actions/init/checkNextJsReactCompatibility.d.ts +9 -0
- package/dist/actions/init/checkNextJsReactCompatibility.js +21 -0
- package/dist/actions/init/checkNextJsReactCompatibility.js.map +1 -0
- package/dist/actions/init/countNestedFolders.d.ts +1 -0
- package/dist/actions/init/countNestedFolders.js +6 -0
- package/dist/actions/init/countNestedFolders.js.map +1 -0
- package/dist/actions/init/createAppCliConfig.d.ts +5 -0
- package/dist/actions/init/createAppCliConfig.js +19 -0
- package/dist/actions/init/createAppCliConfig.js.map +1 -0
- package/dist/actions/init/createCliConfig.d.ts +6 -0
- package/dist/actions/init/createCliConfig.js +27 -0
- package/dist/actions/init/createCliConfig.js.map +1 -0
- package/dist/actions/init/createPackageManifest.d.ts +6 -0
- package/dist/actions/init/createPackageManifest.js +86 -0
- package/dist/actions/init/createPackageManifest.js.map +1 -0
- package/dist/actions/init/createStudioConfig.d.ts +13 -0
- package/dist/actions/init/createStudioConfig.js +41 -0
- package/dist/actions/init/createStudioConfig.js.map +1 -0
- package/dist/actions/init/env/createOrAppendEnvVars.d.ts +12 -0
- package/dist/actions/init/env/createOrAppendEnvVars.js +25 -0
- package/dist/actions/init/env/createOrAppendEnvVars.js.map +1 -0
- package/dist/actions/init/env/parseAndUpdateEnvVars.d.ts +9 -0
- package/dist/actions/init/env/parseAndUpdateEnvVars.js +42 -0
- package/dist/actions/init/env/parseAndUpdateEnvVars.js.map +1 -0
- package/dist/actions/init/env/writeEnvVarsToFile.d.ts +12 -0
- package/dist/actions/init/env/writeEnvVarsToFile.js +49 -0
- package/dist/actions/init/env/writeEnvVarsToFile.js.map +1 -0
- package/dist/actions/init/fetchPostInitPrompt.d.ts +6 -0
- package/dist/actions/init/fetchPostInitPrompt.js +30 -0
- package/dist/actions/init/fetchPostInitPrompt.js.map +1 -0
- package/dist/actions/init/git.d.ts +1 -0
- package/dist/actions/init/git.js +65 -0
- package/dist/actions/init/git.js.map +1 -0
- package/dist/actions/init/processTemplate.d.ts +7 -0
- package/dist/actions/init/processTemplate.js +56 -0
- package/dist/actions/init/processTemplate.js.map +1 -0
- package/dist/actions/init/remoteTemplate.d.ts +0 -3
- package/dist/actions/init/remoteTemplate.js +2 -40
- package/dist/actions/init/remoteTemplate.js.map +1 -1
- package/dist/actions/init/resolvePackageManager.d.ts +10 -0
- package/dist/actions/init/resolvePackageManager.js +20 -0
- package/dist/actions/init/resolvePackageManager.js.map +1 -0
- package/dist/actions/init/setupMCP.d.ts +21 -0
- package/dist/actions/init/setupMCP.js +258 -0
- package/dist/actions/init/setupMCP.js.map +1 -0
- package/dist/actions/init/templates/appQuickstart.d.ts +3 -0
- package/dist/actions/init/templates/appQuickstart.js +28 -0
- package/dist/actions/init/templates/appQuickstart.js.map +1 -0
- package/dist/actions/init/templates/appSanityUi.d.ts +3 -0
- package/dist/actions/init/templates/appSanityUi.js +30 -0
- package/dist/actions/init/templates/appSanityUi.js.map +1 -0
- package/dist/actions/init/templates/blog.d.ts +3 -0
- package/dist/actions/init/templates/blog.js +4 -0
- package/dist/actions/init/templates/blog.js.map +1 -0
- package/dist/actions/init/templates/clean.d.ts +3 -0
- package/dist/actions/init/templates/clean.js +4 -0
- package/dist/actions/init/templates/clean.js.map +1 -0
- package/dist/actions/init/templates/getStarted.d.ts +3 -0
- package/dist/actions/init/templates/getStarted.js +35 -0
- package/dist/actions/init/templates/getStarted.js.map +1 -0
- package/dist/actions/init/templates/index.d.ts +3 -0
- package/dist/actions/init/templates/index.js +23 -0
- package/dist/actions/init/templates/index.js.map +1 -0
- package/dist/actions/init/templates/moviedb.d.ts +3 -0
- package/dist/actions/init/templates/moviedb.js +34 -0
- package/dist/actions/init/templates/moviedb.js.map +1 -0
- package/dist/actions/init/templates/nextjs/index.d.ts +6 -0
- package/dist/actions/init/templates/nextjs/index.js +213 -0
- package/dist/actions/init/templates/nextjs/index.js.map +1 -0
- package/dist/actions/init/templates/nextjs/schemaTypes/blog.d.ts +3 -0
- package/dist/actions/init/templates/nextjs/schemaTypes/blog.js +247 -0
- package/dist/actions/init/templates/nextjs/schemaTypes/blog.js.map +1 -0
- package/dist/actions/init/templates/quickstart.d.ts +3 -0
- package/dist/actions/init/templates/quickstart.js +4 -0
- package/dist/actions/init/templates/quickstart.js.map +1 -0
- package/dist/actions/init/templates/shopify.d.ts +3 -0
- package/dist/actions/init/templates/shopify.js +77 -0
- package/dist/actions/init/templates/shopify.js.map +1 -0
- package/dist/actions/init/templates/shopifyOnline.d.ts +3 -0
- package/dist/actions/init/templates/shopifyOnline.js +49 -0
- package/dist/actions/init/templates/shopifyOnline.js.map +1 -0
- package/dist/actions/init/types.d.ts +15 -0
- package/dist/actions/init/types.js +3 -0
- package/dist/actions/init/types.js.map +1 -0
- package/dist/actions/init/updateInitialTemplateMetadata.d.ts +1 -0
- package/dist/actions/init/updateInitialTemplateMetadata.js +17 -0
- package/dist/actions/init/updateInitialTemplateMetadata.js.map +1 -0
- package/dist/actions/telemetry/resolveConsent.d.ts +1 -9
- package/dist/actions/telemetry/resolveConsent.js +2 -2
- package/dist/actions/telemetry/resolveConsent.js.map +1 -1
- package/dist/actions/telemetry/setConsent.d.ts +1 -4
- package/dist/actions/telemetry/setConsent.js +4 -8
- package/dist/actions/telemetry/setConsent.js.map +1 -1
- package/dist/commands/init.d.ts +24 -14
- package/dist/commands/init.js +544 -26
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/telemetry/disable.js +0 -1
- package/dist/commands/telemetry/disable.js.map +1 -1
- package/dist/commands/telemetry/enable.js +0 -1
- package/dist/commands/telemetry/enable.js.map +1 -1
- package/dist/commands/telemetry/status.js +1 -3
- package/dist/commands/telemetry/status.js.map +1 -1
- package/dist/hooks/prerun/flushTelemetry.worker.d.ts +2 -0
- package/dist/hooks/prerun/flushTelemetry.worker.js +22 -0
- package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -0
- package/dist/hooks/prerun/setupTelemetry.js +65 -1
- package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
- package/dist/prompts/init/nextjs.d.ts +5 -0
- package/dist/prompts/init/nextjs.js +56 -0
- package/dist/prompts/init/nextjs.js.map +1 -0
- package/dist/prompts/init/promptForTypescript.d.ts +0 -1
- package/dist/prompts/init/promptForTypescript.js +0 -6
- package/dist/prompts/init/promptForTypescript.js.map +1 -1
- package/dist/services/mcp.d.ts +10 -0
- package/dist/services/mcp.js +16 -0
- package/dist/services/mcp.js.map +1 -1
- package/dist/services/projects.d.ts +5 -2
- package/dist/services/projects.js +37 -0
- package/dist/services/projects.js.map +1 -1
- package/dist/services/telemetry.d.ts +2 -0
- package/dist/services/telemetry.js +20 -0
- package/dist/services/telemetry.js.map +1 -0
- package/dist/studioDependencies.d.ts +16 -0
- package/dist/studioDependencies.js +24 -0
- package/dist/studioDependencies.js.map +1 -0
- package/dist/telemetry/cli.telemetry.d.ts +20 -0
- package/dist/telemetry/cli.telemetry.js +8 -0
- package/dist/telemetry/cli.telemetry.js.map +1 -0
- package/dist/telemetry/store/cleanupOldTelemetryFiles.d.ts +5 -0
- package/dist/telemetry/store/cleanupOldTelemetryFiles.js +30 -0
- package/dist/telemetry/store/cleanupOldTelemetryFiles.js.map +1 -0
- package/dist/telemetry/store/createTelemetryStore.d.ts +39 -0
- package/dist/telemetry/store/createTelemetryStore.js +95 -0
- package/dist/telemetry/store/createTelemetryStore.js.map +1 -0
- package/dist/telemetry/store/createTraceId.d.ts +10 -0
- package/dist/telemetry/store/createTraceId.js +10 -0
- package/dist/telemetry/store/createTraceId.js.map +1 -0
- package/dist/telemetry/store/debug.d.ts +5 -0
- package/dist/telemetry/store/debug.js +7 -0
- package/dist/telemetry/store/debug.js.map +1 -0
- package/dist/telemetry/store/findTelemetryFiles.d.ts +13 -0
- package/dist/telemetry/store/findTelemetryFiles.js +34 -0
- package/dist/telemetry/store/findTelemetryFiles.js.map +1 -0
- package/dist/telemetry/store/flushTelemetryFiles.d.ts +20 -0
- package/dist/telemetry/store/flushTelemetryFiles.js +107 -0
- package/dist/telemetry/store/flushTelemetryFiles.js.map +1 -0
- package/dist/telemetry/store/generateTelemetryFilePath.d.ts +17 -0
- package/dist/telemetry/store/generateTelemetryFilePath.js +30 -0
- package/dist/telemetry/store/generateTelemetryFilePath.js.map +1 -0
- package/dist/telemetry/store/getTelemetryBaseInfo.d.ts +27 -0
- package/dist/telemetry/store/getTelemetryBaseInfo.js +34 -0
- package/dist/telemetry/store/getTelemetryBaseInfo.js.map +1 -0
- package/dist/telemetry/store/logger.d.ts +6 -0
- package/dist/telemetry/store/logger.js +54 -0
- package/dist/telemetry/store/logger.js.map +1 -0
- package/dist/telemetry/store/trace.d.ts +6 -0
- package/dist/telemetry/store/trace.js +150 -0
- package/dist/telemetry/store/trace.js.map +1 -0
- package/dist/telemetry/utils/readNDJSON.d.ts +10 -0
- package/dist/telemetry/utils/readNDJSON.js +18 -0
- package/dist/telemetry/utils/readNDJSON.js.map +1 -0
- package/dist/types.d.ts +33 -0
- package/dist/types.js.map +1 -1
- package/dist/typings/deepSortObject.d.js +2 -0
- package/dist/typings/deepSortObject.d.js.map +1 -0
- package/dist/util/copy.d.ts +5 -0
- package/dist/util/copy.js +37 -0
- package/dist/util/copy.js.map +1 -0
- package/dist/util/detectRuntime.d.ts +8 -0
- package/dist/util/detectRuntime.js +20 -0
- package/dist/util/detectRuntime.js.map +1 -0
- package/dist/util/frameworkPort.d.ts +12 -0
- package/dist/util/frameworkPort.js +61 -0
- package/dist/util/frameworkPort.js.map +1 -0
- package/dist/util/fsUtils.d.ts +2 -0
- package/dist/util/fsUtils.js +34 -0
- package/dist/util/fsUtils.js.map +1 -0
- package/dist/util/getProjectDefaults.d.ts +11 -0
- package/dist/util/getProjectDefaults.js +77 -0
- package/dist/util/getProjectDefaults.js.map +1 -0
- package/dist/util/isStaging.d.ts +7 -0
- package/dist/util/isStaging.js +10 -0
- package/dist/util/isStaging.js.map +1 -0
- package/dist/util/packageManager/packageManagerChoice.d.ts +2 -0
- package/dist/util/packageManager/packageManagerChoice.js +8 -0
- package/dist/util/packageManager/packageManagerChoice.js.map +1 -1
- package/dist/util/parseArguments.d.ts +35 -0
- package/dist/util/parseArguments.js +42 -0
- package/dist/util/parseArguments.js.map +1 -0
- package/dist/util/readdirRecursive.d.ts +5 -0
- package/dist/util/readdirRecursive.js +24 -0
- package/dist/util/readdirRecursive.js.map +1 -0
- package/dist/util/resolveLatestVersions.d.ts +7 -0
- package/dist/util/resolveLatestVersions.js +21 -0
- package/dist/util/resolveLatestVersions.js.map +1 -0
- package/oclif.manifest.json +154 -141
- package/package.json +26 -14
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { confirm, input, select } from '@sanity/cli-core/ux';
|
|
2
|
+
export function promptForEmbeddedStudio() {
|
|
3
|
+
return confirm({
|
|
4
|
+
default: true,
|
|
5
|
+
message: `Would you like an embedded Sanity Studio?`
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
export function promptForStudioPath() {
|
|
9
|
+
return input({
|
|
10
|
+
default: '/studio',
|
|
11
|
+
message: 'What route do you want to use for the Studio?',
|
|
12
|
+
validate (input) {
|
|
13
|
+
if (!input.startsWith('/')) {
|
|
14
|
+
return 'Must start with /';
|
|
15
|
+
}
|
|
16
|
+
if (input.endsWith('/')) {
|
|
17
|
+
return 'Must not end with /';
|
|
18
|
+
}
|
|
19
|
+
// a-Z, 0-9, -, _ and /
|
|
20
|
+
if (!/^[a-zA-Z0-9-_\\/]+$/.test(input)) {
|
|
21
|
+
return 'Must only contain a-Z, 0-9, -, _ and /';
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export function promptForNextTemplate() {
|
|
28
|
+
return select({
|
|
29
|
+
choices: [
|
|
30
|
+
{
|
|
31
|
+
name: 'Blog (schema)',
|
|
32
|
+
value: 'blog'
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'Clean project with no predefined schema types',
|
|
36
|
+
value: 'clean'
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
default: 'blog',
|
|
40
|
+
message: 'Select project template to use'
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
export function promptForAppendEnv(envFilename) {
|
|
44
|
+
return confirm({
|
|
45
|
+
default: true,
|
|
46
|
+
message: `Would you like to add the project ID and dataset to your ${envFilename} file?`
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export function promptForConfigFiles() {
|
|
50
|
+
return confirm({
|
|
51
|
+
default: true,
|
|
52
|
+
message: 'Would you like to add configuration files for a Sanity project in this Next.js folder?'
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=nextjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/init/nextjs.ts"],"sourcesContent":["import {confirm, input, select} from '@sanity/cli-core/ux'\n\nexport function promptForEmbeddedStudio(): Promise<boolean> {\n return confirm({\n default: true,\n message: `Would you like an embedded Sanity Studio?`,\n })\n}\n\nexport function promptForStudioPath(): Promise<string> {\n return input({\n default: '/studio',\n message: 'What route do you want to use for the Studio?',\n validate(input) {\n if (!input.startsWith('/')) {\n return 'Must start with /'\n }\n\n if (input.endsWith('/')) {\n return 'Must not end with /'\n }\n\n // a-Z, 0-9, -, _ and /\n if (!/^[a-zA-Z0-9-_\\\\/]+$/.test(input)) {\n return 'Must only contain a-Z, 0-9, -, _ and /'\n }\n\n return true\n },\n })\n}\n\nexport function promptForNextTemplate(): Promise<'blog' | 'clean'> {\n return select({\n choices: [\n {\n name: 'Blog (schema)',\n value: 'blog',\n },\n {\n name: 'Clean project with no predefined schema types',\n value: 'clean',\n },\n ],\n default: 'blog',\n message: 'Select project template to use',\n })\n}\n\nexport function promptForAppendEnv(envFilename: string): Promise<boolean> {\n return confirm({\n default: true,\n message: `Would you like to add the project ID and dataset to your ${envFilename} file?`,\n })\n}\n\nexport function promptForConfigFiles() {\n return confirm({\n default: true,\n message:\n 'Would you like to add configuration files for a Sanity project in this Next.js folder?',\n })\n}\n"],"names":["confirm","input","select","promptForEmbeddedStudio","default","message","promptForStudioPath","validate","startsWith","endsWith","test","promptForNextTemplate","choices","name","value","promptForAppendEnv","envFilename","promptForConfigFiles"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,KAAK,EAAEC,MAAM,QAAO,sBAAqB;AAE1D,OAAO,SAASC;IACd,OAAOH,QAAQ;QACbI,SAAS;QACTC,SAAS,CAAC,yCAAyC,CAAC;IACtD;AACF;AAEA,OAAO,SAASC;IACd,OAAOL,MAAM;QACXG,SAAS;QACTC,SAAS;QACTE,UAASN,KAAK;YACZ,IAAI,CAACA,MAAMO,UAAU,CAAC,MAAM;gBAC1B,OAAO;YACT;YAEA,IAAIP,MAAMQ,QAAQ,CAAC,MAAM;gBACvB,OAAO;YACT;YAEA,uBAAuB;YACvB,IAAI,CAAC,sBAAsBC,IAAI,CAACT,QAAQ;gBACtC,OAAO;YACT;YAEA,OAAO;QACT;IACF;AACF;AAEA,OAAO,SAASU;IACd,OAAOT,OAAO;QACZU,SAAS;YACP;gBACEC,MAAM;gBACNC,OAAO;YACT;YACA;gBACED,MAAM;gBACNC,OAAO;YACT;SACD;QACDV,SAAS;QACTC,SAAS;IACX;AACF;AAEA,OAAO,SAASU,mBAAmBC,WAAmB;IACpD,OAAOhB,QAAQ;QACbI,SAAS;QACTC,SAAS,CAAC,yDAAyD,EAAEW,YAAY,MAAM,CAAC;IAC1F;AACF;AAEA,OAAO,SAASC;IACd,OAAOjB,QAAQ;QACbI,SAAS;QACTC,SACE;IACJ;AACF"}
|
|
@@ -5,11 +5,5 @@ export function promptForTypeScript() {
|
|
|
5
5
|
message: 'Do you want to use TypeScript?'
|
|
6
6
|
});
|
|
7
7
|
}
|
|
8
|
-
export function promptImplicitReconfigure() {
|
|
9
|
-
return confirm({
|
|
10
|
-
default: true,
|
|
11
|
-
message: 'The current folder contains a configured Sanity studio. Would you like to reconfigure it?'
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
8
|
|
|
15
9
|
//# sourceMappingURL=promptForTypescript.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/prompts/init/promptForTypescript.ts"],"sourcesContent":["import {confirm} from '@sanity/cli-core/ux'\n\nexport function promptForTypeScript(): Promise<boolean> {\n return confirm({\n default: true,\n message: 'Do you want to use TypeScript?',\n })\n}\n
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/init/promptForTypescript.ts"],"sourcesContent":["import {confirm} from '@sanity/cli-core/ux'\n\nexport function promptForTypeScript(): Promise<boolean> {\n return confirm({\n default: true,\n message: 'Do you want to use TypeScript?',\n })\n}\n"],"names":["confirm","promptForTypeScript","default","message"],"mappings":"AAAA,SAAQA,OAAO,QAAO,sBAAqB;AAE3C,OAAO,SAASC;IACd,OAAOD,QAAQ;QACbE,SAAS;QACTC,SAAS;IACX;AACF"}
|
package/dist/services/mcp.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const MCP_API_VERSION = "2025-12-09";
|
|
2
2
|
export declare const MCP_SERVER_URL = "https://mcp.sanity.io";
|
|
3
|
+
export declare const MCP_JOURNEY_API_VERSION = "v2024-02-23";
|
|
3
4
|
type EditorName = 'Claude Code' | 'Cursor' | 'VS Code';
|
|
4
5
|
export interface Editor {
|
|
5
6
|
configKey: 'mcpServers' | 'servers';
|
|
@@ -17,6 +18,9 @@ interface ServerConfig {
|
|
|
17
18
|
type: 'http';
|
|
18
19
|
url: string;
|
|
19
20
|
}
|
|
21
|
+
interface PostInitPromptResponse {
|
|
22
|
+
message?: string;
|
|
23
|
+
}
|
|
20
24
|
/**
|
|
21
25
|
* Create a child token for MCP usage
|
|
22
26
|
* This token is tied to the parent CLI token and will be invalidated
|
|
@@ -26,4 +30,10 @@ interface ServerConfig {
|
|
|
26
30
|
* @internal
|
|
27
31
|
*/
|
|
28
32
|
export declare function createMCPToken(): Promise<string>;
|
|
33
|
+
/**
|
|
34
|
+
* Fetches the post-init MCP prompt from the Journey API and interpolates editor names.
|
|
35
|
+
* Falls back to a hardcoded default if the API call fails, times out, or returns empty.
|
|
36
|
+
* Text wrapped in **markers** will be formatted with cyan color.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getPostInitPrompt(): Promise<PostInitPromptResponse | null>;
|
|
29
39
|
export {};
|
package/dist/services/mcp.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getGlobalCliClient } from '@sanity/cli-core';
|
|
2
2
|
export const MCP_API_VERSION = '2025-12-09';
|
|
3
3
|
export const MCP_SERVER_URL = 'https://mcp.sanity.io';
|
|
4
|
+
export const MCP_JOURNEY_API_VERSION = 'v2024-02-23';
|
|
4
5
|
/**
|
|
5
6
|
* Create a child token for MCP usage
|
|
6
7
|
* This token is tied to the parent CLI token and will be invalidated
|
|
@@ -30,5 +31,20 @@ export const MCP_SERVER_URL = 'https://mcp.sanity.io';
|
|
|
30
31
|
});
|
|
31
32
|
return tokenResponse.token;
|
|
32
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Fetches the post-init MCP prompt from the Journey API and interpolates editor names.
|
|
36
|
+
* Falls back to a hardcoded default if the API call fails, times out, or returns empty.
|
|
37
|
+
* Text wrapped in **markers** will be formatted with cyan color.
|
|
38
|
+
*/ export async function getPostInitPrompt() {
|
|
39
|
+
const client = await getGlobalCliClient({
|
|
40
|
+
apiVersion: MCP_JOURNEY_API_VERSION,
|
|
41
|
+
requireUser: false
|
|
42
|
+
});
|
|
43
|
+
return await client.request({
|
|
44
|
+
method: 'GET',
|
|
45
|
+
timeout: 1000,
|
|
46
|
+
uri: '/journey/mcp/post-init-prompt'
|
|
47
|
+
});
|
|
48
|
+
}
|
|
33
49
|
|
|
34
50
|
//# sourceMappingURL=mcp.js.map
|
package/dist/services/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/mcp.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\n\nexport const MCP_API_VERSION = '2025-12-09'\nexport const MCP_SERVER_URL = 'https://mcp.sanity.io'\n\ntype EditorName = 'Claude Code' | 'Cursor' | 'VS Code'\n\nexport interface Editor {\n configKey: 'mcpServers' | 'servers'\n configPath: string\n name: EditorName\n}\n\nexport interface MCPConfig {\n mcpServers?: Record<string, ServerConfig>\n servers?: Record<string, ServerConfig>\n}\n\ninterface ServerConfig {\n headers: {\n Authorization: string\n }\n type: 'http'\n url: string\n}\n\n/**\n * Create a child token for MCP usage\n * This token is tied to the parent CLI token and will be invalidated\n * when the parent token is invalidated (e.g., on logout)\n *\n * @returns The MCP token string\n * @internal\n */\nexport async function createMCPToken(): Promise<string> {\n const client = await getGlobalCliClient({\n apiVersion: MCP_API_VERSION,\n requireUser: true,\n })\n\n const sessionResponse = await client.request<{id: string; sid: string}>({\n body: {\n sourceId: 'sanity-mcp',\n withStamp: false,\n },\n method: 'POST',\n uri: '/auth/session/create',\n })\n\n const tokenResponse = await client.request<{label: string; token: string}>({\n method: 'GET',\n query: {sid: sessionResponse.sid},\n uri: '/auth/fetch',\n })\n\n return tokenResponse.token\n}\n"],"names":["getGlobalCliClient","MCP_API_VERSION","MCP_SERVER_URL","createMCPToken","client","apiVersion","requireUser","sessionResponse","request","body","sourceId","withStamp","method","uri","tokenResponse","query","sid","token"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AAEnD,OAAO,MAAMC,kBAAkB,aAAY;AAC3C,OAAO,MAAMC,iBAAiB,wBAAuB;
|
|
1
|
+
{"version":3,"sources":["../../src/services/mcp.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\n\nexport const MCP_API_VERSION = '2025-12-09'\nexport const MCP_SERVER_URL = 'https://mcp.sanity.io'\nexport const MCP_JOURNEY_API_VERSION = 'v2024-02-23'\n\ntype EditorName = 'Claude Code' | 'Cursor' | 'VS Code'\n\nexport interface Editor {\n configKey: 'mcpServers' | 'servers'\n configPath: string\n name: EditorName\n}\n\nexport interface MCPConfig {\n mcpServers?: Record<string, ServerConfig>\n servers?: Record<string, ServerConfig>\n}\n\ninterface ServerConfig {\n headers: {\n Authorization: string\n }\n type: 'http'\n url: string\n}\n\ninterface PostInitPromptResponse {\n message?: string\n}\n\n/**\n * Create a child token for MCP usage\n * This token is tied to the parent CLI token and will be invalidated\n * when the parent token is invalidated (e.g., on logout)\n *\n * @returns The MCP token string\n * @internal\n */\nexport async function createMCPToken(): Promise<string> {\n const client = await getGlobalCliClient({\n apiVersion: MCP_API_VERSION,\n requireUser: true,\n })\n\n const sessionResponse = await client.request<{id: string; sid: string}>({\n body: {\n sourceId: 'sanity-mcp',\n withStamp: false,\n },\n method: 'POST',\n uri: '/auth/session/create',\n })\n\n const tokenResponse = await client.request<{label: string; token: string}>({\n method: 'GET',\n query: {sid: sessionResponse.sid},\n uri: '/auth/fetch',\n })\n\n return tokenResponse.token\n}\n\n/**\n * Fetches the post-init MCP prompt from the Journey API and interpolates editor names.\n * Falls back to a hardcoded default if the API call fails, times out, or returns empty.\n * Text wrapped in **markers** will be formatted with cyan color.\n */\nexport async function getPostInitPrompt() {\n const client = await getGlobalCliClient({apiVersion: MCP_JOURNEY_API_VERSION, requireUser: false})\n return await client.request<PostInitPromptResponse | null>({\n method: 'GET',\n timeout: 1000,\n uri: '/journey/mcp/post-init-prompt',\n })\n}\n"],"names":["getGlobalCliClient","MCP_API_VERSION","MCP_SERVER_URL","MCP_JOURNEY_API_VERSION","createMCPToken","client","apiVersion","requireUser","sessionResponse","request","body","sourceId","withStamp","method","uri","tokenResponse","query","sid","token","getPostInitPrompt","timeout"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AAEnD,OAAO,MAAMC,kBAAkB,aAAY;AAC3C,OAAO,MAAMC,iBAAiB,wBAAuB;AACrD,OAAO,MAAMC,0BAA0B,cAAa;AA2BpD;;;;;;;CAOC,GACD,OAAO,eAAeC;IACpB,MAAMC,SAAS,MAAML,mBAAmB;QACtCM,YAAYL;QACZM,aAAa;IACf;IAEA,MAAMC,kBAAkB,MAAMH,OAAOI,OAAO,CAA4B;QACtEC,MAAM;YACJC,UAAU;YACVC,WAAW;QACb;QACAC,QAAQ;QACRC,KAAK;IACP;IAEA,MAAMC,gBAAgB,MAAMV,OAAOI,OAAO,CAAiC;QACzEI,QAAQ;QACRG,OAAO;YAACC,KAAKT,gBAAgBS,GAAG;QAAA;QAChCH,KAAK;IACP;IAEA,OAAOC,cAAcG,KAAK;AAC5B;AAEA;;;;CAIC,GACD,OAAO,eAAeC;IACpB,MAAMd,SAAS,MAAML,mBAAmB;QAACM,YAAYH;QAAyBI,aAAa;IAAK;IAChG,OAAO,MAAMF,OAAOI,OAAO,CAAgC;QACzDI,QAAQ;QACRO,SAAS;QACTN,KAAK;IACP;AACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SanityProject } from '@sanity/client';
|
|
1
2
|
import { type Invite, type Role } from '../actions/users/types.js';
|
|
2
3
|
export declare const PROJECTS_API_VERSION = "2025-09-22";
|
|
3
4
|
export declare const CREATE_PROJECT_API_VERSION = "v2025-05-14";
|
|
@@ -20,7 +21,7 @@ export interface CreateProjectResult {
|
|
|
20
21
|
* Create a new Sanity project
|
|
21
22
|
*/
|
|
22
23
|
export declare function createProject(options: CreateProjectOptions): Promise<CreateProjectResult>;
|
|
23
|
-
export declare function getProjectById(projectId: string): Promise<
|
|
24
|
+
export declare function getProjectById(projectId: string): Promise<SanityProject>;
|
|
24
25
|
export declare function getProjectRoles(projectId: string): Promise<Role[]>;
|
|
25
26
|
interface InviteUserOptions {
|
|
26
27
|
email: string;
|
|
@@ -28,6 +29,8 @@ interface InviteUserOptions {
|
|
|
28
29
|
role: string;
|
|
29
30
|
}
|
|
30
31
|
export declare function inviteUser({ email, projectId, role }: InviteUserOptions): Promise<any>;
|
|
31
|
-
export declare function listProjects(): Promise<
|
|
32
|
+
export declare function listProjects(): Promise<SanityProject[]>;
|
|
32
33
|
export declare function getProjectInvites(projectId: string): Promise<Invite[]>;
|
|
34
|
+
export declare function updateProjectInitializedAt(projectId: string): Promise<void>;
|
|
35
|
+
export declare function updateProjectInitalTemplate(projectId: string, templateName: string): Promise<void>;
|
|
33
36
|
export {};
|
|
@@ -78,5 +78,42 @@ export async function getProjectInvites(projectId) {
|
|
|
78
78
|
uri: `/invitations/project/${projectId}`
|
|
79
79
|
});
|
|
80
80
|
}
|
|
81
|
+
export async function updateProjectInitializedAt(projectId) {
|
|
82
|
+
const client = await getProjectCliClient({
|
|
83
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
84
|
+
projectId,
|
|
85
|
+
requireUser: true
|
|
86
|
+
});
|
|
87
|
+
const project = await client.request({
|
|
88
|
+
uri: `/projects/${projectId}`
|
|
89
|
+
});
|
|
90
|
+
if (!project?.metadata?.cliInitializedAt) {
|
|
91
|
+
await client.request({
|
|
92
|
+
body: {
|
|
93
|
+
metadata: {
|
|
94
|
+
cliInitializedAt: new Date().toISOString()
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
method: 'PATCH',
|
|
98
|
+
uri: `/projects/${projectId}`
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export async function updateProjectInitalTemplate(projectId, templateName) {
|
|
103
|
+
const client = await getProjectCliClient({
|
|
104
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
105
|
+
projectId,
|
|
106
|
+
requireUser: true
|
|
107
|
+
});
|
|
108
|
+
await client.request({
|
|
109
|
+
body: {
|
|
110
|
+
metadata: {
|
|
111
|
+
initialTemplate: templateName
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
method: 'PATCH',
|
|
115
|
+
uri: `/projects/${projectId}`
|
|
116
|
+
});
|
|
117
|
+
}
|
|
81
118
|
|
|
82
119
|
//# sourceMappingURL=projects.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/projects.ts"],"sourcesContent":["import {debug, getGlobalCliClient, getProjectCliClient} from '@sanity/cli-core'\n\nimport {type Invite, type Role} from '../actions/users/types.js'\n\nexport const PROJECTS_API_VERSION = '2025-09-22'\n\nexport const CREATE_PROJECT_API_VERSION = 'v2025-05-14'\n\nexport interface CreateProjectOptions {\n displayName: string\n\n metadata?: {\n coupon?: string\n integration?: string\n }\n organizationId?: string\n subscription?: {planId: string}\n}\n\nexport interface CreateProjectResult {\n displayName: string\n projectId: string\n}\n\n/**\n * Create a new Sanity project\n */\nexport async function createProject(options: CreateProjectOptions): Promise<CreateProjectResult> {\n const client = await getGlobalCliClient({\n apiVersion: CREATE_PROJECT_API_VERSION,\n requireUser: true,\n })\n\n try {\n const response = await client.request({\n body: {\n ...options,\n metadata: {\n ...options?.metadata,\n integration: 'cli',\n },\n },\n method: 'POST',\n uri: '/projects',\n })\n\n return {\n displayName: options.displayName || '',\n projectId: response.projectId || response.id,\n }\n } catch (err) {\n debug('Error creating project', err)\n throw err\n }\n}\n\nexport async function getProjectById(projectId: string) {\n const client = await getProjectCliClient({\n apiVersion: PROJECTS_API_VERSION,\n projectId,\n requireUser: true,\n })\n\n return client.projects.getById(projectId)\n}\n\nexport async function getProjectRoles(projectId: string) {\n const client = await getGlobalCliClient({\n apiVersion: PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<Role[]>({uri: `/projects/${projectId}/roles`})\n}\n\ninterface InviteUserOptions {\n email: string\n projectId: string\n role: string\n}\n\nexport async function inviteUser({email, projectId, role}: InviteUserOptions) {\n const client = await getGlobalCliClient({\n apiVersion: PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n return client.request({\n body: {email, role},\n maxRedirects: 0,\n method: 'POST',\n uri: `/invitations/project/${projectId}`,\n useGlobalApi: true,\n })\n}\n\nexport async function listProjects() {\n const client = await getGlobalCliClient({\n apiVersion: PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n return client.projects.list()\n}\n\nexport async function getProjectInvites(projectId: string) {\n const client = await getGlobalCliClient({\n apiVersion: PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<Invite[]>({uri: `/invitations/project/${projectId}`})\n}\n"],"names":["debug","getGlobalCliClient","getProjectCliClient","PROJECTS_API_VERSION","CREATE_PROJECT_API_VERSION","createProject","options","client","apiVersion","requireUser","response","request","body","metadata","integration","method","uri","displayName","projectId","id","err","getProjectById","projects","getById","getProjectRoles","inviteUser","email","role","maxRedirects","useGlobalApi","listProjects","list","getProjectInvites"],"mappings":"AAAA,SAAQA,KAAK,EAAEC,kBAAkB,EAAEC,mBAAmB,QAAO,mBAAkB;
|
|
1
|
+
{"version":3,"sources":["../../src/services/projects.ts"],"sourcesContent":["import {debug, getGlobalCliClient, getProjectCliClient} from '@sanity/cli-core'\nimport {SanityProject} from '@sanity/client'\n\nimport {type Invite, type Role} from '../actions/users/types.js'\n\nexport const PROJECTS_API_VERSION = '2025-09-22'\n\nexport const CREATE_PROJECT_API_VERSION = 'v2025-05-14'\n\nexport interface CreateProjectOptions {\n displayName: string\n\n metadata?: {\n coupon?: string\n integration?: string\n }\n organizationId?: string\n subscription?: {planId: string}\n}\n\nexport interface CreateProjectResult {\n displayName: string\n projectId: string\n}\n\n/**\n * Create a new Sanity project\n */\nexport async function createProject(options: CreateProjectOptions): Promise<CreateProjectResult> {\n const client = await getGlobalCliClient({\n apiVersion: CREATE_PROJECT_API_VERSION,\n requireUser: true,\n })\n\n try {\n const response = await client.request({\n body: {\n ...options,\n metadata: {\n ...options?.metadata,\n integration: 'cli',\n },\n },\n method: 'POST',\n uri: '/projects',\n })\n\n return {\n displayName: options.displayName || '',\n projectId: response.projectId || response.id,\n }\n } catch (err) {\n debug('Error creating project', err)\n throw err\n }\n}\n\nexport async function getProjectById(projectId: string) {\n const client = await getProjectCliClient({\n apiVersion: PROJECTS_API_VERSION,\n projectId,\n requireUser: true,\n })\n\n return client.projects.getById(projectId)\n}\n\nexport async function getProjectRoles(projectId: string) {\n const client = await getGlobalCliClient({\n apiVersion: PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<Role[]>({uri: `/projects/${projectId}/roles`})\n}\n\ninterface InviteUserOptions {\n email: string\n projectId: string\n role: string\n}\n\nexport async function inviteUser({email, projectId, role}: InviteUserOptions) {\n const client = await getGlobalCliClient({\n apiVersion: PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n return client.request({\n body: {email, role},\n maxRedirects: 0,\n method: 'POST',\n uri: `/invitations/project/${projectId}`,\n useGlobalApi: true,\n })\n}\n\nexport async function listProjects() {\n const client = await getGlobalCliClient({\n apiVersion: PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n return client.projects.list()\n}\n\nexport async function getProjectInvites(projectId: string) {\n const client = await getGlobalCliClient({\n apiVersion: PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<Invite[]>({uri: `/invitations/project/${projectId}`})\n}\n\nexport async function updateProjectInitializedAt(projectId: string) {\n const client = await getProjectCliClient({\n apiVersion: PROJECTS_API_VERSION,\n projectId,\n requireUser: true,\n })\n\n const project = await client.request<SanityProject>({uri: `/projects/${projectId}`})\n\n if (!project?.metadata?.cliInitializedAt) {\n await client.request({\n body: {metadata: {cliInitializedAt: new Date().toISOString()}},\n method: 'PATCH',\n uri: `/projects/${projectId}`,\n })\n }\n}\n\nexport async function updateProjectInitalTemplate(projectId: string, templateName: string) {\n const client = await getProjectCliClient({\n apiVersion: PROJECTS_API_VERSION,\n projectId,\n requireUser: true,\n })\n\n await client.request({\n body: {metadata: {initialTemplate: templateName}},\n method: 'PATCH',\n uri: `/projects/${projectId}`,\n })\n}\n"],"names":["debug","getGlobalCliClient","getProjectCliClient","PROJECTS_API_VERSION","CREATE_PROJECT_API_VERSION","createProject","options","client","apiVersion","requireUser","response","request","body","metadata","integration","method","uri","displayName","projectId","id","err","getProjectById","projects","getById","getProjectRoles","inviteUser","email","role","maxRedirects","useGlobalApi","listProjects","list","getProjectInvites","updateProjectInitializedAt","project","cliInitializedAt","Date","toISOString","updateProjectInitalTemplate","templateName","initialTemplate"],"mappings":"AAAA,SAAQA,KAAK,EAAEC,kBAAkB,EAAEC,mBAAmB,QAAO,mBAAkB;AAK/E,OAAO,MAAMC,uBAAuB,aAAY;AAEhD,OAAO,MAAMC,6BAA6B,cAAa;AAkBvD;;CAEC,GACD,OAAO,eAAeC,cAAcC,OAA6B;IAC/D,MAAMC,SAAS,MAAMN,mBAAmB;QACtCO,YAAYJ;QACZK,aAAa;IACf;IAEA,IAAI;QACF,MAAMC,WAAW,MAAMH,OAAOI,OAAO,CAAC;YACpCC,MAAM;gBACJ,GAAGN,OAAO;gBACVO,UAAU;oBACR,GAAGP,SAASO,QAAQ;oBACpBC,aAAa;gBACf;YACF;YACAC,QAAQ;YACRC,KAAK;QACP;QAEA,OAAO;YACLC,aAAaX,QAAQW,WAAW,IAAI;YACpCC,WAAWR,SAASQ,SAAS,IAAIR,SAASS,EAAE;QAC9C;IACF,EAAE,OAAOC,KAAK;QACZpB,MAAM,0BAA0BoB;QAChC,MAAMA;IACR;AACF;AAEA,OAAO,eAAeC,eAAeH,SAAiB;IACpD,MAAMX,SAAS,MAAML,oBAAoB;QACvCM,YAAYL;QACZe;QACAT,aAAa;IACf;IAEA,OAAOF,OAAOe,QAAQ,CAACC,OAAO,CAACL;AACjC;AAEA,OAAO,eAAeM,gBAAgBN,SAAiB;IACrD,MAAMX,SAAS,MAAMN,mBAAmB;QACtCO,YAAYL;QACZM,aAAa;IACf;IAEA,OAAOF,OAAOI,OAAO,CAAS;QAACK,KAAK,CAAC,UAAU,EAAEE,UAAU,MAAM,CAAC;IAAA;AACpE;AAQA,OAAO,eAAeO,WAAW,EAACC,KAAK,EAAER,SAAS,EAAES,IAAI,EAAoB;IAC1E,MAAMpB,SAAS,MAAMN,mBAAmB;QACtCO,YAAYL;QACZM,aAAa;IACf;IAEA,OAAOF,OAAOI,OAAO,CAAC;QACpBC,MAAM;YAACc;YAAOC;QAAI;QAClBC,cAAc;QACdb,QAAQ;QACRC,KAAK,CAAC,qBAAqB,EAAEE,WAAW;QACxCW,cAAc;IAChB;AACF;AAEA,OAAO,eAAeC;IACpB,MAAMvB,SAAS,MAAMN,mBAAmB;QACtCO,YAAYL;QACZM,aAAa;IACf;IAEA,OAAOF,OAAOe,QAAQ,CAACS,IAAI;AAC7B;AAEA,OAAO,eAAeC,kBAAkBd,SAAiB;IACvD,MAAMX,SAAS,MAAMN,mBAAmB;QACtCO,YAAYL;QACZM,aAAa;IACf;IAEA,OAAOF,OAAOI,OAAO,CAAW;QAACK,KAAK,CAAC,qBAAqB,EAAEE,WAAW;IAAA;AAC3E;AAEA,OAAO,eAAee,2BAA2Bf,SAAiB;IAChE,MAAMX,SAAS,MAAML,oBAAoB;QACvCM,YAAYL;QACZe;QACAT,aAAa;IACf;IAEA,MAAMyB,UAAU,MAAM3B,OAAOI,OAAO,CAAgB;QAACK,KAAK,CAAC,UAAU,EAAEE,WAAW;IAAA;IAElF,IAAI,CAACgB,SAASrB,UAAUsB,kBAAkB;QACxC,MAAM5B,OAAOI,OAAO,CAAC;YACnBC,MAAM;gBAACC,UAAU;oBAACsB,kBAAkB,IAAIC,OAAOC,WAAW;gBAAE;YAAC;YAC7DtB,QAAQ;YACRC,KAAK,CAAC,UAAU,EAAEE,WAAW;QAC/B;IACF;AACF;AAEA,OAAO,eAAeoB,4BAA4BpB,SAAiB,EAAEqB,YAAoB;IACvF,MAAMhC,SAAS,MAAML,oBAAoB;QACvCM,YAAYL;QACZe;QACAT,aAAa;IACf;IAEA,MAAMF,OAAOI,OAAO,CAAC;QACnBC,MAAM;YAACC,UAAU;gBAAC2B,iBAAiBD;YAAY;QAAC;QAChDxB,QAAQ;QACRC,KAAK,CAAC,UAAU,EAAEE,WAAW;IAC/B;AACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { getGlobalCliClient } from '@sanity/cli-core';
|
|
2
|
+
const TELEMETRY_API_VERSION = 'v2023-12-18';
|
|
3
|
+
export async function sendEvents(batch) {
|
|
4
|
+
const client = await getGlobalCliClient({
|
|
5
|
+
apiVersion: TELEMETRY_API_VERSION,
|
|
6
|
+
requireUser: true
|
|
7
|
+
});
|
|
8
|
+
const projectId = process.env.SANITY_TELEMETRY_PROJECT_ID;
|
|
9
|
+
return client.request({
|
|
10
|
+
body: {
|
|
11
|
+
batch,
|
|
12
|
+
projectId
|
|
13
|
+
},
|
|
14
|
+
json: true,
|
|
15
|
+
method: 'POST',
|
|
16
|
+
uri: '/intake/batch'
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/telemetry.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\nimport {type TelemetryEvent} from '@sanity/telemetry'\n\nconst TELEMETRY_API_VERSION = 'v2023-12-18'\n\nexport async function sendEvents(batch: TelemetryEvent[]) {\n const client = await getGlobalCliClient({\n apiVersion: TELEMETRY_API_VERSION,\n requireUser: true,\n })\n\n const projectId = process.env.SANITY_TELEMETRY_PROJECT_ID\n\n return client.request({\n body: {batch, projectId},\n json: true,\n method: 'POST',\n uri: '/intake/batch',\n })\n}\n"],"names":["getGlobalCliClient","TELEMETRY_API_VERSION","sendEvents","batch","client","apiVersion","requireUser","projectId","process","env","SANITY_TELEMETRY_PROJECT_ID","request","body","json","method","uri"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AAGnD,MAAMC,wBAAwB;AAE9B,OAAO,eAAeC,WAAWC,KAAuB;IACtD,MAAMC,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,MAAMC,YAAYC,QAAQC,GAAG,CAACC,2BAA2B;IAEzD,OAAON,OAAOO,OAAO,CAAC;QACpBC,MAAM;YAACT;YAAOI;QAAS;QACvBM,MAAM;QACNC,QAAQ;QACRC,KAAK;IACP;AACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const studioDependencies: {
|
|
2
|
+
dependencies: {
|
|
3
|
+
sanity: string;
|
|
4
|
+
'@sanity/vision': string;
|
|
5
|
+
react: string;
|
|
6
|
+
'react-dom': string;
|
|
7
|
+
'styled-components': string;
|
|
8
|
+
};
|
|
9
|
+
devDependencies: {
|
|
10
|
+
'@sanity/eslint-config-studio': string;
|
|
11
|
+
'@types/react': string;
|
|
12
|
+
eslint: string;
|
|
13
|
+
prettier: string;
|
|
14
|
+
typescript: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const studioDependencies = {
|
|
2
|
+
// Dependencies for a default Sanity installation
|
|
3
|
+
dependencies: {
|
|
4
|
+
// Official studio dependencies
|
|
5
|
+
sanity: 'latest',
|
|
6
|
+
// Official studio plugin dependencies
|
|
7
|
+
'@sanity/vision': 'latest',
|
|
8
|
+
// Non-Sanity dependencies
|
|
9
|
+
react: '^19.1',
|
|
10
|
+
'react-dom': '^19.1',
|
|
11
|
+
'styled-components': '^6.1.18'
|
|
12
|
+
},
|
|
13
|
+
devDependencies: {
|
|
14
|
+
// Linting/tooling
|
|
15
|
+
'@sanity/eslint-config-studio': 'latest',
|
|
16
|
+
// When using typescript, we'll want the these types too, so might as well install them
|
|
17
|
+
'@types/react': '^19.1',
|
|
18
|
+
eslint: '^9.28',
|
|
19
|
+
prettier: '^3.5',
|
|
20
|
+
typescript: '^5.8'
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=studioDependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/studioDependencies.ts"],"sourcesContent":["export const studioDependencies = {\n // Dependencies for a default Sanity installation\n dependencies: {\n // Official studio dependencies\n sanity: 'latest',\n\n // Official studio plugin dependencies\n '@sanity/vision': 'latest',\n\n // Non-Sanity dependencies\n react: '^19.1',\n 'react-dom': '^19.1',\n 'styled-components': '^6.1.18',\n },\n\n devDependencies: {\n // Linting/tooling\n '@sanity/eslint-config-studio': 'latest',\n // When using typescript, we'll want the these types too, so might as well install them\n '@types/react': '^19.1',\n eslint: '^9.28',\n prettier: '^3.5',\n typescript: '^5.8', // Peer dependency of eslint-config-studio (implicitly)\n },\n}\n"],"names":["studioDependencies","dependencies","sanity","react","devDependencies","eslint","prettier","typescript"],"mappings":"AAAA,OAAO,MAAMA,qBAAqB;IAChC,iDAAiD;IACjDC,cAAc;QACZ,+BAA+B;QAC/BC,QAAQ;QAER,sCAAsC;QACtC,kBAAkB;QAElB,0BAA0B;QAC1BC,OAAO;QACP,aAAa;QACb,qBAAqB;IACvB;IAEAC,iBAAiB;QACf,kBAAkB;QAClB,gCAAgC;QAChC,uFAAuF;QACvF,gBAAgB;QAChBC,QAAQ;QACRC,UAAU;QACVC,YAAY;IACd;AACF,EAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface CLITraceData {
|
|
2
|
+
/**
|
|
3
|
+
* Command arguments, eg any arguments after `sanity <command>` (no flags)
|
|
4
|
+
*/
|
|
5
|
+
commandArguments: string[];
|
|
6
|
+
coreOptions: {
|
|
7
|
+
debug?: boolean;
|
|
8
|
+
help?: boolean;
|
|
9
|
+
version?: boolean;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Arguments after the ended argument list (--)
|
|
13
|
+
*/
|
|
14
|
+
extraArguments: string[];
|
|
15
|
+
/**
|
|
16
|
+
* Command flags, without the core options (help, debug, version etc)
|
|
17
|
+
*/
|
|
18
|
+
groupOrCommand: string;
|
|
19
|
+
}
|
|
20
|
+
export declare const CliCommandTelemetry: import("@sanity/telemetry").DefinedTelemetryTrace<CLITraceData, void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/telemetry/cli.telemetry.ts"],"sourcesContent":["import {defineTrace} from '@sanity/telemetry'\n\nexport interface CLITraceData {\n /**\n * Command arguments, eg any arguments after `sanity <command>` (no flags)\n */\n commandArguments: string[]\n\n coreOptions: {\n debug?: boolean\n help?: boolean\n version?: boolean\n }\n\n /**\n * Arguments after the ended argument list (--)\n */\n extraArguments: string[]\n /**\n * Command flags, without the core options (help, debug, version etc)\n */\n groupOrCommand: string\n}\n\nexport const CliCommandTelemetry = defineTrace<CLITraceData>({\n description: 'A CLI command was executed',\n name: 'CLI Command Executed',\n version: 1,\n})\n"],"names":["defineTrace","CliCommandTelemetry","description","name","version"],"mappings":"AAAA,SAAQA,WAAW,QAAO,oBAAmB;AAwB7C,OAAO,MAAMC,sBAAsBD,YAA0B;IAC3DE,aAAa;IACbC,MAAM;IACNC,SAAS;AACX,GAAE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { rm, stat } from 'node:fs/promises';
|
|
2
|
+
import { telemetryStoreDebug } from './debug.js';
|
|
3
|
+
import { findTelemetryFiles } from './findTelemetryFiles.js';
|
|
4
|
+
/**
|
|
5
|
+
* Cleans up telemetry files older than the specified number of days
|
|
6
|
+
* @internal
|
|
7
|
+
*/ export async function cleanupOldTelemetryFiles(maxAgeDays = 7) {
|
|
8
|
+
try {
|
|
9
|
+
const files = await findTelemetryFiles();
|
|
10
|
+
const cutoffTime = Date.now() - maxAgeDays * 24 * 60 * 60 * 1000;
|
|
11
|
+
for (const filePath of files){
|
|
12
|
+
try {
|
|
13
|
+
const stats = await stat(filePath);
|
|
14
|
+
if (stats.mtime.getTime() < cutoffTime) {
|
|
15
|
+
telemetryStoreDebug('Cleaning up old telemetry file: %s', filePath);
|
|
16
|
+
await rm(filePath, {
|
|
17
|
+
force: true
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
} catch (error) {
|
|
21
|
+
telemetryStoreDebug('Error checking/removing old file %s: %o', filePath, error);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
} catch (error) {
|
|
25
|
+
telemetryStoreDebug('Error during cleanup: %o', error);
|
|
26
|
+
// Don't throw - cleanup is best effort
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=cleanupOldTelemetryFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/telemetry/store/cleanupOldTelemetryFiles.ts"],"sourcesContent":["import {rm, stat} from 'node:fs/promises'\n\nimport {telemetryStoreDebug} from './debug.js'\nimport {findTelemetryFiles} from './findTelemetryFiles.js'\n\n/**\n * Cleans up telemetry files older than the specified number of days\n * @internal\n */\nexport async function cleanupOldTelemetryFiles(maxAgeDays: number = 7): Promise<void> {\n try {\n const files = await findTelemetryFiles()\n const cutoffTime = Date.now() - maxAgeDays * 24 * 60 * 60 * 1000\n\n for (const filePath of files) {\n try {\n const stats = await stat(filePath)\n if (stats.mtime.getTime() < cutoffTime) {\n telemetryStoreDebug('Cleaning up old telemetry file: %s', filePath)\n await rm(filePath, {force: true})\n }\n } catch (error) {\n telemetryStoreDebug('Error checking/removing old file %s: %o', filePath, error)\n }\n }\n } catch (error) {\n telemetryStoreDebug('Error during cleanup: %o', error)\n // Don't throw - cleanup is best effort\n }\n}\n"],"names":["rm","stat","telemetryStoreDebug","findTelemetryFiles","cleanupOldTelemetryFiles","maxAgeDays","files","cutoffTime","Date","now","filePath","stats","mtime","getTime","force","error"],"mappings":"AAAA,SAAQA,EAAE,EAAEC,IAAI,QAAO,mBAAkB;AAEzC,SAAQC,mBAAmB,QAAO,aAAY;AAC9C,SAAQC,kBAAkB,QAAO,0BAAyB;AAE1D;;;CAGC,GACD,OAAO,eAAeC,yBAAyBC,aAAqB,CAAC;IACnE,IAAI;QACF,MAAMC,QAAQ,MAAMH;QACpB,MAAMI,aAAaC,KAAKC,GAAG,KAAKJ,aAAa,KAAK,KAAK,KAAK;QAE5D,KAAK,MAAMK,YAAYJ,MAAO;YAC5B,IAAI;gBACF,MAAMK,QAAQ,MAAMV,KAAKS;gBACzB,IAAIC,MAAMC,KAAK,CAACC,OAAO,KAAKN,YAAY;oBACtCL,oBAAoB,sCAAsCQ;oBAC1D,MAAMV,GAAGU,UAAU;wBAACI,OAAO;oBAAI;gBACjC;YACF,EAAE,OAAOC,OAAO;gBACdb,oBAAoB,2CAA2CQ,UAAUK;YAC3E;QACF;IACF,EAAE,OAAOA,OAAO;QACdb,oBAAoB,4BAA4Ba;IAChD,uCAAuC;IACzC;AACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type TelemetryStore } from '@sanity/telemetry';
|
|
2
|
+
import { type ConsentInformation } from '../../actions/telemetry/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* FILE MANAGEMENT STRATEGY:
|
|
5
|
+
*
|
|
6
|
+
* The telemetry system uses a multi-file approach to handle concurrent CLI processes:
|
|
7
|
+
*
|
|
8
|
+
* 1. WRITING (per session):
|
|
9
|
+
* - Each CLI session gets a unique file: telemetry-\{hash\}-\{env\}-\{sessionId\}.ndjson
|
|
10
|
+
* - Prevents write conflicts when multiple CLI commands run simultaneously
|
|
11
|
+
* - Events are written using an RxJS queue for ordered processing with retry logic
|
|
12
|
+
*
|
|
13
|
+
* 2. FLUSHING (aggregate all sessions):
|
|
14
|
+
* - findTelemetryFiles() discovers ALL telemetry files for user/environment
|
|
15
|
+
* - Events are collected from all session files and sent as a batch
|
|
16
|
+
* - Files are deleted after successful transmission
|
|
17
|
+
*
|
|
18
|
+
* 3. CLEANUP (background maintenance):
|
|
19
|
+
* - cleanupOldTelemetryFiles() removes stale files older than 7 days
|
|
20
|
+
* - Prevents disk space accumulation from abandoned sessions
|
|
21
|
+
*/
|
|
22
|
+
interface CreateTelemetryStoreOptions {
|
|
23
|
+
resolveConsent: () => Promise<ConsentInformation>;
|
|
24
|
+
}
|
|
25
|
+
type CLITelemetryStore<T> = Pick<TelemetryStore<T>, 'logger'>;
|
|
26
|
+
/**
|
|
27
|
+
* Creates a file-based telemetry store with cached consent and reliable synchronous I/O.
|
|
28
|
+
*
|
|
29
|
+
* Key optimizations:
|
|
30
|
+
* - Consent resolved once at creation and cached (vs checking on every emit)
|
|
31
|
+
* - File path generated and directory created once during initialization
|
|
32
|
+
* - Synchronous file writes to ensure events are captured even during process exit
|
|
33
|
+
*
|
|
34
|
+
* @param sessionId - Unique session identifier for file isolation
|
|
35
|
+
* @param options - Configuration options
|
|
36
|
+
* @returns TelemetryStore instance compatible with the telemetry interface
|
|
37
|
+
*/
|
|
38
|
+
export declare function createTelemetryStore<UserProperties>(sessionId: string, options: CreateTelemetryStoreOptions): CLITelemetryStore<UserProperties>;
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { appendFileSync } from 'node:fs';
|
|
2
|
+
import { mkdir } from 'node:fs/promises';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
4
|
+
import { telemetryStoreDebug } from './debug.js';
|
|
5
|
+
import { generateTelemetryFilePath } from './generateTelemetryFilePath.js';
|
|
6
|
+
import { createLogger } from './logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* Creates a file-based telemetry store with cached consent and reliable synchronous I/O.
|
|
9
|
+
*
|
|
10
|
+
* Key optimizations:
|
|
11
|
+
* - Consent resolved once at creation and cached (vs checking on every emit)
|
|
12
|
+
* - File path generated and directory created once during initialization
|
|
13
|
+
* - Synchronous file writes to ensure events are captured even during process exit
|
|
14
|
+
*
|
|
15
|
+
* @param sessionId - Unique session identifier for file isolation
|
|
16
|
+
* @param options - Configuration options
|
|
17
|
+
* @returns TelemetryStore instance compatible with the telemetry interface
|
|
18
|
+
*/ export function createTelemetryStore(sessionId, options) {
|
|
19
|
+
telemetryStoreDebug('Creating telemetry store with sessionId: %s', sessionId);
|
|
20
|
+
let cachedConsent = null;
|
|
21
|
+
let filePath = null;
|
|
22
|
+
const initializeConsent = async ()=>{
|
|
23
|
+
if (cachedConsent) return;
|
|
24
|
+
try {
|
|
25
|
+
cachedConsent = await options.resolveConsent();
|
|
26
|
+
telemetryStoreDebug('Cached consent status: %s', cachedConsent.status);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
telemetryStoreDebug('Failed to initialize consent, treating as undetermined: %o', error);
|
|
29
|
+
cachedConsent = {
|
|
30
|
+
reason: 'fetchError',
|
|
31
|
+
status: 'undetermined'
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const initializeFilePath = async ()=>{
|
|
36
|
+
if (filePath) return;
|
|
37
|
+
try {
|
|
38
|
+
filePath = await generateTelemetryFilePath(sessionId);
|
|
39
|
+
telemetryStoreDebug('Generated file path: %s', filePath);
|
|
40
|
+
await mkdir(dirname(filePath), {
|
|
41
|
+
recursive: true
|
|
42
|
+
});
|
|
43
|
+
telemetryStoreDebug('Created directory structure for: %s', filePath);
|
|
44
|
+
} catch (error) {
|
|
45
|
+
telemetryStoreDebug('Failed to initialize file path: %o', error);
|
|
46
|
+
filePath = null;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const emit = (event)=>{
|
|
50
|
+
if (!cachedConsent || cachedConsent.status !== 'granted') {
|
|
51
|
+
if (cachedConsent) {
|
|
52
|
+
telemetryStoreDebug('Cached consent not granted (%s), skipping event: %s', cachedConsent.status, event.type);
|
|
53
|
+
} else {
|
|
54
|
+
telemetryStoreDebug('Consent not resolved, skipping event: %s', event.type);
|
|
55
|
+
}
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (!filePath) {
|
|
59
|
+
telemetryStoreDebug('File path not initialized, skipping event: %s', event.type);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
telemetryStoreDebug('Emitting event: %s', event.type);
|
|
63
|
+
try {
|
|
64
|
+
const eventLine = JSON.stringify(event) + '\n';
|
|
65
|
+
// We use synchronous file writes to ensure telemetry events are captured even when
|
|
66
|
+
// the process exits abruptly (process.exit, uncaught exceptions, SIGTERM, etc.).
|
|
67
|
+
// The performance impact is probably negligible and is worth the trade-off
|
|
68
|
+
// for 100% reliability. Async writes would be lost when the event loop
|
|
69
|
+
// shuts down during process exit.
|
|
70
|
+
appendFileSync(filePath, eventLine, 'utf8');
|
|
71
|
+
telemetryStoreDebug('Successfully wrote event to file: %s', filePath);
|
|
72
|
+
} catch (error) {
|
|
73
|
+
telemetryStoreDebug('Failed to write telemetry event: %o', error);
|
|
74
|
+
// Silent failure - don't break CLI functionality
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const logger = createLogger(sessionId, emit);
|
|
78
|
+
// Initialize both consent and file path concurrently
|
|
79
|
+
Promise.allSettled([
|
|
80
|
+
initializeConsent(),
|
|
81
|
+
initializeFilePath()
|
|
82
|
+
]).then((results)=>{
|
|
83
|
+
for (const [index, result] of results.entries()){
|
|
84
|
+
if (result.status === 'rejected') {
|
|
85
|
+
const type = index === 0 ? 'consent' : 'file path';
|
|
86
|
+
telemetryStoreDebug('Error initializing %s: %o', type, result.reason);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
logger
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=createTelemetryStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/telemetry/store/createTelemetryStore.ts"],"sourcesContent":["import {appendFileSync} from 'node:fs'\nimport {mkdir} from 'node:fs/promises'\nimport {dirname} from 'node:path'\n\nimport {type TelemetryEvent, type TelemetryStore} from '@sanity/telemetry'\n\nimport {type ConsentInformation} from '../../actions/telemetry/types.js'\nimport {telemetryStoreDebug} from './debug.js'\nimport {generateTelemetryFilePath} from './generateTelemetryFilePath.js'\nimport {createLogger} from './logger.js'\n\n/**\n * FILE MANAGEMENT STRATEGY:\n *\n * The telemetry system uses a multi-file approach to handle concurrent CLI processes:\n *\n * 1. WRITING (per session):\n * - Each CLI session gets a unique file: telemetry-\\{hash\\}-\\{env\\}-\\{sessionId\\}.ndjson\n * - Prevents write conflicts when multiple CLI commands run simultaneously\n * - Events are written using an RxJS queue for ordered processing with retry logic\n *\n * 2. FLUSHING (aggregate all sessions):\n * - findTelemetryFiles() discovers ALL telemetry files for user/environment\n * - Events are collected from all session files and sent as a batch\n * - Files are deleted after successful transmission\n *\n * 3. CLEANUP (background maintenance):\n * - cleanupOldTelemetryFiles() removes stale files older than 7 days\n * - Prevents disk space accumulation from abandoned sessions\n */\n\ninterface CreateTelemetryStoreOptions {\n resolveConsent: () => Promise<ConsentInformation>\n}\n\ntype CLITelemetryStore<T> = Pick<TelemetryStore<T>, 'logger'>\n\n/**\n * Creates a file-based telemetry store with cached consent and reliable synchronous I/O.\n *\n * Key optimizations:\n * - Consent resolved once at creation and cached (vs checking on every emit)\n * - File path generated and directory created once during initialization\n * - Synchronous file writes to ensure events are captured even during process exit\n *\n * @param sessionId - Unique session identifier for file isolation\n * @param options - Configuration options\n * @returns TelemetryStore instance compatible with the telemetry interface\n */\nexport function createTelemetryStore<UserProperties>(\n sessionId: string,\n options: CreateTelemetryStoreOptions,\n): CLITelemetryStore<UserProperties> {\n telemetryStoreDebug('Creating telemetry store with sessionId: %s', sessionId)\n\n let cachedConsent: ConsentInformation | null = null\n let filePath: string | null = null\n\n const initializeConsent = async () => {\n if (cachedConsent) return\n\n try {\n cachedConsent = await options.resolveConsent()\n telemetryStoreDebug('Cached consent status: %s', cachedConsent.status)\n } catch (error) {\n telemetryStoreDebug('Failed to initialize consent, treating as undetermined: %o', error)\n cachedConsent = {reason: 'fetchError', status: 'undetermined'}\n }\n }\n\n const initializeFilePath = async () => {\n if (filePath) return\n\n try {\n filePath = await generateTelemetryFilePath(sessionId)\n telemetryStoreDebug('Generated file path: %s', filePath)\n\n await mkdir(dirname(filePath), {recursive: true})\n telemetryStoreDebug('Created directory structure for: %s', filePath)\n } catch (error) {\n telemetryStoreDebug('Failed to initialize file path: %o', error)\n filePath = null\n }\n }\n\n const emit = (event: TelemetryEvent) => {\n if (!cachedConsent || cachedConsent.status !== 'granted') {\n if (cachedConsent) {\n telemetryStoreDebug(\n 'Cached consent not granted (%s), skipping event: %s',\n cachedConsent.status,\n event.type,\n )\n } else {\n telemetryStoreDebug('Consent not resolved, skipping event: %s', event.type)\n }\n return\n }\n\n if (!filePath) {\n telemetryStoreDebug('File path not initialized, skipping event: %s', event.type)\n return\n }\n\n telemetryStoreDebug('Emitting event: %s', event.type)\n\n try {\n const eventLine = JSON.stringify(event) + '\\n'\n\n // We use synchronous file writes to ensure telemetry events are captured even when\n // the process exits abruptly (process.exit, uncaught exceptions, SIGTERM, etc.).\n // The performance impact is probably negligible and is worth the trade-off\n // for 100% reliability. Async writes would be lost when the event loop\n // shuts down during process exit.\n appendFileSync(filePath, eventLine, 'utf8')\n telemetryStoreDebug('Successfully wrote event to file: %s', filePath)\n } catch (error) {\n telemetryStoreDebug('Failed to write telemetry event: %o', error)\n // Silent failure - don't break CLI functionality\n }\n }\n\n const logger = createLogger<UserProperties>(sessionId, emit)\n\n // Initialize both consent and file path concurrently\n Promise.allSettled([initializeConsent(), initializeFilePath()]).then((results) => {\n for (const [index, result] of results.entries()) {\n if (result.status === 'rejected') {\n const type = index === 0 ? 'consent' : 'file path'\n telemetryStoreDebug('Error initializing %s: %o', type, result.reason)\n }\n }\n })\n\n return {\n logger,\n }\n}\n"],"names":["appendFileSync","mkdir","dirname","telemetryStoreDebug","generateTelemetryFilePath","createLogger","createTelemetryStore","sessionId","options","cachedConsent","filePath","initializeConsent","resolveConsent","status","error","reason","initializeFilePath","recursive","emit","event","type","eventLine","JSON","stringify","logger","Promise","allSettled","then","results","index","result","entries"],"mappings":"AAAA,SAAQA,cAAc,QAAO,UAAS;AACtC,SAAQC,KAAK,QAAO,mBAAkB;AACtC,SAAQC,OAAO,QAAO,YAAW;AAKjC,SAAQC,mBAAmB,QAAO,aAAY;AAC9C,SAAQC,yBAAyB,QAAO,iCAAgC;AACxE,SAAQC,YAAY,QAAO,cAAa;AA4BxC;;;;;;;;;;;CAWC,GACD,OAAO,SAASC,qBACdC,SAAiB,EACjBC,OAAoC;IAEpCL,oBAAoB,+CAA+CI;IAEnE,IAAIE,gBAA2C;IAC/C,IAAIC,WAA0B;IAE9B,MAAMC,oBAAoB;QACxB,IAAIF,eAAe;QAEnB,IAAI;YACFA,gBAAgB,MAAMD,QAAQI,cAAc;YAC5CT,oBAAoB,6BAA6BM,cAAcI,MAAM;QACvE,EAAE,OAAOC,OAAO;YACdX,oBAAoB,8DAA8DW;YAClFL,gBAAgB;gBAACM,QAAQ;gBAAcF,QAAQ;YAAc;QAC/D;IACF;IAEA,MAAMG,qBAAqB;QACzB,IAAIN,UAAU;QAEd,IAAI;YACFA,WAAW,MAAMN,0BAA0BG;YAC3CJ,oBAAoB,2BAA2BO;YAE/C,MAAMT,MAAMC,QAAQQ,WAAW;gBAACO,WAAW;YAAI;YAC/Cd,oBAAoB,uCAAuCO;QAC7D,EAAE,OAAOI,OAAO;YACdX,oBAAoB,sCAAsCW;YAC1DJ,WAAW;QACb;IACF;IAEA,MAAMQ,OAAO,CAACC;QACZ,IAAI,CAACV,iBAAiBA,cAAcI,MAAM,KAAK,WAAW;YACxD,IAAIJ,eAAe;gBACjBN,oBACE,uDACAM,cAAcI,MAAM,EACpBM,MAAMC,IAAI;YAEd,OAAO;gBACLjB,oBAAoB,4CAA4CgB,MAAMC,IAAI;YAC5E;YACA;QACF;QAEA,IAAI,CAACV,UAAU;YACbP,oBAAoB,iDAAiDgB,MAAMC,IAAI;YAC/E;QACF;QAEAjB,oBAAoB,sBAAsBgB,MAAMC,IAAI;QAEpD,IAAI;YACF,MAAMC,YAAYC,KAAKC,SAAS,CAACJ,SAAS;YAE1C,mFAAmF;YACnF,iFAAiF;YACjF,2EAA2E;YAC3E,uEAAuE;YACvE,kCAAkC;YAClCnB,eAAeU,UAAUW,WAAW;YACpClB,oBAAoB,wCAAwCO;QAC9D,EAAE,OAAOI,OAAO;YACdX,oBAAoB,uCAAuCW;QAC3D,iDAAiD;QACnD;IACF;IAEA,MAAMU,SAASnB,aAA6BE,WAAWW;IAEvD,qDAAqD;IACrDO,QAAQC,UAAU,CAAC;QAACf;QAAqBK;KAAqB,EAAEW,IAAI,CAAC,CAACC;QACpE,KAAK,MAAM,CAACC,OAAOC,OAAO,IAAIF,QAAQG,OAAO,GAAI;YAC/C,IAAID,OAAOjB,MAAM,KAAK,YAAY;gBAChC,MAAMO,OAAOS,UAAU,IAAI,YAAY;gBACvC1B,oBAAoB,6BAA6BiB,MAAMU,OAAOf,MAAM;YACtE;QACF;IACF;IAEA,OAAO;QACLS;IACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/telemetry/store/createTraceId.ts"],"sourcesContent":["import {typeid} from 'typeid-js'\n\ntype TraceId = string & {__type: 'TraceId'}\n\n/**\n * Creates a unique trace ID using typeid\n *\n * @internal\n */\nexport function createTraceId(): TraceId {\n return typeid('trace').toString() as TraceId\n}\n"],"names":["typeid","createTraceId","toString"],"mappings":"AAAA,SAAQA,MAAM,QAAO,YAAW;AAIhC;;;;CAIC,GACD,OAAO,SAASC;IACd,OAAOD,OAAO,SAASE,QAAQ;AACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/telemetry/store/debug.ts"],"sourcesContent":["import {telemetryDebug} from '../../actions/telemetry/telemetryDebug.js'\n\n/**\n * Debug logger for telemetry store operations\n * @internal\n */\nexport const telemetryStoreDebug = telemetryDebug.extend('telemetryStore')\n"],"names":["telemetryDebug","telemetryStoreDebug","extend"],"mappings":"AAAA,SAAQA,cAAc,QAAO,4CAA2C;AAExE;;;CAGC,GACD,OAAO,MAAMC,sBAAsBD,eAAeE,MAAM,CAAC,kBAAiB"}
|