Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .macroscope/check-run-agents/effect-service-conventions.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Effect Service Conventions
model: gpt-5-6-sol
effort: medium
model: gpt-6-sol
effort: max
input: incremental
tools:
- browse_code
Expand Down
4 changes: 2 additions & 2 deletions .macroscope/check-run-agents/ui-consistency.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: UI Consistency
model: gpt-5-6-sol
effort: medium
model: gpt-6-sol
effort: max
input: incremental
tools:
- browse_code
Expand Down
6 changes: 5 additions & 1 deletion apps/desktop/src/app/DesktopObservability.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
makeTraceSink,
otlpSerializationLayer,
} from "@t3tools/shared/observability";
import * as OtelEnvironment from "@t3tools/shared/otelEnvironment";
import {
parsePersistedServerObservabilitySettings,
type PersistedServerObservabilitySettings,
Expand Down Expand Up @@ -719,7 +720,10 @@ const telemetryLayer = Layer.unwrap(
Effect.forEach(resolved.warnings, (warning) => Effect.logWarning(warning)),
);

return otelWarningsLayer.pipe(Layer.provideMerge(Layer.mergeAll(loggerLayer, tracerLayer)));
return otelWarningsLayer.pipe(
Layer.provideMerge(Layer.mergeAll(loggerLayer, tracerLayer)),
Layer.provide(OtelEnvironment.layerResourceAttributes(resolved.resource.attributes)),
);
}),
);

Expand Down
4 changes: 2 additions & 2 deletions apps/desktop/src/app/DesktopOtlpExport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,8 @@ export const resolveDesktopOtlpExport = (input: DesktopOtlpExportInput): Desktop
const { otel } = input;
const resource: DesktopOtlpResource = {
serviceName: input.serviceName,
serviceVersion: otel.resource.serviceVersion,
attributes: { ...otel.resource.attributes, ...input.runtimeAttributes },
serviceVersion: otel.serviceVersion,
attributes: { ...otel.resourceAttributes, ...input.runtimeAttributes },
};

if (otel.disabled) {
Expand Down
Binary file removed apps/marketing/public/harnesses/antigravity.png
Binary file not shown.
1 change: 1 addition & 0 deletions apps/marketing/public/harnesses/antigravity.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion apps/marketing/public/harnesses/opencode-dark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 3 additions & 8 deletions apps/marketing/src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const mobileEndorsementRows = [
<div class="hero-float" aria-hidden="true">
{[
{ key: "opencode", icon: "/harnesses/opencode-dark.svg", cls: "hf-opencode" },
{ key: "antigravity", icon: "/harnesses/antigravity.png", cls: "hf-antigravity" },
{ key: "antigravity", icon: "/harnesses/antigravity.svg", cls: "hf-antigravity" },
{ key: "claude", icon: "/harnesses/claude-ai-icon.svg", cls: "hf-claude" },
{ key: "codex", icon: "/harnesses/openai_dark.svg", cls: "hf-codex" },
{ key: "grok", icon: "/harnesses/grok-dark.svg", cls: "hf-grok" },
Expand Down Expand Up @@ -247,7 +247,7 @@ const mobileEndorsementRows = [
</div>
</div>
<div class="harness">
<div class="harness-mark"><img src="/harnesses/antigravity.png" alt="" /></div>
<div class="harness-mark"><img src="/harnesses/antigravity.svg" alt="" /></div>
<div class="harness-meta">
<div class="harness-name">Antigravity</div>
<div class="harness-tag">Google sign-in</div>
Expand Down Expand Up @@ -709,11 +709,6 @@ const mobileEndorsementRows = [
object-fit: contain;
}

/* The Antigravity icon ships with its own rounded dark tile, so it fills the
card edge to edge instead of sitting inside it. */
.hf-antigravity .hero-float-card { background: #0d0d10; border-color: rgba(255, 255, 255, 0.1); }
.hf-antigravity .hero-float-card img { width: 100%; height: 100%; border-radius: inherit; object-fit: cover; }

@keyframes mark-in {
from { opacity: 0; transform: translate(var(--fx), var(--fy)) rotate(calc(var(--rot) + 24deg)) scale(0.6); }
to { opacity: 1; transform: translate(0, 0) rotate(var(--rot)) scale(1); }
Expand Down Expand Up @@ -829,7 +824,7 @@ const mobileEndorsementRows = [
flex-shrink: 0; width: 28px; height: 28px;
display: grid; place-items: center;
}
.harness-mark img { width: 22px; height: 22px; object-fit: contain; border-radius: 5px; }
.harness-mark img { width: 22px; height: 22px; object-fit: contain; }

.harness-meta { flex: 1; min-width: 0; }
.harness-name {
Expand Down
Binary file modified apps/mobile/assets/antigravity.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { describe, expect, it } from "vite-plus/test";

import {
filterNewTaskBranches,
resolveNewTaskBranchWorktreePath,
resolveNewTaskBranchLabel,
resolveNewTaskLocalWorkspaceSelection,
Expand Down Expand Up @@ -126,3 +127,26 @@ describe("resolveNewTaskBranchLabel", () => {
).toBe("Choose branch");
});
});

describe("filterNewTaskBranches", () => {
const branches = [
{ name: "main", isRemote: false },
{ name: "Feature/Login-Page", isRemote: false },
{ name: "origin/fix/remote-only", isRemote: true },
];
const search = (query: string) =>
filterNewTaskBranches(branches, query).map((branch) => branch.name);

it("ignores case in both the query and the branch name", () => {
expect(search("feature/login")).toEqual(["Feature/Login-Page"]);
expect(search("MAIN")).toEqual(["main"]);
});

it("keeps remote-only branches searchable", () => {
expect(search("remote-only")).toEqual(["origin/fix/remote-only"]);
});

it("matches a typed space against the dash a branch name uses", () => {
expect(search(" login page ")).toEqual(["Feature/Login-Page"]);
});
});
12 changes: 12 additions & 0 deletions apps/mobile/src/features/threads/new-task-context-presentation.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { sanitizeNewRefName } from "@t3tools/shared/git";

type WorkspaceMode = "local" | "worktree";

export function resolveNewTaskWorkspaceLabel(input: {
Expand Down Expand Up @@ -81,3 +83,13 @@ export function shouldCheckoutNewTaskBranch(input: {
}): boolean {
return input.workspaceMode === "local" && !input.branchIsCurrent && !input.branchWorktreePath;
}

export function filterNewTaskBranches<T extends { readonly name: string }>(
branches: ReadonlyArray<T>,
rawQuery: string,
): ReadonlyArray<T> {
const query = sanitizeNewRefName(rawQuery).toLowerCase();
return query.length === 0
? branches
: branches.filter((branch) => branch.name.toLowerCase().includes(query));
}
25 changes: 12 additions & 13 deletions apps/mobile/src/features/threads/new-task-flow-provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
T3_PROJECT_FILE_NAME,
ThreadId,
} from "@t3tools/contracts";
import { sanitizeNewRefName } from "@t3tools/shared/git";
import { resolveProjectSettings } from "@t3tools/shared/projectSettings";
import { parseT3ProjectFile } from "@t3tools/shared/t3ProjectFile";
import * as Arr from "effect/Array";
Expand Down Expand Up @@ -92,6 +93,7 @@ import {
} from "../../state/legacy-plan-mode";
import { useLegacyPlanModeState } from "./use-legacy-plan-mode-enabled";
import {
filterNewTaskBranches,
resolveNewTaskBranchWorktreePath,
resolveNewTaskLocalWorkspaceSelection,
} from "./new-task-context-presentation";
Expand Down Expand Up @@ -129,6 +131,9 @@ export function branchBadgeLabel(input: {
if (input.branch.worktreePath && input.branch.worktreePath !== input.project?.workspaceRoot) {
return "worktree";
}
if (input.branch.isRemote) {
return "remote";
}
if (input.branch.isDefault) {
return "default";
}
Expand Down Expand Up @@ -626,7 +631,8 @@ export function NewTaskFlowProvider(props: React.PropsWithChildren) {
}
replaceComposerDraftAttachments(selectedProjectDraftKey, []);
}, [selectedProjectDraftKey]);
const debouncedBranchQuery = useDebouncedValue(branchQuery, BRANCH_SEARCH_DEBOUNCE_MS);
const branchSearchQuery = sanitizeNewRefName(branchQuery);
const debouncedBranchQuery = useDebouncedValue(branchSearchQuery, BRANCH_SEARCH_DEBOUNCE_MS);
const branchTarget = useMemo(
() => ({
environmentId: selectedProject?.environmentId ?? null,
Expand All @@ -637,7 +643,7 @@ export function NewTaskFlowProvider(props: React.PropsWithChildren) {
[debouncedBranchQuery, selectedProject?.environmentId, selectedProject?.workspaceRoot],
);
const branchState = usePaginatedBranches(branchTarget);
const branchSearchIsDebouncing = branchQuery.trim() !== debouncedBranchQuery.trim();
const branchSearchIsDebouncing = branchSearchQuery !== debouncedBranchQuery;
const branchesLoading =
branchSearchIsDebouncing || (branchState.isPending && branchState.data === null);
const branchesFetchingNextPage = branchState.isFetchingNextPage;
Expand Down Expand Up @@ -669,17 +675,10 @@ export function NewTaskFlowProvider(props: React.PropsWithChildren) {
);
const currentCheckoutBranchName = projectGitStatus.data?.refName ?? null;

const filteredBranches = useMemo(() => {
const query = branchQuery.trim().toLowerCase();
if (query.length === 0) {
return availableBranches;
}

return pipe(
availableBranches,
Arr.filter((branch) => branch.name.toLowerCase().includes(query)),
);
}, [availableBranches, branchQuery]);
const filteredBranches = useMemo(
() => filterNewTaskBranches(allBranchRefs, branchQuery),
[allBranchRefs, branchQuery],
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remote worktree bases get doubled origin

Medium Severity

The new-task picker now lists remote refs whose name already includes the origin/ prefix. Worktree mode never rewrites that name, and startFromOrigin still prefixes origin/ again, so the label and worktree fetch look for a remote that does not exist.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit e066160. Configure here.


// The composer's draft follows the project it will be sent to: switching
// mid-compose keeps the same draft and moves it, so typed text follows the
Expand Down
6 changes: 3 additions & 3 deletions apps/server/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,11 +129,11 @@ export const layer = (config: ServerConfig["Service"]) => Layer.succeed(ServerCo
*/
export const otlpResource = (config: ServerConfig["Service"]) => ({
serviceName: config.otlpServiceName,
...(config.otelEnvironment.resource.serviceVersion === undefined
...(config.otelEnvironment.serviceVersion === undefined
? {}
: { serviceVersion: config.otelEnvironment.resource.serviceVersion }),
: { serviceVersion: config.otelEnvironment.serviceVersion }),
attributes: {
...config.otelEnvironment.resource.attributes,
...config.otelEnvironment.resourceAttributes,
"service.runtime": "t3-server",
"service.mode": config.mode,
},
Expand Down
3 changes: 3 additions & 0 deletions apps/server/src/observability/Layers/Observability.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,9 @@ export const ObservabilityLive = Layer.unwrap(
Layer.provideMerge(
Layer.mergeAll(ServerLoggerLive, traceReferencesLayer, tracerLayer, metricsLayer),
),
Layer.provide(
OtelEnvironment.layerResourceAttributes(config.otelEnvironment.resourceAttributes),
),
);
}),
);
Loading
Loading