@rosthq/cli 0.7.62 → 0.7.64
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-manifest.d.ts","sourceRoot":"","sources":["../../src/generated/command-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,oBAAoB,
|
|
1
|
+
{"version":3,"file":"command-manifest.d.ts","sourceRoot":"","sources":["../../src/generated/command-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,oBAAoB,EAyO3D,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -37801,6 +37801,240 @@ import { readFileSync } from "node:fs";
|
|
|
37801
37801
|
import { dirname, join } from "node:path";
|
|
37802
37802
|
import { fileURLToPath } from "node:url";
|
|
37803
37803
|
|
|
37804
|
+
// ../../packages/protocol/src/cron.ts
|
|
37805
|
+
var uintPattern = /^\d+$/;
|
|
37806
|
+
var CRON_FIELD_SPECS = [
|
|
37807
|
+
{ name: "minute", min: 0, max: 59 },
|
|
37808
|
+
{ name: "hour", min: 0, max: 23 },
|
|
37809
|
+
{ name: "day-of-month", min: 1, max: 31 },
|
|
37810
|
+
{ name: "month", min: 1, max: 12 },
|
|
37811
|
+
{ name: "day-of-week", min: 0, max: 7 }
|
|
37812
|
+
];
|
|
37813
|
+
var CRON_FIELD_COUNT = CRON_FIELD_SPECS.length;
|
|
37814
|
+
function parseCronField(raw, spec) {
|
|
37815
|
+
const parts = raw.split(",");
|
|
37816
|
+
const terms = [];
|
|
37817
|
+
for (const part of parts) {
|
|
37818
|
+
const token = part.trim();
|
|
37819
|
+
if (token.length === 0) {
|
|
37820
|
+
return { ok: false, reason: "empty value in list" };
|
|
37821
|
+
}
|
|
37822
|
+
if (token === "*") {
|
|
37823
|
+
terms.push({ kind: "all" });
|
|
37824
|
+
continue;
|
|
37825
|
+
}
|
|
37826
|
+
if (token.startsWith("*/")) {
|
|
37827
|
+
const stepText = token.slice(2);
|
|
37828
|
+
if (!uintPattern.test(stepText)) {
|
|
37829
|
+
return { ok: false, reason: `"${token}" is not a valid step` };
|
|
37830
|
+
}
|
|
37831
|
+
const step = Number(stepText);
|
|
37832
|
+
if (step < 1 || step > spec.max) {
|
|
37833
|
+
return { ok: false, reason: `step in "${token}" must be between 1 and ${spec.max}` };
|
|
37834
|
+
}
|
|
37835
|
+
terms.push({ kind: "step", step });
|
|
37836
|
+
continue;
|
|
37837
|
+
}
|
|
37838
|
+
if (token.includes("-")) {
|
|
37839
|
+
const segments = token.split("-");
|
|
37840
|
+
if (segments.length !== 2 || !uintPattern.test(segments[0] ?? "") || !uintPattern.test(segments[1] ?? "")) {
|
|
37841
|
+
return { ok: false, reason: `"${token}" is not a valid range` };
|
|
37842
|
+
}
|
|
37843
|
+
const start = Number(segments[0]);
|
|
37844
|
+
const end = Number(segments[1]);
|
|
37845
|
+
if (start < spec.min || end > spec.max || start > end) {
|
|
37846
|
+
return { ok: false, reason: `range "${token}" must be within ${spec.min}-${spec.max} and ascending` };
|
|
37847
|
+
}
|
|
37848
|
+
terms.push({ kind: "range", start, end });
|
|
37849
|
+
continue;
|
|
37850
|
+
}
|
|
37851
|
+
if (uintPattern.test(token)) {
|
|
37852
|
+
const value = Number(token);
|
|
37853
|
+
if (value < spec.min || value > spec.max) {
|
|
37854
|
+
return { ok: false, reason: `"${token}" must be between ${spec.min} and ${spec.max}` };
|
|
37855
|
+
}
|
|
37856
|
+
terms.push({ kind: "value", value });
|
|
37857
|
+
continue;
|
|
37858
|
+
}
|
|
37859
|
+
return { ok: false, reason: `"${token}" is not a supported cron token` };
|
|
37860
|
+
}
|
|
37861
|
+
return { ok: true, field: terms };
|
|
37862
|
+
}
|
|
37863
|
+
function parseCronExpression(expression) {
|
|
37864
|
+
const trimmed = expression.trim();
|
|
37865
|
+
if (trimmed.length === 0) {
|
|
37866
|
+
return { ok: false, message: "Schedule must not be empty." };
|
|
37867
|
+
}
|
|
37868
|
+
if (/[\r\n\u2028\u2029]/.test(trimmed)) {
|
|
37869
|
+
return { ok: false, message: "Schedule must be a single-line cron expression." };
|
|
37870
|
+
}
|
|
37871
|
+
if (/[^0-9*/,\t\x20-]/.test(trimmed)) {
|
|
37872
|
+
return { ok: false, message: "Schedule may only contain digits, spaces, and the characters * / , -" };
|
|
37873
|
+
}
|
|
37874
|
+
const rawFields = trimmed.split(/\s+/);
|
|
37875
|
+
if (rawFields.length !== CRON_FIELD_COUNT) {
|
|
37876
|
+
return {
|
|
37877
|
+
ok: false,
|
|
37878
|
+
message: `Schedule must have exactly ${CRON_FIELD_COUNT} fields (minute hour day-of-month month day-of-week); got ${rawFields.length}.`
|
|
37879
|
+
};
|
|
37880
|
+
}
|
|
37881
|
+
const fields = [];
|
|
37882
|
+
for (let i = 0; i < CRON_FIELD_COUNT; i += 1) {
|
|
37883
|
+
const spec = CRON_FIELD_SPECS[i];
|
|
37884
|
+
const result = parseCronField(rawFields[i], spec);
|
|
37885
|
+
if (!result.ok) {
|
|
37886
|
+
return { ok: false, message: `Invalid ${spec.name} field: ${result.reason}.` };
|
|
37887
|
+
}
|
|
37888
|
+
fields.push(result.field);
|
|
37889
|
+
}
|
|
37890
|
+
return { ok: true, cron: { fields } };
|
|
37891
|
+
}
|
|
37892
|
+
var cronExpressionSchema = external_exports.string().trim().min(1).max(120).superRefine((value, ctx) => {
|
|
37893
|
+
if (value.length > 120) {
|
|
37894
|
+
return;
|
|
37895
|
+
}
|
|
37896
|
+
const result = parseCronExpression(value);
|
|
37897
|
+
if (!result.ok) {
|
|
37898
|
+
ctx.addIssue({ code: external_exports.ZodIssueCode.custom, message: result.message });
|
|
37899
|
+
}
|
|
37900
|
+
});
|
|
37901
|
+
|
|
37902
|
+
// ../../packages/protocol/src/model-pricing-registry.ts
|
|
37903
|
+
var providerRouteSchema = external_exports.enum(["direct_anthropic", "gateway_managed", "direct_byok"]);
|
|
37904
|
+
var modelPricingEntrySchema = external_exports.object({
|
|
37905
|
+
// The canonical gateway slug: `provider:model` (dotted). For Anthropic entries
|
|
37906
|
+
// this is `anthropic:<model>`, but Anthropic never actually routes through the
|
|
37907
|
+
// gateway — the entry exists so the registry is the complete authoritative table.
|
|
37908
|
+
slug: external_exports.string().trim().min(1).max(160).regex(/^[a-z0-9-]+:[^\n\r]+$/, "Slug must be `provider:model`."),
|
|
37909
|
+
// Actual serving provider (what `llm_calls.provider` must record — AC #6).
|
|
37910
|
+
provider: external_exports.string().trim().min(1).max(60).regex(/^[a-z0-9-]+$/),
|
|
37911
|
+
// Provider-native model id (what `llm_calls.model` records; what the SDK receives).
|
|
37912
|
+
model: external_exports.string().trim().min(1).max(120).regex(/^[^\n\r]+$/),
|
|
37913
|
+
// ISO instant this price takes effect. Resolution picks the latest entry with
|
|
37914
|
+
// `effectiveFrom <= at` for a given (provider, model).
|
|
37915
|
+
effectiveFrom: external_exports.string().datetime(),
|
|
37916
|
+
// Authoritative token rates (USD per 1M tokens) — what ROST's own cost ledger
|
|
37917
|
+
// records for a call served by this model.
|
|
37918
|
+
inputUsdPerMillion: external_exports.number().nonnegative(),
|
|
37919
|
+
outputUsdPerMillion: external_exports.number().nonnegative(),
|
|
37920
|
+
// True when the provider offers a zero-data-retention tier for this model. When
|
|
37921
|
+
// false, the model is disabled-with-reason on the managed gateway unless a tenant
|
|
37922
|
+
// owner has explicitly unlocked non-ZDR models (§8.1 DECIDED).
|
|
37923
|
+
zdrAvailable: external_exports.boolean(),
|
|
37924
|
+
// True when this model is eligible for the MANAGED gateway path at all.
|
|
37925
|
+
managed: external_exports.boolean(),
|
|
37926
|
+
// DER-1586 billing DATA (carried here, consumed by the money lane): the
|
|
37927
|
+
// customer-facing credit rate (cost-plus-margin) and any per-seat included
|
|
37928
|
+
// allowance override, in USD per 1M tokens / cents. This PR only ships the DATA;
|
|
37929
|
+
// DER-1586 wires the Stripe meter. BYOK is excluded from credits by construction.
|
|
37930
|
+
creditInputUsdPerMillion: external_exports.number().nonnegative(),
|
|
37931
|
+
creditOutputUsdPerMillion: external_exports.number().nonnegative(),
|
|
37932
|
+
includedAllowanceCents: external_exports.number().int().nonnegative().optional(),
|
|
37933
|
+
// Per-model disclosure shown when a non-ZDR model is unlocked (§8.1). Required
|
|
37934
|
+
// exactly when `zdrAvailable` is false.
|
|
37935
|
+
retentionDisclosure: external_exports.string().trim().min(1).max(400).optional()
|
|
37936
|
+
}).strict().refine(
|
|
37937
|
+
// A MANAGED (gateway-eligible) non-ZDR model must carry the disclosure surfaced on
|
|
37938
|
+
// owner-unlock. Anthropic entries are non-ZDR-flagged but managed:false (they never
|
|
37939
|
+
// touch the gateway), so the disclosure is inert for them and not required.
|
|
37940
|
+
(e) => e.zdrAvailable || !e.managed || typeof e.retentionDisclosure === "string",
|
|
37941
|
+
{ message: "A managed non-ZDR model must carry a retentionDisclosure.", path: ["retentionDisclosure"] }
|
|
37942
|
+
);
|
|
37943
|
+
var ANTHROPIC_EFFECTIVE_FROM = "2026-01-01T00:00:00.000Z";
|
|
37944
|
+
var MODEL_PRICING_REGISTRY = Object.freeze([
|
|
37945
|
+
{
|
|
37946
|
+
slug: "anthropic:claude-haiku-4-5",
|
|
37947
|
+
provider: "anthropic",
|
|
37948
|
+
model: "claude-haiku-4-5",
|
|
37949
|
+
effectiveFrom: ANTHROPIC_EFFECTIVE_FROM,
|
|
37950
|
+
inputUsdPerMillion: 1,
|
|
37951
|
+
outputUsdPerMillion: 5,
|
|
37952
|
+
creditInputUsdPerMillion: 1,
|
|
37953
|
+
creditOutputUsdPerMillion: 5,
|
|
37954
|
+
zdrAvailable: false,
|
|
37955
|
+
managed: false
|
|
37956
|
+
},
|
|
37957
|
+
{
|
|
37958
|
+
slug: "anthropic:claude-sonnet-4-6",
|
|
37959
|
+
provider: "anthropic",
|
|
37960
|
+
model: "claude-sonnet-4-6",
|
|
37961
|
+
effectiveFrom: ANTHROPIC_EFFECTIVE_FROM,
|
|
37962
|
+
inputUsdPerMillion: 3,
|
|
37963
|
+
outputUsdPerMillion: 15,
|
|
37964
|
+
creditInputUsdPerMillion: 3,
|
|
37965
|
+
creditOutputUsdPerMillion: 15,
|
|
37966
|
+
zdrAvailable: false,
|
|
37967
|
+
managed: false
|
|
37968
|
+
},
|
|
37969
|
+
{
|
|
37970
|
+
slug: "anthropic:claude-opus-4-8",
|
|
37971
|
+
provider: "anthropic",
|
|
37972
|
+
model: "claude-opus-4-8",
|
|
37973
|
+
effectiveFrom: ANTHROPIC_EFFECTIVE_FROM,
|
|
37974
|
+
inputUsdPerMillion: 15,
|
|
37975
|
+
outputUsdPerMillion: 75,
|
|
37976
|
+
creditInputUsdPerMillion: 15,
|
|
37977
|
+
creditOutputUsdPerMillion: 75,
|
|
37978
|
+
zdrAvailable: false,
|
|
37979
|
+
managed: false
|
|
37980
|
+
},
|
|
37981
|
+
{
|
|
37982
|
+
slug: "anthropic:claude-fable-5",
|
|
37983
|
+
provider: "anthropic",
|
|
37984
|
+
model: "claude-fable-5",
|
|
37985
|
+
effectiveFrom: ANTHROPIC_EFFECTIVE_FROM,
|
|
37986
|
+
inputUsdPerMillion: 25,
|
|
37987
|
+
outputUsdPerMillion: 125,
|
|
37988
|
+
creditInputUsdPerMillion: 25,
|
|
37989
|
+
creditOutputUsdPerMillion: 125,
|
|
37990
|
+
zdrAvailable: false,
|
|
37991
|
+
managed: false
|
|
37992
|
+
},
|
|
37993
|
+
// Non-Anthropic managed exemplar (ZDR-capable). Proves the ZDR-default gateway
|
|
37994
|
+
// path: served through the gateway with zeroDataRetention:true.
|
|
37995
|
+
{
|
|
37996
|
+
slug: "openai:gpt-5.6",
|
|
37997
|
+
provider: "openai",
|
|
37998
|
+
model: "gpt-5.6",
|
|
37999
|
+
effectiveFrom: "2026-07-11T00:00:00.000Z",
|
|
38000
|
+
inputUsdPerMillion: 5,
|
|
38001
|
+
outputUsdPerMillion: 20,
|
|
38002
|
+
creditInputUsdPerMillion: 6.5,
|
|
38003
|
+
creditOutputUsdPerMillion: 26,
|
|
38004
|
+
zdrAvailable: true,
|
|
38005
|
+
managed: true
|
|
38006
|
+
},
|
|
38007
|
+
// Non-Anthropic managed exemplar WITHOUT a zero-retention tier. Proves the
|
|
38008
|
+
// disabled-with-reason + owner-unlock + disclosure behavior (§8.1 DECIDED): it is
|
|
38009
|
+
// refused on the managed path unless a tenant owner has unlocked non-ZDR models.
|
|
38010
|
+
{
|
|
38011
|
+
slug: "xai:grok-4",
|
|
38012
|
+
provider: "xai",
|
|
38013
|
+
model: "grok-4",
|
|
38014
|
+
effectiveFrom: "2026-07-11T00:00:00.000Z",
|
|
38015
|
+
inputUsdPerMillion: 4,
|
|
38016
|
+
outputUsdPerMillion: 16,
|
|
38017
|
+
creditInputUsdPerMillion: 5.2,
|
|
38018
|
+
creditOutputUsdPerMillion: 21,
|
|
38019
|
+
zdrAvailable: false,
|
|
38020
|
+
managed: true,
|
|
38021
|
+
retentionDisclosure: "This provider retains data up to 30 days for abuse monitoring."
|
|
38022
|
+
}
|
|
38023
|
+
]);
|
|
38024
|
+
for (const entry of MODEL_PRICING_REGISTRY) {
|
|
38025
|
+
modelPricingEntrySchema.parse(entry);
|
|
38026
|
+
}
|
|
38027
|
+
function parseModelSlug(model) {
|
|
38028
|
+
const trimmed = model.trim();
|
|
38029
|
+
const idx = trimmed.indexOf(":");
|
|
38030
|
+
if (idx <= 0) {
|
|
38031
|
+
return { provider: "anthropic", model: trimmed, slug: `anthropic:${trimmed}`, dotted: false };
|
|
38032
|
+
}
|
|
38033
|
+
const provider = trimmed.slice(0, idx).toLowerCase();
|
|
38034
|
+
const native = trimmed.slice(idx + 1);
|
|
38035
|
+
return { provider, model: native, slug: `${provider}:${native}`, dotted: true };
|
|
38036
|
+
}
|
|
38037
|
+
|
|
37804
38038
|
// ../../packages/protocol/src/agent-model-config.ts
|
|
37805
38039
|
var agentModelProviderSchema = external_exports.enum(["anthropic"]);
|
|
37806
38040
|
var agentModelEffortSchema = external_exports.enum(["low", "medium", "high", "xhigh", "max"]);
|
|
@@ -37810,7 +38044,21 @@ var agentModelConfigSchema = external_exports.object({
|
|
|
37810
38044
|
model: modelIdSchema,
|
|
37811
38045
|
// Optional effort hint. Omit to use the runtime default for the model.
|
|
37812
38046
|
effort: agentModelEffortSchema.optional()
|
|
37813
|
-
}).strict()
|
|
38047
|
+
}).strict().refine(
|
|
38048
|
+
// DER-1584 (ADR-0019 W2.3, invariant #10): `model` is a free-text id, and the
|
|
38049
|
+
// cloud runtime routes purely off its `provider:model` slug prefix — so a dotted
|
|
38050
|
+
// non-Anthropic slug (e.g. `openai:gpt-5.6`) written here would silently route an
|
|
38051
|
+
// agent onto the managed AI Gateway. Until the brain picker + its owner-gated
|
|
38052
|
+
// enablement ship (DER-1591), NO managed non-Anthropic brain is selectable: reject
|
|
38053
|
+
// any non-Anthropic model id at the config-WRITE boundary. (The runtime keeps its
|
|
38054
|
+
// own fail-closed pricing/ZDR enforcement as defense-in-depth for configs written
|
|
38055
|
+
// out-of-band; DER-1591 relaxes this refine when it adds the vetted enablement path.)
|
|
38056
|
+
(config2) => parseModelSlug(config2.model).provider === "anthropic",
|
|
38057
|
+
{
|
|
38058
|
+
message: "Only Anthropic models can be selected today; managed non-Anthropic brains arrive with the brain picker (DER-1591).",
|
|
38059
|
+
path: ["model"]
|
|
38060
|
+
}
|
|
38061
|
+
);
|
|
37814
38062
|
var AGENT_MODEL_TIERS = ["triage", "balanced", "complex", "hardest"];
|
|
37815
38063
|
var modelCostBandSchema = external_exports.enum(["lowest", "standard", "high", "highest"]);
|
|
37816
38064
|
var modelCatalogEntrySchema = external_exports.object({
|
|
@@ -37923,7 +38171,7 @@ var dryRunTranscriptSchema = external_exports.object({
|
|
|
37923
38171
|
}).strict();
|
|
37924
38172
|
|
|
37925
38173
|
// ../../packages/protocol/src/scrub.ts
|
|
37926
|
-
var SECRET_SHAPED_VALUE = /(sk-ant-|sk-proj-|sk-live-|sk-[A-Za-z0-9_-]{12,}|
|
|
38174
|
+
var SECRET_SHAPED_VALUE = /(rost_mcp_[A-Za-z0-9_-]{20,}|sk-ant-|sk-proj-|sk-live-|sk-[A-Za-z0-9_-]{12,}|gh[opsur]_[A-Za-z0-9_]{12,}|github_pat_[A-Za-z0-9_]{20,}|xox[baoprs]-[A-Za-z0-9-]{10,}|(?:AKIA|ASIA)[0-9A-Z]{16}|BEGIN [A-Z ]*PRIVATE KEY|api[_-]?key\s*=|secret\s*=|password\s*=|authorization:\s*bearer\s+|(?:bearer|basic)\s+[A-Za-z0-9._~+/=-]{20,}|x-api-key\s*:|api[-_ ]?key\s*:\s*\S{3,}|secret\s*:\s*\S{3,}|password\s*:\s*\S{3,}|token\s*:\s*\S{3,})/i;
|
|
37927
38175
|
var SECRET_KEY = /(api[_-]?key|secret|password|token|authorization|credential|private[_-]?key)/i;
|
|
37928
38176
|
function hasSecretShapedContent(value) {
|
|
37929
38177
|
if (typeof value === "string") {
|
|
@@ -38677,7 +38925,7 @@ var agentLifecycleSchema = external_exports.enum([
|
|
|
38677
38925
|
"paused",
|
|
38678
38926
|
"decommissioned"
|
|
38679
38927
|
]);
|
|
38680
|
-
var cronSchema =
|
|
38928
|
+
var cronSchema = cronExpressionSchema;
|
|
38681
38929
|
var agentTemplateListInputSchema = external_exports.object({}).strict();
|
|
38682
38930
|
var agentTemplateSummarySchema = external_exports.object({
|
|
38683
38931
|
slug: external_exports.string().min(1),
|
|
@@ -38785,6 +39033,11 @@ var agentSetupStateSchema = external_exports.object({
|
|
|
38785
39033
|
steward_seat_id: uuidSchema2.nullable(),
|
|
38786
39034
|
steward_chain_resolves_to_human: external_exports.boolean(),
|
|
38787
39035
|
has_occupancy: external_exports.boolean(),
|
|
39036
|
+
// DER-1529: the seat agent's run-time skill-discovery toggle. VISIBILITY only —
|
|
39037
|
+
// it never grants tools (invariant #6). Always present (the column is NOT NULL
|
|
39038
|
+
// default false) so agent_setup.get / .update round-trip the current value back
|
|
39039
|
+
// to any client; conservative default false (#10).
|
|
39040
|
+
skill_discovery_enabled: external_exports.boolean(),
|
|
38788
39041
|
tool_decisions: external_exports.array(agentSetupToolDecisionSchema),
|
|
38789
39042
|
available_skill_recommendations: external_exports.array(agentSetupSkillRecommendationSchema),
|
|
38790
39043
|
assigned_skills: external_exports.array(skillAssignmentSummarySchema),
|
|
@@ -38816,9 +39069,12 @@ var agentSetupUpdateInputSchema = external_exports.object({
|
|
|
38816
39069
|
// DER-787 (H1): set the structured model selection for this agent.
|
|
38817
39070
|
model_config: agentModelConfigSchema.optional(),
|
|
38818
39071
|
answers: external_exports.array(external_exports.string().min(1).max(2e3)).max(20).optional(),
|
|
38819
|
-
tool_decisions: external_exports.array(agentSetupToolUpdateSchema).max(50).optional()
|
|
39072
|
+
tool_decisions: external_exports.array(agentSetupToolUpdateSchema).max(50).optional(),
|
|
39073
|
+
// DER-1529: toggle run-time skill discovery (visibility only; never grants
|
|
39074
|
+
// tools). Settable any time, including on a live agent.
|
|
39075
|
+
skill_discovery_enabled: external_exports.boolean().optional()
|
|
38820
39076
|
}).strict().refine(
|
|
38821
|
-
(value) => value.parent_seat_id !== void 0 || value.steward_seat_id !== void 0 || value.lane !== void 0 || value.schedule_cron !== void 0 || value.model_config !== void 0 || value.answers !== void 0 || value.tool_decisions !== void 0,
|
|
39077
|
+
(value) => value.parent_seat_id !== void 0 || value.steward_seat_id !== void 0 || value.lane !== void 0 || value.schedule_cron !== void 0 || value.model_config !== void 0 || value.answers !== void 0 || value.tool_decisions !== void 0 || value.skill_discovery_enabled !== void 0,
|
|
38822
39078
|
"Provide at least one field to update."
|
|
38823
39079
|
);
|
|
38824
39080
|
var agentUpdateScheduleInputSchema = external_exports.object({
|
|
@@ -39219,6 +39475,11 @@ var storedConfirmationPolicySchema = external_exports.object({
|
|
|
39219
39475
|
cli_mode: cliConfirmationModeSchema
|
|
39220
39476
|
}).strict();
|
|
39221
39477
|
|
|
39478
|
+
// ../../packages/protocol/src/model-gateway-policy.ts
|
|
39479
|
+
var storedModelGatewayPolicySchema = external_exports.object({
|
|
39480
|
+
allow_non_zdr_models: external_exports.boolean()
|
|
39481
|
+
}).strict();
|
|
39482
|
+
|
|
39222
39483
|
// ../../packages/protocol/src/aicos.ts
|
|
39223
39484
|
var uuidSchema5 = external_exports.string().uuid();
|
|
39224
39485
|
var jsonObjectSchema = external_exports.record(external_exports.string(), external_exports.unknown());
|
|
@@ -41208,6 +41469,7 @@ var MCP_ONBOARDING_TOOL_NAMES = {
|
|
|
41208
41469
|
};
|
|
41209
41470
|
var FORGE_TURN_HARD_CEILING_SECONDS = 30 * 60;
|
|
41210
41471
|
var FORGE_TURN_PHASE_OVERHEAD_SECONDS = 20 * 60;
|
|
41472
|
+
var SEAT_MCP_CLAIM_TOKEN_TTL_SECONDS = (FORGE_TURN_HARD_CEILING_SECONDS + FORGE_TURN_PHASE_OVERHEAD_SECONDS) * 2;
|
|
41211
41473
|
|
|
41212
41474
|
// ../../packages/protocol/src/mcp-onboarding.ts
|
|
41213
41475
|
var MCP_TOKEN_ABSOLUTE_MAX_EXPIRY_MS = (MCP_TOKEN_NO_EXPIRY_SENTINEL_DAYS + 1) * 24 * 60 * 60 * 1e3;
|
|
@@ -42181,6 +42443,11 @@ var errorLogSupersedeOutputSchema = external_exports.object({
|
|
|
42181
42443
|
resolved_at: isoDateTime3
|
|
42182
42444
|
}).strict();
|
|
42183
42445
|
|
|
42446
|
+
// ../../packages/protocol/src/run-summary.ts
|
|
42447
|
+
var runSummaryOutputSchema = external_exports.object({
|
|
42448
|
+
summary: external_exports.string().min(1).max(140)
|
|
42449
|
+
});
|
|
42450
|
+
|
|
42184
42451
|
// ../../packages/protocol/src/runner-settings.ts
|
|
42185
42452
|
var uuid8 = external_exports.string().uuid();
|
|
42186
42453
|
var isoDateTime4 = external_exports.string().datetime({ offset: true });
|
|
@@ -42461,6 +42728,16 @@ var confirmationPolicyGetOutputSchema = external_exports.object({
|
|
|
42461
42728
|
var confirmationPolicyUpdateInputSchema = external_exports.object({
|
|
42462
42729
|
cli_mode: cliConfirmationModeSchema
|
|
42463
42730
|
}).strict();
|
|
42731
|
+
var modelGatewayPolicyDtoSchema = external_exports.object({
|
|
42732
|
+
allow_non_zdr_models: external_exports.boolean(),
|
|
42733
|
+
explicit: external_exports.boolean()
|
|
42734
|
+
}).strict();
|
|
42735
|
+
var modelGatewayPolicyUpdateInputSchema = external_exports.object({
|
|
42736
|
+
allow_non_zdr_models: external_exports.boolean()
|
|
42737
|
+
}).strict();
|
|
42738
|
+
var modelGatewayPolicyUpdateOutputSchema = external_exports.object({
|
|
42739
|
+
model_gateway_policy: modelGatewayPolicyDtoSchema
|
|
42740
|
+
}).strict();
|
|
42464
42741
|
var tenantSpendStatusSchema = external_exports.object({
|
|
42465
42742
|
spend_usd: external_exports.string(),
|
|
42466
42743
|
soft_cap_usd: external_exports.string().nullable(),
|
|
@@ -44025,6 +44302,23 @@ var softwareVercelDeployPreviewOutputSchema = external_exports.object({
|
|
|
44025
44302
|
status: softwareVercelDeploymentStatusSchema
|
|
44026
44303
|
});
|
|
44027
44304
|
|
|
44305
|
+
// ../../packages/protocol/src/software-factory-events.ts
|
|
44306
|
+
var uuid11 = external_exports.string().uuid();
|
|
44307
|
+
var softwareFactoryPhaseRunCompletedEventSchema = external_exports.object({
|
|
44308
|
+
tenantId: uuid11,
|
|
44309
|
+
phaseRunId: uuid11,
|
|
44310
|
+
buildRequestId: uuid11.nullish(),
|
|
44311
|
+
status: external_exports.enum(["passed", "failed"]),
|
|
44312
|
+
idempotencyKey: external_exports.string().min(1).optional()
|
|
44313
|
+
}).strict();
|
|
44314
|
+
var softwareFactoryBudgetExhaustedEventSchema = external_exports.object({
|
|
44315
|
+
tenantId: uuid11,
|
|
44316
|
+
phaseRunId: uuid11,
|
|
44317
|
+
buildRequestId: uuid11,
|
|
44318
|
+
reason: external_exports.string().min(1),
|
|
44319
|
+
idempotencyKey: external_exports.string().min(1).optional()
|
|
44320
|
+
}).strict();
|
|
44321
|
+
|
|
44028
44322
|
// ../../packages/protocol/src/sync-brief.ts
|
|
44029
44323
|
var uuidSchema15 = external_exports.string().uuid();
|
|
44030
44324
|
var dateSchema = external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/);
|
|
@@ -45022,7 +45316,7 @@ Treat AICOS as a coordinator over the operating system. It can become more usefu
|
|
|
45022
45316
|
order: 20,
|
|
45023
45317
|
title: "Responsibility Graph playbook",
|
|
45024
45318
|
summary: "How to build a functions-first graph with seats, owners, Stewards, vacancies, and clean authority.",
|
|
45025
|
-
version: "2026-07-10.
|
|
45319
|
+
version: "2026-07-10.2",
|
|
45026
45320
|
public: true,
|
|
45027
45321
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
45028
45322
|
stages: ["graph_design", "staffing"],
|
|
@@ -45101,7 +45395,7 @@ The graph also carries a mission-control panel. It pulls the same operational st
|
|
|
45101
45395
|
|
|
45102
45396
|
A staffed non-AICOS agent's seat page uses one profile shell with eight URL-addressable tabs: **Overview**, **Charter**, **Tools & connections**, **Skills**, **Autonomy**, **Signals**, **Activity**, and **Settings**. The hero shows status, Charter purpose, Steward, seat path, lane, model, and last run. The sidebar keeps access, connection, tool/Skill/Signal/escalation/Charter counters, and schedule facts visible while the tabs organize the existing read models and controls. Legacy links such as \`#agent-ops\`, \`#recent-runs\`, and \`#run-<id>\` select the matching Settings or Activity tab. Human seats and the AICOS foundation seat keep their dedicated pages. Members without sensitive-data access see the same shell with explicit unavailable states for run, tool-call, cost, connection-status, and escalation facts; the page never broadens Trust Card access or turns an unavailable read into a confident empty/disconnected claim.
|
|
45103
45397
|
|
|
45104
|
-
Agent creation at \`/agents/new\` begins with four doors: **Describe the job** opens the existing in-app builder, **Start from a template** opens the stock-template picker, **Build manually** opens the custom setup path, and **Import** opens an in-app format explainer. Definition-file import is roadmap-only and never opens a bare file picker; operators can instead continue to the existing-agent pairing flow. Existing \`?mode=template|custom|existing\` and \`?seat=\` resume
|
|
45398
|
+
Agent creation at \`/agents/new\` begins with four doors: **Describe the job** opens the existing in-app builder, **Start from a template** opens the stock-template picker, **Build manually** opens the custom setup path, and **Import** opens an in-app format explainer. Definition-file import is roadmap-only and never opens a bare file picker; operators can instead continue to the existing-agent pairing flow. Setup is the detail page filling in: creating a seat from any door hands off to that agent's detail page in draft mode (\`/seats/{seatId}\`), where numbered setup tabs and a shared go-live gate rail complete the draft \u2014 there is no separate multi-step wizard. Existing \`?mode=template|custom|existing\` links open the matching door, and a \`?seat=\` resume link redirects straight to the draft detail page.
|
|
45105
45399
|
|
|
45106
45400
|
## Review an agent seat's delivered work
|
|
45107
45401
|
|
|
@@ -45420,7 +45714,7 @@ For CLI and MCP setup, read agent-skill-setup-guide before adding or assigning S
|
|
|
45420
45714
|
order: 42,
|
|
45421
45715
|
title: "Design a custom agent",
|
|
45422
45716
|
summary: "How to build a custom agent from operational questions through the Charter Builder, tools, dry run, and go-live without writing prompts.",
|
|
45423
|
-
version: "2026-07-
|
|
45717
|
+
version: "2026-07-10.1",
|
|
45424
45718
|
public: true,
|
|
45425
45719
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
45426
45720
|
stages: ["staffing", "charter_design"],
|
|
@@ -45466,7 +45760,7 @@ Then choose one of three named triggers:
|
|
|
45466
45760
|
- **Scheduled** \u2014 runs on a recurring cadence you pick (every weekday morning, every morning, weekly, hourly). No cron to write.
|
|
45467
45761
|
- **Event** \u2014 runs in response to work routed to it, like a sync or a mention, rather than on a clock.
|
|
45468
45762
|
|
|
45469
|
-
Open **Advanced** for the explicit lane select and a raw cron expression when you need a custom cadence. The same schedule presets appear on the agent's seat page after go-live (Agent operations \u2192 Run schedule).
|
|
45763
|
+
Open **Advanced** for the explicit lane select and a raw cron expression when you need a custom cadence. A raw schedule is a five-field UTC cron \u2014 \`minute hour day-of-month month day-of-week\` \u2014 supporting \`*\`, \`*/N\` steps, \`A-B\` ranges, and comma lists (for example \`0 9 * * 1-5\`). Day-of-week is 0\u20137 where both 0 and 7 mean Sunday. It is validated when you save: an unsupported or out-of-range expression is rejected with a field-level error rather than saved as a schedule that never runs, and the builder previews the next run in UTC. When both day-of-month and day-of-week are set, a run fires only when both match. The same schedule presets appear on the agent's seat page after go-live (Agent operations \u2192 Run schedule).
|
|
45470
45764
|
|
|
45471
45765
|
## Configure tools and credentials
|
|
45472
45766
|
|
|
@@ -45830,7 +46124,7 @@ External connectors are being rolled out provider by provider, conservatively (r
|
|
|
45830
46124
|
order: 48,
|
|
45831
46125
|
title: "CLI and MCP installation guide",
|
|
45832
46126
|
summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
|
|
45833
|
-
version: "2026-07-
|
|
46127
|
+
version: "2026-07-11.1",
|
|
45834
46128
|
public: true,
|
|
45835
46129
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
45836
46130
|
stages: ["company_setup", "staffing"],
|
|
@@ -46297,6 +46591,7 @@ The signed-in app exposes the same Skill command surface at **Skills**, linked f
|
|
|
46297
46591
|
| \`{{cli}} system health\` | \`system.health\` | Read the scoped system-health snapshot across agent runs, unresolved errors, Signals, Cascade setup, work loop, integrations, runners, notifications, and Sync Brief readiness. | Tenant, member, or seat token | \`{{cli}} system health --json\`; \`{{cli}} system health --seat <id> --json\` |
|
|
46298
46592
|
| \`{{cli}} command usage.report|usage.snapshot\` | \`usage.report\`, \`usage.snapshot\` | Read the AI-workforce ROI report (per-period agent turns, token/run cost, human-accepted value, exceptions, approvals) from immutable usage snapshots, and freeze a period's totals into a new snapshot (insert-only, idempotent). | Tenant | \`{{cli}} command usage.report --json\`; \`{{cli}} command usage.snapshot --json\` |
|
|
46299
46593
|
| \`{{cli}} settings get|update|product-learning|agent-policy|confirmation-mode|rename\` | \`settings.get\`, \`settings.update\`, \`settings.product_learning.get\`, \`settings.product_learning.update\`, \`settings.agent_policy.get\`, \`settings.agent_policy.update\`, \`settings.confirmation_policy.get\`, \`settings.confirmation_policy.update\`, \`tenant.rename\` | Read tenant settings, update budget caps, read or update product-learning participation, read or set the company autonomy ceiling, read or set the CLI confirmation mode, and rename the company. Budget, product-learning, and policy updates stop at human confirmation in non-interactive CLI/MCP sessions; company rename is owner-only and human-gated. | Tenant / Tenant-admin for updates | \`{{cli}} settings product-learning get --json\`; \`{{cli}} settings agent-policy get --json\`; \`{{cli}} settings confirmation-mode get --json\`; \`{{cli}} settings rename --company "Acme Operations"\` |
|
|
46594
|
+
| \`{{cli}} command tenant.model_gateway_policy.update\` | \`tenant.model_gateway_policy.update\` | Unlock or relock managed models that lack a zero-retention (ZDR) tier (ADR-0019). Locked (default) restricts the AI Gateway to zero-retention-eligible managed models. Owner-only and human-gated; unlocking establishes an ADR-0018 \xA76 standing authorization and surfaces a per-model retention disclosure. | Tenant-admin | \`{{cli}} command tenant.model_gateway_policy.update --json '{"allow_non_zdr_models":true}'\` |
|
|
46300
46595
|
| \`{{cli}} member invite|update|remove\` | \`member.invite\`, \`member.update\`, \`member.remove\` | Manage tenant members; execution requires an owner or admin membership. | Tenant | \`{{cli}} member invite --email ops@example.com --role member\` |
|
|
46301
46596
|
| \`{{cli}} agent templates|create|setup|tools|dry-run|go-live|status|run-now|fleet-digest|get-run|show\` | \`agent_template.list\`, \`agent.create_from_template\`, \`agent.create_custom\`, \`agent_setup.get\`, \`agent_setup.update\`, \`agent.configure_tools\`, \`agent.run_dry_run\`, \`agent.go_live\`, \`agent.status\`, \`agent.run_now\`, \`agent.fleet_digest\`, \`agent.get_run\`, \`agent.show_markdown\` | Run the full agent setup and operation flow: list templates, create a draft from a template or guided custom answers (with \`--model\` and \`--effort\`), read or answer setup state, connect or decline tools, dry-run, go live, run on demand, capture the fleet-health digest, read one run's transcript/error diagnostics, and show a markdown readout. Human CLI dry-runs print the rehearsal transcript and, when present, the per-tool preview labels (\`Would run\`, \`Blocked\`, \`Escalated\`) before go-live. Create and go-live stop at human gates; the dry-run is ungated by human approval but requires a signed manifest first. | Tenant and seat | \`{{cli}} agent fleet-digest --json\` |
|
|
46302
46597
|
| \`{{cli}} tools list\` | \`tool.catalog\` | List the discoverable tool catalog the builder reads (id, scope tiers, credential requirement, access policy, and execution-boundary guidance). | Tenant | \`{{cli}} tools list --json\` |
|
|
@@ -46437,7 +46732,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
|
|
|
46437
46732
|
| \`rost_create_agent_from_template\` | \`agent.create_from_template\` | Create a draft stock agent and draft Charter from a template (draft-only; occupancy needs a human steward). | Tenant | Call with \`seat_id\` and \`template_slug\`; expect human confirmation. |
|
|
46438
46733
|
| \`rost_start_agent_setup\` | \`agent_setup.start\` | Start an agent setup draft for template, custom, or existing mode. | Tenant | Call with \`mode\` and seat placement. |
|
|
46439
46734
|
| \`rost_get_agent_setup\` | \`agent_setup.get\` | Read agent setup state, blockers, and next action. | Seat or tenant-admin | Call with \`{"setup_id":"<id>"}\`. |
|
|
46440
|
-
| \`rost_update_agent_setup\` | \`agent_setup.update\` | Update parent, steward, lane, schedule, or
|
|
46735
|
+
| \`rost_update_agent_setup\` | \`agent_setup.update\` | Update parent, steward, lane, schedule, answers, or skill discovery on a setup draft. | Tenant | Call with \`setup_id\` and the fields to change. |
|
|
46441
46736
|
| \`rost_update_agent_schedule\` | \`agent.update_schedule\` | Update a draft or live agent's scheduled execution. | Tenant | Call with \`agent_id\` and \`schedule_cron\`; expect human confirmation. |
|
|
46442
46737
|
| \`rost_decommission_agent\` | \`agent.decommission\` | Retire an agent occupancy safely (no-orphan guarded). | Tenant | Call with \`agent_id\`; expect human confirmation. |
|
|
46443
46738
|
| \`rost_pause_agent\` | \`agent.pause\` | Pause a live agent so it stops scheduled and on-demand runs; reversible. | Tenant | Call with \`seat_id\`; expect human confirmation. |
|
|
@@ -46481,6 +46776,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
|
|
|
46481
46776
|
| \`rost_set_company_autonomy_ceiling\` | \`settings.agent_policy.update\` | Set the company autonomy ceiling. | Tenant-admin | Owner-only, human-gated; call with \`{"profile":"locked_down"}\` (or \`balanced\`/\`high_autonomy\`, or \`{"profile":"custom","max_autonomous_risk":"high"}\`). Enforced by default. |
|
|
46482
46777
|
| \`rost_get_cli_confirmation_mode\` | \`settings.confirmation_policy.get\` | Read the CLI confirmation mode: \`careful\` (the strict default \u2014 the CLI cannot silently auto-approve a pending confirmation) or \`trusted_operator\` (an owner opt-in). | Tenant | Call with \`{}\`; metadata only. |
|
|
46483
46778
|
| \`rost_set_cli_confirmation_mode\` | \`settings.confirmation_policy.update\` | Set the CLI confirmation mode. | Tenant-admin | Owner-only, human-gated; call with \`{"cli_mode":"trusted_operator"}\` (or \`{"cli_mode":"careful"}\`). Choosing \`trusted_operator\` establishes an ADR-0018 \xA76 standing authorization; a \`dangerous\`-risk confirmation always requires interactive human review in either mode. |
|
|
46779
|
+
| \`rost_update_model_gateway_policy\` | \`tenant.model_gateway_policy.update\` | Unlock or relock managed models that lack a zero-retention (ZDR) tier. | Tenant-admin | Owner-only, human-gated; call with \`{"allow_non_zdr_models":true}\` (or \`false\` to relock). Unlocking establishes an ADR-0018 \xA76 standing authorization and surfaces a per-model retention disclosure. |
|
|
46484
46780
|
| \`rost_get_aicos_brain_settings\` | \`aicos.brain_settings.get\` | Read AICOS lane and brain labels for cloud managed/BYOK, runner Claude/Codex, and MCP client. | Tenant | Call with \`{}\`; returns enum labels only, never keys, vault refs, or runner secrets. |
|
|
46485
46781
|
| \`rost_update_aicos_brain_settings\` | \`aicos.brain_settings.update\` | Update AICOS lane and cloud/runner brain preferences. | Tenant-admin | Owner-only and human-gated; call with \`{"lane":"runner","runner_brain":"claude-cli"}\` or \`{"cloud_brain":"byok"}\`. BYOK requires an active tenant Anthropic key. For AICOS, selecting \`codex-cli\` is currently rejected until the governed interactive runner path is verified. |
|
|
46486
46782
|
| \`rost_list_signals\` | \`signal.list\` | List measurables with their latest reading and on/off-track state. | Seat or tenant-admin | Call with \`{}\` to find measurable ids. |
|
|
@@ -47443,7 +47739,7 @@ Keep agent scope tight at first. Approve more autonomy only after evidence. Use
|
|
|
47443
47739
|
order: 71,
|
|
47444
47740
|
title: "Confirmations and human gates guide",
|
|
47445
47741
|
summary: "How {{brand}} routes authority-changing work through human confirmation, and why agents never approve their own requests.",
|
|
47446
|
-
version: "2026-07-
|
|
47742
|
+
version: "2026-07-11.1",
|
|
47447
47743
|
public: true,
|
|
47448
47744
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
47449
47745
|
stages: ["graph_design", "charter_design", "staffing", "operating_rhythm"],
|
|
@@ -47470,7 +47766,7 @@ Keep agent scope tight at first. Approve more autonomy only after evidence. Use
|
|
|
47470
47766
|
- \`none\`: no confirmation gate \u2014 the command never returns a pending confirmation. Most are reads or reversible drafts an agent can run directly, including over MCP (graph reads, \`charter.draft\`, \`status.record\`, \`sync.brief.compile\`, \`sync.run.start\`, \`task.complete\`). A few \`none\` commands still require a human actor or an interactive channel \u2014 \`confirmation.approve\` is \`none\` (approving a gate cannot itself be gated) yet runs only as a human in the UI or CLI \u2014 so \`none\` means "no confirmation gate", not always "agent-callable".
|
|
47471
47767
|
- \`human_required\`: a human must approve. Structural, staffing, resolution, tenant profile, and go-live commands (\`seat.reparent\`, \`charter.approve\`, \`goal.reparent\`, \`friction.resolve\`, \`agent.go_live\`, \`mcp_token.create\`, \`tenant.rename\`).
|
|
47472
47768
|
- \`credential_flow\`: routes through the vault-backed credential path so a secret is captured as a vault reference, never stored or logged in the clear (\`credential.ingress\`, \`tenant.anthropic_key.save\`; \`agent.configure_tools\` is \`credential_flow\` too \u2014 it stages credential-ingress requests through the same path without ever taking raw secret material).
|
|
47473
|
-
- \`dangerous\`: the highest-risk human gate. Only
|
|
47769
|
+
- \`dangerous\`: the highest-risk human gate. Only three commands carry it \u2014 \`settings.update\`, \`agent.decommission\`, and \`tenant.model_gateway_policy.update\` (unlocking managed models without a zero-retention tier \u2014 a reviewed act even under \`trusted_operator\`).
|
|
47474
47770
|
|
|
47475
47771
|
The \`dangerous\` confirmation **level** is rare and is not the same as the **risk badge** a pending confirmation can display. The badge shows "dangerous" whenever a command's confirmation level is \`dangerous\` **or** the command redacts secrets (its audit redaction is \`secret_strict\`), so a \`credential_flow\` command such as \`credential.ingress\` shows the dangerous badge while still gating through the credential path \u2014 not the \`dangerous\` level. Read the badge as "handle with care" and the confirmation level as "who must approve". \`confirmation.approve\` and \`confirmation.reject\` are themselves \`none\` \u2014 approving a gate cannot itself require approval.
|
|
47476
47772
|
|
|
@@ -47607,11 +47903,11 @@ Do not claim that a live charge happened unless Stripe test/live evidence proves
|
|
|
47607
47903
|
order: 72,
|
|
47608
47904
|
title: "Settings guide",
|
|
47609
47905
|
summary: "How to use Settings as the control plane for company access, channels, providers, tokens, and operating defaults.",
|
|
47610
|
-
version: "2026-07-
|
|
47906
|
+
version: "2026-07-11.1",
|
|
47611
47907
|
public: true,
|
|
47612
47908
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
47613
47909
|
stages: ["company_setup", "staffing"],
|
|
47614
|
-
relatedCommandIds: ["onboarding.create_invite", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "integration.list", "integration.readiness", "integration.status", "integration.test", "settings.get", "settings.update", "tenant.rename", "settings.sync_brief_scope.get", "settings.sync_brief_scope.update", "settings.product_learning.get", "settings.product_learning.update", "settings.agent_policy.get", "settings.agent_policy.update", "settings.confirmation_policy.get", "settings.confirmation_policy.update", "aicos.brain_settings.get", "aicos.brain_settings.update"],
|
|
47910
|
+
relatedCommandIds: ["onboarding.create_invite", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "integration.list", "integration.readiness", "integration.status", "integration.test", "settings.get", "settings.update", "tenant.rename", "settings.sync_brief_scope.get", "settings.sync_brief_scope.update", "settings.product_learning.get", "settings.product_learning.update", "settings.agent_policy.get", "settings.agent_policy.update", "settings.confirmation_policy.get", "settings.confirmation_policy.update", "tenant.model_gateway_policy.update", "aicos.brain_settings.get", "aicos.brain_settings.update"],
|
|
47615
47911
|
legal: { publicRisk: "low", notes: ["{{brand}}-native settings guidance."] },
|
|
47616
47912
|
sources: [
|
|
47617
47913
|
{
|
|
@@ -47646,6 +47942,7 @@ Section state is fully server-side: every in-app link, redirect, and save uses \
|
|
|
47646
47942
|
- Stored credentials (vault references only) and tool access approvals.
|
|
47647
47943
|
- Operating defaults, including Sync Brief scope.
|
|
47648
47944
|
- Product-learning participation for bounded product analytics.
|
|
47945
|
+
- Model gateway policy: whether managed runs may use a non-zero-retention model.
|
|
47649
47946
|
|
|
47650
47947
|
Settings lifecycle timestamps are display metadata for tokens, connected machines, integrations, and stored credentials. They may be emitted by the database as either timestamp values or strings, but Settings renders them as safe labels rather than treating timestamp formatting failures as page-level failures.
|
|
47651
47948
|
|
|
@@ -47710,6 +48007,15 @@ The CLI confirmation mode is a separate tenant-wide dial. It does not change wha
|
|
|
47710
48007
|
- Read it with \`settings.confirmation_policy.get\` (CLI: \`{{cli}} settings confirmation-mode get\`). Set it with \`settings.confirmation_policy.update\` (CLI: \`{{cli}} settings confirmation-mode set --mode trusted_operator\`). Owner-only and human-gated.
|
|
47711
48008
|
- Stored at \`tenants.settings.confirmation_policy\`; enforced server-side in \`confirmation.approve\`, so a stale or modified local CLI cannot bypass it.
|
|
47712
48009
|
|
|
48010
|
+
## Model gateway policy
|
|
48011
|
+
|
|
48012
|
+
The model gateway policy is a separate tenant-wide dial (ADR-0019) that controls whether the AI Gateway may route a managed run to a provider model that lacks a zero-retention (ZDR) tier.
|
|
48013
|
+
|
|
48014
|
+
- \`allow_non_zdr_models: false\` is the conservative default for every company. The gateway restricts managed runs to zero-retention-eligible models.
|
|
48015
|
+
- Unlocking is a deliberate tenant_admin opt-in (an ADR-0018 \xA76 standing authorization): it lets managed brains without a zero-retention tier run, disclosed up front \u2014 the provider retains data up to 30 days for abuse monitoring.
|
|
48016
|
+
- Set it with \`tenant.model_gateway_policy.update\` (call with \`{"allow_non_zdr_models":true}\` or \`{"allow_non_zdr_models":false}\`). Owner-only and human-gated.
|
|
48017
|
+
- Stored at \`tenants.settings.model_gateway_policy\`; enforced server-side in the AI Gateway inference-policy resolver, so a stale or modified local client cannot bypass it. The model-picker UI that surfaces this choice inline ships separately.
|
|
48018
|
+
|
|
47713
48019
|
## Agent guidance
|
|
47714
48020
|
|
|
47715
48021
|
Agents may explain which setting is needed and why. They should not ask users to paste secrets into chat or tool arguments. When credentials are required, route the user to the vault-backed setup flow.`
|
|
@@ -49676,7 +49982,7 @@ var COMMAND_MANIFEST = [
|
|
|
49676
49982
|
{ "id": "agent_setup.get", "namespace": "agent_setup", "action": "get", "title": "Get agent setup", "description": "Read the resumable agent-setup state: mode, parent, steward, template, lane, schedule, tool decisions, dry run, and next action.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "setup_id", "flag": "setup-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Read the resumable setup state: mode, parent, steward, lane, schedule, tool decisions, dry-run blockers, and the next action." },
|
|
49677
49983
|
{ "id": "agent_setup.relane", "namespace": "agent_setup", "action": "relane", "title": "Re-lane a live agent", "description": "Governed re-lane of a live agent: pause, move to the new lane, force a fresh dry-run rehearsal on that lane, then go live. Owner-only and human-gated; records a rationale.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "lane", "flag": "lane", "type": "enum", "required": true, "enumValues": ["cloud", "mcp_session", "runner"] }, { "name": "reason", "flag": "reason", "type": "string", "required": true }], "hasComplexInput": false, "help": "Re-lane a live agent (cloud / runner / mcp_session): it pauses, moves to the new lane, forces a fresh dry-run rehearsal on that lane, then goes live \u2014 owner-only, human-gated, with a required rationale. A runner target needs a paired runner; a failed rehearsal leaves the agent paused on the new lane." },
|
|
49678
49984
|
{ "id": "agent_setup.start", "namespace": "agent_setup", "action": "start", "title": "Start agent setup", "description": "Start (or resume) a draft agent setup for a seat in template, custom, or existing mode.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "mode", "flag": "mode", "type": "enum", "required": true, "enumValues": ["template", "custom", "existing"] }, { "name": "template_slug", "flag": "template-slug", "type": "string", "required": false }], "hasComplexInput": false, "help": "Start a draft agent setup from a template, custom, or existing mode; the setup resumes from the draft agent and Charter, not a fresh start." },
|
|
49679
|
-
{ "id": "agent_setup.update", "namespace": "agent_setup", "action": "update", "title": "Update agent setup", "description": "Update the draft agent's parent, steward, lane, schedule, operational answers, and tool decisions.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "parent_seat_id", "flag": "parent-seat-id", "type": "string", "required": false }, { "name": "steward_seat_id", "flag": "steward-seat-id", "type": "string", "required": false }, { "name": "lane", "flag": "lane", "type": "enum", "required": false, "enumValues": ["cloud", "mcp_session", "runner"] }, { "name": "schedule_cron", "flag": "schedule-cron", "type": "string", "required": false }, { "name": "answers", "flag": "answers", "type": "array", "required": false, "itemType": "string" }], "hasComplexInput": true, "help": "Update parent, steward, lane, schedule, answers, or tool decisions on the draft; steward and parent changes keep the no-orphan chain explicit." },
|
|
49985
|
+
{ "id": "agent_setup.update", "namespace": "agent_setup", "action": "update", "title": "Update agent setup", "description": "Update the draft agent's parent, steward, lane, schedule, operational answers, and tool decisions.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "parent_seat_id", "flag": "parent-seat-id", "type": "string", "required": false }, { "name": "steward_seat_id", "flag": "steward-seat-id", "type": "string", "required": false }, { "name": "lane", "flag": "lane", "type": "enum", "required": false, "enumValues": ["cloud", "mcp_session", "runner"] }, { "name": "schedule_cron", "flag": "schedule-cron", "type": "string", "required": false }, { "name": "answers", "flag": "answers", "type": "array", "required": false, "itemType": "string" }, { "name": "skill_discovery_enabled", "flag": "skill-discovery-enabled", "type": "boolean", "required": false }], "hasComplexInput": true, "help": "Update parent, steward, lane, schedule, answers, or tool decisions on the draft; steward and parent changes keep the no-orphan chain explicit." },
|
|
49680
49986
|
{ "id": "agent_template.list", "namespace": "agent_template", "action": "list", "title": "List agent templates", "description": "List stock agent templates and their responsibilities, default tools, and dry-run rehearsal.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "List stock agent templates and their default tools and safety boundaries before starting a template setup." },
|
|
49681
49987
|
{ "id": "agent.configure_tools", "namespace": "agent", "action": "configure_tools", "title": "Configure agent tools", "description": "Save tool proposals, declines, and credential-ingress requests for a draft agent. Never stores or echoes secret material; vault refs only.", "requiredScope": "seat", "confirmation": "credential_flow", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": true, "help": "Connect or decline proposed tools and stage credential-ingress requests; never place raw secrets here \u2014 secrets flow through vault-backed credential.ingress as vault refs only.", "example": { "seat_id": "0190aaaa-aaaa-7aaa-8aaa-aaaaaaaaaaaa", "tool_decisions": [{ "tool": "ap.invoices.read", "decision": "connect" }, { "tool": "email.draft", "decision": "connect" }] } },
|
|
49682
49988
|
{ "id": "agent.create_custom", "namespace": "agent", "action": "create_custom", "title": "Create custom agent", "description": "Create a draft custom agent shell and a draft Charter seed from operational answers (what it owns, success, never-do-alone, steward).", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "steward_seat_id", "flag": "steward-seat-id", "type": "string", "required": false }, { "name": "lane", "flag": "lane", "type": "enum", "required": false, "enumValues": ["cloud", "mcp_session", "runner"] }, { "name": "what_it_owns", "flag": "what-it-owns", "type": "string", "required": false }, { "name": "what_success_looks_like", "flag": "what-success-looks-like", "type": "string", "required": false }, { "name": "what_it_must_never_do_alone", "flag": "what-it-must-never-do-alone", "type": "string", "required": false }], "hasComplexInput": true, "help": "Create a draft custom agent from operational answers (what it owns, success, never-do-alone, steward); the Charter Builder owns the contract and go-live stays human-gated.", "example": { "seat_id": "0190aaaa-aaaa-7aaa-8aaa-aaaaaaaaaaaa", "steward_seat_id": "0190bbbb-bbbb-7bbb-8bbb-bbbbbbbbbbbb", "lane": "cloud", "what_it_owns": "Drafting AP invoice entries from inbound vendor emails for human review.", "what_success_looks_like": "Every inbound invoice is drafted within one business day with the correct GL coding.", "what_it_must_never_do_alone": "Never send payment or approve an invoice without a human sign-off." } },
|
|
@@ -49893,6 +50199,7 @@ var COMMAND_MANIFEST = [
|
|
|
49893
50199
|
{ "id": "team.health_score", "namespace": "team", "action": "health_score", "title": "Team health score", "description": "Return the single rolled-up 0\u2013100 team-health score (latest month) with its band (green/yellow/red) and label. Honest insufficient-data state when no metrics exist yet.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Read the single rolled-up 0-100 team-health score (latest month) with its band and label." },
|
|
49894
50200
|
{ "id": "tenant.anthropic_key.save", "namespace": "tenant", "action": "anthropic_key.save", "title": "Save tenant Anthropic key", "description": "Store a tenant-scoped Anthropic key in the configured vault.", "requiredScope": "tenant", "confirmation": "credential_flow", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "secretBlocked": true, "help": "Save model-provider credentials only through vault-backed flows and keep raw keys out of prompts, logs, and command metadata." },
|
|
49895
50201
|
{ "id": "tenant.create", "namespace": "tenant", "action": "create", "title": "Create additional company", "description": "Create a new clean company for an already-provisioned account after checking tenant.create.additional entitlement.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": false, "fields": [{ "name": "company_name", "flag": "company-name", "type": "string", "required": true }], "hasComplexInput": false, "help": "Create an additional clean company from an existing company session. Requires tenant.create.additional entitlement; first-company bootstrap stays signup.provision_tenant." },
|
|
50202
|
+
{ "id": "tenant.model_gateway_policy.update", "namespace": "tenant", "action": "model_gateway_policy.update", "title": "Update model gateway policy", "description": "Unlock or relock managed models that do not offer a zero-retention (ZDR) tier (ADR-0019). Locked (the conservative default) restricts the AI Gateway to zero-retention-eligible managed models. Owner-only and human-gated: unlocking is a deliberate ADR-0018 \xA76 standing authorization that lets managed brains without a zero-retention tier run. This provider retains data up to 30 days for abuse monitoring.", "requiredScope": "tenant_admin", "confirmation": "dangerous", "exposeOverMcp": true, "fields": [{ "name": "allow_non_zdr_models", "flag": "allow-non-zdr-models", "type": "boolean", "required": true }], "hasComplexInput": false, "help": "Unlock or relock managed models that do not offer a zero-retention (ZDR) tier (ADR-0019). Locked (default) restricts the AI Gateway to zero-retention-eligible managed models. Owner-only and human-gated; unlocking establishes an ADR-0018 \xA76 standing authorization and surfaces the per-model retention disclosure." },
|
|
49896
50203
|
{ "id": "tenant.rename", "namespace": "tenant", "action": "rename", "title": "Rename company", "description": "Rename the current tenant/company. The rename is human-gated and writes an audit event.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "company_name", "flag": "company-name", "type": "string", "required": true }], "hasComplexInput": false, "help": "Rename the current company; owner-only, human-gated, and audited as an event." },
|
|
49897
50204
|
{ "id": "tool.catalog", "namespace": "tool", "action": "catalog", "title": "List tool catalog", "description": "List the discoverable tool catalog the agent builder reads \u2014 tool id, title, provider, prescriptive description, default scope tiers, credential requirement, access policy, and execution-boundary guidance.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "provider", "flag": "provider", "type": "string", "required": false }], "hasComplexInput": false, "help": "List the tool catalog the builder reads \u2014 id, prescriptive description, scope tiers, credential requirement, access policy, and execution-boundary guidance." },
|
|
49898
50205
|
{ "id": "usage.report", "namespace": "usage", "action": "report", "title": "AI-workforce ROI report", "description": "Return the tenant's immutable per-period usage snapshots \u2014 agents ran, outputs, token/run cost, human-accepted value, exceptions, and approvals \u2014 for the AI-workforce ROI report.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "Read the AI-workforce ROI report \u2014 per-period agents/outputs/token+run cost, human-accepted value, exceptions, and approvals \u2014 from immutable usage snapshots." },
|