Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backend/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ async def execute_plugin(plugin_name: str, parent_node_id: str | None = None):
await bus.publish("scene")
return node.id

notifications.show(f'"{name}" node creation lands in R3/R5.', "info")
notifications.show(f'"{name}" node creation isn\'t available yet.', "info")
await bus.publish("notification")
return None

Expand Down
2 changes: 1 addition & 1 deletion backend/tests/test_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ def test_execute_plugin_falls_through_to_the_generic_deferred_notice_for_an_unha
assert result is None
assert notifications.visible is True
assert notifications.msg_type == "info"
assert notifications.message == '"Future Plugin" node creation lands in R3/R5.'
assert notifications.message == '"Future Plugin" node creation isn\'t available yet.'


def test_execute_plugin_shows_warning_notification_for_unknown_plugin():
Expand Down
2 changes: 1 addition & 1 deletion web_ui/src/app/canvas/ChatNodeView.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ describe("ChatNodeView", () => {
for (const name of ["Generate Key Takeaway", "Generate Explainer Note"]) {
const item = screen.getByRole("menuitem", { name });
expect(item).toBeDisabled();
expect(item).toHaveAttribute("title", "AI generation lands in R4");
expect(item).toHaveAttribute("title", "AI note generation isn't available yet");
}
expect(screen.getByRole("menuitem", { name: "Generate Image" })).not.toBeDisabled();
expect(screen.getByRole("menuitem", { name: "Generate Chart" })).not.toBeDisabled();
Expand Down
4 changes: 2 additions & 2 deletions web_ui/src/app/canvas/ChatNodeView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -207,10 +207,10 @@
<button type="button" role="menuitem" disabled title="Document view integration isn't wired into the SPA yet">
Open Document View
</button>
<button type="button" role="menuitem" disabled title="AI generation lands in R4">
<button type="button" role="menuitem" disabled title="AI note generation isn't available yet">
Generate Key Takeaway
</button>
<button type="button" role="menuitem" disabled title="AI generation lands in R4">
<button type="button" role="menuitem" disabled title="AI note generation isn't available yet">
Generate Explainer Note
</button>
{/* R6.2: a real click-to-expand submenu (not disabled) - same
Expand Down Expand Up @@ -286,7 +286,7 @@
* ChartNodeView.tsx's makeDebouncedChartResize / HtmlNodeView.tsx's
* makeDebouncedSplitterReport, exported standalone for the same direct-unit-
* testability reason. */
export function makeDebouncedScrollReport(

Check warning on line 289 in web_ui/src/app/canvas/ChatNodeView.tsx

View workflow job for this annotation

GitHub Actions / Frontend checks (npm run check)

Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
timerRef: { current: ReturnType<typeof setTimeout> | null },
onScrollChange: (value: number) => void,
debounceMs: number = CHAT_SCROLL_REPORT_DEBOUNCE_MS,
Expand Down
2 changes: 1 addition & 1 deletion web_ui/src/app/canvas/DocumentNodeView.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ describe("DocumentNodeView", () => {

const exportItem = screen.getByRole("menuitem", { name: "Export" });
expect(exportItem).toBeDisabled();
expect(exportItem).toHaveAttribute("title", "Export lands in R6");
expect(exportItem).toHaveAttribute("title", "Document export isn't available yet");

// filePath is empty -> Open File must be entirely absent, matching the
// legacy menu's own conditional (only added when file_path is set).
Expand Down
2 changes: 1 addition & 1 deletion web_ui/src/app/canvas/DocumentNodeView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
/** Ports DocumentNode._format_byte_size() verbatim: falsy byte_size (None or
* 0) is "Unknown"; whole bytes have no decimal; every larger unit is one
* decimal place; TB is the terminal unit regardless of magnitude. */
export function formatByteSize(byteSize: number | null): string {

Check warning on line 63 in web_ui/src/app/canvas/DocumentNodeView.tsx

View workflow job for this annotation

GitHub Actions / Frontend checks (npm run check)

Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
if (!byteSize) return "Unknown";
let size = byteSize;
const units = ["B", "KB", "MB", "GB", "TB"];
Expand All @@ -75,7 +75,7 @@

/** Ports graphlink_audio.format_duration() verbatim: H:MM:SS once an hour is
* reached, otherwise M:SS (no leading zero on the leftmost unit). */
export function formatDuration(seconds: number | null): string {

Check warning on line 78 in web_ui/src/app/canvas/DocumentNodeView.tsx

View workflow job for this annotation

GitHub Actions / Frontend checks (npm run check)

Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
if (seconds === null) return "Unknown";
const totalSeconds = Math.max(0, Math.round(seconds));
const hours = Math.floor(totalSeconds / 3600);
Expand Down Expand Up @@ -115,7 +115,7 @@
* block itself as the node's content, and that shape must still suppress
* the preview even though today's freshly-built audio-details string might
* not be a byte-for-byte match (e.g. a mime type the old session lacked). */
export function shouldShowAudioPreview(content: string, audioDetails: string): boolean {

Check warning on line 118 in web_ui/src/app/canvas/DocumentNodeView.tsx

View workflow job for this annotation

GitHub Actions / Frontend checks (npm run check)

Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
const normalizedContent = normalizePreviewText(content);
if (!normalizedContent) return false;

Expand All @@ -134,7 +134,7 @@
* kinds - DocumentNode._show_preview_content defaults True for "document"
* but an empty preview_text still suppresses the panel), and for "audio"
* kind specifically, the suppression heuristic above must also pass. */
export function shouldShowContentPreview(attachmentKind: string, content: string, audioDetails: string): boolean {

Check warning on line 137 in web_ui/src/app/canvas/DocumentNodeView.tsx

View workflow job for this annotation

GitHub Actions / Frontend checks (npm run check)

Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
if (!content.trim()) return false;
if (attachmentKind !== "audio") return true;
return shouldShowAudioPreview(content, audioDetails);
Expand All @@ -143,7 +143,7 @@
/** Ports DocumentNode._build_metadata_rows() verbatim: Type always first,
* then Duration/Format/Size/Path each gated on its own field being
* populated (falsy-checked exactly like the Python, not gated on kind). */
export function buildMetadataRows(fields: {

Check warning on line 146 in web_ui/src/app/canvas/DocumentNodeView.tsx

View workflow job for this annotation

GitHub Actions / Frontend checks (npm run check)

Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
attachmentKind: string;
durationSeconds: number | null;
mimeType: string;
Expand Down Expand Up @@ -263,7 +263,7 @@
)}
<div className="chat-node-menu-separator" role="separator" />
{isDocumentKind && (
<button type="button" role="menuitem" disabled title="Export lands in R6">
<button type="button" role="menuitem" disabled title="Document export isn't available yet">
Export
</button>
)}
Expand Down
2 changes: 1 addition & 1 deletion web_ui/src/app/canvas/HtmlNodeView.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ describe("HtmlNodeView", () => {
expect(popout).toBeDisabled();
expect(popout).toHaveAttribute(
"title",
"Popout view isn't built yet - see the R3 plan doc for why a naive window.open() would be unsafe for untrusted HTML",
"Popout view isn't built yet - opening untrusted HTML in a separate window needs a security review first",
);

await user.click(popout); // disabled - fires nothing
Expand Down
2 changes: 1 addition & 1 deletion web_ui/src/app/canvas/HtmlNodeView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ export function HtmlNodeView({ data, selected }: NodeProps<HtmlFlowNode>) {
type="button"
className="html-node-header-btn"
disabled
title="Popout view isn't built yet - see the R3 plan doc for why a naive window.open() would be unsafe for untrusted HTML"
title="Popout view isn't built yet - opening untrusted HTML in a separate window needs a security review first"
>
Popout
</button>
Expand Down
2 changes: 1 addition & 1 deletion web_ui/src/app/canvas/SceneCanvas.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ function PlaceholderNodeView({ data, selected }: NodeProps<PlaceholderNode>) {
on bottom. */}
<Handle type="target" position={Position.Top} className="scene-node-handle" />
<div className="scene-node-title">{data.title}</div>
{!collapsed && <div className="scene-node-body">placeholder — real nodes land in R3</div>}
{!collapsed && <div className="scene-node-body">Placeholder node</div>}
<Handle type="source" position={Position.Bottom} className="scene-node-handle" />
</div>
);
Expand Down
2 changes: 1 addition & 1 deletion web_ui/src/app/chrome/AppBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ export function AppBar({ store }: { store: SceneStore }) {
value="Ollama (Local)"
aria-label="Provider mode"
disabled
title="Provider modes land in R4"
title="Switching provider modes isn't available yet"
onChange={() => {}}
>
<option>Ollama (Local)</option>
Expand Down
4 changes: 3 additions & 1 deletion web_ui/src/app/chrome/Composer.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,9 @@ describe("Composer", () => {
);
expect(screen.getByLabelText("Send message")).toBeDisabled();
expect(screen.getByLabelText("Attach context")).toBeDisabled();
expect(screen.getByTitle("Model/provider selection lands in R4")).toBeDisabled();
expect(
screen.getByTitle("Model selection isn't available here yet - configure models in Settings"),
).toBeDisabled();
});

it("Send is enabled once there's text, calls sceneStore.sendMessage, and clears the draft", async () => {
Expand Down
4 changes: 2 additions & 2 deletions web_ui/src/app/chrome/Composer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ export function Composer({ store, sceneStore }: { store: ComposerStore; sceneSto
type="button"
className="composer-icon-button"
disabled
title="Attachments land in R4 (file-staging pipeline)"
title="Attachments aren't available yet"
aria-label="Attach context"
>
<Icon name="attach" />
Expand All @@ -119,7 +119,7 @@ export function Composer({ store, sceneStore }: { store: ComposerStore; sceneSto
type="button"
className="composer-control"
disabled
title="Model/provider selection lands in R4"
title="Model selection isn't available here yet - configure models in Settings"
>
<span className="control-copy">
<span className="control-kicker">{composer.route.provider}</span>
Expand Down
Loading