@rosthq/cli 0.7.23 → 0.7.25
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,EA4N3D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/generator/render.ts"],"names":[],"mappings":"AAeA,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGpD;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/generator/render.ts"],"names":[],"mappings":"AAeA,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGpD;AA8DD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAuB7D;AAgCD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAgD3D"}
|
package/dist/index.js
CHANGED
|
@@ -37718,6 +37718,19 @@ var dryRunToolActionSchema = external_exports.object({
|
|
|
37718
37718
|
// The underlying manifest guard decision that produced `status`.
|
|
37719
37719
|
guard: dryRunGuardResultSchema
|
|
37720
37720
|
}).strict();
|
|
37721
|
+
var dryRunLaneSchema = external_exports.enum(["cloud", "mcp_session", "runner"]);
|
|
37722
|
+
var dryRunToolExecutabilitySchema = external_exports.enum([
|
|
37723
|
+
"executable",
|
|
37724
|
+
"unimplemented_in_lane",
|
|
37725
|
+
"held_for_steward"
|
|
37726
|
+
]);
|
|
37727
|
+
var dryRunGrantedToolSchema = external_exports.object({
|
|
37728
|
+
// The granted tool (manifest id).
|
|
37729
|
+
tool_name: external_exports.string().min(1),
|
|
37730
|
+
// Its lane-aware executability, derived from the agent's lane + the runtime
|
|
37731
|
+
// handler registry (never an id string pattern).
|
|
37732
|
+
executability: dryRunToolExecutabilitySchema
|
|
37733
|
+
}).strict();
|
|
37721
37734
|
var dryRunTranscriptSchema = external_exports.object({
|
|
37722
37735
|
// Whether the rehearsal passed (the must-escalate clause was escalated and no
|
|
37723
37736
|
// external side effect ran) or failed (it acted without escalating, or the run
|
|
@@ -37736,6 +37749,14 @@ var dryRunTranscriptSchema = external_exports.object({
|
|
|
37736
37749
|
// handlers. Optional so the field is additive — a transcript without it (the
|
|
37737
37750
|
// static demo replay, an older record) still validates.
|
|
37738
37751
|
tool_preview: external_exports.array(dryRunToolActionSchema).optional(),
|
|
37752
|
+
// DER-1294: the runtime lane this rehearsal reflects. Optional/additive —
|
|
37753
|
+
// transcripts recorded before DER-1294 (and the static public-demo replay)
|
|
37754
|
+
// omit it, so they still validate.
|
|
37755
|
+
lane: dryRunLaneSchema.optional(),
|
|
37756
|
+
// DER-1294: every GRANTED tool (manifest allow|escalate) with its lane-aware
|
|
37757
|
+
// executability, so an operator sees which grants actually run vs. silently
|
|
37758
|
+
// no-op in this lane. Optional/additive so older transcripts still validate.
|
|
37759
|
+
granted_tools: external_exports.array(dryRunGrantedToolSchema).optional(),
|
|
37739
37760
|
// The underlying run id (present once the run is recorded).
|
|
37740
37761
|
run_id: external_exports.string().min(1).optional()
|
|
37741
37762
|
}).strict();
|
|
@@ -42665,6 +42686,25 @@ var softwarePlanDecisionOutputSchema = external_exports.object({
|
|
|
42665
42686
|
decision_id: uuid10,
|
|
42666
42687
|
current_phase: softwarePhaseSchema
|
|
42667
42688
|
});
|
|
42689
|
+
var forgeConformanceFindingInput = external_exports.object({
|
|
42690
|
+
severity: softwareConformanceSeveritySchema,
|
|
42691
|
+
category: softwareConformanceCategorySchema.default("other"),
|
|
42692
|
+
summary: external_exports.string().trim().min(1).max(2e3),
|
|
42693
|
+
detail: external_exports.string().trim().min(1).max(8e3).optional(),
|
|
42694
|
+
changeset_id: uuid10.optional(),
|
|
42695
|
+
plan_version_id: uuid10.optional()
|
|
42696
|
+
}).strict();
|
|
42697
|
+
var softwareConformanceRecordFindingsInputSchema = external_exports.object({
|
|
42698
|
+
build_request_id: uuid10,
|
|
42699
|
+
phase_run_id: uuid10.optional(),
|
|
42700
|
+
findings: external_exports.array(forgeConformanceFindingInput).min(1).max(50)
|
|
42701
|
+
}).strict();
|
|
42702
|
+
var softwareConformanceRecordFindingsOutputSchema = external_exports.object({
|
|
42703
|
+
build_request_id: uuid10,
|
|
42704
|
+
recorded_count: external_exports.number().int(),
|
|
42705
|
+
finding_ids: external_exports.array(uuid10),
|
|
42706
|
+
open_finding_count: external_exports.number().int()
|
|
42707
|
+
}).strict();
|
|
42668
42708
|
var softwareAuthorityProfileListInputSchema = external_exports.object({
|
|
42669
42709
|
software_project_id: uuid10.nullable().optional()
|
|
42670
42710
|
}).strict();
|
|
@@ -44056,7 +44096,7 @@ Treat AICOS as a coordinator over the operating system. It can become more usefu
|
|
|
44056
44096
|
order: 20,
|
|
44057
44097
|
title: "Responsibility Graph playbook",
|
|
44058
44098
|
summary: "How to build a functions-first graph with seats, owners, Stewards, vacancies, and clean authority.",
|
|
44059
|
-
version: "2026-07-04.
|
|
44099
|
+
version: "2026-07-04.3",
|
|
44060
44100
|
public: true,
|
|
44061
44101
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
44062
44102
|
stages: ["graph_design", "staffing"],
|
|
@@ -44114,6 +44154,10 @@ The graph is also where you land after onboarding \u2014 it is the mission contr
|
|
|
44114
44154
|
|
|
44115
44155
|
The graph also carries a mission-control panel. It pulls the same operational state visible on the agent and setup-health surfaces: held actions that need steward decisions, failed runs, open Friction, pending Signal readings, stale agents, and setup recommendations. Each item can focus the affected seat on the canvas and links to the route where the operator can act.
|
|
44116
44156
|
|
|
44157
|
+
## An agent seat's profile
|
|
44158
|
+
|
|
44159
|
+
A staffed agent's seat page opens on a profile built to answer one question in ten seconds: what is this agent, what does it know, what can it touch, and who is accountable. The hero shows live/paused/draft status, a one-line description, and when it last ran; a right-hand fact sheet stays visible on every tab with the Charter version, Skills, Connections (with a "connect" prompt when a Skill needs a provider that is not yet linked), an Access summary, and tool/held/model counts. Four tabs organize the rest: **Overview** (recent runs as one-line summaries, 30-day cost by model, and a version-history feed that tracks the agent itself as an actor alongside human Charter decisions), **Charter** (the accepted Charter rendered as a document \u2014 purpose, responsibilities, owned measurables, decision authority \u2014 with its version chip, signer, and an Amend action that opens the same draft-and-confirm amendment flow as the Charter Builder), **Access** (plain-language cards for what the agent does while you are watching versus running unattended, then every granted tool grouped under its Connection with a one-line description and Read/Draft/Held status), and **Activity** (the full Trust Card below). AICOS's seat keeps its own operations panel instead of this profile, because it is the company's foundation seat rather than a generic staffed agent.
|
|
44160
|
+
|
|
44117
44161
|
## Review an agent seat's delivered work
|
|
44118
44162
|
|
|
44119
44163
|
Agent seat pages show the operator-facing output trail, not just low-level run telemetry. The completed work area combines explicit \`agent_deliverables\`, successful \`work.log\` evidence, and recent successful run summaries into one readable list. Each item shows what was delivered, when it happened, what kind of work it was, and safe evidence links labelled as internal, Linear, GitHub, or external. Secret-shaped values are redacted before display, and run or task context is shown only when it belongs to the same seat.
|
|
@@ -44427,7 +44471,7 @@ For CLI and MCP setup, read agent-skill-setup-guide before adding or assigning S
|
|
|
44427
44471
|
order: 42,
|
|
44428
44472
|
title: "Design a custom agent",
|
|
44429
44473
|
summary: "How to build a custom agent from operational questions through the Charter Builder, tools, dry run, and go-live without writing prompts.",
|
|
44430
|
-
version: "2026-
|
|
44474
|
+
version: "2026-07-04.1",
|
|
44431
44475
|
public: true,
|
|
44432
44476
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
44433
44477
|
stages: ["staffing", "charter_design"],
|
|
@@ -44494,7 +44538,7 @@ The same path is command-backed:
|
|
|
44494
44538
|
|
|
44495
44539
|
## Dry run and go-live
|
|
44496
44540
|
|
|
44497
|
-
The dry run is a real sandbox rehearsal, not a stamp. It executes a mock-provider run derived from the Charter \u2014 the agent works against sandbox data only and is expected to escalate where the Charter's must-escalate clause requires it. The same rehearsal works on all three lanes: cloud, external MCP, and local Runner. External MCP dry runs require an active seat-scoped MCP token; Runner dry runs require a paired Runner. Missing substrate returns a typed precondition error, not a generic failure. The recorded run keeps the agent's actual lane, so the evidence you review matches the lane you selected. The result is earned: a run that escalates the must-escalate boundary passes; a run that acts on that boundary instead of escalating fails. A failed dry run keeps the draft and shows the reason so you can edit and rerun. The rehearsal returns a transcript \u2014 the steps the agent took and the escalation it raised \u2014 shown step by step in the builder and printed by the CLI, so you can see the governance model working before anything goes live. When the dry run passes, a human promotes the agent live. The dry run rehearses the specific model tier you chose, so once it passes the model is locked \u2014 changing the model requires re-running the dry run on the new model before go-live.
|
|
44541
|
+
The dry run is a real sandbox rehearsal, not a stamp. It executes a mock-provider run derived from the Charter \u2014 the agent works against sandbox data only and is expected to escalate where the Charter's must-escalate clause requires it. The same rehearsal works on all three lanes: cloud, external MCP, and local Runner. External MCP dry runs require an active seat-scoped MCP token; Runner dry runs require a paired Runner. Missing substrate returns a typed precondition error, not a generic failure. The recorded run keeps the agent's actual lane, so the evidence you review matches the lane you selected. The result is earned: a run that escalates the must-escalate boundary passes; a run that acts on that boundary instead of escalating fails. A failed dry run keeps the draft and shows the reason so you can edit and rerun. The rehearsal returns a transcript \u2014 the steps the agent took and the escalation it raised \u2014 shown step by step in the builder and printed by the CLI, so you can see the governance model working before anything goes live. The transcript is also lane-honest: each granted tool is marked executable, held for the steward, or granted but unimplemented in this lane, with a plain-count verdict such as "2 of 6 granted tools don't execute in the cloud lane yet" \u2014 so a grant that would silently no-op in the cloud runtime is visible before go-live instead of passing green. Runner and MCP-session agents run those tools through their own local skills, so their grants are not flagged as unimplemented. When the dry run passes, a human promotes the agent live. The dry run rehearses the specific model tier you chose, so once it passes the model is locked \u2014 changing the model requires re-running the dry run on the new model before go-live.
|
|
44498
44542
|
|
|
44499
44543
|
## When to stop for confirmation
|
|
44500
44544
|
|
|
@@ -44837,7 +44881,7 @@ External connectors are being rolled out provider by provider, conservatively (r
|
|
|
44837
44881
|
order: 48,
|
|
44838
44882
|
title: "CLI and MCP installation guide",
|
|
44839
44883
|
summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
|
|
44840
|
-
version: "2026-07-04.
|
|
44884
|
+
version: "2026-07-04.16",
|
|
44841
44885
|
public: true,
|
|
44842
44886
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
44843
44887
|
stages: ["company_setup", "staffing"],
|
|
@@ -45564,6 +45608,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
|
|
|
45564
45608
|
| \`rost_answer_forge_plan_clarifications\` | \`software_factory.request.answer_clarification\` | Write structured human answers to a draft plan's clarifying questions and optionally mark it ready for plan review; answers append to the versioned planning artifact and never widen authority or automation mode. | Tenant | Call with \`{"build_request_id":"<request-id>","answers":[{"question":"Which database?","answer":"Postgres"}],"mark_ready_for_plan_review":true}\`. |
|
|
45565
45609
|
| \`rost_approve_a_forge_plan\` | \`software_factory.plan.approve\` | A human approves the current plan at the plan_review gate; records a human decision and advances the request to implementation. Owner-only and human-gated. | Tenant-admin | Call with \`{"build_request_id":"<request-id>"}\`; non-interactive callers receive a confirmation handoff. |
|
|
45566
45610
|
| \`rost_reject_a_forge_plan\` | \`software_factory.plan.reject\` | A human rejects the current plan (with a required rationale) and routes the request back to discovery/scoping for re-planning. Owner-only and human-gated. | Tenant-admin | Call with \`{"build_request_id":"<request-id>","rationale":"Scope too broad"}\`; non-interactive callers receive a confirmation handoff. |
|
|
45611
|
+
| \`rost_record_forge_conformance_findings\` | \`software_factory.conformance.record_findings\` | Record structured plan-conformance findings as reviewer evidence. Open findings route the request back to implementation; accepting a gap remains a separate human gate. | Tenant | Call with \`{"build_request_id":"<request-id>","findings":[{"severity":"major","category":"scope_gap","summary":"Missing migration verification"}]}\`. |
|
|
45567
45612
|
| \`rost_list_forge_authority_profiles\` | \`software_factory.authority_profile.list\` | List the tenant's Forge authority profiles (seat capability presets, read-only by default). Read-only; requires the Forge add-on. | Tenant | Call with \`{}\`. |
|
|
45568
45613
|
| \`rost_create_a_forge_authority_profile\` | \`software_factory.authority_profile.create\` | Define a Forge authority profile (a named seat capability preset). Owner-only; defaults to the read_only preset. | Tenant-admin | Call with \`{"name":"Builder","preset":"contributor"}\`. |
|
|
45569
45614
|
| \`rost_grant_forge_seat_authority\` | \`software_factory.authority.grant\` | Grant a seat a Forge authority profile on a project (seat \u2192 project \u2192 profile). Owner-only and human-gated; emits a durable authority-change event. | Tenant-admin | Call with \`{"software_project_id":"<project-id>","seat_id":"<seat-id>","authority_profile_id":"<profile-id>"}\`; non-interactive callers receive a confirmation handoff. |
|
|
@@ -46065,7 +46110,7 @@ Retrieve the narrowest relevant guide before making a setup recommendation. Pref
|
|
|
46065
46110
|
order: 60,
|
|
46066
46111
|
title: "Cascade guide",
|
|
46067
46112
|
summary: "How to connect company goals to seat-level work without turning {{brand}} into a project-management tool.",
|
|
46068
|
-
version: "2026-07-04.
|
|
46113
|
+
version: "2026-07-04.2",
|
|
46069
46114
|
public: true,
|
|
46070
46115
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
46071
46116
|
stages: ["operating_rhythm"],
|
|
@@ -46133,7 +46178,7 @@ Cascade warnings are advisory, not blockers. They point to setup that should be
|
|
|
46133
46178
|
- Agent goal missing human accountability parent: an agent-owned goal has no human or hybrid goal in its ancestry.
|
|
46134
46179
|
- Orphaned goal branch: the owner seat or parent chain no longer reaches an active Compass objective.
|
|
46135
46180
|
|
|
46136
|
-
|
|
46181
|
+
\`/cascade\` leads with one computed line \u2014 how many goals are off pace this cycle, or an all-clear when none are. Off-pace and off-track goals stay fully visible with their owner seat and pace context; goals confirmed on pace collapse into a per-branch count you can expand. Creating or editing a goal opens the same drawer from a single **New goal** action or a goal's own edit control \u2014 there is no separate persistent form.
|
|
46137
46182
|
|
|
46138
46183
|
## Goal progress and at-risk goals
|
|
46139
46184
|
|
|
@@ -46280,7 +46325,7 @@ Agents may record readings when the Charter allows it. Agent-reported readings s
|
|
|
46280
46325
|
order: 62,
|
|
46281
46326
|
title: "Friction guide",
|
|
46282
46327
|
summary: "How to capture issues with evidence, rank them, and resolve them without losing ownership.",
|
|
46283
|
-
version: "2026-07-
|
|
46328
|
+
version: "2026-07-04.1",
|
|
46284
46329
|
public: true,
|
|
46285
46330
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
46286
46331
|
stages: ["operating_rhythm"],
|
|
@@ -46332,6 +46377,8 @@ Agents should file Friction when a measurable breaks, a tool fails, a repeated e
|
|
|
46332
46377
|
|
|
46333
46378
|
In the app, operational evidence is summarized for humans instead of shown as the primary interface. Incident fields, proposed tool calls, schedules, payload labels, and source links render as readable fields with raw details tucked behind supporting context when useful. Secret-shaped values stay redacted.
|
|
46334
46379
|
|
|
46380
|
+
The Friction page opens with one computed line \u2014 how many issues are open, the oldest one's age, and how many are escalated \u2014 followed by the open issues themselves as incident-ticket rows (filer, one-line cause, an escalation chip naming the steward when severity is critical). Resolved issues collapse into a single count that expands into a quiet history list. Filing a new issue and the three-step resolution (root cause, owner task, done-by) both live behind one "File friction" action, which opens a drawer; resolving launches that same drawer already seeded from the row you clicked "Resolve" on.
|
|
46381
|
+
|
|
46335
46382
|
## Operate Friction, tasks, and escalations from CLI or MCP
|
|
46336
46383
|
|
|
46337
46384
|
Friction, tasks, and escalations are the issue-to-action loop. A seat files, a task carries the work, and an escalation routes a decision a seat cannot make alone.
|
|
@@ -48765,6 +48812,7 @@ var COMMAND_MANIFEST = [
|
|
|
48765
48812
|
{ "id": "software_factory.capacity.list", "namespace": "software_factory", "action": "capacity.list", "title": "List Forge runner capacity", "description": "List the tenant's Forge runner capacity observations (OS, CPU, memory, active sessions, usage-limit telemetry). Advisory scheduling input only, never an authority input. Read-only, entitlement-gated.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "runner_id", "flag": "runner-id", "type": "string", "required": false }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "List Forge runner capacity observations (advisory scheduling input only, never an authority input). Read-only; requires the Forge add-on." },
|
|
48766
48813
|
{ "id": "software_factory.config.list", "namespace": "software_factory", "action": "config.list", "title": "List Forge config", "description": "List active Forge config metadata for project environments. Plain config values may be returned; secret refs are represented only as has_secret_ref.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": false }, { "name": "environment", "flag": "environment", "type": "enum", "required": false, "enumValues": ["development", "preview", "production"] }], "hasComplexInput": false, "help": "List active Forge config entries. Plain config may be shown; secret refs are represented only as metadata." },
|
|
48767
48814
|
{ "id": "software_factory.config.set", "namespace": "software_factory", "action": "config.set", "title": "Set Forge config", "description": "Create or rotate a Forge project config entry. Secret config stores only a vault ref pointer; raw values are never accepted for secret_ref entries.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": true }, { "name": "environment", "flag": "environment", "type": "enum", "required": true, "enumValues": ["development", "preview", "production"] }, { "name": "key_name", "flag": "key-name", "type": "string", "required": true }, { "name": "value_kind", "flag": "value-kind", "type": "enum", "required": true, "enumValues": ["plain", "secret_ref"] }, { "name": "plain_value", "flag": "plain-value", "type": "string", "required": false }, { "name": "vault_ref", "flag": "vault-ref", "type": "string", "required": false }], "hasComplexInput": false, "help": "Set or rotate a Forge project config key. Secret entries store only vault refs and are human-gated." },
|
|
48815
|
+
{ "id": "software_factory.conformance.record_findings", "namespace": "software_factory", "action": "conformance.record_findings", "title": "Record Forge conformance findings", "description": "The plan-conformance reviewer records one or more findings against a build request; open findings route the request back to implementation. Recording is evidence, not a decision \u2014 accepting a gap is a separate human gate. Requires the Forge add-on.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "build_request_id", "flag": "build-request-id", "type": "string", "required": true }, { "name": "phase_run_id", "flag": "phase-run-id", "type": "string", "required": false }], "hasComplexInput": true, "help": "Record structured Forge plan-conformance findings as reviewer evidence. Open findings route the request back to implementation; accepting a gap remains a separate human gate." },
|
|
48768
48816
|
{ "id": "software_factory.developer_team.install", "namespace": "software_factory", "action": "developer_team.install", "title": "Install Forge Developer Team", "description": "Install AND activate the governed Forge Developer Team: 7 seats (1 human lead + 6 agents), first-party skills, authority presets, and a conservative token budget. Approving this ACTIVATES the 6 agents as live occupancies at a pr_only, observe-first posture: they open pull requests but never merge or deploy without a human. Entitlement-gated and human-confirmed.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "steward_seat_id", "flag": "steward-seat-id", "type": "string", "required": true }, { "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": false }, { "name": "assign_skills", "flag": "assign-skills", "type": "boolean", "required": false }, { "name": "acknowledge_autonomy_ceiling", "flag": "acknowledge-autonomy-ceiling", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Install the governed Forge Developer Team template with seats, draft Charters, skills, project authority grants, and audit records. Tenant-admin and human-gated; creates no live agent occupancy." },
|
|
48769
48817
|
{ "id": "software_factory.gate.decide", "namespace": "software_factory", "action": "gate.decide", "title": "Decide a Forge gate", "description": "A human approves or rejects a Forge gate. The resolver is recorded (never an agent \u2014 invariant #7); sensitive gates (security sign-off, merge/deploy, authority change, production deploy) also write a linked human decision. Requires confirmation.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "gate_id", "flag": "gate-id", "type": "string", "required": true }, { "name": "decision", "flag": "decision", "type": "enum", "required": true, "enumValues": ["approve", "reject"] }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": false, "help": "A human approves or rejects a Forge gate; an agent caller routes to /approvals and can never self-approve. Sensitive gates record a human decision." },
|
|
48770
48818
|
{ "id": "software_factory.github.installation_token.create", "namespace": "software_factory", "action": "github.installation_token.create", "title": "Create a Forge GitHub installation token", "description": "Mint a short-lived GitHub App installation token for one bound repository after server-side policy evaluation. The token is returned once and never persisted.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": true }, { "name": "repository_id", "flag": "repository-id", "type": "integer", "required": true }, { "name": "requested_actions", "flag": "requested-actions", "type": "array", "required": true, "itemType": "string" }, { "name": "requested_automation_mode", "flag": "requested-automation-mode", "type": "enum", "required": false, "enumValues": ["plan_only", "pr_only", "merge_after_checks", "deploy_preview", "deploy_production"] }, { "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Mint a short-lived GitHub App installation token for one bound repository after policy evaluation; token material is returned once and never stored." },
|
|
@@ -49088,6 +49136,36 @@ function dryRunToolActionLabel(status) {
|
|
|
49088
49136
|
return status;
|
|
49089
49137
|
}
|
|
49090
49138
|
}
|
|
49139
|
+
var DRY_RUN_LANE_LABELS = {
|
|
49140
|
+
cloud: "cloud lane",
|
|
49141
|
+
runner: "runner lane",
|
|
49142
|
+
mcp_session: "MCP-session lane"
|
|
49143
|
+
};
|
|
49144
|
+
function dryRunLaneLabel(lane) {
|
|
49145
|
+
return DRY_RUN_LANE_LABELS[lane] ?? `${lane} lane`;
|
|
49146
|
+
}
|
|
49147
|
+
function dryRunLaneVerdict(lane, grantedCount, unimplementedCount) {
|
|
49148
|
+
const laneLabel = dryRunLaneLabel(lane);
|
|
49149
|
+
if (unimplementedCount === 0) {
|
|
49150
|
+
return grantedCount === 1 ? `The single granted tool is implemented in the ${laneLabel}.` : `All ${grantedCount} granted tools are implemented in the ${laneLabel}.`;
|
|
49151
|
+
}
|
|
49152
|
+
const verb = unimplementedCount === 1 ? "doesn't" : "don't";
|
|
49153
|
+
return `${unimplementedCount} of ${grantedCount} granted tools ${verb} execute in the ${laneLabel} yet.`;
|
|
49154
|
+
}
|
|
49155
|
+
function dryRunLaneExecutabilityLines(transcript) {
|
|
49156
|
+
const lane = transcript.lane;
|
|
49157
|
+
const grantedTools = asArray(transcript.granted_tools);
|
|
49158
|
+
if (typeof lane !== "string" || grantedTools.length === 0) {
|
|
49159
|
+
return [];
|
|
49160
|
+
}
|
|
49161
|
+
const laneLabel = dryRunLaneLabel(lane);
|
|
49162
|
+
const unimplemented = grantedTools.map((tool) => asRecord(tool)).filter((tool) => tool.executability === "unimplemented_in_lane");
|
|
49163
|
+
const warningLines = unimplemented.map(
|
|
49164
|
+
(tool) => ` warning: ${field(tool, "tool_name")} is granted but unimplemented in the ${laneLabel}`
|
|
49165
|
+
);
|
|
49166
|
+
const verdict = dryRunLaneVerdict(lane, grantedTools.length, unimplemented.length);
|
|
49167
|
+
return ["lane executability:", ...warningLines, ` verdict: ${verdict}`];
|
|
49168
|
+
}
|
|
49091
49169
|
function formatDryRunTranscript(value) {
|
|
49092
49170
|
const transcript = asRecord(value);
|
|
49093
49171
|
const steps = asArray(transcript.steps);
|
|
@@ -49104,7 +49182,13 @@ function formatDryRunTranscript(value) {
|
|
|
49104
49182
|
const record2 = asRecord(action);
|
|
49105
49183
|
return ` ${dryRunToolActionLabel(field(record2, "status"))}: ${field(record2, "intended_action")} [${field(record2, "tool_name")}]`;
|
|
49106
49184
|
});
|
|
49107
|
-
|
|
49185
|
+
const laneLines = dryRunLaneExecutabilityLines(transcript);
|
|
49186
|
+
return [
|
|
49187
|
+
"rehearsal:",
|
|
49188
|
+
...lines,
|
|
49189
|
+
...toolPreview.length > 0 ? ["tool preview:", ...toolPreview] : [],
|
|
49190
|
+
...laneLines
|
|
49191
|
+
].join("\n");
|
|
49108
49192
|
}
|
|
49109
49193
|
function isScalar(value) {
|
|
49110
49194
|
return value === null || ["string", "number", "boolean"].includes(typeof value);
|