@rosthq/cli 0.7.105 → 0.7.106
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/dist/index.js +65 -14
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -46738,22 +46738,32 @@ var provisioningEventPayloadSchema = authoritativePrefixUnion(
|
|
|
46738
46738
|
// permissive branches unchanged, preserving parse-compat with stored rows.
|
|
46739
46739
|
[{ prefix: "invite.", strict: inviteLifecycleEventPayloadSchema }]
|
|
46740
46740
|
);
|
|
46741
|
+
function rejectNonProvisioningInviteAction(payload, ctx) {
|
|
46742
|
+
const action = payload.action;
|
|
46743
|
+
if (typeof action === "string" && action.startsWith("invite.")) {
|
|
46744
|
+
ctx.addIssue({
|
|
46745
|
+
code: external_exports.ZodIssueCode.custom,
|
|
46746
|
+
path: ["action"],
|
|
46747
|
+
message: `invite.* event payloads are only valid under a "provisioning" envelope, not this internal event type (DER-2049).`
|
|
46748
|
+
});
|
|
46749
|
+
}
|
|
46750
|
+
}
|
|
46741
46751
|
var decisionEventPayloadSchema = external_exports.union([
|
|
46742
46752
|
actionEventPayloadSchema,
|
|
46743
46753
|
internalEventObjectSchema
|
|
46744
|
-
]);
|
|
46754
|
+
]).superRefine(rejectNonProvisioningInviteAction);
|
|
46745
46755
|
var systemEventPayloadSchema = external_exports.union([
|
|
46746
46756
|
actionEventPayloadSchema,
|
|
46747
46757
|
internalEventObjectSchema
|
|
46748
|
-
]);
|
|
46758
|
+
]).superRefine(rejectNonProvisioningInviteAction);
|
|
46749
46759
|
var charterEventPayloadSchema = external_exports.union([
|
|
46750
46760
|
actionEventPayloadSchema,
|
|
46751
46761
|
internalEventObjectSchema
|
|
46752
|
-
]);
|
|
46762
|
+
]).superRefine(rejectNonProvisioningInviteAction);
|
|
46753
46763
|
var taskEventPayloadSchema = external_exports.union([
|
|
46754
46764
|
actionEventPayloadSchema,
|
|
46755
46765
|
internalEventObjectSchema
|
|
46756
|
-
]);
|
|
46766
|
+
]).superRefine(rejectNonProvisioningInviteAction);
|
|
46757
46767
|
|
|
46758
46768
|
// ../../packages/protocol/src/held-tool-action.ts
|
|
46759
46769
|
var heldToolActionReplaySchema = external_exports.object({
|
|
@@ -47440,17 +47450,44 @@ var intakeEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
|
|
|
47440
47450
|
type: external_exports.literal("intake"),
|
|
47441
47451
|
payload: intakeEventPayloadSchema
|
|
47442
47452
|
}).strict();
|
|
47443
|
-
var
|
|
47444
|
-
type: external_exports.
|
|
47445
|
-
payload:
|
|
47453
|
+
var decisionEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
|
|
47454
|
+
type: external_exports.literal("decision"),
|
|
47455
|
+
payload: decisionEventPayloadSchema
|
|
47456
|
+
}).strict();
|
|
47457
|
+
var provisioningEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
|
|
47458
|
+
type: external_exports.literal("provisioning"),
|
|
47459
|
+
payload: provisioningEventPayloadSchema
|
|
47460
|
+
}).strict();
|
|
47461
|
+
var systemEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
|
|
47462
|
+
type: external_exports.literal("system"),
|
|
47463
|
+
payload: systemEventPayloadSchema
|
|
47446
47464
|
}).strict();
|
|
47465
|
+
var charterEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
|
|
47466
|
+
type: external_exports.literal("charter"),
|
|
47467
|
+
payload: charterEventPayloadSchema
|
|
47468
|
+
}).strict();
|
|
47469
|
+
var taskEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
|
|
47470
|
+
type: external_exports.literal("task"),
|
|
47471
|
+
payload: taskEventPayloadSchema
|
|
47472
|
+
}).strict();
|
|
47473
|
+
var internalEventEnvelopeSchema = external_exports.discriminatedUnion("type", [
|
|
47474
|
+
decisionEventEnvelopeSchema,
|
|
47475
|
+
provisioningEventEnvelopeSchema,
|
|
47476
|
+
systemEventEnvelopeSchema,
|
|
47477
|
+
charterEventEnvelopeSchema,
|
|
47478
|
+
taskEventEnvelopeSchema
|
|
47479
|
+
]);
|
|
47447
47480
|
var eventEnvelopeSchema = external_exports.discriminatedUnion("type", [
|
|
47448
47481
|
statusEventEnvelopeSchema,
|
|
47449
47482
|
handoffEventEnvelopeSchema,
|
|
47450
47483
|
escalationEventEnvelopeSchema,
|
|
47451
47484
|
issueEventEnvelopeSchema,
|
|
47452
47485
|
intakeEventEnvelopeSchema,
|
|
47453
|
-
|
|
47486
|
+
decisionEventEnvelopeSchema,
|
|
47487
|
+
provisioningEventEnvelopeSchema,
|
|
47488
|
+
systemEventEnvelopeSchema,
|
|
47489
|
+
charterEventEnvelopeSchema,
|
|
47490
|
+
taskEventEnvelopeSchema
|
|
47454
47491
|
]);
|
|
47455
47492
|
var eventEnvelopeReaderBaseSchema = eventEnvelopeBaseSchema.passthrough();
|
|
47456
47493
|
var statusEventEnvelopeReaderSchema = eventEnvelopeReaderBaseSchema.extend({
|
|
@@ -48526,11 +48563,11 @@ Use the lower-level commands after health names a finding: \`agent.get_run\` for
|
|
|
48526
48563
|
order: 46,
|
|
48527
48564
|
title: "Tool access and vault",
|
|
48528
48565
|
summary: "How to give agents access to tools without exposing raw credentials or expanding authority by accident.",
|
|
48529
|
-
version: "2026-07-
|
|
48566
|
+
version: "2026-07-19.1",
|
|
48530
48567
|
public: true,
|
|
48531
48568
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
48532
48569
|
stages: ["staffing"],
|
|
48533
|
-
relatedCommandIds: ["charter.sign_manifest", "credential.ingress", "agent.configure_tools", "integration.connect_rest", "integration.list", "integration.readiness", "integration.status", "integration.test", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "confirmation.approve"],
|
|
48570
|
+
relatedCommandIds: ["charter.sign_manifest", "charter.set", "charter.update_draft", "credential.ingress", "agent.configure_tools", "integration.connect_rest", "integration.list", "integration.readiness", "integration.status", "integration.test", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "confirmation.approve"],
|
|
48534
48571
|
legal: {
|
|
48535
48572
|
publicRisk: "low",
|
|
48536
48573
|
notes: [
|
|
@@ -48602,6 +48639,12 @@ There is exactly one way to give a connected tool its credential, and it is the
|
|
|
48602
48639
|
- Must-escalate cases are stated.
|
|
48603
48640
|
- The tool provider and credential name are enough for audit; secret values are not displayed.
|
|
48604
48641
|
|
|
48642
|
+
## Change tool access after go-live
|
|
48643
|
+
|
|
48644
|
+
Tool access on a live seat is part of its signed Charter, so changing it is a governed amendment, not an in-place edit. You can make the change from the agent detail page without leaving it: the Tools tab's manage-tools drawer edits the permission manifest directly \u2014 grant or revoke a tool, adjust its scope tier, or add an available tool from the catalog. Your edits are staged as one confirmation that lands in Approvals with a plain summary of what changes ("grants work.record (draft) \xB7 revokes email.draft"). Approving that confirmation is the re-sign: it creates a new Charter version that supersedes the prior one, and the tool guard honors the new manifest on the next run. Nothing changes until a human approves \u2014 selecting a tool never grants access on its own.
|
|
48645
|
+
|
|
48646
|
+
The charter builder's amendment mode edits the same manifest for a draft Charter (toggle a tool's grant or scope tier), staged into the draft; the draft stays inert until the existing sign or go-live step. If a seat already has an amendment draft open, finish it in the charter editor rather than staging a separate tool change from the drawer.
|
|
48647
|
+
|
|
48605
48648
|
## Connect tools and credentials from CLI or MCP
|
|
48606
48649
|
|
|
48607
48650
|
- Stage tools on a draft agent: \`agent.configure_tools\` / \`rost_configure_agent_tools\` \u2014 connect or decline proposed tools and stage credential-ingress requests. Pass vault references, never raw secret material.
|
|
@@ -48674,7 +48717,7 @@ External connectors are being rolled out provider by provider, conservatively (r
|
|
|
48674
48717
|
order: 48,
|
|
48675
48718
|
title: "CLI and MCP installation guide",
|
|
48676
48719
|
summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
|
|
48677
|
-
version: "2026-07-
|
|
48720
|
+
version: "2026-07-19.1",
|
|
48678
48721
|
public: true,
|
|
48679
48722
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
48680
48723
|
stages: ["company_setup", "staffing"],
|
|
@@ -49219,6 +49262,14 @@ These read-only tools are available to any valid MCP token (like the reference t
|
|
|
49219
49262
|
|
|
49220
49263
|
The equivalent CLI verbs are \`{{cli}} command schema <id>\` and \`{{cli}} command list\`. The discoverable tool catalog is \`{{cli}} tools list\` (MCP \`rost_list_tool_catalog\`, tenant-scoped).
|
|
49221
49264
|
|
|
49265
|
+
### Deferred tool schemas (JIT loading)
|
|
49266
|
+
|
|
49267
|
+
For tokens whose catalog of generated command tools is large, each operating command tool is still advertised in the tool listing by name with a one-line description, but its full input contract is deferred rather than sent up front \u2014 this keeps the default tool listing small for large catalogs. The description names the command's \`command_id\`. To call a deferred tool, first call \`rost_describe_command\` with that \`command_id\` to load its exact input and output contract, then call the tool with the real arguments; the tool is fully callable either way, only the delivery of that contract is deferred.
|
|
49268
|
+
|
|
49269
|
+
Deferral is threshold-gated: small catalogs keep their full per-command contracts with no change in behavior. The pinned core seat tools (\`rost_get_context\`, \`rost_escalate\`, \`rost_report_status\`, and the task tools \`rost_get_tasks\`, \`rost_accept_task\`, \`rost_decline_task\`, \`rost_complete_task\`) and the reference and discovery tools are never deferred.
|
|
49270
|
+
|
|
49271
|
+
Deferring a contract changes only what is advertised in \`tools/list\`. Authorization is unaffected: every call still passes the server-side guard against the seat's signed permission manifest and writes its audit row, exactly as described above \u2014 visibility into a tool's arguments is never a security control.
|
|
49272
|
+
|
|
49222
49273
|
### Public reference tools and resources
|
|
49223
49274
|
|
|
49224
49275
|
| Tool or resource | Purpose | Scope | Safe example |
|
|
@@ -50202,7 +50253,7 @@ Agents may record readings when the Charter allows it. Agent-reported readings s
|
|
|
50202
50253
|
order: 62,
|
|
50203
50254
|
title: "Friction guide",
|
|
50204
50255
|
summary: "How to capture issues with evidence, rank them, and resolve them without losing ownership.",
|
|
50205
|
-
version: "2026-07-
|
|
50256
|
+
version: "2026-07-19.1",
|
|
50206
50257
|
public: true,
|
|
50207
50258
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
50208
50259
|
stages: ["operating_rhythm"],
|
|
@@ -50275,7 +50326,7 @@ In the app, the Tasks surface exposes the same queue operations for a seat's vis
|
|
|
50275
50326
|
|
|
50276
50327
|
## When to stop for confirmation
|
|
50277
50328
|
|
|
50278
|
-
\`friction.resolve\` is \`human_required\`; resolving an issue is a human decision. \`friction.link_task\`, \`task.create\`, \`task.accept\`, \`task.decline\`, \`task.confirm_proposal\`, \`task.decline_proposal\`, and \`task.complete\` are \`none\`, so they do not mint pending confirmations. The proposal decision commands still require a human actor with target-side authority and are app/CLI-only, not MCP-exposed; they are not agent-callable approval shortcuts. \`friction.update_status\`, \`escalation.raise\`, \`friction.file_issue\`, and \`friction.list\` are also not gated. An agent files Friction, proposes the task, and escalates; a human resolves or decides the proposed commitment.
|
|
50329
|
+
\`friction.resolve\` is \`human_required\`; resolving an issue is a human decision. Resolve authority is role-scoped: an owner or admin may resolve any issue tenant-wide, while any other member may resolve only issues raised by a seat they occupy or a downstream seat in the Responsibility Graph (their seat subtree). \`friction.link_task\`, \`task.create\`, \`task.accept\`, \`task.decline\`, \`task.confirm_proposal\`, \`task.decline_proposal\`, and \`task.complete\` are \`none\`, so they do not mint pending confirmations. The proposal decision commands still require a human actor with target-side authority and are app/CLI-only, not MCP-exposed; they are not agent-callable approval shortcuts. \`friction.update_status\`, \`escalation.raise\`, \`friction.file_issue\`, and \`friction.list\` are also not gated. An agent files Friction, proposes the task, and escalates; a human resolves or decides the proposed commitment.
|
|
50279
50330
|
|
|
50280
50331
|
## Resolution rule
|
|
50281
50332
|
|
|
@@ -52818,7 +52869,7 @@ var COMMAND_MANIFEST = [
|
|
|
52818
52869
|
{ "id": "friction.import", "namespace": "friction", "action": "import", "title": "Import Friction issues from a ninety Issues List", "description": "Bulk-import a ninety Issues List export into Friction. Owners are seat names resolved to seats; each issue is raised by the resolved seat and attributed to the importing human. Idempotent \u2014 re-importing the same export is a no-op, and an existing open issue with the same seat + summary is skipped.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "dry_run", "flag": "dry-run", "type": "boolean", "required": false }], "hasComplexInput": true, "help": "Import a ninety Issues List export into Friction; owners resolve to seats, idempotent by file + seat/summary." },
|
|
52819
52870
|
{ "id": "friction.link_task", "namespace": "friction", "action": "link_task", "title": "Link task to Friction issue", "description": "Attach an existing tenant task as the action task for a non-terminal issue. Both ids must belong to the tenant.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }, { "name": "task_id", "flag": "task-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Attach an existing task as the action task for a non-terminal issue." },
|
|
52820
52871
|
{ "id": "friction.list", "namespace": "friction", "action": "list", "title": "List Friction issues", "description": "List Friction issues ranked by status, impact, and severity. Defaults to active (open + diagnosing).", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "status", "flag": "status", "type": "enum", "required": false, "enumValues": ["open", "diagnosing", "resolved", "dropped", "active", "all"] }], "hasComplexInput": false, "help": "List Friction issues ranked by impact and severity to find the issue id before updating or resolving it." },
|
|
52821
|
-
{ "id": "friction.resolve", "namespace": "friction", "action": "resolve", "title": "Resolve Friction issue", "description": 'Resolve an issue with a root cause. In the default "ids" resolution_mode this also creates a remediation follow-up task; "already_fixed" records only the root cause (no follow-up task). Always records a human decision (decided_by) in the same transaction.', "requiredScope": "
|
|
52872
|
+
{ "id": "friction.resolve", "namespace": "friction", "action": "resolve", "title": "Resolve Friction issue", "description": 'Resolve an issue with a root cause. In the default "ids" resolution_mode this also creates a remediation follow-up task; "already_fixed" records only the root cause (no follow-up task). Always records a human decision (decided_by) in the same transaction.', "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }, { "name": "resolution_mode", "flag": "resolution-mode", "type": "enum", "required": false, "enumValues": ["ids", "already_fixed"] }, { "name": "root_cause", "flag": "root-cause", "type": "string", "required": true }, { "name": "owner_seat_id", "flag": "owner-seat-id", "type": "string", "required": false }, { "name": "task_title", "flag": "task-title", "type": "string", "required": false }, { "name": "task_description", "flag": "task-description", "type": "string", "required": false }, { "name": "done_by", "flag": "done-by", "type": "string", "required": false }, { "name": "resolving_seat_id", "flag": "resolving-seat-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Resolve an issue with a root cause and remediation task; resolution is a human decision." },
|
|
52822
52873
|
{ "id": "friction.stale_candidates", "namespace": "friction", "action": "stale_candidates", "title": "Find stale friction", "description": "List open or diagnosing Friction issues whose linked remediation task has already shipped, making them high-confidence candidates for bulk resolution, with per-row evidence. Read-only \u2014 it never resolves anything.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "stale_after_days", "flag": "stale-after-days", "type": "integer", "required": false }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "List open or diagnosing issues whose remediation task already shipped \u2014 high-confidence candidates for a bulk close-the-loop pass. Read-only." },
|
|
52823
52874
|
{ "id": "friction.update_status", "namespace": "friction", "action": "update_status", "title": "Update Friction issue status", "description": "Move a non-terminal issue between open and diagnosing. Terminal issues (resolved/dropped) cannot be reopened here.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }, { "name": "status", "flag": "status", "type": "enum", "required": true, "enumValues": ["open", "diagnosing"] }], "hasComplexInput": false, "help": "Move a non-terminal issue between open and diagnosing while it is being worked." },
|
|
52824
52875
|
{ "id": "gate.decide", "namespace": "gate", "action": "decide", "title": "Decide a conversational gate", "description": "A human approves or rejects a conversational gate bound to an artifact digest (a prototype URL, deliverable, or artifact). The agent drafts the decision and the human confirms it; the resolver is always a human (invariant #7). On approval the artifact must be unchanged since the gate was drafted \u2014 a stale digest re-blocks. Requires confirmation.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "subject_kind", "flag": "subject-kind", "type": "enum", "required": true, "enumValues": ["prototype", "deliverable", "artifact"] }, { "name": "subject_id", "flag": "subject-id", "type": "string", "required": true }, { "name": "artifact_digest", "flag": "artifact-digest", "type": "string", "required": true }, { "name": "decision", "flag": "decision", "type": "enum", "required": true, "enumValues": ["approve", "reject"] }, { "name": "ask", "flag": "ask", "type": "string", "required": true }, { "name": "consequence", "flag": "consequence", "type": "string", "required": true }, { "name": "unblocked_targets", "flag": "unblocked-targets", "type": "array", "required": false, "itemType": "string" }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": true, "help": "A human approves or rejects a conversational gate bound to an artifact digest; the agent drafts, the human confirms (invariant #7)." },
|