Agentic Development Environment based on OpenCode AI agent
This report summarizes scanner evidence for openchamber/openchamber, a TypeScript project with 12,406 GitHub stars. SynthScan examined 1,285,059 lines of code across 5452 source files, recording 1024 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 1.0 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 936 finding(s).
Are imports declared and package/API names verified? 50 finding(s).
Are wrappers, guards, and repeated structures necessary? 745 finding(s).
Which changes need focused human review? 1024 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1024 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/oxlint/anti-slop/shared/reflect-method.ts | 24 | export function isGlobalReflectMethodCall( | CODE |
| LOW | tools/oxlint/anti-slop/shared/dictionary-types.ts | 142 | function isEffectivelyEmptyTypeLiteral(type: ESTree.TSTypeLiteral): boolean { | CODE |
| LOW | tools/oxlint/anti-slop/shared/dictionary-types.ts | 146 | function isEffectivelyEmptyInterface( | CODE |
| LOW | tools/oxlint/anti-slop/shared/dictionary-types.ts | 158 | function resolvedSubstitutionArgument( | CODE |
| LOW | tools/oxlint/anti-slop/shared/dictionary-types.ts | 307 | export function classifyUnsafeDictionaryValue( | CODE |
| LOW | tools/oxlint/anti-slop/shared/dictionary-types.ts | 467 | export function isPopulatedObjectExpression(expression: ESTree.Expression): boolean { | CODE |
| LOW | tools/oxlint/anti-slop/shared/dictionary-types.ts | 480 | export function isKnownEvidenceExpression(expression: ESTree.Expression): boolean { | CODE |
| LOW | …ols/oxlint/anti-slop/shared/lexical-type-parameters.ts | 14 | function collectInferTypeParameterNames( | CODE |
| LOW | …ols/oxlint/anti-slop/shared/lexical-type-parameters.ts | 35 | export function lexicalTypeParameterNames( | CODE |
| LOW | tools/oxlint/anti-slop/rules/no-widen-then-assert.ts | 18 | function unwrapExpressionParentheses(expression: ESTree.Expression): ESTree.Expression { | CODE |
| LOW | tools/oxlint/anti-slop/rules/no-widen-then-assert.ts | 143 | function isDefinitelyNarrowerRecordType(type: ESTree.TSType): boolean { | CODE |
| LOW | tools/oxlint/anti-slop/rules/no-widen-then-assert.ts | 171 | function resolvedVariableForIdentifier( | CODE |
| LOW | …s/oxlint/anti-slop/rules/no-chained-type-assertions.ts | 6 | function isTypeAssertionExpression(node: ESTree.Node): node is TypeAssertionExpression { | CODE |
| LOW | …s/oxlint/anti-slop/rules/no-chained-type-assertions.ts | 10 | function unwrapParenthesizedExpression(expression: ESTree.Expression): ESTree.Expression { | CODE |
| LOW | …s/oxlint/anti-slop/rules/no-chained-type-assertions.ts | 27 | function isOutermostAssertionInChain(node: TypeAssertionExpression): boolean { | CODE |
| LOW | …s/oxlint/anti-slop/rules/no-chained-type-assertions.ts | 39 | function isForbiddenAssertionChain(node: TypeAssertionExpression): boolean { | CODE |
| LOW | tools/oxlint/anti-slop/rules/no-known-value-widening.ts | 125 | function isDictionaryAccumulatorTarget(destination: WideningTarget): boolean { | CODE |
| LOW | …/anti-slop/rules/no-conditional-empty-object-spread.ts | 16 | function isConditionalEmptyObjectSpread(node: ESTree.Expression): boolean { | CODE |
| LOW | …ls/oxlint/anti-slop/rules/no-unsafe-dictionary-type.ts | 60 | function isInsideTypeAliasDeclaration(node: ESTree.Node): boolean { | CODE |
| LOW | …ols/oxlint/anti-slop/rules/no-shape-in-symbol-names.ts | 6 | function containsForbiddenSymbolName(name: string): boolean { | CODE |
| LOW | packages/ui/src/stores/waitForOpenCodeConnection.ts | 24 | export async function waitForOpenCodeConnection(delayMs?: number): Promise<void> { | CODE |
| LOW | packages/ui/src/stores/useUpdateStore.ts | 212 | export async function checkConnectedServerForUpdates(): Promise<UpdateInfo> { | CODE |
| LOW | packages/ui/src/stores/useUIStore.ts | 85 | function normalizeFileEditorKeymap(value: unknown): FileEditorKeymap { | CODE |
| LOW | packages/ui/src/stores/useSkillsStore.ts | 998 | export async function refreshSkillsAfterOpenCodeRestart(options?: { message?: string; delayMs?: number }) { | CODE |
| LOW | packages/ui/src/stores/catalogRefresh.ts | 177 | export async function refreshStoresForCatalogKind( | CODE |
| LOW | packages/ui/src/stores/useAgentsStore.ts | 965 | export async function refreshAfterOpenCodeRestart(options?: { | CODE |
| LOW | packages/ui/src/stores/useAgentsStore.ts | 974 | export async function reloadOpenCodeConfiguration(options?: { | CODE |
| LOW | packages/ui/src/components/ui/dropdown-navigation.ts | 27 | export function handleDropdownNavigationKey( | CODE |
| LOW | packages/ui/src/components/ui/providerLogoFallback.ts | 5 | export function getProviderLogoFallbackIcon(providerId: string | null | undefined): IconName | null { | CODE |
| LOW | …/src/components/comments/useLineNumberDragSelection.ts | 63 | export function useLineNumberDragSelection({ | CODE |
| LOW | …i/src/components/comments/CodeMirrorCommentWidgets.tsx | 29 | export function buildCodeMirrorCommentWidgets(options: CodeMirrorCommentWidgetsOptions): BlockWidgetDef[] { | CODE |
| LOW | …/src/components/comments/PierreDiffCommentOverlays.tsx | 45 | export function PierreDiffCommentOverlays(props: PierreDiffCommentOverlaysProps) { | CODE |
| LOW | …/components/sections/providers/custom-provider-form.ts | 355 | export function isCustomOpenAICompatibleProvider(provider: ProviderLikeForCustomForm): boolean { | CODE |
| LOW | …/components/sections/providers/custom-provider-form.ts | 399 | export function isConfigDefinedCustomProvider( | CODE |
| LOW | …/components/sections/providers/custom-provider-form.ts | 416 | export function resolveProviderConfigScope( | CODE |
| LOW | …/components/sections/providers/custom-provider-form.ts | 428 | export function providerToCustomFormState(provider: ProviderLikeForCustomForm): CustomProviderFormState { | CODE |
| LOW | …/components/sections/providers/custom-provider-form.ts | 740 | function buildCustomProviderConfig(input: { | CODE |
| LOW | …/components/sections/providers/custom-provider-form.ts | 766 | export function buildIntegrationKeyRequest(plan: CustomProviderPersistPlan): { | CODE |
| LOW | …/components/sections/providers/custom-provider-form.ts | 784 | export function buildProviderUpsertRequest( | CODE |
| LOW | …nents/sections/openchamber/ShortcutRecordingDialog.tsx | 145 | export function settleShortcutRecordingState(state: ShortcutRecordingState): ShortcutRecordingState { | CODE |
| LOW | …nents/sections/openchamber/ShortcutRecordingDialog.tsx | 150 | export function updateShortcutRecordingState( | CODE |
| LOW | packages/ui/src/components/update/openCodeUpgrade.ts | 37 | export async function fetchOpenCodeUpgradeStatus(): Promise<OpenCodeUpgradeStatus> { | CODE |
| LOW | packages/ui/src/components/chat/composerHighlight.ts | 494 | export function mentionRangesToHighlightRanges(mentions: MentionRange[]): HighlightRange[] { | CODE |
| LOW | packages/ui/src/components/chat/formTextareaSizing.ts | 7 | export function getFormCustomTextareaHeight(contentHeight: number): number { | CODE |
| LOW | packages/ui/src/components/chat/formSerializers.ts | 63 | export function serializeFormAnswerAsMarkdown(form: FormRequest, answer: Record<string, FormValue>): string { | CODE |
| LOW | packages/ui/src/components/chat/inputHistory.ts | 27 | export function buildChatInputHistorySubmissions({ | CODE |
| LOW | packages/ui/src/components/chat/inputHistory.ts | 47 | function materializeHistoryAttachment(attachment: InputHistoryAttachment): AttachedFile | null { | CODE |
| LOW | packages/ui/src/components/chat/inputHistory.ts | 79 | export function mapInputHistoryEntriesToValues( | CODE |
| LOW | packages/ui/src/components/chat/inputHistory.ts | 112 | export function buildInputHistoryNavigatorIdentity( | CODE |
| LOW | …/src/components/chat/markdown/streamdownHighlighter.ts | 14 | export function createStreamdownHighlighter() { | CODE |
| LOW | …components/chat/markdown/remarkRepositoryReferences.ts | 69 | export function remarkRepositoryReferences(context: RepositoryLinkContext) { | CODE |
| LOW | …s/ui/src/components/chat/markdown/streamdownPlugins.ts | 125 | export function getMarkdownProcessingOptions(allowRawHtml: boolean, isVSCode: boolean, singleTilde = false): Pick<Stream | CODE |
| LOW | …i/src/components/chat/markdown/rehypeMarkdownPolicy.ts | 102 | export function rehypeRestoreMarkdownLinks() { | CODE |
| LOW | packages/ui/src/components/chat/composer/text.ts | 58 | export function withInlineInsertionBoundaries( | CODE |
| LOW | packages/ui/src/components/chat/composer/text.ts | 101 | export function shouldWrapSelectionAsLink(url: string, selected: string): boolean { | CODE |
| LOW | …onents/chat/composer/ui/PermissionAutoAcceptButton.tsx | 39 | export const PermissionAutoAcceptButton = React.memo(function PermissionAutoAcceptButton(props: PermissionAutoAcceptButt | CODE |
| LOW | …nts/chat/composer/ui/useAutocompleteSelectionScroll.ts | 8 | export function useAutocompleteSelectionScroll( | CODE |
| LOW | …c/components/chat/composer/ui/DraftTargetSelectors.tsx | 553 | export function MobileDraftTargetTriggers( | CODE |
| LOW | …mponents/chat/composer/ui/usePlaceholderFitsOneLine.ts | 21 | export function usePlaceholderFitsOneLine( | CODE |
| LOW | …onents/chat/composer/ui/ComposerAutocompletePopups.tsx | 79 | function ComposerAutocompletePopupsView(props: ComposerAutocompletePopupsProps) { | CODE |
| 647 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.yml | 21 | # OPENCHAMBER_UI_PASSWORD="$(openssl rand -base64 24)" docker compose up -d | COMMENT |
| LOW | .agents/skills/triage-prs/scripts/prep.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .agents/skills/triage-prs/scripts/finish.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/test-release-build.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/test-release-build.sh | 21 | # Options: | COMMENT |
| LOW | packages/ui/scripts/build-libghostty-wasm.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packages/ui/src/stores/useGitStore.ts | 341 | for (const [directory, entry] of Object.entries(cache)) { | COMMENT |
| LOW | packages/ui/src/stores/useUIStore.ts | 3561 | COMMENT | |
| LOW | packages/ui/src/stores/useGitStore.repro.test.ts | 121 | expect(branches?.all).toContain('hotfix'); | COMMENT |
| LOW | packages/ui/src/stores/useGitStore.repro.test.ts | 141 | // ChatInput auto-fetches if branches aren't available. | COMMENT |
| LOW | packages/ui/src/stores/utils/requestsInFlight.ts | 1 | // Tracks every fetch() request as "in flight" from call to promise settle, | COMMENT |
| LOW | packages/ui/src/styles/katex-css.ts | 1 | // KaTeX's stylesheet must be imported through JavaScript, not through the CSS | COMMENT |
| LOW | packages/ui/src/components/ui/number-input.test.tsx | 541 | // updating committedValueRef, so a typed value followed by a stepper | COMMENT |
| LOW | packages/ui/src/components/chat/ChatContainer.tsx | 441 | const endFadeStyle: React.CSSProperties & Record<'--chat-status-row-clearance', string> = { | COMMENT |
| LOW | packages/ui/src/components/chat/ChatContainer.tsx | 1681 | ); | COMMENT |
| LOW | packages/ui/src/components/chat/fileReferenceParser.ts | 161 | return null; | COMMENT |
| LOW | packages/ui/src/components/chat/MessageList.tsx | 41 | COMMENT | |
| LOW | packages/ui/src/components/chat/MessageList.tsx | 701 | keyExtractor={timelineKeyExtractor} | COMMENT |
| LOW | …c/components/chat/markdown/incrementalCodeHighlight.ts | 1 | // Incremental highlighting for a code block that grows while it streams. | COMMENT |
| LOW | …ges/ui/src/components/chat/markdown/markdown-worker.ts | 21 | // The per-request timeout exists because TextMate grammars can enter catastrophic | COMMENT |
| LOW | …s/ui/src/components/chat/markdown/selectionMarkdown.ts | 1 | import { MESSAGE_IMAGE_EXPORT_EXCLUDE_ATTRIBUTE } from '../message/imageExport'; | COMMENT |
| LOW | …components/chat/composer/state/useMobileViewportPin.ts | 21 | COMMENT | |
| LOW | …mponents/chat/composer/state/useMobileComposerShell.ts | 121 | // is a live condition rather than a mount-time one. Detaching does NOT | COMMENT |
| LOW | …mponents/chat/composer/state/useMobileComposerShell.ts | 161 | // Timing tuned on device, against WKWebView pausing frame | COMMENT |
| LOW | …ckages/ui/src/components/chat/composer/editor/theme.ts | 21 | '.cm-content': { | COMMENT |
| LOW | …ckages/ui/src/components/chat/composer/editor/theme.ts | 61 | overflowX: 'hidden', | COMMENT |
| LOW | …ckages/ui/src/components/chat/composer/editor/theme.ts | 141 | // Native selection can paint both the background and its paired text. | COMMENT |
| LOW | …src/components/chat/composer/editor/ComposerEditor.tsx | 321 | history(), | COMMENT |
| LOW | …src/components/chat/composer/editor/ComposerEditor.tsx | 441 | }; | COMMENT |
| LOW | …src/components/chat/composer/editor/ComposerEditor.tsx | 461 | // matching what a plain textarea did when its value was replaced. | COMMENT |
| LOW | …ges/ui/src/components/chat/message/parts/htmlRender.ts | 141 | // a fainter error tint, mixed into transparent in dark themes like | COMMENT |
| LOW | …ges/ui/src/components/chat/message/parts/htmlRender.ts | 181 | // in the page (see BASE_CSS), the same as the chat's own marks. | COMMENT |
| LOW | …ges/ui/src/components/chat/message/parts/htmlRender.ts | 201 | // Sized in the app's rem like its Button (h-8 px-3 rounded-md, the UI | COMMENT |
| LOW | …ges/ui/src/components/chat/message/parts/htmlRender.ts | 281 | // stop a vertical swipe from reaching the chat. | COMMENT |
| LOW | …ges/ui/src/components/chat/message/parts/htmlRender.ts | 341 | // height: the root's box when the page is shorter than the frame, its scroll | COMMENT |
| LOW | …ges/ui/src/components/chat/message/parts/htmlRender.ts | 361 | // page's width without resizing the root, so the tooltip check below also | COMMENT |
| LOW | …ges/ui/src/components/chat/message/parts/htmlRender.ts | 381 | // fields, and the clipboard, select-all and undo chords. The deciding listener | COMMENT |
| LOW | …ges/ui/src/components/chat/message/parts/htmlRender.ts | 401 | // the frame loads; the page re-finds each by its text, as the chat does for | COMMENT |
| LOW | …/ui/src/components/chat/message/parts/taskToolModel.ts | 101 | // OpenCode wraps a completed task result in an envelope: | COMMENT |
| LOW | …components/chat/work-status/useWorkStatusVisibility.ts | 141 | const panelEnabled = useUIStore((state) => state.workStatusPanelEnabled); | COMMENT |
| LOW | …mponents/chat/work-status/WorkStatusContextSection.tsx | 61 | const availableWorktreesByProject = useSessionUIStore((state) => state.availableWorktreesByProject); | COMMENT |
| LOW | …ui/src/components/chat/work-status/WorkStatusPanel.tsx | 81 | // Restoring the offset has to happen the moment the scroller attaches, and | COMMENT |
| LOW | …ui/src/components/chat/work-status/WorkStatusPanel.tsx | 201 | // it reads as a dropdown from the header button. As a flex child it | COMMENT |
| LOW | packages/ui/src/components/chat/lib/streamTextCommit.ts | 1 | // Block-level streaming reveal. | COMMENT |
| LOW | …src/components/chat/lib/scroll/timelineScrollIntent.ts | 1 | // Gesture classification for the chat timeline's follow opt-out. | COMMENT |
| LOW | …/components/chat/lib/scroll/timelineScrollAnchoring.ts | 1 | // Scroll geometry for the chat timeline. | COMMENT |
| LOW | …/src/components/chat/lib/scroll/keyboardFollowGlide.ts | 81 | // delta for the leg in flight. | COMMENT |
| LOW | packages/ui/src/components/layout/ContextPanel.tsx | 501 | // many size changes that cannot matter (every frame of a sidebar animation, | COMMENT |
| LOW | packages/ui/src/components/layout/ContextPanel.tsx | 641 | // The zone follows the pointer exactly: the size is written once per frame, | COMMENT |
| LOW | packages/ui/src/components/layout/ContextPanel.tsx | 1181 | if (!coverChanged && !draggedSize) beginLayoutAnimation(layoutAnimationMs); | COMMENT |
| LOW | packages/ui/src/components/layout/ContextPanel.tsx | 1221 | <aside | COMMENT |
| LOW | …kages/ui/src/components/layout/ContextSurfacePanes.tsx | 341 | const terminalZone = zoneFor('terminal'); | COMMENT |
| LOW | packages/ui/src/components/layout/Header.tsx | 801 | // must be expressed in pixels. The interface font-size setting scales the | COMMENT |
| LOW | packages/ui/src/components/layout/ContextSidebarTab.tsx | 361 | // OpenCode v2 delivers instruction text as its own `system` message | COMMENT |
| LOW | …es/ui/src/components/code/useWorkerHighlightedLines.ts | 1 | import React from 'react'; | COMMENT |
| LOW | packages/ui/src/components/views/DiffView.tsx | 2681 | // reads the latest reader through this ref instead of capturing it. | COMMENT |
| LOW | packages/ui/src/components/views/PlanView.tsx | 721 | if (savedPlanProjectRef && savedPlanId) { | COMMENT |
| LOW | packages/ui/src/components/views/FilesView.tsx | 3561 | const editorFontSize = useUIStore((state) => state.editorFontSize); | COMMENT |
| LOW | …i/src/components/views/walkthrough/WalkthroughView.tsx | 81 | // than half the panel no matter how far the user drags. | COMMENT |
| LOW | …c/components/session/sidebar/sessionSidebarRowModel.ts | 81 | // `depth`: its tree level (1 inside a folder). `mixed`: listed among other | COMMENT |
| 152 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/ui/src/components/sections/mcp/McpPage.tsx | 118 | // ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/components/sections/mcp/McpPage.tsx | 120 | // ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/components/sections/mcp/McpPage.tsx | 249 | // ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/components/sections/mcp/McpPage.tsx | 251 | // ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/components/sections/mcp/McpPage.tsx | 464 | // ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/components/sections/mcp/McpPage.tsx | 466 | // ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/components/sections/mcp/McpPage.tsx | 545 | // ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/components/sections/mcp/McpPage.tsx | 547 | // ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/components/chat/ChatContainer.tsx | 1368 | // ── in-conversation search ────────────────────────────────────────────── | COMMENT |
| MEDIUM | …es/ui/src/components/chat/message/ToolOutputDialog.tsx | 522 | // ── PERF-007: Virtualised sub-components for dialog ────────────────── | COMMENT |
| MEDIUM | …components/chat/message/parts/VirtualizedCodeBlock.tsx | 23 | // ── Types ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …components/chat/message/parts/VirtualizedCodeBlock.tsx | 43 | // ── Component ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …components/chat/message/parts/VirtualizedCodeBlock.tsx | 98 | // ── Virtualised container (extracted so the hook is top-level) ──────── | COMMENT |
| MEDIUM | …components/chat/message/parts/VirtualizedCodeBlock.tsx | 160 | // ── Single row ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/hooks/useChatTimelineScroll.ts | 50 | // ────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/hooks/useChatTimelineScroll.ts | 70 | // ────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/hooks/useChatTimelineScroll.ts | 491 | // ── reading position memory ───────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/hooks/useChatTimelineScroll.ts | 531 | // ── scroll commands ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/hooks/useChatTimelineScroll.ts | 832 | // ── list callbacks ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/hooks/useChatTimelineScroll.ts | 1256 | // ── gesture opt-out ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/hooks/useChatTimelineScroll.ts | 1402 | // ── session lifecycle ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/hooks/useChatTimelineScroll.ts | 1431 | // ── entry pin ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/hooks/useChatTimelineScroll.ts | 1472 | // ── message link in the open session ──────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/hooks/useChatTimelineScroll.ts | 1489 | // ── keyboard follow glide ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/hooks/useChatTimelineScroll.ts | 1507 | // ── pinned end ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/hooks/useChatTimelineScroll.ts | 1674 | // ── active-turn spy ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/lib/runtime-auth.ts | 367 | // ── Proactive URL auth token refresh ────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/lib/runtime-fetch.ts | 65 | // ── Isolated spaces ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/lib/runtime-fetch.ts | 233 | // ── Relay-mode routing ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/lib/codemirror/codeHighlight.ts | 53 | // ── Highlights: incremental, main thread ──────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/lib/codemirror/codeHighlight.ts | 126 | // ── Shiki: whole document in the worker ───────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/src/lib/codemirror/codeHighlight.ts | 208 | // ── Engine choice ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/web/bin/cli-output.js | 24 | // ── Provider icons ────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/web/bin/cli-output.js | 39 | // ── Status-aware log dispatch ─────────────────────────────────── | COMMENT |
| MEDIUM | packages/web/bin/cli-output.js | 68 | // ── TTY detection ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/web/bin/lib/commands-tunnel.js | 955 | // ── Section 1: Ports ────────────────────────────────────── | COMMENT |
| MEDIUM | packages/web/bin/lib/commands-tunnel.js | 995 | // ── Section 2: Provider ───────────────────────────────── | COMMENT |
| MEDIUM | packages/web/bin/lib/commands-tunnel.js | 1033 | // ── Section 3: Modes ──────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | packages/ui/src/lib/shiki/appThemeRegistry.test.ts | 18 | expect(resolved.fg).toBe(theme.colors.syntax.base.foreground.replace(/^(#[\da-f]{6})[\da-f]{2}$/i, '$1')); | CODE |
| CRITICAL | packages/web/server/lib/agent-tool/runtime.test.js | 294 | const actions = knowledge.input.properties.action.oneOf.map((entry) => entry.const); | CODE |
| CRITICAL | packages/web/server/lib/agent-tool/runtime.test.js | 304 | expect(tools.openchamber.input.properties.action.oneOf.map((entry) => entry.const)).not.toContain('knowledge.list'); | CODE |
| CRITICAL | packages/web/server/lib/agent-tool/runtime.test.js | 353 | expect(tool.openchamber.input.properties.action.oneOf.map((entry) => entry.const)).toContain('session.moveToWorktree | CODE |
| CRITICAL | packages/web/server/lib/agent-tool/runtime.test.js | 400 | const controlActions = tool.openchamber.input.properties.action.oneOf.map((entry) => entry.const); | CODE |
| CRITICAL | packages/web/server/lib/agent-tool/runtime.test.js | 401 | const webActions = tool.openchamber_web.input.properties.action.oneOf.map((entry) => entry.const); | CODE |
| CRITICAL | packages/web/server/lib/agent-tool/runtime.test.js | 498 | expect(tools.openchamber_workflow.input.properties.action.oneOf.map((entry) => entry.const)).toEqual([ | CODE |
| CRITICAL | packages/web/server/lib/agent-tool/runtime.test.js | 725 | const scheduleActions = tools.openchamber_schedule.input.properties.action.oneOf.map((entry) => entry.const); | CODE |
| CRITICAL | packages/web/server/lib/agent-tool/runtime.test.js | 727 | expect(tools.openchamber.input.properties.action.oneOf.map((entry) => entry.const).filter((action) => action.startsW | CODE |
| CRITICAL | packages/web/server/lib/github/mutations.js | 262 | || !isProviderString(pr.base.repo.owner.login) || !pr.base.repo.owner.login.trim() | CODE |
| CRITICAL | packages/web/server/lib/git/network-operations.test.js | 3051 | expect(operation.credentialResolver.resolve.mock.calls.map(([input]) => input.credentialId)) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …ckages/ui/src/components/views/branchDiffScope.test.ts | 320 | 'placeholder' | CODE |
| LOW⚡ | …ckages/ui/src/components/views/branchDiffScope.test.ts | 328 | expect(captured.entries?.get(pathsKey)).toBe('placeholder'); | CODE |
| LOW⚡ | …ckages/ui/src/components/views/branchDiffScope.test.ts | 334 | expect(captured.entries?.get(pathsKey)).toBe('placeholder'); | CODE |
| LOW | …ckages/ui/src/components/views/branchDiffScope.test.ts | 371 | captured.entries = useRangeKeyedCache<string>(rangeKey, pathsKey, currentFetcher, 'placeholder'); | CODE |
| LOW | …ckages/ui/src/components/views/branchDiffScope.test.ts | 418 | 'placeholder' | CODE |
| LOW | …ckages/ui/src/components/views/branchDiffScope.test.ts | 426 | expect(captured.entries?.get('src/first.ts')).toBe('placeholder'); | CODE |
| LOW | packages/ui/src/components/views/git/gitGraph.test.ts | 14 | author_email: 'test@test.com', | CODE |
| LOW | …omponents/session/sidebar/shell/SidebarHeader.test.tsx | 97 | expect(inputs[0]?.getAttribute('placeholder')).toBe('Search sessions...'); | CODE |
| LOW | packages/ui/src/lib/browser/pageActions.test.ts | 332 | <div id="by-mousedown"><span class="placeholder">Add a monitor</span></div> | CODE |
| LOW | packages/ui/src/lib/browser/annotationOverlay.ts | 157 | var INTERESTING_ATTRS = ['id', 'class', 'name', 'type', 'href', 'src', 'alt', 'title', 'role', 'placeholder', 'aria-la | CODE |
| LOW | packages/ui/src/lib/browser/pageActions.ts | 51 | var placeholder = element.getAttribute('placeholder'); | CODE |
| LOW | packages/ui/src/lib/i18n/messages/ko.settings.ts | 805 | 'settings.gitIdentities.editor.field.userNamePlaceholder': 'John Doe', | CODE |
| LOW | packages/ui/src/lib/i18n/messages/en.settings.ts | 837 | 'settings.gitIdentities.editor.field.userNamePlaceholder': 'John Doe', | CODE |
| LOW | packages/ui/src/lib/i18n/messages/tr.settings.ts | 810 | 'settings.gitIdentities.editor.field.userNamePlaceholder': 'John Doe', | CODE |
| LOW | packages/ui/src/lib/i18n/messages/es.settings.ts | 805 | "settings.gitIdentities.editor.field.userNamePlaceholder": "John Doe", | CODE |
| LOW | packages/ui/src/lib/i18n/messages/pt-BR.settings.ts | 805 | "settings.gitIdentities.editor.field.userNamePlaceholder": "John Doe", | CODE |
| LOW | packages/ui/src/lib/i18n/messages/nl.settings.ts | 838 | 'settings.gitIdentities.editor.field.userNamePlaceholder': 'John Doe', | CODE |
| LOW | packages/ui/src/lib/i18n/messages/fr.settings.ts | 708 | 'settings.gitIdentities.editor.field.userNamePlaceholder': 'John Doe', | CODE |
| LOW | packages/web/server/lib/agent-tool/runtime.test.js | 699 | expect(Object.keys(tools.openchamber_secret.input.properties.parameters.properties).sort()).toEqual(['label', 'place | CODE |
| LOW | …lib/source-control/provider-routes.github.auth.test.js | 96 | return Response.json({ id: 7, login: 'user', email: 'user@example.com' }); | CODE |
| LOW | …ages/web/server/lib/source-control/provider-id.test.js | 5 | it.each(['alice', 'jane@corp.com', 'first+tag', 'Jane Doe', 'a.b_c-d', '~user!', 'x'.repeat(256)])('takes %j', (value) | CODE |
| LOW | …er/lib/source-control/provider-publication-freeze.json | 32 | "placeholder": "https://github.example.com", | CODE |
| LOW | …er/lib/source-control/provider-publication-freeze.json | 128 | "placeholder": "https://gitlab.example.com" | CODE |
| LOW | …er/lib/source-control/provider-publication-freeze.json | 215 | "placeholder": "https://gitea.example.com" | CODE |
| LOW | …er/lib/source-control/provider-publication-freeze.json | 378 | "placeholder": "https://gerrit.example.com" | CODE |
| LOW | packages/sdk/examples/config-editor/panel/main.js | 263 | ${Fo}`;var Bo="oc-sdk-ui-style",Se=(e)=>{while(e.firstChild)e.removeChild(e.firstChild)},G=(e)=>{let r=document.getEleme | CODE |
| LOW | packages/sdk/examples/hello-kit/panel/main.js | 263 | ${Wo}`;var jo="oc-sdk-ui-style",me=(e)=>{while(e.firstChild)e.removeChild(e.firstChild)},k=(e)=>{let r=document.getEleme | CODE |
| LOW | packages/sdk/examples/tasks-demo/panel/page.js | 263 | ${yn}`;var bn="oc-sdk-ui-style",Ne=(e)=>{while(e.firstChild)e.removeChild(e.firstChild)},B=(e)=>{let t=document.getEleme | CODE |
| LOW | packages/sdk/examples/tasks-demo/panel/attach.js | 263 | ${pn}`;var dn="oc-sdk-ui-style",Ae=(e)=>{while(e.firstChild)e.removeChild(e.firstChild)},U=(e)=>{let t=document.getEleme | CODE |
| LOW | packages/sdk/examples/tasks-demo/panel/main.js | 263 | ${yn}`;var bn="oc-sdk-ui-style",Ne=(e)=>{while(e.firstChild)e.removeChild(e.firstChild)},B=(e)=>{let t=document.getEleme | CODE |
| LOW | …kages/sdk/examples/browser-provider-stub/panel/main.js | 263 | ${Ro}`;var vo="oc-sdk-ui-style";var G=(e)=>{let r=document.getElementById(vo);if(r instanceof HTMLStyleElement){if(r.tex | CODE |
| LOW | …ages/sdk/examples/source-control-provider/package.json | 46 | "placeholder": "https://gitea.example.com" | CODE |
| LOW | packages/sdk/examples/github-token/panel/main.js | 263 | ${Sn}`;var xn="oc-sdk-ui-style",$e=(e)=>{while(e.firstChild)e.removeChild(e.firstChild)},q=(e)=>{let t=document.getEleme | CODE |
| LOW | packages/sdk/examples/notification-webhook/package.json | 29 | "placeholder": "http://127.0.0.1:4567" | CODE |
| LOW | packages/sdk/examples/service-echo/panel/main.js | 263 | ${Uo}`;var No="oc-sdk-ui-style",Ee=(e)=>{while(e.firstChild)e.removeChild(e.firstChild)},H=(e)=>{let r=document.getEleme | CODE |
| LOW | packages/sdk/src/ui/search.ts | 33 | setAttr(input, 'placeholder', placeholder); | CODE |
| LOW | packages/sdk/src/ui/field.ts | 44 | setAttr(input, 'placeholder', props.placeholder); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/web/bin/lib/cli-args.js | 972 | elif [[ \$words[2] == "profile" ]] && (( CURRENT == 3 )); then | CODE |
| HIGH | packages/web/bin/lib/cli-args.js | 974 | elif [[ \$words[2] == "completion" ]] && (( CURRENT == 3 )); then | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | scripts/test-release-build.sh | 184 | # Step 1: Install dependencies | COMMENT |
| LOW⚡ | scripts/test-release-build.sh | 188 | # Step 2: Build UI package | COMMENT |
| LOW⚡ | scripts/test-release-build.sh | 192 | # Step 3: Build Desktop for each target | COMMENT |
| LOW | scripts/test-release-build.sh | 217 | # Step 4: Show results | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | scripts/test-release-build.sh | 184 | # Step 1: Install dependencies | COMMENT |
| LOW⚡ | scripts/test-release-build.sh | 188 | # Step 2: Build UI package | COMMENT |
| LOW⚡ | scripts/test-release-build.sh | 192 | # Step 3: Build Desktop for each target | COMMENT |
| LOW | scripts/test-release-build.sh | 217 | # Step 4: Show results | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …ckages/ui/src/components/chat/composer/editor/theme.ts | 72 | // iOS cursor drawing reads) behind the hint text. Absolutely positioned at | COMMENT |
| MEDIUM | packages/ui/src/apps/mobileConnections.ts | 1407 | // hot-switch if a better one is reachable — the seamless "LAN at home ⇄ relay | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …/ui/src/components/chat/lib/turns/turnMessageWindow.ts | 4 | // long agentic turn mounted every step at once whenever any part of it was on | COMMENT |
| MEDIUM | packages/web/server/lib/agent-memory/threat-patterns.js | 37 | // Aimed at the guardrails themselves. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/install.sh | 36 | # Check if a command exists | COMMENT |
| LOW | scripts/install.sh | 66 | # Check if running inside an npm/pnpm/yarn/bun context | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/ui/src/lib/responseStyle.ts | 21 | return "Cut the filler. No 'Great question', no 'Certainly', no 'I'll help you with that', no restating what I jus | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/test-release-build.sh | 13 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …kages/web/server/lib/dictation/local/worker-process.js | 125 | async function handleRequest(message) { | CODE |