Repository navigation
feat(cli): continue cut-off responses with a declared continuation recipe #142
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
27 commits
Select commit
Hold shift + click to select a range
d6e789a
feat(cli): fail commands on a declared terminal failure state
AshGodfrey dadc371
fix(cli): classify output.outcome on paginated pages and link streamE…
AshGodfrey 8ddeda4
refactor(cli): share the response-path walker and decode stream frame…
AshGodfrey 5778e83
fix(cli): verify stream outcome states against the event enum and acc…
AshGodfrey 7ee6314
refactor(cli): inherit operation outcome tables into intents, decode …
AshGodfrey f2a3e94
fix(cli): accept string failure detail, index segments in the artifac…
AshGodfrey 7184697
Merge remote-tracking branch 'origin/main' into ash/cli-terminal-states
AshGodfrey 7a7fa85
test(cli): refresh release snapshots for the outcome-failure README p…
AshGodfrey acbb4b5
fix(cli): intersect allOf and ref-sibling enums when verifying outcom…
AshGodfrey f563ced
feat(cli): decode and link continuation recipes in x-speakeasy-cli-co…
TristanSpeakEasy 7422ac5
feat(cli): continue cut-off responses with a declared continuation re…
TristanSpeakEasy c9a4a6a
fix(cli): close continuation gaps for pending stream drops, mixed res…
TristanSpeakEasy d9eb6d2
fix(cli): tighten continuation linking and runtime edge cases
TristanSpeakEasy a8092ec
fix(cli): skip null enum members in async state pointers
TristanSpeakEasy 9fa7b4e
fix(cli): classify output.outcome for --output-file and --output-b64
TristanSpeakEasy fd88b45
fix(cli): keep $ref sibling constraints when walking stream paths
TristanSpeakEasy 5209510
Merge remote-tracking branch 'origin/main' into ash/cli-terminal-states
TristanSpeakEasy 3b301c7
fix(cli): apply oneOf/anyOf semantics when verifying stream outcome s…
TristanSpeakEasy 1cc6c8e
Merge remote-tracking branch 'origin/ash/cli-terminal-states' into tr…
TristanSpeakEasy 2d84963
Merge remote-tracking branch 'origin/main' into ash/cli-terminal-states
AshGodfrey 17ff538
Merge remote-tracking branch 'origin/main' into ash/cli-terminal-states
AshGodfrey 7851e9b
Merge remote-tracking branch 'origin/ash/cli-terminal-states' into tr…
AshGodfrey 9566f90
Merge remote-tracking branch 'origin/main' into tristan/cli-continuation
AshGodfrey f36ad20
Merge remote-tracking branch 'origin/main' into tristan/cli-continuation
TristanSpeakEasy 5c43e3f
fix(cli): explain why an operation entry's continue state needs its o…
TristanSpeakEasy f0aee71
fix(cli): tighten continuation target and aggregation path checks
TristanSpeakEasy 61654c0
fix(cli): reject a readOnly arm as a continuation target
TristanSpeakEasy File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| id: 1792717600-4c1d2e7a | ||
| features: | ||
| - cliCommands | ||
| targets: | ||
| - cli | ||
| type: feat | ||
| bump: minor | ||
| description: declare a continuation recipe so a command re-sends its request with resume values from the response while output.outcome classifies the response state as continue, combining the responses (merge arrays, sum numbers) or streaming every response as one output, with --auto-continue and --max-continuations flags and CLI_CONTINUATION_LIMIT when the hop limit is reached | ||
| author: TristanSpeakEasy | ||
| date: "2026-10-23" |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This pass rejects an operation entry whose outcome has a
continuestate whenever the recipe lives on the command instead of the operation entry, but the error text says that layout is allowed.Repro (fails with
operation "ComposeWidget" classifies output.outcome state "more_required" as continue but declares no continuation recipe):Suggest skipping operations here that a single-route command with its own recipe targets (the command pass already validates those), or only rejecting when no linked recipe covers the operation. A test for this layout would be good too.
Verified by running this manifest through
decodeCLIWithSpecwithcliContinuationTestSpecon this branch; it fails with the error above.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thanks for the repro! I had a look and I think rejecting this layout is actually right, it's the error text that was wrong. the operation entry's outcome also gets attached to the generated operation command (
opcmd.go.stmplsetsspeakeasy_outcomefrom it), not just tocompose. so if we skipped the check here, the raw operation command would carrymore_required: continuewith no recipe and exit 0 on an incomplete response, which is the case this pass exists to stopso in 5c43e3f I've kept the rejection but changed the message for operation entries to explain that and point at the two layouts that do work: put
continuation:on the operation entry (single-route intents inherit it, which is whatvalidContinuationManifestcovers), or moveoutput.outcomeonto the intent. I also added your manifest as a test case asserting the new messagelet me know if you'd rather go the other way and have the operation command pick up the recipe too, but that gets ambiguous once two intents target the same op so I'd prefer not to
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're right, the operation entry's outcome also lands on the generated operation command, so rejecting this layout is correct. The new message and test cover it. Thanks.