@smithers-orchestrator/agents 0.16.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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +65 -0
  3. package/src/AgentLike.ts +28 -0
  4. package/src/AmpAgent.js +232 -0
  5. package/src/AmpAgentOptions.ts +26 -0
  6. package/src/AnthropicAgent.js +54 -0
  7. package/src/AnthropicAgentOptions.ts +8 -0
  8. package/src/BaseCliAgent/AgentCliActionKind.ts +10 -0
  9. package/src/BaseCliAgent/AgentCliEvent.ts +44 -0
  10. package/src/BaseCliAgent/BaseCliAgent.js +874 -0
  11. package/src/BaseCliAgent/BaseCliAgentOptions.ts +13 -0
  12. package/src/BaseCliAgent/CliOutputInterpreter.ts +8 -0
  13. package/src/BaseCliAgent/CliUsageInfo.ts +7 -0
  14. package/src/BaseCliAgent/CodexConfigOverrides.ts +3 -0
  15. package/src/BaseCliAgent/PiExtensionUiRequest.ts +10 -0
  16. package/src/BaseCliAgent/PiExtensionUiResponse.ts +7 -0
  17. package/src/BaseCliAgent/RunCommandResult.ts +5 -0
  18. package/src/BaseCliAgent/buildGenerateResult.js +57 -0
  19. package/src/BaseCliAgent/combineNonEmpty.js +8 -0
  20. package/src/BaseCliAgent/createAgentStdoutTextEmitter.js +198 -0
  21. package/src/BaseCliAgent/extractPrompt.js +88 -0
  22. package/src/BaseCliAgent/extractTextFromJsonValue.js +46 -0
  23. package/src/BaseCliAgent/index.js +32 -0
  24. package/src/BaseCliAgent/normalizeCodexConfig.js +22 -0
  25. package/src/BaseCliAgent/parseHelpers.js +111 -0
  26. package/src/BaseCliAgent/pushFlag.js +18 -0
  27. package/src/BaseCliAgent/pushList.js +10 -0
  28. package/src/BaseCliAgent/resolveTimeouts.js +24 -0
  29. package/src/BaseCliAgent/runCommandEffect.js +32 -0
  30. package/src/BaseCliAgent/runRpcCommandEffect.js +365 -0
  31. package/src/BaseCliAgent/truncateToBytes.js +13 -0
  32. package/src/BaseCliAgent/tryParseJson.js +18 -0
  33. package/src/ClaudeCodeAgent.js +455 -0
  34. package/src/ClaudeCodeAgentOptions.ts +52 -0
  35. package/src/CodexAgent.js +593 -0
  36. package/src/CodexAgentOptions.ts +23 -0
  37. package/src/ForgeAgent.js +128 -0
  38. package/src/ForgeAgentOptions.ts +14 -0
  39. package/src/GeminiAgent.js +273 -0
  40. package/src/GeminiAgentOptions.ts +20 -0
  41. package/src/KimiAgent.js +260 -0
  42. package/src/KimiAgentOptions.ts +21 -0
  43. package/src/OpenAIAgent.js +54 -0
  44. package/src/OpenAIAgentOptions.ts +8 -0
  45. package/src/PiAgent.js +468 -0
  46. package/src/PiAgentOptions.ts +40 -0
  47. package/src/SdkAgentOptions.ts +16 -0
  48. package/src/agent-contract/SmithersAgentContract.ts +10 -0
  49. package/src/agent-contract/SmithersAgentContractTool.ts +8 -0
  50. package/src/agent-contract/SmithersAgentToolCategory.ts +6 -0
  51. package/src/agent-contract/SmithersListedTool.ts +4 -0
  52. package/src/agent-contract/SmithersToolSurface.ts +1 -0
  53. package/src/agent-contract/createSmithersAgentContract.js +188 -0
  54. package/src/agent-contract/index.js +10 -0
  55. package/src/agent-contract/renderSmithersAgentPromptGuidance.js +81 -0
  56. package/src/capability-registry/AgentCapabilityRegistry.ts +22 -0
  57. package/src/capability-registry/AgentToolDescriptor.ts +4 -0
  58. package/src/capability-registry/hashCapabilityRegistry.js +43 -0
  59. package/src/capability-registry/index.js +8 -0
  60. package/src/capability-registry/normalizeCapabilityRegistry.js +52 -0
  61. package/src/capability-registry/normalizeCapabilityStringList.js +9 -0
  62. package/src/cli-capabilities/CliAgentCapabilityAdapterId.ts +6 -0
  63. package/src/cli-capabilities/CliAgentCapabilityDoctorReport.ts +18 -0
  64. package/src/cli-capabilities/CliAgentCapabilityReportEntry.ts +9 -0
  65. package/src/cli-capabilities/formatCliAgentCapabilityDoctorReport.js +24 -0
  66. package/src/cli-capabilities/getCliAgentCapabilityDoctorReport.js +92 -0
  67. package/src/cli-capabilities/getCliAgentCapabilityReport.js +52 -0
  68. package/src/cli-capabilities/index.js +11 -0
  69. package/src/diagnostics/DiagnosticCheck.ts +11 -0
  70. package/src/diagnostics/DiagnosticCheckId.ts +4 -0
  71. package/src/diagnostics/DiagnosticContext.ts +4 -0
  72. package/src/diagnostics/DiagnosticReport.ts +9 -0
  73. package/src/diagnostics/enrichReportWithErrorAnalysis.js +34 -0
  74. package/src/diagnostics/formatDiagnosticSummary.js +17 -0
  75. package/src/diagnostics/getDiagnosticStrategy.js +503 -0
  76. package/src/diagnostics/index.js +13 -0
  77. package/src/diagnostics/launchDiagnostics.js +16 -0
  78. package/src/diagnostics/runDiagnostics.js +52 -0
  79. package/src/index.d.ts +872 -0
  80. package/src/index.js +39 -0
  81. package/src/resolveSdkModel.js +9 -0
  82. package/src/sanitizeForOpenAI.js +47 -0
  83. package/src/streamResultToGenerateResult.js +70 -0
  84. package/src/zodToOpenAISchema.js +16 -0
package/src/index.js ADDED
@@ -0,0 +1,39 @@
1
+ // @smithers-type-exports-begin
2
+ /** @typedef {import("./capability-registry/AgentCapabilityRegistry.ts").AgentCapabilityRegistry} AgentCapabilityRegistry */
3
+ /** @typedef {import("./AgentLike.ts").AgentLike} AgentLike */
4
+ /** @typedef {import("./capability-registry/AgentToolDescriptor.ts").AgentToolDescriptor} AgentToolDescriptor */
5
+ /**
6
+ * @template [CALL_OPTIONS=never]
7
+ * @template [TOOLS=import("ai").ToolSet]
8
+ * @typedef {import("./AnthropicAgentOptions.ts").AnthropicAgentOptions<CALL_OPTIONS, TOOLS>} AnthropicAgentOptions
9
+ */
10
+ /**
11
+ * @template [CALL_OPTIONS=never]
12
+ * @template [TOOLS=import("ai").ToolSet]
13
+ * @typedef {import("./OpenAIAgentOptions.ts").OpenAIAgentOptions<CALL_OPTIONS, TOOLS>} OpenAIAgentOptions
14
+ */
15
+ /** @typedef {import("./PiAgentOptions.ts").PiAgentOptions} PiAgentOptions */
16
+ /** @typedef {import("./BaseCliAgent/PiExtensionUiRequest.ts").PiExtensionUiRequest} PiExtensionUiRequest */
17
+ /** @typedef {import("./BaseCliAgent/PiExtensionUiResponse.ts").PiExtensionUiResponse} PiExtensionUiResponse */
18
+ /** @typedef {import("./agent-contract/SmithersAgentContract.ts").SmithersAgentContract} SmithersAgentContract */
19
+ /** @typedef {import("./agent-contract/SmithersAgentContractTool.ts").SmithersAgentContractTool} SmithersAgentContractTool */
20
+ /** @typedef {import("./agent-contract/SmithersAgentToolCategory.ts").SmithersAgentToolCategory} SmithersAgentToolCategory */
21
+ /** @typedef {import("./agent-contract/SmithersListedTool.ts").SmithersListedTool} SmithersListedTool */
22
+ /** @typedef {import("./agent-contract/SmithersToolSurface.ts").SmithersToolSurface} SmithersToolSurface */
23
+ // @smithers-type-exports-end
24
+
25
+ export { BaseCliAgent } from "./BaseCliAgent/index.js";
26
+ export { hashCapabilityRegistry } from "./capability-registry/index.js";
27
+ export { AnthropicAgent } from "./AnthropicAgent.js";
28
+ export { OpenAIAgent } from "./OpenAIAgent.js";
29
+ export { AmpAgent } from "./AmpAgent.js";
30
+ export { ClaudeCodeAgent } from "./ClaudeCodeAgent.js";
31
+ export { CodexAgent } from "./CodexAgent.js";
32
+ export { GeminiAgent } from "./GeminiAgent.js";
33
+ export { PiAgent } from "./PiAgent.js";
34
+ export { KimiAgent } from "./KimiAgent.js";
35
+ export { ForgeAgent } from "./ForgeAgent.js";
36
+ export { createSmithersAgentContract } from "./agent-contract/createSmithersAgentContract.js";
37
+ export { renderSmithersAgentPromptGuidance } from "./agent-contract/renderSmithersAgentPromptGuidance.js";
38
+ export { zodToOpenAISchema } from "./zodToOpenAISchema.js";
39
+ export { sanitizeForOpenAI } from "./sanitizeForOpenAI.js";
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @template MODEL
3
+ * @param {string | MODEL} value
4
+ * @param {(modelId: string) => MODEL} create
5
+ * @returns {MODEL}
6
+ */
7
+ export function resolveSdkModel(value, create) {
8
+ return typeof value === "string" ? create(value) : value;
9
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Sanitize a JSON Schema for OpenAI's structured-output API.
3
+ *
4
+ * OpenAI's `response_format` imposes constraints beyond standard JSON Schema:
5
+ *
6
+ * 1. Every object node **must** include `"type": "object"`.
7
+ * 2. `additionalProperties` must be a boolean or a valid sub-schema with a
8
+ * `type` key -- bare `{}` is rejected.
9
+ * 3. `additionalProperties: true` is accepted but tells the model it can
10
+ * return extra keys -- set to `false` if you want strict conformance.
11
+ *
12
+ * Zod v4's `toJSONSchema()` can violate (1) when `z.looseObject()` is used:
13
+ * it emits `{ additionalProperties: true }` without `"type": "object"`.
14
+ *
15
+ * This function fixes these issues in-place so any agent (Codex, future
16
+ * OpenAI-backed agents, etc.) can safely use a JSON Schema for OpenAI.
17
+ */
18
+ export function sanitizeForOpenAI(node) {
19
+ if (node == null || typeof node !== "object")
20
+ return;
21
+ const obj = node;
22
+ // Rule 1 & 2: If a node has `additionalProperties`, it must also
23
+ // have `"type": "object"`. Zod's toJSONSchema omits `type` on
24
+ // passthrough objects, which OpenAI rejects.
25
+ if ("additionalProperties" in obj && !("type" in obj)) {
26
+ obj.type = "object";
27
+ }
28
+ // Rule 2b: If `additionalProperties` is an empty object `{}`,
29
+ // OpenAI rejects it because it lacks a `type` key. Coerce to `true`
30
+ // which is semantically equivalent and accepted by OpenAI.
31
+ if (typeof obj.additionalProperties === "object" &&
32
+ obj.additionalProperties !== null &&
33
+ !Array.isArray(obj.additionalProperties) &&
34
+ Object.keys(obj.additionalProperties).length === 0) {
35
+ obj.additionalProperties = true;
36
+ }
37
+ // Recurse into all sub-schemas
38
+ for (const value of Object.values(obj)) {
39
+ if (Array.isArray(value)) {
40
+ for (const item of value)
41
+ sanitizeForOpenAI(item);
42
+ }
43
+ else if (typeof value === "object" && value !== null) {
44
+ sanitizeForOpenAI(value);
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,70 @@
1
+
2
+ /** @typedef {import("ai").GenerateTextResult} GenerateTextResult */
3
+ /** @typedef {import("ai").StreamTextResult} StreamTextResult */
4
+ /**
5
+ * @template TOOLS, OUTPUT
6
+ * @param {StreamTextResult<TOOLS, any>} stream
7
+ * @param {(text: string) => void} [onStdout]
8
+ * @returns {Promise<GenerateTextResult<TOOLS, any>>}
9
+ */
10
+ export async function streamResultToGenerateResult(stream, onStdout) {
11
+ if (onStdout) {
12
+ for await (const part of stream.fullStream) {
13
+ if (part.type === "text-delta" && part.text) {
14
+ onStdout(part.text);
15
+ }
16
+ }
17
+ }
18
+ else {
19
+ await stream.consumeStream();
20
+ }
21
+ const [content, text, reasoning, reasoningText, files, sources, toolCalls, staticToolCalls, dynamicToolCalls, toolResults, staticToolResults, dynamicToolResults, finishReason, rawFinishReason, usage, totalUsage, warnings, steps, request, response, providerMetadata, output,] = await Promise.all([
22
+ stream.content,
23
+ stream.text,
24
+ stream.reasoning,
25
+ stream.reasoningText,
26
+ stream.files,
27
+ stream.sources,
28
+ stream.toolCalls,
29
+ stream.staticToolCalls,
30
+ stream.dynamicToolCalls,
31
+ stream.toolResults,
32
+ stream.staticToolResults,
33
+ stream.dynamicToolResults,
34
+ stream.finishReason,
35
+ stream.rawFinishReason,
36
+ stream.usage,
37
+ stream.totalUsage,
38
+ stream.warnings,
39
+ stream.steps,
40
+ stream.request,
41
+ stream.response,
42
+ stream.providerMetadata,
43
+ stream.output,
44
+ ]);
45
+ return {
46
+ content,
47
+ text,
48
+ reasoning,
49
+ reasoningText,
50
+ files,
51
+ sources,
52
+ toolCalls,
53
+ staticToolCalls,
54
+ dynamicToolCalls,
55
+ toolResults,
56
+ staticToolResults,
57
+ dynamicToolResults,
58
+ finishReason,
59
+ rawFinishReason,
60
+ usage,
61
+ totalUsage,
62
+ warnings,
63
+ request,
64
+ response,
65
+ providerMetadata,
66
+ steps,
67
+ experimental_output: output,
68
+ output,
69
+ };
70
+ }
@@ -0,0 +1,16 @@
1
+ import { sanitizeForOpenAI } from "./sanitizeForOpenAI.js";
2
+ /**
3
+ * Convert a Zod schema to an OpenAI-safe JSON Schema object.
4
+ *
5
+ * Usage:
6
+ * ```ts
7
+ * import { zodToOpenAISchema } from "./zodToOpenAISchema";
8
+ * const jsonSchema = zodToOpenAISchema(myZodSchema);
9
+ * ```
10
+ */
11
+ export async function zodToOpenAISchema(zodSchema) {
12
+ const { z } = await import("zod");
13
+ const jsonSchema = z.toJSONSchema(zodSchema);
14
+ sanitizeForOpenAI(jsonSchema);
15
+ return jsonSchema;
16
+ }