chore(studio): Rename copilot to assistant - #1258
Conversation
Signed-off-by: Danielle Ali <44468613+dmariali@users.noreply.github.com>
Signed-off-by: Danielle Ali <44468613+dmariali@users.noreply.github.com>
ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (148)
💤 Files with no reviewable changes (4)
📝 WalkthroughWalkthroughThis change renames the packaged agent and Studio chat surface from NeMo Studio Copilot to NeMo Studio Assistant. It updates agent packaging, backend routes, persisted entities, feature flags, web chat modules, skill documents, tests, and release notes. ChangesNeMo Studio Assistant migration
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 2📝 Generate docstrings 💡
🛠️ Fix failing CI checks 💡
🧪 Generate unit tests (beta)
Comment |
|
There was a problem hiding this comment.
Actionable comments posted: 7
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
web/packages/studio/src/routes/agents/AssistantChatRoute/useAssistantChatRuntime.ts (1)
695-708: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winPrevent stale permission results from writing into another session.
If
resolveAssistantPermissioncompletes afterloadSession, Line 703 appends denial text to the newly loaded session.resolveInputRequestalready guards this case at Lines 650-655. Capture the session and request IDs before the await. Ignore stale completions beforeappendUserMessageand state updates. Add a matching stale-permission test.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/agents/AssistantChatRoute/useAssistantChatRuntime.ts` around lines 695 - 708, Update the permission-resolution flow in resolveAssistantPermission to capture the current sessionId and activePermission.requestId before awaiting completion, then ignore the result if either identifier no longer matches the active session or permission request. Apply this stale-result guard before appendUserMessage and dispatchBlocking, and add a test covering completion after loadSession to ensure the newly loaded session is unchanged.services/studio/src/nmp/studio/assistant.py (1)
864-894: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy liftPreserve legacy Copilot conversation history.
The rename changed the entity type from
copilot_conversationtoassistant_conversationand the name fromcopilot-{session_id}toassistant-{session_id}. Add a migration or compatibility reads before rollout.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@services/studio/src/nmp/studio/assistant.py` around lines 864 - 894, Update the session-history loading flow around AssistantConversation and _conversation_name to preserve legacy Copilot history: when the assistant entity lookup finds nothing, also read the legacy copilot_conversation entity using the copilot-{session_id} naming convention, while retaining ownership validation and response mapping. Prefer a migration if the existing persistence APIs support it; otherwise implement compatibility reads before rollout.
🧹 Nitpick comments (6)
web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx (2)
6-16: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winUse
import typefor type-only imports.Move
AgentBlockingInputSubmission,AgentDecisionChoice, andFCtoimport typedeclarations.Proposed change
-import { type AgentBlockingInputSubmission } from '`@studio/components/agents/AgentBlockingInput`'; +import type { AgentBlockingInputSubmission } from '`@studio/components/agents/AgentBlockingInput`'; import { AgentDecisionInput, - type AgentDecisionChoice, } from '`@studio/components/agents/AgentDecisionInput`'; +import type { AgentDecisionChoice } from '`@studio/components/agents/AgentDecisionInput`'; -import { type FC, useCallback, useLayoutEffect, useMemo, useRef } from 'react'; +import type { FC } from 'react'; +import { useCallback, useLayoutEffect, useMemo, useRef } from 'react';As per coding guidelines, “Use
import typefor type-only imports.”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx` around lines 6 - 16, Update the imports in AssistantChatThread.tsx to use import type for the type-only symbols AgentBlockingInputSubmission, AgentDecisionChoice, and FC, while keeping the runtime React hooks and component imports as regular imports.Source: Coding guidelines
37-42: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winMark public props as readonly.
web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx#L37-L42: Mark everyAssistantChatThreadPropsproperty asreadonly.web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsx#L11-L14: Mark everyAssistantStudioLinkPropsproperty asreadonly.As per coding guidelines, “Use
readonlyfor immutable properties.”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx` around lines 37 - 42, Mark every property in AssistantChatThreadProps in web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx (lines 37-42) as readonly. Apply the same change to every property in AssistantStudioLinkProps in web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsx (lines 11-14).Source: Coding guidelines
web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsx (1)
19-19: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd an explicit return type.
AssistantStudioLinkis a public API. Declare its React element return type.As per coding guidelines, “Use explicit return types for public APIs and complex functions.”
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsx` at line 19, Update the public AssistantStudioLink component declaration to include an explicit React element return type, while preserving its existing props and rendering behavior.Source: Coding guidelines
agents/nemo-studio-assistant/tests/smoke_test.md (1)
7-17: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd the required runbook sections.
Before
## Static and unit validation, add## Prerequisiteswith the required platform endpoint,uv,nemo, deployment access, and cleanup permissions. After the final section, add## Next Stepswith cross-links to the assistant deployment and Studio documentation.As per coding guidelines, documentation pages must list prerequisites at the top and include a
Next Stepssection with cross-links.Also applies to: 76-82
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@agents/nemo-studio-assistant/tests/smoke_test.md` around lines 7 - 17, Add a top-level Prerequisites section before Static and unit validation, documenting the required platform endpoint, uv, nemo, deployment access, and cleanup permissions. Append a Next Steps section after the final existing section with cross-links to the assistant deployment and Studio documentation, keeping the current validation commands unchanged.Source: Coding guidelines
web/packages/studio/env/.env.dev.local.sample (1)
26-26: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueMove the key before
VITE_FF_BASE_MODELS_ENABLED.dotenv-linter reports an
UnorderedKeywarning for this line.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/env/.env.dev.local.sample` at line 26, Move VITE_FF_ASSISTANT_STUDIO_ENABLED so it appears before VITE_FF_BASE_MODELS_ENABLED in the environment sample, preserving both keys and their values.Source: Linters/SAST tools
services/studio/src/nmp/studio/studio_links.py (1)
35-38: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick winConsider keeping
copilotas an alias.The
copilotdestination key is gone, and the alias list does not include it. The code keeps the legacycopilot_studio_enabledflag at Line 421 for compatibility, so any stored or model-emitteddestination="copilot"now fails to resolve. Add the alias to match the flag-level compatibility.♻️ Proposed change
- aliases=("claude_code", "claude_code_chat", "assistant_chat"), + aliases=("claude_code", "claude_code_chat", "assistant_chat", "copilot", "copilot_chat"),🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@services/studio/src/nmp/studio/studio_links.py` around lines 35 - 38, Add "copilot" to the aliases tuple in the assistant StudioLinkDestination definition so legacy destination="copilot" values resolve to the existing assistant destination, matching the compatibility behavior of copilot_studio_enabled.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@agents/nemo-studio-assistant-spec/skills/auditor/SKILL.md`:
- Around line 7-10: Update the auditor CRUD guidance for nemo_api audit.targets
and audit.configs so every create, list, retrieve, update, and delete call
passes workspace set to the active request workspace. Ensure both target and
config operations consistently include this workspace argument.
In `@agents/nemo-studio-assistant/skills/auditor/SKILL.md`:
- Line 5: Update the top-level headings in
agents/nemo-studio-assistant/skills/auditor/SKILL.md:5-5 and
agents/nemo-studio-assistant/skills/entities/SKILL.md:5-5 by prefixing “Auditor
tasks” and “Entity tasks” with a level-one Markdown heading marker,
respectively.
In `@agents/nemo-studio-assistant/skills/files/SKILL.md`:
- Around line 19-29: Update the delete workflow in the documented mutation steps
to require a scoped read-back confirming that the targeted file or fileset is
absent before proceeding to step 8 or reporting success. Keep the existing
identity scoping, and treat any result that does not confirm absence as an
unknown commit state: stop without continuing or cleanup assumptions.
In
`@agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/inference/SKILL.md`:
- Line 5: Update the task titles to Markdown H1 headings: in
agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/inference/SKILL.md:5
change “Inference provider tasks”; in
agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/secrets/SKILL.md:5
change “Secret tasks”; and in
agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/workspace/SKILL.md:5
change “Workspace tasks”.
In `@web/packages/studio/env/.env.fastapi`:
- Line 23: Update the Helm deployment configuration for
VITE_FF_ASSISTANT_STUDIO_ENABLED so the runtime mapping sets
platformConfig.studio.feature_flags.assistant_studio_enabled to true, rather
than relying on the false default when the setting is absent. Preserve the
existing local configuration behavior.
In `@web/packages/studio/src/routes/agents/AssistantChatRoute/api.ts`:
- Around line 168-178: Update the parsing logic around parseModelSource and
assistantModel to preserve legacy artifacts: accept copilot_model as a fallback
for assistant_model, treat model_source "copilot" as the assistant source, and
ensure persisted copilot-<session_id> session names remain readable or are
migrated to assistant-<session_id> before deployment.
In
`@web/packages/studio/src/routes/agents/AssistantChatRoute/studioUiNavigationSuggestions.ts`:
- Around line 210-217: Update the deploy-agent pattern in the navigation
suggestions to exclude prompts whose agent reference is followed by
code-oriented terms such as class, component, helper, test, function, or module,
matching the exclusion used by the build/create pattern. Add “Deploy an agent
component” to the ordinary-prompt test cases.
---
Outside diff comments:
In `@services/studio/src/nmp/studio/assistant.py`:
- Around line 864-894: Update the session-history loading flow around
AssistantConversation and _conversation_name to preserve legacy Copilot history:
when the assistant entity lookup finds nothing, also read the legacy
copilot_conversation entity using the copilot-{session_id} naming convention,
while retaining ownership validation and response mapping. Prefer a migration if
the existing persistence APIs support it; otherwise implement compatibility
reads before rollout.
In
`@web/packages/studio/src/routes/agents/AssistantChatRoute/useAssistantChatRuntime.ts`:
- Around line 695-708: Update the permission-resolution flow in
resolveAssistantPermission to capture the current sessionId and
activePermission.requestId before awaiting completion, then ignore the result if
either identifier no longer matches the active session or permission request.
Apply this stale-result guard before appendUserMessage and dispatchBlocking, and
add a test covering completion after loadSession to ensure the newly loaded
session is unchanged.
---
Nitpick comments:
In `@agents/nemo-studio-assistant/tests/smoke_test.md`:
- Around line 7-17: Add a top-level Prerequisites section before Static and unit
validation, documenting the required platform endpoint, uv, nemo, deployment
access, and cleanup permissions. Append a Next Steps section after the final
existing section with cross-links to the assistant deployment and Studio
documentation, keeping the current validation commands unchanged.
In `@services/studio/src/nmp/studio/studio_links.py`:
- Around line 35-38: Add "copilot" to the aliases tuple in the assistant
StudioLinkDestination definition so legacy destination="copilot" values resolve
to the existing assistant destination, matching the compatibility behavior of
copilot_studio_enabled.
In `@web/packages/studio/env/.env.dev.local.sample`:
- Line 26: Move VITE_FF_ASSISTANT_STUDIO_ENABLED so it appears before
VITE_FF_BASE_MODELS_ENABLED in the environment sample, preserving both keys and
their values.
In
`@web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx`:
- Around line 6-16: Update the imports in AssistantChatThread.tsx to use import
type for the type-only symbols AgentBlockingInputSubmission,
AgentDecisionChoice, and FC, while keeping the runtime React hooks and component
imports as regular imports.
- Around line 37-42: Mark every property in AssistantChatThreadProps in
web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx
(lines 37-42) as readonly. Apply the same change to every property in
AssistantStudioLinkProps in
web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsx
(lines 11-14).
In
`@web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsx`:
- Line 19: Update the public AssistantStudioLink component declaration to
include an explicit React element return type, while preserving its existing
props and rendering behavior.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 8fb05096-9c34-4502-b053-28b74b4d6fa3
⛔ Files ignored due to path filters (1)
agents/nemo-studio-assistant/uv.lockis excluded by!**/*.lock
📒 Files selected for processing (148)
agents/nemo-studio-assistant-spec/AGENT-SPEC.mdagents/nemo-studio-assistant-spec/agent.yamlagents/nemo-studio-assistant-spec/skills/auditor/SKILL.mdagents/nemo-studio-assistant-spec/skills/benchmark-execution/SKILL.mdagents/nemo-studio-assistant-spec/skills/entities/SKILL.mdagents/nemo-studio-assistant-spec/skills/evaluator/SKILL.mdagents/nemo-studio-assistant-spec/skills/files/SKILL.mdagents/nemo-studio-assistant-spec/skills/guardrails/SKILL.mdagents/nemo-studio-assistant-spec/skills/inference/SKILL.mdagents/nemo-studio-assistant-spec/skills/secrets/SKILL.mdagents/nemo-studio-assistant-spec/skills/workspace/SKILL.mdagents/nemo-studio-assistant/.dockerignoreagents/nemo-studio-assistant/Dockerfile.fabric-localagents/nemo-studio-assistant/agent.yamlagents/nemo-studio-assistant/constraints.fabric-local.txtagents/nemo-studio-assistant/pyproject.tomlagents/nemo-studio-assistant/skills/auditor/SKILL.mdagents/nemo-studio-assistant/skills/benchmark-execution/SKILL.mdagents/nemo-studio-assistant/skills/entities/SKILL.mdagents/nemo-studio-assistant/skills/evaluator/SKILL.mdagents/nemo-studio-assistant/skills/files/SKILL.mdagents/nemo-studio-assistant/skills/guardrails/SKILL.mdagents/nemo-studio-assistant/skills/inference/SKILL.mdagents/nemo-studio-assistant/skills/secrets/SKILL.mdagents/nemo-studio-assistant/skills/workspace/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/mcp_server.pyagents/nemo-studio-assistant/src/nemo_studio_assistant/nemo-studio-assistant-eval-data.jsonagents/nemo-studio-assistant/src/nemo_studio_assistant/register.pyagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/.gitkeepagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/auditor/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/benchmark-execution/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/entities/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/evaluator/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/files/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/guardrails/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/inference/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/secrets/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/workspace/SKILL.mdagents/nemo-studio-assistant/tests/smoke_test.mdagents/nemo-studio-assistant/tests/test_nemo_studio_assistant.pyagents/nemo-studio-assistant/wheelhouse/nemo_platform-0.3.0.post217.dev0+b6f22880a-py3-none-any.whlagents/nemo-studio-copilot/tests/smoke_test.mddocs/about/release-notes/current-release.mdxpackages/nmp_platform/config/local.yamlpyproject.tomlpytest.iniservices/studio/src/nmp/studio/assistant.pyservices/studio/src/nmp/studio/assistant_artifacts.pyservices/studio/src/nmp/studio/assistant_mcp_tools.pyservices/studio/src/nmp/studio/assistant_skills.pyservices/studio/src/nmp/studio/entities.pyservices/studio/src/nmp/studio/env_mappings.pyservices/studio/src/nmp/studio/service.pyservices/studio/src/nmp/studio/studio_links.pyservices/studio/tests/unit/test_assistant.pyservices/studio/tests/unit/test_service.pyweb/packages/studio/env/.env.dev.local.sampleweb/packages/studio/env/.env.fastapiweb/packages/studio/src/components/CustomizeModelModal/constants.tsweb/packages/studio/src/components/ExperimentCreateModal/index.tsxweb/packages/studio/src/components/Layouts/GlobalNav/index.test.tsxweb/packages/studio/src/components/Layouts/GlobalNav/index.tsxweb/packages/studio/src/components/dataViews/EvaluationSessionsDataView/Empty.tsxweb/packages/studio/src/components/dataViews/ExperimentDataView/Empty.tsxweb/packages/studio/src/constants/environment.tsweb/packages/studio/src/constants/featureFlags/featureFlags.tsweb/packages/studio/src/constants/routes.tsweb/packages/studio/src/mocks/studio-ui/chip/constants.tsweb/packages/studio/src/mocks/studio-ui/chip/tools.jsonweb/packages/studio/src/routes/DashboardLandingRoute/SkillActionSection.tsxweb/packages/studio/src/routes/DashboardLandingRoute/index.test.tsxweb/packages/studio/src/routes/DashboardLandingRoute/index.tsxweb/packages/studio/src/routes/DashboardLandingRoute/skillActionSuggestions.tsweb/packages/studio/src/routes/DashboardLandingRoute/skillActionTemplates.test.tsweb/packages/studio/src/routes/DashboardLandingRoute/skillDisplayName.test.tsweb/packages/studio/src/routes/DashboardLandingRoute/skillDisplayName.tsweb/packages/studio/src/routes/PageLayout/index.tsxweb/packages/studio/src/routes/RootRedirect/index.test.tsxweb/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsxweb/packages/studio/src/routes/agents/AgentDeploymentsListRoute/CreateDeploymentModal/index.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantHistoryPanel.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantHistoryPanel.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantLayout.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLinkTarget.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantToolCallPart.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantToolCallPart.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantTopBarChat.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantTopBarChat.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/BlockingInputComposer.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/BlockingInputComposer.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/ChatThreadErrorBoundary.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/ChatThreadErrorBoundary.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/JobProgressToolCall.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/JobProgressToolCall.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/activeSessionStorage.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/api.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/api.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/artifacts.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/artifacts.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/blockingInputRequest.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/context/AssistantChatProvider.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/context/AssistantChatProvider.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/context/useAssistantChatContext.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/ArtifactSections.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/AssistantArtifactsPane.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/FloatingPanel.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/HistoryPanelContents.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/HistoryPanelSkeletons.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/HistorySessionButton.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/SkillCard.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/SkillsPanelContents.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/helpers.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/helpers.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/types.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/index.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/index.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/jobProgressConsts.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/stream.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/stream.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/studioUiNavigationSuggestions.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/studioUiNavigationSuggestions.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/toolCall/CollapsedThinkingToolCall.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/toolCall/FileChangeToolCallCard.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/toolCall/SubtleToolCallRow.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/toolCall/constants.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/toolCall/helpers.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/toolCall/types.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/toolParts.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/toolParts.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/types.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/useAssistantChatRuntime.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/useAssistantChatRuntime.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/useCustomAssistantChatRuntime.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/useCustomAssistantChatRuntime.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/util.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/util.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/utils/jobProgress.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/utils/jobProgress.tsweb/packages/studio/src/routes/agents/CopilotChatRoute/context/useCopilotChatContext.tsweb/packages/studio/src/routes/agents/CopilotChatRoute/types.tsweb/packages/studio/src/routes/groups/dashboardRoutes.tsxweb/packages/studio/src/routes/index.test.tsxweb/packages/studio/src/routes/utils.tsweb/packages/studio/src/util/localStorage.ts
💤 Files with no reviewable changes (4)
- agents/nemo-studio-assistant/.dockerignore
- agents/nemo-studio-copilot/tests/smoke_test.md
- web/packages/studio/src/routes/agents/CopilotChatRoute/context/useCopilotChatContext.ts
- web/packages/studio/src/routes/agents/CopilotChatRoute/types.ts
| # Feature Flags (VITE_FF_* prefix) | ||
| VITE_FF_AGENTS_ENABLED=STUDIO_UI_VITE_FF_AGENTS_ENABLED | ||
| VITE_FF_ANONYMIZER_ENABLED=STUDIO_UI_VITE_FF_ANONYMIZER_ENABLED | ||
| VITE_FF_ASSISTANT_STUDIO_ENABLED=STUDIO_UI_VITE_FF_ASSISTANT_STUDIO_ENABLED |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
rg -n 'ASSISTANT_STUDIO_ENABLED|COPILOT_STUDIO_ENABLED' --glob '!**/node_modules/**'Repository: NVIDIA-NeMo/nemo-platform
Length of output: 163
🏁 Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- candidate files ---'
git ls-files | rg -i '(^|/)(helm|charts?|values|env|deployment|config|kustomize|docker|compose)' | head -200
printf '%s\n' '--- exact environment references ---'
rg -n -i 'assistant|copilot|studio_ui_vite|vite_ff' --glob '!**/node_modules/**' --glob '!**/dist/**' --glob '!**/build/**' | head -300
printf '%s\n' '--- target file context ---'
cat -n web/packages/studio/env/.env.fastapi | sed -n '1,45p'Repository: NVIDIA-NeMo/nemo-platform
Length of output: 8760
🏁 Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- target directory ---'
ls -la web/packages/studio/env
printf '%s\n' '--- target file ---'
cat -n web/packages/studio/env/.env.fastapi
printf '%s\n' '--- hidden repository-wide references ---'
rg --hidden -n -i 'ASSISTANT_STUDIO_ENABLED|COPILOT_STUDIO_ENABLED|STUDIO_UI_VITE_FF|VITE_FF_ASSISTANT' \
--glob '!**/node_modules/**' --glob '!**/dist/**' --glob '!**/build/**' \
--glob '!.git/**' | head -400
printf '%s\n' '--- Helm values and env template references ---'
rg -n -i 'extraEnv|env:|environment|studio|vite|feature.?flag' k8s/helm/values.yaml k8s/helm/templates web --glob '!**/node_modules/**' | head -400Repository: NVIDIA-NeMo/nemo-platform
Length of output: 3590
🏁 Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- repository state ---'
git status --short
printf '%s\n' '--- tracked studio files ---'
git ls-files | rg '(^|/)(web|services/studio|studio)(/|$)' | head -300
printf '%s\n' '--- ignored and untracked matching files ---'
fd --hidden --no-ignore -t f '(env_mappings\.py|values.*\.ya?ml|\.env.*|studio)' . | head -400
printf '%s\n' '--- all matching text, including ignored files ---'
rg --hidden --no-ignore -n -i 'ASSISTANT_STUDIO_ENABLED|COPILOT_STUDIO_ENABLED|STUDIO_UI_VITE|VITE_FF_ASSISTANT' \
--glob '!**/node_modules/**' --glob '!**/.git/**' | head -500Repository: NVIDIA-NeMo/nemo-platform
Length of output: 20771
🏁 Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- environment mapping implementation ---'
wc -l services/studio/src/nmp/studio/env_mappings.py
cat -n services/studio/src/nmp/studio/env_mappings.py | sed -n '1,260p'
printf '%s\n' '--- direct target search ---'
rg -n --no-ignore 'ASSISTANT|STUDIO_UI|VITE_FF' web/packages/studio/env/.env.fastapi services/studio/src/nmp/studio/env_mappings.py
printf '%s\n' '--- platform configuration declarations ---'
rg -n --no-ignore -i 'feature.?flag|assistant|copilot|studio_ui|env_mappings' \
k8s/helm/values.yaml k8s/helm/templates services/studio web/packages/studio \
--glob '!**/node_modules/**' | head -500Repository: NVIDIA-NeMo/nemo-platform
Length of output: 50381
🏁 Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- feature-flag configuration definitions ---'
rg -n --no-ignore -C 3 'assistant_studio_enabled|copilot_studio_enabled|feature_flags' \
services packages k8s web/packages/studio/src web/packages/studio/env \
--glob '!**/node_modules/**' --glob '!**/dist/**' --glob '!**/build/**' \
--glob '*.py' --glob '*.yaml' --glob '*.yml' --glob '*.json' --glob '*.ts' --glob '*.tsx' --glob '*.env*' \
| head -500
printf '%s\n' '--- runtime replacement call path ---'
rg -n --no-ignore -C 5 'ENV_MAPPINGS|env_replacements|replace.*marker|global_settings' \
services/studio/src/nmp/studio \
--glob '*.py' | head -400
printf '%s\n' '--- relevant local configuration files ---'
rg -n --no-ignore -i -C 3 'assistant|copilot|feature_flags' \
packages/nmp_platform/config services k8s/helm \
--glob '*.env*' --glob '*.yaml' --glob '*.yml' --glob '*.json' --glob '*.toml' \
| head -400Repository: NVIDIA-NeMo/nemo-platform
Length of output: 50381
🏁 Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- all feature-flag declarations ---'
rg -n --no-ignore '^[[:space:]]*(assistant_studio_enabled|copilot_studio_enabled):|feature_flags:' \
--glob '!**/node_modules/**' --glob '!**/dist/**' --glob '!**/build/**' \
--glob '!**/.git/**' . | head -300
printf '%s\n' '--- platform config and Helm config wiring ---'
cat -n packages/nmp_platform/config/local.yaml | sed -n '165,205p'
cat -n k8s/helm/templates/platform-configmap.yaml | sed -n '1,220p'
rg -n -C 4 'platform-config|config.*yaml|global_settings|NMP_.*FEATURE|feature_flags' \
k8s/helm/values.yaml k8s/helm/templates packages/nmp_platform services/studio \
--glob '*.yaml' --glob '*.yml' --glob '*.py' --glob '*.toml' | head -500Repository: NVIDIA-NeMo/nemo-platform
Length of output: 43526
🏁 Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- Helm config inputs ---'
rg -n -C 8 'define "nemo-platform.calculatedConfig"|calculatedConfig|config:' \
k8s/helm/templates k8s/helm/values.yaml k8s/helm/README.md \
--glob '*.tpl' --glob '*.yaml' --glob '*.md' | head -500
printf '%s\n' '--- Helm values structure ---'
cat -n k8s/helm/values.yaml | sed -n '1,180p'
printf '%s\n' '--- local and deployment configuration behavior ---'
cat -n services/studio/src/nmp/studio/config.py | sed -n '80,180p'Repository: NVIDIA-NeMo/nemo-platform
Length of output: 32495
Set platformConfig.studio.feature_flags.assistant_studio_enabled: true for Helm deployments. The runtime mapping defaults to false when this setting is absent. Local configuration already enables it.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@web/packages/studio/env/.env.fastapi` at line 23, Update the Helm deployment
configuration for VITE_FF_ASSISTANT_STUDIO_ENABLED so the runtime mapping sets
platformConfig.studio.feature_flags.assistant_studio_enabled to true, rather
than relying on the false default when the setting is absent. Preserve the
existing local configuration behavior.
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 7
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
web/packages/studio/src/routes/agents/AssistantChatRoute/useAssistantChatRuntime.ts (1)
695-708: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winPrevent stale permission results from writing into another session.
If
resolveAssistantPermissioncompletes afterloadSession, Line 703 appends denial text to the newly loaded session.resolveInputRequestalready guards this case at Lines 650-655. Capture the session and request IDs before the await. Ignore stale completions beforeappendUserMessageand state updates. Add a matching stale-permission test.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/agents/AssistantChatRoute/useAssistantChatRuntime.ts` around lines 695 - 708, Update the permission-resolution flow in resolveAssistantPermission to capture the current sessionId and activePermission.requestId before awaiting completion, then ignore the result if either identifier no longer matches the active session or permission request. Apply this stale-result guard before appendUserMessage and dispatchBlocking, and add a test covering completion after loadSession to ensure the newly loaded session is unchanged.services/studio/src/nmp/studio/assistant.py (1)
864-894: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy liftPreserve legacy Copilot conversation history.
The rename changed the entity type from
copilot_conversationtoassistant_conversationand the name fromcopilot-{session_id}toassistant-{session_id}. Add a migration or compatibility reads before rollout.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@services/studio/src/nmp/studio/assistant.py` around lines 864 - 894, Update the session-history loading flow around AssistantConversation and _conversation_name to preserve legacy Copilot history: when the assistant entity lookup finds nothing, also read the legacy copilot_conversation entity using the copilot-{session_id} naming convention, while retaining ownership validation and response mapping. Prefer a migration if the existing persistence APIs support it; otherwise implement compatibility reads before rollout.
🧹 Nitpick comments (6)
web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx (2)
6-16: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winUse
import typefor type-only imports.Move
AgentBlockingInputSubmission,AgentDecisionChoice, andFCtoimport typedeclarations.Proposed change
-import { type AgentBlockingInputSubmission } from '`@studio/components/agents/AgentBlockingInput`'; +import type { AgentBlockingInputSubmission } from '`@studio/components/agents/AgentBlockingInput`'; import { AgentDecisionInput, - type AgentDecisionChoice, } from '`@studio/components/agents/AgentDecisionInput`'; +import type { AgentDecisionChoice } from '`@studio/components/agents/AgentDecisionInput`'; -import { type FC, useCallback, useLayoutEffect, useMemo, useRef } from 'react'; +import type { FC } from 'react'; +import { useCallback, useLayoutEffect, useMemo, useRef } from 'react';As per coding guidelines, “Use
import typefor type-only imports.”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx` around lines 6 - 16, Update the imports in AssistantChatThread.tsx to use import type for the type-only symbols AgentBlockingInputSubmission, AgentDecisionChoice, and FC, while keeping the runtime React hooks and component imports as regular imports.Source: Coding guidelines
37-42: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winMark public props as readonly.
web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx#L37-L42: Mark everyAssistantChatThreadPropsproperty asreadonly.web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsx#L11-L14: Mark everyAssistantStudioLinkPropsproperty asreadonly.As per coding guidelines, “Use
readonlyfor immutable properties.”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx` around lines 37 - 42, Mark every property in AssistantChatThreadProps in web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx (lines 37-42) as readonly. Apply the same change to every property in AssistantStudioLinkProps in web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsx (lines 11-14).Source: Coding guidelines
web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsx (1)
19-19: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd an explicit return type.
AssistantStudioLinkis a public API. Declare its React element return type.As per coding guidelines, “Use explicit return types for public APIs and complex functions.”
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsx` at line 19, Update the public AssistantStudioLink component declaration to include an explicit React element return type, while preserving its existing props and rendering behavior.Source: Coding guidelines
agents/nemo-studio-assistant/tests/smoke_test.md (1)
7-17: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd the required runbook sections.
Before
## Static and unit validation, add## Prerequisiteswith the required platform endpoint,uv,nemo, deployment access, and cleanup permissions. After the final section, add## Next Stepswith cross-links to the assistant deployment and Studio documentation.As per coding guidelines, documentation pages must list prerequisites at the top and include a
Next Stepssection with cross-links.Also applies to: 76-82
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@agents/nemo-studio-assistant/tests/smoke_test.md` around lines 7 - 17, Add a top-level Prerequisites section before Static and unit validation, documenting the required platform endpoint, uv, nemo, deployment access, and cleanup permissions. Append a Next Steps section after the final existing section with cross-links to the assistant deployment and Studio documentation, keeping the current validation commands unchanged.Source: Coding guidelines
web/packages/studio/env/.env.dev.local.sample (1)
26-26: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueMove the key before
VITE_FF_BASE_MODELS_ENABLED.dotenv-linter reports an
UnorderedKeywarning for this line.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/env/.env.dev.local.sample` at line 26, Move VITE_FF_ASSISTANT_STUDIO_ENABLED so it appears before VITE_FF_BASE_MODELS_ENABLED in the environment sample, preserving both keys and their values.Source: Linters/SAST tools
services/studio/src/nmp/studio/studio_links.py (1)
35-38: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick winConsider keeping
copilotas an alias.The
copilotdestination key is gone, and the alias list does not include it. The code keeps the legacycopilot_studio_enabledflag at Line 421 for compatibility, so any stored or model-emitteddestination="copilot"now fails to resolve. Add the alias to match the flag-level compatibility.♻️ Proposed change
- aliases=("claude_code", "claude_code_chat", "assistant_chat"), + aliases=("claude_code", "claude_code_chat", "assistant_chat", "copilot", "copilot_chat"),🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@services/studio/src/nmp/studio/studio_links.py` around lines 35 - 38, Add "copilot" to the aliases tuple in the assistant StudioLinkDestination definition so legacy destination="copilot" values resolve to the existing assistant destination, matching the compatibility behavior of copilot_studio_enabled.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@agents/nemo-studio-assistant-spec/skills/auditor/SKILL.md`:
- Around line 7-10: Update the auditor CRUD guidance for nemo_api audit.targets
and audit.configs so every create, list, retrieve, update, and delete call
passes workspace set to the active request workspace. Ensure both target and
config operations consistently include this workspace argument.
In `@agents/nemo-studio-assistant/skills/auditor/SKILL.md`:
- Line 5: Update the top-level headings in
agents/nemo-studio-assistant/skills/auditor/SKILL.md:5-5 and
agents/nemo-studio-assistant/skills/entities/SKILL.md:5-5 by prefixing “Auditor
tasks” and “Entity tasks” with a level-one Markdown heading marker,
respectively.
In `@agents/nemo-studio-assistant/skills/files/SKILL.md`:
- Around line 19-29: Update the delete workflow in the documented mutation steps
to require a scoped read-back confirming that the targeted file or fileset is
absent before proceeding to step 8 or reporting success. Keep the existing
identity scoping, and treat any result that does not confirm absence as an
unknown commit state: stop without continuing or cleanup assumptions.
In
`@agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/inference/SKILL.md`:
- Line 5: Update the task titles to Markdown H1 headings: in
agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/inference/SKILL.md:5
change “Inference provider tasks”; in
agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/secrets/SKILL.md:5
change “Secret tasks”; and in
agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/workspace/SKILL.md:5
change “Workspace tasks”.
In `@web/packages/studio/env/.env.fastapi`:
- Line 23: Update the Helm deployment configuration for
VITE_FF_ASSISTANT_STUDIO_ENABLED so the runtime mapping sets
platformConfig.studio.feature_flags.assistant_studio_enabled to true, rather
than relying on the false default when the setting is absent. Preserve the
existing local configuration behavior.
In `@web/packages/studio/src/routes/agents/AssistantChatRoute/api.ts`:
- Around line 168-178: Update the parsing logic around parseModelSource and
assistantModel to preserve legacy artifacts: accept copilot_model as a fallback
for assistant_model, treat model_source "copilot" as the assistant source, and
ensure persisted copilot-<session_id> session names remain readable or are
migrated to assistant-<session_id> before deployment.
In
`@web/packages/studio/src/routes/agents/AssistantChatRoute/studioUiNavigationSuggestions.ts`:
- Around line 210-217: Update the deploy-agent pattern in the navigation
suggestions to exclude prompts whose agent reference is followed by
code-oriented terms such as class, component, helper, test, function, or module,
matching the exclusion used by the build/create pattern. Add “Deploy an agent
component” to the ordinary-prompt test cases.
---
Outside diff comments:
In `@services/studio/src/nmp/studio/assistant.py`:
- Around line 864-894: Update the session-history loading flow around
AssistantConversation and _conversation_name to preserve legacy Copilot history:
when the assistant entity lookup finds nothing, also read the legacy
copilot_conversation entity using the copilot-{session_id} naming convention,
while retaining ownership validation and response mapping. Prefer a migration if
the existing persistence APIs support it; otherwise implement compatibility
reads before rollout.
In
`@web/packages/studio/src/routes/agents/AssistantChatRoute/useAssistantChatRuntime.ts`:
- Around line 695-708: Update the permission-resolution flow in
resolveAssistantPermission to capture the current sessionId and
activePermission.requestId before awaiting completion, then ignore the result if
either identifier no longer matches the active session or permission request.
Apply this stale-result guard before appendUserMessage and dispatchBlocking, and
add a test covering completion after loadSession to ensure the newly loaded
session is unchanged.
---
Nitpick comments:
In `@agents/nemo-studio-assistant/tests/smoke_test.md`:
- Around line 7-17: Add a top-level Prerequisites section before Static and unit
validation, documenting the required platform endpoint, uv, nemo, deployment
access, and cleanup permissions. Append a Next Steps section after the final
existing section with cross-links to the assistant deployment and Studio
documentation, keeping the current validation commands unchanged.
In `@services/studio/src/nmp/studio/studio_links.py`:
- Around line 35-38: Add "copilot" to the aliases tuple in the assistant
StudioLinkDestination definition so legacy destination="copilot" values resolve
to the existing assistant destination, matching the compatibility behavior of
copilot_studio_enabled.
In `@web/packages/studio/env/.env.dev.local.sample`:
- Line 26: Move VITE_FF_ASSISTANT_STUDIO_ENABLED so it appears before
VITE_FF_BASE_MODELS_ENABLED in the environment sample, preserving both keys and
their values.
In
`@web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx`:
- Around line 6-16: Update the imports in AssistantChatThread.tsx to use import
type for the type-only symbols AgentBlockingInputSubmission,
AgentDecisionChoice, and FC, while keeping the runtime React hooks and component
imports as regular imports.
- Around line 37-42: Mark every property in AssistantChatThreadProps in
web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsx
(lines 37-42) as readonly. Apply the same change to every property in
AssistantStudioLinkProps in
web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsx
(lines 11-14).
In
`@web/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsx`:
- Line 19: Update the public AssistantStudioLink component declaration to
include an explicit React element return type, while preserving its existing
props and rendering behavior.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 8fb05096-9c34-4502-b053-28b74b4d6fa3
⛔ Files ignored due to path filters (1)
agents/nemo-studio-assistant/uv.lockis excluded by!**/*.lock
📒 Files selected for processing (148)
agents/nemo-studio-assistant-spec/AGENT-SPEC.mdagents/nemo-studio-assistant-spec/agent.yamlagents/nemo-studio-assistant-spec/skills/auditor/SKILL.mdagents/nemo-studio-assistant-spec/skills/benchmark-execution/SKILL.mdagents/nemo-studio-assistant-spec/skills/entities/SKILL.mdagents/nemo-studio-assistant-spec/skills/evaluator/SKILL.mdagents/nemo-studio-assistant-spec/skills/files/SKILL.mdagents/nemo-studio-assistant-spec/skills/guardrails/SKILL.mdagents/nemo-studio-assistant-spec/skills/inference/SKILL.mdagents/nemo-studio-assistant-spec/skills/secrets/SKILL.mdagents/nemo-studio-assistant-spec/skills/workspace/SKILL.mdagents/nemo-studio-assistant/.dockerignoreagents/nemo-studio-assistant/Dockerfile.fabric-localagents/nemo-studio-assistant/agent.yamlagents/nemo-studio-assistant/constraints.fabric-local.txtagents/nemo-studio-assistant/pyproject.tomlagents/nemo-studio-assistant/skills/auditor/SKILL.mdagents/nemo-studio-assistant/skills/benchmark-execution/SKILL.mdagents/nemo-studio-assistant/skills/entities/SKILL.mdagents/nemo-studio-assistant/skills/evaluator/SKILL.mdagents/nemo-studio-assistant/skills/files/SKILL.mdagents/nemo-studio-assistant/skills/guardrails/SKILL.mdagents/nemo-studio-assistant/skills/inference/SKILL.mdagents/nemo-studio-assistant/skills/secrets/SKILL.mdagents/nemo-studio-assistant/skills/workspace/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/mcp_server.pyagents/nemo-studio-assistant/src/nemo_studio_assistant/nemo-studio-assistant-eval-data.jsonagents/nemo-studio-assistant/src/nemo_studio_assistant/register.pyagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/.gitkeepagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/auditor/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/benchmark-execution/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/entities/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/evaluator/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/files/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/guardrails/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/inference/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/secrets/SKILL.mdagents/nemo-studio-assistant/src/nemo_studio_assistant/skills/workspace/SKILL.mdagents/nemo-studio-assistant/tests/smoke_test.mdagents/nemo-studio-assistant/tests/test_nemo_studio_assistant.pyagents/nemo-studio-assistant/wheelhouse/nemo_platform-0.3.0.post217.dev0+b6f22880a-py3-none-any.whlagents/nemo-studio-copilot/tests/smoke_test.mddocs/about/release-notes/current-release.mdxpackages/nmp_platform/config/local.yamlpyproject.tomlpytest.iniservices/studio/src/nmp/studio/assistant.pyservices/studio/src/nmp/studio/assistant_artifacts.pyservices/studio/src/nmp/studio/assistant_mcp_tools.pyservices/studio/src/nmp/studio/assistant_skills.pyservices/studio/src/nmp/studio/entities.pyservices/studio/src/nmp/studio/env_mappings.pyservices/studio/src/nmp/studio/service.pyservices/studio/src/nmp/studio/studio_links.pyservices/studio/tests/unit/test_assistant.pyservices/studio/tests/unit/test_service.pyweb/packages/studio/env/.env.dev.local.sampleweb/packages/studio/env/.env.fastapiweb/packages/studio/src/components/CustomizeModelModal/constants.tsweb/packages/studio/src/components/ExperimentCreateModal/index.tsxweb/packages/studio/src/components/Layouts/GlobalNav/index.test.tsxweb/packages/studio/src/components/Layouts/GlobalNav/index.tsxweb/packages/studio/src/components/dataViews/EvaluationSessionsDataView/Empty.tsxweb/packages/studio/src/components/dataViews/ExperimentDataView/Empty.tsxweb/packages/studio/src/constants/environment.tsweb/packages/studio/src/constants/featureFlags/featureFlags.tsweb/packages/studio/src/constants/routes.tsweb/packages/studio/src/mocks/studio-ui/chip/constants.tsweb/packages/studio/src/mocks/studio-ui/chip/tools.jsonweb/packages/studio/src/routes/DashboardLandingRoute/SkillActionSection.tsxweb/packages/studio/src/routes/DashboardLandingRoute/index.test.tsxweb/packages/studio/src/routes/DashboardLandingRoute/index.tsxweb/packages/studio/src/routes/DashboardLandingRoute/skillActionSuggestions.tsweb/packages/studio/src/routes/DashboardLandingRoute/skillActionTemplates.test.tsweb/packages/studio/src/routes/DashboardLandingRoute/skillDisplayName.test.tsweb/packages/studio/src/routes/DashboardLandingRoute/skillDisplayName.tsweb/packages/studio/src/routes/PageLayout/index.tsxweb/packages/studio/src/routes/RootRedirect/index.test.tsxweb/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsxweb/packages/studio/src/routes/agents/AgentDeploymentsListRoute/CreateDeploymentModal/index.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantChatThread.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantHistoryPanel.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantHistoryPanel.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantLayout.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLink.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantStudioLinkTarget.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantToolCallPart.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantToolCallPart.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantTopBarChat.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/AssistantTopBarChat.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/BlockingInputComposer.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/BlockingInputComposer.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/ChatThreadErrorBoundary.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/ChatThreadErrorBoundary.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/JobProgressToolCall.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/JobProgressToolCall.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/activeSessionStorage.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/api.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/api.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/artifacts.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/artifacts.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/blockingInputRequest.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/context/AssistantChatProvider.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/context/AssistantChatProvider.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/context/useAssistantChatContext.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/ArtifactSections.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/AssistantArtifactsPane.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/FloatingPanel.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/HistoryPanelContents.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/HistoryPanelSkeletons.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/HistorySessionButton.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/SkillCard.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/SkillsPanelContents.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/helpers.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/helpers.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/historyPanel/types.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/index.test.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/index.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/jobProgressConsts.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/stream.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/stream.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/studioUiNavigationSuggestions.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/studioUiNavigationSuggestions.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/toolCall/CollapsedThinkingToolCall.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/toolCall/FileChangeToolCallCard.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/toolCall/SubtleToolCallRow.tsxweb/packages/studio/src/routes/agents/AssistantChatRoute/toolCall/constants.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/toolCall/helpers.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/toolCall/types.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/toolParts.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/toolParts.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/types.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/useAssistantChatRuntime.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/useAssistantChatRuntime.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/useCustomAssistantChatRuntime.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/useCustomAssistantChatRuntime.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/util.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/util.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/utils/jobProgress.test.tsweb/packages/studio/src/routes/agents/AssistantChatRoute/utils/jobProgress.tsweb/packages/studio/src/routes/agents/CopilotChatRoute/context/useCopilotChatContext.tsweb/packages/studio/src/routes/agents/CopilotChatRoute/types.tsweb/packages/studio/src/routes/groups/dashboardRoutes.tsxweb/packages/studio/src/routes/index.test.tsxweb/packages/studio/src/routes/utils.tsweb/packages/studio/src/util/localStorage.ts
💤 Files with no reviewable changes (4)
- agents/nemo-studio-assistant/.dockerignore
- agents/nemo-studio-copilot/tests/smoke_test.md
- web/packages/studio/src/routes/agents/CopilotChatRoute/context/useCopilotChatContext.ts
- web/packages/studio/src/routes/agents/CopilotChatRoute/types.ts
🛑 Comments failed to post (5)
agents/nemo-studio-assistant-spec/skills/auditor/SKILL.md (1)
7-10: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/usr/bin/env bash set -euo pipefail rg -n -C 3 \ 'audit\.(targets|configs)|workspace=' \ agents/nemo-studio-assistant-spec \ agents/nemo-studio-assistant \ services/studioRepository: NVIDIA-NeMo/nemo-platform
Length of output: 50381
🏁 Script executed:
#!/usr/bin/env bash set -euo pipefail printf '%s\n' '--- audit references ---' rg -n -C 4 'audit\.(targets|configs)|class .*Audit|Audit(Target|Config)|audit' \ --glob '!**/SKILL.md' \ --glob '!**/node_modules/**' \ --glob '!**/dist/**' \ . | head -n 1200 printf '%s\n' '--- likely SDK/resource definitions ---' rg -n -C 3 'resource(s)?=|workspace.*required|workspace.*scope|workspace' \ --glob '*.py' --glob '*.ts' --glob '*.tsx' \ agents services libs packages 2>/dev/null | rg -n -C 2 'audit|resource|workspace' | head -n 1200Repository: NVIDIA-NeMo/nemo-platform
Length of output: 50384
🏁 Script executed:
#!/usr/bin/env bash set -euo pipefail for f in \ plugins/nemo-auditor/src/nemo_auditor/sdk_resources/_parent.py \ plugins/nemo-auditor/src/nemo_auditor/sdk_resources/targets.py \ plugins/nemo-auditor/src/nemo_auditor/sdk_resources/configs.py \ plugins/nemo-auditor/src/nemo_auditor/entities.py \ plugins/nemo-auditor/src/nemo_auditor/api/v2/targets.py \ plugins/nemo-auditor/src/nemo_auditor/api/v2/configs.py do if [ -f "$f" ]; then printf '\n--- %s ---\n' "$f" wc -l "$f" rg -n -C 2 'workspace|/v2/workspaces|def (create|list|get|retrieve|update|delete)|class Audit' "$f" fi done printf '\n--- audit SDK registration and generic dispatch ---\n' rg -n -C 4 'auditor|audit\.targets|audit\.configs|resource.*audit|targets|configs' \ sdk agents/nemo-studio-assistant/src agents/nemo-studio-assistant/tests \ --glob '*.py' --glob '*.ts' 2>/dev/null | head -n 1600Repository: NVIDIA-NeMo/nemo-platform
Length of output: 50382
🏁 Script executed:
#!/usr/bin/env bash set -euo pipefail printf '%s\n' '--- nemo_api dispatch ---' sed -n '220,390p' agents/nemo-studio-assistant/src/nemo_studio_assistant/register.py printf '%s\n' '--- auditor client/resource registration ---' rg -n -C 5 'class .*Auditor|Auditor.*Resource|targets|configs|auditor' \ plugins/nemo-auditor/src \ sdk/python/nemo-platform/src \ --glob '*.py' | head -n 1400Repository: NVIDIA-NeMo/nemo-platform
Length of output: 50382
Pass the active workspace to every auditor CRUD call.
The auditor SDK requires
workspaceforaudit.targetsandaudit.configs. Addworkspace="<active request workspace>"to everycreate,list,retrieve,update, anddeletecall.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@agents/nemo-studio-assistant-spec/skills/auditor/SKILL.md` around lines 7 - 10, Update the auditor CRUD guidance for nemo_api audit.targets and audit.configs so every create, list, retrieve, update, and delete call passes workspace set to the active request workspace. Ensure both target and config operations consistently include this workspace argument.agents/nemo-studio-assistant/skills/auditor/SKILL.md (1)
5-5: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Add the top-level headings required by markdownlint.
agents/nemo-studio-assistant/skills/auditor/SKILL.md#L5-L5: ChangeAuditor tasksto# Auditor tasks.agents/nemo-studio-assistant/skills/entities/SKILL.md#L5-L5: ChangeEntity tasksto# Entity tasks.🧰 Tools
🪛 markdownlint-cli2 (0.23.2)
[warning] 5-5: First line in a file should be a top-level heading
(MD041, first-line-heading, first-line-h1)
📍 Affects 2 files
agents/nemo-studio-assistant/skills/auditor/SKILL.md#L5-L5(this comment)agents/nemo-studio-assistant/skills/entities/SKILL.md#L5-L5🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@agents/nemo-studio-assistant/skills/auditor/SKILL.md` at line 5, Update the top-level headings in agents/nemo-studio-assistant/skills/auditor/SKILL.md:5-5 and agents/nemo-studio-assistant/skills/entities/SKILL.md:5-5 by prefixing “Auditor tasks” and “Entity tasks” with a level-one Markdown heading marker, respectively.Source: Linters/SAST tools
agents/nemo-studio-assistant/skills/files/SKILL.md (1)
19-29: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Define delete verification explicitly.
The read-back rule names description, content/checksum, and ownership, but a deleted file or fileset has no content to confirm. Steps 6-7 therefore have no explicit success condition. Require a scoped read-back that confirms absence before continuing to step 8 or reporting success; otherwise an unknown delete can leave temporary resources behind.
Also applies to: 42-52
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@agents/nemo-studio-assistant/skills/files/SKILL.md` around lines 19 - 29, Update the delete workflow in the documented mutation steps to require a scoped read-back confirming that the targeted file or fileset is absent before proceeding to step 8 or reporting success. Keep the existing identity scoping, and treat any result that does not confirm absence as an unknown commit state: stop without continuing or cleanup assumptions.agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/inference/SKILL.md (1)
5-5: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Use a Markdown H1 for each skill task title.
The three skill files trigger the same MD041 warning because the title after front matter is plain text.
agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/inference/SKILL.md#L5-L5: ChangeInference provider tasksto# Inference provider tasks.agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/secrets/SKILL.md#L5-L5: ChangeSecret tasksto# Secret tasks.agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/workspace/SKILL.md#L5-L5: ChangeWorkspace tasksto# Workspace tasks.🧰 Tools
🪛 markdownlint-cli2 (0.23.2)
[warning] 5-5: First line in a file should be a top-level heading
(MD041, first-line-heading, first-line-h1)
📍 Affects 3 files
agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/inference/SKILL.md#L5-L5(this comment)agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/secrets/SKILL.md#L5-L5agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/workspace/SKILL.md#L5-L5🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/inference/SKILL.md` at line 5, Update the task titles to Markdown H1 headings: in agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/inference/SKILL.md:5 change “Inference provider tasks”; in agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/secrets/SKILL.md:5 change “Secret tasks”; and in agents/nemo-studio-assistant/src/nemo_studio_assistant/skills/workspace/SKILL.md:5 change “Workspace tasks”.Source: Linters/SAST tools
web/packages/studio/src/routes/agents/AssistantChatRoute/studioUiNavigationSuggestions.ts (1)
210-217: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Exclude code-oriented deploy prompts.
Deploy an agent componentmatches line 216 and opens the Agents suggestion. Apply the same suffix exclusion used for build and create. Add this prompt to the ordinary-prompt test.Proposed fix
- /\bdeploy (an? )?agent\b/i, + /\bdeploy (an? )?agent\b(?!\s+(class|component|helper|test|function|module))\b/i,📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements./\bmanage agents?\b/i, /\bview agents?\b/i, /\b(build|create) (an? )?agent\b(?!\s+(class|component|helper|test|function|module))\b/i, /\bcreate example agent\b/i, /\bclone (an? )?agent\b/i, /\bchat with (an? )?agent\b/i, /\bdeploy (an? )?agent\b(?!\s+(class|component|helper|test|function|module))\b/i, /\btry (a )?deployed agent\b/i,🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/agents/AssistantChatRoute/studioUiNavigationSuggestions.ts` around lines 210 - 217, Update the deploy-agent pattern in the navigation suggestions to exclude prompts whose agent reference is followed by code-oriented terms such as class, component, helper, test, function, or module, matching the exclusion used by the build/create pattern. Add “Deploy an agent component” to the ordinary-prompt test cases.
Summary by CodeRabbit
New Features
Improvements
Documentation & Testing