@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 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 internalEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
47444
- type: external_exports.enum(["decision", "provisioning", "system", "charter", "task"]),
47445
- payload: internalEventWriterPayloadSchema
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
- internalEventEnvelopeSchema
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-14.1",
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-18.4",
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-18.1",
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": "tenant_admin", "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." },
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)." },