replicas-cli 0.3.308 → 0.3.310

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.
Files changed (2) hide show
  1. package/dist/index.cjs +76 -13
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -17147,6 +17147,7 @@ var init_linear = __esm({
17147
17147
  linearSessionMetadataSchema = external_exports.object({
17148
17148
  via_mothership: external_exports.boolean().optional(),
17149
17149
  attached: external_exports.boolean().optional(),
17150
+ routing_chat_id: external_exports.string().optional(),
17150
17151
  issue_id: external_exports.string(),
17151
17152
  issue_identifier: external_exports.string(),
17152
17153
  issue_title: external_exports.string(),
@@ -17587,6 +17588,7 @@ var init_replicas_mcp = __esm({
17587
17588
  listWorkspaces: "list_workspaces",
17588
17589
  linearStart: "start_linear_session",
17589
17590
  linearSessionIntent: "register_linear_session_intent",
17591
+ routeLinearTicket: "route_linear_ticket",
17590
17592
  listChannelSettings: "list_channel_settings",
17591
17593
  saveChannelPreset: "save_channel_preset",
17592
17594
  deleteChannelPreset: "delete_channel_preset",
@@ -17709,6 +17711,50 @@ var init_scout = __esm({
17709
17711
  }
17710
17712
  });
17711
17713
 
17714
+ // ../shared/src/default-skills/scout-settings.ts
17715
+ var SCOUT_SETTINGS_SKILL_NAME, CONTENT;
17716
+ var init_scout_settings = __esm({
17717
+ "../shared/src/default-skills/scout-settings.ts"() {
17718
+ "use strict";
17719
+ init_replicas_mcp();
17720
+ init_scout();
17721
+ SCOUT_SETTINGS_SKILL_NAME = "scout-settings";
17722
+ CONTENT = `---
17723
+ name: ${SCOUT_SETTINGS_SKILL_NAME}
17724
+ description: Use when someone asks Scout to change or explain how Replicas behaves in Slack or Linear (channel levels, "be quieter", "only reply when tagged", channel or team instructions, presets, monitored Linear teams, Slack Connect defaults, Slack agent defaults, "what can I change?"), when someone is annoyed that Scout replied unasked ("not you", "nobody asked", a thumbs-down), when making or answering a settings or automation offer, or when setting up an automation. Not for routing ordinary requests.
17725
+ ---
17726
+
17727
+ # Scout settings
17728
+
17729
+ You own every Scout setting: each Slack channel's level, each channel's and Linear team's preset and instructions, the presets themselves, which Linear teams are monitored, Slack Connect defaults, the organization's level, and agent defaults for Slack tasks. Handle requests here, never by spawning a workspace.
17730
+
17731
+ ## Tools
17732
+ Read presets, channel instructions, and levels with \`${REPLICAS_MCP_TOOLS.listChannelSettings}\`. Change them with \`${REPLICAS_MCP_TOOLS.updateChannelSettings}\`, \`${REPLICAS_MCP_TOOLS.saveChannelPreset}\`, \`${REPLICAS_MCP_TOOLS.deleteChannelPreset}\`, \`${REPLICAS_MCP_TOOLS.setOrganizationProactivity}\`, \`${REPLICAS_MCP_TOOLS.setSlackConnectDefaults}\`, or \`${REPLICAS_MCP_TOOLS.setSlackAgentDefaults}\`. Every change takes \`confirmation_*\` arguments: fill them with the requesting message's envelope \`channel_id\`, \`thread_ts\`, \`message_ts\`, and \`user_id\`. The server checks that exact Slack author is an organization member (and an admin where noted). If it refuses, say why briefly and change nothing.
17733
+
17734
+ ## Changing settings
17735
+ - Settings also change outside your chat, often on purpose: read the current settings first, never trust earlier messages, and never re-apply an earlier request the current message doesn't ask for. Save only what the current message asks.
17736
+ - **Levels**, lowest to highest: \`tagged\` (only @Replicas pings reach you, not even messages naming Replicas), \`conservative\` (also messages naming Replicas or Scout, and follow-ups in threads with a workspace), \`balanced\` (the normal triage rules), \`proactive\` (also clear untagged questions and requests). People see these as Mentions only, Low, Balanced and High: use those names, never the setting values.
17737
+ - The organization has one level for its whole Slack workspace, which only an admin can set with \`${REPLICAS_MCP_TOOLS.setOrganizationProactivity}\`. A channel or group DM can override it with \`${REPLICAS_MCP_TOOLS.updateChannelSettings}\` and \`proactivity\`. 1:1 DMs are always addressed to you. Any member can lower a channel; raising one above \`tagged\` needs an admin.
17738
+ - A request that points at a channel ("here", "in #eng", "stop replying in #random") changes that channel only. One that doesn't ("only respond when I @ you", "don't auto-reply to Slack messages") means the organization level. When it names a channel, even without "#" ("make support-inbound quieter"), find it with \`conversations.list\` and change that one, not the one you were asked in; ask if none or several match. If a non-admin asks for an organization change, say an organization admin has to ask, and offer the channel-only change when they asked from a channel. Instructions don't substitute for a level.
17739
+ - **Instructions and presets:** prefer changing the channel's own instructions; edit a shared preset only when asked, since every channel using it changes. To set up a channel without being told how, read enough of it to propose short instructions or a fitting preset (customer, vendor, internal team), and save nothing until they confirm. Never infer a channel's purpose only because Slack marks it externally shared.
17740
+ - **Linear teams:** set \`monitored: true\` to start triaging a team (admin only) and \`monitored: false\` to stop. Teams take a preset or instructions like channels.
17741
+ - **Slack Connect** channels shared with another company follow the organization's shared-channel defaults (\`tagged\` with no preset unless an admin set them with \`${REPLICAS_MCP_TOOLS.setSlackConnectDefaults}\`) until they get their own settings, unless a Mothership is linked to one. A request about all shared or customer channels changes only those defaults: leave channels with their own settings as they are, list them, and offer to switch them too. Asked why you stay quiet in one, say it's external and an admin can raise its level here.
17742
+ - **Slack agent defaults:** to change the agent, model, thinking level, goal mode, or fast mode for tasks started from Slack ("use Codex for Slack tasks"), call \`${REPLICAS_MCP_TOOLS.setSlackAgentDefaults}\` (admin only).
17743
+ - **"What can I change?"** Read the current settings, then list what applies with each current value: how much you speak up here and in every channel (raising a channel above Mentions only and the every-channel default need an admin), instructions or a preset for this channel, sending this channel's requests to a Mothership, which Linear teams you triage (an admin starts one), and the Slack agent defaults (admin).
17744
+ - After any change, say what changed and its scope ("every channel", or "#eng only"). Confirm only after the tool succeeded and only what it changed; say so when it failed or did less than asked.
17745
+
17746
+ ## Offers
17747
+ When the envelope has \`offers\`, it lists the offers you may still make in this channel (${SCOUT_CHANNEL_SETTINGS_OFFERS.map((offer) => `\`${offer}\``).join(", ")}); \`offers=none\` means none. Offer only what it lists, at most one per message. Claim the offer with \`${REPLICAS_MCP_TOOLS.claimSettingsOffer}\` right before posting it, and post only when the claim succeeds. When someone declines ("no", "it's fine", "leave it"), record it with \`declined: true\`; never repeat an ignored offer. When they accept, apply it with the tools above using the accepting message as confirmation, then confirm in one short line.
17748
+ - **Frustration.** When someone is clearly annoyed that you replied or acted unasked ("wtf why did replicas respond", "not you", "nobody asked", or a thumbs-down on a reply you posted unasked), claim \`proactivity\` and post one short apology offering to lower this channel exactly one step. From Balanced or High: "Sorry for jumping in. Want me to only reply here when someone mentions me by name?" From Low: "Sorry for jumping in. Want me to only reply here when someone @mentions me?" On a yes, set that level, nothing lower. Do nothing else in that thread. When the claim answers \`offer: organization\`, offer to set every channel's default to \`organization_target\` instead; when \`requester_is_admin\` is false, say an admin can change it for every channel and offer this channel. An explicit "stop replying in this thread" is still a thread mute.
17749
+ - **Having to tag you.** After doing what an earlier untagged message asked, claim \`raise_proactivity\` and end your reply with one line offering one step up. From Mentions only: "Want me to pick up messages here that name me, without an @mention? @mention me with your answer." From Low: "Want me to pick up requests like that here without a tag next time? I can raise this channel to Balanced." From Balanced: "Want me to jump in on requests like that here without being asked? I can raise this channel to High." When the claim answers \`offer: organization\`, offer to raise every channel's default to \`organization_target\` instead, and say channels with their own level keep it. Mention an admin only when the claim answers \`needs_admin: true\`, then offer this channel instead. On a yes, raise to that level only.
17750
+ - **Channel instructions.** When you join a channel or first act in one whose name or purpose points to a clear role (#triage, #bugs, #incidents, #support, #customer-*, a customer's shared channel), claim \`instructions\` and offer one concrete behavior in one line ("This looks like an incident channel. Want me to triage new reports here, check for duplicates, and post findings in the thread?"). Make the same kind of offer when you keep handling messages here the same way, or the channel clearly belongs to a Mothership (offer to send its actionable messages to it by name). On a yes, save it as the channel's instructions, or its preset when one fits exactly.
17751
+
17752
+ ## Automations
17753
+ When someone accepts an offer to automate a repeated request, set it up here instead of spawning. Infer the name, prompt, environment, repositories, schedule, and timezone from the conversation and the organization's configuration; ask one concise follow-up only for a missing detail that changes when or where it runs. Create it with \`${REPLICAS_MCP_TOOLS.createAutomation}\`, filling \`confirmation_*\` from the accepting message's envelope. The server checks that author is an organization member with automation write access; never create it if that fails. Post the result in the same thread.
17754
+ `;
17755
+ }
17756
+ });
17757
+
17712
17758
  // ../shared/src/workspace-attention.ts
17713
17759
  var WORKSPACE_ATTENTION_REASONS, CHAT_ATTENTION_REASONS;
17714
17760
  var init_workspace_attention = __esm({
@@ -20602,10 +20648,12 @@ function defaultReplicasAgentAbilities() {
20602
20648
  function hasAllReplicasAgentAbilities(abilities) {
20603
20649
  return REPLICAS_AGENT_ABILITIES.every((key) => typeof abilities[key] === "boolean");
20604
20650
  }
20605
- var EMPTY_AGENT_DEFAULT_SETTINGS, DEFAULT_SUBAGENT_MCP_PROVIDERS, ALERT_SOUND_FAMILIES, ALERT_SOUNDS, PUSH_WHEN_ACTIVE_COPY, DEFAULT_USER_PREFERENCES, DEFAULT_DEFAULT_SKILLS;
20651
+ var EMPTY_AGENT_DEFAULT_SETTINGS, DEFAULT_SUBAGENT_MCP_PROVIDERS, ALERT_SOUND_FAMILIES, ALERT_SOUNDS, PUSH_WHEN_ACTIVE_COPY, DEFAULT_USER_PREFERENCES, DEFAULT_DEFAULT_SKILLS, LINEAR_ROUTING_SKILL_MAX_LENGTH, linearRoutingSkillSchema;
20606
20652
  var init_preferences = __esm({
20607
20653
  "../shared/src/routes/preferences.ts"() {
20608
20654
  "use strict";
20655
+ init_zod();
20656
+ init_uuid();
20609
20657
  init_agent();
20610
20658
  init_push();
20611
20659
  init_registry();
@@ -20675,6 +20723,11 @@ var init_preferences = __esm({
20675
20723
  abilities: defaultReplicasAgentAbilities()
20676
20724
  }
20677
20725
  };
20726
+ LINEAR_ROUTING_SKILL_MAX_LENGTH = 5e4;
20727
+ linearRoutingSkillSchema = external_exports.union([
20728
+ external_exports.object({ name: external_exports.string().min(1), content: external_exports.string().trim().min(1).max(LINEAR_ROUTING_SKILL_MAX_LENGTH) }),
20729
+ external_exports.object({ name: external_exports.string().min(1), repository_id: external_exports.string().regex(UUID_RE), path: external_exports.string().min(1) })
20730
+ ]);
20678
20731
  }
20679
20732
  });
20680
20733
 
@@ -20695,7 +20748,7 @@ function removeTag(text4, tag) {
20695
20748
  function stripReplicasInstructionBlock(text4) {
20696
20749
  return removeTag(text4, REPLICAS_INSTRUCTIONS_TAG);
20697
20750
  }
20698
- var REPLICAS_INSTRUCTIONS_TAG, MOTHERSHIP_INSTRUCTIONS_TAG, BOARD_RULES, MOTHERSHIP_INSTRUCTIONS_BLOCK, SCOUT_ADAPTIVE_SETTINGS_PROMPT;
20751
+ var REPLICAS_INSTRUCTIONS_TAG, MOTHERSHIP_INSTRUCTIONS_TAG, BOARD_RULES, MOTHERSHIP_INSTRUCTIONS_BLOCK, T, SCOUT_LINEAR_RULES, SCOUT_MUTED_RULES, SCOUT_PRIOR_UNTAGGED_RULES, SCOUT_JOINED_RULES, SCOUT_REACTION_RULES;
20699
20752
  var init_prompts = __esm({
20700
20753
  "../shared/src/prompts.ts"() {
20701
20754
  "use strict";
@@ -20704,6 +20757,7 @@ var init_prompts = __esm({
20704
20757
  init_types4();
20705
20758
  init_replicas_mcp();
20706
20759
  init_scout();
20760
+ init_scout_settings();
20707
20761
  init_preferences();
20708
20762
  init_registry();
20709
20763
  init_replicas_agent();
@@ -20714,18 +20768,20 @@ var init_prompts = __esm({
20714
20768
  BOARD_RULES = `- The board, a live status page you keep with \`${REPLICAS_MCP_TOOLS.updateBoard}\` in the Ships pane beside this chat, is the user's one view of the work: keep it covering every ship, pull request, deploy, blocker and ask. Show ships, pull requests and Linear tickets as ship, pr and linear blocks, which stay current on their own, instead of describing their status. Start with sections Needs you, Ready to review, Working, Shipping and Done, and add blocks and buttons whenever they help the user act.
20715
20769
  - A ship with open pull requests is not done when it sends \`finished\`: Replicas fixes their CI failures and review comments automatically, then sends \`ready\` or \`needs_attention\`. On \`needs_attention\`, direct the ship, or put the decision to the user if it needs one.
20716
20770
  - On every ship event, update the board, act with tools if other work waits on it, such as starting the next task once a pull request merges, and end your turn with no text at all. Never write an acknowledgement such as "Noted.", even if earlier turns did.
20717
- - Write in chat only to answer the user, or to ask a decision in a line or two. Put each decision on the board too, as a choice when it has clear options, and ask it in chat once. Never restate the board in chat: no status tables, per-ship lists or summaries of what ships did; link the pull request you mean and leave status to the board.
20771
+ - The chat is like texting an assistant: the user sees only your last message of each turn, never your tool calls or earlier text. Write there only to answer the user, to ask a decision only they can make in a line or two, or to say in a line, with links, that work they asked for is done. Everything else, especially progress, goes on the board: spend your effort there, not in chat. Put each decision on the board too, as a choice when it has clear options, and ask it in chat once. Never restate the board in chat: no status tables, per-ship lists or summaries of what ships did.
20718
20772
  - When the user picks a choice or clicks a button that messages or merges, Replicas removes that item from the board for you. Add it back, or a new item, only if the user is still needed.
20719
20773
  `;
20720
20774
  MOTHERSHIP_INSTRUCTIONS_BLOCK = new RegExp(`\\s*<${MOTHERSHIP_INSTRUCTIONS_TAG}>\\n([\\s\\S]*?)\\n</${MOTHERSHIP_INSTRUCTIONS_TAG}>`);
20721
- SCOUT_ADAPTIVE_SETTINGS_PROMPT = `### Adapting to each channel
20722
- There is no settings page: people change how you behave by telling you, and you suggest a change when it would clearly help. The envelope carries the channel's \`proactivity\` and \`offers\`, the offers you may still make in this channel (${SCOUT_CHANNEL_SETTINGS_OFFERS.map((offer) => `\`${offer}\``).join(", ")}); \`offers=none\` means make none. Offer only what \`offers\` lists, at most one per message. Claim an offer with \`${REPLICAS_MCP_TOOLS.claimSettingsOffer}\` right before posting it, and post it only when the claim succeeds. When someone declines ("no", "it's fine", "leave it"), record it with \`declined: true\` and drop it; never repeat an ignored offer. When they accept, apply it with the settings tools using the accepting message as confirmation, then confirm what changed in one short line.
20723
- - **Frustration.** When someone is clearly annoyed that you replied or acted unasked ("wtf why did replicas respond", "stop", "not you", "nobody asked", or \`event=reaction:\u2026\`, a thumbs-down or similar on a reply you posted unasked), claim \`proactivity\` and post one short apology that offers to lower this channel exactly one step. From Balanced or High, offer Low: "Sorry for jumping in. Want me to only reply here when someone mentions me by name?" From Low, offer Mentions only: "Sorry for jumping in. Want me to only reply here when someone @mentions me?" On a yes, set the level you offered, nothing lower. Do nothing else in that thread. When the claim answers \`offer: organization\`, people were frustrated in several channels, so offer to set every channel's default to \`organization_target\` instead; when \`requester_is_admin\` is false, say an organization admin can change it for every channel and offer this channel. A thumbs-down on a reply someone asked for is about the answer, not about speaking up, so leave it. An explicit "stop replying in this thread" is still a thread mute.
20724
- - **Having to tag you.** \`prior_untagged_ignored=<ts>\` means the untagged message with that \`ts\`, just before this ping in this thread or channel, never reached you: the channel's level or the untagged check held it back. When this ping points back at it ("do the above", "^", "can you do this", "see above", a quote of it, "why didn't you pick this up") and it was a question or request for you, it was really meant for you: do what it asked, then claim \`raise_proactivity\` and end your reply with one line offering to pick up messages like that without a tag next time. Read the message first (\`conversations.replies\` in a thread, \`conversations.history\` at the top level). Make no offer when this ping is its own fresh request, or when that message was chatter or meant for someone else. Offer exactly one step up: from Mentions only, "Want me to pick up messages here that name me, without an @mention? @mention me with your answer."; from Low, "Want me to pick up requests like that here without a tag next time? I can raise this channel to Balanced."; from Balanced, "Want me to jump in on requests like that here without being asked? I can raise this channel to High." When the claim answers \`offer: organization\`, people had to tag you in several channels, so offer to raise every channel's default to \`organization_target\` instead, and say channels with their own level keep it. Mention an admin only when the claim answers \`needs_admin: true\`: then say an organization admin can make that change, and for \`offer: organization\` offer this channel instead. On a yes, raise to that level only.
20725
- - **Channel instructions.** On \`event=joined\` (you were just added to the channel; reply in that envelope's thread), or when you act in a channel for the first time, and the channel's name or purpose points to a clear role (#triage, #bugs, #incidents, #support, #customer-*, a customer's shared channel), claim \`instructions\` and offer one concrete behavior in one line, such as "This looks like an incident channel. Want me to triage new reports here, check for duplicates, and post findings in the thread?" On \`event=joined\` without a clear role, do nothing at all. Make the same kind of offer when you notice you keep handling messages here the same way, or that the channel clearly belongs to a Mothership (offer to send its actionable messages to that Mothership by name). On a yes, save it as the channel's instructions, or as its preset when one fits exactly.
20726
- - **Tip.** When the envelope has \`tip=true\`, this is the first time someone pinged you in this channel, so end the reply you post with one more line: "_Tip: tell me how you want me to act in this channel._" It is shown once per channel, so never add it otherwise.
20727
- - **Slack agent defaults.** To change the agent, model, thinking level, goal mode or fast mode used for tasks started from Slack ("use Codex for Slack tasks"), call \`${REPLICAS_MCP_TOOLS.setSlackAgentDefaults}\`; only an organization admin can.
20728
- - **What can I change?** Read the current settings, then answer with a short list of what applies: how much you speak up here or in every channel (Mentions only, Low, Balanced, High; raising a channel above Mentions only and the every-channel default need an admin), instructions or a preset for this channel, sending this channel's requests to a Mothership, which Linear teams you triage (an admin starts one), and the agent defaults for Slack tasks (admin). Say each one's current value.`;
20775
+ T = REPLICAS_MCP_TOOLS;
20776
+ SCOUT_LINEAR_RULES = `Linear issue triage: team instructions define what is actionable. Use \`replicas.linear.graphql\` from \`@replicas/sdk\` for every Linear read and mutation, never a Replicas CLI command. Choose exactly one:
20777
+ 1. **Ignore** issues the team instructions leave to humans or that should not start work: do nothing and write nothing to Linear. If \`agent_session_id\` is set because you asked a question earlier, create a \`response\` Agent Activity on it with one short closing response.
20778
+ 2. **Ask** when the issue is likely actionable but lacks a requirement, reproduction, or other information needed to start safely. With \`agent_session_id=none\`, create a Linear comment on \`issue_id\` containing only one concise question, register the \`ask\` intent for it with \`${T.linearSessionIntent}\` (\`comment_id\`, \`action\`), then call \`agentSessionCreateOnComment\`. With a session, create an \`elicitation\` Agent Activity with the question; never create another comment or session.
20779
+ 3. **Start** when the issue is clear and the team instructions permit work. With \`agent_session_id=none\`, comment only a one-line handoff such as "Picking this up.", register the \`start\` intent for it, then call \`agentSessionCreateOnComment\`. With a session, call \`${T.linearStart}\` with \`issue_id\`, \`agent_session_id\`, and the latest request in its author's words, so a coding workspace takes over that session. Never create a second session or do the work yourself.
20780
+ Check every mutation and tool call succeeded. Never put routing metadata in visible Linear text, invent a session ID, or change the issue's labels, priority, assignee, project, or state. Decide each issue separately, and start no second workspace when \`issue_has_workspace=true\`.`;
20781
+ SCOUT_MUTED_RULES = `This thread is muted (\`muted=true\`). With \`directed=false\`, ignore the message even when it names Replicas, asks for urgent work, or answers a workspace question; the only exception is an explicit request to unmute, come back, or respond again, which you record with \`${T.setThreadMuted}\` and \`muted: false\` and then triage normally. Never infer an unmute from ordinary conversation. A \`directed=true\` ping may be handled normally, but it does not end the mute. Your own latest \`${T.setThreadMuted}\` call for this thread overrides this flag.`;
20782
+ SCOUT_PRIOR_UNTAGGED_RULES = `\`prior_untagged_ignored=<ts>\`: the untagged message with that \`ts\`, just before this ping, never reached you. If this ping points back at it ("do the above", "^", "see above", "why didn't you pick this up") and it was a question or request for you, read it (\`conversations.replies\` in a thread, \`conversations.history\` at the top level), do what it asked, then follow **Having to tag you** in the \`${SCOUT_SETTINGS_SKILL_NAME}\` skill to offer picking up messages like it without a tag. Offer nothing when this ping is its own fresh request or that message was chatter or meant for someone else.`;
20783
+ SCOUT_JOINED_RULES = `\`event=joined\`: you were just added to this channel; reply in this envelope's thread. If the channel's name or purpose points to a clear role (#triage, #bugs, #incidents, #support, #customer-*, a customer's shared channel), follow **Channel instructions** in the \`${SCOUT_SETTINGS_SKILL_NAME}\` skill to offer one concrete behavior. Otherwise do nothing at all.`;
20784
+ SCOUT_REACTION_RULES = `\`event=reaction:\u2026\`: someone reacted to a message you posted. A thumbs-down or similar on a reply you posted unasked is frustration: follow **Frustration** in the \`${SCOUT_SETTINGS_SKILL_NAME}\` skill. On a reply someone asked for, it is about the answer: leave it. Otherwise do nothing.`;
20729
20785
  }
20730
20786
  });
20731
20787
 
@@ -31798,6 +31854,7 @@ var init_default_skills = __esm({
31798
31854
  "../shared/src/default-skills/index.ts"() {
31799
31855
  "use strict";
31800
31856
  init_replicas_agent();
31857
+ init_scout_settings();
31801
31858
  }
31802
31859
  });
31803
31860
 
@@ -31872,7 +31929,7 @@ var CLI_VERSION;
31872
31929
  var init_cli_version = __esm({
31873
31930
  "../shared/src/cli-version.ts"() {
31874
31931
  "use strict";
31875
- CLI_VERSION = "0.3.307";
31932
+ CLI_VERSION = "0.3.310";
31876
31933
  }
31877
31934
  });
31878
31935
 
@@ -32109,7 +32166,7 @@ var init_slack2 = __esm({
32109
32166
  });
32110
32167
 
32111
32168
  // ../shared/src/routes/scout.ts
32112
- var SCOUT_LINEAR_ACTIONS, scoutLinearSessionIntentRequestSchema, scoutLinearStartRequestSchema, slackChannelIdSchema, slackThreadTsSchema, scoutSlackSpawnRequestSchema, scoutSlackSpawnInNewThreadRequestSchema, scoutSlackRelayRequestSchema, scoutSlackSetThreadMutedRequestSchema, scoutListWorkspacesRequestSchema, scoutSlackConfirmationSchema, scoutAutomationToolInputSchema, scoutSaveChannelPresetToolInputSchema, scoutUpdateChannelSettingsToolInputSchema, scoutSetSlackConnectMutedToolInputSchema, scoutSetSlackConnectDefaultsToolInputSchema, scoutSetOrganizationProactivityToolInputSchema, scoutDeleteChannelPresetToolInputSchema, RESET_TO_DEFAULT, resettable, scoutSetSlackAgentDefaultsToolInputSchema, scoutClaimSettingsOfferToolInputSchema;
32169
+ var SCOUT_LINEAR_ACTIONS, scoutLinearSessionIntentRequestSchema, scoutLinearStartRequestSchema, scoutRouteLinearTicketRequestSchema, slackChannelIdSchema, slackThreadTsSchema, scoutSlackSpawnRequestSchema, scoutSlackSpawnInNewThreadRequestSchema, scoutSlackRelayRequestSchema, scoutSlackSetThreadMutedRequestSchema, scoutListWorkspacesRequestSchema, scoutSlackConfirmationSchema, scoutAutomationToolInputSchema, scoutSaveChannelPresetToolInputSchema, scoutUpdateChannelSettingsToolInputSchema, scoutSetSlackConnectMutedToolInputSchema, scoutSetSlackConnectDefaultsToolInputSchema, scoutSetOrganizationProactivityToolInputSchema, scoutDeleteChannelPresetToolInputSchema, RESET_TO_DEFAULT, resettable, scoutSetSlackAgentDefaultsToolInputSchema, scoutClaimSettingsOfferToolInputSchema;
32113
32170
  var init_scout2 = __esm({
32114
32171
  "../shared/src/routes/scout.ts"() {
32115
32172
  "use strict";
@@ -32128,6 +32185,11 @@ var init_scout2 = __esm({
32128
32185
  agent_session_id: external_exports.string().describe("Existing Linear agent session id from the envelope's `agent_session_id`."),
32129
32186
  prompt: external_exports.string().trim().min(1).describe("The latest request, in its author's words. The workspace already receives the issue and its comments.")
32130
32187
  });
32188
+ scoutRouteLinearTicketRequestSchema = external_exports.object({
32189
+ agent_session_id: external_exports.string().trim().min(1).describe("The ticket's `agent_session_id` from the envelope."),
32190
+ environment_id: external_exports.string().trim().min(1).optional().describe("Start the ticket in this environment."),
32191
+ mothership_id: external_exports.string().trim().min(1).optional().describe("Hand the ticket to this Mothership instead.")
32192
+ }).refine((args) => !(args.environment_id && args.mothership_id), "Pass environment_id or mothership_id, not both.");
32131
32193
  slackChannelIdSchema = external_exports.string().describe("Slack channel id from the envelope's `channel_id`.");
32132
32194
  slackThreadTsSchema = external_exports.string().describe("Slack thread timestamp from the envelope's `thread_ts`.");
32133
32195
  scoutSlackSpawnRequestSchema = external_exports.object({
@@ -42565,6 +42627,7 @@ var init_mothership_board = __esm({
42565
42627
  type: external_exports.literal("section"),
42566
42628
  id: blockId.optional(),
42567
42629
  title: label(120),
42630
+ tone: tone.optional(),
42568
42631
  collapsed: external_exports.boolean().optional(),
42569
42632
  get children() {
42570
42633
  return external_exports.array(block).max(100);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-cli",
3
- "version": "0.3.308",
3
+ "version": "0.3.310",
4
4
  "description": "CLI for managing Replicas workspaces - SSH into cloud dev environments with automatic port forwarding",
5
5
  "main": "dist/index.cjs",
6
6
  "bin": {