1
>
/*---------------------------------------------------------------------------------------------
policy.ts
2
>
* Copyright (c) Microsoft Corporation. All rights reserved.
3
>
* Licensed under the MIT License. See License.txt in the project root for license information.
4
>
*--------------------------------------------------------------------------------------------*/
5
>
6
>
import { localize } from '../../nls.js';
7
>
import { IPolicyData } from './defaultAccount.js';
8
>
9
>
/**
10
>
* System-wide policy file path for Linux systems.
11
>
*/
12
>
export const LINUX_SYSTEM_POLICY_FILE_PATH = '/etc/vscode/policy.json';
13
>
14
>
export type PolicyName = string;
15
>
export type LocalizedValue = {
16
>
key: string;
17
>
value: string;
18
>
};
19
>
20
>
export type PolicyValue = string | number | boolean;
21
>
export type ManagedSettingValue = PolicyValue;
22
>
export type ManagedSettingsData = Readonly<Record<string, ManagedSettingValue>>;
23
>
24
>
export interface IManagedSettingPolicyDefinition {
25
>
readonly type: 'string' | 'number' | 'boolean';
26
>
}
27
>
28
>
export type IManagedSettingsPolicyDefinitions = Readonly<Record<string, IManagedSettingPolicyDefinition>>;
29
>
30
>
export enum PolicyCategory {
31
>
Extensions = 'Extensions',
32
>
IntegratedTerminal = 'IntegratedTerminal',
33
>
InteractiveSession = 'InteractiveSession',
34
>
Telemetry = 'Telemetry',
35
>
Update = 'Update',
36
>
}
37
>
38
>
export const PolicyCategoryData: {
39
>
[key in PolicyCategory]: { name: LocalizedValue }
40
>
} = {
41
>
[PolicyCategory.Extensions]: {
42
>
name: {
43
>
key: 'extensionsConfigurationTitle', value: localize('extensionsConfigurationTitle', "Extensions"),
44
>
}
45
>
},
46
>
[PolicyCategory.IntegratedTerminal]: {
47
>
name: {
48
>
key: 'terminalIntegratedConfigurationTitle', value: localize('terminalIntegratedConfigurationTitle', "Integrated Terminal"),
49
>
}
50
>
},
51
>
[PolicyCategory.InteractiveSession]: {
52
>
name: {
53
>
key: 'interactiveSessionConfigurationTitle', value: localize('interactiveSessionConfigurationTitle', "Chat"),
54
>
}
55
>
},
56
>
[PolicyCategory.Telemetry]: {
57
>
name: {
58
>
key: 'telemetryConfigurationTitle', value: localize('telemetryConfigurationTitle', "Telemetry"),
59
>
}
60
>
},
61
>
[PolicyCategory.Update]: {
62
>
name: {
63
>
key: 'updateConfigurationTitle', value: localize('updateConfigurationTitle', "Update"),
64
>
}
65
>
}
66
>
};
67
>
68
>
export interface IPolicy {
69
>
70
>
/**
71
>
* The policy name.
72
>
*/
73
>
readonly name: PolicyName;
74
>
75
>
/**
76
>
* The policy category.
77
>
*/
78
>
readonly category: PolicyCategory;
79
>
80
>
/**
81
>
* The Code version in which this policy was introduced.
82
>
*/
83
>
readonly minimumVersion: `${number}.${number}`;
84
>
85
>
/**
86
>
* Localization info for the policy.
87
>
*
88
>
* IMPORTANT: the key values for these must be unique to avoid collisions, as during the export time the module information is not available.
89
>
*/
90
>
readonly localization: {
91
>
/** The localization key or key value pair. If only a key is provided, the default value will fallback to the parent configuration's description property. */
92
>
description: LocalizedValue;
93
>
/** List of localization key or key value pair. If only a key is provided, the default value will fallback to the parent configuration's enumDescriptions property. */
94
>
enumDescriptions?: LocalizedValue[];
95
>
};
96
>
97
>
/**
98
>
* The value that an ACCOUNT-based feature will use when its corresponding policy is active.
99
>
*
100
>
* Only applicable when policy is tagged with ACCOUNT. When an account-based feature's policy is enabled,
101
>
* this value determines what value the feature receives.
102
>
*
103
>
* For example:
104
>
* - If evaluated value is `true`, the feature's setting is locked to `true` WHEN the policy is in effect.
105
>
* - If evaluated value is `foo`, the feature's setting is locked to 'foo' WHEN the policy is in effect.
106
>
*
107
>
* If `undefined`, the feature's setting is not locked and can be overridden by other means.
108
>
*/
109
>
readonly value?: (policyData: IPolicyData) => string | number | boolean | undefined;
110
>
111
>
/**
112
>
* Declares Copilot managed-settings keys this policy's value callback reads.
113
>
* Keys are dot-separated managed-settings paths, for example
114
>
* `permissions.disableBypassPermissionsMode`.
115
>
*/
116
>
readonly managedSettings?: IManagedSettingsPolicyDefinitions;
117
>
118
>
/**
119
>
* The most-restrictive value that should be applied when the user is subject to the
120
>
* "Require Approved Account" gate but the gate is not yet satisfied (i.e. no approved
121
>
* GitHub account is signed in or the account-side policy data has not yet resolved).
122
>
*
123
>
* If omitted, the gate falls back to a type-driven safe default
124
>
* (`false` for boolean, `0` for number, `''` for string).
125
>
*
126
>
* Only consulted while the gate is active and unsatisfied; ignored otherwise.
127
>
*/
128
>
readonly restrictedValue?: string | number | boolean;
129
>
}
130
>
131
>
/**
132
>
* A subordinate attachment to an existing {@link IPolicy} (the "owner"). A setting may declare a
133
>
* `policyReference` instead of a full `policy` to be governed by a policy owned by another setting,
134
>
* letting a single enterprise policy lock more than one setting (e.g. gating an agent in both the
135
>
* editor window and the Agents window).
136
>
*
137
>
* A reference is a pure pointer: it carries no policy semantics of its own. The owner is the single
138
>
* source of truth for the policy's catalog metadata *and* its runtime behaviour (type, value
139
>
* callback, etc.); a reference only contributes the policy name so the setting is gated and the OS
140
>
* policy watcher observes the name in processes where the owner is not loaded.
141
>
*/
142
>
export interface IPolicyReference {
143
>
144
>
/** The name of the owning {@link IPolicy} this setting attaches to. */
145
>
readonly name: PolicyName;
146
>
}
147
>
148
>
/**
149
>
* A `product.json` `extensionConfigurationPolicy` entry that attaches its setting to a policy
150
>
* *owned* by an in-code setting, instead of declaring a full owner {@link IPolicy}. This mirrors the
151
>
* in-code `policyReference` configuration field, so the same indirection can be expressed from
152
>
* `product.json` — where the owner's runtime behaviour (notably its `value` callback) cannot live.
153
>
*
154
>
* An `extensionConfigurationPolicy` entry is therefore either a full {@link IPolicy} (the setting
155
>
* "parents"/owns the policy, the current syntax) or this reference wrapper.
156
>
*/
157
>
export interface IExtensionConfigurationPolicyReference {
158
>
159
>
/** Pointer to the owning {@link IPolicy} declared by an in-code setting. */
160
>
readonly policyReference: IPolicyReference;
161
>
}