agent-switchboard 0.2.2 → 0.3.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 (107) hide show
  1. package/README.md +68 -42
  2. package/dist/agents/registry.d.ts +0 -6
  3. package/dist/agents/registry.js +3 -13
  4. package/dist/agents/registry.js.map +1 -1
  5. package/dist/agents/trae.d.ts +16 -0
  6. package/dist/agents/trae.js +36 -0
  7. package/dist/agents/trae.js.map +1 -0
  8. package/dist/commands/distribution.d.ts +3 -4
  9. package/dist/commands/distribution.js +18 -116
  10. package/dist/commands/distribution.js.map +1 -1
  11. package/dist/config/application-config.d.ts +1 -1
  12. package/dist/config/application-config.js +2 -10
  13. package/dist/config/application-config.js.map +1 -1
  14. package/dist/config/mcp-config.js +1 -3
  15. package/dist/config/mcp-config.js.map +1 -1
  16. package/dist/config/paths.d.ts +24 -3
  17. package/dist/config/paths.js +63 -5
  18. package/dist/config/paths.js.map +1 -1
  19. package/dist/config/schemas.d.ts +331 -43
  20. package/dist/config/schemas.js +109 -15
  21. package/dist/config/schemas.js.map +1 -1
  22. package/dist/config/switchboard-config.js +0 -1
  23. package/dist/config/switchboard-config.js.map +1 -1
  24. package/dist/extensions/api.d.ts +49 -0
  25. package/dist/extensions/api.js +41 -0
  26. package/dist/extensions/api.js.map +1 -0
  27. package/dist/extensions/loader.d.ts +17 -0
  28. package/dist/extensions/loader.js +73 -0
  29. package/dist/extensions/loader.js.map +1 -0
  30. package/dist/hooks/distribution.js +1 -16
  31. package/dist/hooks/distribution.js.map +1 -1
  32. package/dist/index.js +59 -113
  33. package/dist/index.js.map +1 -1
  34. package/dist/library/distribute-bundle.js +1 -19
  35. package/dist/library/distribute-bundle.js.map +1 -1
  36. package/dist/library/fs.d.ts +12 -0
  37. package/dist/library/fs.js +81 -0
  38. package/dist/library/fs.js.map +1 -1
  39. package/dist/library/sources.d.ts +6 -1
  40. package/dist/library/sources.js +73 -16
  41. package/dist/library/sources.js.map +1 -1
  42. package/dist/rules/agents.d.ts +0 -4
  43. package/dist/rules/agents.js +0 -8
  44. package/dist/rules/agents.js.map +1 -1
  45. package/dist/rules/distribution.d.ts +1 -2
  46. package/dist/rules/distribution.js +20 -71
  47. package/dist/rules/distribution.js.map +1 -1
  48. package/dist/skills/distribution.d.ts +0 -22
  49. package/dist/skills/distribution.js +84 -157
  50. package/dist/skills/distribution.js.map +1 -1
  51. package/dist/skills/importer.js +2 -33
  52. package/dist/skills/importer.js.map +1 -1
  53. package/dist/subagents/codex-distribute.d.ts +13 -0
  54. package/dist/subagents/codex-distribute.js +273 -0
  55. package/dist/subagents/codex-distribute.js.map +1 -0
  56. package/dist/subagents/distribution.d.ts +3 -4
  57. package/dist/subagents/distribution.js +30 -410
  58. package/dist/subagents/distribution.js.map +1 -1
  59. package/dist/targets/builtin/claude-code.d.ts +2 -0
  60. package/dist/targets/builtin/claude-code.js +73 -0
  61. package/dist/targets/builtin/claude-code.js.map +1 -0
  62. package/dist/targets/builtin/claude-desktop.d.ts +2 -0
  63. package/dist/targets/builtin/claude-desktop.js +10 -0
  64. package/dist/targets/builtin/claude-desktop.js.map +1 -0
  65. package/dist/targets/builtin/codex.d.ts +3 -0
  66. package/dist/targets/builtin/codex.js +57 -0
  67. package/dist/targets/builtin/codex.js.map +1 -0
  68. package/dist/targets/builtin/common.d.ts +22 -0
  69. package/dist/targets/builtin/common.js +55 -0
  70. package/dist/targets/builtin/common.js.map +1 -0
  71. package/dist/targets/builtin/cursor.d.ts +2 -0
  72. package/dist/targets/builtin/cursor.js +95 -0
  73. package/dist/targets/builtin/cursor.js.map +1 -0
  74. package/dist/targets/builtin/gemini.d.ts +2 -0
  75. package/dist/targets/builtin/gemini.js +62 -0
  76. package/dist/targets/builtin/gemini.js.map +1 -0
  77. package/dist/targets/builtin/index.d.ts +10 -0
  78. package/dist/targets/builtin/index.js +19 -0
  79. package/dist/targets/builtin/index.js.map +1 -0
  80. package/dist/targets/builtin/opencode.d.ts +2 -0
  81. package/dist/targets/builtin/opencode.js +67 -0
  82. package/dist/targets/builtin/opencode.js.map +1 -0
  83. package/dist/targets/builtin/trae.d.ts +3 -0
  84. package/dist/targets/builtin/trae.js +54 -0
  85. package/dist/targets/builtin/trae.js.map +1 -0
  86. package/dist/targets/dsl/compiler.d.ts +13 -0
  87. package/dist/targets/dsl/compiler.js +215 -0
  88. package/dist/targets/dsl/compiler.js.map +1 -0
  89. package/dist/targets/dsl/index.d.ts +2 -0
  90. package/dist/targets/dsl/index.js +3 -0
  91. package/dist/targets/dsl/index.js.map +1 -0
  92. package/dist/targets/dsl/transforms.d.ts +77 -0
  93. package/dist/targets/dsl/transforms.js +159 -0
  94. package/dist/targets/dsl/transforms.js.map +1 -0
  95. package/dist/targets/init.d.ts +14 -0
  96. package/dist/targets/init.js +28 -0
  97. package/dist/targets/init.js.map +1 -0
  98. package/dist/targets/registry.d.ts +36 -0
  99. package/dist/targets/registry.js +97 -0
  100. package/dist/targets/registry.js.map +1 -0
  101. package/dist/targets/types.d.ts +91 -0
  102. package/dist/targets/types.js +28 -0
  103. package/dist/targets/types.js.map +1 -0
  104. package/dist/ui/plugin-ui.d.ts +1 -1
  105. package/dist/ui/plugin-ui.js +5 -12
  106. package/dist/ui/plugin-ui.js.map +1 -1
  107. package/package.json +1 -1
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Compiles a config-driven TargetSpec (from [targets.<id>] in config.toml)
3
+ * into a fully functional ApplicationTarget.
4
+ *
5
+ * The spec is intentionally permissive at the Zod schema level (passthrough);
6
+ * structural validation happens here at compile time with clear error messages.
7
+ */
8
+ import fs from 'node:fs';
9
+ import os from 'node:os';
10
+ import path from 'node:path';
11
+ import { parse as parseYaml, stringify as toYaml } from 'yaml';
12
+ import { wrapFrontmatter } from '../../util/frontmatter.js';
13
+ import { extractMdId, resolveProjectRoot, wrapMdcFrontmatter } from '../builtin/common.js';
14
+ import { transformFrontmatter, transformMcpServers, } from './transforms.js';
15
+ function expandPath(p) {
16
+ if (p.startsWith('~/'))
17
+ return path.join(os.homedir(), p.slice(2));
18
+ return p;
19
+ }
20
+ function requireString(obj, key, context) {
21
+ const val = obj[key];
22
+ if (typeof val !== 'string' || val.trim().length === 0) {
23
+ throw new Error(`[targets.${context}] missing required string field "${key}"`);
24
+ }
25
+ return val.trim();
26
+ }
27
+ function optionalString(obj, key) {
28
+ const val = obj[key];
29
+ return typeof val === 'string' && val.trim().length > 0 ? val.trim() : undefined;
30
+ }
31
+ function optionalRecord(obj, key) {
32
+ const val = obj[key];
33
+ return typeof val === 'object' && val !== null && !Array.isArray(val)
34
+ ? val
35
+ : undefined;
36
+ }
37
+ function optionalStringArray(obj, key) {
38
+ const val = obj[key];
39
+ if (!Array.isArray(val))
40
+ return undefined;
41
+ return val.filter((v) => typeof v === 'string');
42
+ }
43
+ function parseFrontmatterSpec(spec) {
44
+ if (!spec)
45
+ return undefined;
46
+ return {
47
+ rename: optionalRecord(spec, 'rename'),
48
+ omit: optionalStringArray(spec, 'omit'),
49
+ include: optionalStringArray(spec, 'include'),
50
+ join: optionalRecord(spec, 'join'),
51
+ defaults: optionalRecord(spec, 'defaults'),
52
+ };
53
+ }
54
+ function compileMcpHandler(id, spec) {
55
+ const format = requireString(spec, 'format', `${id}.mcp`);
56
+ const configPath = requireString(spec, 'config_path', `${id}.mcp`);
57
+ const projectConfigPath = optionalString(spec, 'project_config_path');
58
+ const rootKey = optionalString(spec, 'root_key') ?? 'mcpServers';
59
+ const structure = (optionalString(spec, 'structure') ?? 'record');
60
+ const keyField = optionalString(spec, 'key_field') ?? 'name';
61
+ const pipeline = {
62
+ structure,
63
+ keyField,
64
+ defaults: optionalRecord(spec, 'defaults'),
65
+ };
66
+ const envSpec = optionalRecord(spec, 'env_transform');
67
+ if (envSpec) {
68
+ pipeline.envTransform = {
69
+ keyName: optionalString(envSpec, 'key_name'),
70
+ valueName: optionalString(envSpec, 'value_name'),
71
+ };
72
+ }
73
+ const serialize = format === 'yaml'
74
+ ? (data) => toYaml(data, { lineWidth: 0 })
75
+ : (data) => `${JSON.stringify(data, null, 2)}\n`;
76
+ const parseRaw = format === 'yaml'
77
+ ? (content) => parseYaml(content)
78
+ : (content) => JSON.parse(content);
79
+ function writeConfig(filePath, config) {
80
+ const resolved = expandPath(filePath);
81
+ const dir = path.dirname(resolved);
82
+ if (!fs.existsSync(dir))
83
+ fs.mkdirSync(dir, { recursive: true });
84
+ let existing = {};
85
+ if (fs.existsSync(resolved)) {
86
+ let raw;
87
+ try {
88
+ raw = parseRaw(fs.readFileSync(resolved, 'utf-8'));
89
+ }
90
+ catch (err) {
91
+ const msg = err instanceof Error ? err.message : String(err);
92
+ throw new Error(`[targets.${id}.mcp] Cannot parse ${resolved}: ${msg}`);
93
+ }
94
+ if (raw == null) {
95
+ existing = {};
96
+ }
97
+ else if (typeof raw === 'object' && !Array.isArray(raw)) {
98
+ existing = raw;
99
+ }
100
+ else {
101
+ const kind = Array.isArray(raw) ? 'array' : typeof raw;
102
+ throw new Error(`[targets.${id}.mcp] Config root must be an object, got ${kind} in ${resolved}`);
103
+ }
104
+ }
105
+ const transformed = transformMcpServers(config.mcpServers, pipeline);
106
+ existing[rootKey] = transformed;
107
+ fs.writeFileSync(resolved, serialize(existing), 'utf-8');
108
+ }
109
+ return {
110
+ configPath: () => expandPath(configPath),
111
+ ...(projectConfigPath
112
+ ? {
113
+ projectConfigPath: (root) => path.join(path.resolve(root), expandPath(projectConfigPath)),
114
+ }
115
+ : {}),
116
+ applyConfig: (config) => writeConfig(configPath, config),
117
+ ...(projectConfigPath
118
+ ? {
119
+ applyProjectConfig: (root, config) => {
120
+ const p = path.join(path.resolve(root), expandPath(projectConfigPath));
121
+ writeConfig(p, config);
122
+ },
123
+ }
124
+ : {}),
125
+ };
126
+ }
127
+ function compileRulesHandler(id, spec) {
128
+ const format = (optionalString(spec, 'format') ?? 'markdown');
129
+ const filePath = requireString(spec, 'file_path', `${id}.rules`);
130
+ const projectFilePath = optionalString(spec, 'project_file_path');
131
+ return {
132
+ resolveFilePath: (scope) => {
133
+ const root = resolveProjectRoot(scope);
134
+ if (root && projectFilePath)
135
+ return path.join(root, expandPath(projectFilePath));
136
+ return expandPath(filePath);
137
+ },
138
+ render: format === 'mdc' ? wrapMdcFrontmatter : (content) => content,
139
+ };
140
+ }
141
+ function compileLibraryHandler(id, section, spec) {
142
+ const targetDir = requireString(spec, 'target_dir', `${id}.${section}`);
143
+ const projectTargetDir = optionalString(spec, 'project_target_dir');
144
+ const filenamePattern = optionalString(spec, 'filename_pattern') ?? '{id}.md';
145
+ const platformKey = optionalString(spec, 'platform_key') ?? id;
146
+ const fmSpec = parseFrontmatterSpec(optionalRecord(spec, 'frontmatter'));
147
+ return {
148
+ resolveTargetDir: (scope) => {
149
+ const root = resolveProjectRoot(scope);
150
+ if (root && projectTargetDir)
151
+ return path.join(root, expandPath(projectTargetDir));
152
+ return expandPath(targetDir);
153
+ },
154
+ getFilename: (entryId) => filenamePattern.replace('{id}', entryId),
155
+ render: (entry) => {
156
+ const baseFm = {};
157
+ if (entry.metadata.description)
158
+ baseFm.description = entry.metadata.description;
159
+ const extras = entry.metadata.extras;
160
+ if (extras && typeof extras[platformKey] === 'object' && extras[platformKey] !== null) {
161
+ Object.assign(baseFm, extras[platformKey]);
162
+ }
163
+ const fm = fmSpec ? transformFrontmatter(baseFm, fmSpec) : baseFm;
164
+ return wrapFrontmatter(fm, entry.content);
165
+ },
166
+ extractIdFromFilename: extractMdId,
167
+ };
168
+ }
169
+ function compileSkillsHandler(id, spec) {
170
+ const parentDir = requireString(spec, 'parent_dir', `${id}.skills`);
171
+ const projectParentDir = optionalString(spec, 'project_parent_dir');
172
+ return {
173
+ resolveParentDir: (scope) => {
174
+ const root = resolveProjectRoot(scope);
175
+ if (root && projectParentDir)
176
+ return path.join(root, expandPath(projectParentDir));
177
+ return expandPath(parentDir);
178
+ },
179
+ resolveTargetDir: (entryId, scope) => {
180
+ const root = resolveProjectRoot(scope);
181
+ if (root && projectParentDir)
182
+ return path.join(root, expandPath(projectParentDir), entryId);
183
+ return path.join(expandPath(parentDir), entryId);
184
+ },
185
+ };
186
+ }
187
+ /**
188
+ * Compile a TargetSpec into a fully functional ApplicationTarget.
189
+ * Throws descriptive errors on invalid specs.
190
+ */
191
+ export function compileTargetSpec(id, spec) {
192
+ const target = { id };
193
+ const mcpSpec = optionalRecord(spec, 'mcp');
194
+ if (mcpSpec) {
195
+ target.mcp = compileMcpHandler(id, mcpSpec);
196
+ }
197
+ const rulesSpec = optionalRecord(spec, 'rules');
198
+ if (rulesSpec) {
199
+ target.rules = compileRulesHandler(id, rulesSpec);
200
+ }
201
+ const commandsSpec = optionalRecord(spec, 'commands');
202
+ if (commandsSpec) {
203
+ target.commands = compileLibraryHandler(id, 'commands', commandsSpec);
204
+ }
205
+ const agentsSpec = optionalRecord(spec, 'agents');
206
+ if (agentsSpec) {
207
+ target.agents = compileLibraryHandler(id, 'agents', agentsSpec);
208
+ }
209
+ const skillsSpec = optionalRecord(spec, 'skills');
210
+ if (skillsSpec) {
211
+ target.skills = compileSkillsHandler(id, skillsSpec);
212
+ }
213
+ return target;
214
+ }
215
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../../src/targets/dsl/compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { compileTargetSpec } from './compiler.js';
2
+ export { applyDefaults, envMapToKvArray, type FrontmatterTransformSpec, joinFields, keyedArrayToRecord, kvArrayToEnvMap, type McpTransformPipeline, omitFields, pickFields, recordToKeyedArray, renameFields, transformFrontmatter, transformMcpServers, } from './transforms.js';
@@ -0,0 +1,3 @@
1
+ export { compileTargetSpec } from './compiler.js';
2
+ export { applyDefaults, envMapToKvArray, joinFields, keyedArrayToRecord, kvArrayToEnvMap, omitFields, pickFields, recordToKeyedArray, renameFields, transformFrontmatter, transformMcpServers, } from './transforms.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/targets/dsl/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,aAAa,EACb,eAAe,EAEf,UAAU,EACV,kBAAkB,EAClB,eAAe,EAEf,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Pure data transformation operators for config-driven targets.
3
+ *
4
+ * These operators handle the structural differences between ASB's internal
5
+ * representation and target-specific formats (e.g., keyed-array MCP,
6
+ * env kv-arrays, field renaming).
7
+ *
8
+ * All functions are pure and composable; they are used both by the DSL
9
+ * compiler (for config-driven targets) and directly by extension authors.
10
+ */
11
+ /**
12
+ * Convert a record `{ key: value }` to a keyed array `[{ keyField: key, ...value }]`.
13
+ *
14
+ * Example: `{ "my-server": { command: "node" } }` with keyField="name"
15
+ * → `[{ name: "my-server", command: "node" }]`
16
+ */
17
+ export declare function recordToKeyedArray(record: Record<string, Record<string, unknown>>, keyField: string): Array<Record<string, unknown>>;
18
+ /**
19
+ * Convert a keyed array `[{ keyField: key, ...rest }]` back to a record.
20
+ */
21
+ export declare function keyedArrayToRecord(array: Array<Record<string, unknown>>, keyField: string): Record<string, Record<string, unknown>>;
22
+ /**
23
+ * Convert a flat env map `{ KEY: "val" }` to a kv-array `[{ key: "KEY", value: "val" }]`.
24
+ */
25
+ export declare function envMapToKvArray(env: Record<string, string>, keyName?: string, valueName?: string): Array<Record<string, string>>;
26
+ /**
27
+ * Convert a kv-array `[{ key: "KEY", value: "val" }]` back to a flat env map.
28
+ */
29
+ export declare function kvArrayToEnvMap(array: Array<Record<string, string>>, keyName?: string, valueName?: string): Record<string, string>;
30
+ /**
31
+ * Rename fields in an object according to a mapping.
32
+ * Keys not in the mapping are passed through unchanged.
33
+ */
34
+ export declare function renameFields(obj: Record<string, unknown>, mapping: Record<string, string>): Record<string, unknown>;
35
+ /**
36
+ * Omit specified fields from an object.
37
+ */
38
+ export declare function omitFields(obj: Record<string, unknown>, fields: string[]): Record<string, unknown>;
39
+ /**
40
+ * Include only specified fields from an object.
41
+ */
42
+ export declare function pickFields(obj: Record<string, unknown>, fields: string[]): Record<string, unknown>;
43
+ /**
44
+ * Set default values for fields that are absent or undefined.
45
+ */
46
+ export declare function applyDefaults(obj: Record<string, unknown>, defaults: Record<string, unknown>): Record<string, unknown>;
47
+ /**
48
+ * Join array field values into a delimited string.
49
+ * E.g., `{ tools: ["Read", "Write"] }` with `join = { tools: "," }`
50
+ * → `{ tools: "Read,Write" }`
51
+ */
52
+ export declare function joinFields(obj: Record<string, unknown>, joinMap: Record<string, string>): Record<string, unknown>;
53
+ export interface McpTransformPipeline {
54
+ structure?: 'record' | 'keyed-array';
55
+ keyField?: string;
56
+ envTransform?: {
57
+ keyName?: string;
58
+ valueName?: string;
59
+ };
60
+ defaults?: Record<string, unknown>;
61
+ }
62
+ /**
63
+ * Apply an MCP transform pipeline to the servers record.
64
+ * Handles: env map→kv-array, default fields, record→keyed-array conversion.
65
+ */
66
+ export declare function transformMcpServers(servers: Record<string, Record<string, unknown>>, pipeline: McpTransformPipeline): Record<string, Record<string, unknown>> | Array<Record<string, unknown>>;
67
+ export interface FrontmatterTransformSpec {
68
+ rename?: Record<string, string>;
69
+ omit?: string[];
70
+ include?: string[];
71
+ join?: Record<string, string>;
72
+ defaults?: Record<string, unknown>;
73
+ }
74
+ /**
75
+ * Apply a frontmatter transform pipeline: defaults → join → omit/include → rename.
76
+ */
77
+ export declare function transformFrontmatter(fm: Record<string, unknown>, spec: FrontmatterTransformSpec): Record<string, unknown>;
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Pure data transformation operators for config-driven targets.
3
+ *
4
+ * These operators handle the structural differences between ASB's internal
5
+ * representation and target-specific formats (e.g., keyed-array MCP,
6
+ * env kv-arrays, field renaming).
7
+ *
8
+ * All functions are pure and composable; they are used both by the DSL
9
+ * compiler (for config-driven targets) and directly by extension authors.
10
+ */
11
+ /**
12
+ * Convert a record `{ key: value }` to a keyed array `[{ keyField: key, ...value }]`.
13
+ *
14
+ * Example: `{ "my-server": { command: "node" } }` with keyField="name"
15
+ * → `[{ name: "my-server", command: "node" }]`
16
+ */
17
+ export function recordToKeyedArray(record, keyField) {
18
+ return Object.entries(record).map(([key, value]) => ({
19
+ [keyField]: key,
20
+ ...value,
21
+ }));
22
+ }
23
+ /**
24
+ * Convert a keyed array `[{ keyField: key, ...rest }]` back to a record.
25
+ */
26
+ export function keyedArrayToRecord(array, keyField) {
27
+ const result = {};
28
+ for (const item of array) {
29
+ const key = String(item[keyField] ?? '');
30
+ if (!key)
31
+ continue;
32
+ const { [keyField]: _, ...rest } = item;
33
+ result[key] = rest;
34
+ }
35
+ return result;
36
+ }
37
+ /**
38
+ * Convert a flat env map `{ KEY: "val" }` to a kv-array `[{ key: "KEY", value: "val" }]`.
39
+ */
40
+ export function envMapToKvArray(env, keyName = 'key', valueName = 'value') {
41
+ return Object.entries(env).map(([k, v]) => ({
42
+ [keyName]: k,
43
+ [valueName]: v,
44
+ }));
45
+ }
46
+ /**
47
+ * Convert a kv-array `[{ key: "KEY", value: "val" }]` back to a flat env map.
48
+ */
49
+ export function kvArrayToEnvMap(array, keyName = 'key', valueName = 'value') {
50
+ const result = {};
51
+ for (const item of array) {
52
+ const k = item[keyName];
53
+ const v = item[valueName];
54
+ if (typeof k === 'string' && typeof v === 'string')
55
+ result[k] = v;
56
+ }
57
+ return result;
58
+ }
59
+ /**
60
+ * Rename fields in an object according to a mapping.
61
+ * Keys not in the mapping are passed through unchanged.
62
+ */
63
+ export function renameFields(obj, mapping) {
64
+ const result = {};
65
+ for (const [k, v] of Object.entries(obj)) {
66
+ result[mapping[k] ?? k] = v;
67
+ }
68
+ return result;
69
+ }
70
+ /**
71
+ * Omit specified fields from an object.
72
+ */
73
+ export function omitFields(obj, fields) {
74
+ const omitSet = new Set(fields);
75
+ const result = {};
76
+ for (const [k, v] of Object.entries(obj)) {
77
+ if (!omitSet.has(k))
78
+ result[k] = v;
79
+ }
80
+ return result;
81
+ }
82
+ /**
83
+ * Include only specified fields from an object.
84
+ */
85
+ export function pickFields(obj, fields) {
86
+ const result = {};
87
+ for (const f of fields) {
88
+ if (f in obj)
89
+ result[f] = obj[f];
90
+ }
91
+ return result;
92
+ }
93
+ /**
94
+ * Set default values for fields that are absent or undefined.
95
+ */
96
+ export function applyDefaults(obj, defaults) {
97
+ const result = { ...obj };
98
+ for (const [k, v] of Object.entries(defaults)) {
99
+ if (result[k] === undefined)
100
+ result[k] = v;
101
+ }
102
+ return result;
103
+ }
104
+ /**
105
+ * Join array field values into a delimited string.
106
+ * E.g., `{ tools: ["Read", "Write"] }` with `join = { tools: "," }`
107
+ * → `{ tools: "Read,Write" }`
108
+ */
109
+ export function joinFields(obj, joinMap) {
110
+ const result = { ...obj };
111
+ for (const [field, delimiter] of Object.entries(joinMap)) {
112
+ const val = result[field];
113
+ if (Array.isArray(val)) {
114
+ result[field] = val.join(delimiter);
115
+ }
116
+ }
117
+ return result;
118
+ }
119
+ /**
120
+ * Apply an MCP transform pipeline to the servers record.
121
+ * Handles: env map→kv-array, default fields, record→keyed-array conversion.
122
+ */
123
+ export function transformMcpServers(servers, pipeline) {
124
+ const transformed = {};
125
+ for (const [name, server] of Object.entries(servers)) {
126
+ let s = { ...server };
127
+ if (pipeline.envTransform && s.env && typeof s.env === 'object' && !Array.isArray(s.env)) {
128
+ s.env = envMapToKvArray(s.env, pipeline.envTransform.keyName, pipeline.envTransform.valueName);
129
+ }
130
+ if (pipeline.defaults) {
131
+ s = applyDefaults(s, pipeline.defaults);
132
+ }
133
+ transformed[name] = s;
134
+ }
135
+ if (pipeline.structure === 'keyed-array') {
136
+ return recordToKeyedArray(transformed, pipeline.keyField ?? 'name');
137
+ }
138
+ return transformed;
139
+ }
140
+ /**
141
+ * Apply a frontmatter transform pipeline: defaults → join → omit/include → rename.
142
+ */
143
+ export function transformFrontmatter(fm, spec) {
144
+ let result = { ...fm };
145
+ if (spec.defaults)
146
+ result = applyDefaults(result, spec.defaults);
147
+ if (spec.join)
148
+ result = joinFields(result, spec.join);
149
+ if (spec.include) {
150
+ result = pickFields(result, spec.include);
151
+ }
152
+ else if (spec.omit) {
153
+ result = omitFields(result, spec.omit);
154
+ }
155
+ if (spec.rename)
156
+ result = renameFields(result, spec.rename);
157
+ return result;
158
+ }
159
+ //# sourceMappingURL=transforms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.js","sourceRoot":"","sources":["../../../src/targets/dsl/transforms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Target system initialization.
3
+ *
4
+ * Registers config-driven targets and loads extension modules.
5
+ * Should be called once after config is loaded, before distribution.
6
+ */
7
+ import type { SwitchboardConfig } from '../config/schemas.js';
8
+ /**
9
+ * Initialize the target system: compile config-driven targets, load extensions.
10
+ * Safe to call multiple times; only runs initialization once.
11
+ */
12
+ export declare function initTargets(config: SwitchboardConfig): Promise<void>;
13
+ /** Reset initialization state (for testing) */
14
+ export declare function resetTargetInit(): void;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Target system initialization.
3
+ *
4
+ * Registers config-driven targets and loads extension modules.
5
+ * Should be called once after config is loaded, before distribution.
6
+ */
7
+ import { loadExtensions } from '../extensions/loader.js';
8
+ import { registerConfigTargets } from './registry.js';
9
+ let initialized = false;
10
+ /**
11
+ * Initialize the target system: compile config-driven targets, load extensions.
12
+ * Safe to call multiple times; only runs initialization once.
13
+ */
14
+ export async function initTargets(config) {
15
+ if (initialized)
16
+ return;
17
+ initialized = true;
18
+ const targets = config.targets;
19
+ if (targets && Object.keys(targets).length > 0) {
20
+ registerConfigTargets(targets);
21
+ }
22
+ await loadExtensions(config);
23
+ }
24
+ /** Reset initialization state (for testing) */
25
+ export function resetTargetInit() {
26
+ initialized = false;
27
+ }
28
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/targets/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAyB;IACzD,IAAI,WAAW;QAAE,OAAO;IACxB,WAAW,GAAG,IAAI,CAAC;IAEnB,MAAM,OAAO,GAAI,MAAkC,CAAC,OAEvC,CAAC;IACd,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,eAAe;IAC7B,WAAW,GAAG,KAAK,CAAC;AACtB,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Application Target registry.
3
+ *
4
+ * Merges built-in targets with extension-registered targets.
5
+ * Distribution modules query this registry to discover active targets.
6
+ */
7
+ import type { ApplicationTarget, TargetSection } from './types.js';
8
+ /** Get a target by ID (built-in or extension-registered) */
9
+ export declare function getTargetById(id: string): ApplicationTarget | undefined;
10
+ /** Get all known target IDs (built-in + extension) */
11
+ export declare function allTargetIds(): string[];
12
+ /** Check if a target ID is known (built-in or extension-registered) */
13
+ export declare function isKnownTarget(id: string): boolean;
14
+ /**
15
+ * Get active targets filtered by a specific section capability.
16
+ * Only returns targets that: (1) are in activeAppIds, (2) support the section.
17
+ */
18
+ export declare function getActiveTargetsForSection(section: TargetSection, activeAppIds: string[]): ApplicationTarget[];
19
+ /**
20
+ * Register an extension-provided target.
21
+ * Extension targets take precedence over built-in targets with the same ID.
22
+ */
23
+ export declare function registerExtensionTarget(target: ApplicationTarget): void;
24
+ /**
25
+ * Get all targets (built-in + extension) that support a given section,
26
+ * regardless of whether they are in `applications.active`.
27
+ * Used by distribution modules to enumerate all known platforms.
28
+ */
29
+ export declare function getTargetsForSection(section: TargetSection): ApplicationTarget[];
30
+ /**
31
+ * Register targets defined via [targets.<id>] in config.toml.
32
+ * Each entry is compiled from its TargetSpec into an ApplicationTarget.
33
+ */
34
+ export declare function registerConfigTargets(targets: Record<string, Record<string, unknown>>): void;
35
+ /** Clear all extension targets (for testing) */
36
+ export declare function clearExtensionTargets(): void;