@excitedjs/dreamux 0.1.4 → 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 (78) hide show
  1. package/README.md +170 -154
  2. package/bin/tm +30 -0
  3. package/dist/admin/client.js +98 -0
  4. package/dist/admin/client.js.map +1 -0
  5. package/dist/admin/methods.js +83 -38
  6. package/dist/admin/methods.js.map +1 -1
  7. package/dist/admin/socket.js +2 -2
  8. package/dist/admin/socket.js.map +1 -1
  9. package/dist/channel/feishu-gate.js +187 -18
  10. package/dist/channel/feishu-gate.js.map +1 -1
  11. package/dist/channel/feishu-message.js +92 -0
  12. package/dist/channel/feishu-message.js.map +1 -0
  13. package/dist/cli/doctor.js +53 -58
  14. package/dist/cli/doctor.js.map +1 -1
  15. package/dist/cli/dreamux.js +72 -61
  16. package/dist/cli/dreamux.js.map +1 -1
  17. package/dist/cli/server-ctl.js +6 -8
  18. package/dist/cli/server-ctl.js.map +1 -1
  19. package/dist/cli/server.js +25 -38
  20. package/dist/cli/server.js.map +1 -1
  21. package/dist/codex/events.js +3 -2
  22. package/dist/codex/events.js.map +1 -1
  23. package/dist/codex/mcp-config.js +24 -0
  24. package/dist/codex/mcp-config.js.map +1 -0
  25. package/dist/codex/supervisor.js +16 -0
  26. package/dist/codex/supervisor.js.map +1 -1
  27. package/dist/dispatcher/approval.js +2 -3
  28. package/dist/dispatcher/approval.js.map +1 -1
  29. package/dist/dispatcher/runtime.js +195 -143
  30. package/dist/dispatcher/runtime.js.map +1 -1
  31. package/dist/dispatcher/turn-manager.js +78 -97
  32. package/dist/dispatcher/turn-manager.js.map +1 -1
  33. package/dist/feishu/bot.js +71 -9
  34. package/dist/feishu/bot.js.map +1 -1
  35. package/dist/mcp/feishu-mcp.js +269 -0
  36. package/dist/mcp/feishu-mcp.js.map +1 -0
  37. package/dist/onboard/config-files.js +60 -87
  38. package/dist/onboard/config-files.js.map +1 -1
  39. package/dist/onboard/dispatcher-skill.js +18 -0
  40. package/dist/onboard/dispatcher-skill.js.map +1 -0
  41. package/dist/onboard/run.js +40 -79
  42. package/dist/onboard/run.js.map +1 -1
  43. package/dist/onboard/service.js +6 -5
  44. package/dist/onboard/service.js.map +1 -1
  45. package/dist/onboard/uninstall.js +161 -0
  46. package/dist/onboard/uninstall.js.map +1 -0
  47. package/dist/onboard/wizard.js +12 -69
  48. package/dist/onboard/wizard.js.map +1 -1
  49. package/dist/runtime/codex-args.js +1 -1
  50. package/dist/runtime/config.js +213 -213
  51. package/dist/runtime/config.js.map +1 -1
  52. package/dist/runtime/dispatcher-codex-home.js +21 -185
  53. package/dist/runtime/dispatcher-codex-home.js.map +1 -1
  54. package/dist/runtime/dispatcher-id.js +9 -0
  55. package/dist/runtime/dispatcher-id.js.map +1 -0
  56. package/dist/runtime/dispatcher-store.js +202 -0
  57. package/dist/runtime/dispatcher-store.js.map +1 -0
  58. package/dist/runtime/package-bin.js +41 -0
  59. package/dist/runtime/package-bin.js.map +1 -0
  60. package/dist/runtime/paths.js +87 -48
  61. package/dist/runtime/paths.js.map +1 -1
  62. package/dist/runtime/secrets.js +17 -14
  63. package/dist/runtime/secrets.js.map +1 -1
  64. package/dist/server.js +112 -38
  65. package/dist/server.js.map +1 -1
  66. package/package.json +6 -6
  67. package/skills/dispatcher/SKILL.md +107 -0
  68. package/db/migrations/0001_init.sql +0 -49
  69. package/dist/channel/outbound.js +0 -12
  70. package/dist/channel/outbound.js.map +0 -1
  71. package/dist/db/repository.js +0 -223
  72. package/dist/db/repository.js.map +0 -1
  73. package/dist/db/schema.js +0 -29
  74. package/dist/db/schema.js.map +0 -1
  75. package/dist/db/types.js +0 -2
  76. package/dist/db/types.js.map +0 -1
  77. package/dist/onboard/plugins.js +0 -202
  78. package/dist/onboard/plugins.js.map +0 -1
@@ -0,0 +1,269 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { AdminClientError, sendAdminRequest, } from '../admin/client.js';
3
+ import { adminSocketPath as defaultAdminSocketPath } from '../runtime/paths.js';
4
+ import { validateDispatcherId } from '../runtime/dispatcher-id.js';
5
+ const JSONRPC_VERSION = '2.0';
6
+ const DEFAULT_MCP_PROTOCOL_VERSION = '2024-11-05';
7
+ const SUPPORTED_MCP_PROTOCOL_VERSIONS = new Set([
8
+ '2025-06-18',
9
+ '2025-03-26',
10
+ '2024-11-05',
11
+ ]);
12
+ export async function runFeishuMcp(opts) {
13
+ const dispatcherId = validateDispatcherId(opts.dispatcherId);
14
+ const socketPath = opts.adminSocketPath ?? defaultAdminSocketPath();
15
+ const input = opts.input ?? process.stdin;
16
+ const output = opts.output ?? process.stdout;
17
+ const log = opts.log ?? ((message) => console.error(message));
18
+ const lines = createInterface({ input, crlfDelay: Infinity });
19
+ for await (const line of lines) {
20
+ const trimmed = line.trim();
21
+ if (trimmed === '')
22
+ continue;
23
+ let request;
24
+ try {
25
+ request = JSON.parse(trimmed);
26
+ }
27
+ catch (err) {
28
+ write(output, errorResponse(null, -32700, parseMessage(err)));
29
+ continue;
30
+ }
31
+ try {
32
+ await handleRequest(request, {
33
+ dispatcherId,
34
+ socketPath,
35
+ output,
36
+ });
37
+ }
38
+ catch (err) {
39
+ log(`feishu-mcp: ${parseMessage(err)}`);
40
+ if (request.id !== undefined) {
41
+ write(output, errorResponse(request.id, -32603, parseMessage(err)));
42
+ }
43
+ }
44
+ }
45
+ }
46
+ async function handleRequest(request, ctx) {
47
+ if (typeof request.method !== 'string') {
48
+ if (request.id !== undefined) {
49
+ write(ctx.output, errorResponse(request.id, -32600, 'missing method'));
50
+ }
51
+ return;
52
+ }
53
+ switch (request.method) {
54
+ case 'initialize':
55
+ if (request.id !== undefined) {
56
+ write(ctx.output, okResponse(request.id, initializeResult(request.params)));
57
+ }
58
+ return;
59
+ case 'initialized':
60
+ case 'notifications/initialized':
61
+ return;
62
+ case 'tools/list':
63
+ if (request.id !== undefined) {
64
+ write(ctx.output, okResponse(request.id, { tools: feishuTools() }));
65
+ }
66
+ return;
67
+ case 'tools/call':
68
+ if (request.id !== undefined) {
69
+ write(ctx.output, okResponse(request.id, await callTool(request.params, ctx)));
70
+ }
71
+ return;
72
+ default:
73
+ if (request.id !== undefined) {
74
+ write(ctx.output, errorResponse(request.id, -32601, `unknown MCP method '${request.method}'`));
75
+ }
76
+ }
77
+ }
78
+ function initializeResult(params) {
79
+ return {
80
+ protocolVersion: negotiateProtocolVersion(params),
81
+ capabilities: {
82
+ tools: {},
83
+ },
84
+ serverInfo: {
85
+ name: 'dreamux-feishu',
86
+ version: '0.2.0',
87
+ },
88
+ };
89
+ }
90
+ function feishuTools() {
91
+ return [
92
+ {
93
+ name: 'reply',
94
+ description: 'Send a Feishu message through this dispatcher channel.',
95
+ inputSchema: {
96
+ type: 'object',
97
+ additionalProperties: false,
98
+ properties: {
99
+ chat_id: {
100
+ type: 'string',
101
+ description: 'Feishu chat id from the inbound feishu_message block.',
102
+ },
103
+ message_id: {
104
+ type: 'string',
105
+ description: 'Optional source message id to reply under.',
106
+ },
107
+ text: {
108
+ type: 'string',
109
+ description: 'Message text to send.',
110
+ },
111
+ mention_user_ids: {
112
+ type: 'array',
113
+ items: { type: 'string' },
114
+ description: 'Optional Feishu user ids to mention.',
115
+ },
116
+ },
117
+ required: ['chat_id', 'text'],
118
+ },
119
+ },
120
+ {
121
+ name: 'react',
122
+ description: 'Add a model-owned Feishu reaction through this dispatcher channel.',
123
+ inputSchema: {
124
+ type: 'object',
125
+ additionalProperties: false,
126
+ properties: {
127
+ message_id: {
128
+ type: 'string',
129
+ description: 'Feishu message id to react to.',
130
+ },
131
+ emoji: {
132
+ type: 'string',
133
+ description: 'Feishu reaction emoji key.',
134
+ },
135
+ },
136
+ required: ['message_id', 'emoji'],
137
+ },
138
+ },
139
+ ];
140
+ }
141
+ async function callTool(params, ctx) {
142
+ try {
143
+ const call = asToolCallParams(params);
144
+ if (call.name === 'reply') {
145
+ return forwardToolCall('mcp.reply', {
146
+ dispatcher_id: ctx.dispatcherId,
147
+ ...replyArgs(call.arguments),
148
+ }, ctx.socketPath, 'reply');
149
+ }
150
+ if (call.name === 'react') {
151
+ return forwardToolCall('mcp.react', {
152
+ dispatcher_id: ctx.dispatcherId,
153
+ ...reactArgs(call.arguments),
154
+ }, ctx.socketPath, 'react');
155
+ }
156
+ return toolError(`unknown Feishu tool '${String(call.name)}'`);
157
+ }
158
+ catch (err) {
159
+ return toolError(parseMessage(err));
160
+ }
161
+ }
162
+ function negotiateProtocolVersion(params) {
163
+ const requested = params !== null && typeof params === 'object' && !Array.isArray(params)
164
+ ? params['protocolVersion']
165
+ : undefined;
166
+ if (typeof requested === 'string' &&
167
+ SUPPORTED_MCP_PROTOCOL_VERSIONS.has(requested)) {
168
+ return requested;
169
+ }
170
+ return DEFAULT_MCP_PROTOCOL_VERSION;
171
+ }
172
+ async function forwardToolCall(method, params, socketPath, label) {
173
+ try {
174
+ const result = await sendAdminRequest(method, params, { socketPath });
175
+ return {
176
+ content: [{ type: 'text', text: `${label} forwarded to dreamux serve` }],
177
+ structuredContent: result,
178
+ };
179
+ }
180
+ catch (err) {
181
+ const prefix = err instanceof AdminClientError ? `[${err.code}] ` : '';
182
+ return toolError(`${prefix}${parseMessage(err)}`);
183
+ }
184
+ }
185
+ function asToolCallParams(params) {
186
+ const obj = asRecord(params, 'tools/call params');
187
+ const name = obj['name'];
188
+ if (typeof name !== 'string' || name === '') {
189
+ throw new Error('tools/call params.name must be a non-empty string');
190
+ }
191
+ return {
192
+ name,
193
+ arguments: obj['arguments'] ?? {},
194
+ };
195
+ }
196
+ function replyArgs(value) {
197
+ const obj = asRecord(value, 'reply arguments');
198
+ const chatId = requireString(obj, 'chat_id');
199
+ const text = requireString(obj, 'text');
200
+ const messageId = optionalString(obj, 'message_id');
201
+ const mentionUserIds = optionalStringArray(obj, 'mention_user_ids');
202
+ return {
203
+ chat_id: chatId,
204
+ text,
205
+ ...(messageId !== null ? { message_id: messageId } : {}),
206
+ ...(mentionUserIds !== null ? { mention_user_ids: mentionUserIds } : {}),
207
+ };
208
+ }
209
+ function reactArgs(value) {
210
+ const obj = asRecord(value, 'react arguments');
211
+ return {
212
+ message_id: requireString(obj, 'message_id'),
213
+ emoji: requireString(obj, 'emoji'),
214
+ };
215
+ }
216
+ function asRecord(value, label) {
217
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
218
+ throw new Error(`${label} must be an object`);
219
+ }
220
+ return value;
221
+ }
222
+ function requireString(obj, key) {
223
+ const value = obj[key];
224
+ if (typeof value !== 'string' || value === '') {
225
+ throw new Error(`${key} must be a non-empty string`);
226
+ }
227
+ return value;
228
+ }
229
+ function optionalString(obj, key) {
230
+ const value = obj[key];
231
+ if (value === undefined || value === null || value === '')
232
+ return null;
233
+ if (typeof value !== 'string') {
234
+ throw new Error(`${key} must be a string`);
235
+ }
236
+ return value;
237
+ }
238
+ function optionalStringArray(obj, key) {
239
+ const value = obj[key];
240
+ if (value === undefined || value === null)
241
+ return null;
242
+ if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) {
243
+ throw new Error(`${key} must be an array of strings`);
244
+ }
245
+ return value;
246
+ }
247
+ function toolError(message) {
248
+ return {
249
+ isError: true,
250
+ content: [{ type: 'text', text: message }],
251
+ };
252
+ }
253
+ function okResponse(id, result) {
254
+ return { jsonrpc: JSONRPC_VERSION, id, result };
255
+ }
256
+ function errorResponse(id, code, message) {
257
+ return {
258
+ jsonrpc: JSONRPC_VERSION,
259
+ id,
260
+ error: { code, message },
261
+ };
262
+ }
263
+ function write(output, message) {
264
+ output.write(`${JSON.stringify(message)}\n`);
265
+ }
266
+ function parseMessage(err) {
267
+ return err instanceof Error ? err.message : String(err);
268
+ }
269
+ //# sourceMappingURL=feishu-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu-mcp.js","sourceRoot":"","sources":["../../src/mcp/feishu-mcp.ts"],"names":[],"mappings":"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"}
@@ -1,28 +1,27 @@
1
- import { existsSync, readFileSync } from 'node:fs';
2
- import { parse as parseToml, stringify as stringifyToml } from 'smol-toml';
3
- import { BUILT_IN_DEFAULTS } from '../runtime/config.js';
4
- export const DISPATCHER_PERMISSION_PROFILE = 'dreamux-dispatcher';
5
- export function buildDreamuxConfigToml(answers) {
6
- return stringifyToml({
7
- runtime_dir: answers.runtimeDir,
8
- admin_socket: null,
1
+ import { BUILT_IN_DEFAULTS, stringifyConfig, } from '../runtime/config.js';
2
+ import { validateDispatcherId } from '../runtime/dispatcher-id.js';
3
+ export function buildDreamuxConfigJson(answers) {
4
+ return stringifyConfig(dreamuxConfigFromAnswers(answers));
5
+ }
6
+ export function dreamuxConfigFromAnswers(answers, existing) {
7
+ validateDispatcherId(answers.dispatcherId);
8
+ const base = existing ?? dreamuxConfigDefaultsFromAnswers(answers);
9
+ const dispatchers = base.dispatchers
10
+ .filter((dispatcher) => dispatcher.id !== answers.dispatcherId)
11
+ .map(cloneDispatcherConfig);
12
+ dispatchers.push(dispatcherConfigFromAnswers(answers));
13
+ const next = {
9
14
  codex: {
10
- bin: answers.codexBin,
11
- approval_policy: 'never',
12
- sandbox_mode: 'workspace-write',
13
- extra_args: [],
14
- initialize_timeout_ms: BUILT_IN_DEFAULTS.codex.initialize_timeout_ms,
15
+ ...base.codex,
16
+ extra_args: [...base.codex.extra_args],
15
17
  },
16
- outbound: {
17
- retries: BUILT_IN_DEFAULTS.outbound.retries,
18
- retry_delay_ms: BUILT_IN_DEFAULTS.outbound.retry_delay_ms,
19
- },
20
- });
18
+ dispatchers,
19
+ };
20
+ assertUniqueFeishuAppIds(next);
21
+ return next;
21
22
  }
22
- export function dreamuxConfigFromAnswers(answers) {
23
+ function dreamuxConfigDefaultsFromAnswers(answers) {
23
24
  return {
24
- runtime_dir: answers.runtimeDir,
25
- admin_socket: null,
26
25
  codex: {
27
26
  bin: answers.codexBin,
28
27
  approval_policy: 'never',
@@ -30,52 +29,11 @@ export function dreamuxConfigFromAnswers(answers) {
30
29
  extra_args: [],
31
30
  initialize_timeout_ms: BUILT_IN_DEFAULTS.codex.initialize_timeout_ms,
32
31
  },
33
- outbound: {
34
- retries: BUILT_IN_DEFAULTS.outbound.retries,
35
- retry_delay_ms: BUILT_IN_DEFAULTS.outbound.retry_delay_ms,
36
- },
32
+ dispatchers: [],
37
33
  };
38
34
  }
39
- export function buildDispatcherCodexConfigToml(options) {
40
- const existing = readExistingTomlObject(options.codexHomeConfigPath);
41
- const pluginKey = pluginConfigKey(options.pluginRef, options.marketplaceName);
42
- const marketplaces = objectValue(existing['marketplaces']);
43
- const marketplace = objectValue(marketplaces[options.marketplaceName]);
44
- const plugins = objectValue(existing['plugins']);
45
- const plugin = objectValue(plugins[pluginKey]);
46
- return stringifyToml({
47
- ...existing,
48
- model: options.model,
49
- approval_policy: 'never',
50
- sandbox_mode: 'workspace-write',
51
- default_permissions: DISPATCHER_PERMISSION_PROFILE,
52
- sandbox_workspace_write: {
53
- ...objectValue(existing['sandbox_workspace_write']),
54
- network_access: true,
55
- },
56
- permissions: {
57
- ...objectValue(existing['permissions']),
58
- [DISPATCHER_PERMISSION_PROFILE]: {
59
- ...objectValue(objectValue(existing['permissions'])[DISPATCHER_PERMISSION_PROFILE]),
60
- network: { enabled: true },
61
- },
62
- },
63
- marketplaces: {
64
- ...marketplaces,
65
- [options.marketplaceName]: {
66
- ...marketplace,
67
- source: options.marketplaceSource,
68
- source_type: marketplace['source_type'] ?? inferMarketplaceSourceType(options.marketplaceSource),
69
- },
70
- },
71
- plugins: {
72
- ...plugins,
73
- [pluginKey]: {
74
- ...plugin,
75
- enabled: true,
76
- },
77
- },
78
- });
35
+ export function dispatcherBotSecretRef(dispatcherId) {
36
+ return `config:${dispatcherId}`;
79
37
  }
80
38
  export function dispatcherCodexArgsJson() {
81
39
  return JSON.stringify({
@@ -84,30 +42,45 @@ export function dispatcherCodexArgsJson() {
84
42
  extraArgs: [],
85
43
  });
86
44
  }
87
- function readExistingTomlObject(path) {
88
- if (!existsSync(path))
89
- return {};
90
- const parsed = parseToml(readFileSync(path, 'utf8'));
91
- return objectValue(parsed);
92
- }
93
- function objectValue(value) {
94
- if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
95
- return value;
45
+ function assertUniqueFeishuAppIds(config) {
46
+ const seen = new Map();
47
+ for (const dispatcher of config.dispatchers) {
48
+ const existing = seen.get(dispatcher.feishu.app_id);
49
+ if (existing !== undefined && existing !== dispatcher.id) {
50
+ throw new Error(`Feishu app_id for dispatcher '${dispatcher.id}' duplicates dispatcher '${existing}'`);
51
+ }
52
+ seen.set(dispatcher.feishu.app_id, dispatcher.id);
96
53
  }
97
- return {};
98
54
  }
99
- function pluginConfigKey(pluginRef, marketplaceName) {
100
- if (pluginRef.includes('@'))
101
- return pluginRef;
102
- return `${pluginRef}@${marketplaceName}`;
55
+ function dispatcherConfigFromAnswers(answers) {
56
+ return {
57
+ id: answers.dispatcherId,
58
+ cwd: answers.dispatcherCwd,
59
+ enabled: true,
60
+ feishu: {
61
+ app_id: answers.botAppId,
62
+ app_secret: answers.botAppSecret,
63
+ },
64
+ codex: {
65
+ approval_policy: 'never',
66
+ sandbox_mode: 'workspace-write',
67
+ extra_args: [],
68
+ extra_env: {},
69
+ },
70
+ };
103
71
  }
104
- function inferMarketplaceSourceType(source) {
105
- if (source.startsWith('http://') || source.startsWith('https://')) {
106
- return 'git';
107
- }
108
- if (source.includes('/') && !source.startsWith('.') && !source.startsWith('/')) {
109
- return 'github';
110
- }
111
- return 'local';
72
+ function cloneDispatcherConfig(dispatcher) {
73
+ return {
74
+ id: dispatcher.id,
75
+ cwd: dispatcher.cwd,
76
+ enabled: dispatcher.enabled,
77
+ feishu: { ...dispatcher.feishu },
78
+ codex: {
79
+ approval_policy: dispatcher.codex.approval_policy,
80
+ sandbox_mode: dispatcher.codex.sandbox_mode,
81
+ extra_args: [...dispatcher.codex.extra_args],
82
+ extra_env: { ...dispatcher.codex.extra_env },
83
+ },
84
+ };
112
85
  }
113
86
  //# sourceMappingURL=config-files.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-files.js","sourceRoot":"","sources":["../../src/onboard/config-files.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-files.js","sourceRoot":"","sources":["../../src/onboard/config-files.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EAEjB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,MAAM,UAAU,sBAAsB,CAAC,OAAuB;IAC5D,OAAO,eAAe,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,OAAuB,EACvB,QAAwB;IAExB,oBAAoB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,QAAQ,IAAI,gCAAgC,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW;SACjC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC;SAC9D,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC9B,WAAW,CAAC,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC,CAAC;IACvD,MAAM,IAAI,GAAkB;QAC1B,KAAK,EAAE;YACL,GAAG,IAAI,CAAC,KAAK;YACb,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;SACvC;QACD,WAAW;KACZ,CAAC;IACF,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gCAAgC,CACvC,OAAuB;IAEvB,OAAO;QACL,KAAK,EAAE;YACL,GAAG,EAAE,OAAO,CAAC,QAAQ;YACrB,eAAe,EAAE,OAAO;YACxB,YAAY,EAAE,iBAAiB;YAC/B,UAAU,EAAE,EAAE;YACd,qBAAqB,EAAE,iBAAiB,CAAC,KAAK,CAAC,qBAAqB;SACrE;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,YAAoB;IACzD,OAAO,UAAU,YAAY,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,cAAc,EAAE,OAAO;QACvB,WAAW,EAAE,iBAAiB;QAC9B,SAAS,EAAE,EAAE;KACd,CAAC,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAqB;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,UAAU,CAAC,EAAE,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CACb,iCAAiC,UAAU,CAAC,EAAE,4BAA4B,QAAQ,GAAG,CACtF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAuB;IAC1D,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,YAAY;QACxB,GAAG,EAAE,OAAO,CAAC,aAAa;QAC1B,OAAO,EAAE,IAAI;QACb,MAAM,EAAE;YACN,MAAM,EAAE,OAAO,CAAC,QAAQ;YACxB,UAAU,EAAE,OAAO,CAAC,YAAY;SACjC;QACD,KAAK,EAAE;YACL,eAAe,EAAE,OAAO;YACxB,YAAY,EAAE,iBAAiB;YAC/B,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;SACd;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,UAA4B;IACzD,OAAO;QACL,EAAE,EAAE,UAAU,CAAC,EAAE;QACjB,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,MAAM,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE;QAChC,KAAK,EAAE;YACL,eAAe,EAAE,UAAU,CAAC,KAAK,CAAC,eAAe;YACjD,YAAY,EAAE,UAAU,CAAC,KAAK,CAAC,YAAY;YAC3C,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC;YAC5C,SAAS,EAAE,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE;SAC7C;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { writeTextFile } from './ledger.js';
5
+ const HERE = dirname(fileURLToPath(import.meta.url));
6
+ const PACKAGE_ROOT = dirname(dirname(HERE));
7
+ const DISPATCHER_SKILL_SOURCE = join(PACKAGE_ROOT, 'skills', 'dispatcher', 'SKILL.md');
8
+ export function installDispatcherSkill(options) {
9
+ const content = readDispatcherSkill();
10
+ writeTextFile(options.skillPath, content, options.ledger, 'workspace-local dispatcher skill', { mode: 0o600, dryRun: options.dryRun });
11
+ }
12
+ function readDispatcherSkill() {
13
+ if (!existsSync(DISPATCHER_SKILL_SOURCE)) {
14
+ throw new Error(`missing bundled dispatcher skill: ${DISPATCHER_SKILL_SOURCE}`);
15
+ }
16
+ return readFileSync(DISPATCHER_SKILL_SOURCE, 'utf8');
17
+ }
18
+ //# sourceMappingURL=dispatcher-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher-skill.js","sourceRoot":"","sources":["../../src/onboard/dispatcher-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,MAAM,uBAAuB,GAAG,IAAI,CAClC,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,UAAU,CACX,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,OAItC;IACC,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,aAAa,CACX,OAAO,CAAC,SAAS,EACjB,OAAO,EACP,OAAO,CAAC,MAAM,EACd,kCAAkC,EAClC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CACxC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB;IAC1B,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,qCAAqC,uBAAuB,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,YAAY,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC"}