@sideboard-ai/core 0.1.327 → 0.1.329

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 (69) hide show
  1. package/dist/{abletime-OW7LTFQD.js → abletime-5FBKBO3R.js} +4 -4
  2. package/dist/{abletime-NW4PJGHN.js → abletime-SO2YHMEI.js} +4 -4
  3. package/dist/{abletime-oauth-TPR2QDRI.js → abletime-oauth-EUC5FFMD.js} +5 -5
  4. package/dist/{abletime-oauth-KWQQRHOQ.js → abletime-oauth-I34WZZZL.js} +3 -3
  5. package/dist/{abletime-rest-5DCWN3P4.js → abletime-rest-EI5ZJ72Z.js} +3 -3
  6. package/dist/{abletime-rest-UJ6SXDBN.js → abletime-rest-HEQXSZAQ.js} +3 -3
  7. package/dist/agents/claude-runner.js +1 -1
  8. package/dist/{agents-XWIPONJR.js → agents-JH4WV2ZH.js} +7 -7
  9. package/dist/{agents-IYBY3JT5.js → agents-JXQKHY7Q.js} +7 -7
  10. package/dist/{app-settings-A5D364JD.js → app-settings-JAEV53LB.js} +1 -1
  11. package/dist/{app-settings-SA4HX3ZQ.js → app-settings-SHZWNJBV.js} +1 -1
  12. package/dist/{chunk-TUH4ICHQ.js → chunk-277I5IBI.js} +1 -1
  13. package/dist/{chunk-QMLDR63X.js → chunk-3DJQLQWU.js} +2 -2
  14. package/dist/{chunk-EJRCHCXM.js → chunk-7BAS6DF7.js} +2 -1
  15. package/dist/{chunk-ECY7WL6T.js → chunk-7L36GZA4.js} +2 -2
  16. package/dist/{chunk-SFXGD5KJ.js → chunk-7MPRTC6X.js} +1 -1
  17. package/dist/{chunk-ZPBOWO64.js → chunk-BAIPCN34.js} +2 -2
  18. package/dist/{chunk-SB5ADEZZ.js → chunk-D6V6F74A.js} +5 -5
  19. package/dist/{chunk-MO46K6WK.js → chunk-DBRQ5NNB.js} +8 -8
  20. package/dist/{chunk-NQGLDQYB.js → chunk-DFKLWWLY.js} +7 -7
  21. package/dist/{chunk-YUHZEIVG.js → chunk-E6LONPQH.js} +78 -24
  22. package/dist/{chunk-5Y2C7Q55.js → chunk-EW5D53VB.js} +1 -1
  23. package/dist/{chunk-D446IWPP.js → chunk-EY5BJAPV.js} +2 -1
  24. package/dist/{chunk-XBBZZHJY.js → chunk-F4OUZDIB.js} +5 -5
  25. package/dist/{chunk-Q4UPRQOS.js → chunk-G45SGI57.js} +3 -3
  26. package/dist/{chunk-DEB47BII.js → chunk-HCK3UCBJ.js} +80 -26
  27. package/dist/{chunk-EUIVQAPK.js → chunk-HJIA4X3L.js} +2 -2
  28. package/dist/{chunk-4F7THWIO.js → chunk-JQWCZGSO.js} +2 -2
  29. package/dist/{chunk-IXWPCOLQ.js → chunk-KUD24QYI.js} +37 -7
  30. package/dist/{chunk-4G3W23X3.js → chunk-MXQ66CLO.js} +3 -3
  31. package/dist/{chunk-UMXBH344.js → chunk-NCFYUUSC.js} +1 -1
  32. package/dist/{chunk-ULWPSBAB.js → chunk-NJV5YEKI.js} +13 -11
  33. package/dist/{chunk-2GEUFPQQ.js → chunk-NQHTYX35.js} +1 -1
  34. package/dist/{chunk-RDXODLEN.js → chunk-O7JSWISN.js} +3 -3
  35. package/dist/{chunk-R2C45NHT.js → chunk-P4QRDXRY.js} +2 -2
  36. package/dist/{chunk-RZJ3QJZT.js → chunk-PZ5MVD27.js} +34 -19
  37. package/dist/{chunk-Y6OHM672.js → chunk-QVLDZWHZ.js} +1 -1
  38. package/dist/{chunk-DACWFN4O.js → chunk-SKPX66MO.js} +5 -5
  39. package/dist/{chunk-JKHCADKB.js → chunk-U7EANR52.js} +2 -2
  40. package/dist/{chunk-KLVW3J2B.js → chunk-XOIJJRAQ.js} +2 -2
  41. package/dist/{chunk-CHYUUETG.js → chunk-YMV5O7KY.js} +3 -3
  42. package/dist/{chunk-ATQLP22S.js → chunk-ZT5YPYZE.js} +1 -1
  43. package/dist/{conductor-D62Q2XJC.js → conductor-6DIR7A4N.js} +5 -5
  44. package/dist/{conductor-CP7TW6TN.js → conductor-FA27ZGCV.js} +6 -6
  45. package/dist/{coordinator-prompt-J7O7JB26.js → coordinator-prompt-B6RHGEJK.js} +4 -4
  46. package/dist/{coordinator-prompt-3PJLU3UH.js → coordinator-prompt-KAZXK5FZ.js} +4 -4
  47. package/dist/{global-workspace-Y3UDZYJX.js → global-workspace-IOKHZCXD.js} +4 -4
  48. package/dist/{global-workspace-4CTLU2BV.js → global-workspace-JKINHUY3.js} +4 -4
  49. package/dist/index.cjs +107 -22
  50. package/dist/index.d.cts +30 -18
  51. package/dist/index.d.ts +30 -18
  52. package/dist/index.js +27 -25
  53. package/dist/{linear-CXWGH2TW.js → linear-7HSIGV5S.js} +2 -2
  54. package/dist/{linear-WLDCJ3AF.js → linear-FRJRK6KI.js} +2 -2
  55. package/dist/{linear-list-52LEDEWO.js → linear-list-I6DNJC6V.js} +1 -1
  56. package/dist/{linear-list-FGVN65JU.js → linear-list-LDMBSKYI.js} +1 -1
  57. package/dist/mcp/run-stdio.cjs +89 -21
  58. package/dist/mcp/run-stdio.js +16 -16
  59. package/dist/{optional-cli-INRVBBBG.js → optional-cli-FOSC4NVE.js} +3 -3
  60. package/dist/{optional-cli-FN4MGB6W.js → optional-cli-NSQZ2DYK.js} +4 -4
  61. package/dist/{orchestrator-EN3ZKD73.js → orchestrator-LI6EBD2Y.js} +11 -11
  62. package/dist/{orchestrator-W4TZBBDO.js → orchestrator-V35TLMXB.js} +10 -10
  63. package/dist/{thread-store-K2ZNGUSM.js → thread-store-NVFWKJFH.js} +2 -2
  64. package/dist/{thread-store-4WE24XA2.js → thread-store-PCIMS6RA.js} +2 -2
  65. package/dist/{workspaces-MM7CQYR6.js → workspaces-FJL3TL3K.js} +4 -4
  66. package/dist/{workspaces-WYCVZ6XH.js → workspaces-OLONQF2C.js} +4 -4
  67. package/dist/{worktree-JBNEMJ5Z.js → worktree-QSQJ2POO.js} +3 -3
  68. package/dist/{worktree-NNVRGPP4.js → worktree-TX4WXQZV.js} +3 -3
  69. package/package.json +1 -1
package/dist/index.d.cts CHANGED
@@ -8,8 +8,9 @@ import { EventEmitter } from 'node:events';
8
8
  * Why an agent is waiting on a person. Process liveness stays on
9
9
  * `ThreadStatus`; this is the attention flag (Herdr `blocked`).
10
10
  * Cleared when the next user message starts a turn. An ask_user highlight
11
- * is shown only while that question is on screen in the agent, and drops
12
- * when the picker is gone (skip, a later user message, or the agent moved on).
11
+ * stays until the user answers or skips. A later tool in the same turn
12
+ * does not remove it — the tool returns immediately, and the model often
13
+ * keeps going before the person can answer.
13
14
  */
14
15
  type AgentBlockSource = 'ask_user' | 'plan' | 'reported' | 'permission';
15
16
  /** Composer Allow / Deny while a tool waits on the user. */
@@ -47,9 +48,9 @@ interface AgentBlock {
47
48
  }>;
48
49
  }>;
49
50
  /**
50
- * True once ask_user is the last top-level tool in the live stream or
51
- * the finished turn. A mid-turn stamp without this stays off the
52
- * sidebar / board / phone until the picker is actually on screen.
51
+ * True once ask_user is in the live stream or the finished turn.
52
+ * A mid-turn stamp without this stays off the sidebar / board / phone
53
+ * until the picker is actually on screen. A later tool does not clear it.
53
54
  */
54
55
  onScreen?: boolean;
55
56
  permission?: AgentPermissionPrompt;
@@ -3522,7 +3523,7 @@ declare const ABLETIME_OAUTH_PORT = 19849;
3522
3523
  /** Local listener the marketing-site bounce sends the browser to. */
3523
3524
  declare const ABLETIME_OAUTH_LOCAL_CALLBACK = "http://127.0.0.1:19849/callback";
3524
3525
  /** Registered redirect — must match `site/oauth/abletime-client.json` redirect_uris. */
3525
- declare const ABLETIME_OAUTH_REDIRECT = "https://www.sideboard.cloud/oauth/abletime/callback";
3526
+ declare const ABLETIME_OAUTH_REDIRECT = "https://www.sideboard.build/oauth/abletime/callback";
3526
3527
  declare function ableTimeOAuthRedirectUri(): string;
3527
3528
  declare function parseAbleTimeOAuthCallbackUrl(reqUrl: string): URL | null;
3528
3529
  /** Map the hosted callback onto the desktop listener (query: code / state / error). */
@@ -3530,7 +3531,7 @@ declare function ableTimeOAuthLocalBounceUrl(reqUrl: string): string | null;
3530
3531
  /** Marketing-site page that immediately opens the desktop listener. */
3531
3532
  declare function ableTimeOAuthBouncePage(localUrl: string): string;
3532
3533
  /** Client ID Metadata Document (AbleTime advertises CIMD, not DCR). */
3533
- declare const BAKED_ABLETIME_OAUTH_CLIENT_ID = "https://www.sideboard.cloud/oauth/abletime-client.json";
3534
+ declare const BAKED_ABLETIME_OAUTH_CLIENT_ID = "https://www.sideboard.build/oauth/abletime-client.json";
3534
3535
  declare const ABLETIME_OAUTH_RESOURCE = "https://track.abletime.com/api/public/v2/mcp";
3535
3536
  declare function hasBakedAbleTimeOAuth(): boolean;
3536
3537
  declare function ableTimeOAuthClientId(): string;
@@ -5833,7 +5834,7 @@ declare function applyThreadIntoMain(thread: Pick<Thread, 'repoPath' | 'worktree
5833
5834
  * |------------------|-----------------------------------------------------------|
5834
5835
  * | submitted | queued — waiting for a concurrency slot, not started |
5835
5836
  * | working | the agent is running this turn |
5836
- * | input-required | turn ended on `ask_user`; the human must answer |
5837
+ * | input-required | unanswered `ask_user`, even if a later tool ran |
5837
5838
  * | completed | turn ended with an answer |
5838
5839
  * | failed | runner / agent error, or worktree missing (`broken`) |
5839
5840
  * | canceled | force-stopped before finishing |
@@ -5855,6 +5856,9 @@ declare function deriveTaskState(input: {
5855
5856
  stillRunning: boolean;
5856
5857
  /** Parts of the last agent reply (not an injected notice). */
5857
5858
  lastAgentParts?: MessagePart[];
5859
+ dismissedQuestionSignature?: string | null;
5860
+ /** A real user message landed after the agent reply that asked. */
5861
+ userAnswered?: boolean;
5858
5862
  }): TaskState;
5859
5863
  /** Snapshot returned by `getTurnResult`. Block fields are optional so older test doubles typecheck. */
5860
5864
  type TurnResult = {
@@ -6636,7 +6640,7 @@ type ToolPartLike = {
6636
6640
  };
6637
6641
  /** True when the last top-level tool (not a nested child) is ask_user. */
6638
6642
  declare function lastTopLevelToolIsAskUser(parts: ToolPartLike[] | undefined | null): boolean;
6639
- /** Newest ask-user tool part with parseable questions (live or persisted). */
6643
+ /** Newest top-level ask-user tool with parseable questions. Nested calls do not count. */
6640
6644
  declare function extractPendingPlanQuestions(parts: ToolPartLike[] | undefined | null): PendingPlanQuestions | null;
6641
6645
  /** Sidebar ask_user highlight, including questions stamped at call time. */
6642
6646
  interface AskBlockSnapshot {
@@ -6644,6 +6648,8 @@ interface AskBlockSnapshot {
6644
6648
  at?: string;
6645
6649
  questionSignature?: string;
6646
6650
  questions?: PlanQuestion[];
6651
+ /** Set once the picker is in the live stream. A mid-turn stamp omits it. */
6652
+ onScreen?: boolean;
6647
6653
  }
6648
6654
  /**
6649
6655
  * True when no later user reply has landed after this ask.
@@ -6675,7 +6681,10 @@ declare function latestPendingPlanQuestions(input: {
6675
6681
  */
6676
6682
  agentBlock?: AskBlockSnapshot | null;
6677
6683
  dismissedQuestionSignature?: string | null;
6678
- /** Hide a mid-turn stamp until the ask is the last tool (or the turn ends). */
6684
+ /**
6685
+ * Hide a mid-turn stamp until the ask is in the stream (or the turn
6686
+ * ends). Once the picker is on screen, a later tool must not hide it.
6687
+ */
6679
6688
  status?: string;
6680
6689
  }): PendingPlanQuestions | null;
6681
6690
  interface PlanQuestionAnswer {
@@ -6994,7 +7003,7 @@ declare function worktreeBoardStatus(group: Array<Pick<Thread, 'status'>>): Thre
6994
7003
  * Blocked highlight. Errors and archived chats keep their own status.
6995
7004
  * An ask_user stamp lands when the tool is called — before the picker is on
6996
7005
  * screen — so hide it while the turn is in flight unless `onScreen` (the
6997
- * live last tool is ask_user). Drop it once the chat is no longer asking.
7006
+ * ask is in the live stream). Drop it once the user answers or skips.
6998
7007
  */
6999
7008
  declare function visibleAgentBlock(thread: AgentBlockThread): AgentBlock | null;
7000
7009
  /**
@@ -8331,7 +8340,7 @@ declare function closeMcpUiHost(): void;
8331
8340
  declare function stashMcpAppModelContext(threadId: string, text: string): void;
8332
8341
 
8333
8342
  /** Public WebSocket URL for Slack desktops on the hosted relay (path included). */
8334
- declare const BAKED_SLACK_RELAY_URL = "wss://relay.sideboard.cloud/slack/desktop";
8343
+ declare const BAKED_SLACK_RELAY_URL = "wss://relay.sideboard.build/slack/desktop";
8335
8344
  declare function hasBakedSlackOAuth(): boolean;
8336
8345
  /**
8337
8346
  * WebSocket URL for this Mac's Slack desktop session on the relay.
@@ -8339,7 +8348,7 @@ declare function hasBakedSlackOAuth(): boolean;
8339
8348
  */
8340
8349
  declare function slackRelayUrl(): string;
8341
8350
 
8342
- declare const SLACK_OAUTH_REDIRECT = "https://relay.sideboard.cloud/slack/callback";
8351
+ declare const SLACK_OAUTH_REDIRECT = "https://relay.sideboard.build/slack/callback";
8343
8352
 
8344
8353
  declare function slackOAuthResultUrl(state: string, relayWsUrl?: string): string;
8345
8354
 
@@ -8603,7 +8612,7 @@ declare function runRemoteHost(opts: RemoteHostClientOptions): RemoteHostHandle;
8603
8612
 
8604
8613
  /** Phone ↔ relay ↔ Mac. Message text only. The Mac runs the orchestrator. */
8605
8614
  declare const REMOTE_RELAY_PATH = "/remote";
8606
- declare const BAKED_REMOTE_RELAY_URL = "wss://relay.sideboard.cloud/remote";
8615
+ declare const BAKED_REMOTE_RELAY_URL = "wss://relay.sideboard.build/remote";
8607
8616
  /**
8608
8617
  * `wss://host/remote`, or `ws://` for a local relay.
8609
8618
  * `https://host` and a host with no path become that WebSocket URL.
@@ -8709,7 +8718,7 @@ declare function handleRemoteInbound(text: string, opts: {
8709
8718
  }): void;
8710
8719
 
8711
8720
  declare function isRemoteAccountLoginCancelled(err: unknown): boolean;
8712
- /** `wss://relay.sideboard.cloud/remote` → `https://relay.sideboard.cloud`. */
8721
+ /** `wss://relay.sideboard.build/remote` → `https://relay.sideboard.build`. */
8713
8722
  declare function remoteAccountHttpOrigin(wsUrl?: string): string;
8714
8723
  type RemoteAccountSession = {
8715
8724
  credential: string;
@@ -8872,7 +8881,10 @@ interface RelayServerOptions {
8872
8881
  staticRoot?: string;
8873
8882
  /** Hostnames that get the marketing site (e.g. `www.sideboard.cloud`). Empty = any host. */
8874
8883
  staticHosts?: string[];
8875
- /** Apex (or aliases) that 301 to `canonicalSiteHost`. */
8884
+ /**
8885
+ * Apex (or aliases) that 301 to `canonicalSiteHost`.
8886
+ * A host listed in `staticHosts` is served instead, so both names can stay up.
8887
+ */
8876
8888
  redirectHosts?: string[];
8877
8889
  /** Canonical public site host (default `www.sideboard.cloud`). */
8878
8890
  canonicalSiteHost?: string;
@@ -8883,7 +8895,7 @@ interface RelayServerOptions {
8883
8895
  accountsPath?: string;
8884
8896
  /** Git-host OAuth clients. Secrets stay on the relay. */
8885
8897
  relayOAuth?: RelayOAuthConfig;
8886
- /** Public origin for OAuth redirects, e.g. `https://relay.sideboard.cloud`. */
8898
+ /** Public origin for OAuth redirects, e.g. `https://relay.sideboard.build`. */
8887
8899
  relayPublicOrigin?: string;
8888
8900
  }
8889
8901
  interface RelayServerHandle {
@@ -8908,7 +8920,7 @@ interface SlackRelayRegisterWorkspace {
8908
8920
  userToken: string;
8909
8921
  }
8910
8922
  interface SlackRelayClientOptions {
8911
- /** Full WebSocket URL including path, e.g. wss://relay.sideboard.cloud/slack/desktop */
8923
+ /** Full WebSocket URL including path, e.g. wss://relay.sideboard.build/slack/desktop */
8912
8924
  url: string;
8913
8925
  workspaces: SlackRelayRegisterWorkspace[];
8914
8926
  /** Stable per-Mac destination id. */
package/dist/index.d.ts CHANGED
@@ -8,8 +8,9 @@ import { EventEmitter } from 'node:events';
8
8
  * Why an agent is waiting on a person. Process liveness stays on
9
9
  * `ThreadStatus`; this is the attention flag (Herdr `blocked`).
10
10
  * Cleared when the next user message starts a turn. An ask_user highlight
11
- * is shown only while that question is on screen in the agent, and drops
12
- * when the picker is gone (skip, a later user message, or the agent moved on).
11
+ * stays until the user answers or skips. A later tool in the same turn
12
+ * does not remove it — the tool returns immediately, and the model often
13
+ * keeps going before the person can answer.
13
14
  */
14
15
  type AgentBlockSource = 'ask_user' | 'plan' | 'reported' | 'permission';
15
16
  /** Composer Allow / Deny while a tool waits on the user. */
@@ -47,9 +48,9 @@ interface AgentBlock {
47
48
  }>;
48
49
  }>;
49
50
  /**
50
- * True once ask_user is the last top-level tool in the live stream or
51
- * the finished turn. A mid-turn stamp without this stays off the
52
- * sidebar / board / phone until the picker is actually on screen.
51
+ * True once ask_user is in the live stream or the finished turn.
52
+ * A mid-turn stamp without this stays off the sidebar / board / phone
53
+ * until the picker is actually on screen. A later tool does not clear it.
53
54
  */
54
55
  onScreen?: boolean;
55
56
  permission?: AgentPermissionPrompt;
@@ -3522,7 +3523,7 @@ declare const ABLETIME_OAUTH_PORT = 19849;
3522
3523
  /** Local listener the marketing-site bounce sends the browser to. */
3523
3524
  declare const ABLETIME_OAUTH_LOCAL_CALLBACK = "http://127.0.0.1:19849/callback";
3524
3525
  /** Registered redirect — must match `site/oauth/abletime-client.json` redirect_uris. */
3525
- declare const ABLETIME_OAUTH_REDIRECT = "https://www.sideboard.cloud/oauth/abletime/callback";
3526
+ declare const ABLETIME_OAUTH_REDIRECT = "https://www.sideboard.build/oauth/abletime/callback";
3526
3527
  declare function ableTimeOAuthRedirectUri(): string;
3527
3528
  declare function parseAbleTimeOAuthCallbackUrl(reqUrl: string): URL | null;
3528
3529
  /** Map the hosted callback onto the desktop listener (query: code / state / error). */
@@ -3530,7 +3531,7 @@ declare function ableTimeOAuthLocalBounceUrl(reqUrl: string): string | null;
3530
3531
  /** Marketing-site page that immediately opens the desktop listener. */
3531
3532
  declare function ableTimeOAuthBouncePage(localUrl: string): string;
3532
3533
  /** Client ID Metadata Document (AbleTime advertises CIMD, not DCR). */
3533
- declare const BAKED_ABLETIME_OAUTH_CLIENT_ID = "https://www.sideboard.cloud/oauth/abletime-client.json";
3534
+ declare const BAKED_ABLETIME_OAUTH_CLIENT_ID = "https://www.sideboard.build/oauth/abletime-client.json";
3534
3535
  declare const ABLETIME_OAUTH_RESOURCE = "https://track.abletime.com/api/public/v2/mcp";
3535
3536
  declare function hasBakedAbleTimeOAuth(): boolean;
3536
3537
  declare function ableTimeOAuthClientId(): string;
@@ -5833,7 +5834,7 @@ declare function applyThreadIntoMain(thread: Pick<Thread, 'repoPath' | 'worktree
5833
5834
  * |------------------|-----------------------------------------------------------|
5834
5835
  * | submitted | queued — waiting for a concurrency slot, not started |
5835
5836
  * | working | the agent is running this turn |
5836
- * | input-required | turn ended on `ask_user`; the human must answer |
5837
+ * | input-required | unanswered `ask_user`, even if a later tool ran |
5837
5838
  * | completed | turn ended with an answer |
5838
5839
  * | failed | runner / agent error, or worktree missing (`broken`) |
5839
5840
  * | canceled | force-stopped before finishing |
@@ -5855,6 +5856,9 @@ declare function deriveTaskState(input: {
5855
5856
  stillRunning: boolean;
5856
5857
  /** Parts of the last agent reply (not an injected notice). */
5857
5858
  lastAgentParts?: MessagePart[];
5859
+ dismissedQuestionSignature?: string | null;
5860
+ /** A real user message landed after the agent reply that asked. */
5861
+ userAnswered?: boolean;
5858
5862
  }): TaskState;
5859
5863
  /** Snapshot returned by `getTurnResult`. Block fields are optional so older test doubles typecheck. */
5860
5864
  type TurnResult = {
@@ -6636,7 +6640,7 @@ type ToolPartLike = {
6636
6640
  };
6637
6641
  /** True when the last top-level tool (not a nested child) is ask_user. */
6638
6642
  declare function lastTopLevelToolIsAskUser(parts: ToolPartLike[] | undefined | null): boolean;
6639
- /** Newest ask-user tool part with parseable questions (live or persisted). */
6643
+ /** Newest top-level ask-user tool with parseable questions. Nested calls do not count. */
6640
6644
  declare function extractPendingPlanQuestions(parts: ToolPartLike[] | undefined | null): PendingPlanQuestions | null;
6641
6645
  /** Sidebar ask_user highlight, including questions stamped at call time. */
6642
6646
  interface AskBlockSnapshot {
@@ -6644,6 +6648,8 @@ interface AskBlockSnapshot {
6644
6648
  at?: string;
6645
6649
  questionSignature?: string;
6646
6650
  questions?: PlanQuestion[];
6651
+ /** Set once the picker is in the live stream. A mid-turn stamp omits it. */
6652
+ onScreen?: boolean;
6647
6653
  }
6648
6654
  /**
6649
6655
  * True when no later user reply has landed after this ask.
@@ -6675,7 +6681,10 @@ declare function latestPendingPlanQuestions(input: {
6675
6681
  */
6676
6682
  agentBlock?: AskBlockSnapshot | null;
6677
6683
  dismissedQuestionSignature?: string | null;
6678
- /** Hide a mid-turn stamp until the ask is the last tool (or the turn ends). */
6684
+ /**
6685
+ * Hide a mid-turn stamp until the ask is in the stream (or the turn
6686
+ * ends). Once the picker is on screen, a later tool must not hide it.
6687
+ */
6679
6688
  status?: string;
6680
6689
  }): PendingPlanQuestions | null;
6681
6690
  interface PlanQuestionAnswer {
@@ -6994,7 +7003,7 @@ declare function worktreeBoardStatus(group: Array<Pick<Thread, 'status'>>): Thre
6994
7003
  * Blocked highlight. Errors and archived chats keep their own status.
6995
7004
  * An ask_user stamp lands when the tool is called — before the picker is on
6996
7005
  * screen — so hide it while the turn is in flight unless `onScreen` (the
6997
- * live last tool is ask_user). Drop it once the chat is no longer asking.
7006
+ * ask is in the live stream). Drop it once the user answers or skips.
6998
7007
  */
6999
7008
  declare function visibleAgentBlock(thread: AgentBlockThread): AgentBlock | null;
7000
7009
  /**
@@ -8331,7 +8340,7 @@ declare function closeMcpUiHost(): void;
8331
8340
  declare function stashMcpAppModelContext(threadId: string, text: string): void;
8332
8341
 
8333
8342
  /** Public WebSocket URL for Slack desktops on the hosted relay (path included). */
8334
- declare const BAKED_SLACK_RELAY_URL = "wss://relay.sideboard.cloud/slack/desktop";
8343
+ declare const BAKED_SLACK_RELAY_URL = "wss://relay.sideboard.build/slack/desktop";
8335
8344
  declare function hasBakedSlackOAuth(): boolean;
8336
8345
  /**
8337
8346
  * WebSocket URL for this Mac's Slack desktop session on the relay.
@@ -8339,7 +8348,7 @@ declare function hasBakedSlackOAuth(): boolean;
8339
8348
  */
8340
8349
  declare function slackRelayUrl(): string;
8341
8350
 
8342
- declare const SLACK_OAUTH_REDIRECT = "https://relay.sideboard.cloud/slack/callback";
8351
+ declare const SLACK_OAUTH_REDIRECT = "https://relay.sideboard.build/slack/callback";
8343
8352
 
8344
8353
  declare function slackOAuthResultUrl(state: string, relayWsUrl?: string): string;
8345
8354
 
@@ -8603,7 +8612,7 @@ declare function runRemoteHost(opts: RemoteHostClientOptions): RemoteHostHandle;
8603
8612
 
8604
8613
  /** Phone ↔ relay ↔ Mac. Message text only. The Mac runs the orchestrator. */
8605
8614
  declare const REMOTE_RELAY_PATH = "/remote";
8606
- declare const BAKED_REMOTE_RELAY_URL = "wss://relay.sideboard.cloud/remote";
8615
+ declare const BAKED_REMOTE_RELAY_URL = "wss://relay.sideboard.build/remote";
8607
8616
  /**
8608
8617
  * `wss://host/remote`, or `ws://` for a local relay.
8609
8618
  * `https://host` and a host with no path become that WebSocket URL.
@@ -8709,7 +8718,7 @@ declare function handleRemoteInbound(text: string, opts: {
8709
8718
  }): void;
8710
8719
 
8711
8720
  declare function isRemoteAccountLoginCancelled(err: unknown): boolean;
8712
- /** `wss://relay.sideboard.cloud/remote` → `https://relay.sideboard.cloud`. */
8721
+ /** `wss://relay.sideboard.build/remote` → `https://relay.sideboard.build`. */
8713
8722
  declare function remoteAccountHttpOrigin(wsUrl?: string): string;
8714
8723
  type RemoteAccountSession = {
8715
8724
  credential: string;
@@ -8872,7 +8881,10 @@ interface RelayServerOptions {
8872
8881
  staticRoot?: string;
8873
8882
  /** Hostnames that get the marketing site (e.g. `www.sideboard.cloud`). Empty = any host. */
8874
8883
  staticHosts?: string[];
8875
- /** Apex (or aliases) that 301 to `canonicalSiteHost`. */
8884
+ /**
8885
+ * Apex (or aliases) that 301 to `canonicalSiteHost`.
8886
+ * A host listed in `staticHosts` is served instead, so both names can stay up.
8887
+ */
8876
8888
  redirectHosts?: string[];
8877
8889
  /** Canonical public site host (default `www.sideboard.cloud`). */
8878
8890
  canonicalSiteHost?: string;
@@ -8883,7 +8895,7 @@ interface RelayServerOptions {
8883
8895
  accountsPath?: string;
8884
8896
  /** Git-host OAuth clients. Secrets stay on the relay. */
8885
8897
  relayOAuth?: RelayOAuthConfig;
8886
- /** Public origin for OAuth redirects, e.g. `https://relay.sideboard.cloud`. */
8898
+ /** Public origin for OAuth redirects, e.g. `https://relay.sideboard.build`. */
8887
8899
  relayPublicOrigin?: string;
8888
8900
  }
8889
8901
  interface RelayServerHandle {
@@ -8908,7 +8920,7 @@ interface SlackRelayRegisterWorkspace {
8908
8920
  userToken: string;
8909
8921
  }
8910
8922
  interface SlackRelayClientOptions {
8911
- /** Full WebSocket URL including path, e.g. wss://relay.sideboard.cloud/slack/desktop */
8923
+ /** Full WebSocket URL including path, e.g. wss://relay.sideboard.build/slack/desktop */
8912
8924
  url: string;
8913
8925
  workspaces: SlackRelayRegisterWorkspace[];
8914
8926
  /** Stable per-Mac destination id. */
package/dist/index.js CHANGED
@@ -17,13 +17,13 @@ import {
17
17
  toAbleTimeIssueInfo,
18
18
  updateAbleTimeTask,
19
19
  verifyAbleTimeConnection
20
- } from "./chunk-CHYUUETG.js";
20
+ } from "./chunk-YMV5O7KY.js";
21
21
  import {
22
22
  clearOptionalCliPresenceCache,
23
23
  detectOptionalServiceClis,
24
24
  installOptionalServiceCli,
25
25
  optionalCliPresence
26
- } from "./chunk-QMLDR63X.js";
26
+ } from "./chunk-3DJQLQWU.js";
27
27
  import {
28
28
  AGENT_GIT_ACTIONS,
29
29
  BOARD_COLUMN_DEFS,
@@ -218,7 +218,7 @@ import {
218
218
  worktreeCleanupSettings,
219
219
  writeAgentBlock,
220
220
  writeWorktreeFile
221
- } from "./chunk-DEB47BII.js";
221
+ } from "./chunk-HCK3UCBJ.js";
222
222
  import {
223
223
  OPTIONAL_SERVICES,
224
224
  OPTIONAL_SERVICE_IDS,
@@ -234,7 +234,7 @@ import {
234
234
  optionalServiceConnected,
235
235
  optionalServiceSpec,
236
236
  verifyOptionalService
237
- } from "./chunk-ECY7WL6T.js";
237
+ } from "./chunk-7L36GZA4.js";
238
238
  import {
239
239
  LEGACY_PLAN_FILE_REL,
240
240
  PLAN_FILE_NAME,
@@ -291,7 +291,7 @@ import {
291
291
  startLinearOAuth,
292
292
  updateLinearIssue,
293
293
  validateLinearApiKey
294
- } from "./chunk-SFXGD5KJ.js";
294
+ } from "./chunk-7MPRTC6X.js";
295
295
  import {
296
296
  downloadAuthenticatedFile,
297
297
  extractHttpUrls,
@@ -379,7 +379,7 @@ import {
379
379
  userMcpNamesToDisable,
380
380
  worktreeMcpToolNames,
381
381
  writeInjectedMcpConfig
382
- } from "./chunk-NQGLDQYB.js";
382
+ } from "./chunk-DFKLWWLY.js";
383
383
  import {
384
384
  getAgentSetupInfo,
385
385
  installAgent,
@@ -391,7 +391,7 @@ import {
391
391
  prepareTerminalCommand,
392
392
  resolveLoginCommand,
393
393
  whichOnPath
394
- } from "./chunk-KLVW3J2B.js";
394
+ } from "./chunk-XOIJJRAQ.js";
395
395
  import {
396
396
  brightsyMcpServerName,
397
397
  connectBrightsyTeam,
@@ -402,7 +402,7 @@ import {
402
402
  listConnectedBrightsyTeams,
403
403
  switchBrightsyAccount
404
404
  } from "./chunk-S5CJUIPY.js";
405
- import "./chunk-ATQLP22S.js";
405
+ import "./chunk-ZT5YPYZE.js";
406
406
  import {
407
407
  BRIGHTSY_SUMMARIZE_CONTEXT_TOOL,
408
408
  CHARS_PER_CONTEXT_TOKEN,
@@ -512,7 +512,7 @@ import {
512
512
  workspaceAgentChatSummaries,
513
513
  worktreeRunPortsPath,
514
514
  wrapReviewSkillMarkdown
515
- } from "./chunk-IXWPCOLQ.js";
515
+ } from "./chunk-KUD24QYI.js";
516
516
  import {
517
517
  STDERR_EVENT_MAX_CHARS,
518
518
  STDOUT_EVENT_MAX_CHARS,
@@ -578,10 +578,10 @@ import {
578
578
  parseAbleTimeOAuthCallbackUrl,
579
579
  resolveAbleTimeOAuthHost,
580
580
  startAbleTimeOAuth
581
- } from "./chunk-XBBZZHJY.js";
581
+ } from "./chunk-F4OUZDIB.js";
582
582
  import {
583
583
  looksLikeAbleTimeUlid
584
- } from "./chunk-EUIVQAPK.js";
584
+ } from "./chunk-HJIA4X3L.js";
585
585
  import {
586
586
  ABLETIME_MCP_PATH,
587
587
  ABLETIME_MCP_PM_PATH,
@@ -602,7 +602,7 @@ import {
602
602
  normalizeAbleTimeCredential,
603
603
  normalizeAbleTimeHost,
604
604
  rewriteAbleTimeError
605
- } from "./chunk-DACWFN4O.js";
605
+ } from "./chunk-SKPX66MO.js";
606
606
  import {
607
607
  CLOUD_COORDINATOR_BUSY_REPLY,
608
608
  CLOUD_COORDINATOR_CANCELED_REPLY,
@@ -655,7 +655,7 @@ import {
655
655
  stageBuffersAsAttachments,
656
656
  syncWorkspacesFromThreads,
657
657
  takenTeamSlugsForOrchestration
658
- } from "./chunk-RDXODLEN.js";
658
+ } from "./chunk-O7JSWISN.js";
659
659
  import {
660
660
  GITHUB_PR_BODY_MAX_CHARS,
661
661
  GITHUB_PR_BODY_SAFE_CHARS,
@@ -744,7 +744,7 @@ import {
744
744
  suggestSlug,
745
745
  switchWorktreeBranch,
746
746
  warmGithubAgentAuth
747
- } from "./chunk-R2C45NHT.js";
747
+ } from "./chunk-P4QRDXRY.js";
748
748
  import {
749
749
  FAMOUS_SOCCER_TEAMS,
750
750
  WEEKDAY_LABELS,
@@ -800,7 +800,7 @@ import {
800
800
  worktreeNameFromPath,
801
801
  worktreeSlugForTicket,
802
802
  writeThread
803
- } from "./chunk-Y6OHM672.js";
803
+ } from "./chunk-QVLDZWHZ.js";
804
804
  import "./chunk-QKHEVSB5.js";
805
805
  import {
806
806
  BRIGHTSY_OAUTH_CLIENT_ID,
@@ -833,7 +833,7 @@ import {
833
833
  latestPendingPlanQuestions,
834
834
  parsePlanQuestionsInput,
835
835
  planQuestionsSignature
836
- } from "./chunk-ULWPSBAB.js";
836
+ } from "./chunk-NJV5YEKI.js";
837
837
  import {
838
838
  BASE_ALLOWED_TOOLS,
839
839
  CLAUDE_CHROME_ALLOWED_TOOLS,
@@ -1086,7 +1086,7 @@ import {
1086
1086
  withTurnScopedCost,
1087
1087
  writeSecureJson,
1088
1088
  writeViewerContext
1089
- } from "./chunk-D446IWPP.js";
1089
+ } from "./chunk-EY5BJAPV.js";
1090
1090
  import {
1091
1091
  stripNestedElectronEnv
1092
1092
  } from "./chunk-4TR3HZFT.js";
@@ -5198,7 +5198,7 @@ var SLACK_OAUTH_RESULT_PATH = "/slack/oauth/result";
5198
5198
  var SLACK_RELAY_DESKTOP_PATH = "/slack/desktop";
5199
5199
  var SLACK_OAUTH_LOCAL_PORT = 19847;
5200
5200
  var SLACK_OAUTH_LOCAL_CALLBACK = `http://127.0.0.1:${SLACK_OAUTH_LOCAL_PORT}${SLACK_OAUTH_CALLBACK_PATH}`;
5201
- var SLACK_OAUTH_REDIRECT = `https://relay.sideboard.cloud${SLACK_OAUTH_CALLBACK_PATH}`;
5201
+ var SLACK_OAUTH_REDIRECT = `https://relay.sideboard.build${SLACK_OAUTH_CALLBACK_PATH}`;
5202
5202
  function slackOAuthRedirectUri() {
5203
5203
  return process.env.SIDEBOARD_SLACK_OAUTH_REDIRECT?.trim() || SLACK_OAUTH_REDIRECT;
5204
5204
  }
@@ -5233,7 +5233,7 @@ function parseSlackOAuthResultUrl(reqUrl) {
5233
5233
 
5234
5234
  // src/slack/baked-app.ts
5235
5235
  var BAKED_SLACK_CLIENT_ID = "7592788819232.11813536272562";
5236
- var BAKED_SLACK_RELAY_URL = "wss://relay.sideboard.cloud/slack/desktop";
5236
+ var BAKED_SLACK_RELAY_URL = "wss://relay.sideboard.build/slack/desktop";
5237
5237
  function hasBakedSlackOAuth() {
5238
5238
  return Boolean(BAKED_SLACK_CLIENT_ID.trim());
5239
5239
  }
@@ -7456,7 +7456,9 @@ async function startRelayServer(opts) {
7456
7456
  }
7457
7457
  const hostname2 = requestHostname(req);
7458
7458
  const canonical = (opts.canonicalSiteHost ?? "www.sideboard.cloud").toLowerCase();
7459
- if (opts.redirectHosts?.includes(hostname2) && hostname2 !== canonical) {
7459
+ const staticHosts = opts.staticHosts ?? [];
7460
+ const servesSite = staticHosts.length > 0 && staticHosts.includes(hostname2);
7461
+ if (opts.redirectHosts?.includes(hostname2) && hostname2 !== canonical && !servesSite) {
7460
7462
  res.writeHead(301, { Location: `https://${canonical}${reqUrl}` });
7461
7463
  res.end();
7462
7464
  return;
@@ -7685,7 +7687,7 @@ async function startHeadlessHost(opts) {
7685
7687
  };
7686
7688
  const refreshRunning = async () => {
7687
7689
  try {
7688
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-EN3ZKD73.js");
7690
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-LI6EBD2Y.js");
7689
7691
  agentsRunning = getOrchestrator2().getRuntime().running;
7690
7692
  } catch {
7691
7693
  agentsRunning = 0;
@@ -9828,7 +9830,7 @@ async function handleJobStop(params, _ctx) {
9828
9830
  return stopDetachedJob(jobCwd(rec), id, reason ? { reason } : void 0);
9829
9831
  }
9830
9832
  async function defaultTurnWait(ref, timeoutMs) {
9831
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-EN3ZKD73.js");
9833
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-LI6EBD2Y.js");
9832
9834
  const orch = getOrchestrator2();
9833
9835
  const thread = await orch.waitForTurn(ref, timeoutMs, {
9834
9836
  resolveIfStillRunning: true
@@ -10181,7 +10183,7 @@ async function startMcpServer() {
10181
10183
  );
10182
10184
  }
10183
10185
  try {
10184
- const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-A5D364JD.js");
10186
+ const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-JAEV53LB.js");
10185
10187
  orch.setMaxConcurrent(maxConcurrentAgents2());
10186
10188
  } catch {
10187
10189
  }
@@ -10729,7 +10731,7 @@ async function startMcpServer() {
10729
10731
  if (!worktreeProfile) {
10730
10732
  registerConnectedIssueVendorTools(server);
10731
10733
  const { getCaffeinateHold: getCaffeinateHold2, setCaffeinateHold: setCaffeinateHold2 } = await import("./caffeinate-hold-ZNUEZGHB.js");
10732
- const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-A5D364JD.js");
10734
+ const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-JAEV53LB.js");
10733
10735
  const accountDefaults = resolveThreadDefaults2();
10734
10736
  const accountDefaultsHint = `Account defaults: agent=${accountDefaults.agent}, model=${accountDefaults.model?.trim() || "Auto"}, effort=${accountDefaults.effort}`;
10735
10737
  server.tool(
@@ -13496,7 +13498,7 @@ async function continueSourceThread(threadId, prompt) {
13496
13498
  await continueOnReply(threadId, prompt);
13497
13499
  return;
13498
13500
  }
13499
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-EN3ZKD73.js");
13501
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-LI6EBD2Y.js");
13500
13502
  await getOrchestrator2().send(threadId, prompt);
13501
13503
  } catch {
13502
13504
  }
@@ -27,12 +27,12 @@ import {
27
27
  rewriteLinearError,
28
28
  updateLinearIssue,
29
29
  validateLinearApiKey
30
- } from "./chunk-TUH4ICHQ.js";
30
+ } from "./chunk-277I5IBI.js";
31
31
  import "./chunk-OYRN356W.js";
32
32
  import "./chunk-F6GE7V3Q.js";
33
33
  import "./chunk-N2WW62LF.js";
34
34
  import "./chunk-2GPQZZLY.js";
35
- import "./chunk-EJRCHCXM.js";
35
+ import "./chunk-7BAS6DF7.js";
36
36
  import "./chunk-NSTQ6QKD.js";
37
37
  import "./chunk-WWUABK6B.js";
38
38
  import "./chunk-FJZWM2ON.js";
@@ -25,12 +25,12 @@ import {
25
25
  rewriteLinearError,
26
26
  updateLinearIssue,
27
27
  validateLinearApiKey
28
- } from "./chunk-SFXGD5KJ.js";
28
+ } from "./chunk-7MPRTC6X.js";
29
29
  import "./chunk-DBKHL7NC.js";
30
30
  import "./chunk-W3ZLE4PO.js";
31
31
  import "./chunk-JAT3JFOS.js";
32
32
  import "./chunk-6K64FJDD.js";
33
- import "./chunk-D446IWPP.js";
33
+ import "./chunk-EY5BJAPV.js";
34
34
  import "./chunk-4TR3HZFT.js";
35
35
  import "./chunk-WDRMZKVB.js";
36
36
  import "./chunk-KI45T4DI.js";
@@ -2,7 +2,7 @@
2
2
 
3
3
  import {
4
4
  listAssignedLinearIssues
5
- } from "./chunk-UMXBH344.js";
5
+ } from "./chunk-NCFYUUSC.js";
6
6
  export {
7
7
  listAssignedLinearIssues
8
8
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  listAssignedLinearIssues
3
- } from "./chunk-ATQLP22S.js";
3
+ } from "./chunk-ZT5YPYZE.js";
4
4
  export {
5
5
  listAssignedLinearIssues
6
6
  };