Skip to content

Commit 314bf1a

Browse files
fix: fixes #128 chat without non-local repo. (#131)
1 parent 47cc8eb commit 314bf1a

6 files changed

Lines changed: 111 additions & 2 deletions

File tree

playwright/github-byot-ai.spec.ts

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
} from './helpers/app-test-helpers.js'
1616
import {
1717
getAllWorkspaceRecords,
18+
openStoredWorkspaceContextById,
1819
seedLocalWorkspaceContexts,
1920
} from './github-pr-drawer/github-pr-drawer.helpers.js'
2021

@@ -400,6 +401,79 @@ test('Local workspace can be renamed from Workspaces drawer', async ({ page }) =
400401
)
401402
})
402403

404+
test('chat stays usable after opening a Local workspace with PAT connected', async ({
405+
page,
406+
}) => {
407+
const localWorkspaceId = 'local_chat_issue_128'
408+
let streamRequestBody: ChatRequestBody | undefined
409+
410+
await page.route('https://models.github.ai/inference/chat/completions', async route => {
411+
streamRequestBody = route.request().postDataJSON() as ChatRequestBody
412+
413+
await route.fulfill({
414+
status: 200,
415+
contentType: 'text/event-stream',
416+
body: [
417+
'data: {"choices":[{"delta":{"content":"Local workspace chat works"}}]}',
418+
'',
419+
'data: [DONE]',
420+
'',
421+
].join('\n'),
422+
})
423+
})
424+
425+
await waitForAppReady(page)
426+
427+
await seedLocalWorkspaceContexts(page, [
428+
{
429+
id: localWorkspaceId,
430+
repo: '',
431+
workspaceScope: 'local',
432+
head: 'feat/local-chat-issue-128',
433+
prTitle: 'Issue 128 local workspace',
434+
prContextState: 'inactive',
435+
tabs: [
436+
{
437+
id: 'component',
438+
path: 'src/component.tsx',
439+
language: 'tsx',
440+
role: 'component',
441+
content: 'export const App = () => <main>local chat issue 128</main>',
442+
order: 0,
443+
source: 'workspace',
444+
dirty: false,
445+
},
446+
],
447+
activeTabId: 'component',
448+
},
449+
])
450+
451+
await connectByotWithSingleRepo(page)
452+
await openStoredWorkspaceContextById(page, localWorkspaceId, {
453+
repositoryFilter: '__local__',
454+
})
455+
await ensureWorkspacesDrawerClosed(page)
456+
457+
await ensureAiChatDrawerOpen(page)
458+
459+
await page.getByLabel('Ask AI assistant').fill('Confirm local workspace chat context.')
460+
await page.getByRole('button', { name: 'Send' }).click()
461+
462+
await expect(page.getByText('Local workspace chat works')).toBeVisible()
463+
await expect(
464+
page.getByText('Select a writable repository before starting chat.', { exact: true }),
465+
).toHaveCount(0)
466+
467+
const repositorySystemMessage = streamRequestBody?.messages?.find(
468+
(message: ChatRequestMessage) =>
469+
message.role === 'system' &&
470+
message.content?.includes('Selected repository context'),
471+
)
472+
expect(repositorySystemMessage?.content).toContain(
473+
'Repository: knightedcodemonkey/develop',
474+
)
475+
})
476+
403477
test('BYOT controls render with default app entry', async ({ page }) => {
404478
await waitForAppReady(page, appEntryPath)
405479

src/app.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,25 @@ const getCurrentSelectedRepositoryFullName = () => {
607607
return ''
608608
}
609609

610+
const getActiveWorkspaceDisplayLabel = workspace => {
611+
const workspaceIdFromArg = toNonEmptyWorkspaceText(workspace?.id)
612+
const activeWorkspaceId = toNonEmptyWorkspaceText(activeWorkspaceRecordId)
613+
if (
614+
workspaceIdFromArg &&
615+
activeWorkspaceId &&
616+
workspaceIdFromArg !== activeWorkspaceId
617+
) {
618+
return ''
619+
}
620+
621+
return (
622+
toNonEmptyWorkspaceText(activeWorkspacePersistedPrTitle) ||
623+
toNonEmptyWorkspaceText(activeWorkspacePersistedHeadBranch) ||
624+
toNonEmptyWorkspaceText(githubPrTitle?.value) ||
625+
toNonEmptyWorkspaceText(githubPrHeadBranch?.value)
626+
)
627+
}
628+
610629
workspaceContextStatusController = createWorkspaceContextStatusController({
611630
statusNode: workspaceContextStatus,
612631
toNonEmptyWorkspaceText,
@@ -1138,6 +1157,7 @@ const githubWorkflows = createGitHubWorkflowsSetup({
11381157
workspace: {
11391158
workspaceStorage,
11401159
getActiveWorkspaceRecordId: () => activeWorkspaceRecordId,
1160+
getActiveWorkspaceDisplayLabel,
11411161
setActiveWorkspaceRecordId,
11421162
setActiveWorkspaceCreatedAt: value => (activeWorkspaceCreatedAt = value),
11431163
buildWorkspaceRecordSnapshot,

src/modules/app-core/github-workflows-setup.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const createGitHubWorkflowsSetup = ({
2323
setActiveWorkspaceRecordId: workspace.setActiveWorkspaceRecordId,
2424
setActiveWorkspaceCreatedAt: workspace.setActiveWorkspaceCreatedAt,
2525
buildWorkspaceRecordSnapshot: workspace.buildWorkspaceRecordSnapshot,
26+
getActiveWorkspaceDisplayLabel: workspace.getActiveWorkspaceDisplayLabel,
2627
listLocalContextRecords: workspace.listLocalContextRecords,
2728
refreshLocalContextOptions: workspace.refreshLocalContextOptions,
2829
applyWorkspaceRecord: workspace.applyWorkspaceRecord,

src/modules/app-core/github-workflows.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const initializeGitHubWorkflows = ({
5050
workspacesRemove,
5151
workspaceStorage,
5252
getActiveWorkspaceRecordId,
53+
getActiveWorkspaceDisplayLabel,
5354
setActiveWorkspaceRecordId,
5455
setActiveWorkspaceCreatedAt,
5556
buildWorkspaceRecordSnapshot,
@@ -430,6 +431,10 @@ const initializeGitHubWorkflows = ({
430431
openButton: workspacesOpen,
431432
renameButton: workspacesRename,
432433
removeButton: workspacesRemove,
434+
getActiveWorkspaceDisplayLabel: workspace =>
435+
typeof getActiveWorkspaceDisplayLabel === 'function'
436+
? toSafeWorkspaceText(getActiveWorkspaceDisplayLabel(workspace))
437+
: '',
433438
getRepositoryFilterOptions: () =>
434439
getCurrentWritableRepositories().map(repository => ({
435440
value: repository.fullName,

src/modules/app-core/workspace-record-applied-handler.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ const createWorkspaceRecordAppliedHandler = ({
2121
byotControls?.setSelectedRepository(nextWorkspaceRepositoryFullName)
2222
} else {
2323
setWorkspaceRepositoryFullName('')
24-
byotControls?.clearSelectedRepositoryPreference?.()
2524
}
2625

2726
const state =

src/modules/workspace/workspaces-drawer/drawer.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export const createWorkspacesDrawer = ({
5454
renameButton,
5555
removeButton,
5656
getDrawerSide,
57+
getActiveWorkspaceDisplayLabel,
5758
getRepositoryFilterOptions,
5859
getSelectedRepositoryFilter,
5960
onRepositoryFilterChange,
@@ -242,10 +243,19 @@ export const createWorkspacesDrawer = ({
242243
placeholder.selected = !filteredEntries.some(entry => entry.id === selectedId)
243244
selectInput.append(placeholder)
244245

246+
const activeWorkspaceId =
247+
typeof getActiveWorkspaceId === 'function' ? toSafeText(getActiveWorkspaceId()) : ''
248+
245249
for (const entry of filteredEntries) {
246250
const option = document.createElement('option')
247251
option.value = toSafeText(entry.id)
248-
option.textContent = toWorkspaceLabel(entry)
252+
const activeWorkspaceDisplayLabel =
253+
option.value &&
254+
option.value === activeWorkspaceId &&
255+
typeof getActiveWorkspaceDisplayLabel === 'function'
256+
? toSafeText(getActiveWorkspaceDisplayLabel(entry))
257+
: ''
258+
option.textContent = activeWorkspaceDisplayLabel || toWorkspaceLabel(entry)
249259
option.selected = option.value === selectedId
250260
selectInput.append(option)
251261
}

0 commit comments

Comments
 (0)