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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions NEXT_CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

### New Features and Improvements

- Added a `meta-harness` user-agent dimension that reports the omnigent meta-harness (detected via the `OMNIGENT` environment variable) independently of agent detection.

### Breaking Changes

### Bug Fixes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,10 @@ public static String asString() {
if (!agent.isEmpty()) {
segments.add(String.format("agent/%s", agent));
}
String metaHarness = metaHarnessProvider();
if (!metaHarness.isEmpty()) {
segments.add(String.format("meta-harness/%s", metaHarness));
}
// Concurrent iteration over ArrayList must be guarded with synchronized.
synchronized (otherInfo) {
segments.addAll(
Expand Down Expand Up @@ -174,6 +178,8 @@ private static List<CicdProvider> listCiCdProviders() {

protected static volatile String agentProvider = null;

protected static volatile String metaHarnessProvider = null;

protected static Environment env = null;

// Represents an environment variable with its name and expected value
Expand Down Expand Up @@ -362,6 +368,47 @@ private static String agentProvider() {
return agentProvider;
}

// Describes a single meta-harness: the env var that identifies it and the
// product name reported in the user agent.
private static class KnownMetaHarness {
private final String envVar;
private final String product;

KnownMetaHarness(String envVar, String product) {
this.envVar = envVar;
this.product = product;
}
}

// Canonical list of known meta-harnesses, detected by presence.
// Keep in sync with databricks-sdk-go and databricks-sdk-py.
// OMNIGENT is set by the omnigent meta-harness (https://github.com/omnigent-ai/omnigent).
private static List<KnownMetaHarness> listKnownMetaHarnesses() {
return Arrays.asList(new KnownMetaHarness("OMNIGENT", "omnigent"));
}

// Looks up the active meta-harness by env var presence, independent of the agent.
private static String lookupMetaHarnessProvider(Environment env) {
for (KnownMetaHarness h : listKnownMetaHarnesses()) {
if (env.get(h.envVar) != null) {
return h.product;
}
}
return "";
}

// Thread-safe lazy initialization of meta-harness detection
private static String metaHarnessProvider() {
if (metaHarnessProvider == null) {
synchronized (UserAgent.class) {
if (metaHarnessProvider == null) {
metaHarnessProvider = lookupMetaHarnessProvider(env());
}
}
}
return metaHarnessProvider;
}

private static Environment env() {
if (env == null) {
env =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@ void tearDown() {
private void setupAgentEnv(Map<String, String> envMap) {
UserAgent.agentProvider = null;
UserAgent.cicdProvider = null;
UserAgent.metaHarnessProvider = null;
UserAgent.env = new Environment(envMap, new ArrayList<>(), System.getProperty("os.name"));
}

private void cleanupAgentEnv() {
UserAgent.env = null;
UserAgent.agentProvider = null;
UserAgent.cicdProvider = null;
UserAgent.metaHarnessProvider = null;
}

@Test
Expand Down Expand Up @@ -617,4 +619,68 @@ public void testAgentProviderCached() {
Assertions.assertTrue(UserAgent.asString().contains("agent/cursor"));
Assertions.assertFalse(UserAgent.asString().contains("agent/claude-code"));
}

@Test
public void testMetaHarnessProviderOmnigent() {
setupAgentEnv(
new HashMap<String, String>() {
{
put("OMNIGENT", "1");
}
});
Assertions.assertTrue(UserAgent.asString().contains("meta-harness/omnigent"));
}

@Test
public void testMetaHarnessProviderNoHarness() {
setupAgentEnv(new HashMap<>());
Assertions.assertFalse(UserAgent.asString().contains("meta-harness/"));
}

@Test
public void testMetaHarnessProviderEmptyValueStillSet() {
// Empty string still counts as "set" for presence-only detection,
// matching the agent dimension and databricks-sdk-go semantics.
setupAgentEnv(
new HashMap<String, String>() {
{
put("OMNIGENT", "");
}
});
Assertions.assertTrue(UserAgent.asString().contains("meta-harness/omnigent"));
}

@Test
public void testMetaHarnessProviderIndependentOfAgent() {
// Under omnigent both OMNIGENT and the agent marker are set: report both
// dimensions, and the meta-harness must not trip the agent "multiple" logic.
setupAgentEnv(
new HashMap<String, String>() {
{
put("OMNIGENT", "1");
put("CLAUDECODE", "1");
}
});
String userAgent = UserAgent.asString();
Assertions.assertTrue(userAgent.contains("agent/claude-code"));
Assertions.assertTrue(userAgent.contains("meta-harness/omnigent"));
Assertions.assertFalse(userAgent.contains("agent/multiple"));
}

@Test
public void testMetaHarnessProviderCached() {
// Set up with omnigent.
setupAgentEnv(
new HashMap<String, String>() {
{
put("OMNIGENT", "1");
}
});
Assertions.assertTrue(UserAgent.asString().contains("meta-harness/omnigent"));

// Change env after caching. Cached result should persist.
UserAgent.env =
new Environment(new HashMap<>(), new ArrayList<>(), System.getProperty("os.name"));
Assertions.assertTrue(UserAgent.asString().contains("meta-harness/omnigent"));
}
}
Loading