Skip to content

Commit 9cc59bd

Browse files
committed
fix(flags): report externallyControlled and overridden from the v1 resolver too
1 parent 975a9d4 commit 9cc59bd

3 files changed

Lines changed: 36 additions & 0 deletions

File tree

packages/agent-core/src/flags/resolver.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ export class FlagResolver {
8787
enabled,
8888
source,
8989
configValue,
90+
externallyControlled: source === 'env' || source === 'master-env',
91+
overridden: configValue !== undefined && enabled !== configValue,
9092
};
9193
}
9294
}

packages/agent-core/src/flags/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ export interface ExperimentalFeatureState {
3838
readonly enabled: boolean;
3939
readonly source: ExperimentalFlagSource;
4040
readonly configValue?: boolean;
41+
/** True when an environment variable decides the flag (source `env` or `master-env`). */
42+
readonly externallyControlled: boolean;
43+
/** True when a saved config value exists and differs from the effective value. */
44+
readonly overridden: boolean;
4145
}
4246

4347
export interface ExperimentalFlagResolver {

packages/agent-core/test/flags/resolver.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,36 @@ describe('FlagResolver', () => {
106106
expect(resolver.enabled('b-off-default' as FlagId)).toBe(true);
107107
});
108108

109+
it('reports externallyControlled and overridden the same way the v2 engine does', () => {
110+
const agreeing = new FlagResolver({ [DEFS[0].env]: '0' }, DEFS, { 'a-on-default': false } as never);
111+
expect(agreeing.explain('a-on-default' as FlagId)).toMatchObject({
112+
enabled: false,
113+
source: 'env',
114+
configValue: false,
115+
externallyControlled: true,
116+
overridden: false,
117+
});
118+
const overriding = new FlagResolver({ [DEFS[0].env]: '1' }, DEFS, { 'a-on-default': false } as never);
119+
expect(overriding.explain('a-on-default' as FlagId)).toMatchObject({
120+
enabled: true,
121+
source: 'env',
122+
externallyControlled: true,
123+
overridden: true,
124+
});
125+
const saved = new FlagResolver({}, DEFS, { 'a-on-default': false } as never);
126+
expect(saved.explain('a-on-default' as FlagId)).toMatchObject({
127+
source: 'config',
128+
externallyControlled: false,
129+
overridden: false,
130+
});
131+
expect(new FlagResolver({}, DEFS).explain('a-on-default' as FlagId)).toMatchObject({
132+
source: 'default',
133+
configValue: undefined,
134+
externallyControlled: false,
135+
overridden: false,
136+
});
137+
});
138+
109139
it('ignores obsolete config override ids outside the registry', () => {
110140
const resolver = new FlagResolver({}, DEFS, {
111141
'a-on-default': false,

0 commit comments

Comments
 (0)