@aiwg/cli 2026.10.11 → 2026.10.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agentic/code/providers/model-catalog.v1.json +62 -12
- package/dist/src/artifacts/binding-target-identity.js +51 -0
- package/dist/src/artifacts/checksum-manifest.js +12 -0
- package/dist/src/artifacts/index-builder.js +11 -13
- package/dist/src/artifacts/query-engine.js +5 -11
- package/dist/src/cli/handlers/doctor-help.js +32 -0
- package/dist/src/cli/handlers/gates.js +19 -18
- package/dist/src/cli/handlers/models-help.js +7 -1
- package/dist/src/cli/handlers/models.js +3 -3
- package/dist/src/cli/handlers/script-runner.js +8 -5
- package/dist/src/cli/handlers/sessions-intake.js +104 -0
- package/dist/src/cli/handlers/sessions-tail.js +172 -0
- package/dist/src/cli/handlers/sessions.js +90 -17
- package/dist/src/cli/handlers/skill-lint.js +10 -3
- package/dist/src/cli/handlers/steward-format.js +100 -0
- package/dist/src/cli/handlers/steward-models.js +167 -0
- package/dist/src/cli/handlers/steward.js +14 -248
- package/dist/src/cli/handlers/use-bundle-counts.js +61 -0
- package/dist/src/cli/handlers/use.js +6 -24
- package/dist/src/cli/handlers/utilities.js +1 -24
- package/dist/src/config/aiwg-config.js +7 -0
- package/dist/src/config/authorization-cli.js +89 -0
- package/dist/src/config/cli-help.js +1 -0
- package/dist/src/config/cli.js +10 -1
- package/dist/src/decision/context-pruning.js +3 -2
- package/dist/src/decision/ensemble/contract.js +15 -4
- package/dist/src/decision/ensemble-study/artifacts.js +5 -0
- package/dist/src/decision/ensemble-study/score.js +4 -3
- package/dist/src/decision/feature-export.js +3 -9
- package/dist/src/decision/heldout/collector.js +2 -2
- package/dist/src/decision/issue-triage/runtime.js +3 -9
- package/dist/src/decision/qualification/gates.js +2 -1
- package/dist/src/decision/qualification/release.js +2 -3
- package/dist/src/decision/routing/report.js +2 -0
- package/dist/src/decision/sdlc-screening.js +3 -5
- package/dist/src/decision/sensitivity/comparative.js +5 -3
- package/dist/src/gates/driver.js +6 -77
- package/dist/src/gates/evaluate.js +4 -11
- package/dist/src/gates/floors.js +4 -4
- package/dist/src/gates/index.js +3 -3
- package/dist/src/gates/lattice.js +26 -0
- package/dist/src/gates/registry.js +2 -1
- package/dist/src/gates/report.js +19 -7
- package/dist/src/issues/audit-cli.js +120 -0
- package/dist/src/issues/audit-contract.js +64 -0
- package/dist/src/issues/audit-local.js +82 -0
- package/dist/src/issues/audit.js +220 -0
- package/dist/src/lint/rule-activation.js +15 -1
- package/dist/src/mission-protocol/canonical-codecs.js +270 -0
- package/dist/src/mission-protocol/codecs.js +22 -550
- package/dist/src/mission-protocol/health-trace-codecs.js +281 -0
- package/dist/src/mission-protocol/health-trace-types.js +43 -0
- package/dist/src/mission-protocol/types.js +2 -42
- package/dist/src/mission-protocol/worker-contract-json.js +10 -0
- package/dist/src/mission-protocol/worker-review-gate.js +100 -0
- package/dist/src/mission-protocol/worker-review-types.js +2 -0
- package/dist/src/models/catalog-policy.js +280 -0
- package/dist/src/models/index.js +1 -1
- package/dist/src/models/model-catalog.v1.json +62 -12
- package/dist/src/models/policy-resources.js +28 -0
- package/dist/src/models/provider-policy.js +10 -546
- package/dist/src/models/resolver.js +26 -8
- package/dist/src/models/router.js +15 -2
- package/dist/src/models/tiers.js +13 -0
- package/dist/src/models/types.js +0 -6
- package/dist/src/models/worker-ceilings.js +59 -0
- package/dist/src/models/worker-invocation-policy.js +243 -0
- package/dist/src/models/worker-plan.js +16 -20
- package/dist/src/models/worker-review-lineage.js +55 -0
- package/dist/src/models/worker-selection-policy.js +1 -1
- package/dist/src/models/wrapper-route.js +6 -3
- package/dist/src/policy/authorization.js +1 -0
- package/dist/src/policy/hitl-config.js +63 -0
- package/dist/src/policy/hitl-receipt.js +57 -0
- package/dist/src/policy/hitl-types.js +4 -0
- package/dist/src/policy/hitl-validation.js +39 -0
- package/dist/src/policy/hitl.js +117 -0
- package/dist/src/rules/activation.d.mts +1 -1
- package/dist/src/rules/activation.mjs +0 -2
- package/dist/src/rules/gate-coverage.js +51 -0
- package/dist/src/rules/gate-references.js +16 -0
- package/dist/src/rules/rule-frontmatter.schema.json +7 -1
- package/dist/src/serve/worker-command-request.js +21 -4
- package/dist/src/serve/worker-invocation-preparation.js +3 -1
- package/dist/src/serve/worker-invocation.js +21 -10
- package/dist/src/sessions/adapters/deepseek-harness.js +1 -0
- package/dist/src/sessions/adapters/grok-build-native.js +269 -0
- package/dist/src/sessions/adapters/grok-build.js +57 -15
- package/dist/src/sessions/adapters/hermes-state-db.js +252 -0
- package/dist/src/sessions/adapters/hermes.js +42 -3
- package/dist/src/sessions/adapters/warp.js +1 -1
- package/dist/src/sessions/batch-import.js +10 -0
- package/dist/src/sessions/contracts.js +1 -1
- package/dist/src/sessions/discovery-capability.js +38 -0
- package/dist/src/sessions/importer.js +8 -251
- package/dist/src/sessions/index.js +4 -0
- package/dist/src/sessions/intake-dir.js +71 -0
- package/dist/src/sessions/normalization.js +251 -0
- package/dist/src/sessions/tail.js +91 -0
- package/dist/src/sessions/workspace-discovery.js +83 -7
- package/dist/src/skills/agent-skill-sidecar.js +28 -0
- package/dist/src/skills/agent-skills.js +4 -23
- package/dist/src/skills/claude-surface-projection.js +25 -0
- package/dist/src/skills/deployer.js +8 -288
- package/dist/src/skills/deployment-policy.js +114 -0
- package/dist/src/skills/deployment-projection.js +152 -0
- package/dist/src/skills/deployment-types.js +20 -0
- package/dist/src/skills/exporter.js +8 -31
- package/dist/src/skills/provider-extensions.js +41 -0
- package/dist/src/skills/run.js +6 -0
- package/dist/src/skills/types.js +0 -8
- package/dist/src/skills/validator-resources.js +68 -0
- package/dist/src/skills/validator.js +6 -55
- package/dist/src/storage/cli-migrate-options.js +125 -0
- package/dist/src/storage/cli-migrate.js +111 -0
- package/dist/src/storage/cli.js +4 -279
- package/dist/src/storage/migration-adapter.js +79 -0
- package/dist/src/storage/migration-copy.js +108 -0
- package/dist/src/storage/migration-protocol.js +14 -197
- package/dist/src/storage/migration-records.js +186 -0
- package/dist/src/storage/migration-types.js +12 -0
- package/dist/src/tracker/forge-http.js +2 -1
- package/dist/src/tracker/issue-pages.js +110 -0
- package/package.json +1 -1
- package/schemas/mission-v1.schema.json +335 -0
- package/schemas/models/model-catalog.v1.schema.json +19 -1
- package/schemas/models/model-config-compatibility.v1.schema.json +3 -2
- package/schemas/models/model-policy.v1.schema.json +1 -1
- package/tools/agents/providers/provider-paths-staging.mjs +35 -0
- package/tools/agents/providers/rule-binding-targets.mjs +146 -0
- package/tools/agents/providers/rule-delivery.mjs +7 -126
- package/vscode-extension/schemas/aiwg.config.v1.json +177 -0
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
addManagedMarker, contentHash, replaceBoundRulesBlock, deployEmulatedBehaviors, filterAgentFiles,
|
|
13
13
|
} from './base.mjs';
|
|
14
14
|
|
|
15
|
-
const { parseRuleFrontmatter, inferRuleActivation,
|
|
15
|
+
const { parseRuleFrontmatter, inferRuleActivation, readCoreBody, validateCoreSet, CORE_RULES_START, CORE_RULES_END } = await importImpl(import.meta.url, 'rules/activation.mjs');
|
|
16
16
|
const { resolveDeployVersion } = await importImpl(import.meta.url, 'providers/deploy-version.mjs');
|
|
17
17
|
const { trackTemporaryDirectory } = await importImpl(import.meta.url, 'utils/temporary-directory.js');
|
|
18
18
|
const { loadRulePinConfigs, installedRuleCapabilities, resolveRulePins } = await importImpl(import.meta.url, 'rules/pins.mjs');
|
|
@@ -20,6 +20,8 @@ const { guardRulesInlineBudget } = await importImpl(import.meta.url, 'rules/inli
|
|
|
20
20
|
const { userConfigFile } = await importImpl(import.meta.url, 'config/user-config-dir.mjs');
|
|
21
21
|
const { resolveProjectAiwgDir } = await importImpl(import.meta.url, 'config/project-artifacts-runtime.mjs');
|
|
22
22
|
import { writeContextFileSync, CONTEXT_STAGE_ENV } from './context-write.mjs';
|
|
23
|
+
import { captureProviderPathDescriptors, setStagedProviderPath, restoreProviderPaths } from './provider-paths-staging.mjs';
|
|
24
|
+
import { resolveDeliveryRuleBindings } from './rule-binding-targets.mjs';
|
|
23
25
|
import { projectOnDemandReferences, renderRuleKernelIndex } from './rule-presentation.mjs';
|
|
24
26
|
export { renderRuleKernelIndex } from './rule-presentation.mjs';
|
|
25
27
|
const PREPARATION_HOOK = Symbol.for('aiwg.provider-preparation-hook.v1');
|
|
@@ -175,128 +177,7 @@ export async function prepareRuleDelivery(opts) {
|
|
|
175
177
|
// All pins use native kernel projection, including legacy untagged rules.
|
|
176
178
|
rule.tagged = true;
|
|
177
179
|
}
|
|
178
|
-
const bindings =
|
|
179
|
-
const targets = [];
|
|
180
|
-
const targetKeys = new Set();
|
|
181
|
-
if (rules.some(rule => Object.values(rule.bound_to).some(ids => ids.length))) {
|
|
182
|
-
const { loadLocalCapabilityEntries, loadLocalOverrideCapabilityEntries, createRuleBindingTargetResolver } = await importImpl(import.meta.url, 'artifacts/query-engine.js');
|
|
183
|
-
const root = resolveAiwgRoot(opts.srcRoot) || opts.srcRoot;
|
|
184
|
-
// Framework graph paths are package-relative; project graph paths belong
|
|
185
|
-
// to the queried project. Normalize before merging so one source cannot
|
|
186
|
-
// become two apparently ambiguous targets after a source-index rebuild.
|
|
187
|
-
const indexEntries = new Map();
|
|
188
|
-
const entryPaths = new Map();
|
|
189
|
-
const loadEntries = (cwd, overridesOnly = false) => (overridesOnly
|
|
190
|
-
? loadLocalOverrideCapabilityEntries(cwd)
|
|
191
|
-
: loadLocalCapabilityEntries(cwd, undefined, indexEntries)).map(entry => {
|
|
192
|
-
const anchor = entry.path.startsWith('agentic/code/') ? root : cwd;
|
|
193
|
-
const key = `${anchor}\0${entry.path}`;
|
|
194
|
-
if (!entryPaths.has(key)) entryPaths.set(key, path.resolve(anchor, entry.path));
|
|
195
|
-
const resolvedPath = entryPaths.get(key);
|
|
196
|
-
// Canonical IDs hash the indexed package-relative path. Keep it through
|
|
197
|
-
// resolution; the selected target is anchored to root below.
|
|
198
|
-
return { ...entry, path: entry.path.startsWith('agentic/code/') ? entry.path
|
|
199
|
-
: opts.mapInputPath ? opts.mapInputPath(resolvedPath) : resolvedPath };
|
|
200
|
-
});
|
|
201
|
-
let rebuilt = false;
|
|
202
|
-
const cacheDir = process.env.AIWG_RULE_BINDING_INDEX_CACHE;
|
|
203
|
-
const cacheFile = cacheDir && path.join(cacheDir, `${contentHash(opts.logicalInputPath ? opts.logicalInputPath(root) : root)}.json`);
|
|
204
|
-
const buildSourceEntries = async (refresh = false) => {
|
|
205
|
-
if (!refresh && cacheFile) {
|
|
206
|
-
try { return JSON.parse(fs.readFileSync(cacheFile, 'utf8')).map(entry => ({ ...entry, path: path.isAbsolute(entry.path) && opts.mapInputPath ? opts.mapInputPath(entry.path) : entry.path })); }
|
|
207
|
-
catch (error) {
|
|
208
|
-
if (error.code !== 'ENOENT' && !(error instanceof SyntaxError)) throw error;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
const { collectRuleBindingEntries } = await importImpl(import.meta.url, 'artifacts/index-builder.js');
|
|
212
|
-
const sourceEntries = await collectRuleBindingEntries(root,
|
|
213
|
-
root === opts.srcRoot && !fs.existsSync(path.join(root, 'agentic')) ? '.' : 'agentic/code');
|
|
214
|
-
rebuilt = true;
|
|
215
|
-
const entries = sourceEntries.map(entry => ({ ...entry, path: entry.path.startsWith('agentic/code/')
|
|
216
|
-
? entry.path : path.resolve(root, entry.path) }));
|
|
217
|
-
if (cacheFile) {
|
|
218
|
-
fs.mkdirSync(cacheDir, { recursive: true });
|
|
219
|
-
// Workers may publish the same immutable source snapshot concurrently.
|
|
220
|
-
const temporary = `${cacheFile}.${process.pid}.tmp`;
|
|
221
|
-
fs.writeFileSync(temporary, JSON.stringify(entries.map(entry => ({ ...entry, path: opts.logicalInputPath ? opts.logicalInputPath(entry.path) : entry.path }))));
|
|
222
|
-
fs.renameSync(temporary, cacheFile);
|
|
223
|
-
}
|
|
224
|
-
return entries;
|
|
225
|
-
};
|
|
226
|
-
const localEntries = opts.bindingEntries || loadEntries(opts.target, Boolean(packageRelations));
|
|
227
|
-
let entries = [...localEntries];
|
|
228
|
-
if (!opts.bindingEntries) {
|
|
229
|
-
// The validated package table is authoritative for its exact source digest.
|
|
230
|
-
// Keep the canonical resolver for aliases, local overrides and ambiguity.
|
|
231
|
-
const sourceEntries = packageRelations
|
|
232
|
-
? Object.values(packageRelations.index.artifacts).map(entry => ({ ...entry,
|
|
233
|
-
indexScope: 'packaged', indexGraph: 'framework' }))
|
|
234
|
-
: loadEntries(root);
|
|
235
|
-
// A relocated project graph may also be visible while querying the
|
|
236
|
-
// package root. Keep its project-anchored instance only.
|
|
237
|
-
const uniqueSources = sourceEntries.filter(entry => !(opts.sharedProjectGraph &&
|
|
238
|
-
entry.path.startsWith(path.join(root, '.aiwg') + path.sep) &&
|
|
239
|
-
localEntries.some(local => local.type === entry.type && local.name === entry.name)));
|
|
240
|
-
entries.push(...uniqueSources);
|
|
241
|
-
if (!sourceEntries.length) entries.push(...await buildSourceEntries());
|
|
242
|
-
}
|
|
243
|
-
// Project-local installed bundles are outside the package source index.
|
|
244
|
-
// Reuse the existing binding index builder only for those source roots.
|
|
245
|
-
if (!opts.bindingEntries) {
|
|
246
|
-
for (const entry of Object.values(configs.project.installed || {})) {
|
|
247
|
-
if (!entry.localPath) continue;
|
|
248
|
-
const localRoot = path.resolve(opts.target, entry.localPath);
|
|
249
|
-
if (localRoot === root || !fs.existsSync(localRoot)) continue;
|
|
250
|
-
const temp = fs.mkdtempSync(path.join(os.tmpdir(), 'aiwg-local-rule-index-'));
|
|
251
|
-
try {
|
|
252
|
-
const { buildIndex } = await importImpl(import.meta.url, 'artifacts/index-builder.js');
|
|
253
|
-
await buildIndex(localRoot, { scope: '.', outputDir: temp, force: true, quiet: true });
|
|
254
|
-
const index = JSON.parse(read(path.join(temp, '.aiwg', '.index', 'metadata.json')));
|
|
255
|
-
const scoped = Object.values(index.entries).map(entry => ({ ...entry, path: path.resolve(localRoot, entry.path) }));
|
|
256
|
-
localEntries.push(...scoped);
|
|
257
|
-
entries.push(...scoped);
|
|
258
|
-
} finally { fs.rmSync(temp, { recursive: true, force: true }); }
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
// A stored index can predate the source tree (edge/dev checkouts). Rebuild once from source
|
|
262
|
-
// before reporting a binding target as missing.
|
|
263
|
-
const resolvedTargets = new Map();
|
|
264
|
-
let resolveBinding = createRuleBindingTargetResolver(entries);
|
|
265
|
-
const resolveTarget = async (type, id) => {
|
|
266
|
-
const key = `${type}:${id}`;
|
|
267
|
-
if (resolvedTargets.has(key)) return resolvedTargets.get(key);
|
|
268
|
-
let target;
|
|
269
|
-
try { target = resolveBinding(type, id); }
|
|
270
|
-
catch (error) {
|
|
271
|
-
if (packageRelations || rebuilt || opts.bindingEntries || !/^Missing /.test(error.message)) throw error;
|
|
272
|
-
indexEntries.clear();
|
|
273
|
-
entryPaths.clear();
|
|
274
|
-
entries = [...localEntries, ...await buildSourceEntries(true)];
|
|
275
|
-
rebuilt = true;
|
|
276
|
-
resolveBinding = createRuleBindingTargetResolver(entries);
|
|
277
|
-
target = resolveBinding(type, id);
|
|
278
|
-
// A rebuild replaces the input set for every lookup.
|
|
279
|
-
resolvedTargets.clear();
|
|
280
|
-
}
|
|
281
|
-
resolvedTargets.set(key, target);
|
|
282
|
-
return target;
|
|
283
|
-
};
|
|
284
|
-
for (const rule of rules.filter(rule => rule.tagged)) {
|
|
285
|
-
for (const [key, type] of Object.entries(RULE_BINDING_TYPES)) {
|
|
286
|
-
for (const id of rule.bound_to[key]) {
|
|
287
|
-
const target = await resolveTarget(type, id);
|
|
288
|
-
const source = path.isAbsolute(target.path) ? target.path : path.resolve(target.path.startsWith('agentic/code/') ? root : opts.target, target.path);
|
|
289
|
-
if (!fs.existsSync(source)) throw new Error(`${rule.file}: binding target content missing: ${source}`);
|
|
290
|
-
bindings.set(source, [...(bindings.get(source) || []), rule]);
|
|
291
|
-
const key = `${target.type}:${source}`;
|
|
292
|
-
if (!targetKeys.has(key)) {
|
|
293
|
-
targetKeys.add(key);
|
|
294
|
-
targets.push({ ...target, source });
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
180
|
+
const { bindings, targets } = await resolveDeliveryRuleBindings(opts, rules, configs, root, packageRelations);
|
|
300
181
|
return { rules, bindings, targets, pins: pinned.rules, pinWarnings: pinned.warnings };
|
|
301
182
|
}
|
|
302
183
|
|
|
@@ -1010,7 +891,7 @@ export async function prepareRuleDeployment(original, provider, deploy) {
|
|
|
1010
891
|
const mappings = [];
|
|
1011
892
|
const preimages = [...initialPreimages];
|
|
1012
893
|
let retained = false;
|
|
1013
|
-
const originals =
|
|
894
|
+
const originals = captureProviderPathDescriptors(provider);
|
|
1014
895
|
const logicalTarget = original.target;
|
|
1015
896
|
const priorAiwgRoot = process.env.AIWG_ROOT;
|
|
1016
897
|
const priorRegistry = process.env.AIWG_USER_REGISTRY_PATH;
|
|
@@ -1148,7 +1029,7 @@ export async function prepareRuleDeployment(original, provider, deploy) {
|
|
|
1148
1029
|
if (!path.isAbsolute(dir)) continue;
|
|
1149
1030
|
const to = path.join(temp, 'native', key);
|
|
1150
1031
|
mount(dir, to);
|
|
1151
|
-
provider
|
|
1032
|
+
setStagedProviderPath(provider, key, to);
|
|
1152
1033
|
}
|
|
1153
1034
|
let kernel = provider.kernelSkillsPath;
|
|
1154
1035
|
if (kernel && path.isAbsolute(kernel)) {
|
|
@@ -1344,7 +1225,7 @@ export async function prepareRuleDeployment(original, provider, deploy) {
|
|
|
1344
1225
|
return plan;
|
|
1345
1226
|
} finally {
|
|
1346
1227
|
if (priorContextStage === undefined) delete process.env[CONTEXT_STAGE_ENV]; else process.env[CONTEXT_STAGE_ENV] = priorContextStage;
|
|
1347
|
-
|
|
1228
|
+
restoreProviderPaths(provider, originals);
|
|
1348
1229
|
if (priorAiwgRoot === undefined) delete process.env.AIWG_ROOT; else process.env.AIWG_ROOT = priorAiwgRoot;
|
|
1349
1230
|
if (priorRegistry === undefined) delete process.env.AIWG_USER_REGISTRY_PATH; else process.env.AIWG_USER_REGISTRY_PATH = priorRegistry;
|
|
1350
1231
|
if (priorArtifacts === undefined) delete process.env.AIWG_ARTIFACTS_PATH; else process.env.AIWG_ARTIFACTS_PATH = priorArtifacts;
|
|
@@ -1813,6 +1813,182 @@
|
|
|
1813
1813
|
}
|
|
1814
1814
|
}
|
|
1815
1815
|
},
|
|
1816
|
+
"HitlProfile": {
|
|
1817
|
+
"type": "object",
|
|
1818
|
+
"additionalProperties": false,
|
|
1819
|
+
"required": [
|
|
1820
|
+
"categories",
|
|
1821
|
+
"repos",
|
|
1822
|
+
"environments",
|
|
1823
|
+
"resources",
|
|
1824
|
+
"reversible",
|
|
1825
|
+
"maxImpact",
|
|
1826
|
+
"expiresAt"
|
|
1827
|
+
],
|
|
1828
|
+
"properties": {
|
|
1829
|
+
"categories": {
|
|
1830
|
+
"type": "array",
|
|
1831
|
+
"minItems": 1,
|
|
1832
|
+
"uniqueItems": true,
|
|
1833
|
+
"items": {
|
|
1834
|
+
"enum": [
|
|
1835
|
+
"repo.read",
|
|
1836
|
+
"repo.edit",
|
|
1837
|
+
"docs.edit",
|
|
1838
|
+
"test.run",
|
|
1839
|
+
"testnet.configure"
|
|
1840
|
+
]
|
|
1841
|
+
}
|
|
1842
|
+
},
|
|
1843
|
+
"repos": {
|
|
1844
|
+
"type": "array",
|
|
1845
|
+
"minItems": 1,
|
|
1846
|
+
"uniqueItems": true,
|
|
1847
|
+
"items": {
|
|
1848
|
+
"type": "string",
|
|
1849
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/@-]{0,255}$"
|
|
1850
|
+
}
|
|
1851
|
+
},
|
|
1852
|
+
"environments": {
|
|
1853
|
+
"type": "array",
|
|
1854
|
+
"minItems": 1,
|
|
1855
|
+
"uniqueItems": true,
|
|
1856
|
+
"items": {
|
|
1857
|
+
"enum": [
|
|
1858
|
+
"local",
|
|
1859
|
+
"development",
|
|
1860
|
+
"test",
|
|
1861
|
+
"testnet"
|
|
1862
|
+
]
|
|
1863
|
+
}
|
|
1864
|
+
},
|
|
1865
|
+
"resources": {
|
|
1866
|
+
"type": "array",
|
|
1867
|
+
"minItems": 1,
|
|
1868
|
+
"uniqueItems": true,
|
|
1869
|
+
"items": {
|
|
1870
|
+
"type": "string",
|
|
1871
|
+
"minLength": 1,
|
|
1872
|
+
"maxLength": 512,
|
|
1873
|
+
"pattern": "^(?![A-Za-z]:)(?!/)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*[\\\\\\x00-\\x20]).+$"
|
|
1874
|
+
}
|
|
1875
|
+
},
|
|
1876
|
+
"reversible": {
|
|
1877
|
+
"const": true
|
|
1878
|
+
},
|
|
1879
|
+
"maxImpact": {
|
|
1880
|
+
"enum": [
|
|
1881
|
+
"low",
|
|
1882
|
+
"medium"
|
|
1883
|
+
]
|
|
1884
|
+
},
|
|
1885
|
+
"expiresAt": {
|
|
1886
|
+
"type": "string",
|
|
1887
|
+
"format": "date-time"
|
|
1888
|
+
}
|
|
1889
|
+
}
|
|
1890
|
+
},
|
|
1891
|
+
"HitlSelector": {
|
|
1892
|
+
"type": "object",
|
|
1893
|
+
"additionalProperties": false,
|
|
1894
|
+
"minProperties": 1,
|
|
1895
|
+
"properties": {
|
|
1896
|
+
"categories": {
|
|
1897
|
+
"type": "array",
|
|
1898
|
+
"minItems": 1,
|
|
1899
|
+
"uniqueItems": true,
|
|
1900
|
+
"items": {
|
|
1901
|
+
"type": "string",
|
|
1902
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/@-]{0,255}$"
|
|
1903
|
+
}
|
|
1904
|
+
},
|
|
1905
|
+
"repos": {
|
|
1906
|
+
"type": "array",
|
|
1907
|
+
"minItems": 1,
|
|
1908
|
+
"uniqueItems": true,
|
|
1909
|
+
"items": {
|
|
1910
|
+
"type": "string",
|
|
1911
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/@-]{0,255}$"
|
|
1912
|
+
}
|
|
1913
|
+
},
|
|
1914
|
+
"environments": {
|
|
1915
|
+
"type": "array",
|
|
1916
|
+
"minItems": 1,
|
|
1917
|
+
"uniqueItems": true,
|
|
1918
|
+
"items": {
|
|
1919
|
+
"type": "string",
|
|
1920
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/@-]{0,255}$"
|
|
1921
|
+
}
|
|
1922
|
+
},
|
|
1923
|
+
"resources": {
|
|
1924
|
+
"type": "array",
|
|
1925
|
+
"minItems": 1,
|
|
1926
|
+
"uniqueItems": true,
|
|
1927
|
+
"items": {
|
|
1928
|
+
"type": "string",
|
|
1929
|
+
"minLength": 1,
|
|
1930
|
+
"maxLength": 512,
|
|
1931
|
+
"pattern": "^(?![A-Za-z]:)(?!/)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*[\\\\\\x00-\\x20]).+$"
|
|
1932
|
+
}
|
|
1933
|
+
}
|
|
1934
|
+
}
|
|
1935
|
+
},
|
|
1936
|
+
"HitlPolicy": {
|
|
1937
|
+
"type": "object",
|
|
1938
|
+
"additionalProperties": false,
|
|
1939
|
+
"required": [
|
|
1940
|
+
"version",
|
|
1941
|
+
"enabled",
|
|
1942
|
+
"reviewedAt",
|
|
1943
|
+
"maxAgeSeconds",
|
|
1944
|
+
"expiresAt",
|
|
1945
|
+
"profiles",
|
|
1946
|
+
"deny",
|
|
1947
|
+
"requireReview"
|
|
1948
|
+
],
|
|
1949
|
+
"properties": {
|
|
1950
|
+
"version": {
|
|
1951
|
+
"const": "1"
|
|
1952
|
+
},
|
|
1953
|
+
"enabled": {
|
|
1954
|
+
"type": "boolean"
|
|
1955
|
+
},
|
|
1956
|
+
"reviewedAt": {
|
|
1957
|
+
"type": "string",
|
|
1958
|
+
"format": "date-time"
|
|
1959
|
+
},
|
|
1960
|
+
"maxAgeSeconds": {
|
|
1961
|
+
"type": "integer",
|
|
1962
|
+
"minimum": 1,
|
|
1963
|
+
"maximum": 2592000
|
|
1964
|
+
},
|
|
1965
|
+
"expiresAt": {
|
|
1966
|
+
"type": "string",
|
|
1967
|
+
"format": "date-time"
|
|
1968
|
+
},
|
|
1969
|
+
"profiles": {
|
|
1970
|
+
"type": "object",
|
|
1971
|
+
"propertyNames": {
|
|
1972
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"
|
|
1973
|
+
},
|
|
1974
|
+
"additionalProperties": {
|
|
1975
|
+
"$ref": "#/definitions/HitlProfile"
|
|
1976
|
+
}
|
|
1977
|
+
},
|
|
1978
|
+
"deny": {
|
|
1979
|
+
"type": "array",
|
|
1980
|
+
"items": {
|
|
1981
|
+
"$ref": "#/definitions/HitlSelector"
|
|
1982
|
+
}
|
|
1983
|
+
},
|
|
1984
|
+
"requireReview": {
|
|
1985
|
+
"type": "array",
|
|
1986
|
+
"items": {
|
|
1987
|
+
"$ref": "#/definitions/HitlSelector"
|
|
1988
|
+
}
|
|
1989
|
+
}
|
|
1990
|
+
}
|
|
1991
|
+
},
|
|
1816
1992
|
"Authorization": {
|
|
1817
1993
|
"type": "object",
|
|
1818
1994
|
"additionalProperties": false,
|
|
@@ -1825,6 +2001,7 @@
|
|
|
1825
2001
|
"assignments"
|
|
1826
2002
|
],
|
|
1827
2003
|
"properties": {
|
|
2004
|
+
"hitl": { "$ref": "#/definitions/HitlPolicy" },
|
|
1828
2005
|
"version": {
|
|
1829
2006
|
"const": "1"
|
|
1830
2007
|
},
|