feat: add scene 8 chat entry surface

This commit is contained in:
lda
2026-07-12 05:05:13 +07:00 Verified
parent 640873a8a2
commit 127fa99413
6 changed files with 205 additions and 2 deletions
@@ -0,0 +1,71 @@
import type { FormEvent } from "react";
import { Button } from "../../components/ui/button.js";
import { Textarea } from "../../components/ui/textarea.js";
import { AuthoringConversation } from "./AuthoringConversation.js";
import {
canSubmitScene8Entry,
type Scene8EntryAction,
type Scene8EntryState,
} from "./scene8-entry-state.js";
type Scene8ChatEntryProps = {
readonly state: Scene8EntryState;
readonly dispatch: (action: Scene8EntryAction) => void;
};
/** Scene 8's deterministic request surface; submission reveals prepared data locally. */
export const Scene8ChatEntry = ({ state, dispatch }: Scene8ChatEntryProps) => {
const submitted = state.phase === "submitted";
const canSubmit = canSubmitScene8Entry(state);
const submit = (event?: FormEvent<HTMLFormElement>) => {
event?.preventDefault();
if (canSubmit) dispatch({ type: "submit" });
};
return (
<section className="agent-handoff-scene__entry" aria-label="authoring chat entry">
<div className="agent-handoff-scene__intro">
<span>Scene 8 · agent handoff</span>
<h1>What should the workflow author prepare?</h1>
<p>Ask the external agent to inspect the available sources and capabilities before it authors the workflow.</p>
</div>
<form className="agent-handoff-scene__composer" onSubmit={submit}>
<label className="agent-handoff-scene__composer-label" htmlFor="scene8-authoring-request">
Authoring request
</label>
<Textarea
id="scene8-authoring-request"
value={state.draft}
disabled={submitted}
onChange={(event) => dispatch({ type: "draft_changed", draft: event.target.value })}
onKeyDown={(event) => {
if (event.key === "Enter" && !event.shiftKey) {
event.preventDefault();
submit();
}
}}
aria-describedby="scene8-authoring-request-help"
/>
<div className="agent-handoff-scene__composer-actions">
<Button type="submit" disabled={!canSubmit}>
Send
</Button>
</div>
<p id="scene8-authoring-request-help" className="agent-handoff-scene__composer-help">
Shift+Enter adds a new line. This is a deterministic prepared replay, not a live model request.
</p>
</form>
{submitted ? (
<div className="agent-handoff-scene__entry-thread">
<AuthoringConversation
throughPhase="discover"
activePhase="discover"
surface="stage"
requestOverride={state.request}
/>
</div>
) : null}
</section>
);
};