agent-switchboard 0.1.29 → 0.2.1

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 (93) hide show
  1. package/README.md +94 -46
  2. package/dist/agents/codex.d.ts +0 -9
  3. package/dist/agents/codex.js +9 -3
  4. package/dist/agents/codex.js.map +1 -1
  5. package/dist/commands/distribution.js +1 -1
  6. package/dist/commands/distribution.js.map +1 -1
  7. package/dist/commands/inventory.js +1 -1
  8. package/dist/commands/inventory.js.map +1 -1
  9. package/dist/commands/library.d.ts +1 -1
  10. package/dist/commands/library.js +3 -3
  11. package/dist/commands/library.js.map +1 -1
  12. package/dist/config/application-config.d.ts +14 -3
  13. package/dist/config/application-config.js +61 -6
  14. package/dist/config/application-config.js.map +1 -1
  15. package/dist/config/mcp-config.d.ts +7 -0
  16. package/dist/config/mcp-config.js +25 -0
  17. package/dist/config/mcp-config.js.map +1 -1
  18. package/dist/config/schemas.d.ts +828 -273
  19. package/dist/config/schemas.js +62 -18
  20. package/dist/config/schemas.js.map +1 -1
  21. package/dist/hooks/distribution.js +3 -1
  22. package/dist/hooks/distribution.js.map +1 -1
  23. package/dist/hooks/library.d.ts +1 -1
  24. package/dist/hooks/library.js +3 -3
  25. package/dist/hooks/library.js.map +1 -1
  26. package/dist/index.js +323 -67
  27. package/dist/index.js.map +1 -1
  28. package/dist/library/distribute-bundle.d.ts +3 -0
  29. package/dist/library/distribute-bundle.js +4 -0
  30. package/dist/library/distribute-bundle.js.map +1 -1
  31. package/dist/library/distribute.d.ts +1 -0
  32. package/dist/library/distribute.js +2 -0
  33. package/dist/library/distribute.js.map +1 -1
  34. package/dist/library/sources.d.ts +3 -2
  35. package/dist/library/sources.js +16 -17
  36. package/dist/library/sources.js.map +1 -1
  37. package/dist/library/state.d.ts +6 -6
  38. package/dist/library/state.js +15 -15
  39. package/dist/library/state.js.map +1 -1
  40. package/dist/marketplace/plugin-loader.d.ts +3 -0
  41. package/dist/marketplace/plugin-loader.js +53 -2
  42. package/dist/marketplace/plugin-loader.js.map +1 -1
  43. package/dist/marketplace/reader.d.ts +22 -0
  44. package/dist/marketplace/reader.js +122 -17
  45. package/dist/marketplace/reader.js.map +1 -1
  46. package/dist/marketplace/schemas.d.ts +48 -12
  47. package/dist/marketplace/schemas.js +4 -1
  48. package/dist/marketplace/schemas.js.map +1 -1
  49. package/dist/marketplace/source-loader.d.ts +6 -6
  50. package/dist/marketplace/source-loader.js +8 -8
  51. package/dist/marketplace/source-loader.js.map +1 -1
  52. package/dist/plugins/index.d.ts +57 -0
  53. package/dist/plugins/index.js +304 -0
  54. package/dist/plugins/index.js.map +1 -0
  55. package/dist/rules/composer.js +4 -4
  56. package/dist/rules/composer.js.map +1 -1
  57. package/dist/rules/inventory.js +1 -1
  58. package/dist/rules/inventory.js.map +1 -1
  59. package/dist/rules/library.d.ts +1 -1
  60. package/dist/rules/library.js +19 -3
  61. package/dist/rules/library.js.map +1 -1
  62. package/dist/rules/schema.d.ts +3 -3
  63. package/dist/rules/schema.js +1 -1
  64. package/dist/rules/schema.js.map +1 -1
  65. package/dist/rules/state.js +12 -12
  66. package/dist/rules/state.js.map +1 -1
  67. package/dist/skills/distribution.js +11 -5
  68. package/dist/skills/distribution.js.map +1 -1
  69. package/dist/skills/inventory.js +1 -1
  70. package/dist/skills/inventory.js.map +1 -1
  71. package/dist/skills/library.d.ts +1 -1
  72. package/dist/skills/library.js +3 -3
  73. package/dist/skills/library.js.map +1 -1
  74. package/dist/subagents/distribution.js +4 -2
  75. package/dist/subagents/distribution.js.map +1 -1
  76. package/dist/subagents/inventory.js +1 -1
  77. package/dist/subagents/inventory.js.map +1 -1
  78. package/dist/subagents/library.d.ts +1 -1
  79. package/dist/subagents/library.js +3 -3
  80. package/dist/subagents/library.js.map +1 -1
  81. package/dist/ui/library-selector.d.ts +1 -1
  82. package/dist/ui/library-selector.js +7 -7
  83. package/dist/ui/library-selector.js.map +1 -1
  84. package/dist/ui/plugin-ui.d.ts +3 -0
  85. package/dist/ui/plugin-ui.js +77 -0
  86. package/dist/ui/plugin-ui.js.map +1 -0
  87. package/dist/ui/rule-ui.d.ts +1 -1
  88. package/dist/ui/rule-ui.js +4 -4
  89. package/dist/ui/rule-ui.js.map +1 -1
  90. package/dist/util/cli.d.ts +1 -0
  91. package/dist/util/cli.js +2 -1
  92. package/dist/util/cli.js.map +1 -1
  93. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import type { ConfigScope } from '../config/scope.js';
3
3
  declare const sectionStateSchema: z.ZodObject<{
4
- active: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
4
+ enabled: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
5
5
  agentSync: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
6
6
  hash: z.ZodOptional<z.ZodString>;
7
7
  updatedAt: z.ZodOptional<z.ZodString>;
@@ -13,7 +13,7 @@ declare const sectionStateSchema: z.ZodObject<{
13
13
  updatedAt: z.ZodOptional<z.ZodString>;
14
14
  }, z.ZodTypeAny, "passthrough">>>>;
15
15
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
16
- active: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
16
+ enabled: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
17
17
  agentSync: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
18
18
  hash: z.ZodOptional<z.ZodString>;
19
19
  updatedAt: z.ZodOptional<z.ZodString>;
@@ -25,7 +25,7 @@ declare const sectionStateSchema: z.ZodObject<{
25
25
  updatedAt: z.ZodOptional<z.ZodString>;
26
26
  }, z.ZodTypeAny, "passthrough">>>>;
27
27
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
28
- active: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
28
+ enabled: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
29
29
  agentSync: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
30
30
  hash: z.ZodOptional<z.ZodString>;
31
31
  updatedAt: z.ZodOptional<z.ZodString>;
@@ -39,9 +39,9 @@ declare const sectionStateSchema: z.ZodObject<{
39
39
  }, z.ZodTypeAny, "passthrough">>;
40
40
  export type SectionState = z.infer<typeof sectionStateSchema>;
41
41
  export type LibrarySection = 'commands' | 'agents' | 'skills' | 'hooks';
42
- export declare function loadMcpActiveState(scope?: ConfigScope): string[];
43
- export declare function hasMcpActiveInConfig(scope?: ConfigScope): boolean;
44
- export declare function saveMcpActiveState(active: string[], scope?: ConfigScope): void;
42
+ export declare function loadMcpEnabledState(scope?: ConfigScope): string[];
43
+ export declare function hasMcpEnabledInConfig(scope?: ConfigScope): boolean;
44
+ export declare function saveMcpEnabledState(enabled: string[], scope?: ConfigScope): void;
45
45
  export declare function loadLibraryStateSection(section: LibrarySection, scope?: ConfigScope): SectionState;
46
46
  export declare function saveLibraryStateSection(section: LibrarySection, state: SectionState, scope?: ConfigScope): void;
47
47
  export declare function updateLibraryStateSection(section: LibrarySection, mutator: (current: SectionState) => SectionState, scope?: ConfigScope): SectionState;
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { resolveApplicationSectionConfig } from '../config/application-config.js';
2
+ import { resolveEffectiveSectionConfig } from '../config/application-config.js';
3
3
  import { loadMergedSwitchboardConfig, updateConfigLayer } from '../config/layered-config.js';
4
4
  import { scopeToLayerOptions } from '../config/scope.js';
5
5
  const appSyncEntrySchema = z
@@ -10,29 +10,29 @@ const appSyncEntrySchema = z
10
10
  .passthrough();
11
11
  const sectionStateSchema = z
12
12
  .object({
13
- active: z.array(z.string().trim().min(1)).default([]),
13
+ enabled: z.array(z.string().trim().min(1)).default([]),
14
14
  agentSync: z.record(z.string(), appSyncEntrySchema).default({}),
15
15
  })
16
16
  .passthrough();
17
- export function loadMcpActiveState(scope) {
17
+ export function loadMcpEnabledState(scope) {
18
18
  const layerOptions = scopeToLayerOptions(scope);
19
19
  const { config } = loadMergedSwitchboardConfig(layerOptions);
20
- return [...config.mcp.active];
20
+ return [...config.mcp.enabled];
21
21
  }
22
- export function hasMcpActiveInConfig(scope) {
22
+ export function hasMcpEnabledInConfig(scope) {
23
23
  const layerOptions = scopeToLayerOptions(scope);
24
24
  const { layers } = loadMergedSwitchboardConfig(layerOptions);
25
- const checkLayer = (layer) => layer?.config?.mcp !== undefined && Array.isArray(layer.config.mcp.active);
25
+ const checkLayer = (layer) => layer?.config?.mcp !== undefined && Array.isArray(layer.config.mcp.enabled);
26
26
  return checkLayer(layers.user) || checkLayer(layers.profile) || checkLayer(layers.project);
27
27
  }
28
- export function saveMcpActiveState(active, scope) {
28
+ export function saveMcpEnabledState(enabled, scope) {
29
29
  const layerOptions = scopeToLayerOptions(scope);
30
30
  updateConfigLayer((layer) => {
31
31
  const next = { ...layer };
32
32
  const currentMcp = (next.mcp ?? {});
33
33
  next.mcp = {
34
34
  ...currentMcp,
35
- active: [...active],
35
+ enabled: [...enabled],
36
36
  };
37
37
  return next;
38
38
  }, layerOptions);
@@ -43,15 +43,15 @@ const agentSyncCache = {
43
43
  skills: {},
44
44
  hooks: {},
45
45
  };
46
- function getConfigSectionActive(section, options) {
46
+ function getConfigSectionEnabled(section, options) {
47
47
  const { config } = loadMergedSwitchboardConfig(options);
48
- return [...config[section].active];
48
+ return [...config[section].enabled];
49
49
  }
50
50
  export function loadLibraryStateSection(section, scope) {
51
51
  const layerOptions = scopeToLayerOptions(scope);
52
- const configActive = getConfigSectionActive(section, layerOptions);
52
+ const configEnabled = getConfigSectionEnabled(section, layerOptions);
53
53
  return {
54
- active: configActive,
54
+ enabled: configEnabled,
55
55
  agentSync: { ...agentSyncCache[section] },
56
56
  };
57
57
  }
@@ -63,7 +63,7 @@ export function saveLibraryStateSection(section, state, scope) {
63
63
  const current = (next[section] ?? {});
64
64
  next[section] = {
65
65
  ...current,
66
- active: [...validated.active],
66
+ enabled: [...validated.enabled],
67
67
  };
68
68
  return next;
69
69
  }, layerOptions);
@@ -80,9 +80,9 @@ export function updateLibraryStateSection(section, mutator, scope) {
80
80
  * Merges the global section config with application-specific add/remove overrides.
81
81
  */
82
82
  export function loadLibraryStateSectionForApplication(section, appId, scope) {
83
- const appConfig = resolveApplicationSectionConfig(section, appId, scope);
83
+ const appConfig = resolveEffectiveSectionConfig(section, appId, scope);
84
84
  return {
85
- active: appConfig.active,
85
+ enabled: appConfig.enabled,
86
86
  agentSync: { ...agentSyncCache[section] },
87
87
  };
88
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/library/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/library/state.ts"],"names":[],"mappings":"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"}
@@ -26,5 +26,8 @@ export interface PluginComponents {
26
26
  /**
27
27
  * Load all components (commands, agents, skills) from a single plugin directory.
28
28
  * The namespace is the plugin name, producing IDs like "plugin-name:component-id".
29
+ *
30
+ * When `customPaths` is present on the plugin (from strict mode resolution),
31
+ * commands/agents are loaded from those specific files instead of scanning directories.
29
32
  */
30
33
  export declare function loadPluginComponents(plugin: ResolvedPlugin): PluginComponents;
@@ -18,16 +18,67 @@ function toId(fileName) {
18
18
  /**
19
19
  * Load all components (commands, agents, skills) from a single plugin directory.
20
20
  * The namespace is the plugin name, producing IDs like "plugin-name:component-id".
21
+ *
22
+ * When `customPaths` is present on the plugin (from strict mode resolution),
23
+ * commands/agents are loaded from those specific files instead of scanning directories.
21
24
  */
22
25
  export function loadPluginComponents(plugin) {
23
26
  const namespace = plugin.name;
24
27
  const result = { commands: [], agents: [], skills: [], hooks: [] };
25
- result.commands = loadMarkdownEntries(path.join(plugin.localPath, 'commands'), namespace, 'command');
26
- result.agents = loadMarkdownEntries(path.join(plugin.localPath, 'agents'), namespace, 'agent');
28
+ if (plugin.customPaths?.commands) {
29
+ result.commands = loadFromCustomPaths(plugin.localPath, plugin.customPaths.commands, namespace, 'command');
30
+ }
31
+ else {
32
+ result.commands = loadMarkdownEntries(path.join(plugin.localPath, 'commands'), namespace, 'command');
33
+ }
34
+ if (plugin.customPaths?.agents) {
35
+ result.agents = loadFromCustomPaths(plugin.localPath, plugin.customPaths.agents, namespace, 'agent');
36
+ }
37
+ else {
38
+ result.agents = loadMarkdownEntries(path.join(plugin.localPath, 'agents'), namespace, 'agent');
39
+ }
27
40
  result.skills = loadSkillEntries(plugin.localPath, namespace);
28
41
  result.hooks = loadHookEntries(plugin.localPath, namespace);
29
42
  return result;
30
43
  }
44
+ /**
45
+ * Load entries from explicit file paths (custom component paths from marketplace/plugin.json).
46
+ * Paths are relative to the plugin root. Supports glob-like patterns for directory refs.
47
+ */
48
+ function loadFromCustomPaths(pluginRoot, customPaths, namespace, kind) {
49
+ const result = [];
50
+ for (const customPath of customPaths) {
51
+ const absolutePath = path.resolve(pluginRoot, customPath);
52
+ if (fs.existsSync(absolutePath) && fs.statSync(absolutePath).isDirectory()) {
53
+ result.push(...loadMarkdownEntries(absolutePath, namespace, kind));
54
+ continue;
55
+ }
56
+ if (!fs.existsSync(absolutePath))
57
+ continue;
58
+ if (!isMarkdownFile(path.basename(absolutePath)))
59
+ continue;
60
+ try {
61
+ const rawContent = fs.readFileSync(absolutePath, 'utf-8');
62
+ const parsed = parseLibraryMarkdown(rawContent);
63
+ const bareId = toId(path.basename(absolutePath));
64
+ const id = `${namespace}:${bareId}`;
65
+ result.push({
66
+ id,
67
+ bareId,
68
+ namespace,
69
+ source: path.dirname(absolutePath),
70
+ filePath: absolutePath,
71
+ metadata: parsed.metadata,
72
+ content: parsed.content,
73
+ });
74
+ }
75
+ catch (error) {
76
+ const msg = error instanceof Error ? error.message : String(error);
77
+ throw new Error(`Failed to parse plugin ${kind} at custom path "${customPath}": ${msg}`);
78
+ }
79
+ }
80
+ return result;
81
+ }
31
82
  /**
32
83
  * Load markdown-based library entries (commands or agents) from a directory.
33
84
  */
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../src/marketplace/plugin-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../src/marketplace/plugin-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAuBzD,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,WAAW,CAAC;AAC9C,CAAC;AAED,SAAS,IAAI,CAAC,QAAgB;IAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACzD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;IAC9B,MAAM,MAAM,GAAqB,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAErF,IAAI,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,QAAQ,GAAG,mBAAmB,CACnC,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,WAAW,CAAC,QAAQ,EAC3B,SAAS,EACT,SAAS,CACV,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,QAAQ,GAAG,mBAAmB,CACnC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,EACvC,SAAS,EACT,SAAS,CACV,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,GAAG,mBAAmB,CACjC,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,WAAW,CAAC,MAAM,EACzB,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,GAAG,mBAAmB,CACjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,EACrC,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAC1B,UAAkB,EAClB,WAAqB,EACrB,SAAiB,EACjB,IAAY;IAEZ,MAAM,MAAM,GAAQ,EAAE,CAAC;IAEvB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAE1D,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC3E,MAAM,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAI,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YACtE,SAAS;QACX,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,SAAS;QAC3C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAAE,SAAS;QAE3D,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;YACjD,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;YAEpC,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE;gBACF,MAAM;gBACN,SAAS;gBACT,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;gBAClC,QAAQ,EAAE,YAAY;gBACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;aACnB,CAAC,CAAC;QACV,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,oBAAoB,UAAU,MAAM,GAAG,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,SAAiB,EACjB,SAAiB,EACjB,IAAY;IAEZ,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,MAAM,GAAQ,EAAE,CAAC;IAEvB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAE7D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAE1D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;YAEpC,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE;gBACF,MAAM;gBACN,SAAS;gBACT,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,YAAY;gBACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;aACnB,CAAC,CAAC;QACV,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,SAAiB,EAAE,SAAiB;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QAEnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QAExC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;YAEpC,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE;gBACF,MAAM;gBACN,SAAS;gBACT,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,QAAQ;gBACjB,SAAS;gBACT,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,SAAiB,EAAE,SAAiB;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACrE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAElE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;YACzE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAE1D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;gBAEpC,8EAA8E;gBAC9E,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;gBAEhF,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE;oBACF,MAAM;oBACN,SAAS;oBACT,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,YAAY;oBACtB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,QAAQ,EAAE,UAAU;oBACpB,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;iBAC3C,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAClE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;gBAAE,SAAS;YAE3C,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;gBACpC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAElD,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE;oBACF,MAAM;oBACN,SAAS;oBACT,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,YAAY;oBACtB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE,SAAS;iBACnB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -4,6 +4,12 @@
4
4
  * A marketplace is a repository containing `.claude-plugin/marketplace.json`.
5
5
  * Each plugin is either a relative path within the same repo or a standalone
6
6
  * directory with `.claude-plugin/plugin.json`.
7
+ *
8
+ * PhaseB additions:
9
+ * - `github` / `git` URL source types resolve via shallow clone + cache
10
+ * - `strict` mode semantics (true => marketplace entry is authoritative)
11
+ * - `npm` / `pip` sources emit warnings (not yet implemented)
12
+ * - `ref` / `sha` pin support for reproducible builds
7
13
  */
8
14
  import { type PluginManifest } from './schemas.js';
9
15
  export interface ResolvedPlugin {
@@ -16,6 +22,17 @@ export interface ResolvedPlugin {
16
22
  manifest?: PluginManifest;
17
23
  /** Whether plugin is in strict mode */
18
24
  strict: boolean;
25
+ /**
26
+ * Custom component paths from the marketplace entry (strict mode) or
27
+ * plugin.json (non-strict). Used by the plugin loader to override
28
+ * default directory scanning.
29
+ */
30
+ customPaths?: {
31
+ commands?: string[];
32
+ agents?: string[];
33
+ };
34
+ /** MCP servers declared in the marketplace entry or plugin.json */
35
+ mcpServers?: Record<string, unknown>;
19
36
  }
20
37
  export interface MarketplaceReadResult {
21
38
  name: string;
@@ -30,6 +47,11 @@ export interface MarketplaceReadResult {
30
47
  * Check whether a local path is a Claude Code marketplace (has .claude-plugin/marketplace.json).
31
48
  */
32
49
  export declare function isMarketplace(localPath: string): boolean;
50
+ /**
51
+ * Check whether a local path is a formal single plugin (has .claude-plugin/plugin.json
52
+ * but NOT marketplace.json).
53
+ */
54
+ export declare function isFormalPlugin(localPath: string): boolean;
33
55
  /**
34
56
  * Read and resolve a marketplace, returning all resolvable plugins with metadata.
35
57
  */
@@ -4,9 +4,17 @@
4
4
  * A marketplace is a repository containing `.claude-plugin/marketplace.json`.
5
5
  * Each plugin is either a relative path within the same repo or a standalone
6
6
  * directory with `.claude-plugin/plugin.json`.
7
+ *
8
+ * PhaseB additions:
9
+ * - `github` / `git` URL source types resolve via shallow clone + cache
10
+ * - `strict` mode semantics (true => marketplace entry is authoritative)
11
+ * - `npm` / `pip` sources emit warnings (not yet implemented)
12
+ * - `ref` / `sha` pin support for reproducible builds
7
13
  */
14
+ import { execFileSync } from 'node:child_process';
8
15
  import fs from 'node:fs';
9
16
  import path from 'node:path';
17
+ import { getSourceCacheDir } from '../config/paths.js';
10
18
  import { marketplaceManifestSchema, pluginManifestSchema, } from './schemas.js';
11
19
  const MARKETPLACE_MANIFEST = '.claude-plugin/marketplace.json';
12
20
  const PLUGIN_MANIFEST = '.claude-plugin/plugin.json';
@@ -17,6 +25,16 @@ export function isMarketplace(localPath) {
17
25
  const manifestPath = path.join(localPath, MARKETPLACE_MANIFEST);
18
26
  return fs.existsSync(manifestPath);
19
27
  }
28
+ /**
29
+ * Check whether a local path is a formal single plugin (has .claude-plugin/plugin.json
30
+ * but NOT marketplace.json).
31
+ */
32
+ export function isFormalPlugin(localPath) {
33
+ if (isMarketplace(localPath))
34
+ return false;
35
+ const pluginPath = path.join(localPath, PLUGIN_MANIFEST);
36
+ return fs.existsSync(pluginPath);
37
+ }
20
38
  /**
21
39
  * Read and resolve a marketplace, returning all resolvable plugins with metadata.
22
40
  */
@@ -27,8 +45,9 @@ export function readMarketplace(localPath) {
27
45
  const manifest = marketplaceManifestSchema.parse(raw);
28
46
  const pluginRoot = manifest.metadata?.pluginRoot ?? '';
29
47
  const plugins = [];
48
+ const marketplaceNamespace = manifest.name.replace(/[^a-zA-Z0-9_-]/g, '-');
30
49
  for (const entry of manifest.plugins) {
31
- const resolved = resolvePluginDir(localPath, pluginRoot, entry.name, entry.source);
50
+ const resolved = resolvePluginDir(localPath, pluginRoot, entry.name, entry.source, marketplaceNamespace, entry.ref);
32
51
  if (!resolved) {
33
52
  warnings.push(`Plugin "${entry.name}": unsupported source type, skipped`);
34
53
  continue;
@@ -38,14 +57,8 @@ export function readMarketplace(localPath) {
38
57
  continue;
39
58
  }
40
59
  const pluginManifest = readPluginManifest(resolved);
41
- plugins.push({
42
- name: entry.name,
43
- description: entry.description ?? pluginManifest?.description,
44
- version: entry.version ?? pluginManifest?.version,
45
- localPath: resolved,
46
- manifest: pluginManifest ?? undefined,
47
- strict: entry.strict,
48
- });
60
+ const plugin = applyStrictMode(entry, pluginManifest, resolved);
61
+ plugins.push(plugin);
49
62
  }
50
63
  return {
51
64
  name: manifest.name,
@@ -54,27 +67,119 @@ export function readMarketplace(localPath) {
54
67
  warnings,
55
68
  };
56
69
  }
70
+ // ── Strict mode ────────────────────────────────────────────────────
57
71
  /**
58
- * Resolve a plugin source to a local absolute path.
59
- * Only supports relative paths and local `path` sources for MVP.
60
- * GitHub/git/npm/pip sources return null with a warning.
72
+ * Apply strict mode semantics to produce the final ResolvedPlugin.
73
+ *
74
+ * When `strict: true` (default): the marketplace entry is authoritative.
75
+ * - `commands`, `agents`, `mcpServers` from the entry take precedence.
76
+ * - `plugin.json` values are only used as fallback.
77
+ *
78
+ * When `strict: false`: `plugin.json` is authoritative.
79
+ * - The marketplace entry provides the source/name/version only.
80
+ * - Component paths and mcpServers come from `plugin.json`.
61
81
  */
62
- function resolvePluginDir(marketplaceRoot, pluginRoot, _pluginName, source) {
82
+ function applyStrictMode(entry, pluginManifest, localPath) {
83
+ const isStrict = entry.strict;
84
+ const primary = isStrict ? entry : (pluginManifest ?? entry);
85
+ const fallback = isStrict ? (pluginManifest ?? entry) : entry;
86
+ const customCommands = normalizeStringArray(primary.commands) ?? normalizeStringArray(fallback.commands);
87
+ const customAgents = normalizeStringArray(primary.agents) ?? normalizeStringArray(fallback.agents);
88
+ const mcpServers = primary.mcpServers ??
89
+ fallback.mcpServers;
90
+ const plugin = {
91
+ name: entry.name,
92
+ description: entry.description ?? pluginManifest?.description,
93
+ version: entry.version ?? pluginManifest?.version,
94
+ localPath,
95
+ manifest: pluginManifest ?? undefined,
96
+ strict: isStrict,
97
+ };
98
+ if (customCommands || customAgents) {
99
+ plugin.customPaths = {};
100
+ if (customCommands)
101
+ plugin.customPaths.commands = customCommands;
102
+ if (customAgents)
103
+ plugin.customPaths.agents = customAgents;
104
+ }
105
+ if (mcpServers && Object.keys(mcpServers).length > 0) {
106
+ plugin.mcpServers = mcpServers;
107
+ }
108
+ return plugin;
109
+ }
110
+ function normalizeStringArray(value) {
111
+ if (typeof value === 'string')
112
+ return [value];
113
+ if (Array.isArray(value))
114
+ return value.filter((v) => typeof v === 'string');
115
+ return undefined;
116
+ }
117
+ // ── Source resolution ──────────────────────────────────────────────
118
+ function resolvePluginDir(marketplaceRoot, pluginRoot, pluginName, source, marketplaceNamespace, pinRef) {
63
119
  if (typeof source === 'string') {
64
120
  if (source.startsWith('./') || source.startsWith('../') || !source.includes(':')) {
65
121
  return path.resolve(marketplaceRoot, pluginRoot, source);
66
122
  }
67
123
  return null;
68
124
  }
125
+ // Local path source
69
126
  if (source.path && typeof source.path === 'string') {
70
127
  return path.resolve(marketplaceRoot, pluginRoot, source.path);
71
128
  }
72
- // npm, pip, github, git sources are not supported in MVP
129
+ // GitHub shorthand: "org/repo" or full URL
130
+ if (source.github && typeof source.github === 'string') {
131
+ const ghUrl = source.github.includes('/')
132
+ ? source.github.startsWith('http')
133
+ ? source.github
134
+ : `https://github.com/${source.github}`
135
+ : null;
136
+ if (!ghUrl)
137
+ return null;
138
+ const cloneUrl = ghUrl.endsWith('.git') ? ghUrl : `${ghUrl}.git`;
139
+ const ref = pinRef ?? source.ref;
140
+ return cloneToCacheDir(marketplaceNamespace, pluginName, cloneUrl, ref);
141
+ }
142
+ // Git URL
143
+ if (source.git && typeof source.git === 'string') {
144
+ const ref = pinRef ?? source.ref;
145
+ return cloneToCacheDir(marketplaceNamespace, pluginName, source.git, ref);
146
+ }
147
+ // npm / pip: not yet implemented
148
+ if (source.npm && typeof source.npm === 'string') {
149
+ return null;
150
+ }
151
+ if (source.pip && typeof source.pip === 'string') {
152
+ return null;
153
+ }
73
154
  return null;
74
155
  }
75
- /**
76
- * Read optional `.claude-plugin/plugin.json` from a plugin directory.
77
- */
156
+ // ── Git caching ────────────────────────────────────────────────────
157
+ function cloneToCacheDir(marketplaceNamespace, pluginName, cloneUrl, ref) {
158
+ const cacheBase = path.join(getSourceCacheDir(), '.plugin-cache', marketplaceNamespace, pluginName);
159
+ try {
160
+ if (!fs.existsSync(path.join(cacheBase, '.git'))) {
161
+ fs.mkdirSync(path.dirname(cacheBase), { recursive: true });
162
+ const args = ['clone', '--depth', '1'];
163
+ if (ref)
164
+ args.push('--branch', ref);
165
+ args.push(cloneUrl, cacheBase);
166
+ runGit(args);
167
+ }
168
+ return cacheBase;
169
+ }
170
+ catch {
171
+ return null;
172
+ }
173
+ }
174
+ function runGit(args, options) {
175
+ return execFileSync('git', args, {
176
+ ...options,
177
+ stdio: 'pipe',
178
+ encoding: 'utf-8',
179
+ timeout: 120_000,
180
+ }).trim();
181
+ }
182
+ // ── Plugin manifest ────────────────────────────────────────────────
78
183
  function readPluginManifest(pluginDir) {
79
184
  const manifestPath = path.join(pluginDir, PLUGIN_MANIFEST);
80
185
  if (!fs.existsSync(manifestPath))
@@ -1 +1 @@
1
- {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/marketplace/reader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAEL,yBAAyB,EAEzB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAqBtB,MAAM,oBAAoB,GAAG,iCAAiC,CAAC;AAC/D,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAChE,OAAO,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAwB,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE3E,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC;IACvD,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACnF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,qCAAqC,CAAC,CAAC;YAC1E,SAAS;QACX,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,6BAA6B,QAAQ,EAAE,CAAC,CAAC;YAC5E,SAAS;QACX,CAAC;QAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAEpD,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,cAAc,EAAE,WAAW;YAC7D,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,cAAc,EAAE,OAAO;YACjD,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE,cAAc,IAAI,SAAS;YACrC,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CACvB,eAAuB,EACvB,UAAkB,EAClB,WAAmB,EACnB,MAAwC;IAExC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjF,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC;IAED,yDAAyD;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/D,OAAO,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/marketplace/reader.ts"],"names":[],"mappings":"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"}