@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.
Files changed (209) hide show
  1. package/README.md +2907 -109
  2. package/dist/actions/build/renderDocumentWorker/tryLoadDocumentComponent.js +2 -1
  3. package/dist/actions/build/renderDocumentWorker/tryLoadDocumentComponent.js.map +1 -1
  4. package/dist/actions/init/bootstrapLocalTemplate.d.ts +13 -0
  5. package/dist/actions/init/bootstrapLocalTemplate.js +136 -0
  6. package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -0
  7. package/dist/actions/init/bootstrapRemoteTemplate.d.ts +12 -0
  8. package/dist/actions/init/bootstrapRemoteTemplate.js +109 -0
  9. package/dist/actions/init/bootstrapRemoteTemplate.js.map +1 -0
  10. package/dist/actions/init/bootstrapTemplate.d.ts +18 -0
  11. package/dist/actions/init/bootstrapTemplate.js +32 -0
  12. package/dist/actions/init/bootstrapTemplate.js.map +1 -0
  13. package/dist/actions/init/checkNextJsReactCompatibility.d.ts +9 -0
  14. package/dist/actions/init/checkNextJsReactCompatibility.js +21 -0
  15. package/dist/actions/init/checkNextJsReactCompatibility.js.map +1 -0
  16. package/dist/actions/init/countNestedFolders.d.ts +1 -0
  17. package/dist/actions/init/countNestedFolders.js +6 -0
  18. package/dist/actions/init/countNestedFolders.js.map +1 -0
  19. package/dist/actions/init/createAppCliConfig.d.ts +5 -0
  20. package/dist/actions/init/createAppCliConfig.js +19 -0
  21. package/dist/actions/init/createAppCliConfig.js.map +1 -0
  22. package/dist/actions/init/createCliConfig.d.ts +6 -0
  23. package/dist/actions/init/createCliConfig.js +27 -0
  24. package/dist/actions/init/createCliConfig.js.map +1 -0
  25. package/dist/actions/init/createPackageManifest.d.ts +6 -0
  26. package/dist/actions/init/createPackageManifest.js +86 -0
  27. package/dist/actions/init/createPackageManifest.js.map +1 -0
  28. package/dist/actions/init/createStudioConfig.d.ts +13 -0
  29. package/dist/actions/init/createStudioConfig.js +41 -0
  30. package/dist/actions/init/createStudioConfig.js.map +1 -0
  31. package/dist/actions/init/env/createOrAppendEnvVars.d.ts +12 -0
  32. package/dist/actions/init/env/createOrAppendEnvVars.js +25 -0
  33. package/dist/actions/init/env/createOrAppendEnvVars.js.map +1 -0
  34. package/dist/actions/init/env/parseAndUpdateEnvVars.d.ts +9 -0
  35. package/dist/actions/init/env/parseAndUpdateEnvVars.js +42 -0
  36. package/dist/actions/init/env/parseAndUpdateEnvVars.js.map +1 -0
  37. package/dist/actions/init/env/writeEnvVarsToFile.d.ts +12 -0
  38. package/dist/actions/init/env/writeEnvVarsToFile.js +49 -0
  39. package/dist/actions/init/env/writeEnvVarsToFile.js.map +1 -0
  40. package/dist/actions/init/fetchPostInitPrompt.d.ts +6 -0
  41. package/dist/actions/init/fetchPostInitPrompt.js +30 -0
  42. package/dist/actions/init/fetchPostInitPrompt.js.map +1 -0
  43. package/dist/actions/init/git.d.ts +1 -0
  44. package/dist/actions/init/git.js +65 -0
  45. package/dist/actions/init/git.js.map +1 -0
  46. package/dist/actions/init/processTemplate.d.ts +7 -0
  47. package/dist/actions/init/processTemplate.js +56 -0
  48. package/dist/actions/init/processTemplate.js.map +1 -0
  49. package/dist/actions/init/remoteTemplate.d.ts +0 -3
  50. package/dist/actions/init/remoteTemplate.js +2 -40
  51. package/dist/actions/init/remoteTemplate.js.map +1 -1
  52. package/dist/actions/init/resolvePackageManager.d.ts +10 -0
  53. package/dist/actions/init/resolvePackageManager.js +20 -0
  54. package/dist/actions/init/resolvePackageManager.js.map +1 -0
  55. package/dist/actions/init/setupMCP.d.ts +21 -0
  56. package/dist/actions/init/setupMCP.js +258 -0
  57. package/dist/actions/init/setupMCP.js.map +1 -0
  58. package/dist/actions/init/templates/appQuickstart.d.ts +3 -0
  59. package/dist/actions/init/templates/appQuickstart.js +28 -0
  60. package/dist/actions/init/templates/appQuickstart.js.map +1 -0
  61. package/dist/actions/init/templates/appSanityUi.d.ts +3 -0
  62. package/dist/actions/init/templates/appSanityUi.js +30 -0
  63. package/dist/actions/init/templates/appSanityUi.js.map +1 -0
  64. package/dist/actions/init/templates/blog.d.ts +3 -0
  65. package/dist/actions/init/templates/blog.js +4 -0
  66. package/dist/actions/init/templates/blog.js.map +1 -0
  67. package/dist/actions/init/templates/clean.d.ts +3 -0
  68. package/dist/actions/init/templates/clean.js +4 -0
  69. package/dist/actions/init/templates/clean.js.map +1 -0
  70. package/dist/actions/init/templates/getStarted.d.ts +3 -0
  71. package/dist/actions/init/templates/getStarted.js +35 -0
  72. package/dist/actions/init/templates/getStarted.js.map +1 -0
  73. package/dist/actions/init/templates/index.d.ts +3 -0
  74. package/dist/actions/init/templates/index.js +23 -0
  75. package/dist/actions/init/templates/index.js.map +1 -0
  76. package/dist/actions/init/templates/moviedb.d.ts +3 -0
  77. package/dist/actions/init/templates/moviedb.js +34 -0
  78. package/dist/actions/init/templates/moviedb.js.map +1 -0
  79. package/dist/actions/init/templates/nextjs/index.d.ts +6 -0
  80. package/dist/actions/init/templates/nextjs/index.js +213 -0
  81. package/dist/actions/init/templates/nextjs/index.js.map +1 -0
  82. package/dist/actions/init/templates/nextjs/schemaTypes/blog.d.ts +3 -0
  83. package/dist/actions/init/templates/nextjs/schemaTypes/blog.js +247 -0
  84. package/dist/actions/init/templates/nextjs/schemaTypes/blog.js.map +1 -0
  85. package/dist/actions/init/templates/quickstart.d.ts +3 -0
  86. package/dist/actions/init/templates/quickstart.js +4 -0
  87. package/dist/actions/init/templates/quickstart.js.map +1 -0
  88. package/dist/actions/init/templates/shopify.d.ts +3 -0
  89. package/dist/actions/init/templates/shopify.js +77 -0
  90. package/dist/actions/init/templates/shopify.js.map +1 -0
  91. package/dist/actions/init/templates/shopifyOnline.d.ts +3 -0
  92. package/dist/actions/init/templates/shopifyOnline.js +49 -0
  93. package/dist/actions/init/templates/shopifyOnline.js.map +1 -0
  94. package/dist/actions/init/types.d.ts +15 -0
  95. package/dist/actions/init/types.js +3 -0
  96. package/dist/actions/init/types.js.map +1 -0
  97. package/dist/actions/init/updateInitialTemplateMetadata.d.ts +1 -0
  98. package/dist/actions/init/updateInitialTemplateMetadata.js +17 -0
  99. package/dist/actions/init/updateInitialTemplateMetadata.js.map +1 -0
  100. package/dist/actions/telemetry/resolveConsent.d.ts +1 -9
  101. package/dist/actions/telemetry/resolveConsent.js +2 -2
  102. package/dist/actions/telemetry/resolveConsent.js.map +1 -1
  103. package/dist/actions/telemetry/setConsent.d.ts +1 -4
  104. package/dist/actions/telemetry/setConsent.js +4 -8
  105. package/dist/actions/telemetry/setConsent.js.map +1 -1
  106. package/dist/commands/init.d.ts +24 -14
  107. package/dist/commands/init.js +544 -26
  108. package/dist/commands/init.js.map +1 -1
  109. package/dist/commands/telemetry/disable.js +0 -1
  110. package/dist/commands/telemetry/disable.js.map +1 -1
  111. package/dist/commands/telemetry/enable.js +0 -1
  112. package/dist/commands/telemetry/enable.js.map +1 -1
  113. package/dist/commands/telemetry/status.js +1 -3
  114. package/dist/commands/telemetry/status.js.map +1 -1
  115. package/dist/hooks/prerun/flushTelemetry.worker.d.ts +2 -0
  116. package/dist/hooks/prerun/flushTelemetry.worker.js +22 -0
  117. package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -0
  118. package/dist/hooks/prerun/setupTelemetry.js +65 -1
  119. package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
  120. package/dist/prompts/init/nextjs.d.ts +5 -0
  121. package/dist/prompts/init/nextjs.js +56 -0
  122. package/dist/prompts/init/nextjs.js.map +1 -0
  123. package/dist/prompts/init/promptForTypescript.d.ts +0 -1
  124. package/dist/prompts/init/promptForTypescript.js +0 -6
  125. package/dist/prompts/init/promptForTypescript.js.map +1 -1
  126. package/dist/services/mcp.d.ts +10 -0
  127. package/dist/services/mcp.js +16 -0
  128. package/dist/services/mcp.js.map +1 -1
  129. package/dist/services/projects.d.ts +5 -2
  130. package/dist/services/projects.js +37 -0
  131. package/dist/services/projects.js.map +1 -1
  132. package/dist/services/telemetry.d.ts +2 -0
  133. package/dist/services/telemetry.js +20 -0
  134. package/dist/services/telemetry.js.map +1 -0
  135. package/dist/studioDependencies.d.ts +16 -0
  136. package/dist/studioDependencies.js +24 -0
  137. package/dist/studioDependencies.js.map +1 -0
  138. package/dist/telemetry/cli.telemetry.d.ts +20 -0
  139. package/dist/telemetry/cli.telemetry.js +8 -0
  140. package/dist/telemetry/cli.telemetry.js.map +1 -0
  141. package/dist/telemetry/store/cleanupOldTelemetryFiles.d.ts +5 -0
  142. package/dist/telemetry/store/cleanupOldTelemetryFiles.js +30 -0
  143. package/dist/telemetry/store/cleanupOldTelemetryFiles.js.map +1 -0
  144. package/dist/telemetry/store/createTelemetryStore.d.ts +39 -0
  145. package/dist/telemetry/store/createTelemetryStore.js +95 -0
  146. package/dist/telemetry/store/createTelemetryStore.js.map +1 -0
  147. package/dist/telemetry/store/createTraceId.d.ts +10 -0
  148. package/dist/telemetry/store/createTraceId.js +10 -0
  149. package/dist/telemetry/store/createTraceId.js.map +1 -0
  150. package/dist/telemetry/store/debug.d.ts +5 -0
  151. package/dist/telemetry/store/debug.js +7 -0
  152. package/dist/telemetry/store/debug.js.map +1 -0
  153. package/dist/telemetry/store/findTelemetryFiles.d.ts +13 -0
  154. package/dist/telemetry/store/findTelemetryFiles.js +34 -0
  155. package/dist/telemetry/store/findTelemetryFiles.js.map +1 -0
  156. package/dist/telemetry/store/flushTelemetryFiles.d.ts +20 -0
  157. package/dist/telemetry/store/flushTelemetryFiles.js +107 -0
  158. package/dist/telemetry/store/flushTelemetryFiles.js.map +1 -0
  159. package/dist/telemetry/store/generateTelemetryFilePath.d.ts +17 -0
  160. package/dist/telemetry/store/generateTelemetryFilePath.js +30 -0
  161. package/dist/telemetry/store/generateTelemetryFilePath.js.map +1 -0
  162. package/dist/telemetry/store/getTelemetryBaseInfo.d.ts +27 -0
  163. package/dist/telemetry/store/getTelemetryBaseInfo.js +34 -0
  164. package/dist/telemetry/store/getTelemetryBaseInfo.js.map +1 -0
  165. package/dist/telemetry/store/logger.d.ts +6 -0
  166. package/dist/telemetry/store/logger.js +54 -0
  167. package/dist/telemetry/store/logger.js.map +1 -0
  168. package/dist/telemetry/store/trace.d.ts +6 -0
  169. package/dist/telemetry/store/trace.js +150 -0
  170. package/dist/telemetry/store/trace.js.map +1 -0
  171. package/dist/telemetry/utils/readNDJSON.d.ts +10 -0
  172. package/dist/telemetry/utils/readNDJSON.js +18 -0
  173. package/dist/telemetry/utils/readNDJSON.js.map +1 -0
  174. package/dist/types.d.ts +33 -0
  175. package/dist/types.js.map +1 -1
  176. package/dist/typings/deepSortObject.d.js +2 -0
  177. package/dist/typings/deepSortObject.d.js.map +1 -0
  178. package/dist/util/copy.d.ts +5 -0
  179. package/dist/util/copy.js +37 -0
  180. package/dist/util/copy.js.map +1 -0
  181. package/dist/util/detectRuntime.d.ts +8 -0
  182. package/dist/util/detectRuntime.js +20 -0
  183. package/dist/util/detectRuntime.js.map +1 -0
  184. package/dist/util/frameworkPort.d.ts +12 -0
  185. package/dist/util/frameworkPort.js +61 -0
  186. package/dist/util/frameworkPort.js.map +1 -0
  187. package/dist/util/fsUtils.d.ts +2 -0
  188. package/dist/util/fsUtils.js +34 -0
  189. package/dist/util/fsUtils.js.map +1 -0
  190. package/dist/util/getProjectDefaults.d.ts +11 -0
  191. package/dist/util/getProjectDefaults.js +77 -0
  192. package/dist/util/getProjectDefaults.js.map +1 -0
  193. package/dist/util/isStaging.d.ts +7 -0
  194. package/dist/util/isStaging.js +10 -0
  195. package/dist/util/isStaging.js.map +1 -0
  196. package/dist/util/packageManager/packageManagerChoice.d.ts +2 -0
  197. package/dist/util/packageManager/packageManagerChoice.js +8 -0
  198. package/dist/util/packageManager/packageManagerChoice.js.map +1 -1
  199. package/dist/util/parseArguments.d.ts +35 -0
  200. package/dist/util/parseArguments.js +42 -0
  201. package/dist/util/parseArguments.js.map +1 -0
  202. package/dist/util/readdirRecursive.d.ts +5 -0
  203. package/dist/util/readdirRecursive.js +24 -0
  204. package/dist/util/readdirRecursive.js.map +1 -0
  205. package/dist/util/resolveLatestVersions.d.ts +7 -0
  206. package/dist/util/resolveLatestVersions.js +21 -0
  207. package/dist/util/resolveLatestVersions.js.map +1 -0
  208. package/oclif.manifest.json +154 -141
  209. 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"}
@@ -1,2 +1 @@
1
1
  export declare function promptForTypeScript(): Promise<boolean>;
2
- export declare function promptImplicitReconfigure(): Promise<boolean>;
@@ -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\nexport function promptImplicitReconfigure(): Promise<boolean> {\n return confirm({\n default: true,\n message:\n 'The current folder contains a configured Sanity studio. Would you like to reconfigure it?',\n })\n}\n"],"names":["confirm","promptForTypeScript","default","message","promptImplicitReconfigure"],"mappings":"AAAA,SAAQA,OAAO,QAAO,sBAAqB;AAE3C,OAAO,SAASC;IACd,OAAOD,QAAQ;QACbE,SAAS;QACTC,SAAS;IACX;AACF;AAEA,OAAO,SAASC;IACd,OAAOJ,QAAQ;QACbE,SAAS;QACTC,SACE;IACJ;AACF"}
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"}
@@ -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 {};
@@ -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
@@ -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;AAuBrD;;;;;;;CAOC,GACD,OAAO,eAAeC;IACpB,MAAMC,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,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"}
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<import("@sanity/client").SanityProject>;
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<import("@sanity/client").SanityProject[]>;
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;AAI/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"}
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,2 @@
1
+ import { type TelemetryEvent } from '@sanity/telemetry';
2
+ export declare function sendEvents(batch: TelemetryEvent[]): Promise<any>;
@@ -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,8 @@
1
+ import { defineTrace } from '@sanity/telemetry';
2
+ export const CliCommandTelemetry = defineTrace({
3
+ description: 'A CLI command was executed',
4
+ name: 'CLI Command Executed',
5
+ version: 1
6
+ });
7
+
8
+ //# sourceMappingURL=cli.telemetry.js.map
@@ -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,5 @@
1
+ /**
2
+ * Cleans up telemetry files older than the specified number of days
3
+ * @internal
4
+ */
5
+ export declare function cleanupOldTelemetryFiles(maxAgeDays?: number): Promise<void>;
@@ -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,10 @@
1
+ type TraceId = string & {
2
+ __type: 'TraceId';
3
+ };
4
+ /**
5
+ * Creates a unique trace ID using typeid
6
+ *
7
+ * @internal
8
+ */
9
+ export declare function createTraceId(): TraceId;
10
+ export {};
@@ -0,0 +1,10 @@
1
+ import { typeid } from 'typeid-js';
2
+ /**
3
+ * Creates a unique trace ID using typeid
4
+ *
5
+ * @internal
6
+ */ export function createTraceId() {
7
+ return typeid('trace').toString();
8
+ }
9
+
10
+ //# sourceMappingURL=createTraceId.js.map
@@ -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,5 @@
1
+ /**
2
+ * Debug logger for telemetry store operations
3
+ * @internal
4
+ */
5
+ export declare const telemetryStoreDebug: import("debug").Debugger;
@@ -0,0 +1,7 @@
1
+ import { telemetryDebug } from '../../actions/telemetry/telemetryDebug.js';
2
+ /**
3
+ * Debug logger for telemetry store operations
4
+ * @internal
5
+ */ export const telemetryStoreDebug = telemetryDebug.extend('telemetryStore');
6
+
7
+ //# sourceMappingURL=debug.js.map
@@ -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"}