@rosthq/cli 0.7.102 → 0.7.104

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
@@ -41776,6 +41776,10 @@ var frictionIssueSummarySchema = external_exports.object({
41776
41776
  raised_by_seat_id: uuidSchema9,
41777
41777
  raised_by_seat_name: external_exports.string(),
41778
41778
  summary: external_exports.string(),
41779
+ // DER-1978 (S2): OPTIONAL short headline written at creation; null/absent when unset
41780
+ // (surfaces derive a clamped title from `summary`). Optional so existing callers and
41781
+ // legacy null-title rows validate unchanged.
41782
+ title: external_exports.string().nullable().optional(),
41779
41783
  severity: external_exports.enum(["low", "med", "high", "critical"]),
41780
41784
  impact_score: external_exports.number(),
41781
41785
  status: issueStatusSchema,
@@ -46383,6 +46387,12 @@ var syncBriefGoalDeltaSchema = external_exports.object({
46383
46387
  title: external_exports.string().min(1),
46384
46388
  status: external_exports.enum(["on", "off", "done", "dropped"]),
46385
46389
  status_source: external_exports.string().min(1),
46390
+ // DER-1957 (S1): the goal's own progress reading (null when unmeasured), so the
46391
+ // sync-brief goal-delta row can render the shared goal-status chip with the same
46392
+ // pending-measurement rule Home and Cascade use — an unmeasured `on` goal reads
46393
+ // "Pending measurement", never a false "On track". Nullable + optional so briefs
46394
+ // persisted before this field parse unchanged.
46395
+ progress_pct: external_exports.number().int().min(0).max(100).nullable().optional(),
46386
46396
  changed_this_period: external_exports.boolean()
46387
46397
  }).strict();
46388
46398
  var syncBriefTaskReviewSchema = external_exports.object({
@@ -46624,6 +46634,12 @@ var escalationRaiseInputSchema = external_exports.object({
46624
46634
  charter_clause: external_exports.string().min(1),
46625
46635
  evidence: evidenceSchema,
46626
46636
  recommended_action: external_exports.string().min(1).optional(),
46637
+ // DER-1978 (S2): an OPTIONAL short human-readable title written at creation.
46638
+ // Agents' long narrative lands in `reason` (the body); this ≤90-char title is
46639
+ // what Home's "Needs you" band renders as the one-line summary. Optional so
46640
+ // every existing escalation event validates unchanged; when absent the read
46641
+ // surface derives a clamped title from `reason`.
46642
+ title: external_exports.string().trim().min(1).max(90).optional(),
46627
46643
  // DER-1848: reason-adjacent category. Optional so every existing escalation event
46628
46644
  // (and every ordinary held call) validates unchanged; present only when the agent
46629
46645
  // explicitly escalated with a category (today: a safety refusal).
@@ -46637,7 +46653,13 @@ var issueEventPayloadSchema = external_exports.object({
46637
46653
  blocking_goal_id: uuidSchema19.optional(),
46638
46654
  broken_measurable_id: uuidSchema19.optional(),
46639
46655
  evidence: evidenceSchema,
46640
- severity: external_exports.enum(["low", "med", "high", "critical"])
46656
+ severity: external_exports.enum(["low", "med", "high", "critical"]),
46657
+ // DER-1978 (S2): an OPTIONAL short human-readable title written at creation.
46658
+ // The agent's long narrative lands in `summary` (the body); this ≤90-char title
46659
+ // is what Home's "Needs you" band renders as the one-line summary. Optional so
46660
+ // every existing issue event validates unchanged; when absent the read surface
46661
+ // derives a clamped title from `summary`.
46662
+ title: external_exports.string().trim().min(1).max(90).optional()
46641
46663
  }).strict();
46642
46664
 
46643
46665
  // ../../packages/protocol/src/event-internal-payloads.ts
@@ -46900,6 +46922,10 @@ var stewardEscalationSchema = external_exports.object({
46900
46922
  steward_seat_id: uuidSchema22,
46901
46923
  steward_seat_name: external_exports.string(),
46902
46924
  reason: external_exports.string(),
46925
+ // DER-1978 (S2): OPTIONAL short headline written at creation; null/absent when unset
46926
+ // (surfaces derive a clamped title from `reason`). Optional so existing callers and
46927
+ // legacy null-title rows validate unchanged.
46928
+ title: external_exports.string().nullable().optional(),
46903
46929
  charter_clause: external_exports.string(),
46904
46930
  // DER-1848: the first-class escalation category, or null for an ordinary held call.
46905
46931
  // `safety_refusal` = the agent explicitly declined the task on safety grounds, so
@@ -48384,7 +48410,7 @@ Decisions should be recorded as human decisions. Handoffs should attach to seats
48384
48410
  order: 45,
48385
48411
  title: "How agents work",
48386
48412
  summary: "How {{brand}} agents operate inside seats, use Charters, report work, and escalate beyond authority.",
48387
- version: "2026-07-14.1",
48413
+ version: "2026-07-18.1",
48388
48414
  public: true,
48389
48415
  audiences: ["human", "cli", "mcp", "in_app_agent"],
48390
48416
  stages: ["staffing", "operating_rhythm"],
@@ -48455,7 +48481,7 @@ A seat-scoped MCP token or the CLI runs the hand-shaped protocol. The server sti
48455
48481
  2. Tasks: \`rost_get_tasks\` / \`{{cli}} task list --seat <seat-id>\`, then \`rost_accept_task\` / \`rost_decline_task\` (with a \`reason\`).
48456
48482
  3. Report: \`rost_report_status\` / \`{{cli}} status record --seat <seat-id>\` as work progresses; \`rost_log_work\` to record evidence.
48457
48483
  4. Finish: \`rost_complete_task\` / \`{{cli}} task complete --seat <seat-id>\` with evidence.
48458
- 5. Surface problems: \`rost_file_issue\` (Friction) and \`rost_escalate\` when the work exceeds autonomous scope.
48484
+ 5. Surface problems: \`rost_file_issue\` (Friction) and \`rost_escalate\` when the work exceeds autonomous scope. Both take an optional short \`title\` (\u226490 chars) for the "Needs you" headline \u2014 put the long narrative in the body (\`summary\` / \`reason\`).
48459
48485
 
48460
48486
  A seat-scoped MCP token already carries the seat, so its tools (\`rost_get_tasks\`, \u2026) need no seat argument. A tenant or owner CLI **session** does not, so pass \`--seat <seat-id>\` on seat-operating wrappers (an owner can target any seat in the tenant; a member only a seat they occupy). See "Seat scope" below.
48461
48487
 
@@ -48643,7 +48669,7 @@ External connectors are being rolled out provider by provider, conservatively (r
48643
48669
  order: 48,
48644
48670
  title: "CLI and MCP installation guide",
48645
48671
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
48646
- version: "2026-07-18.3",
48672
+ version: "2026-07-18.4",
48647
48673
  public: true,
48648
48674
  audiences: ["human", "cli", "mcp", "in_app_agent"],
48649
48675
  stages: ["company_setup", "staffing"],
@@ -49477,8 +49503,8 @@ Seat-scoped MCP tokens expose the operating protocol below. The server still che
49477
49503
  | \`rost_decline_task\` | \`task.decline\` | Decline a task with a reason. | Seat | Call with \`task_id\` and \`reason\`. |
49478
49504
  | \`rost_report_status\` | \`status.record\` | Write a status event. | Seat | Call with a concise status payload. |
49479
49505
  | \`rost_complete_task\` | \`task.complete\` | Complete a task and record evidence. | Seat | Call with \`task_id\` and evidence. |
49480
- | \`rost_escalate\` | \`escalation.raise\` | Escalate approval-scope or must-escalate work. | Seat | Call with severity, reason, and requested decision. |
49481
- | \`rost_file_issue\` | \`friction.file_issue\` | File a Friction issue. | Seat | Call with title, severity, and impact. Agent/scheduled producers may pass an optional \`source_key\` for deterministic idempotency \u2014 a repeat filing with the same key returns the existing open issue with \`already_filed:true\` and creates nothing new. |
49506
+ | \`rost_escalate\` | \`escalation.raise\` | Escalate approval-scope or must-escalate work. | Seat | Call with reason and requested decision; pass an optional short \`title\` (\u226490 chars) for the "Needs you" headline and keep the long narrative in \`reason\`. |
49507
+ | \`rost_file_issue\` | \`friction.file_issue\` | File a Friction issue. | Seat | Call with \`summary\`, severity, and evidence; pass an optional short \`title\` (\u226490 chars) for the headline and keep the long narrative in \`summary\`. Agent/scheduled producers may pass an optional \`source_key\` for deterministic idempotency \u2014 a repeat filing with the same key returns the existing open issue with \`already_filed:true\` and creates nothing new. |
49482
49508
  | \`rost_log_work\` | \`work.log\` | Record a lightweight free-text work breadcrumb for the seat. For structured, per-entity, queryable business activity (a client might ask "which ones?"), use \`rost_record_work\` instead. | Seat | Call with summary and evidence. |
49483
49509
  | \`rost_report_a_signal_reading\` | \`signal.report\` | Propose one draft reading for this seat's own agent-sourced measurable. The reading lands unconfirmed for human review. | Seat | Call with \`{"measurable_id":"<id>","value":42,"note":"read off the source","confidence":"high"}\`. |
49484
49510
  | \`rost_draft_first_readings_from_a_connected_source\` | \`signal.draft_first_readings\` | Pull this seat's measurable's connected source ONCE (read-only, SSRF-guarded) and land the value as a DRAFT reading for the current period, for a human to confirm. For a measurable that has a source but no confirmed reading yet. Never publishes and never fabricates a value \u2014 a non-numeric or blocked pull drafts nothing. | Seat | Call with \`{"measurable_id":"<id>"}\`. |
@@ -50171,7 +50197,7 @@ Agents may record readings when the Charter allows it. Agent-reported readings s
50171
50197
  order: 62,
50172
50198
  title: "Friction guide",
50173
50199
  summary: "How to capture issues with evidence, rank them, and resolve them without losing ownership.",
50174
- version: "2026-07-15.1",
50200
+ version: "2026-07-18.1",
50175
50201
  public: true,
50176
50202
  audiences: ["human", "cli", "mcp", "in_app_agent"],
50177
50203
  stages: ["operating_rhythm"],
@@ -50232,7 +50258,7 @@ The Friction page opens with one computed line \u2014 how many issues are open,
50232
50258
 
50233
50259
  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.
50234
50260
 
50235
- - File and triage: \`{{cli}} friction file ...\` / \`friction.file_issue\` (seat) / \`rost_file_issue\`; list with \`{{cli}} friction list --status open --json\` / \`friction.list\` / \`rost_list_friction_issues\`; move between open and diagnosing with \`friction.update_status\` / \`rost_update_friction_issue_status\`.
50261
+ - File and triage: \`{{cli}} friction file ...\` / \`friction.file_issue\` (seat) / \`rost_file_issue\`. \`friction.file_issue\` takes an optional short \`title\` (\u226490 chars) for the "Needs you" headline \u2014 keep the long narrative in \`summary\`. List with \`{{cli}} friction list --status open --json\` / \`friction.list\` / \`rost_list_friction_issues\`; move between open and diagnosing with \`friction.update_status\` / \`rost_update_friction_issue_status\`.
50236
50262
  - Carry the work as a task: \`task.create\` / \`rost_create_task\` (a commitment between seats). \`task.create\` is \`none\` (no confirmation gate), so an agent can file one directly; an ordinary agent task lands as a **draft** proposal (\`origin: agent_proposal\`) for a target-side human to confirm or decline through \`task.confirm_proposal\` / \`task.decline_proposal\` in \`/approvals\` or the CLI \u2014 not MCP, and not a live offer in the owning seat's accept/decline queue. A bounded Trusted task-create grant may skip that draft card: it creates an **offered** handoff by default, and only creates **in_progress** when both proposing and target seats are live agent seats resolving to the same current accountable human Steward. A seat runs its live queue with \`{{cli}} task list|accept|decline|complete\` (\`task.list\`, \`task.accept\`, \`task.decline\`, \`task.complete\`). Link a task to an issue with \`friction.link_task\` / \`rost_link_task_to_friction_issue\`.
50237
50263
  - Route a decision: \`escalation.raise\` (seat) / \`rost_escalate\` sends approval-scope or must-escalate work to the Steward queue. Reads are \`escalation.list\` / \`escalation.get\`. See the steward queue guide for resolution.
50238
50264
 
@@ -50255,7 +50281,7 @@ Resolving Friction should produce one of four outcomes: a decision, a task, a Ch
50255
50281
  order: 70,
50256
50282
  title: "Steward queue guide",
50257
50283
  summary: "How Stewards review escalations, approve agent boundaries, and keep agents accountable.",
50258
- version: "2026-07-16.2",
50284
+ version: "2026-07-18.1",
50259
50285
  public: true,
50260
50286
  audiences: ["human", "cli", "mcp", "in_app_agent"],
50261
50287
  stages: ["staffing", "operating_rhythm"],
@@ -50312,7 +50338,7 @@ Every notification sent to you \u2014 escalations, approval requests, sync brief
50312
50338
 
50313
50339
  The Steward reads the queue from any surface but decides as a human.
50314
50340
 
50315
- - Read: \`{{cli}} escalation list --json\` / \`escalation.list\` / \`rost_list_escalations\` (own steward chain for humans, own seat for agents). Read one with \`{{cli}} escalation get\` / \`escalation.get\` / \`rost_get_escalation\` \u2014 evidence, recommendation, and decision state.
50341
+ - Read: \`{{cli}} escalation list --json\` / \`escalation.list\` / \`rost_list_escalations\` (own steward chain for humans, own seat for agents). Read one with \`{{cli}} escalation get\` / \`escalation.get\` / \`rost_get_escalation\` \u2014 evidence, recommendation, and decision state. An item may carry a short \`title\` (\u226490 chars) the raising agent wrote as the "Needs you" headline; the full narrative stays in \`reason\`.
50316
50342
  - Decide: \`{{cli}} escalation resolve\` / \`escalation.resolve\` and \`{{cli}} escalation reject\` / \`escalation.reject\`. \`escalation.resolve\` and \`escalation.reject\` are \`none\` at the confirmation layer, but they are deliberately NOT exposed over MCP \u2014 \`decisions.decided_by\` must be a human, so there is no \`rost_resolve_escalation\` tool. They are kept human-only by that MCP exclusion plus the human-only \`decided_by\`, not by a confirmation gate. The CLI runs them as the authenticated human; an agent session must hand the decision to a person.
50317
50343
  - Approve gated requests: when an escalation or Charter change produces a pending confirmation, the human approves with \`confirmation.approve\` (or rejects with \`confirmation.reject\`). Go-live runs through \`agent.go_live\`.
50318
50344
 
@@ -52776,13 +52802,13 @@ var COMMAND_MANIFEST = [
52776
52802
  { "id": "escalation.bulk_resolve", "namespace": "escalation", "action": "bulk_resolve", "title": "Bulk resolve escalations", "description": "Override (safely close) a batch of stale open escalations in one human-confirmed action, with a required reason. Each escalation is decided independently (partial success) and writes its own human decision; already-decided, not-routed, or missing ids are skipped. Agents cannot bulk-resolve.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": false, "fields": [{ "name": "escalation_ids", "flag": "escalation-ids", "type": "array", "required": true, "itemType": "string" }, { "name": "reason", "flag": "reason", "type": "string", "required": true }], "hasComplexInput": false, "help": "Override (safely close) a batch of stale open escalations in one human-confirmed action; each records its own human decision and already-decided, not-routed, or missing ids are skipped. Agents cannot bulk-resolve." },
52777
52803
  { "id": "escalation.get", "namespace": "escalation", "action": "get", "title": "Get escalation", "description": "Read a single escalation the caller is allowed to see (own steward chain for humans, own seat for agents).", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "id", "flag": "id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Read one escalation's evidence and recommendation before a human resolves or rejects it." },
52778
52804
  { "id": "escalation.list", "namespace": "escalation", "action": "list", "title": "List escalations", "description": "List Steward queue escalations routed to the caller's steward chain (human) or raised by the caller's seat (agent).", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "include_decided", "flag": "include-decided", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "List Steward queue escalations (own chain for humans, own seat for agents) before resolving or routing them." },
52779
- { "id": "escalation.raise", "namespace": "escalation", "action": "raise", "title": "Raise escalation", "description": "Emit an escalation event and open a Steward queue item for the acting seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "reason", "flag": "reason", "type": "string", "required": true }, { "name": "charter_clause", "flag": "charter-clause", "type": "string", "required": true }, { "name": "recommended_action", "flag": "recommended-action", "type": "string", "required": false }, { "name": "category", "flag": "category", "type": "enum", "required": false, "enumValues": ["safety_refusal"] }], "hasComplexInput": true, "help": "Raise an escalation to the seat's Steward when a decision exceeds the seat's authority; humans decide." },
52805
+ { "id": "escalation.raise", "namespace": "escalation", "action": "raise", "title": "Raise escalation", "description": "Emit an escalation event and open a Steward queue item for the acting seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "reason", "flag": "reason", "type": "string", "required": true }, { "name": "charter_clause", "flag": "charter-clause", "type": "string", "required": true }, { "name": "recommended_action", "flag": "recommended-action", "type": "string", "required": false }, { "name": "title", "flag": "title", "type": "string", "required": false }, { "name": "category", "flag": "category", "type": "enum", "required": false, "enumValues": ["safety_refusal"] }], "hasComplexInput": true, "help": "Raise an escalation to the seat's Steward when a decision exceeds the seat's authority; humans decide." },
52780
52806
  { "id": "escalation.reject", "namespace": "escalation", "action": "reject", "title": "Reject escalation", "description": "Override an open escalation so the agent must not proceed. Writes a human decision; agents cannot reject.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": false, "fields": [{ "name": "id", "flag": "id", "type": "string", "required": true }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": false, "help": "Reject (override) an escalation so the agent must not proceed; the decision records the human decider. Agents cannot reject." },
52781
52807
  { "id": "escalation.resolve", "namespace": "escalation", "action": "resolve", "title": "Resolve escalation", "description": "Approve an open escalation (or convert it to Friction). Writes a human decision; agents cannot resolve.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": false, "fields": [{ "name": "id", "flag": "id", "type": "string", "required": true }, { "name": "action", "flag": "action", "type": "enum", "required": false, "enumValues": ["approve", "convert_to_issue"] }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": false, "help": "Resolve an escalation as a human Steward; the decision records decided_by as the approving human. Agents cannot resolve." },
52782
52808
  { "id": "escalation.stale_candidates", "namespace": "escalation", "action": "stale_candidates", "title": "Find stale escalations", "description": "List open escalations routed to the caller's steward chain that have aged and still reference a concrete DER issue or PR, with a per-row confidence tier and evidence. Read-only \u2014 it never decides 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 aged open escalations in the caller's steward chain that still reference a concrete DER issue or PR \u2014 candidates for a bulk override. Read-only." },
52783
52809
  { "id": "friction.assist", "namespace": "friction", "action": "assist", "title": "Assist Friction issue", "description": "Advisory IDS assist for an issue: the most-similar prior resolved issues with their root causes and decisions, a recurring-pattern flag, and recommended options. Read-only \u2014 it never resolves the issue.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "Advisory IDS assist: the most-similar prior resolved issues with their root causes and decisions, plus a recurring-pattern flag. Read-only \u2014 it never resolves the issue." },
52784
52810
  { "id": "friction.bulk_resolve", "namespace": "friction", "action": "bulk_resolve", "title": "Bulk resolve friction", "description": "Resolve a batch of stale Friction issues in one human-confirmed action with a required root cause (already-fixed mode \u2014 no follow-up task). Each issue is resolved independently (partial success) and writes its own human decision; already-resolved or missing ids are skipped.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "issue_ids", "flag": "issue-ids", "type": "array", "required": true, "itemType": "string" }, { "name": "root_cause", "flag": "root-cause", "type": "string", "required": true }], "hasComplexInput": false, "help": "Resolve a batch of stale issues in one human-confirmed action with a required root cause (already-fixed mode); each records its own human decision and already-resolved or missing ids are skipped." },
52785
- { "id": "friction.file_issue", "namespace": "friction", "action": "file_issue", "title": "File Friction issue", "description": "Emit an issue event and open a Friction issue raised by the acting seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "summary", "flag": "summary", "type": "string", "required": true }, { "name": "blocking_goal_id", "flag": "blocking-goal-id", "type": "string", "required": false }, { "name": "broken_measurable_id", "flag": "broken-measurable-id", "type": "string", "required": false }, { "name": "severity", "flag": "severity", "type": "enum", "required": true, "enumValues": ["low", "med", "high", "critical"] }, { "name": "source_key", "flag": "source-key", "type": "string", "required": false }], "hasComplexInput": true, "help": "File a Friction issue with evidence when a goal or measurable is blocked or broken." },
52811
+ { "id": "friction.file_issue", "namespace": "friction", "action": "file_issue", "title": "File Friction issue", "description": "Emit an issue event and open a Friction issue raised by the acting seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "summary", "flag": "summary", "type": "string", "required": true }, { "name": "blocking_goal_id", "flag": "blocking-goal-id", "type": "string", "required": false }, { "name": "broken_measurable_id", "flag": "broken-measurable-id", "type": "string", "required": false }, { "name": "severity", "flag": "severity", "type": "enum", "required": true, "enumValues": ["low", "med", "high", "critical"] }, { "name": "title", "flag": "title", "type": "string", "required": false }, { "name": "source_key", "flag": "source-key", "type": "string", "required": false }], "hasComplexInput": true, "help": "File a Friction issue with evidence when a goal or measurable is blocked or broken." },
52786
52812
  { "id": "friction.get", "namespace": "friction", "action": "get", "title": "Get Friction issue", "description": "Get full detail for one Friction issue by id.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Get full detail for one Friction issue by id, including its root cause, action task, and resolution decision when present." },
52787
52813
  { "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." },
52788
52814
  { "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." },
@@ -58036,11 +58062,11 @@ async function probeClaude() {
58036
58062
  resident_session: streamJsonSupported ? {
58037
58063
  status: "prototype_gated",
58038
58064
  transport: "stream-json",
58039
- reason: "Claude CLI exposes stream-json I/O, but the long-lived resident session path remains explicitly gated until multi-turn subscription behavior is proven on a paired runner."
58065
+ reason: "resident session gated until multi-turn behavior proven"
58040
58066
  } : {
58041
58067
  status: "unsupported",
58042
58068
  transport: null,
58043
- reason: "Claude CLI on this runner does not expose the required stream-json I/O surface for a resident session prototype."
58069
+ reason: "stream-json interface not detected on this runner"
58044
58070
  }
58045
58071
  };
58046
58072
  }