@microi.net/cli 5.5.8 → 5.6.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 (166) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.mcp.json +1 -1
  5. package/.workbuddy-plugin/marketplace.json +2 -2
  6. package/.workbuddy-plugin/plugin.json +1 -1
  7. package/README.md +71 -71
  8. package/assets/build-meta.json +5 -5
  9. package/assets/feature-matrix.json +129 -129
  10. package/cordis.patch.yml +1 -1
  11. package/package.json +1 -1
  12. package/scripts/codex-marketplace.json +20 -20
  13. package/scripts/mcp-codex-stdio-adapter.js +189 -189
  14. package/scripts/mcp-trae-windows-launcher.cmd +21 -21
  15. package/scripts/microi-cli-mcp.js +7 -7
  16. package/scripts/microi-codex-broker.js +447 -447
  17. package/scripts/microi-codex-router.js +582 -582
  18. package/scripts/microi-skills.meta.json +336 -336
  19. package/skills/.microi-skills-version.json +2 -2
  20. package/skills/.progressive-disclosure-manifest.json +3566 -3566
  21. package/skills/README.md +3 -3
  22. package/skills/ai-engine/SKILL.md +45 -43
  23. package/skills/ai-platform-governance/SKILL.md +177 -177
  24. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  25. package/skills/app-store/SKILL.md +177 -177
  26. package/skills/business-blueprint/SKILL.md +85 -85
  27. package/skills/datasource-engine/SKILL.md +91 -91
  28. package/skills/dos-orm/SKILL.md +81 -81
  29. package/skills/dos-orm/references/api-reference.md +229 -229
  30. package/skills/email-engine/SKILL.md +80 -80
  31. package/skills/email-engine/references/v8-email.md +34 -34
  32. package/skills/job-engine/SKILL.md +154 -143
  33. package/skills/message-notification/SKILL.md +126 -126
  34. package/skills/message-notification/agents/openai.yaml +5 -5
  35. package/skills/message-notification/references/contracts.md +102 -102
  36. package/skills/microi-ai-app-auth.js +652 -652
  37. package/skills/microi-ai-application/SKILL.md +102 -94
  38. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  39. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  40. package/skills/microi-client-frontend/SKILL.md +43 -43
  41. package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +2 -2
  42. package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +28 -28
  43. package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +56 -56
  44. package/skills/microi-codex/SKILL.md +46 -46
  45. package/skills/microi-codex-installer/SKILL.md +216 -216
  46. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  47. package/skills/microi-datasource-mapping/SKILL.md +67 -67
  48. package/skills/microi-db-schema/SKILL.md +6 -6
  49. package/skills/microi-db-schema/references/core-tables.md +18 -18
  50. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  51. package/skills/microi-db-schema/references/schema-overview.md +11 -11
  52. package/skills/microi-db-schema/references/schema.md +46 -46
  53. package/skills/microi-db-schema/references/table-catalog.md +57 -57
  54. package/skills/microi-deployment/SKILL.md +18 -1
  55. package/skills/microi-deployment/references/deployment-matrix.md +101 -101
  56. package/skills/microi-docs-coverage/SKILL.md +123 -123
  57. package/skills/microi-docs-coverage/references/capability-map.md +1 -0
  58. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  59. package/skills/microi-form-engine/SKILL.md +50 -50
  60. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  61. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  62. package/skills/microi-form-layout/SKILL.md +13 -13
  63. package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -235
  64. package/skills/microi-frontend-sdk/SKILL.md +4 -4
  65. package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +175 -175
  66. package/skills/microi-left-right-layout/SKILL.md +141 -141
  67. package/skills/microi-microservice/SKILL.md +12 -10
  68. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  69. package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +213 -213
  70. package/skills/microi-solution-quotation/SKILL.md +78 -78
  71. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  72. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  73. package/skills/microi-sso/SKILL.md +85 -85
  74. package/skills/microi-sso/references/acceptance.md +49 -49
  75. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  76. package/skills/microi-sso/references/inbound.md +53 -53
  77. package/skills/microi-sso/references/outbound.md +39 -39
  78. package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +20 -20
  79. package/skills/microi-ui/SKILL.md +7 -2
  80. package/skills/microi-uniapp-frontend/SKILL.md +134 -134
  81. package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +136 -136
  82. package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +124 -124
  83. package/skills/module-engine/SKILL.md +16 -16
  84. package/skills/ocr-engine/SKILL.md +2 -2
  85. package/skills/ocr-engine/agents/openai.yaml +1 -1
  86. package/skills/page-engine/SKILL.md +28 -28
  87. package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +126 -126
  88. package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +42 -42
  89. package/skills/performance-testing/SKILL.md +120 -120
  90. package/skills/playwright-e2e/SKILL.md +84 -84
  91. package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +68 -68
  92. package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +64 -64
  93. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +20 -20
  94. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -69
  95. package/skills/print-engine/SKILL.md +36 -36
  96. package/skills/production-readonly-audit/SKILL.md +41 -41
  97. package/skills/report-engine/SKILL.md +71 -71
  98. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  99. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  100. package/skills/scripts/validate-progressive-disclosure.mjs +52 -52
  101. package/skills/search-engine/SKILL.md +75 -75
  102. package/skills/spider-engine/SKILL.md +190 -190
  103. package/skills/system-observability/SKILL.md +162 -162
  104. package/skills/system-observability/references/memory-incident-triage.md +73 -73
  105. package/skills/translate-engine/SKILL.md +1 -1
  106. package/skills/ui-design/SKILL.md +3 -1
  107. package/skills/uniapp-mall-assets/SKILL.md +170 -170
  108. package/skills/unity-integration/SKILL.md +155 -155
  109. package/skills/unity-integration/agents/openai.yaml +4 -4
  110. package/skills/unity-integration/references/ai-app-delivery.md +103 -103
  111. package/skills/unity-integration/references/sdk-api.md +82 -82
  112. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  113. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  114. package/skills/v8-api-config/SKILL.md +378 -378
  115. package/skills/v8-cache-pattern/SKILL.md +306 -306
  116. package/skills/v8-crud-api/SKILL.md +29 -29
  117. package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +56 -56
  118. package/skills/v8-debugging/SKILL.md +143 -143
  119. package/skills/v8-explorer-tree/SKILL.md +64 -64
  120. package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +201 -201
  121. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +118 -118
  122. package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +32 -32
  123. package/skills/v8-file-upload/SKILL.md +154 -154
  124. package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +133 -133
  125. package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +138 -138
  126. package/skills/v8-formengine-http/SKILL.md +107 -107
  127. package/skills/v8-frontend-events/SKILL.md +22 -22
  128. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  129. package/skills/v8-frontend-events/references/bluetooth-print.md +247 -247
  130. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +50 -50
  131. package/skills/v8-http-integration/SKILL.md +106 -106
  132. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +31 -31
  133. package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +5 -5
  134. package/skills/v8-image-processing/SKILL.md +190 -190
  135. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  136. package/skills/v8-image-processing/references/api-reference.md +623 -623
  137. package/skills/v8-menu-buttons/SKILL.md +103 -103
  138. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +145 -145
  139. package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +228 -228
  140. package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +43 -43
  141. package/skills/v8-mongodb/SKILL.md +65 -65
  142. package/skills/v8-mq-mqtt/SKILL.md +175 -175
  143. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  144. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +137 -137
  145. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  146. package/skills/v8-saas-multi-tenant/SKILL.md +223 -223
  147. package/skills/v8-security/SKILL.md +25 -25
  148. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +122 -122
  149. package/skills/v8-sql-query/SKILL.md +127 -127
  150. package/skills/v8-table-event/SKILL.md +20 -20
  151. package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +18 -18
  152. package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +15 -15
  153. package/skills/v8-tcp-integration/SKILL.md +1 -1
  154. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  155. package/skills/v8-template-engine/SKILL.md +59 -59
  156. package/skills/v8-utilities/SKILL.md +92 -92
  157. package/skills/v8-utilities/references/client-api-index.md +143 -143
  158. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  159. package/skills/v8-utilities/references/server-api-index.md +74 -74
  160. package/skills/v8-workflow/SKILL.md +44 -44
  161. package/skills/vision-engine/SKILL.md +19 -19
  162. package/skills/vision-engine/references/architecture-and-acceptance.md +34 -34
  163. package/skills/workspace-conventions/SKILL.md +236 -236
  164. package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +208 -208
  165. package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +179 -179
  166. package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +21 -21
@@ -1,189 +1,189 @@
1
- #!/usr/bin/env node
2
- /*
3
- * Codex MCP stdio adapter for the bundled Microi MCP server.
4
- *
5
- * The MCP SDK version used by Microi currently speaks newline-delimited
6
- * JSON-RPC over stdio. Some Codex runtimes send and expect Content-Length
7
- * framed JSON-RPC. This adapter bridges both formats without changing the
8
- * normal VS Code/Cursor/Trae/Claude MCP configuration.
9
- */
10
-
11
- const childProcess = require('node:child_process');
12
- const path = require('node:path');
13
-
14
- const target = process.argv[2];
15
- if (!target) {
16
- console.error('[microi-mcp-adapter] Missing target MCP server path.');
17
- process.exit(1);
18
- }
19
-
20
- const child = childProcess.spawn(process.execPath, [target, ...process.argv.slice(3)], {
21
- cwd: process.cwd(),
22
- env: process.env,
23
- stdio: ['pipe', 'pipe', 'pipe'],
24
- windowsHide: true,
25
- });
26
-
27
- let inputBuffer = Buffer.alloc(0);
28
- let outputBuffer = Buffer.alloc(0);
29
- let clientFraming = null; // 'content-length' | 'line'
30
- let shutdownRequested = false;
31
- let requestedExitCode = 0;
32
- let forceExitTimer = null;
33
-
34
- function stopChildAndExit(exitCode = 0) {
35
- if (shutdownRequested) return;
36
- shutdownRequested = true;
37
- requestedExitCode = exitCode;
38
-
39
- if (!child.stdin.destroyed) {
40
- child.stdin.end();
41
- }
42
-
43
- if (child.exitCode !== null) {
44
- process.exit(requestedExitCode);
45
- }
46
-
47
- try {
48
- child.kill('SIGTERM');
49
- } catch {
50
- process.exit(requestedExitCode);
51
- }
52
-
53
- forceExitTimer = setTimeout(() => {
54
- try {
55
- child.kill('SIGKILL');
56
- } catch {
57
- // 子进程可能已在超时边界退出。
58
- }
59
- process.exit(requestedExitCode);
60
- }, 2000);
61
- }
62
-
63
- // Codex 会为每个 MCP 连接启动一个适配器。客户端退出、重载或异常断开时,
64
- // 必须同步终止其子 MCP 服务,否则孤儿进程会持续累积并挤占前端构建内存。
65
- process.stdin.on('end', () => stopChildAndExit(0));
66
- process.stdin.on('error', () => stopChildAndExit(1));
67
- process.stdout.on('error', error => {
68
- stopChildAndExit(error && error.code === 'EPIPE' ? 0 : 1);
69
- });
70
- process.on('disconnect', () => stopChildAndExit(0));
71
- for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {
72
- process.on(signal, () => stopChildAndExit(0));
73
- }
74
-
75
- const parentPid = process.ppid;
76
- if (parentPid > 1) {
77
- const parentWatchTimer = setInterval(() => {
78
- try {
79
- process.kill(parentPid, 0);
80
- } catch (error) {
81
- if (error && error.code === 'ESRCH') {
82
- stopChildAndExit(0);
83
- }
84
- }
85
- }, 5000);
86
- parentWatchTimer.unref();
87
- }
88
-
89
- process.on('exit', () => {
90
- if (child.exitCode === null) {
91
- try {
92
- child.kill('SIGKILL');
93
- } catch {
94
- // 退出阶段只做尽力清理。
95
- }
96
- }
97
- });
98
-
99
- function writeLineToChild(jsonText) {
100
- if (!child.stdin.destroyed) {
101
- child.stdin.write(jsonText.trimEnd() + '\n');
102
- }
103
- }
104
-
105
- function writeToClient(jsonText) {
106
- const text = jsonText.trim();
107
- if (!text) return;
108
-
109
- if (clientFraming === 'line') {
110
- process.stdout.write(text + '\n');
111
- return;
112
- }
113
-
114
- const bytes = Buffer.byteLength(text, 'utf8');
115
- process.stdout.write(`Content-Length: ${bytes}\r\n\r\n${text}`);
116
- }
117
-
118
- function processInputBuffer() {
119
- while (inputBuffer.length > 0) {
120
- const asText = inputBuffer.toString('utf8');
121
-
122
- if (/^Content-Length:/i.test(asText)) {
123
- clientFraming = 'content-length';
124
- const headerEnd = asText.indexOf('\r\n\r\n');
125
- if (headerEnd < 0) return;
126
-
127
- const header = asText.slice(0, headerEnd);
128
- const match = header.match(/Content-Length:\s*(\d+)/i);
129
- if (!match) {
130
- console.error('[microi-mcp-adapter] Invalid Content-Length header.');
131
- stopChildAndExit(1);
132
- return;
133
- }
134
-
135
- const length = Number(match[1]);
136
- const bodyStart = Buffer.byteLength(asText.slice(0, headerEnd + 4), 'utf8');
137
- if (inputBuffer.length < bodyStart + length) return;
138
-
139
- const body = inputBuffer.slice(bodyStart, bodyStart + length).toString('utf8');
140
- writeLineToChild(body);
141
- inputBuffer = inputBuffer.slice(bodyStart + length);
142
- continue;
143
- }
144
-
145
- clientFraming = clientFraming || 'line';
146
- const newline = inputBuffer.indexOf(0x0a);
147
- if (newline < 0) return;
148
-
149
- const line = inputBuffer.slice(0, newline + 1).toString('utf8').trim();
150
- inputBuffer = inputBuffer.slice(newline + 1);
151
- if (line) {
152
- writeLineToChild(line);
153
- }
154
- }
155
- }
156
-
157
- process.stdin.on('data', chunk => {
158
- inputBuffer = Buffer.concat([inputBuffer, chunk]);
159
- processInputBuffer();
160
- });
161
-
162
- child.stdout.on('data', chunk => {
163
- outputBuffer = Buffer.concat([outputBuffer, chunk]);
164
- let newlineIndex;
165
- while ((newlineIndex = outputBuffer.indexOf(0x0a)) >= 0) {
166
- const line = outputBuffer.slice(0, newlineIndex).toString('utf8').trim();
167
- outputBuffer = outputBuffer.slice(newlineIndex + 1);
168
- if (line) writeToClient(line);
169
- }
170
- });
171
-
172
- child.stderr.on('data', chunk => {
173
- process.stderr.write(chunk);
174
- });
175
-
176
- child.on('exit', code => {
177
- if (forceExitTimer) {
178
- clearTimeout(forceExitTimer);
179
- }
180
- if (outputBuffer.length > 0) {
181
- writeToClient(outputBuffer.toString('utf8'));
182
- }
183
- process.exit(shutdownRequested ? requestedExitCode : (code || 0));
184
- });
185
-
186
- child.on('error', err => {
187
- console.error(`[microi-mcp-adapter] Failed to start ${path.basename(target)}: ${err.message}`);
188
- stopChildAndExit(1);
189
- });
1
+ #!/usr/bin/env node
2
+ /*
3
+ * Codex MCP stdio adapter for the bundled Microi MCP server.
4
+ *
5
+ * The MCP SDK version used by Microi currently speaks newline-delimited
6
+ * JSON-RPC over stdio. Some Codex runtimes send and expect Content-Length
7
+ * framed JSON-RPC. This adapter bridges both formats without changing the
8
+ * normal VS Code/Cursor/Trae/Claude MCP configuration.
9
+ */
10
+
11
+ const childProcess = require('node:child_process');
12
+ const path = require('node:path');
13
+
14
+ const target = process.argv[2];
15
+ if (!target) {
16
+ console.error('[microi-mcp-adapter] Missing target MCP server path.');
17
+ process.exit(1);
18
+ }
19
+
20
+ const child = childProcess.spawn(process.execPath, [target, ...process.argv.slice(3)], {
21
+ cwd: process.cwd(),
22
+ env: process.env,
23
+ stdio: ['pipe', 'pipe', 'pipe'],
24
+ windowsHide: true,
25
+ });
26
+
27
+ let inputBuffer = Buffer.alloc(0);
28
+ let outputBuffer = Buffer.alloc(0);
29
+ let clientFraming = null; // 'content-length' | 'line'
30
+ let shutdownRequested = false;
31
+ let requestedExitCode = 0;
32
+ let forceExitTimer = null;
33
+
34
+ function stopChildAndExit(exitCode = 0) {
35
+ if (shutdownRequested) return;
36
+ shutdownRequested = true;
37
+ requestedExitCode = exitCode;
38
+
39
+ if (!child.stdin.destroyed) {
40
+ child.stdin.end();
41
+ }
42
+
43
+ if (child.exitCode !== null) {
44
+ process.exit(requestedExitCode);
45
+ }
46
+
47
+ try {
48
+ child.kill('SIGTERM');
49
+ } catch {
50
+ process.exit(requestedExitCode);
51
+ }
52
+
53
+ forceExitTimer = setTimeout(() => {
54
+ try {
55
+ child.kill('SIGKILL');
56
+ } catch {
57
+ // 子进程可能已在超时边界退出。
58
+ }
59
+ process.exit(requestedExitCode);
60
+ }, 2000);
61
+ }
62
+
63
+ // Codex 会为每个 MCP 连接启动一个适配器。客户端退出、重载或异常断开时,
64
+ // 必须同步终止其子 MCP 服务,否则孤儿进程会持续累积并挤占前端构建内存。
65
+ process.stdin.on('end', () => stopChildAndExit(0));
66
+ process.stdin.on('error', () => stopChildAndExit(1));
67
+ process.stdout.on('error', error => {
68
+ stopChildAndExit(error && error.code === 'EPIPE' ? 0 : 1);
69
+ });
70
+ process.on('disconnect', () => stopChildAndExit(0));
71
+ for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {
72
+ process.on(signal, () => stopChildAndExit(0));
73
+ }
74
+
75
+ const parentPid = process.ppid;
76
+ if (parentPid > 1) {
77
+ const parentWatchTimer = setInterval(() => {
78
+ try {
79
+ process.kill(parentPid, 0);
80
+ } catch (error) {
81
+ if (error && error.code === 'ESRCH') {
82
+ stopChildAndExit(0);
83
+ }
84
+ }
85
+ }, 5000);
86
+ parentWatchTimer.unref();
87
+ }
88
+
89
+ process.on('exit', () => {
90
+ if (child.exitCode === null) {
91
+ try {
92
+ child.kill('SIGKILL');
93
+ } catch {
94
+ // 退出阶段只做尽力清理。
95
+ }
96
+ }
97
+ });
98
+
99
+ function writeLineToChild(jsonText) {
100
+ if (!child.stdin.destroyed) {
101
+ child.stdin.write(jsonText.trimEnd() + '\n');
102
+ }
103
+ }
104
+
105
+ function writeToClient(jsonText) {
106
+ const text = jsonText.trim();
107
+ if (!text) return;
108
+
109
+ if (clientFraming === 'line') {
110
+ process.stdout.write(text + '\n');
111
+ return;
112
+ }
113
+
114
+ const bytes = Buffer.byteLength(text, 'utf8');
115
+ process.stdout.write(`Content-Length: ${bytes}\r\n\r\n${text}`);
116
+ }
117
+
118
+ function processInputBuffer() {
119
+ while (inputBuffer.length > 0) {
120
+ const asText = inputBuffer.toString('utf8');
121
+
122
+ if (/^Content-Length:/i.test(asText)) {
123
+ clientFraming = 'content-length';
124
+ const headerEnd = asText.indexOf('\r\n\r\n');
125
+ if (headerEnd < 0) return;
126
+
127
+ const header = asText.slice(0, headerEnd);
128
+ const match = header.match(/Content-Length:\s*(\d+)/i);
129
+ if (!match) {
130
+ console.error('[microi-mcp-adapter] Invalid Content-Length header.');
131
+ stopChildAndExit(1);
132
+ return;
133
+ }
134
+
135
+ const length = Number(match[1]);
136
+ const bodyStart = Buffer.byteLength(asText.slice(0, headerEnd + 4), 'utf8');
137
+ if (inputBuffer.length < bodyStart + length) return;
138
+
139
+ const body = inputBuffer.slice(bodyStart, bodyStart + length).toString('utf8');
140
+ writeLineToChild(body);
141
+ inputBuffer = inputBuffer.slice(bodyStart + length);
142
+ continue;
143
+ }
144
+
145
+ clientFraming = clientFraming || 'line';
146
+ const newline = inputBuffer.indexOf(0x0a);
147
+ if (newline < 0) return;
148
+
149
+ const line = inputBuffer.slice(0, newline + 1).toString('utf8').trim();
150
+ inputBuffer = inputBuffer.slice(newline + 1);
151
+ if (line) {
152
+ writeLineToChild(line);
153
+ }
154
+ }
155
+ }
156
+
157
+ process.stdin.on('data', chunk => {
158
+ inputBuffer = Buffer.concat([inputBuffer, chunk]);
159
+ processInputBuffer();
160
+ });
161
+
162
+ child.stdout.on('data', chunk => {
163
+ outputBuffer = Buffer.concat([outputBuffer, chunk]);
164
+ let newlineIndex;
165
+ while ((newlineIndex = outputBuffer.indexOf(0x0a)) >= 0) {
166
+ const line = outputBuffer.slice(0, newlineIndex).toString('utf8').trim();
167
+ outputBuffer = outputBuffer.slice(newlineIndex + 1);
168
+ if (line) writeToClient(line);
169
+ }
170
+ });
171
+
172
+ child.stderr.on('data', chunk => {
173
+ process.stderr.write(chunk);
174
+ });
175
+
176
+ child.on('exit', code => {
177
+ if (forceExitTimer) {
178
+ clearTimeout(forceExitTimer);
179
+ }
180
+ if (outputBuffer.length > 0) {
181
+ writeToClient(outputBuffer.toString('utf8'));
182
+ }
183
+ process.exit(shutdownRequested ? requestedExitCode : (code || 0));
184
+ });
185
+
186
+ child.on('error', err => {
187
+ console.error(`[microi-mcp-adapter] Failed to start ${path.basename(target)}: ${err.message}`);
188
+ stopChildAndExit(1);
189
+ });
@@ -1,21 +1,21 @@
1
- @echo off
2
- setlocal
3
-
4
- if "%~1"=="" (
5
- >&2 echo [microi-trae-mcp] Missing Node or Electron runtime path.
6
- exit /b 2
7
- )
8
-
9
- if "%~2"=="" (
10
- >&2 echo [microi-trae-mcp] Missing MCP adapter path.
11
- exit /b 2
12
- )
13
-
14
- if "%~3"=="" (
15
- >&2 echo [microi-trae-mcp] Missing MCP server path.
16
- exit /b 2
17
- )
18
-
19
- call "%~1" "%~2" "%~3"
20
- set "MICROI_MCP_EXIT_CODE=%ERRORLEVEL%"
21
- endlocal & exit /b %MICROI_MCP_EXIT_CODE%
1
+ @echo off
2
+ setlocal
3
+
4
+ if "%~1"=="" (
5
+ >&2 echo [microi-trae-mcp] Missing Node or Electron runtime path.
6
+ exit /b 2
7
+ )
8
+
9
+ if "%~2"=="" (
10
+ >&2 echo [microi-trae-mcp] Missing MCP adapter path.
11
+ exit /b 2
12
+ )
13
+
14
+ if "%~3"=="" (
15
+ >&2 echo [microi-trae-mcp] Missing MCP server path.
16
+ exit /b 2
17
+ )
18
+
19
+ call "%~1" "%~2" "%~3"
20
+ set "MICROI_MCP_EXIT_CODE=%ERRORLEVEL%"
21
+ endlocal & exit /b %MICROI_MCP_EXIT_CODE%
@@ -1,7 +1,7 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- // Keep the configured entry name stable and independent from mcp-server.js.
5
- // Historical VS Code extensions scanned arguments containing that basename
6
- // and rewrote them to their own extension directory during activation.
7
- require('./mcp-server.js');
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ // Keep the configured entry name stable and independent from mcp-server.js.
5
+ // Historical VS Code extensions scanned arguments containing that basename
6
+ // and rewrote them to their own extension directory during activation.
7
+ require('./mcp-server.js');