@microsoft/teamsfx-core 3.1.5-alpha.46aaa82df3.0 → 3.1.5-alpha.93bb1c235d.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/README.md +4 -0
  2. package/build/common/featureFlags.d.ts +5 -0
  3. package/build/common/featureFlags.d.ts.map +1 -1
  4. package/build/common/featureFlags.js +5 -0
  5. package/build/common/featureFlags.js.map +1 -1
  6. package/build/common/telemetry.d.ts +2 -1
  7. package/build/common/telemetry.d.ts.map +1 -1
  8. package/build/common/telemetry.js +1 -0
  9. package/build/common/telemetry.js.map +1 -1
  10. package/build/common/wrappedAxiosClient.d.ts +5 -0
  11. package/build/common/wrappedAxiosClient.d.ts.map +1 -1
  12. package/build/common/wrappedAxiosClient.js +95 -4
  13. package/build/common/wrappedAxiosClient.js.map +1 -1
  14. package/build/component/driver/copilotAgent/publish.d.ts.map +1 -1
  15. package/build/component/driver/copilotAgent/publish.js +1 -1
  16. package/build/component/driver/copilotAgent/publish.js.map +1 -1
  17. package/build/component/driver/dcr/create.d.ts.map +1 -1
  18. package/build/component/driver/dcr/create.js +15 -5
  19. package/build/component/driver/dcr/create.js.map +1 -1
  20. package/build/component/driver/dcr/interface/createDcrArgs.d.ts +2 -1
  21. package/build/component/driver/dcr/interface/createDcrArgs.d.ts.map +1 -1
  22. package/build/component/driver/index.d.ts +0 -1
  23. package/build/component/driver/index.d.ts.map +1 -1
  24. package/build/component/driver/index.js +0 -1
  25. package/build/component/driver/index.js.map +1 -1
  26. package/build/component/driver/m365/acquire.d.ts.map +1 -1
  27. package/build/component/driver/m365/acquire.js +2 -2
  28. package/build/component/driver/m365/acquire.js.map +1 -1
  29. package/build/component/driver/oauth/create.d.ts.map +1 -1
  30. package/build/component/driver/oauth/create.js +16 -2
  31. package/build/component/driver/oauth/create.js.map +1 -1
  32. package/build/component/driver/oauth/error/oauthSupportedAccountTypesUnsupportedCloud.d.ts +5 -0
  33. package/build/component/driver/oauth/error/oauthSupportedAccountTypesUnsupportedCloud.d.ts.map +1 -0
  34. package/build/component/driver/oauth/error/oauthSupportedAccountTypesUnsupportedCloud.js +13 -0
  35. package/build/component/driver/oauth/error/oauthSupportedAccountTypesUnsupportedCloud.js.map +1 -0
  36. package/build/component/driver/oauth/interface/createOauthArgs.d.ts +1 -0
  37. package/build/component/driver/oauth/interface/createOauthArgs.d.ts.map +1 -1
  38. package/build/component/driver/oauth/interface/updateOauthArgs.d.ts +1 -0
  39. package/build/component/driver/oauth/interface/updateOauthArgs.d.ts.map +1 -1
  40. package/build/component/driver/oauth/update.d.ts.map +1 -1
  41. package/build/component/driver/oauth/update.js +26 -4
  42. package/build/component/driver/oauth/update.js.map +1 -1
  43. package/build/component/driver/oauth/utility/supportedAccountTypes.d.ts +6 -0
  44. package/build/component/driver/oauth/utility/supportedAccountTypes.d.ts.map +1 -0
  45. package/build/component/driver/oauth/utility/supportedAccountTypes.js +31 -0
  46. package/build/component/driver/oauth/utility/supportedAccountTypes.js.map +1 -0
  47. package/build/component/driver/teamsApp/constants.d.ts +5 -0
  48. package/build/component/driver/teamsApp/constants.d.ts.map +1 -1
  49. package/build/component/driver/teamsApp/constants.js +5 -0
  50. package/build/component/driver/teamsApp/constants.js.map +1 -1
  51. package/build/component/driver/teamsApp/interfaces/DcrRegistration.d.ts +2 -1
  52. package/build/component/driver/teamsApp/interfaces/DcrRegistration.d.ts.map +1 -1
  53. package/build/component/driver/teamsApp/interfaces/OauthRegistration.d.ts +6 -0
  54. package/build/component/driver/teamsApp/interfaces/OauthRegistration.d.ts.map +1 -1
  55. package/build/component/driver/teamsApp/interfaces/OauthRegistration.js +5 -1
  56. package/build/component/driver/teamsApp/interfaces/OauthRegistration.js.map +1 -1
  57. package/build/component/generator/generatorProvider.d.ts.map +1 -1
  58. package/build/component/generator/generatorProvider.js +0 -3
  59. package/build/component/generator/generatorProvider.js.map +1 -1
  60. package/build/component/generator/templates/templateNames.d.ts +1 -1
  61. package/build/component/generator/templates/templateNames.d.ts.map +1 -1
  62. package/build/component/m365/packageService.d.ts +4 -3
  63. package/build/component/m365/packageService.d.ts.map +1 -1
  64. package/build/component/m365/packageService.js +32 -11
  65. package/build/component/m365/packageService.js.map +1 -1
  66. package/build/component/m365/serviceConstant.d.ts.map +1 -1
  67. package/build/component/m365/serviceConstant.js +5 -0
  68. package/build/component/m365/serviceConstant.js.map +1 -1
  69. package/build/component/m365/skills/graphSkillFileStore.d.ts +14 -0
  70. package/build/component/m365/skills/graphSkillFileStore.d.ts.map +1 -0
  71. package/build/component/m365/skills/graphSkillFileStore.js +164 -0
  72. package/build/component/m365/skills/graphSkillFileStore.js.map +1 -0
  73. package/build/component/m365/skills/incrementalSkillUpload.d.ts +6 -0
  74. package/build/component/m365/skills/incrementalSkillUpload.d.ts.map +1 -0
  75. package/build/component/m365/skills/incrementalSkillUpload.js +70 -0
  76. package/build/component/m365/skills/incrementalSkillUpload.js.map +1 -0
  77. package/build/component/m365/skills/skillDirectoryClient.d.ts +12 -0
  78. package/build/component/m365/skills/skillDirectoryClient.d.ts.map +1 -0
  79. package/build/component/m365/skills/skillDirectoryClient.js +150 -0
  80. package/build/component/m365/skills/skillDirectoryClient.js.map +1 -0
  81. package/build/component/m365/skills/skillFileSync.d.ts +35 -0
  82. package/build/component/m365/skills/skillFileSync.d.ts.map +1 -0
  83. package/build/component/m365/skills/skillFileSync.js +256 -0
  84. package/build/component/m365/skills/skillFileSync.js.map +1 -0
  85. package/build/component/m365/skills/skillPackage.d.ts +40 -0
  86. package/build/component/m365/skills/skillPackage.d.ts.map +1 -0
  87. package/build/component/m365/skills/skillPackage.js +471 -0
  88. package/build/component/m365/skills/skillPackage.js.map +1 -0
  89. package/build/component/m365/skills/skillRequest.d.ts +7 -0
  90. package/build/component/m365/skills/skillRequest.d.ts.map +1 -0
  91. package/build/component/m365/skills/skillRequest.js +91 -0
  92. package/build/component/m365/skills/skillRequest.js.map +1 -0
  93. package/build/core/FxCore.d.ts +2 -4
  94. package/build/core/FxCore.d.ts.map +1 -1
  95. package/build/core/FxCore.js +7 -22
  96. package/build/core/FxCore.js.map +1 -1
  97. package/build/question/create.d.ts +0 -6
  98. package/build/question/create.d.ts.map +1 -1
  99. package/build/question/create.js +119 -281
  100. package/build/question/create.js.map +1 -1
  101. package/build/question/generator.js +0 -2
  102. package/build/question/generator.js.map +1 -1
  103. package/build/question/index.d.ts +0 -1
  104. package/build/question/index.d.ts.map +1 -1
  105. package/build/question/index.js +0 -3
  106. package/build/question/index.js.map +1 -1
  107. package/build/question/inputs/index.d.ts +0 -1
  108. package/build/question/inputs/index.d.ts.map +1 -1
  109. package/build/question/inputs/index.js +0 -1
  110. package/build/question/inputs/index.js.map +1 -1
  111. package/build/question/options/CreateProjectOptions.d.ts.map +1 -1
  112. package/build/question/options/CreateProjectOptions.js +0 -1
  113. package/build/question/options/CreateProjectOptions.js.map +1 -1
  114. package/build/question/options/index.d.ts +0 -1
  115. package/build/question/options/index.d.ts.map +1 -1
  116. package/build/question/options/index.js +0 -1
  117. package/build/question/options/index.js.map +1 -1
  118. package/build/question/other.d.ts +0 -1
  119. package/build/question/other.d.ts.map +1 -1
  120. package/build/question/other.js +158 -214
  121. package/build/question/other.js.map +1 -1
  122. package/build/question/scaffold/vsc/CapabilityOptions.d.ts +0 -1
  123. package/build/question/scaffold/vsc/CapabilityOptions.d.ts.map +1 -1
  124. package/build/question/scaffold/vsc/CapabilityOptions.js +0 -9
  125. package/build/question/scaffold/vsc/CapabilityOptions.js.map +1 -1
  126. package/build/question/scaffold/vsc/teamsProjectTypeNode.d.ts.map +1 -1
  127. package/build/question/scaffold/vsc/teamsProjectTypeNode.js +0 -24
  128. package/build/question/scaffold/vsc/teamsProjectTypeNode.js.map +1 -1
  129. package/package.json +7 -4
  130. package/resource/package.nls.cs.json +59 -68
  131. package/resource/package.nls.de.json +59 -68
  132. package/resource/package.nls.es.json +59 -68
  133. package/resource/package.nls.fr.json +59 -68
  134. package/resource/package.nls.it.json +59 -68
  135. package/resource/package.nls.ja.json +59 -68
  136. package/resource/package.nls.json +15 -58
  137. package/resource/package.nls.ko.json +59 -68
  138. package/resource/package.nls.pl.json +59 -68
  139. package/resource/package.nls.pt-BR.json +59 -68
  140. package/resource/package.nls.ru.json +59 -68
  141. package/resource/package.nls.tr.json +59 -68
  142. package/resource/package.nls.zh-Hans.json +59 -68
  143. package/resource/package.nls.zh-Hant.json +59 -68
  144. package/resource/yaml-schema/v1.13/yaml.schema.json +50 -29
  145. package/resource/yaml-schema/yaml.schema.json +50 -29
  146. package/templates/fallback/common.zip +0 -0
  147. package/templates/fallback/csharp.zip +0 -0
  148. package/templates/fallback/js.zip +0 -0
  149. package/templates/fallback/python.zip +0 -0
  150. package/templates/fallback/ts.zip +0 -0
  151. package/templates/metadata.zip +0 -0
  152. package/templates/v4/templates-metadata.zip +0 -0
  153. package/templates/v4/templates.zip +0 -0
  154. package/build/component/driver/add/addWebPart.d.ts +0 -12
  155. package/build/component/driver/add/addWebPart.d.ts.map +0 -1
  156. package/build/component/driver/add/addWebPart.js +0 -109
  157. package/build/component/driver/add/addWebPart.js.map +0 -1
  158. package/build/component/driver/add/error/noConfigurationError.d.ts +0 -5
  159. package/build/component/driver/add/error/noConfigurationError.d.ts.map +0 -1
  160. package/build/component/driver/add/error/noConfigurationError.js +0 -22
  161. package/build/component/driver/add/error/noConfigurationError.js.map +0 -1
  162. package/build/component/driver/add/interface/AddWebPartArgs.d.ts +0 -27
  163. package/build/component/driver/add/interface/AddWebPartArgs.d.ts.map +0 -1
  164. package/build/component/driver/add/interface/AddWebPartArgs.js +0 -5
  165. package/build/component/driver/add/interface/AddWebPartArgs.js.map +0 -1
  166. package/build/component/driver/add/utility/constants.d.ts +0 -8
  167. package/build/component/driver/add/utility/constants.d.ts.map +0 -1
  168. package/build/component/driver/add/utility/constants.js +0 -14
  169. package/build/component/driver/add/utility/constants.js.map +0 -1
  170. package/build/component/generator/spfx/depsChecker/dependencyChecker.d.ts +0 -4
  171. package/build/component/generator/spfx/depsChecker/dependencyChecker.d.ts.map +0 -1
  172. package/build/component/generator/spfx/depsChecker/dependencyChecker.js +0 -5
  173. package/build/component/generator/spfx/depsChecker/dependencyChecker.js.map +0 -1
  174. package/build/component/generator/spfx/depsChecker/generatorChecker.d.ts +0 -20
  175. package/build/component/generator/spfx/depsChecker/generatorChecker.d.ts.map +0 -1
  176. package/build/component/generator/spfx/depsChecker/generatorChecker.js +0 -129
  177. package/build/component/generator/spfx/depsChecker/generatorChecker.js.map +0 -1
  178. package/build/component/generator/spfx/depsChecker/yoChecker.d.ts +0 -20
  179. package/build/component/generator/spfx/depsChecker/yoChecker.d.ts.map +0 -1
  180. package/build/component/generator/spfx/depsChecker/yoChecker.js +0 -143
  181. package/build/component/generator/spfx/depsChecker/yoChecker.js.map +0 -1
  182. package/build/component/generator/spfx/error.d.ts +0 -15
  183. package/build/component/generator/spfx/error.d.ts.map +0 -1
  184. package/build/component/generator/spfx/error.js +0 -124
  185. package/build/component/generator/spfx/error.js.map +0 -1
  186. package/build/component/generator/spfx/spfxGenerator.d.ts +0 -30
  187. package/build/component/generator/spfx/spfxGenerator.d.ts.map +0 -1
  188. package/build/component/generator/spfx/spfxGenerator.js +0 -684
  189. package/build/component/generator/spfx/spfxGenerator.js.map +0 -1
  190. package/build/component/generator/spfx/utils/constants.d.ts +0 -45
  191. package/build/component/generator/spfx/utils/constants.d.ts.map +0 -1
  192. package/build/component/generator/spfx/utils/constants.js +0 -56
  193. package/build/component/generator/spfx/utils/constants.js.map +0 -1
  194. package/build/component/generator/spfx/utils/progress-helper.d.ts +0 -9
  195. package/build/component/generator/spfx/utils/progress-helper.d.ts.map +0 -1
  196. package/build/component/generator/spfx/utils/progress-helper.js +0 -22
  197. package/build/component/generator/spfx/utils/progress-helper.js.map +0 -1
  198. package/build/component/generator/spfx/utils/telemetry-helper.d.ts +0 -14
  199. package/build/component/generator/spfx/utils/telemetry-helper.d.ts.map +0 -1
  200. package/build/component/generator/spfx/utils/telemetry-helper.js +0 -31
  201. package/build/component/generator/spfx/utils/telemetry-helper.js.map +0 -1
  202. package/build/component/generator/spfx/utils/telemetryEvents.d.ts +0 -20
  203. package/build/component/generator/spfx/utils/telemetryEvents.d.ts.map +0 -1
  204. package/build/component/generator/spfx/utils/telemetryEvents.js +0 -27
  205. package/build/component/generator/spfx/utils/telemetryEvents.js.map +0 -1
  206. package/build/component/generator/spfx/utils/utils.d.ts +0 -19
  207. package/build/component/generator/spfx/utils/utils.d.ts.map +0 -1
  208. package/build/component/generator/spfx/utils/utils.js +0 -184
  209. package/build/component/generator/spfx/utils/utils.js.map +0 -1
  210. package/build/question/inputs/SPFxAddWebpartInputs.d.ts +0 -20
  211. package/build/question/inputs/SPFxAddWebpartInputs.d.ts.map +0 -1
  212. package/build/question/inputs/SPFxAddWebpartInputs.js +0 -5
  213. package/build/question/inputs/SPFxAddWebpartInputs.js.map +0 -1
  214. package/build/question/options/SPFxAddWebpartOptions.d.ts +0 -10
  215. package/build/question/options/SPFxAddWebpartOptions.d.ts.map +0 -1
  216. package/build/question/options/SPFxAddWebpartOptions.js +0 -50
  217. package/build/question/options/SPFxAddWebpartOptions.js.map +0 -1
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT license.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.prepareIncrementalSkillUpload = prepareIncrementalSkillUpload;
6
+ const teamsfx_api_1 = require("@microsoft/teamsfx-api");
7
+ const constants_1 = require("../../../common/constants");
8
+ const localizeUtils_1 = require("../../../common/localizeUtils");
9
+ const telemetry_1 = require("../../../common/telemetry");
10
+ const graphSkillFileStore_1 = require("./graphSkillFileStore");
11
+ const skillDirectoryClient_1 = require("./skillDirectoryClient");
12
+ const skillFileSync_1 = require("./skillFileSync");
13
+ const skillPackage_1 = require("./skillPackage");
14
+ async function prepareIncrementalSkillUpload(data, serviceUrl, mosToken, tokenProvider, logger) {
15
+ const inventory = (0, skillPackage_1.readSkillPackage)(data);
16
+ if (inventory.isErr())
17
+ return (0, teamsfx_api_1.err)(inventory.error);
18
+ const source = inventory.value;
19
+ if (source.skills.length === 0)
20
+ return (0, teamsfx_api_1.ok)({ data, hasSkills: false });
21
+ const preflight = (0, skillPackage_1.validateSkillTransportPackage)(source);
22
+ if (preflight.isErr())
23
+ return (0, teamsfx_api_1.err)(preflight.error);
24
+ if (!tokenProvider) {
25
+ const key = "error.m365.skills.authorization";
26
+ return (0, teamsfx_api_1.err)(new teamsfx_api_1.UserError({
27
+ source: "M365",
28
+ name: "SkillUploadAuthorizationFailed",
29
+ message: (0, localizeUtils_1.getDefaultString)(key),
30
+ displayMessage: (0, localizeUtils_1.getLocalizedString)(key),
31
+ }));
32
+ }
33
+ const graphEndpoint = (0, constants_1.getResourceServiceEndpoint)(constants_1.ResourceServiceType.Graph);
34
+ const graphToken = await tokenProvider.getAccessToken({
35
+ scopes: [`${graphEndpoint}/Files.ReadWrite`],
36
+ });
37
+ if (graphToken.isErr())
38
+ return (0, teamsfx_api_1.err)(graphToken.error);
39
+ logger?.warning((0, localizeUtils_1.getLocalizedString)("info.m365.skills.preview"));
40
+ const directories = new skillDirectoryClient_1.SkillDirectoryClient(serviceUrl, mosToken);
41
+ const folders = new Map();
42
+ const readySkills = [];
43
+ for (const [index, skill] of source.skills.entries()) {
44
+ logger?.info((0, localizeUtils_1.getLocalizedString)("info.m365.skills.preparing", index + 1, source.skills.length));
45
+ const directory = await directories.createReadyDirectory(source.agentId, skill.name);
46
+ if (directory.isErr())
47
+ return (0, teamsfx_api_1.err)(directory.error);
48
+ folders.set(skill.folder, directory.value.folder);
49
+ readySkills.push({ skill, directory: directory.value });
50
+ }
51
+ // Metadata may refer to existing remote GUIDs, which only MOS can resolve.
52
+ const transport = (0, skillPackage_1.buildSkillTransportPackage)(source, folders);
53
+ if (transport.isErr())
54
+ return (0, teamsfx_api_1.err)(transport.error);
55
+ const counts = { uploaded: 0, skipped: 0, deleted: 0 };
56
+ for (const [index, { skill, directory }] of readySkills.entries()) {
57
+ logger?.info((0, localizeUtils_1.getLocalizedString)("info.m365.skills.synchronizing", index + 1, source.skills.length));
58
+ const store = new graphSkillFileStore_1.GraphSkillFileStore(graphEndpoint, graphToken.value, directory.driveId);
59
+ const synchronized = await (0, skillFileSync_1.synchronizeSkillFiles)(store, directory.itemId, skill.files);
60
+ if (synchronized.isErr())
61
+ return (0, teamsfx_api_1.err)(synchronized.error);
62
+ counts.uploaded += synchronized.value.uploaded;
63
+ counts.skipped += synchronized.value.skipped;
64
+ counts.deleted += synchronized.value.deleted;
65
+ }
66
+ logger?.info((0, localizeUtils_1.getLocalizedString)("info.m365.skills.summary", counts.uploaded, counts.skipped, counts.deleted));
67
+ (0, telemetry_1.sendTelemetryEvent)(telemetry_1.Component.core, telemetry_1.TelemetryEvent.MosSkillSync, undefined, counts);
68
+ return (0, teamsfx_api_1.ok)({ data: transport.value, hasSkills: true });
69
+ }
70
+ //# sourceMappingURL=incrementalSkillUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incrementalSkillUpload.js","sourceRoot":"","sources":["../../../../src/component/m365/skills/incrementalSkillUpload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { FxError, Result } from "@microsoft/teamsfx-api";
2
+ export interface ReadySkillDirectory {
3
+ folder: string;
4
+ driveId: string;
5
+ itemId: string;
6
+ }
7
+ export declare class SkillDirectoryClient {
8
+ private readonly client;
9
+ constructor(mosEndpoint: string, mosToken: string);
10
+ createReadyDirectory(agentId: string, name: string): Promise<Result<ReadySkillDirectory, FxError>>;
11
+ }
12
+ //# sourceMappingURL=skillDirectoryClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillDirectoryClient.d.ts","sourceRoot":"","sources":["../../../../src/component/m365/skills/skillDirectoryClient.ts"],"names":[],"mappings":"AAGA,OAAO,EAAO,OAAO,EAAM,MAAM,EAA0B,MAAM,wBAAwB,CAAC;AAM1F,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAWD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAS3C,oBAAoB,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;CAoBjD"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT license.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.SkillDirectoryClient = void 0;
6
+ const teamsfx_api_1 = require("@microsoft/teamsfx-api");
7
+ const localizeUtils_1 = require("../../../common/localizeUtils");
8
+ const wrappedAxiosClient_1 = require("../../../common/wrappedAxiosClient");
9
+ const skillRequest_1 = require("./skillRequest");
10
+ const httpTimeoutMs = 30000;
11
+ const sharePointSuffixes = [
12
+ ".sharepoint.com",
13
+ ".sharepoint.us",
14
+ ".sharepoint-mil.us",
15
+ ".sharepoint.cn",
16
+ ".sharepoint.de",
17
+ ];
18
+ class SkillDirectoryClient {
19
+ client;
20
+ constructor(mosEndpoint, mosToken) {
21
+ this.client = wrappedAxiosClient_1.WrappedAxiosClient.create({
22
+ baseURL: mosEndpoint.replace(/\/$/, ""),
23
+ headers: { Authorization: `Bearer ${mosToken}` },
24
+ timeout: httpTimeoutMs,
25
+ maxRedirects: 0,
26
+ });
27
+ }
28
+ async createReadyDirectory(agentId, name) {
29
+ const response = await (0, skillRequest_1.requestSkillOperation)(() => this.client.post("/builder/v1/directories", {
30
+ agentId,
31
+ directoryType: "skill",
32
+ name,
33
+ skipPublishedContentCopy: true,
34
+ }), "never");
35
+ if (response.isErr())
36
+ return (0, teamsfx_api_1.err)(response.error);
37
+ if (response.value.status !== 200)
38
+ return (0, teamsfx_api_1.err)(failure("directoryFailed"));
39
+ const parsed = parseDirectory(response.value.data);
40
+ if (!parsed)
41
+ return (0, teamsfx_api_1.err)(failure("invalidResponse"));
42
+ // Exclusive ATK skip-copy provenance is a prerequisite, not inferred from this response.
43
+ if (parsed.monitors.length > 0)
44
+ return (0, teamsfx_api_1.err)(failure("copyNotSupported"));
45
+ return (0, teamsfx_api_1.ok)(parsed.directory);
46
+ }
47
+ }
48
+ exports.SkillDirectoryClient = SkillDirectoryClient;
49
+ function parseDirectory(value) {
50
+ if (!isRecord(value) || !guidHex(value.folder) || !isRecord(value.sharePointIds)) {
51
+ return undefined;
52
+ }
53
+ const ids = value.sharePointIds;
54
+ const site = guidHex(ids.siteId);
55
+ const web = guidHex(ids.webId);
56
+ const list = guidHex(ids.listId);
57
+ if (typeof value.folder !== "string" ||
58
+ !site ||
59
+ !web ||
60
+ !list ||
61
+ typeof ids.uniqueId !== "string" ||
62
+ !guidHex(ids.uniqueId) ||
63
+ typeof ids.siteUrl !== "string") {
64
+ return undefined;
65
+ }
66
+ const siteUrl = safeUrl(ids.siteUrl);
67
+ if (!siteUrl ||
68
+ siteUrl.port ||
69
+ !sharePointSuffixes.some((suffix) => siteUrl.hostname.endsWith(suffix))) {
70
+ return undefined;
71
+ }
72
+ const monitors = [];
73
+ if (value.copyStatusUrls != null) {
74
+ if (!Array.isArray(value.copyStatusUrls))
75
+ return undefined;
76
+ for (const entry of value.copyStatusUrls) {
77
+ if (typeof entry !== "string")
78
+ return undefined;
79
+ const monitor = safeUrl(entry);
80
+ if (!monitor || monitor.origin !== siteUrl.origin)
81
+ return undefined;
82
+ monitors.push(entry);
83
+ }
84
+ }
85
+ return {
86
+ directory: {
87
+ folder: value.folder,
88
+ driveId: `b!${Buffer.concat([guidBytes(site), guidBytes(web), guidBytes(list)])
89
+ .toString("base64")
90
+ .replace(/\+/g, "-")
91
+ .replace(/\//g, "_")
92
+ .replace(/=+$/, "")}`,
93
+ itemId: ids.uniqueId,
94
+ },
95
+ monitors,
96
+ };
97
+ }
98
+ function guidHex(value) {
99
+ if (typeof value !== "string")
100
+ return undefined;
101
+ const text = value.startsWith("{") && value.endsWith("}") ? value.slice(1, -1) : value;
102
+ return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(text)
103
+ ? text.replace(/-/g, "")
104
+ : undefined;
105
+ }
106
+ function guidBytes(hex) {
107
+ // .NET Guid.ToByteArray reverses the first 4/2/2-byte fields, not the final eight bytes.
108
+ const bytes = Buffer.from(hex, "hex");
109
+ bytes.subarray(0, 4).reverse();
110
+ bytes.subarray(4, 6).reverse();
111
+ bytes.subarray(6, 8).reverse();
112
+ return bytes;
113
+ }
114
+ function safeUrl(value) {
115
+ if (/[\s\\#]/.test(value) || /^https:\/\/[^/]*@/.test(value))
116
+ return undefined;
117
+ try {
118
+ const url = new URL(value);
119
+ return value.startsWith("https://") && !url.username && !url.password && !url.hash
120
+ ? url
121
+ : undefined;
122
+ }
123
+ catch {
124
+ return undefined;
125
+ }
126
+ }
127
+ function isRecord(value) {
128
+ return value !== null && typeof value === "object" && !Array.isArray(value);
129
+ }
130
+ function failure(kind) {
131
+ const names = {
132
+ directoryFailed: "SkillDirectoryFailed",
133
+ copyNotSupported: "SkillUploadCopyNotSupported",
134
+ invalidResponse: "SkillInvalidResponse",
135
+ };
136
+ const keys = {
137
+ directoryFailed: "error.m365.skills.directoryFailed",
138
+ copyNotSupported: "error.m365.skills.copyNotSupported",
139
+ invalidResponse: "error.m365.skills.invalidResponse",
140
+ };
141
+ const key = keys[kind];
142
+ const options = {
143
+ source: "M365",
144
+ name: names[kind],
145
+ message: (0, localizeUtils_1.getDefaultString)(key),
146
+ displayMessage: (0, localizeUtils_1.getLocalizedString)(key),
147
+ };
148
+ return kind === "copyNotSupported" ? new teamsfx_api_1.UserError(options) : new teamsfx_api_1.SystemError(options);
149
+ }
150
+ //# sourceMappingURL=skillDirectoryClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillDirectoryClient.js","sourceRoot":"","sources":["../../../../src/component/m365/skills/skillDirectoryClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { FxError, Result } from "@microsoft/teamsfx-api";
2
+ export interface LocalSkillFile {
3
+ path: string;
4
+ content: Buffer;
5
+ }
6
+ export interface RemoteSkillItem {
7
+ id: string;
8
+ name: string;
9
+ kind: "file" | "folder";
10
+ eTag: string;
11
+ size?: number;
12
+ hashes?: {
13
+ sha1Hash?: string;
14
+ quickXorHash?: string;
15
+ };
16
+ }
17
+ /** The port owns pagination, authentication, safe retries, and eTag preconditions. */
18
+ export interface SkillFileStore {
19
+ listChildren(folderId: string): Promise<Result<RemoteSkillItem[], FxError>>;
20
+ createFolder(parentId: string, name: string): Promise<Result<RemoteSkillItem, FxError>>;
21
+ uploadFile(parentId: string, name: string, content: Buffer, existing?: RemoteSkillItem): Promise<Result<RemoteSkillItem, FxError>>;
22
+ deleteItem(item: RemoteSkillItem): Promise<Result<void, FxError>>;
23
+ }
24
+ /**
25
+ * Reconciles only descendants enumerated from the caller's draft root. Every
26
+ * inventory read completes before mutation; errors retain partial progress for
27
+ * a subsequent invocation to reconcile against fresh metadata. Deleted counts
28
+ * include files and folders; uploaded and skipped counts include only files.
29
+ */
30
+ export declare function synchronizeSkillFiles(store: SkillFileStore, rootId: string, files: LocalSkillFile[]): Promise<Result<{
31
+ uploaded: number;
32
+ skipped: number;
33
+ deleted: number;
34
+ }, FxError>>;
35
+ //# sourceMappingURL=skillFileSync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillFileSync.d.ts","sourceRoot":"","sources":["../../../../src/component/m365/skills/skillFileSync.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAsB,MAAM,wBAAwB,CAAC;AAI7E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,sFAAsF;AACtF,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5E,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IACxF,UAAU,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;CACnE;AAsLD;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,EAAE,GACtB,OAAO,CAAC,MAAM,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,CAAC,CAAC,CAwElF"}
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT license.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.synchronizeSkillFiles = synchronizeSkillFiles;
6
+ const teamsfx_api_1 = require("@microsoft/teamsfx-api");
7
+ const crypto_1 = require("crypto");
8
+ const localizeUtils_1 = require("../../../common/localizeUtils");
9
+ function invalidInventory() {
10
+ return new teamsfx_api_1.UserError({
11
+ source: "M365",
12
+ name: "InvalidSkillInventory",
13
+ message: (0, localizeUtils_1.getDefaultString)("error.m365.skills.invalidInventory"),
14
+ displayMessage: (0, localizeUtils_1.getLocalizedString)("error.m365.skills.invalidInventory"),
15
+ });
16
+ }
17
+ function validName(name) {
18
+ return (typeof name === "string" &&
19
+ name.length > 0 &&
20
+ name !== "." &&
21
+ name !== ".." &&
22
+ name.trim() === name &&
23
+ !name.endsWith(".") &&
24
+ !/[<>:"/\\|?*\u0000-\u001f\u007f]/.test(name));
25
+ }
26
+ function validId(id) {
27
+ return typeof id === "string" && id.trim().length > 0;
28
+ }
29
+ function validItem(item) {
30
+ return (item !== null &&
31
+ typeof item === "object" &&
32
+ validId(item.id) &&
33
+ validName(item.name) &&
34
+ (item.kind === "file" || item.kind === "folder") &&
35
+ validId(item.eTag) &&
36
+ (item.size === undefined || (Number.isSafeInteger(item.size) && item.size >= 0)));
37
+ }
38
+ function collisionKey(path) {
39
+ return path.normalize("NFC").toLowerCase();
40
+ }
41
+ function localInventory(files) {
42
+ const entries = new Map();
43
+ const paths = new Map();
44
+ for (const file of files) {
45
+ if (!file || typeof file.path !== "string" || !Buffer.isBuffer(file.content)) {
46
+ return (0, teamsfx_api_1.err)(invalidInventory());
47
+ }
48
+ const parts = file.path.split("/");
49
+ if (!parts.every(validName))
50
+ return (0, teamsfx_api_1.err)(invalidInventory());
51
+ let path = "";
52
+ for (let i = 0; i < parts.length; i++) {
53
+ path = path ? `${path}/${parts[i]}` : parts[i];
54
+ const kind = i === parts.length - 1 ? "file" : "folder";
55
+ const existingPath = paths.get(collisionKey(path));
56
+ if (existingPath !== undefined) {
57
+ if (existingPath !== path || kind === "file" || entries.get(path)?.kind !== "folder") {
58
+ return (0, teamsfx_api_1.err)(invalidInventory());
59
+ }
60
+ }
61
+ else {
62
+ paths.set(collisionKey(path), path);
63
+ entries.set(path, kind === "file" ? { kind, content: file.content } : { kind });
64
+ }
65
+ }
66
+ }
67
+ return (0, teamsfx_api_1.ok)(entries);
68
+ }
69
+ async function remoteInventory(store, rootId) {
70
+ const entries = new Map();
71
+ const ids = new Set([rootId]);
72
+ const paths = new Set();
73
+ const folders = [{ id: rootId, path: "" }];
74
+ // Iterative traversal bounds the call stack even for deeply nested drafts.
75
+ for (let index = 0; index < folders.length; index++) {
76
+ const parent = folders[index];
77
+ const children = await store.listChildren(parent.id);
78
+ if (children.isErr())
79
+ return (0, teamsfx_api_1.err)(children.error);
80
+ if (!Array.isArray(children.value))
81
+ return (0, teamsfx_api_1.err)(invalidInventory());
82
+ for (const item of children.value) {
83
+ if (!validItem(item) || ids.has(item.id))
84
+ return (0, teamsfx_api_1.err)(invalidInventory());
85
+ const path = parent.path ? `${parent.path}/${item.name}` : item.name;
86
+ const key = collisionKey(path);
87
+ if (paths.has(key))
88
+ return (0, teamsfx_api_1.err)(invalidInventory());
89
+ paths.add(key);
90
+ ids.add(item.id);
91
+ entries.set(path, item);
92
+ if (item.kind === "folder")
93
+ folders.push({ id: item.id, path });
94
+ }
95
+ }
96
+ return (0, teamsfx_api_1.ok)(entries);
97
+ }
98
+ function quickXorHash(content) {
99
+ // Matches Microsoft's C# reference: circular 160-bit XOR, 11-bit stride,
100
+ // followed by little-endian length XOR into bytes 12..19.
101
+ // https://learn.microsoft.com/onedrive/developer/code-snippets/quickxorhash
102
+ const hash = Buffer.alloc(20);
103
+ for (let i = 0; i < Math.min(content.length, 160); i++) {
104
+ let byte = 0;
105
+ for (let j = i; j < content.length; j += 160)
106
+ byte ^= content[j];
107
+ const shift = (i * 11) % 160;
108
+ const index = Math.floor(shift / 8);
109
+ const offset = shift % 8;
110
+ hash[index] ^= byte << offset;
111
+ hash[(index + 1) % hash.length] ^= byte >>> (8 - offset);
112
+ }
113
+ const length = Buffer.alloc(8);
114
+ length.writeBigUInt64LE(BigInt(content.length));
115
+ for (let i = 0; i < length.length; i++)
116
+ hash[12 + i] ^= length[i];
117
+ return hash.toString("base64");
118
+ }
119
+ function sameContent(item, content) {
120
+ if (item.size !== content.length)
121
+ return false;
122
+ // These are change detectors, never credential/security primitives. Prefer
123
+ // SHA-1 when usable; a mismatch must not be overridden by a weaker hash.
124
+ const sha1 = item.hashes?.sha1Hash;
125
+ if (typeof sha1 === "string" && /^[a-fA-F0-9]{40}$/.test(sha1)) {
126
+ return (0, crypto_1.createHash)("sha1").update(content).digest("hex") === sha1.toLowerCase();
127
+ }
128
+ const quickXor = item.hashes?.quickXorHash;
129
+ if (typeof quickXor !== "string" ||
130
+ !/^[A-Za-z0-9+/]{27}=$/.test(quickXor) ||
131
+ Buffer.from(quickXor, "base64").toString("base64") !== quickXor) {
132
+ return false;
133
+ }
134
+ return quickXorHash(content) === quickXor;
135
+ }
136
+ async function refreshEmptyFolder(store, rootId, path, item, entries) {
137
+ const parentPath = path.substring(0, Math.max(0, path.lastIndexOf("/")));
138
+ const parentId = parentPath ? entries.get(parentPath)?.id : rootId;
139
+ if (!parentId)
140
+ return (0, teamsfx_api_1.err)(invalidInventory());
141
+ const siblings = await store.listChildren(parentId);
142
+ if (siblings.isErr())
143
+ return (0, teamsfx_api_1.err)(siblings.error);
144
+ if (!Array.isArray(siblings.value))
145
+ return (0, teamsfx_api_1.err)(invalidInventory());
146
+ const expected = new Map(Array.from(entries).filter(([entryPath]) => entryPath.substring(0, Math.max(0, entryPath.lastIndexOf("/"))) === parentPath));
147
+ if (siblings.value.length !== expected.size)
148
+ return (0, teamsfx_api_1.err)(invalidInventory());
149
+ const seen = new Set();
150
+ let refreshed;
151
+ for (const sibling of siblings.value) {
152
+ if (!validItem(sibling) || seen.has(sibling.id))
153
+ return (0, teamsfx_api_1.err)(invalidInventory());
154
+ seen.add(sibling.id);
155
+ const siblingPath = parentPath ? `${parentPath}/${sibling.name}` : sibling.name;
156
+ const original = expected.get(siblingPath);
157
+ if (original?.id !== sibling.id || original.kind !== sibling.kind) {
158
+ return (0, teamsfx_api_1.err)(invalidInventory());
159
+ }
160
+ if (sibling.id === item.id)
161
+ refreshed = sibling;
162
+ }
163
+ if (!refreshed)
164
+ return (0, teamsfx_api_1.err)(invalidInventory());
165
+ // Capture the new version BEFORE checking emptiness. A child added before the
166
+ // check is detected here; a later change must fail the port's If-Match delete.
167
+ const children = await store.listChildren(item.id);
168
+ if (children.isErr())
169
+ return (0, teamsfx_api_1.err)(children.error);
170
+ if (!Array.isArray(children.value) || children.value.length !== 0) {
171
+ return (0, teamsfx_api_1.err)(invalidInventory());
172
+ }
173
+ return (0, teamsfx_api_1.ok)(refreshed);
174
+ }
175
+ /**
176
+ * Reconciles only descendants enumerated from the caller's draft root. Every
177
+ * inventory read completes before mutation; errors retain partial progress for
178
+ * a subsequent invocation to reconcile against fresh metadata. Deleted counts
179
+ * include files and folders; uploaded and skipped counts include only files.
180
+ */
181
+ async function synchronizeSkillFiles(store, rootId, files) {
182
+ if (!validId(rootId) || !Array.isArray(files))
183
+ return (0, teamsfx_api_1.err)(invalidInventory());
184
+ const local = localInventory(files);
185
+ if (local.isErr())
186
+ return (0, teamsfx_api_1.err)(local.error);
187
+ const remote = await remoteInventory(store, rootId);
188
+ if (remote.isErr())
189
+ return (0, teamsfx_api_1.err)(remote.error);
190
+ const counts = { uploaded: 0, skipped: 0, deleted: 0 };
191
+ const entries = remote.value;
192
+ const ids = new Set([rootId, ...Array.from(entries.values(), (item) => item.id)]);
193
+ // Removing stale children first also makes file/folder and case replacements
194
+ // possible without recursive deletes or a name-conflict overwrite.
195
+ const stale = Array.from(entries).filter(([path, item]) => local.value.get(path)?.kind !== item.kind);
196
+ stale.sort(([a], [b]) => b.split("/").length - a.split("/").length);
197
+ for (const [path, item] of stale) {
198
+ let versionedItem = item;
199
+ if (item.kind === "folder") {
200
+ const refreshed = await refreshEmptyFolder(store, rootId, path, item, entries);
201
+ if (refreshed.isErr())
202
+ return (0, teamsfx_api_1.err)(refreshed.error);
203
+ versionedItem = refreshed.value;
204
+ }
205
+ const deleted = await store.deleteItem(versionedItem);
206
+ if (deleted.isErr())
207
+ return (0, teamsfx_api_1.err)(deleted.error);
208
+ entries.delete(path);
209
+ counts.deleted++;
210
+ }
211
+ // Local inventory inserts each parent before its children.
212
+ for (const [path, entry] of local.value) {
213
+ const separator = path.lastIndexOf("/");
214
+ const parentPath = separator < 0 ? "" : path.substring(0, separator);
215
+ const parentId = parentPath ? entries.get(parentPath)?.id : rootId;
216
+ if (!parentId)
217
+ return (0, teamsfx_api_1.err)(invalidInventory());
218
+ const name = path.substring(separator + 1);
219
+ const existing = entries.get(path);
220
+ if (entry.kind === "folder") {
221
+ if (existing)
222
+ continue;
223
+ const created = await store.createFolder(parentId, name);
224
+ if (created.isErr())
225
+ return (0, teamsfx_api_1.err)(created.error);
226
+ if (!validItem(created.value) ||
227
+ created.value.kind !== "folder" ||
228
+ created.value.name !== name ||
229
+ ids.has(created.value.id)) {
230
+ return (0, teamsfx_api_1.err)(invalidInventory());
231
+ }
232
+ ids.add(created.value.id);
233
+ entries.set(path, created.value);
234
+ }
235
+ else {
236
+ if (existing && sameContent(existing, entry.content)) {
237
+ counts.skipped++;
238
+ continue;
239
+ }
240
+ const uploaded = await store.uploadFile(parentId, name, entry.content, existing);
241
+ if (uploaded.isErr())
242
+ return (0, teamsfx_api_1.err)(uploaded.error);
243
+ if (!validItem(uploaded.value) ||
244
+ uploaded.value.kind !== "file" ||
245
+ uploaded.value.name !== name ||
246
+ (existing ? uploaded.value.id !== existing.id : ids.has(uploaded.value.id))) {
247
+ return (0, teamsfx_api_1.err)(invalidInventory());
248
+ }
249
+ ids.add(uploaded.value.id);
250
+ entries.set(path, uploaded.value);
251
+ counts.uploaded++;
252
+ }
253
+ }
254
+ return (0, teamsfx_api_1.ok)(counts);
255
+ }
256
+ //# sourceMappingURL=skillFileSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillFileSync.js","sourceRoot":"","sources":["../../../../src/component/m365/skills/skillFileSync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { FxError, Result } from "@microsoft/teamsfx-api";
2
+ export interface SkillPackageFile {
3
+ /** Confined, slash-separated path relative to the skill folder. */
4
+ path: string;
5
+ content: Buffer;
6
+ }
7
+ export interface LocalSkill {
8
+ folder: string;
9
+ name: string;
10
+ description: string;
11
+ files: SkillPackageFile[];
12
+ }
13
+ export interface SkillReference {
14
+ manifestPath: string;
15
+ property: "agentSkills" | "agent_skills" | "x-agent_skills";
16
+ index: number;
17
+ folder: string;
18
+ }
19
+ export interface SkillAgentManifest {
20
+ path: string;
21
+ /** Original parsed fields, including extensions and exposure metadata. */
22
+ manifest: Record<string, unknown>;
23
+ }
24
+ /** Validated inventory from readSkillPackage; consumers must not mutate its source data. */
25
+ export interface SkillPackage {
26
+ /** Unmodified source ZIP, retained for a separately defined transport transformation. */
27
+ data: Buffer;
28
+ agentId: string;
29
+ manifest: Record<string, unknown>;
30
+ declarativeAgents: SkillAgentManifest[];
31
+ references: SkillReference[];
32
+ skills: LocalSkill[];
33
+ }
34
+ /** Build the verified MOS reference package without changing the portable source package. */
35
+ export declare function buildSkillTransportPackage(source: SkillPackage, folders: ReadonlyMap<string, string>): Result<Buffer, FxError>;
36
+ /** Validate before remote mutations; remote-GUID associations require the final builder mapping. */
37
+ export declare function validateSkillTransportPackage(source: SkillPackage): Result<void, FxError>;
38
+ /** Inventory and validate only; this function never extracts files or performs remote I/O. */
39
+ export declare function readSkillPackage(data: Buffer): Result<SkillPackage, FxError>;
40
+ //# sourceMappingURL=skillPackage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillPackage.d.ts","sourceRoot":"","sources":["../../../../src/component/m365/skills/skillPackage.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,OAAO,EAEP,MAAM,EAGP,MAAM,wBAAwB,CAAC;AAOhC,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,GAAG,cAAc,GAAG,gBAAgB,CAAC;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,4FAA4F;AAC5F,MAAM,WAAW,YAAY;IAC3B,yFAAyF;IACzF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;IACxC,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,6FAA6F;AAC7F,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB;AAED,oGAAoG;AACpG,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAEzF;AAqOD,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAiC5E"}