scoutline 0.1.0 → 0.2.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 (206) hide show
  1. package/README.md +170 -5
  2. package/bin/scoutline.js +36 -15
  3. package/dist/capabilities/diagnostics.d.ts +97 -0
  4. package/dist/capabilities/diagnostics.d.ts.map +1 -0
  5. package/dist/capabilities/diagnostics.js +88 -0
  6. package/dist/capabilities/diagnostics.js.map +1 -0
  7. package/dist/capabilities/quota.d.ts +99 -0
  8. package/dist/capabilities/quota.d.ts.map +1 -0
  9. package/dist/capabilities/quota.js +129 -0
  10. package/dist/capabilities/quota.js.map +1 -0
  11. package/dist/capabilities/search.d.ts +110 -0
  12. package/dist/capabilities/search.d.ts.map +1 -0
  13. package/dist/capabilities/search.js +21 -0
  14. package/dist/capabilities/search.js.map +1 -0
  15. package/dist/capabilities/vision.d.ts +156 -0
  16. package/dist/capabilities/vision.d.ts.map +1 -0
  17. package/dist/capabilities/vision.js +111 -0
  18. package/dist/capabilities/vision.js.map +1 -0
  19. package/dist/command-invocation.d.ts +58 -0
  20. package/dist/command-invocation.d.ts.map +1 -0
  21. package/dist/command-invocation.js +95 -0
  22. package/dist/command-invocation.js.map +1 -0
  23. package/dist/commands/code.d.ts +11 -4
  24. package/dist/commands/code.d.ts.map +1 -1
  25. package/dist/commands/code.js +16 -42
  26. package/dist/commands/code.js.map +1 -1
  27. package/dist/commands/doctor.d.ts +58 -3
  28. package/dist/commands/doctor.d.ts.map +1 -1
  29. package/dist/commands/doctor.js +154 -52
  30. package/dist/commands/doctor.js.map +1 -1
  31. package/dist/commands/quota.d.ts +45 -3
  32. package/dist/commands/quota.d.ts.map +1 -1
  33. package/dist/commands/quota.js +116 -60
  34. package/dist/commands/quota.js.map +1 -1
  35. package/dist/commands/read.d.ts +15 -1
  36. package/dist/commands/read.d.ts.map +1 -1
  37. package/dist/commands/read.js +53 -54
  38. package/dist/commands/read.js.map +1 -1
  39. package/dist/commands/repo.d.ts +8 -3
  40. package/dist/commands/repo.d.ts.map +1 -1
  41. package/dist/commands/repo.js +40 -78
  42. package/dist/commands/repo.js.map +1 -1
  43. package/dist/commands/search.d.ts +27 -2
  44. package/dist/commands/search.d.ts.map +1 -1
  45. package/dist/commands/search.js +95 -103
  46. package/dist/commands/search.js.map +1 -1
  47. package/dist/commands/tools.d.ts +9 -3
  48. package/dist/commands/tools.d.ts.map +1 -1
  49. package/dist/commands/tools.js +29 -59
  50. package/dist/commands/tools.js.map +1 -1
  51. package/dist/commands/vision.d.ts +35 -9
  52. package/dist/commands/vision.d.ts.map +1 -1
  53. package/dist/commands/vision.js +184 -131
  54. package/dist/commands/vision.js.map +1 -1
  55. package/dist/index.d.ts +42 -1
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +389 -207
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/cache.d.ts +61 -0
  60. package/dist/lib/cache.d.ts.map +1 -1
  61. package/dist/lib/cache.js +74 -11
  62. package/dist/lib/cache.js.map +1 -1
  63. package/dist/lib/code-mode.d.ts +13 -0
  64. package/dist/lib/code-mode.d.ts.map +1 -1
  65. package/dist/lib/code-mode.js +26 -6
  66. package/dist/lib/code-mode.js.map +1 -1
  67. package/dist/lib/config.d.ts.map +1 -1
  68. package/dist/lib/config.js +15 -18
  69. package/dist/lib/config.js.map +1 -1
  70. package/dist/lib/errors.d.ts +65 -10
  71. package/dist/lib/errors.d.ts.map +1 -1
  72. package/dist/lib/errors.js +135 -19
  73. package/dist/lib/errors.js.map +1 -1
  74. package/dist/lib/execution.d.ts +76 -0
  75. package/dist/lib/execution.d.ts.map +1 -0
  76. package/dist/lib/execution.js +177 -0
  77. package/dist/lib/execution.js.map +1 -0
  78. package/dist/lib/index.d.ts +10 -2
  79. package/dist/lib/index.d.ts.map +1 -1
  80. package/dist/lib/index.js +10 -2
  81. package/dist/lib/index.js.map +1 -1
  82. package/dist/lib/mcp-client.d.ts +46 -11
  83. package/dist/lib/mcp-client.d.ts.map +1 -1
  84. package/dist/lib/mcp-client.js +92 -27
  85. package/dist/lib/mcp-client.js.map +1 -1
  86. package/dist/lib/mcp-config.d.ts +17 -0
  87. package/dist/lib/mcp-config.d.ts.map +1 -1
  88. package/dist/lib/mcp-config.js +29 -0
  89. package/dist/lib/mcp-config.js.map +1 -1
  90. package/dist/lib/monitor-client.d.ts +17 -3
  91. package/dist/lib/monitor-client.d.ts.map +1 -1
  92. package/dist/lib/monitor-client.js +23 -69
  93. package/dist/lib/monitor-client.js.map +1 -1
  94. package/dist/lib/output.d.ts +53 -7
  95. package/dist/lib/output.d.ts.map +1 -1
  96. package/dist/lib/output.js +126 -39
  97. package/dist/lib/output.js.map +1 -1
  98. package/dist/lib/redact.d.ts +62 -3
  99. package/dist/lib/redact.d.ts.map +1 -1
  100. package/dist/lib/redact.js +165 -31
  101. package/dist/lib/redact.js.map +1 -1
  102. package/dist/lib/tty.d.ts +7 -20
  103. package/dist/lib/tty.d.ts.map +1 -1
  104. package/dist/lib/tty.js +51 -30
  105. package/dist/lib/tty.js.map +1 -1
  106. package/dist/node-command-invocation-adapter.d.ts +28 -0
  107. package/dist/node-command-invocation-adapter.d.ts.map +1 -0
  108. package/dist/node-command-invocation-adapter.js +88 -0
  109. package/dist/node-command-invocation-adapter.js.map +1 -0
  110. package/dist/providers/minimax/adapter.d.ts +47 -0
  111. package/dist/providers/minimax/adapter.d.ts.map +1 -0
  112. package/dist/providers/minimax/adapter.js +443 -0
  113. package/dist/providers/minimax/adapter.js.map +1 -0
  114. package/dist/providers/minimax/config.d.ts +32 -0
  115. package/dist/providers/minimax/config.d.ts.map +1 -0
  116. package/dist/providers/minimax/config.js +84 -0
  117. package/dist/providers/minimax/config.js.map +1 -0
  118. package/dist/providers/minimax/media.d.ts +34 -0
  119. package/dist/providers/minimax/media.d.ts.map +1 -0
  120. package/dist/providers/minimax/media.js +92 -0
  121. package/dist/providers/minimax/media.js.map +1 -0
  122. package/dist/providers/minimax/quota-client.d.ts +37 -0
  123. package/dist/providers/minimax/quota-client.d.ts.map +1 -0
  124. package/dist/providers/minimax/quota-client.js +78 -0
  125. package/dist/providers/minimax/quota-client.js.map +1 -0
  126. package/dist/providers/minimax/quota.d.ts +48 -0
  127. package/dist/providers/minimax/quota.d.ts.map +1 -0
  128. package/dist/providers/minimax/quota.js +120 -0
  129. package/dist/providers/minimax/quota.js.map +1 -0
  130. package/dist/providers/minimax/sdk-client.d.ts +29 -0
  131. package/dist/providers/minimax/sdk-client.d.ts.map +1 -0
  132. package/dist/providers/minimax/sdk-client.js +50 -0
  133. package/dist/providers/minimax/sdk-client.js.map +1 -0
  134. package/dist/providers/minimax/vision-attestations.d.ts +29 -0
  135. package/dist/providers/minimax/vision-attestations.d.ts.map +1 -0
  136. package/dist/providers/minimax/vision-attestations.js +54 -0
  137. package/dist/providers/minimax/vision-attestations.js.map +1 -0
  138. package/dist/providers/minimax/vision-conformance.d.ts +184 -0
  139. package/dist/providers/minimax/vision-conformance.d.ts.map +1 -0
  140. package/dist/providers/minimax/vision-conformance.js +369 -0
  141. package/dist/providers/minimax/vision-conformance.js.map +1 -0
  142. package/dist/providers/minimax/vision-mappings/chart.d.ts +35 -0
  143. package/dist/providers/minimax/vision-mappings/chart.d.ts.map +1 -0
  144. package/dist/providers/minimax/vision-mappings/chart.js +55 -0
  145. package/dist/providers/minimax/vision-mappings/chart.js.map +1 -0
  146. package/dist/providers/minimax/vision-mappings/common.d.ts +60 -0
  147. package/dist/providers/minimax/vision-mappings/common.d.ts.map +1 -0
  148. package/dist/providers/minimax/vision-mappings/common.js +75 -0
  149. package/dist/providers/minimax/vision-mappings/common.js.map +1 -0
  150. package/dist/providers/minimax/vision-mappings/diagnose-error.d.ts +35 -0
  151. package/dist/providers/minimax/vision-mappings/diagnose-error.d.ts.map +1 -0
  152. package/dist/providers/minimax/vision-mappings/diagnose-error.js +55 -0
  153. package/dist/providers/minimax/vision-mappings/diagnose-error.js.map +1 -0
  154. package/dist/providers/minimax/vision-mappings/diagram.d.ts +35 -0
  155. package/dist/providers/minimax/vision-mappings/diagram.d.ts.map +1 -0
  156. package/dist/providers/minimax/vision-mappings/diagram.js +55 -0
  157. package/dist/providers/minimax/vision-mappings/diagram.js.map +1 -0
  158. package/dist/providers/minimax/vision-mappings/extract-text.d.ts +35 -0
  159. package/dist/providers/minimax/vision-mappings/extract-text.d.ts.map +1 -0
  160. package/dist/providers/minimax/vision-mappings/extract-text.js +55 -0
  161. package/dist/providers/minimax/vision-mappings/extract-text.js.map +1 -0
  162. package/dist/providers/minimax/vision-mappings/ui-artifact.d.ts +35 -0
  163. package/dist/providers/minimax/vision-mappings/ui-artifact.d.ts.map +1 -0
  164. package/dist/providers/minimax/vision-mappings/ui-artifact.js +69 -0
  165. package/dist/providers/minimax/vision-mappings/ui-artifact.js.map +1 -0
  166. package/dist/providers/minimax/vision-mappings.generated.d.ts +29 -0
  167. package/dist/providers/minimax/vision-mappings.generated.d.ts.map +1 -0
  168. package/dist/providers/minimax/vision-mappings.generated.js +29 -0
  169. package/dist/providers/minimax/vision-mappings.generated.js.map +1 -0
  170. package/dist/providers/minimax/vision-revisions.d.ts +22 -0
  171. package/dist/providers/minimax/vision-revisions.d.ts.map +1 -0
  172. package/dist/providers/minimax/vision-revisions.js +27 -0
  173. package/dist/providers/minimax/vision-revisions.js.map +1 -0
  174. package/dist/providers/registry.d.ts +36 -0
  175. package/dist/providers/registry.d.ts.map +1 -0
  176. package/dist/providers/registry.js +45 -0
  177. package/dist/providers/registry.js.map +1 -0
  178. package/dist/providers/selection.d.ts +44 -0
  179. package/dist/providers/selection.d.ts.map +1 -0
  180. package/dist/providers/selection.js +85 -0
  181. package/dist/providers/selection.js.map +1 -0
  182. package/dist/providers/types.d.ts +247 -0
  183. package/dist/providers/types.d.ts.map +1 -0
  184. package/dist/providers/types.js +127 -0
  185. package/dist/providers/types.js.map +1 -0
  186. package/dist/providers/zai/adapter.d.ts +35 -0
  187. package/dist/providers/zai/adapter.d.ts.map +1 -0
  188. package/dist/providers/zai/adapter.js +619 -0
  189. package/dist/providers/zai/adapter.js.map +1 -0
  190. package/dist/providers/zai/credentials.d.ts +38 -0
  191. package/dist/providers/zai/credentials.d.ts.map +1 -0
  192. package/dist/providers/zai/credentials.js +60 -0
  193. package/dist/providers/zai/credentials.js.map +1 -0
  194. package/dist/providers/zai/media.d.ts +38 -0
  195. package/dist/providers/zai/media.d.ts.map +1 -0
  196. package/dist/providers/zai/media.js +107 -0
  197. package/dist/providers/zai/media.js.map +1 -0
  198. package/dist/providers/zai/monitor-client.d.ts +53 -0
  199. package/dist/providers/zai/monitor-client.d.ts.map +1 -0
  200. package/dist/providers/zai/monitor-client.js +117 -0
  201. package/dist/providers/zai/monitor-client.js.map +1 -0
  202. package/dist/providers/zai/quota.d.ts +47 -0
  203. package/dist/providers/zai/quota.d.ts.map +1 -0
  204. package/dist/providers/zai/quota.js +127 -0
  205. package/dist/providers/zai/quota.js.map +1 -0
  206. package/package.json +10 -5
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Command Invocation Seam (DESIGN.md §2).
3
+ *
4
+ * This Module defines the pure invocation contract that separates
5
+ * command behaviour from process effects. `invokeCommand` owns
6
+ * invocation-local presentation, notice storage, and error conversion.
7
+ * The Node Adapter is the only Module that touches process streams,
8
+ * TTY state, and `process.exitCode`.
9
+ *
10
+ * Requirements: NFR-002, NFR-003, NFR-007.
11
+ */
12
+ import { formatSuccessOutput, formatErrorOutput } from "./lib/output.js";
13
+ import { getErrorExitCode } from "./lib/errors.js";
14
+ import { redactSecrets, configuredSecrets } from "./lib/redact.js";
15
+ const TEXT_OUTPUT_MODES = ["compact", "markdown", "refs", "tty"];
16
+ function isTextOutputMode(mode) {
17
+ return TEXT_OUTPUT_MODES.includes(mode);
18
+ }
19
+ /**
20
+ * Select the final output string for a successful CommandResult.
21
+ *
22
+ * - `TextCommandResult`: the text is used verbatim regardless of mode.
23
+ * - `DataCommandResult` in a text-oriented mode: a command-supplied
24
+ * presentation override is preferred; otherwise the base data is
25
+ * formatted through `formatSuccessOutput`.
26
+ * - `DataCommandResult` in a data-oriented mode: base data formatted
27
+ * through `formatSuccessOutput` (data → raw JSON, json/pretty →
28
+ * success envelope).
29
+ */
30
+ function selectOutput(result, outputMode, now) {
31
+ if (result.kind === "text") {
32
+ return result.text;
33
+ }
34
+ if (isTextOutputMode(outputMode)) {
35
+ const override = result.presentations?.[outputMode];
36
+ if (typeof override === "string") {
37
+ return override;
38
+ }
39
+ }
40
+ return formatSuccessOutput(result.data, outputMode, now);
41
+ }
42
+ /**
43
+ * Run command behaviour through the invocation seam.
44
+ *
45
+ * 1. Create invocation-local context and notice storage.
46
+ * 2. Run command behaviour through `runQuietly`.
47
+ * 3. `runQuietly` restores dependency logging before returning.
48
+ * 4. Flush notices to stderr in encounter order.
49
+ * 5. Select a presentation override or the base data.
50
+ * 6. Write one final successful value to stdout.
51
+ * 7. Convert a thrown error into one structured stderr value.
52
+ * 8. Return an exit status without terminating the process.
53
+ *
54
+ * The trailing newline is appended at the Node Adapter boundary, not
55
+ * here, so `invokeCommand` itself is process-effect-free.
56
+ */
57
+ export async function invokeCommand(adapter, behavior, outputMode, now = Date.now, secrets) {
58
+ const notices = [];
59
+ const context = {
60
+ stdinIsTTY: adapter.stdinIsTTY,
61
+ readStdin: () => adapter.readStdin(),
62
+ notice: (message) => {
63
+ notices.push(message);
64
+ },
65
+ };
66
+ let result;
67
+ try {
68
+ result = await adapter.runQuietly(() => behavior(context));
69
+ }
70
+ catch (error) {
71
+ for (const notice of notices) {
72
+ adapter.writeStderr(notice);
73
+ }
74
+ // Recursively redact the thrown value at the outward boundary so any
75
+ // credential-shaped field embedded in the error tree — whether in
76
+ // `message`, `cause`, or any custom field — is replaced with the
77
+ // redaction marker before formatting. `formatErrorOutput` then
78
+ // performs an additional string-level pass on the message/help
79
+ // fields it actually serialises.
80
+ //
81
+ // B3: secrets resolved from an injected env (MainDependencies.env)
82
+ // are honoured here so a credential that exists only in the injected
83
+ // env is redacted even when absent from ambient process.env.
84
+ const resolvedSecrets = secrets ?? configuredSecrets();
85
+ const redactedError = redactSecrets(error, resolvedSecrets);
86
+ adapter.writeStderr(formatErrorOutput(redactedError, outputMode, resolvedSecrets));
87
+ return getErrorExitCode(error);
88
+ }
89
+ for (const notice of notices) {
90
+ adapter.writeStderr(notice);
91
+ }
92
+ adapter.writeStdout(selectOutput(result, outputMode, now));
93
+ return result.exitCode ?? 0;
94
+ }
95
+ //# sourceMappingURL=command-invocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-invocation.js","sourceRoot":"","sources":["../src/command-invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAsCnE,MAAM,iBAAiB,GAA8B,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAE5F,SAAS,gBAAgB,CAAC,IAAgB;IACxC,OAAQ,iBAAuC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,YAAY,CAAC,MAAqB,EAAE,UAAsB,EAAE,GAAiB;IACpF,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAiC,EACjC,QAA6D,EAC7D,UAAsB,EACtB,GAAG,GAAiB,IAAI,CAAC,GAAG,EAC5B,OAAkB;IAElB,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,OAAO,GAAmB;QAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE;QACpC,MAAM,EAAE,CAAC,OAAe,EAAE,EAAE;YAC1B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;KACF,CAAC;IAEF,IAAI,MAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QACD,qEAAqE;QACrE,kEAAkE;QAClE,iEAAiE;QACjE,+DAA+D;QAC/D,+DAA+D;QAC/D,iCAAiC;QACjC,EAAE;QACF,mEAAmE;QACnE,qEAAqE;QACrE,6DAA6D;QAC7D,MAAM,eAAe,GAAG,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACvD,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,EAAE,eAAe,CAAY,CAAC;QACvE,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,aAAa,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;QACnF,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IAE3D,OAAO,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;AAC9B,CAAC"}
@@ -1,13 +1,20 @@
1
1
  /**
2
2
  * Code Mode commands for tool chaining
3
+ *
4
+ * P1-07: each command returns a CommandResult instead of writing
5
+ * directly to stdout/stderr. stdin is read through CommandContext rather
6
+ * than the process stream. No Provider selection is added; Phase 0
7
+ * Code Mode semantics (run, eval, logs, timeout, interfaces, prompt
8
+ * template) are preserved.
3
9
  */
10
+ import type { CommandContext, CommandResult } from "../command-invocation.js";
4
11
  export interface CodeRunOptions {
5
12
  timeout?: number;
6
13
  includeLogs?: boolean;
7
14
  }
8
- export declare function runCodeFile(filePath: string, options?: CodeRunOptions): Promise<void>;
9
- export declare function evalCode(code: string, options?: CodeRunOptions): Promise<void>;
10
- export declare function printInterfaces(): Promise<void>;
11
- export declare function printPromptTemplate(): void;
15
+ export declare function runCodeFile(filePath: string, options?: CodeRunOptions, context?: CommandContext): Promise<CommandResult>;
16
+ export declare function evalCode(code: string, options?: CodeRunOptions, context?: CommandContext): Promise<CommandResult>;
17
+ export declare function printInterfaces(context?: CommandContext): Promise<CommandResult>;
18
+ export declare function printPromptTemplate(context?: CommandContext): CommandResult;
12
19
  export declare const CODE_HELP: string;
13
20
  //# sourceMappingURL=code.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../src/commands/code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB/F;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxF;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAcrD;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAGD,eAAO,MAAM,SAAS,QAkBd,CAAC"}
1
+ {"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../src/commands/code.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9E,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,cAAmB,EAC5B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,aAAa,CAAC,CAWxB;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,cAAmB,EAC5B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,aAAa,CAAC,CASxB;AAED,wBAAsB,eAAe,CACnC,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,aAAa,CAAC,CAQxB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAE3E;AAGD,eAAO,MAAM,SAAS,QAkBd,CAAC"}
@@ -1,75 +1,49 @@
1
1
  /**
2
2
  * Code Mode commands for tool chaining
3
+ *
4
+ * P1-07: each command returns a CommandResult instead of writing
5
+ * directly to stdout/stderr. stdin is read through CommandContext rather
6
+ * than the process stream. No Provider selection is added; Phase 0
7
+ * Code Mode semantics (run, eval, logs, timeout, interfaces, prompt
8
+ * template) are preserved.
3
9
  */
4
10
  import * as fs from "node:fs/promises";
5
11
  import { ZaiCodeModeClient } from "../lib/code-mode.js";
6
- import { outputSuccess } from "../lib/output.js";
7
- import { formatErrorOutput } from "../lib/errors.js";
8
- import { silenceConsole, restoreConsole } from "../lib/silence.js";
9
- export async function runCodeFile(filePath, options = {}) {
12
+ export async function runCodeFile(filePath, options = {}, context) {
10
13
  const code = await fs.readFile(filePath, "utf8");
11
- silenceConsole();
12
14
  const codeClient = new ZaiCodeModeClient();
13
15
  try {
14
16
  const result = await codeClient.callToolChain(code, options.timeout);
15
- if (options.includeLogs) {
16
- outputSuccess(result);
17
- }
18
- else {
19
- outputSuccess(result.result);
20
- }
21
- }
22
- catch (error) {
23
- restoreConsole();
24
- console.error(formatErrorOutput(error));
25
- process.exit(1);
17
+ const data = options.includeLogs ? result : result.result;
18
+ return { kind: "data", data };
26
19
  }
27
20
  finally {
28
21
  await codeClient.close().catch(() => { });
29
- restoreConsole();
30
22
  }
31
23
  }
32
- export async function evalCode(code, options = {}) {
33
- silenceConsole();
24
+ export async function evalCode(code, options = {}, context) {
34
25
  const codeClient = new ZaiCodeModeClient();
35
26
  try {
36
27
  const result = await codeClient.callToolChain(code, options.timeout);
37
- if (options.includeLogs) {
38
- outputSuccess(result);
39
- }
40
- else {
41
- outputSuccess(result.result);
42
- }
43
- }
44
- catch (error) {
45
- restoreConsole();
46
- console.error(formatErrorOutput(error));
47
- process.exit(1);
28
+ const data = options.includeLogs ? result : result.result;
29
+ return { kind: "data", data };
48
30
  }
49
31
  finally {
50
32
  await codeClient.close().catch(() => { });
51
- restoreConsole();
52
33
  }
53
34
  }
54
- export async function printInterfaces() {
55
- silenceConsole();
35
+ export async function printInterfaces(context) {
56
36
  const codeClient = new ZaiCodeModeClient();
57
37
  try {
58
38
  const interfaces = await codeClient.getAllInterfaces();
59
- outputSuccess(interfaces);
60
- }
61
- catch (error) {
62
- restoreConsole();
63
- console.error(formatErrorOutput(error));
64
- process.exit(1);
39
+ return { kind: "data", data: interfaces };
65
40
  }
66
41
  finally {
67
42
  await codeClient.close().catch(() => { });
68
- restoreConsole();
69
43
  }
70
44
  }
71
- export function printPromptTemplate() {
72
- outputSuccess(ZaiCodeModeClient.getPromptTemplate());
45
+ export function printPromptTemplate(context) {
46
+ return { kind: "data", data: ZaiCodeModeClient.getPromptTemplate() };
73
47
  }
74
48
  // Help text
75
49
  export const CODE_HELP = `
@@ -1 +1 @@
1
- {"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/commands/code.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/commands/code.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAQxD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,OAAO,GAAmB,EAAE,EAC5B,OAAwB;IAExB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,OAAO,GAAmB,EAAE,EAC5B,OAAwB;IAExB,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAwB;IAExB,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC5C,CAAC;YAAS,CAAC;QACT,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAwB;IAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,EAAE,CAAC;AACvE,CAAC;AAED,YAAY;AACZ,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;CAkBxB,CAAC,IAAI,EAAE,CAAC"}
@@ -1,10 +1,65 @@
1
1
  /**
2
- * Doctor command for environment and MCP diagnostics
2
+ * Doctor command Provider-aware diagnostics (P4-04, DESIGN.md §14).
3
+ *
4
+ * The command is presentation-only: it receives a report builder through
5
+ * injected dependencies and wraps the resulting {@link DiagnosticsReport}
6
+ * as base data with a computed exit code. Provider resolution, capability
7
+ * probing, settled collection, and failure redaction live in
8
+ * {@link buildDiagnosticsReport} so the command never imports a Provider
9
+ * transport (ZaiMcpClient, monitor client, or environment credential
10
+ * reads) directly.
11
+ *
12
+ * Exit semantics (DESIGN.md §14):
13
+ * - Missing effective Provider credentials -> exit 1.
14
+ * - Any configured probe error -> exit 1 (successful entries preserved).
15
+ * - All configured probes succeed, or only tools-disabled skips -> exit 0.
16
+ *
17
+ * Under `--no-tools` the command returns after metadata + configured-state
18
+ * evaluation and constructs no Adapter and no transport (FR-034).
3
19
  */
20
+ import type { CommandResult } from "../command-invocation.js";
21
+ import type { DiagnosticsReport } from "../capabilities/diagnostics.js";
22
+ import type { ProviderDescriptor, ProviderId } from "../providers/types.js";
23
+ export interface DoctorDiagnosticsDependencies {
24
+ readonly noTools: boolean;
25
+ readonly effectiveProvider: ProviderId;
26
+ readonly descriptors: readonly ProviderDescriptor[];
27
+ readonly env: NodeJS.ProcessEnv;
28
+ readonly sleep: (ms: number) => Promise<void>;
29
+ readonly random: () => number;
30
+ }
31
+ /**
32
+ * Build a schema-version-1 {@link DiagnosticsReport}. Report metadata is
33
+ * built from static descriptors without constructing any Adapter. Under
34
+ * `--no-tools` the command returns after metadata + configured-state
35
+ * evaluation. Otherwise each configured Provider is probed through
36
+ * shared execution with settled collection, preserving registry order
37
+ * and normalized redacted failures.
38
+ */
39
+ export declare function buildDiagnosticsReport(deps: DoctorDiagnosticsDependencies): Promise<DiagnosticsReport>;
40
+ /**
41
+ * Compute the doctor exit code from a finalized report. Exit 1 when the
42
+ * effective Provider is unconfigured or any configured probe errored;
43
+ * otherwise exit 0. A tools-disabled or not-configured skip on a
44
+ * non-effective Provider never fails the report.
45
+ */
46
+ export declare function doctorExitCode(report: DiagnosticsReport): number;
4
47
  export interface DoctorOptions {
5
48
  noTools?: boolean;
6
- enableVision?: boolean;
7
49
  }
8
- export declare function doctor(options?: DoctorOptions): Promise<void>;
50
+ /**
51
+ * Injectable dependencies for the doctor command. `buildReport` resolves
52
+ * the diagnostics report; the command only wraps it for presentation and
53
+ * exit-code selection.
54
+ */
55
+ export interface DoctorCommandDependencies {
56
+ readonly buildReport: () => Promise<DiagnosticsReport>;
57
+ }
58
+ /**
59
+ * Run the doctor command. Returns the diagnostics report as base data
60
+ * with a computed exit code (1 when the effective Provider is
61
+ * unconfigured or any configured probe failed; otherwise 0).
62
+ */
63
+ export declare function doctor(deps: DoctorCommandDependencies): Promise<CommandResult<DiagnosticsReport>>;
9
64
  export declare const DOCTOR_HELP: string;
10
65
  //# sourceMappingURL=doctor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAOD,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CvE;AAED,eAAO,MAAM,WAAW,QAYhB,CAAC"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,gCAAgC,CAAC;AASxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAsB,MAAM,uBAAuB,CAAC;AAMhG,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,UAAU,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;CAC/B;AA6CD;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,iBAAiB,CAAC,CA4B5B;AA4CD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAKhE;AAMD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACxD;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAC1B,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAO3C;AAED,eAAO,MAAM,WAAW,QAqChB,CAAC"}
@@ -1,70 +1,172 @@
1
1
  /**
2
- * Doctor command for environment and MCP diagnostics
2
+ * Doctor command Provider-aware diagnostics (P4-04, DESIGN.md §14).
3
+ *
4
+ * The command is presentation-only: it receives a report builder through
5
+ * injected dependencies and wraps the resulting {@link DiagnosticsReport}
6
+ * as base data with a computed exit code. Provider resolution, capability
7
+ * probing, settled collection, and failure redaction live in
8
+ * {@link buildDiagnosticsReport} so the command never imports a Provider
9
+ * transport (ZaiMcpClient, monitor client, or environment credential
10
+ * reads) directly.
11
+ *
12
+ * Exit semantics (DESIGN.md §14):
13
+ * - Missing effective Provider credentials -> exit 1.
14
+ * - Any configured probe error -> exit 1 (successful entries preserved).
15
+ * - All configured probes succeed, or only tools-disabled skips -> exit 0.
16
+ *
17
+ * Under `--no-tools` the command returns after metadata + configured-state
18
+ * evaluation and constructs no Adapter and no transport (FR-034).
3
19
  */
4
- import { ZaiMcpClient } from "../lib/mcp-client.js";
5
- import { outputSuccess } from "../lib/output.js";
6
- import { formatErrorOutput } from "../lib/errors.js";
7
- import { silenceConsole, restoreConsole } from "../lib/silence.js";
8
- function getNodeMajor() {
20
+ import { SHARED_CAPABILITIES, ZAI_ONLY_CAPABILITIES, diagnosticErrorFromError, } from "../capabilities/diagnostics.js";
21
+ import { executeProviderOperation } from "../lib/execution.js";
22
+ import { UnsupportedCapabilityError } from "../lib/errors.js";
23
+ import { redactSecrets, configuredSecrets } from "../lib/redact.js";
24
+ function nodeMajor() {
9
25
  const [major] = process.versions.node.split(".");
10
26
  return parseInt(major, 10);
11
27
  }
12
- export async function doctor(options = {}) {
13
- const apiKey = process.env.Z_AI_API_KEY || process.env.ZAI_API_KEY;
14
- const mode = (process.env.Z_AI_MODE || process.env.PLATFORM_MODE || "ZAI").toUpperCase();
15
- const nodeMajor = getNodeMajor();
16
- const report = {
17
- env: {
18
- apiKeyPresent: Boolean(apiKey),
19
- mode,
20
- baseUrl: process.env.Z_AI_BASE_URL || undefined,
21
- },
28
+ /**
29
+ * Probe one Provider's connectivity through shared execution. The Adapter
30
+ * transport performs a single attempt (Z.AI tool discovery or MiniMax raw
31
+ * quota probe); the retry policy lives in
32
+ * `executeProviderOperation("diagnostics", ...)`.
33
+ */
34
+ async function probeProvider(descriptor, env, sleep, random) {
35
+ const adapter = descriptor.create({ env });
36
+ const capability = adapter.diagnostics;
37
+ if (!capability) {
38
+ throw new UnsupportedCapabilityError(descriptor.id, "diagnostics");
39
+ }
40
+ return executeProviderOperation("diagnostics", () => capability.invoke({ probe: true }), {
41
+ sleep,
42
+ random,
43
+ });
44
+ }
45
+ /**
46
+ * Build a schema-version-1 {@link DiagnosticsReport}. Report metadata is
47
+ * built from static descriptors without constructing any Adapter. Under
48
+ * `--no-tools` the command returns after metadata + configured-state
49
+ * evaluation. Otherwise each configured Provider is probed through
50
+ * shared execution with settled collection, preserving registry order
51
+ * and normalized redacted failures.
52
+ */
53
+ export async function buildDiagnosticsReport(deps) {
54
+ const secrets = configuredSecrets(deps.env);
55
+ const baseEntries = deps.descriptors.map((descriptor) => ({
56
+ provider: descriptor.id,
57
+ configured: descriptor.isConfigured(deps.env),
58
+ capabilities: [...descriptor.capabilities()],
59
+ }));
60
+ const providers = deps.noTools
61
+ ? baseEntries.map((entry) => ({
62
+ ...entry,
63
+ status: "skipped",
64
+ reason: entry.configured ? "tools-disabled" : "not-configured",
65
+ }))
66
+ : await probeEntries(baseEntries, deps, secrets);
67
+ return {
68
+ schemaVersion: 1,
69
+ effectiveProvider: deps.effectiveProvider,
70
+ sharedCapabilities: SHARED_CAPABILITIES,
71
+ zaiOnlyCapabilities: ZAI_ONLY_CAPABILITIES,
22
72
  node: {
23
- version: process.versions.node,
24
- visionMcpCompatible: nodeMajor >= 22,
73
+ version: process.version,
74
+ visionMcpCompatible: nodeMajor() >= 22,
25
75
  },
76
+ providers,
77
+ };
78
+ }
79
+ /**
80
+ * Probe every configured Provider in registry order using settled
81
+ * collection. Unconfigured entries are skipped (not-configured) and do
82
+ * NOT fail the report. A configured probe failure is normalized and
83
+ * recursively redacted before joining the report; successful entries
84
+ * are preserved alongside it.
85
+ */
86
+ async function probeEntries(baseEntries, deps, secrets) {
87
+ const configuredIndexes = baseEntries
88
+ .map((entry, index) => (entry.configured ? index : -1))
89
+ .filter((index) => index >= 0);
90
+ const settled = await Promise.allSettled(configuredIndexes.map((index) => probeProvider(deps.descriptors[index], deps.env, deps.sleep, deps.random)));
91
+ let settledCursor = 0;
92
+ return baseEntries.map((entry) => {
93
+ if (!entry.configured) {
94
+ return { ...entry, status: "skipped", reason: "not-configured" };
95
+ }
96
+ const result = settled[settledCursor++];
97
+ if (result.status === "fulfilled") {
98
+ return { ...entry, status: "ok" };
99
+ }
100
+ const redacted = redactSecrets(diagnosticErrorFromError(result.reason), secrets);
101
+ return { ...entry, status: "error", error: redacted };
102
+ });
103
+ }
104
+ // ---------------------------------------------------------------------------
105
+ // Exit code
106
+ // ---------------------------------------------------------------------------
107
+ /**
108
+ * Compute the doctor exit code from a finalized report. Exit 1 when the
109
+ * effective Provider is unconfigured or any configured probe errored;
110
+ * otherwise exit 0. A tools-disabled or not-configured skip on a
111
+ * non-effective Provider never fails the report.
112
+ */
113
+ export function doctorExitCode(report) {
114
+ const effective = report.providers.find((p) => p.provider === report.effectiveProvider);
115
+ if (!effective || !effective.configured)
116
+ return 1;
117
+ if (report.providers.some((p) => p.status === "error"))
118
+ return 1;
119
+ return 0;
120
+ }
121
+ /**
122
+ * Run the doctor command. Returns the diagnostics report as base data
123
+ * with a computed exit code (1 when the effective Provider is
124
+ * unconfigured or any configured probe failed; otherwise 0).
125
+ */
126
+ export async function doctor(deps) {
127
+ const report = await deps.buildReport();
128
+ return {
129
+ kind: "data",
130
+ data: report,
131
+ exitCode: doctorExitCode(report),
26
132
  };
27
- if (options.noTools || !apiKey) {
28
- outputSuccess(report);
29
- return;
30
- }
31
- silenceConsole();
32
- const client = new ZaiMcpClient({ enableVision: options.enableVision });
33
- try {
34
- const tools = await client.listTools();
35
- const byServer = tools.reduce((acc, tool) => {
36
- const parts = tool.name.split(".");
37
- const server = parts.length >= 2 ? parts[1] : "unknown";
38
- acc[server] = (acc[server] || 0) + 1;
39
- return acc;
40
- }, {});
41
- report.mcp = {
42
- toolCount: tools.length,
43
- servers: byServer,
44
- };
45
- outputSuccess(report);
46
- }
47
- catch (error) {
48
- restoreConsole();
49
- console.error(formatErrorOutput(error));
50
- process.exit(1);
51
- }
52
- finally {
53
- await client.close().catch(() => { });
54
- restoreConsole();
55
- }
56
133
  }
57
134
  export const DOCTOR_HELP = `
58
- Doctor - Check environment and MCP connectivity
135
+ Doctor - Provider-aware environment and connectivity diagnostics
59
136
 
60
137
  Usage: scoutline doctor [options]
61
138
 
139
+ Reports a schema-version-1 diagnostics report listing every built-in
140
+ Provider (zai, minimax) with its configured state, declared
141
+ Capabilities, and connectivity status. The effective Provider (resolved
142
+ from --provider, SCOUTLINE_PROVIDER, or the default zai) is the
143
+ Provider that serves the shared Capabilities:
144
+
145
+ search, vision.interpret-image, quota, diagnostics
146
+
147
+ Z.AI connectivity is probed through MCP tool discovery; MiniMax
148
+ connectivity through a single raw quota probe that authenticates
149
+ without a generative request.
150
+
151
+ The following Capabilities are Z.AI-only in the base release and are
152
+ not selected by the effective Provider for other families:
153
+ reader, repository-exploration, raw-provider-tools, code-mode,
154
+ image-diff, video-analysis
155
+
62
156
  Options:
63
- --no-tools Skip tool discovery (env-only check)
64
- --no-vision Skip vision MCP server (faster startup)
157
+ --no-tools Skip every connectivity probe (metadata-only). Under
158
+ --no-tools no Provider transport is constructed: a
159
+ configured Provider is reported as skipped
160
+ (tools-disabled) and does not fail the report.
161
+
162
+ Exit codes:
163
+ 0 All configured probes succeeded (or only tools-disabled skips).
164
+ 1 The effective Provider is unconfigured or any configured probe
165
+ failed; successful entries are still reported.
65
166
 
66
167
  Examples:
67
- scoutline doctor
68
- scoutline doctor --no-tools
168
+ scoutline doctor # full diagnostics
169
+ scoutline doctor --provider minimax
170
+ scoutline doctor --no-tools # metadata only, no transport
69
171
  `.trim();
70
172
  //# sourceMappingURL=doctor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,51 @@
1
1
  /**
2
- * Quota command — authoritative Z.AI Coding Plan usage from the monitor API.
2
+ * Quota command — Provider-neutral quota dashboard (P4-03, ADR-0001).
3
+ *
4
+ * The command is presentation-only: it receives a dashboard builder
5
+ * through injected dependencies and wraps the resulting
6
+ * {@link QuotaDashboard} as base data with a TTY presentation override.
7
+ * Provider resolution, capability invocation, settled collection, and
8
+ * failure redaction live in {@link buildQuotaDashboard} so the command
9
+ * never imports a Provider monitor client or maps a Provider response.
10
+ *
11
+ * Default mode (effective Provider) propagates quota failures through
12
+ * the ordinary error path (thrown → invokeCommand). All-provider mode
13
+ * (`--all-providers`) uses settled collection, emits successful and
14
+ * failed entries, and yields exit 1 when any configured Provider fails.
3
15
  */
16
+ import type { CommandResult } from "../command-invocation.js";
17
+ import type { QuotaDashboard } from "../capabilities/quota.js";
18
+ import type { ProviderDescriptor, ProviderId } from "../providers/types.js";
19
+ export interface QuotaDashboardDependencies {
20
+ readonly allProviders: boolean;
21
+ readonly effectiveProvider: ProviderId;
22
+ readonly descriptors: readonly ProviderDescriptor[];
23
+ readonly env: NodeJS.ProcessEnv;
24
+ readonly sleep: (ms: number) => Promise<void>;
25
+ readonly random: () => number;
26
+ }
27
+ /**
28
+ * Build a {@link QuotaDashboard} for the selected mode. The effective
29
+ * Provider is resolved by the dispatcher (`index.ts`) and passed in as
30
+ * metadata; config validation happens here.
31
+ */
32
+ export declare function buildQuotaDashboard(deps: QuotaDashboardDependencies): Promise<QuotaDashboard>;
4
33
  export interface QuotaOptions {
5
- window?: "current";
34
+ allProviders?: boolean;
35
+ }
36
+ /**
37
+ * Injectable dependencies for the quota command. `buildDashboard`
38
+ * resolves the effective/all-provider dashboard; the command only wraps
39
+ * it for presentation and exit-code selection.
40
+ */
41
+ export interface QuotaCommandDependencies {
42
+ readonly buildDashboard: () => Promise<QuotaDashboard>;
6
43
  }
7
- export declare function quota(_options?: QuotaOptions): Promise<void>;
44
+ /**
45
+ * Run the quota command. Returns the dashboard as base data with a TTY
46
+ * presentation override. Exit code is 1 when any dashboard entry failed
47
+ * (all-provider mode); otherwise 0.
48
+ */
49
+ export declare function quota(deps: QuotaCommandDependencies): Promise<CommandResult<QuotaDashboard>>;
8
50
  export declare const QUOTA_HELP: string;
9
51
  //# sourceMappingURL=quota.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"quota.d.ts","sourceRoot":"","sources":["../../src/commands/quota.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,wBAAsB,KAAK,CAAC,QAAQ,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CtE;AAED,eAAO,MAAM,UAAU,QAwBf,CAAC"}
1
+ {"version":3,"file":"quota.d.ts","sourceRoot":"","sources":["../../src/commands/quota.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAIV,cAAc,EACf,MAAM,0BAA0B,CAAC;AAIlC,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAS5E,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,UAAU,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;CAC/B;AAqFD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,cAAc,CAAC,CAEzB;AAMD,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;CACxD;AAED;;;;GAIG;AACH,wBAAsB,KAAK,CACzB,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CASxC;AAED,eAAO,MAAM,UAAU,QA2Bf,CAAC"}