@openapi-flow/langchain 0.2.0 → 0.3.1

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 (235) hide show
  1. package/README.md +123 -1
  2. package/dist/arguments/analyze-api-input-answers.d.ts +3 -0
  3. package/dist/arguments/analyze-api-input-answers.js +87 -0
  4. package/dist/arguments/analyze-api-request-media-type.d.ts +4 -0
  5. package/dist/arguments/analyze-api-request-media-type.js +50 -0
  6. package/dist/arguments/extract-api-input-answers.d.ts +3 -0
  7. package/dist/arguments/extract-api-input-answers.js +4 -0
  8. package/dist/arguments/generate-api-arguments.js +43 -28
  9. package/dist/arguments/select-api-request-media-type.js +8 -37
  10. package/dist/bindings/plan-api-bindings.js +30 -23
  11. package/dist/draft/analyze-workflow-draft-edit.d.ts +4 -0
  12. package/dist/draft/analyze-workflow-draft-edit.js +84 -0
  13. package/dist/draft/generate-workflow-draft-api-call-arguments.d.ts +3 -0
  14. package/dist/draft/generate-workflow-draft-api-call-arguments.js +88 -0
  15. package/dist/draft/generate-workflow-draft-api-input-edits.d.ts +4 -0
  16. package/dist/draft/generate-workflow-draft-api-input-edits.js +58 -0
  17. package/dist/draft/generate-workflow-draft-native-node-addition.d.ts +4 -0
  18. package/dist/draft/generate-workflow-draft-native-node-addition.js +137 -0
  19. package/dist/draft/generate-workflow-draft-native-parameter-edits.d.ts +3 -0
  20. package/dist/draft/generate-workflow-draft-native-parameter-edits.js +71 -0
  21. package/dist/draft/plan-workflow-draft-api-binding-edit.d.ts +4 -0
  22. package/dist/draft/plan-workflow-draft-api-binding-edit.js +103 -0
  23. package/dist/draft/plan-workflow-draft-api-call-bindings.d.ts +3 -0
  24. package/dist/draft/plan-workflow-draft-api-call-bindings.js +114 -0
  25. package/dist/draft/plan-workflow-draft-clarification-scopes.d.ts +4 -0
  26. package/dist/draft/plan-workflow-draft-clarification-scopes.js +77 -0
  27. package/dist/draft/plan-workflow-draft-connection-edit.d.ts +4 -0
  28. package/dist/draft/plan-workflow-draft-connection-edit.js +79 -0
  29. package/dist/draft/plan-workflow-draft-native-dependencies.d.ts +4 -0
  30. package/dist/draft/plan-workflow-draft-native-dependencies.js +45 -0
  31. package/dist/draft/plan-workflow-draft-native-reference-repair.d.ts +4 -0
  32. package/dist/draft/plan-workflow-draft-native-reference-repair.js +68 -0
  33. package/dist/draft/resolve-workflow-draft-edit-proposal.d.ts +3 -0
  34. package/dist/draft/resolve-workflow-draft-edit-proposal.js +39 -0
  35. package/dist/draft/select-workflow-draft-api-binding-inputs.d.ts +4 -0
  36. package/dist/draft/select-workflow-draft-api-binding-inputs.js +83 -0
  37. package/dist/draft/select-workflow-draft-api-input-edit-targets.d.ts +4 -0
  38. package/dist/draft/select-workflow-draft-api-input-edit-targets.js +55 -0
  39. package/dist/draft/select-workflow-draft-native-node-parameter-ownership.d.ts +4 -0
  40. package/dist/draft/select-workflow-draft-native-node-parameter-ownership.js +81 -0
  41. package/dist/draft/select-workflow-draft-native-parameter-edit-targets.d.ts +3 -0
  42. package/dist/draft/select-workflow-draft-native-parameter-edit-targets.js +51 -0
  43. package/dist/draft/workflow-draft-api-binding-edit-planning-error.d.ts +5 -0
  44. package/dist/draft/workflow-draft-api-binding-edit-planning-error.js +10 -0
  45. package/dist/draft/workflow-draft-api-call-planning-error.d.ts +5 -0
  46. package/dist/draft/workflow-draft-api-call-planning-error.js +10 -0
  47. package/dist/draft/workflow-draft-api-input-edit-planning-error.d.ts +5 -0
  48. package/dist/draft/workflow-draft-api-input-edit-planning-error.js +10 -0
  49. package/dist/draft/workflow-draft-clarification-scope-planning-error.d.ts +5 -0
  50. package/dist/draft/workflow-draft-clarification-scope-planning-error.js +8 -0
  51. package/dist/draft/workflow-draft-connection-edit-planning-error.d.ts +5 -0
  52. package/dist/draft/workflow-draft-connection-edit-planning-error.js +10 -0
  53. package/dist/draft/workflow-draft-edit-planning-error.d.ts +5 -0
  54. package/dist/draft/workflow-draft-edit-planning-error.js +8 -0
  55. package/dist/draft/workflow-draft-native-node-addition-planning-error.d.ts +5 -0
  56. package/dist/draft/workflow-draft-native-node-addition-planning-error.js +10 -0
  57. package/dist/draft/workflow-draft-native-parameter-edit-planning-error.d.ts +5 -0
  58. package/dist/draft/workflow-draft-native-parameter-edit-planning-error.js +8 -0
  59. package/dist/draft/workflow-draft-native-reference-repair-planning-error.d.ts +5 -0
  60. package/dist/draft/workflow-draft-native-reference-repair-planning-error.js +8 -0
  61. package/dist/prompts/api-arguments-prompt.d.ts +1 -1
  62. package/dist/prompts/api-arguments-prompt.js +1 -1
  63. package/dist/prompts/api-bindings-prompt.d.ts +1 -1
  64. package/dist/prompts/api-bindings-prompt.js +1 -0
  65. package/dist/prompts/api-input-answers-prompt.d.ts +1 -0
  66. package/dist/prompts/api-input-answers-prompt.js +7 -0
  67. package/dist/prompts/api-request-media-type-prompt.d.ts +1 -1
  68. package/dist/prompts/api-request-media-type-prompt.js +1 -1
  69. package/dist/prompts/api-selection-analysis-prompt.d.ts +1 -0
  70. package/dist/prompts/api-selection-analysis-prompt.js +5 -0
  71. package/dist/prompts/api-selection-explanation-prompt.d.ts +1 -0
  72. package/dist/prompts/api-selection-explanation-prompt.js +1 -0
  73. package/dist/prompts/native-instance-dependencies-prompt.d.ts +1 -0
  74. package/dist/prompts/native-instance-dependencies-prompt.js +8 -0
  75. package/dist/prompts/native-node-planning-prompt.d.ts +3 -1
  76. package/dist/prompts/native-node-planning-prompt.js +14 -1
  77. package/dist/prompts/reviewable-workflow-graph-prompt.d.ts +1 -1
  78. package/dist/prompts/workflow-connections-prompt.d.ts +1 -1
  79. package/dist/prompts/workflow-connections-prompt.js +4 -1
  80. package/dist/prompts/workflow-draft-api-binding-edit-prompt.d.ts +1 -0
  81. package/dist/prompts/workflow-draft-api-binding-edit-prompt.js +9 -0
  82. package/dist/prompts/workflow-draft-api-call-planning-prompt.d.ts +3 -0
  83. package/dist/prompts/workflow-draft-api-call-planning-prompt.js +39 -0
  84. package/dist/prompts/workflow-draft-api-input-edit-prompt.d.ts +2 -0
  85. package/dist/prompts/workflow-draft-api-input-edit-prompt.js +14 -0
  86. package/dist/prompts/workflow-draft-clarification-scope-prompt.d.ts +1 -0
  87. package/dist/prompts/workflow-draft-clarification-scope-prompt.js +10 -0
  88. package/dist/prompts/workflow-draft-connection-edit-prompt.d.ts +1 -0
  89. package/dist/prompts/workflow-draft-connection-edit-prompt.js +7 -0
  90. package/dist/prompts/workflow-draft-edit-prompt.d.ts +1 -0
  91. package/dist/prompts/workflow-draft-edit-prompt.js +15 -0
  92. package/dist/prompts/workflow-draft-native-dependencies-prompt.d.ts +1 -0
  93. package/dist/prompts/workflow-draft-native-dependencies-prompt.js +5 -0
  94. package/dist/prompts/workflow-draft-native-node-addition-prompt.d.ts +2 -0
  95. package/dist/prompts/workflow-draft-native-node-addition-prompt.js +6 -0
  96. package/dist/prompts/workflow-draft-native-parameter-edit-prompt.d.ts +2 -0
  97. package/dist/prompts/workflow-draft-native-parameter-edit-prompt.js +2 -0
  98. package/dist/prompts/workflow-draft-native-reference-repair-prompt.d.ts +1 -0
  99. package/dist/prompts/workflow-draft-native-reference-repair-prompt.js +7 -0
  100. package/dist/prompts/workflow-graph-prompt.d.ts +1 -1
  101. package/dist/prompts/workflow-graph-prompt.js +2 -0
  102. package/dist/prompts/workflow-requirements-prompt.d.ts +1 -0
  103. package/dist/prompts/workflow-requirements-prompt.js +14 -0
  104. package/dist/prompts/workflow-review-suggestions-prompt.d.ts +1 -0
  105. package/dist/prompts/workflow-review-suggestions-prompt.js +4 -0
  106. package/dist/prompts/workflow-user-action-evidence-prompt.d.ts +1 -0
  107. package/dist/prompts/workflow-user-action-evidence-prompt.js +1 -0
  108. package/dist/public-api.d.ts +47 -0
  109. package/dist/public-api.js +34 -0
  110. package/dist/requirements/clarify-workflow-requirements.d.ts +4 -0
  111. package/dist/requirements/clarify-workflow-requirements.js +53 -0
  112. package/dist/requirements/resolve-workflow-requirements-evidence.d.ts +4 -0
  113. package/dist/requirements/resolve-workflow-requirements-evidence.js +58 -0
  114. package/dist/review/suggest-workflow-review-follow-ups.d.ts +4 -0
  115. package/dist/review/suggest-workflow-review-follow-ups.js +87 -0
  116. package/dist/review/workflow-review-suggestion-planning-error.d.ts +5 -0
  117. package/dist/review/workflow-review-suggestion-planning-error.js +8 -0
  118. package/dist/schemas/api-binding-plan-schema.d.ts +7 -2
  119. package/dist/schemas/api-binding-plan-schema.js +11 -1
  120. package/dist/schemas/api-input-answer-source-schema.d.ts +16 -0
  121. package/dist/schemas/api-input-answer-source-schema.js +28 -0
  122. package/dist/schemas/api-literal-generation-output-schema.d.ts +11 -0
  123. package/dist/schemas/api-literal-generation-output-schema.js +20 -0
  124. package/dist/schemas/api-request-media-type-schema.d.ts +5 -2
  125. package/dist/schemas/api-request-media-type-schema.js +14 -2
  126. package/dist/schemas/api-selection-analysis-schema.d.ts +41 -0
  127. package/dist/schemas/api-selection-analysis-schema.js +23 -0
  128. package/dist/schemas/api-selection-options-schema.d.ts +4 -0
  129. package/dist/schemas/api-selection-options-schema.js +4 -0
  130. package/dist/schemas/api-selection-schema.d.ts +14 -1
  131. package/dist/schemas/api-selection-schema.js +6 -5
  132. package/dist/schemas/create-workflow-message-evidence-selection-schema.d.ts +16 -0
  133. package/dist/schemas/create-workflow-message-evidence-selection-schema.js +22 -0
  134. package/dist/schemas/native-node-explanation-schema.d.ts +5 -0
  135. package/dist/schemas/native-node-explanation-schema.js +9 -0
  136. package/dist/schemas/native-node-parameter-contract.d.ts +3 -0
  137. package/dist/schemas/native-node-parameter-contract.js +30 -0
  138. package/dist/schemas/native-node-planning-contract.d.ts +3 -0
  139. package/dist/schemas/native-node-planning-contract.js +44 -0
  140. package/dist/schemas/request-media-selection-options-schema.d.ts +4 -0
  141. package/dist/schemas/request-media-selection-options-schema.js +4 -0
  142. package/dist/schemas/reviewable-workflow-graph-schema.d.ts +4 -2
  143. package/dist/schemas/reviewable-workflow-graph-schema.js +13 -1
  144. package/dist/schemas/serialize-structured-output-schema.d.ts +5 -0
  145. package/dist/schemas/serialize-structured-output-schema.js +10 -0
  146. package/dist/schemas/serialize-workflow-requirements-schema.d.ts +4 -0
  147. package/dist/schemas/serialize-workflow-requirements-schema.js +5 -0
  148. package/dist/schemas/with-api-selection-explanation.d.ts +10 -0
  149. package/dist/schemas/with-api-selection-explanation.js +15 -0
  150. package/dist/schemas/workflow-connection-explanation-schema.d.ts +5 -0
  151. package/dist/schemas/workflow-connection-explanation-schema.js +9 -0
  152. package/dist/schemas/workflow-draft-edit-schema.d.ts +3 -0
  153. package/dist/schemas/workflow-draft-edit-schema.js +17 -0
  154. package/dist/schemas/workflow-graph-explanation-schema.d.ts +5 -0
  155. package/dist/schemas/workflow-graph-explanation-schema.js +9 -0
  156. package/dist/schemas/workflow-graph-proposal-schema.d.ts +2 -2
  157. package/dist/schemas/workflow-graph-proposal-schema.js +14 -7
  158. package/dist/schemas/workflow-planning-evidence-schemas.d.ts +20 -0
  159. package/dist/schemas/workflow-planning-evidence-schemas.js +44 -0
  160. package/dist/schemas/workflow-requirements-schema.d.ts +3 -0
  161. package/dist/schemas/workflow-requirements-schema.js +6 -0
  162. package/dist/schemas/workflow-review-suggestions-schema.d.ts +4 -0
  163. package/dist/schemas/workflow-review-suggestions-schema.js +18 -0
  164. package/dist/selection/analyze-api-selection.d.ts +4 -0
  165. package/dist/selection/analyze-api-selection.js +117 -0
  166. package/dist/selection/resolve-api-selection-options.d.ts +3 -0
  167. package/dist/selection/resolve-api-selection-options.js +6 -0
  168. package/dist/selection/select-api-operations.d.ts +1 -1
  169. package/dist/selection/select-api-operations.js +39 -6
  170. package/dist/types/api-input-answers.d.ts +16 -0
  171. package/dist/types/api-input-answers.js +1 -0
  172. package/dist/types/api-selection-analysis.d.ts +3 -0
  173. package/dist/types/api-selection-analysis.js +1 -0
  174. package/dist/types/argument-generation.d.ts +11 -5
  175. package/dist/types/binding-planning.d.ts +7 -5
  176. package/dist/types/native-node-planning.d.ts +67 -16
  177. package/dist/types/operation-selection.d.ts +5 -1
  178. package/dist/types/request-media-selection.d.ts +7 -2
  179. package/dist/types/reviewable-workflow-planning.d.ts +11 -2
  180. package/dist/types/structured-output-schema.d.ts +3 -0
  181. package/dist/types/structured-output-schema.js +1 -0
  182. package/dist/types/workflow-clarification.d.ts +23 -0
  183. package/dist/types/workflow-clarification.js +1 -0
  184. package/dist/types/workflow-draft-api-binding-edit.d.ts +9 -0
  185. package/dist/types/workflow-draft-api-binding-edit.js +1 -0
  186. package/dist/types/workflow-draft-api-call-planning.d.ts +15 -0
  187. package/dist/types/workflow-draft-api-call-planning.js +1 -0
  188. package/dist/types/workflow-draft-api-input-edit.d.ts +13 -0
  189. package/dist/types/workflow-draft-api-input-edit.js +1 -0
  190. package/dist/types/workflow-draft-clarification.d.ts +9 -0
  191. package/dist/types/workflow-draft-clarification.js +1 -0
  192. package/dist/types/workflow-draft-connection-edit.d.ts +9 -0
  193. package/dist/types/workflow-draft-connection-edit.js +1 -0
  194. package/dist/types/workflow-draft-edit.d.ts +16 -0
  195. package/dist/types/workflow-draft-edit.js +1 -0
  196. package/dist/types/workflow-draft-native-node-addition.d.ts +18 -0
  197. package/dist/types/workflow-draft-native-node-addition.js +1 -0
  198. package/dist/types/workflow-draft-native-parameter-edit.d.ts +13 -0
  199. package/dist/types/workflow-draft-native-parameter-edit.js +1 -0
  200. package/dist/types/workflow-draft-native-reference-repair.d.ts +9 -0
  201. package/dist/types/workflow-draft-native-reference-repair.js +1 -0
  202. package/dist/types/workflow-message-evidence-selection.d.ts +6 -0
  203. package/dist/types/workflow-message-evidence-selection.js +1 -0
  204. package/dist/types/workflow-orchestration.d.ts +13 -15
  205. package/dist/types/workflow-planning.d.ts +19 -7
  206. package/dist/types/workflow-review-suggestions.d.ts +12 -0
  207. package/dist/types/workflow-review-suggestions.js +1 -0
  208. package/dist/workflow/generate-native-node-parameters.d.ts +4 -0
  209. package/dist/workflow/generate-native-node-parameters.js +87 -0
  210. package/dist/workflow/orchestrate-workflow.js +2 -2
  211. package/dist/workflow/plan-native-instance-dependencies.d.ts +4 -0
  212. package/dist/workflow/plan-native-instance-dependencies.js +45 -0
  213. package/dist/workflow/plan-native-nodes.js +63 -66
  214. package/dist/workflow/plan-reviewable-workflow-graph.js +33 -64
  215. package/dist/workflow/plan-workflow-connections.js +35 -30
  216. package/dist/workflow/plan-workflow-graph.js +45 -64
  217. package/dist/workflow/resolve-native-node-parameter-source.d.ts +4 -0
  218. package/dist/workflow/resolve-native-node-parameter-source.js +7 -0
  219. package/dist/workflow/resolve-native-node-planning-output.d.ts +3 -0
  220. package/dist/workflow/resolve-native-node-planning-output.js +33 -0
  221. package/dist/workflow/resolve-workflow-connection-output.d.ts +3 -0
  222. package/dist/workflow/resolve-workflow-connection-output.js +22 -0
  223. package/dist/workflow/resolve-workflow-graph-output.d.ts +5 -0
  224. package/dist/workflow/resolve-workflow-graph-output.js +69 -0
  225. package/dist/workflow/select-native-node-instances.d.ts +4 -0
  226. package/dist/workflow/select-native-node-instances.js +57 -0
  227. package/package.json +7 -4
  228. package/dist/schemas/native-node-plan-schema.d.ts +0 -4
  229. package/dist/schemas/native-node-plan-schema.js +0 -26
  230. package/dist/workflow/assemble-native-node-materials.d.ts +0 -3
  231. package/dist/workflow/assemble-native-node-materials.js +0 -8
  232. package/dist/workflow/create-prepared-native-node-materials.d.ts +0 -4
  233. package/dist/workflow/create-prepared-native-node-materials.js +0 -15
  234. package/dist/workflow/prepare-workflow-connection-materials.d.ts +0 -3
  235. package/dist/workflow/prepare-workflow-connection-materials.js +0 -66
package/README.md CHANGED
@@ -1,6 +1,128 @@
1
1
  # @openapi-flow/langchain
2
2
 
3
- Independent model calls for OpenAPI workflows. Unreleased `0.2.0` source; this package is not yet published.
3
+ Zod `^4.6.5` is a required host peer, alongside `@langchain/core`. The three libraries share the host's Zod for public schema types instead of creating an isolated pinned copy. Modern package managers install compatible missing peers; a host that directly creates Zod schemas should declare its own compatible Zod dependency.
4
+
5
+ Version **0.3.1**, with matching `@openapi-flow/core@0.3.1`. The host supplies its LangChain model and owns LangGraph, storage and review policies. The Core/n8n Ajv `properties.__proto__` validation limitation is documented in the [release record](https://github.com/carefreelife98/openapi-flow/blob/main/docs/releases/0.3.1.md); this release does not rewrite OAS or values to hide it.
6
+
7
+ `planWorkflowConnections` forwards explicit current `deferredApiInputIds`. Code derives their original slot contracts, validates existing request values and checks the complete graph; the model chooses connections, not replacement values. See [input deferral](https://github.com/carefreelife98/openapi-flow/blob/main/docs/deferred-connection-planning.md).
8
+
9
+ `analyzeWorkflowDraftEdit` offers `report-capability-gap` in its existing
10
+ bounded semantic call. The model selects a role, scoped finding and mandatory
11
+ reason; Core owns IDs, original messages and inventory capture. No separate gap
12
+ agent, parameter-generation call, retry or synthesized contract is introduced.
13
+ See the [gap contract](../../docs/workflow-draft-conversation-host.md#explicit-capability-gaps).
14
+
15
+ `generateWorkflowDraftApiCallArguments({ trackRequestedInputs: true })`
16
+ asks for requested input pointers in the existing OAS-typed value call, including
17
+ optional literals whose actual value is not known. Core checks declaration and
18
+ presence; no extra model call, invented value or changed OAS required list is used.
19
+ See [requested inputs](../../docs/workflow-draft-api-binding-questions.md#값이-미정인-선택-입력의-요청-추적).
20
+
21
+ `selectWorkflowDraftApiBindingInputs` selects only requested
22
+ response-to-request target pointers before producer mapping. Passing its
23
+ `inputIntent` to `planWorkflowDraftApiCallBindings` narrows both the model-visible
24
+ target contracts and the output schema. An empty selection makes no binding-model
25
+ call; required literals remain the argument stage responsibility. These primitives
26
+ remain independently callable. See [input intent](../../docs/workflow-draft-api-binding-questions.md#요청-의도를-먼저-고정하는-선택-단계).
27
+
28
+ `analyzeApiInputAnswers` always returns code-checked `sources` for
29
+ revalidation; model reasons remain optional. The canonical example supports
30
+ [natural input replies](../../docs/canonical-natural-input-replies.md).
31
+
32
+ `analyzeWorkflowDraftEdit` offers `restore-requirement` only for
33
+ code-derived removed IDs. See
34
+ [requirement restoration](../../docs/workflow-draft-requirement-restoration.md).
35
+
36
+ `analyzeApiInputAnswers` selects code-owned JSON candidate IDs or
37
+ unquoted text-boundary IDs. The model writes neither values nor `sourceText`;
38
+ Core resolves original spans and validates them without coercion. See the
39
+ [answer extraction guide](../../docs/api-input-answer-extraction.md).
40
+
41
+ `planWorkflowGraph` and `planReviewableWorkflowGraph` accept
42
+ `includeExplanations: true` for same-call strategy, native-instance and edge reasons,
43
+ with separate code-owned source/verification records. Explicitly empty native
44
+ registries support API-only plans without requesting impossible node fields.
45
+ See the [combined graph guide](../../docs/graph-planning-records.md).
46
+
47
+ `planWorkflowConnections({ includeExplanations: true })` returns the
48
+ original execution plan plus separate per-new-edge/blocked-call reasons and
49
+ code-owned source receipts. No explanation-only call is added. The two combined
50
+ node-and-graph planners have their own explanation contract. See the
51
+ [connection planning guide](../../docs/connection-planning-records.md).
52
+
53
+ `planNativeNodes({ includeExplanations: true })` records same-call reasons
54
+ for each new instance or an explicit no-additions decision. Code attaches the source
55
+ context and implementation receipts. Runtime-enabled model contracts choose an
56
+ explicit `parameterSource`; code derives empty runtime parameters/flags, never from
57
+ placeholder text. See [native planning records](../../docs/native-planning-records.md).
58
+
59
+ `planApiBindings({ includeExplanations: true })` asks for a short reason
60
+ per call in the existing strict function call. Original gap descriptions remain
61
+ their reasons; code owns the supplied-contract evidence in `bindingPlanning`.
62
+ Executable `calls[].bindings` contain no audit metadata. See
63
+ [binding planning records](../../docs/binding-planning-records.md).
64
+
65
+ `generateApiArguments({ includeExplanations: true })` adds a same-call
66
+ short reason and a code-owned `literalGeneration` record for the original proposal,
67
+ not the final values after confirmed-input merge. Optional `purpose` scopes repeated
68
+ API roles. No remaining literals means zero calls and no required model; otherwise
69
+ a supplied structured-output model is required. See
70
+ [literal records and source boundaries](../../docs/literal-generation-records.md).
71
+
72
+ `analyzeApiRequestMediaType` returns the typed origin/resolution record,
73
+ with optional same-call reasons and code-attached original scenario/requestBody
74
+ evidence. Zero/one format needs no model; explicit null alone uses the existing
75
+ documented default. `selectApiRequestMediaType` remains the string-only projection
76
+ of the same implementation. Choose one API, not both in sequence. See
77
+ [request format decisions](../../docs/request-media-decisions.md).
78
+
79
+ `selectApiOperations` and `analyzeApiSelection` accept optional
80
+ `includeExplanations: true`. The same call returns only a short reason per decision;
81
+ core attaches the exact scenario and chosen/alternative/full discovery inventory.
82
+ Omission preserves the standalone selector's existing non-explanation output.
83
+ This is discovery provenance, not full OAS contract or semantic correctness proof.
84
+ See [API selection explanations](../../docs/api-selection-explanations.md).
85
+
86
+ selected-API binding questions now emit typed current-input pointers and
87
+ actual source alternatives, not free-form questions or claims about missing OAS.
88
+ Core renders/validates the question and resolves explicit human choices without
89
+ another model call. See [scoped binding questions](../../docs/workflow-draft-api-binding-questions.md).
90
+
91
+ `suggestWorkflowReviewFollowUps` makes one bounded structured-output call
92
+ for the actual current HITL boundary. The model proposes optional messages and source
93
+ references; core owns identities, evidence text and explicit adoption. No suggestion
94
+ becomes intent or a graph patch without a human action. See [the contract](../../docs/workflow-review-suggestions.md).
95
+
96
+ `planWorkflowDraftApiCallBindings` and `generateWorkflowDraftApiCallArguments`
97
+ separate one selected API instance's source choices from OAS-typed literal extraction.
98
+ Code-known mappings and fully owned inputs require no model-generated constants.
99
+ Optional literal extraction uses function calling with unchanged local validation,
100
+ not strict output that would force absent OAS values. See the
101
+ [API addition/replacement guide](../../docs/workflow-draft-api-call-planning.md).
102
+
103
+ `generateWorkflowDraftNativeNodeAddition` configures one code-identified `add-native-node` step with the actual registered schema. Optional `selectWorkflowDraftNativeNodeParameterOwnership` separates explicit field ownership from typed remaining values, so hosts can checkpoint/review between calls. Entirely deferred or fixed strict-empty settings need no value model. Evidence selects actual IDs instead of generated quotations. Connection planning and host review remain separate. See [native additions](../../docs/workflow-draft-native-node-addition.md).
104
+
105
+ `planWorkflowDraftNativeReferenceRepair` uses one bounded call for an actual native consumer task. Model output contains only code-keyed source decisions or questions; core owns reference locations, patches and validation. See the [native repair contract](../../docs/workflow-draft-native-reference-repairs.md). Material-dependent registry refresh and complete conversational composition remain unfinished.
106
+
107
+ `selectWorkflowDraftNativeParameterEditTargets` and `generateWorkflowDraftNativeParameterEdits` split an existing native revision into target choice and typed parameter values. Core owns schemas, identity and deterministic patches; removal/explicit field-deferral work needs no value call. Opted-in field deferral preserves unrelated literals/owners, and set transfers only the selected owner back to a literal. See the [native parameter-edit contract](../../docs/workflow-draft-native-parameter-edits.md). New draft-native instances use their separate ownership/value stages. Independent hosts can use `selectNativeNodeInstances` followed by `generateNativeNodeParameters` for mixed-field planning without constructing a fake draft. Each invocation is separately checkpointable; no nested planning calls are hidden in the compact planner.
108
+
109
+ `planWorkflowDraftConnectionEdit` makes one bounded connection-delta call only after actual material results and consumer repairs resolve. Its schema constrains real endpoint/port pairs and editable existing edges; code validates the full candidate DAG. Retained edges and parameter values are not regenerated. See the [connection-edit contract](../../docs/workflow-draft-connection-edits.md); material-dependent native repairs, new-instance models and full conversational host integration remain unfinished.
110
+
111
+ `planWorkflowDraftApiBindingEdit` makes one bounded source/ownership decision call for a pending reference-edit step or a code-derived consumer repair. Core re-derives staged authority, preserves unrelated mappings and values, and rejects stale/unknown sources or incompatible declarations without transforming data. Unknown producer choices return scoped questions, not a partial applied edit. Literal displacement is an explicit `replace-literal-with-binding` decision. See the [binding edit/staging contract](../../docs/workflow-draft-api-binding-edits.md); connection/native edits use separate stages. Material-dependent native repair, new-instance composition and host review/resume remain unfinished.
112
+
113
+ `selectWorkflowDraftApiInputEditTargets` and `generateWorkflowDraftApiInputEdits` split an existing literal edit into target selection and OAS-typed actual-value extraction. Core owns field schemas/IDs, exact source checks and deterministic patches; unchanged values are preserved. Missing actual values return `needs-input` without a partial resolution; removals need no value call. Hosts can review between the two calls or supply structured targets/values directly through core. See the [scoped input-edit contract](../../docs/workflow-draft-api-input-edits.md). Binding, connection and native edits use separate stages; registry refresh, new-instance models and complete LangGraph composition remain unfinished.
114
+
115
+ `analyzeWorkflowDraftEdit` makes one bounded call for semantic change decisions, supplied candidates and existing targets. Core resolves original OAS identities and validates exact current-request provenance, stale state and code-owned IDs. Values, settings, bindings, connections and atomic application remain separate stages. No whole-workflow regeneration or automatic retry is added. See the [edit analysis boundary and remaining composition](../../docs/workflow-draft-edit-analysis.md).
116
+
117
+ `planNativeNodes({ ..., allowRuntimeParameters: true })` offers explicit runtime parameter ownership only for implementing capabilities. One schema/material factory supplies both the output alternatives and HumanMessage `parameterSources`, so the model receives the same contract it may return. Omission stays literal-only; the model never supplies runtime slot IDs or schemas. Older combined planning compositions do not automatically forward this option. See the [native runtime input contract](../../docs/native-runtime-inputs.md).
118
+
119
+ `generateNativeNodeParameters` can resume a `needs-clarification` result with `replies: [{ question, text }]`, retaining the same selected role, original scenario and source snapshot. Append another pair for each actual follow-up; stale or out-of-order questions fail before invocation. The model receives validated question/reply data separately and still returns only the same typed setting decision. It does not repeat capability selection or acquire graph/ownership authority. The [native setting reply guide](../../docs/native-runtime-inputs.md#answering-a-selected-instances-questions) shows the host boundary.
120
+
121
+ `clarifyWorkflowRequirements({ model, context, limits, options? })` makes one described structured-output call for user-grounded requirements and necessary categorized questions. Optional explanations/suggestions are removed from the output schema when disabled. Core validates exact source references and allocates identities; the output has no runtime argument values and does not automatically adopt suggestions. Official Zod inline serialization owns the wire schema while the original Zod schema validates the response. See the [clarification contract](https://github.com/carefreelife98/openapi-flow/blob/main/docs/workflow-requirements-clarification.md). This does not add a host graph or guarantee model semantic accuracy.
122
+
123
+ source additions provide `analyzeApiSelection` and `extractApiInputAnswers`. The former separates consequential API-role choices from absent capabilities; the latter extracts only pending, OAS-typed answers and checks their complete value spans against the user's actual reply. Existing selectors remain available. These additions are not included in npm 0.2.0; see the [conversation guide](https://github.com/carefreelife98/openapi-flow/blob/main/docs/conversational-generation.md).
124
+
125
+ Independent model calls for OpenAPI workflows. Version `0.3.1` depends on matching core `0.3.1`.
4
126
 
5
127
  - `selectApiOperations`: choose catalog candidates and describe capability gaps with structured output.
6
128
  - `planApiBindings`: selected OAS contracts and optional declared `nativeOutputs` → output-to-request pointer bindings and request-data gaps, independently of native control-flow planning. API pointers read response bodies; native pointers read the declared JSON output. Neither changes value types or semantics.
@@ -0,0 +1,3 @@
1
+ import type { ApiInputAnswerAnalysis } from '@openapi-flow/core';
2
+ import type { AnalyzeApiInputAnswersInput } from '../types/api-input-answers.js';
3
+ export declare function analyzeApiInputAnswers(input: AnalyzeApiInputAnswersInput): Promise<ApiInputAnswerAnalysis>;
@@ -0,0 +1,87 @@
1
+ import { HumanMessage, SystemMessage } from '@langchain/core/messages';
2
+ import { captureApiInputAnswerContext, createApiInputAnswerExtractionRecord, resolveApiInputAnswerSources, describeApiInputSources, resolveApiInputSourceSelections, } from '@openapi-flow/core';
3
+ import { createApiInputAnswerSourceSchema, apiInputAnswerExplanationOptionsSchema, } from '../schemas/api-input-answer-source-schema.js';
4
+ import { apiInputAnswersPrompt } from '../prompts/api-input-answers-prompt.js';
5
+ import { serializeStructuredOutputSchema } from '../schemas/serialize-structured-output-schema.js';
6
+ import { parseStructuredOutput } from '../legacy/planning/parse-structured-output.js';
7
+ export async function analyzeApiInputAnswers(input) {
8
+ const options = apiInputAnswerExplanationOptionsSchema.parse({
9
+ includeExplanations: input.includeExplanations,
10
+ });
11
+ const snapshot = captureApiInputAnswerContext({
12
+ reply: input.reply,
13
+ requirements: input.requirements,
14
+ });
15
+ if (input.model !== undefined &&
16
+ (!input.model || typeof input.model.withStructuredOutput !== 'function'))
17
+ throw new Error('analyzeApiInputAnswers.model must support structured output when supplied');
18
+ if (!snapshot.requirements.length || snapshot.reply === '')
19
+ return {
20
+ status: snapshot.requirements.length
21
+ ? 'empty-reply'
22
+ : 'no-pending-inputs',
23
+ answers: [],
24
+ sources: [],
25
+ unansweredRequirementIds: snapshot.requirements.map((item) => item.id),
26
+ };
27
+ const catalog = describeApiInputSources(snapshot.reply);
28
+ if (!catalog.json.length && !catalog.text.length)
29
+ return {
30
+ status: 'extracted',
31
+ answers: [],
32
+ sources: [],
33
+ unansweredRequirementIds: snapshot.requirements.map((item) => item.id),
34
+ };
35
+ if (!input.model)
36
+ throw new Error('analyzeApiInputAnswers.model is required for a nonempty reply with pending inputs');
37
+ const schema = createApiInputAnswerSourceSchema(snapshot.requirements, catalog, options.includeExplanations === true);
38
+ const output = await input.model
39
+ .withStructuredOutput(serializeStructuredOutputSchema(schema, 'draft-2020-12'), {
40
+ name: 'extract_api_input_answers',
41
+ method: 'functionCalling',
42
+ strict: true,
43
+ })
44
+ .invoke([
45
+ new SystemMessage(apiInputAnswersPrompt),
46
+ new HumanMessage(JSON.stringify({
47
+ reply: snapshot.reply,
48
+ questions: snapshot.requirements,
49
+ sources: catalog,
50
+ })),
51
+ ]);
52
+ const parsed = parseStructuredOutput(schema, output, 'model clarification answer sources');
53
+ const selections = resolveApiInputSourceSelections({
54
+ ...snapshot,
55
+ selections: parsed.answers.map(({ requirementId, source }) => ({
56
+ requirementId,
57
+ source,
58
+ })),
59
+ });
60
+ const resolved = resolveApiInputAnswerSources({
61
+ ...snapshot,
62
+ selections,
63
+ });
64
+ let extraction;
65
+ if (options.includeExplanations === true) {
66
+ if (typeof parsed.reason !== 'string')
67
+ throw new Error('model clarification answer sources require an explanation');
68
+ extraction = createApiInputAnswerExtractionRecord({
69
+ ...snapshot,
70
+ decision: {
71
+ reason: parsed.reason,
72
+ answers: parsed.answers.map((source, index) => {
73
+ if (typeof source.reason !== 'string')
74
+ throw new Error(`model answer ${source.requirementId} requires an explanation`);
75
+ return { ...selections[index], reason: source.reason };
76
+ }),
77
+ },
78
+ });
79
+ }
80
+ return {
81
+ status: 'extracted',
82
+ answers: resolved.answers,
83
+ sources: resolved.sources,
84
+ unansweredRequirementIds: resolved.unansweredRequirementIds,
85
+ ...(extraction === undefined ? {} : { extraction }),
86
+ };
87
+ }
@@ -0,0 +1,4 @@
1
+ import type { ApiRequestMediaTypeDecision } from '@openapi-flow/core';
2
+ import type { AnalyzeApiRequestMediaTypeInput } from '../types/request-media-selection.js';
3
+ /** One assessment call only for multiple formats; code owns resolution and sources. */
4
+ export declare function analyzeApiRequestMediaType(input: AnalyzeApiRequestMediaTypeInput): Promise<ApiRequestMediaTypeDecision>;
@@ -0,0 +1,50 @@
1
+ import { HumanMessage, SystemMessage } from '@langchain/core/messages';
2
+ import { createApiRequestMediaTypeDecision, describeApiRequestMediaTypeContext, } from '@openapi-flow/core';
3
+ import { createApiRequestMediaTypeSchema } from '../schemas/api-request-media-type-schema.js';
4
+ import { requestMediaSelectionOptionsSchema } from '../schemas/request-media-selection-options-schema.js';
5
+ import { apiRequestMediaTypePrompt } from '../prompts/api-request-media-type-prompt.js';
6
+ import { assertSelectionInput } from '../legacy/planning/select-operation.js';
7
+ import { parseStructuredOutput } from '../legacy/planning/parse-structured-output.js';
8
+ /** One assessment call only for multiple formats; code owns resolution and sources. */
9
+ export async function analyzeApiRequestMediaType(input) {
10
+ assertSelectionInput(input.scenario, input.model);
11
+ const options = requestMediaSelectionOptionsSchema.parse({
12
+ includeExplanations: input.includeExplanations,
13
+ });
14
+ const operation = structuredClone(input.operation);
15
+ const context = describeApiRequestMediaTypeContext({
16
+ operation,
17
+ scenario: input.scenario,
18
+ ...(input.purpose === undefined ? {} : { purpose: input.purpose }),
19
+ });
20
+ if (context.mediaTypes.length < 2)
21
+ return createApiRequestMediaTypeDecision({
22
+ operation,
23
+ scenario: context.scenario,
24
+ ...(context.purpose === undefined ? {} : { purpose: context.purpose }),
25
+ });
26
+ const schema = createApiRequestMediaTypeSchema(context.mediaTypes, options.includeExplanations === true);
27
+ const proposed = await input.model
28
+ .withStructuredOutput(schema, {
29
+ name: 'select_api_request_media_type',
30
+ method: 'functionCalling',
31
+ strict: true,
32
+ })
33
+ .invoke([
34
+ new SystemMessage(apiRequestMediaTypePrompt),
35
+ new HumanMessage(JSON.stringify({
36
+ scenario: context.scenario,
37
+ ...(context.purpose === undefined
38
+ ? {}
39
+ : { purpose: context.purpose }),
40
+ operation: context.operation,
41
+ })),
42
+ ]);
43
+ const assessment = parseStructuredOutput(schema, proposed, 'model API request media type');
44
+ return createApiRequestMediaTypeDecision({
45
+ operation,
46
+ scenario: context.scenario,
47
+ ...(context.purpose === undefined ? {} : { purpose: context.purpose }),
48
+ assessment,
49
+ });
50
+ }
@@ -0,0 +1,3 @@
1
+ import type { ApiInputAnswer } from '@openapi-flow/core';
2
+ import type { ExtractApiInputAnswersInput } from '../types/api-input-answers.js';
3
+ export declare function extractApiInputAnswers(input: ExtractApiInputAnswersInput): Promise<ApiInputAnswer[]>;
@@ -0,0 +1,4 @@
1
+ import { analyzeApiInputAnswers } from './analyze-api-input-answers.js';
2
+ export async function extractApiInputAnswers(input) {
3
+ return (await analyzeApiInputAnswers(input)).answers;
4
+ }
@@ -1,45 +1,60 @@
1
1
  import { SystemMessage, HumanMessage } from '@langchain/core/messages';
2
- import { createApiArgumentGenerationContract, validateApiArguments, } from '@openapi-flow/core';
2
+ import { describeApiLiteralGeneration, createApiLiteralGenerationRecord, validateApiArguments, applyConfirmedApiInputs, } from '@openapi-flow/core';
3
+ import { apiLiteralGenerationOptionsSchema, createApiLiteralGenerationOutputSchema, } from '../schemas/api-literal-generation-output-schema.js';
3
4
  import { apiArgumentsPrompt } from '../prompts/api-arguments-prompt.js';
4
- import { assertSelectionInput } from '../legacy/planning/select-operation.js';
5
5
  import { parseStructuredOutput } from '../legacy/planning/parse-structured-output.js';
6
6
  export async function generateApiArguments(input) {
7
- assertSelectionInput(input.scenario, input.model);
7
+ if (input.model !== undefined &&
8
+ (!input.model || typeof input.model.withStructuredOutput !== 'function'))
9
+ throw new Error('generateApiArguments.model must support structured output when supplied');
8
10
  if (typeof input.callId !== 'string' || !input.callId.trim())
9
11
  throw new Error('callId must be non-empty');
10
- const contract = createApiArgumentGenerationContract(input);
11
- const schema = contract.schema;
12
- const proposed = contract.hasLiteralInputs
13
- ? await input.model
12
+ const options = apiLiteralGenerationOptionsSchema.parse({
13
+ includeExplanations: input.includeExplanations,
14
+ });
15
+ const { input: snapshot, contract, context, } = describeApiLiteralGeneration(input);
16
+ const schema = createApiLiteralGenerationOutputSchema(contract, options.includeExplanations === true);
17
+ let proposed = { values: {} };
18
+ if (contract.hasLiteralInputs) {
19
+ const model = input.model;
20
+ if (!model || typeof model.withStructuredOutput !== 'function')
21
+ throw new Error('generateApiArguments.model must support structured output when literal inputs remain');
22
+ proposed = await model
14
23
  .withStructuredOutput(schema, {
15
24
  name: 'generate_api_arguments',
16
25
  method: 'functionCalling',
17
26
  })
18
27
  .invoke([
19
28
  new SystemMessage(apiArgumentsPrompt),
20
- new HumanMessage(JSON.stringify({
21
- scenario: input.scenario,
22
- operation: {
23
- key: input.operation.key,
24
- method: input.operation.method,
25
- path: input.operation.path,
26
- summary: input.operation.operation.summary,
27
- description: input.operation.operation.description,
28
- },
29
- literalInputSchema: contract.literalInputSchema,
30
- requestMediaType: input.requestMediaType,
31
- })),
32
- ])
33
- : { values: {} };
34
- const parsed = parseStructuredOutput(schema, proposed, `model arguments for ${input.callId}`);
35
- const validation = validateApiArguments({ ...input, values: parsed.values });
36
- return {
37
- callId: input.callId,
29
+ new HumanMessage(JSON.stringify(context)),
30
+ ]);
31
+ }
32
+ const parsed = parseStructuredOutput(schema, proposed, `model arguments for ${snapshot.callId}`);
33
+ const values = applyConfirmedApiInputs({
34
+ ...snapshot,
38
35
  values: parsed.values,
39
- bindings: structuredClone(input.bindings),
36
+ });
37
+ const validation = validateApiArguments({ ...snapshot, values });
38
+ return {
39
+ callId: snapshot.callId,
40
+ values,
41
+ bindings: structuredClone(snapshot.bindings),
40
42
  unresolvedInputs: validation.missingInputs,
41
- ...(input.requestMediaType === undefined
43
+ ...(snapshot.requestMediaType === undefined
42
44
  ? {}
43
- : { requestMediaType: input.requestMediaType }),
45
+ : { requestMediaType: snapshot.requestMediaType }),
46
+ ...(options.includeExplanations === true
47
+ ? {
48
+ literalGeneration: createApiLiteralGenerationRecord({
49
+ ...snapshot,
50
+ ...('explanation' in parsed
51
+ ? {
52
+ proposal: { values: parsed.values },
53
+ reason: parsed.explanation.reason,
54
+ }
55
+ : {}),
56
+ }),
57
+ }
58
+ : {}),
44
59
  };
45
60
  }
@@ -1,39 +1,10 @@
1
- import { HumanMessage, SystemMessage } from '@langchain/core/messages';
2
- import { listApiRequestMediaTypes, selectDefaultApiRequestMediaType, } from '@openapi-flow/core';
3
- import { createApiRequestMediaTypeSchema } from '../schemas/api-request-media-type-schema.js';
4
- import { apiRequestMediaTypePrompt } from '../prompts/api-request-media-type-prompt.js';
5
- import { assertSelectionInput } from '../legacy/planning/select-operation.js';
6
- import { parseStructuredOutput } from '../legacy/planning/parse-structured-output.js';
1
+ import { analyzeApiRequestMediaType } from './analyze-api-request-media-type.js';
7
2
  export async function selectApiRequestMediaType(input) {
8
- assertSelectionInput(input.scenario, input.model);
9
- const mediaTypes = listApiRequestMediaTypes(input.operation);
10
- if (input.operation.operation.requestBody === undefined)
11
- return undefined;
12
- if (mediaTypes.length === 0)
13
- throw new Error(`${input.operation.key.operationRef}.requestBody.content has no request media type`);
14
- if (mediaTypes.length === 1)
15
- return mediaTypes[0];
16
- const schema = createApiRequestMediaTypeSchema(mediaTypes);
17
- const output = await input.model
18
- .withStructuredOutput(schema, {
19
- name: 'select_api_request_media_type',
20
- method: 'functionCalling',
21
- strict: true,
22
- })
23
- .invoke([
24
- new SystemMessage(apiRequestMediaTypePrompt),
25
- new HumanMessage(JSON.stringify({
26
- scenario: input.scenario,
27
- operation: {
28
- key: input.operation.key,
29
- method: input.operation.method,
30
- path: input.operation.path,
31
- requestBody: input.operation.operation.requestBody,
32
- },
33
- })),
34
- ]);
35
- const selected = parseStructuredOutput(schema, output, 'model API request media type');
36
- if (selected.requestMediaType === null)
37
- return selectDefaultApiRequestMediaType(input.operation);
38
- return selected.requestMediaType;
3
+ const decision = await analyzeApiRequestMediaType({
4
+ operation: input.operation,
5
+ scenario: input.scenario,
6
+ ...(input.purpose === undefined ? {} : { purpose: input.purpose }),
7
+ model: input.model,
8
+ });
9
+ return decision.requestMediaType;
39
10
  }
@@ -1,13 +1,16 @@
1
1
  import { SystemMessage, HumanMessage } from '@langchain/core/messages';
2
- import { validateApiBindingAssignments, validateApiBindingGaps, validateNativeOutputContracts, listApiResponsePointers, } from '@openapi-flow/core';
3
- import { createApiBindingPlanSchema } from '../schemas/api-binding-plan-schema.js';
2
+ import { validateApiBindingAssignments, validateApiBindingGaps, describeApiBindingPlanning, createApiBindingPlanningRecord, } from '@openapi-flow/core';
3
+ import { createApiBindingPlanSchema, apiBindingPlanningOptionsSchema, } from '../schemas/api-binding-plan-schema.js';
4
4
  import { apiBindingsPrompt } from '../prompts/api-bindings-prompt.js';
5
5
  import { assertSelectionInput } from '../legacy/planning/select-operation.js';
6
6
  import { parseStructuredOutput } from '../legacy/planning/parse-structured-output.js';
7
7
  export async function planApiBindings(input) {
8
8
  assertSelectionInput(input.scenario, input.model);
9
- validateNativeOutputContracts(input.nativeOutputs ?? []);
10
- const schema = createApiBindingPlanSchema(input.materials, input.nativeOutputs);
9
+ const options = apiBindingPlanningOptionsSchema.parse({
10
+ includeExplanations: input.includeExplanations,
11
+ });
12
+ const { input: snapshot, context } = describeApiBindingPlanning(input);
13
+ const schema = createApiBindingPlanSchema(snapshot.materials, snapshot.nativeOutputs, options.includeExplanations === true);
11
14
  const proposed = await input.model
12
15
  .withStructuredOutput(schema, {
13
16
  name: 'plan_api_bindings',
@@ -16,28 +19,32 @@ export async function planApiBindings(input) {
16
19
  })
17
20
  .invoke([
18
21
  new SystemMessage(apiBindingsPrompt),
19
- new HumanMessage(JSON.stringify({
20
- scenario: input.scenario,
21
- nativeOutputs: input.nativeOutputs,
22
- materials: input.materials.map(({ operation, ...material }) => ({
23
- ...material,
24
- operation: {
25
- key: operation.key,
26
- method: operation.method,
27
- path: operation.path,
28
- operation: operation.operation,
29
- effective: operation.effective,
30
- },
31
- responsePointerCatalog: listApiResponsePointers(operation),
32
- })),
33
- })),
22
+ new HumanMessage(JSON.stringify(context)),
34
23
  ]);
35
- const plan = parseStructuredOutput(schema, proposed, 'model API bindings');
24
+ const parsed = parseStructuredOutput(schema, proposed, 'model API bindings');
25
+ const plan = {
26
+ calls: parsed.calls.map(({ callId, bindings }) => ({
27
+ callId,
28
+ bindings: structuredClone(bindings),
29
+ })),
30
+ gaps: structuredClone(parsed.gaps),
31
+ };
36
32
  validateApiBindingAssignments({
37
33
  calls: plan.calls,
38
- materials: input.materials,
39
- nativeOutputs: input.nativeOutputs,
34
+ materials: snapshot.materials,
35
+ nativeOutputs: snapshot.nativeOutputs,
40
36
  });
41
- validateApiBindingGaps({ plan, materials: input.materials });
37
+ validateApiBindingGaps({ plan, materials: snapshot.materials });
38
+ if (options.includeExplanations === true) {
39
+ plan.bindingPlanning = createApiBindingPlanningRecord({
40
+ ...snapshot,
41
+ plan,
42
+ reasons: parsed.calls.map((call) => {
43
+ if (!('reason' in call))
44
+ throw new Error(`model API bindings are missing reason for ${call.callId}`);
45
+ return { callId: call.callId, reason: call.reason };
46
+ }),
47
+ });
48
+ }
42
49
  return plan;
43
50
  }
@@ -0,0 +1,4 @@
1
+ import type { WorkflowDraftEditPlan } from '@openapi-flow/core';
2
+ import type { AnalyzeWorkflowDraftEditInput } from '../types/workflow-draft-edit.js';
3
+ /** One semantic call. Resolution/values/bindings/edges and canonical mutation stay separate. */
4
+ export declare function analyzeWorkflowDraftEdit(input: AnalyzeWorkflowDraftEditInput): Promise<WorkflowDraftEditPlan>;
@@ -0,0 +1,84 @@
1
+ import { HumanMessage, SystemMessage } from '@langchain/core/messages';
2
+ import { createWorkflowDraftEditPlan, describeWorkflowDraftEditContext, resolveWorkflowDraftEditOptions, describeWorkflowDraftCapabilityGap, } from '@openapi-flow/core';
3
+ import { createWorkflowDraftEditSchema } from '../schemas/workflow-draft-edit-schema.js';
4
+ import { workflowDraftEditPrompt } from '../prompts/workflow-draft-edit-prompt.js';
5
+ import { workflowUserActionEvidencePrompt } from '../prompts/workflow-user-action-evidence-prompt.js';
6
+ import { parseStructuredOutput } from '../legacy/planning/parse-structured-output.js';
7
+ import { WorkflowDraftEditPlanningError } from './workflow-draft-edit-planning-error.js';
8
+ import { resolveWorkflowDraftEditProposal } from './resolve-workflow-draft-edit-proposal.js';
9
+ import { serializeStructuredOutputSchema } from '../schemas/serialize-structured-output-schema.js';
10
+ /** One semantic call. Resolution/values/bindings/edges and canonical mutation stay separate. */
11
+ export async function analyzeWorkflowDraftEdit(input) {
12
+ if (!input.model || typeof input.model.withStructuredOutput !== 'function')
13
+ throw new Error('analyzeWorkflowDraftEdit.model must support structured output');
14
+ const context = describeWorkflowDraftEditContext(input);
15
+ const options = resolveWorkflowDraftEditOptions(input.options);
16
+ const candidates = context.planning.operations.map((operation, index) => ({
17
+ candidateId: `candidate-${index + 1}`,
18
+ operation,
19
+ }));
20
+ const schema = createWorkflowDraftEditSchema(context, options, candidates.map((candidate) => candidate.candidateId));
21
+ const output = await input.model
22
+ .withStructuredOutput(serializeStructuredOutputSchema(schema, 'draft-7', 'input', 'ref'), {
23
+ name: 'analyze_workflow_draft_edit',
24
+ method: 'jsonSchema',
25
+ strict: true,
26
+ })
27
+ .invoke([
28
+ new SystemMessage(workflowDraftEditPrompt + '\n' + workflowUserActionEvidencePrompt),
29
+ new HumanMessage(JSON.stringify({
30
+ requestMessageIds: context.requestMessageIds,
31
+ draft: {
32
+ requirements: context.draft.requirements,
33
+ removedRequirements: context.removedRequirements,
34
+ apiCalls: context.draft.apiCalls,
35
+ nativeNodes: context.draft.nativeNodes,
36
+ nodeContracts: context.nodeContracts,
37
+ ...(context.draft.gapNodes === undefined
38
+ ? {}
39
+ : {
40
+ gapNodes: context.draft.gapNodes.map((gap) => describeWorkflowDraftCapabilityGap({
41
+ gap,
42
+ context: input.context,
43
+ })),
44
+ }),
45
+ edges: context.draft.edges,
46
+ },
47
+ messages: context.planning.messages,
48
+ candidates,
49
+ capabilities: context.planning.capabilities,
50
+ options,
51
+ ...(context.planning.clarification === undefined
52
+ ? {}
53
+ : { clarification: context.planning.clarification }),
54
+ })),
55
+ ]);
56
+ let proposed;
57
+ try {
58
+ proposed = parseStructuredOutput(schema, output, 'model draft edit');
59
+ }
60
+ catch (cause) {
61
+ if (!(cause instanceof Error))
62
+ throw cause;
63
+ throw new WorkflowDraftEditPlanningError({ stage: 'proposal-schema', proposal: output }, cause);
64
+ }
65
+ try {
66
+ const plan = createWorkflowDraftEditPlan({
67
+ ...input,
68
+ options,
69
+ proposal: resolveWorkflowDraftEditProposal(proposed, candidates),
70
+ });
71
+ if (plan.draftFingerprint !== context.draftFingerprint ||
72
+ plan.contextFingerprint !== context.contextFingerprint ||
73
+ plan.nodeContractsFingerprint !== context.nodeContractsFingerprint ||
74
+ JSON.stringify(plan.requestMessageIds) !==
75
+ JSON.stringify(context.requestMessageIds))
76
+ throw new Error('Draft edit input changed during model invocation; no automatic rebase is permitted');
77
+ return plan;
78
+ }
79
+ catch (cause) {
80
+ if (!(cause instanceof Error))
81
+ throw cause;
82
+ throw new WorkflowDraftEditPlanningError({ stage: 'proposal-validation', proposal: output }, cause);
83
+ }
84
+ }
@@ -0,0 +1,3 @@
1
+ import type { WorkflowDraftApiCallArgumentsResult } from '@openapi-flow/core';
2
+ import type { GenerateWorkflowDraftApiCallArgumentsInput } from '../types/workflow-draft-api-call-planning.js';
3
+ export declare function generateWorkflowDraftApiCallArguments(input: GenerateWorkflowDraftApiCallArgumentsInput): Promise<WorkflowDraftApiCallArgumentsResult>;