@openscout/scout 0.2.29 → 0.2.34

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.
@@ -0,0 +1 @@
1
+ :root{--bg: #F9F9F8;--surface: #FFFFFF;--ink: #1C1C1A;--muted: #8A8A86;--dim: #C4C4C0;--border: #E4E4E2;--accent: #0066FF;--accent-soft: rgba(0, 102, 255, .08);--green: #22c55e;--red: #dc2626;--radius: 8px;--shadow-soft: rgba(24, 24, 22, .06);--sidebar-w: 280px;--font-sans: "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--font-serif: "Spectral", Georgia, serif;font-family:var(--font-sans);font-size:13px;line-height:1.5;color:var(--ink);background:var(--bg);-webkit-font-smoothing:antialiased}*{box-sizing:border-box;margin:0}body{margin:0}.s-app{display:flex;height:100vh;overflow:hidden}.s-sidebar{width:var(--sidebar-w);flex-shrink:0;display:flex;flex-direction:column;border-right:1px solid var(--border);background:var(--surface);height:100vh;overflow:hidden}.s-content{flex:1;min-width:0;height:100vh;overflow-y:auto;background:var(--bg)}.s-sidebar-header{padding:16px 16px 12px;flex-shrink:0}.s-logo{font-family:var(--font-serif);font-size:18px;font-weight:600;letter-spacing:-.02em;cursor:pointer;-webkit-user-select:none;user-select:none}.s-sidebar-footer{flex-shrink:0;padding:8px;border-top:1px solid var(--border)}.s-nav-item{display:flex;align-items:center;gap:8px;width:100%;border:none;background:none;padding:6px 8px;border-radius:6px;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--muted);cursor:pointer;transition:background .12s ease,color .12s ease}.s-nav-item:hover{background:var(--bg);color:var(--ink)}.s-nav-item-active{background:var(--accent-soft);color:var(--accent)}.s-sidebar-label{padding:4px 16px 6px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--dim);flex-shrink:0}.s-sidebar-list{flex:1;overflow-y:auto;padding-bottom:12px}.s-sidebar-empty{padding:24px 16px;text-align:center;font-size:11px;color:var(--dim)}.s-sidebar-row{display:flex;align-items:center;gap:8px;padding:8px 12px;margin:0 6px;border-radius:6px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .1s ease}.s-sidebar-row:hover{background:var(--bg)}.s-sidebar-row-active,.s-sidebar-row-active:hover{background:var(--accent-soft)}.s-sidebar-row-body{flex:1;min-width:0}.s-sidebar-row-header{display:flex;align-items:center;gap:5px}.s-sidebar-row-name{font-size:12px;font-weight:600;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.s-sidebar-row-preview{font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px;line-height:1.3}.s-sidebar-row-preview-empty{font-style:italic;color:var(--dim)}.s-sidebar-row-time{font-size:10px;color:var(--dim);font-family:var(--font-mono);flex-shrink:0;align-self:flex-start;margin-top:2px}.s-welcome{display:flex;align-items:center;justify-content:center;height:100%;color:var(--dim)}.s-welcome-inner{text-align:center}.s-welcome h2{font-family:var(--font-serif);font-size:24px;font-weight:600;color:var(--dim);margin-bottom:4px}.s-welcome p{font-size:12px}.s-home{padding:32px;height:100vh;overflow-y:auto}.s-home-header{margin-bottom:32px}.s-home-header h2{font-family:var(--font-serif);font-size:22px;font-weight:600;color:var(--ink);margin-bottom:4px}.s-home-header p{font-size:12px;color:var(--muted)}.s-home-section{margin-bottom:28px}.s-home-section-title{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--dim);margin-bottom:10px}.s-home-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;max-width:480px}.s-home-card-row{display:flex;align-items:center;gap:10px;padding:10px 14px;font-size:12px}.s-home-card-row+.s-home-card-row{border-top:1px solid var(--border)}.s-home-card-row-label{color:var(--muted);font-size:11px;min-width:80px;flex-shrink:0}.s-home-card-row-value{color:var(--ink);font-family:var(--font-mono);font-size:11px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.s-home-steps{list-style:none;padding:0;max-width:480px}.s-home-steps li{display:flex;align-items:baseline;gap:10px;padding:6px 0;font-size:12px;color:var(--ink);line-height:1.5}.s-home-steps li:before{content:attr(data-step);font-size:10px;font-weight:700;font-family:var(--font-mono);color:var(--muted);flex-shrink:0;width:18px;height:18px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--bg);border:1px solid var(--border)}.s-home-steps code{font-family:var(--font-mono);font-size:11px;background:var(--bg);border:1px solid var(--border);border-radius:4px;padding:1px 5px}.s-home-card-row-clickable{cursor:pointer;transition:background .1s ease}.s-home-card-row-clickable:hover{background:var(--bg)}.s-activity-stream{max-width:560px}.s-activity-row{display:flex;align-items:baseline;gap:8px;padding:4px 0;font-size:12px;line-height:1.5}.s-activity-row-clickable{cursor:pointer;border-radius:4px;padding:4px 6px;margin:0 -6px;transition:background .1s ease}.s-activity-row-clickable:hover{background:var(--surface)}.s-activity-time{font-size:10px;color:var(--dim);font-family:var(--font-mono);flex-shrink:0;min-width:36px}.s-activity-actor{font-weight:600;color:var(--ink);flex-shrink:0}.s-activity-kind{color:var(--muted)}.s-activity-title{color:var(--muted);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.s-activity-list{max-width:560px}.s-activity-list-row{display:flex;align-items:flex-start;gap:10px;padding:8px 0}.s-activity-list-item+.s-activity-list-item{border-top:1px solid var(--border)}.s-activity-list-row-clickable{cursor:pointer;border-radius:6px;padding:8px;margin:0 -8px;transition:background .1s ease}.s-activity-list-row-clickable:hover{background:var(--surface)}.s-activity-list-body{flex:1;min-width:0}.s-activity-list-header{display:flex;align-items:baseline;gap:6px}.s-activity-list-actor{font-size:12px;font-weight:600;color:var(--ink)}.s-activity-list-kind{font-size:11px;color:var(--muted)}.s-activity-list-title{font-size:12px;color:var(--ink);margin-top:2px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.s-activity-list-summary{font-size:11px;color:var(--muted);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.s-activity-expanded{padding:4px 8px 12px 38px}.s-activity-expanded-summary{font-size:12px;color:var(--ink);margin-bottom:8px;line-height:1.4}.s-activity-expanded-meta{display:flex;gap:8px;font-size:11px;padding:2px 0}.s-activity-meta-label{color:var(--muted);min-width:56px}.s-activity-meta-value{color:var(--ink);word-break:break-all}.s-activity-expanded-actions{margin-top:8px}.s-btn-sm{font-size:11px;padding:4px 10px}.s-error{color:var(--red);font-size:12px;padding:8px 12px;background:#fef2f2;border:1px solid #fecaca;border-radius:var(--radius);margin:12px}.s-empty{padding:32px 0;color:var(--muted);font-size:12px}.s-empty p:first-child{font-size:13px;font-weight:500;color:var(--ink);margin-bottom:4px}.s-meta{font-size:11px;color:var(--muted);font-family:var(--font-mono)}.s-spacer{flex:1}.s-dot{display:inline-block;width:6px;height:6px;border-radius:50%;flex-shrink:0}.s-dot-sm{width:5px;height:5px}.s-badge{font-size:10px;font-family:var(--font-mono);color:var(--muted);background:var(--bg);border-radius:4px;padding:1px 6px;flex-shrink:0;text-transform:uppercase;letter-spacing:.04em}.s-time{font-size:10px;color:var(--dim);font-family:var(--font-mono);flex-shrink:0;letter-spacing:.01em}.s-back{border:none;background:none;padding:0;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--muted);cursor:pointer;transition:color .12s ease}.s-back:hover{color:var(--ink)}.s-chevron{width:12px;height:12px;flex-shrink:0;position:relative;opacity:.3;transition:opacity .14s ease}.s-chevron:before{content:"";position:absolute;top:3px;left:2px;width:6px;height:6px;border-right:1.5px solid var(--ink);border-bottom:1.5px solid var(--ink);transform:rotate(-45deg)}.s-avatar{width:32px;height:32px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:#fff}.s-avatar-sm{width:28px;height:28px;font-size:11px}.s-avatar-lg{width:56px;height:56px;font-size:20px}.s-conversation{display:flex;flex-direction:column;height:100vh}.s-conv-header{display:flex;align-items:center;gap:10px;padding:10px 20px;border-bottom:1px solid var(--border);background:var(--bg);flex-shrink:0;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .12s ease}.s-conv-header:hover{background:#f6f6f5}.s-conv-header .s-back{margin-right:2px;font-size:16px;line-height:1}.s-conv-header-info{flex:1;min-width:0}.s-conv-header-name{font-size:13px;font-weight:600;color:var(--ink)}.s-conv-header-state{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--muted);margin-top:1px}.s-conv-status{display:flex;align-items:center;gap:10px;padding:10px 20px;border-bottom:1px solid var(--border);flex-shrink:0}.s-conv-status-pending{background:#0066ff0f;border-bottom-color:#0066ff1f}.s-conv-status-working{background:#22c55e0f;border-bottom-color:#22c55e24}.s-conv-status-offline{background:#1118270a;border-bottom-color:#11182714}.s-conv-status-dot{width:8px;height:8px;border-radius:50%;background:currentColor;color:var(--accent);flex-shrink:0}.s-conv-status-working .s-conv-status-dot{color:var(--green);animation:s-pulse 1.4s ease-in-out infinite}.s-conv-status-offline .s-conv-status-dot{color:var(--dim)}.s-conv-status-copy{display:flex;flex-direction:column;min-width:0;gap:2px}.s-conv-status-label{font-size:11px;font-weight:700;color:var(--ink)}.s-conv-status-detail{font-size:11px;color:var(--muted);line-height:1.4}.s-messages{flex:1;overflow-y:auto;padding:16px 20px;display:flex;flex-direction:column;gap:6px}.s-msg{max-width:85%;align-self:flex-start}.s-msg-you{align-self:flex-end}.s-msg-header{display:flex;align-items:baseline;gap:6px;margin-bottom:2px;padding:0 2px}.s-msg-actor{font-size:11px;font-weight:600;color:var(--ink)}.s-msg-time{font-size:10px;color:var(--dim);font-family:var(--font-mono)}.s-msg-body{font-size:12px;line-height:1.5;color:var(--ink);white-space:pre-wrap;word-break:break-word;padding:8px 12px;border-radius:14px 14px 14px 4px;background:var(--surface);border:1px solid var(--border)}.s-msg-you .s-msg-body{border-radius:14px 14px 4px;background:var(--accent-soft);border-color:#0066ff1f}.s-msg-you .s-msg-header{justify-content:flex-end}.s-msg-working{max-width:85%;align-self:flex-start}.s-msg-working-body{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:14px 14px 14px 4px;background:linear-gradient(135deg,#22c55e14,#22c55e0a);border:1px solid rgba(34,197,94,.14)}.s-msg-working-copy{font-size:12px;line-height:1.45;color:var(--ink)}.s-typing-indicator{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.s-typing-dot{width:6px;height:6px;border-radius:50%;background:var(--green);opacity:.35;animation:s-typing-bounce 1.1s ease-in-out infinite}.s-typing-dot:nth-child(2){animation-delay:.14s}.s-typing-dot:nth-child(3){animation-delay:.28s}@keyframes s-typing-bounce{0%,80%,to{opacity:.35;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}.s-compose{display:flex;align-items:flex-end;gap:8px;padding:10px 20px;border-top:1px solid var(--border);background:var(--bg);flex-shrink:0}.s-compose-input{flex:1;border:1px solid var(--border);background:var(--surface);border-radius:20px;min-height:40px;max-height:160px;padding:10px 14px;font-family:var(--font-sans);font-size:12px;line-height:1.45;color:var(--ink);outline:none;transition:border-color .12s ease;resize:none;overflow-y:hidden;white-space:pre-wrap}.s-compose-input:focus{border-color:var(--accent)}.s-compose-input:disabled{opacity:.5;cursor:not-allowed}.s-compose-send{width:32px;height:32px;border-radius:50%;border:none;background:var(--ink);color:#fff;font-size:14px;font-weight:700;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:opacity .12s ease}.s-compose-send svg{display:block}.s-compose-send:disabled{opacity:.3;cursor:not-allowed}.s-agent-profile{display:flex;flex-direction:column;align-items:flex-start;padding:8px 0 16px;gap:4px}.s-agent-profile-name{font-size:18px;font-weight:600;color:var(--ink);margin-top:8px}.s-agent-profile-handle{font-size:12px;font-family:var(--font-mono);color:var(--muted)}.s-agent-profile-state{display:flex;align-items:center;gap:5px;font-size:12px;color:var(--muted);margin-top:4px}.s-agent-details{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;margin-top:16px;max-width:480px}.s-detail-row{display:flex;align-items:baseline;justify-content:space-between;padding:7px 14px;font-size:12px;gap:12px}.s-detail-row+.s-detail-row{border-top:1px solid var(--border)}.s-detail-label{color:var(--muted);flex-shrink:0;font-size:11px}.s-detail-value{color:var(--ink);font-family:var(--font-mono);font-size:11px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.s-section-title{font-size:15px;font-weight:600;color:var(--ink);margin-bottom:16px}.s-actions{display:flex;gap:8px;margin-bottom:16px}.s-btn{border:1px solid var(--border);background:var(--surface);padding:6px 14px;border-radius:var(--radius);font-family:var(--font-sans);font-size:12px;font-weight:500;cursor:pointer;transition:all .14s cubic-bezier(.16,1,.3,1)}.s-btn:hover{border-color:var(--dim);box-shadow:0 1px 2px var(--shadow-soft)}.s-btn:disabled{opacity:.4;cursor:not-allowed}.s-btn-primary{background:var(--ink);color:var(--bg);border-color:var(--ink)}.s-btn-primary:hover{background:#2a2a28;box-shadow:0 2px 6px var(--shadow-soft)}.s-qr{max-width:240px;margin:20px 0;padding:16px;background:var(--surface);border:1px solid var(--border);border-radius:12px;box-shadow:0 2px 6px var(--shadow-soft)}.s-qr svg{display:block;width:100%;height:auto}.s-pair-meta{max-width:360px;margin:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.s-pair-row{display:flex;align-items:center;justify-content:space-between;padding:7px 14px;font-size:12px}.s-pair-row+.s-pair-row{border-top:1px solid var(--border)}.s-pair-label{color:var(--muted);flex-shrink:0}.s-pair-value{display:flex;align-items:center;color:var(--ink);text-align:right;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.s-pair-mono{font-family:var(--font-mono);font-size:11px}.s-sidebar-nav{padding:0 8px 4px;flex-shrink:0}.s-nav-badge{font-size:10px;font-weight:600;font-family:var(--font-mono);color:#fff;background:var(--green);border-radius:10px;padding:0 6px;min-width:18px;text-align:center;line-height:16px;margin-left:auto}.s-sidebar-avatar-wrap{position:relative;flex-shrink:0}.s-task-indicator{position:absolute;bottom:-1px;right:-1px;width:8px;height:8px;border-radius:50%;background:var(--green);border:2px solid var(--surface)}.s-sidebar-row-active .s-task-indicator{border-color:#0066ff14}.s-flight-banner{display:flex;align-items:center;gap:6px;padding:6px 20px;background:#22c55e0f;border-bottom:1px solid rgba(34,197,94,.12);font-size:11px;flex-shrink:0}.s-flight-banner-dot{width:6px;height:6px;border-radius:50%;background:var(--green);flex-shrink:0;animation:s-pulse 2s ease-in-out infinite}@keyframes s-pulse{0%,to{opacity:1}50%{opacity:.4}}.s-flight-banner-label{font-weight:600;color:var(--ink)}.s-flight-banner-summary{color:var(--muted);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.s-flights{border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.s-flight-row{display:flex;align-items:center;gap:10px;padding:10px 14px;background:var(--surface);cursor:pointer;transition:background .12s ease}.s-flight-row:hover{background:#f6f6f5}.s-flight-row+.s-flight-row{border-top:1px solid var(--border)}.s-flight-body{flex:1;min-width:0}.s-flight-header{display:flex;align-items:center;gap:6px}.s-flight-name{font-size:12px;font-weight:600;color:var(--ink)}.s-flight-state{font-size:11px;font-family:var(--font-mono);font-weight:500}.s-flight-summary{font-size:11px;color:var(--muted);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.s-content>div:not(.s-conversation):not(.s-welcome):not(.s-home):not(.s-agents-layout){padding:24px 32px;max-width:640px}.s-agents-layout{display:flex;height:100vh;overflow:hidden}.s-agents-list-panel{width:100%;height:100vh;overflow-y:auto;padding:24px 16px;transition:width .15s ease}.s-agents-layout-split .s-agents-list-panel{width:280px;flex-shrink:0;border-right:1px solid var(--border);padding:16px 8px}.s-agents-detail-panel{flex:1;min-width:0;height:100vh;overflow-y:auto;padding:24px 32px}.s-agent-list-row{display:flex;align-items:center;gap:10px;padding:8px;border-radius:6px;cursor:pointer;transition:background .1s ease}.s-agent-list-row:hover{background:var(--bg)}.s-agent-list-row-active,.s-agent-list-row-active:hover{background:var(--accent-soft)}.s-agent-list-body{flex:1;min-width:0}.s-agent-list-header{display:flex;align-items:center;gap:5px}.s-agent-list-name{font-size:12px;font-weight:600;color:var(--ink)}.s-agent-list-qualifier{font-size:10px;font-family:var(--font-mono);color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.s-agent-list-meta{display:flex;align-items:center;gap:8px;margin-top:1px;font-size:11px;color:var(--muted)}.s-agent-list-meta span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.s-agent-detail-header{display:flex;align-items:center;gap:16px;margin-bottom:20px}.s-agent-detail-name{font-size:18px;font-weight:600;color:var(--ink);display:flex;align-items:baseline;gap:8px}.s-agent-detail-qualifier{font-size:12px;font-family:var(--font-mono);color:var(--dim);font-weight:400}.s-agent-detail-state{display:flex;align-items:center;gap:5px;font-size:12px;color:var(--muted);margin-top:2px}.s-agent-detail-meta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;max-width:480px}.s-agent-detail-section{margin-top:20px}.s-agent-detail-messages{max-width:480px}.s-agent-detail-msg{display:flex;align-items:baseline;gap:6px;padding:4px 0;font-size:12px}.s-agent-detail-msg-clickable{cursor:pointer;border-radius:4px;margin:0 -4px;padding:4px}.s-agent-detail-msg-clickable:hover{background:var(--hover)}.s-agent-detail-msg+.s-agent-detail-msg{border-top:1px solid var(--border)}.s-agent-detail-msg-actor{font-weight:600;color:var(--ink);flex-shrink:0}.s-agent-detail-msg-body{color:var(--muted);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width:767px){.s-sidebar{width:100%;position:absolute;inset:0;z-index:20;transition:transform .2s cubic-bezier(.16,1,.3,1)}.s-content{position:absolute;inset:0;z-index:10;transform:translate(100%);transition:transform .2s cubic-bezier(.16,1,.3,1)}.s-app{position:relative}.s-app-content-open .s-sidebar{transform:translate(-100%)}.s-app-content-open .s-content{transform:translate(0)}.s-conv-header .s-back{display:block}}@media(min-width:768px){.s-conv-header .s-back{display:none}}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--muted)}
@@ -7,8 +7,8 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com" />
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
9
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&family=Spectral:wght@500;600&display=swap" rel="stylesheet" />
10
- <script type="module" crossorigin src="/assets/index-DEsi9Gmq.js"></script>
11
- <link rel="stylesheet" crossorigin href="/assets/index-SY_-C1vO.css">
10
+ <script type="module" crossorigin src="/assets/index-DHW-M-8X.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-OWiDN7qF.css">
12
12
  </head>
13
13
  <body>
14
14
  <div id="root"></div>
package/dist/main.mjs CHANGED
@@ -547,35 +547,44 @@ function parseSegmentedIdentity(raw) {
547
547
  const next = {
548
548
  definitionId: definitionPart
549
549
  };
550
- let sawPositionalWorkspace = false;
550
+ const positional = [];
551
551
  for (const part of parts) {
552
552
  if (part.includes(":")) {
553
553
  const [rawKey, rawValue = ""] = part.split(":", 2);
554
554
  const key = normalizeDimensionKey(rawKey);
555
- const value2 = normalizeAgentIdentitySegment(rawValue);
556
- if (!key || !value2) {
555
+ const value = normalizeAgentIdentitySegment(rawValue);
556
+ if (!key || !value) {
557
557
  return null;
558
558
  }
559
559
  if (key === "workspace") {
560
- next.workspaceQualifier = value2;
560
+ next.workspaceQualifier = value;
561
561
  } else if (key === "profile") {
562
- next.profile = value2;
562
+ next.profile = value;
563
563
  } else if (key === "harness") {
564
- next.harness = value2;
564
+ next.harness = value;
565
565
  } else if (key === "node") {
566
- next.nodeQualifier = value2;
566
+ next.nodeQualifier = value;
567
567
  }
568
568
  continue;
569
569
  }
570
- if (sawPositionalWorkspace) {
571
- return null;
572
- }
573
- const value = normalizeAgentIdentitySegment(part);
574
- if (!value) {
570
+ positional.push(part);
571
+ }
572
+ if (positional.length === 1) {
573
+ const value = normalizeAgentIdentitySegment(positional[0]);
574
+ if (!value)
575
575
  return null;
576
- }
577
576
  next.workspaceQualifier = value;
578
- sawPositionalWorkspace = true;
577
+ } else if (positional.length === 2) {
578
+ const nodeValue = normalizeAgentIdentitySegment(positional[0]);
579
+ const workspaceValue = normalizeAgentIdentitySegment(positional[1]);
580
+ if (!nodeValue || !workspaceValue)
581
+ return null;
582
+ if (!next.nodeQualifier)
583
+ next.nodeQualifier = nodeValue;
584
+ if (!next.workspaceQualifier)
585
+ next.workspaceQualifier = workspaceValue;
586
+ } else if (positional.length > 2) {
587
+ return null;
579
588
  }
580
589
  return constructAgentIdentity(next, { raw });
581
590
  }
@@ -626,16 +635,26 @@ function constructAgentIdentity(input, options = {}) {
626
635
  };
627
636
  }
628
637
  function extractAgentIdentities(text) {
638
+ return extractAgentMentions(text).parsed;
639
+ }
640
+ function extractAgentMentions(text) {
629
641
  const matches = Array.from(text.matchAll(/(^|\s)@([a-z0-9][a-z0-9._/:-]*)/gi));
630
642
  const identities = new Map;
643
+ const unparsed = [];
631
644
  for (const match of matches) {
632
- const candidate = parseAgentIdentity(match[2] ?? "");
645
+ const raw = match[2] ?? "";
646
+ const candidate = parseAgentIdentity(raw);
633
647
  if (!candidate) {
648
+ if (raw)
649
+ unparsed.push(`@${raw}`);
634
650
  continue;
635
651
  }
636
652
  identities.set(candidate.label, candidate);
637
653
  }
638
- return Array.from(identities.values());
654
+ return {
655
+ parsed: Array.from(identities.values()),
656
+ unparsed: Array.from(new Set(unparsed))
657
+ };
639
658
  }
640
659
  function candidateAliases(candidate) {
641
660
  const canonical = canonicalizeIdentity({
@@ -7736,9 +7755,10 @@ function scoutConversationIdForChannel(channel) {
7736
7755
  return `channel.${sanitizeConversationSegment(normalizedChannel)}`;
7737
7756
  }
7738
7757
  async function resolveMentionTargets(snapshot, text, currentDirectory) {
7739
- const selectors = extractAgentSelectors(text);
7758
+ const mentions = extractAgentMentions(text);
7759
+ const selectors = mentions.parsed;
7740
7760
  const resolved = new Map;
7741
- const unresolved = [];
7761
+ const unresolved = [...mentions.unparsed];
7742
7762
  const candidateMap = new Map;
7743
7763
  const endpointBackedAgentIds = [...new Set(Object.values(snapshot.endpoints).map((endpoint) => endpoint.agentId).filter((agentId) => agentId && agentId !== OPERATOR_ID))];
7744
7764
  for (const agent of Object.values(snapshot.agents)) {
@@ -7957,6 +7977,7 @@ async function resolveConversationActorId(baseUrl, snapshot, nodeId, actorId, cu
7957
7977
  await syncBrokerBinding(baseUrl, snapshot, binding);
7958
7978
  return binding.actor.id;
7959
7979
  }
7980
+ await syncBrokerAgentRegistration(baseUrl, snapshot, scoutBrokerAgentRegistrationFromConfig(configured, nodeId));
7960
7981
  return configured.agentId;
7961
7982
  }
7962
7983
  async function ensureTargetRelayAgentRegistered(baseUrl, snapshot, nodeId, agentId, currentDirectory) {
@@ -9462,6 +9483,16 @@ async function runScoutSetup(input) {
9462
9483
  brokerWarning = error instanceof Error ? error.message : String(error);
9463
9484
  broker = await getRuntimeBrokerServiceStatus();
9464
9485
  }
9486
+ if (broker.reachable && broker.brokerUrl) {
9487
+ try {
9488
+ await fetch(new URL("/v1/mesh/discover", broker.brokerUrl), {
9489
+ method: "POST",
9490
+ headers: { "content-type": "application/json" },
9491
+ body: "{}",
9492
+ signal: AbortSignal.timeout(1e4)
9493
+ });
9494
+ } catch {}
9495
+ }
9465
9496
  return {
9466
9497
  currentDirectory: input.currentDirectory,
9467
9498
  setup,
@@ -99624,7 +99655,7 @@ function renderScoutHelp(version2 = "0.2.18") {
99624
99655
  init_options();
99625
99656
 
99626
99657
  // ../../apps/desktop/src/shared/product.ts
99627
- var SCOUT_APP_VERSION = process.env.SCOUT_APP_VERSION?.trim() || "0.2.29";
99658
+ var SCOUT_APP_VERSION = process.env.SCOUT_APP_VERSION?.trim() || "0.2.34";
99628
99659
 
99629
99660
  // ../../apps/desktop/src/cli/main.ts
99630
99661
  async function main3() {
@@ -2115,35 +2115,44 @@ function parseSegmentedIdentity(raw) {
2115
2115
  const next = {
2116
2116
  definitionId: definitionPart
2117
2117
  };
2118
- let sawPositionalWorkspace = false;
2118
+ const positional = [];
2119
2119
  for (const part of parts) {
2120
2120
  if (part.includes(":")) {
2121
2121
  const [rawKey, rawValue = ""] = part.split(":", 2);
2122
2122
  const key = normalizeDimensionKey(rawKey);
2123
- const value2 = normalizeAgentIdentitySegment(rawValue);
2124
- if (!key || !value2) {
2123
+ const value = normalizeAgentIdentitySegment(rawValue);
2124
+ if (!key || !value) {
2125
2125
  return null;
2126
2126
  }
2127
2127
  if (key === "workspace") {
2128
- next.workspaceQualifier = value2;
2128
+ next.workspaceQualifier = value;
2129
2129
  } else if (key === "profile") {
2130
- next.profile = value2;
2130
+ next.profile = value;
2131
2131
  } else if (key === "harness") {
2132
- next.harness = value2;
2132
+ next.harness = value;
2133
2133
  } else if (key === "node") {
2134
- next.nodeQualifier = value2;
2134
+ next.nodeQualifier = value;
2135
2135
  }
2136
2136
  continue;
2137
2137
  }
2138
- if (sawPositionalWorkspace) {
2139
- return null;
2140
- }
2141
- const value = normalizeAgentIdentitySegment(part);
2142
- if (!value) {
2138
+ positional.push(part);
2139
+ }
2140
+ if (positional.length === 1) {
2141
+ const value = normalizeAgentIdentitySegment(positional[0]);
2142
+ if (!value)
2143
2143
  return null;
2144
- }
2145
2144
  next.workspaceQualifier = value;
2146
- sawPositionalWorkspace = true;
2145
+ } else if (positional.length === 2) {
2146
+ const nodeValue = normalizeAgentIdentitySegment(positional[0]);
2147
+ const workspaceValue = normalizeAgentIdentitySegment(positional[1]);
2148
+ if (!nodeValue || !workspaceValue)
2149
+ return null;
2150
+ if (!next.nodeQualifier)
2151
+ next.nodeQualifier = nodeValue;
2152
+ if (!next.workspaceQualifier)
2153
+ next.workspaceQualifier = workspaceValue;
2154
+ } else if (positional.length > 2) {
2155
+ return null;
2147
2156
  }
2148
2157
  return constructAgentIdentity(next, { raw });
2149
2158
  }
@@ -12338,6 +12347,7 @@ async function resolveConversationActorId(baseUrl, snapshot, nodeId, actorId, cu
12338
12347
  await syncBrokerBinding(baseUrl, snapshot, binding);
12339
12348
  return binding.actor.id;
12340
12349
  }
12350
+ await syncBrokerAgentRegistration(baseUrl, snapshot, scoutBrokerAgentRegistrationFromConfig(configured, nodeId));
12341
12351
  return configured.agentId;
12342
12352
  }
12343
12353
  async function ensureTargetRelayAgentRegistered(baseUrl, snapshot, nodeId, agentId, currentDirectory) {
@@ -1022,35 +1022,44 @@ function parseSegmentedIdentity(raw2) {
1022
1022
  const next = {
1023
1023
  definitionId: definitionPart
1024
1024
  };
1025
- let sawPositionalWorkspace = false;
1025
+ const positional = [];
1026
1026
  for (const part of parts) {
1027
1027
  if (part.includes(":")) {
1028
1028
  const [rawKey, rawValue = ""] = part.split(":", 2);
1029
1029
  const key = normalizeDimensionKey(rawKey);
1030
- const value2 = normalizeAgentIdentitySegment(rawValue);
1031
- if (!key || !value2) {
1030
+ const value = normalizeAgentIdentitySegment(rawValue);
1031
+ if (!key || !value) {
1032
1032
  return null;
1033
1033
  }
1034
1034
  if (key === "workspace") {
1035
- next.workspaceQualifier = value2;
1035
+ next.workspaceQualifier = value;
1036
1036
  } else if (key === "profile") {
1037
- next.profile = value2;
1037
+ next.profile = value;
1038
1038
  } else if (key === "harness") {
1039
- next.harness = value2;
1039
+ next.harness = value;
1040
1040
  } else if (key === "node") {
1041
- next.nodeQualifier = value2;
1041
+ next.nodeQualifier = value;
1042
1042
  }
1043
1043
  continue;
1044
1044
  }
1045
- if (sawPositionalWorkspace) {
1046
- return null;
1047
- }
1048
- const value = normalizeAgentIdentitySegment(part);
1049
- if (!value) {
1045
+ positional.push(part);
1046
+ }
1047
+ if (positional.length === 1) {
1048
+ const value = normalizeAgentIdentitySegment(positional[0]);
1049
+ if (!value)
1050
1050
  return null;
1051
- }
1052
1051
  next.workspaceQualifier = value;
1053
- sawPositionalWorkspace = true;
1052
+ } else if (positional.length === 2) {
1053
+ const nodeValue = normalizeAgentIdentitySegment(positional[0]);
1054
+ const workspaceValue = normalizeAgentIdentitySegment(positional[1]);
1055
+ if (!nodeValue || !workspaceValue)
1056
+ return null;
1057
+ if (!next.nodeQualifier)
1058
+ next.nodeQualifier = nodeValue;
1059
+ if (!next.workspaceQualifier)
1060
+ next.workspaceQualifier = workspaceValue;
1061
+ } else if (positional.length > 2) {
1062
+ return null;
1054
1063
  }
1055
1064
  return constructAgentIdentity(next, { raw: raw2 });
1056
1065
  }
@@ -1101,16 +1110,26 @@ function constructAgentIdentity(input, options = {}) {
1101
1110
  };
1102
1111
  }
1103
1112
  function extractAgentIdentities(text) {
1113
+ return extractAgentMentions(text).parsed;
1114
+ }
1115
+ function extractAgentMentions(text) {
1104
1116
  const matches = Array.from(text.matchAll(/(^|\s)@([a-z0-9][a-z0-9._/:-]*)/gi));
1105
1117
  const identities = new Map;
1118
+ const unparsed = [];
1106
1119
  for (const match2 of matches) {
1107
- const candidate = parseAgentIdentity(match2[2] ?? "");
1120
+ const raw2 = match2[2] ?? "";
1121
+ const candidate = parseAgentIdentity(raw2);
1108
1122
  if (!candidate) {
1123
+ if (raw2)
1124
+ unparsed.push(`@${raw2}`);
1109
1125
  continue;
1110
1126
  }
1111
1127
  identities.set(candidate.label, candidate);
1112
1128
  }
1113
- return Array.from(identities.values());
1129
+ return {
1130
+ parsed: Array.from(identities.values()),
1131
+ unparsed: Array.from(new Set(unparsed))
1132
+ };
1114
1133
  }
1115
1134
  function candidateAliases(candidate) {
1116
1135
  const canonical = canonicalizeIdentity({
@@ -7669,9 +7688,10 @@ async function loadScoutBrokerContext(baseUrl = resolveScoutBrokerUrl()) {
7669
7688
  }
7670
7689
  }
7671
7690
  async function resolveMentionTargets(snapshot, text, currentDirectory) {
7672
- const selectors = extractAgentSelectors(text);
7691
+ const mentions = extractAgentMentions(text);
7692
+ const selectors = mentions.parsed;
7673
7693
  const resolved = new Map;
7674
- const unresolved = [];
7694
+ const unresolved = [...mentions.unparsed];
7675
7695
  const candidateMap = new Map;
7676
7696
  const endpointBackedAgentIds = [...new Set(Object.values(snapshot.endpoints).map((endpoint) => endpoint.agentId).filter((agentId) => agentId && agentId !== OPERATOR_ID))];
7677
7697
  for (const agent of Object.values(snapshot.agents)) {
@@ -7838,6 +7858,7 @@ async function resolveConversationActorId(baseUrl, snapshot, nodeId, actorId, cu
7838
7858
  await syncBrokerBinding(baseUrl, snapshot, binding);
7839
7859
  return binding.actor.id;
7840
7860
  }
7861
+ await syncBrokerAgentRegistration(baseUrl, snapshot, scoutBrokerAgentRegistrationFromConfig(configured, nodeId));
7841
7862
  return configured.agentId;
7842
7863
  }
7843
7864
  async function ensureTargetRelayAgentRegistered(baseUrl, snapshot, nodeId, agentId, currentDirectory) {
@@ -1023,35 +1023,44 @@ function parseSegmentedIdentity(raw2) {
1023
1023
  const next = {
1024
1024
  definitionId: definitionPart
1025
1025
  };
1026
- let sawPositionalWorkspace = false;
1026
+ const positional = [];
1027
1027
  for (const part of parts) {
1028
1028
  if (part.includes(":")) {
1029
1029
  const [rawKey, rawValue = ""] = part.split(":", 2);
1030
1030
  const key = normalizeDimensionKey(rawKey);
1031
- const value2 = normalizeAgentIdentitySegment(rawValue);
1032
- if (!key || !value2) {
1031
+ const value = normalizeAgentIdentitySegment(rawValue);
1032
+ if (!key || !value) {
1033
1033
  return null;
1034
1034
  }
1035
1035
  if (key === "workspace") {
1036
- next.workspaceQualifier = value2;
1036
+ next.workspaceQualifier = value;
1037
1037
  } else if (key === "profile") {
1038
- next.profile = value2;
1038
+ next.profile = value;
1039
1039
  } else if (key === "harness") {
1040
- next.harness = value2;
1040
+ next.harness = value;
1041
1041
  } else if (key === "node") {
1042
- next.nodeQualifier = value2;
1042
+ next.nodeQualifier = value;
1043
1043
  }
1044
1044
  continue;
1045
1045
  }
1046
- if (sawPositionalWorkspace) {
1047
- return null;
1048
- }
1049
- const value = normalizeAgentIdentitySegment(part);
1050
- if (!value) {
1046
+ positional.push(part);
1047
+ }
1048
+ if (positional.length === 1) {
1049
+ const value = normalizeAgentIdentitySegment(positional[0]);
1050
+ if (!value)
1051
1051
  return null;
1052
- }
1053
1052
  next.workspaceQualifier = value;
1054
- sawPositionalWorkspace = true;
1053
+ } else if (positional.length === 2) {
1054
+ const nodeValue = normalizeAgentIdentitySegment(positional[0]);
1055
+ const workspaceValue = normalizeAgentIdentitySegment(positional[1]);
1056
+ if (!nodeValue || !workspaceValue)
1057
+ return null;
1058
+ if (!next.nodeQualifier)
1059
+ next.nodeQualifier = nodeValue;
1060
+ if (!next.workspaceQualifier)
1061
+ next.workspaceQualifier = workspaceValue;
1062
+ } else if (positional.length > 2) {
1063
+ return null;
1055
1064
  }
1056
1065
  return constructAgentIdentity(next, { raw: raw2 });
1057
1066
  }
@@ -1102,16 +1111,26 @@ function constructAgentIdentity(input, options = {}) {
1102
1111
  };
1103
1112
  }
1104
1113
  function extractAgentIdentities(text) {
1114
+ return extractAgentMentions(text).parsed;
1115
+ }
1116
+ function extractAgentMentions(text) {
1105
1117
  const matches = Array.from(text.matchAll(/(^|\s)@([a-z0-9][a-z0-9._/:-]*)/gi));
1106
1118
  const identities = new Map;
1119
+ const unparsed = [];
1107
1120
  for (const match2 of matches) {
1108
- const candidate = parseAgentIdentity(match2[2] ?? "");
1121
+ const raw2 = match2[2] ?? "";
1122
+ const candidate = parseAgentIdentity(raw2);
1109
1123
  if (!candidate) {
1124
+ if (raw2)
1125
+ unparsed.push(`@${raw2}`);
1110
1126
  continue;
1111
1127
  }
1112
1128
  identities.set(candidate.label, candidate);
1113
1129
  }
1114
- return Array.from(identities.values());
1130
+ return {
1131
+ parsed: Array.from(identities.values()),
1132
+ unparsed: Array.from(new Set(unparsed))
1133
+ };
1115
1134
  }
1116
1135
  function candidateAliases(candidate) {
1117
1136
  const canonical = canonicalizeIdentity({
@@ -8024,7 +8043,7 @@ init_setup();
8024
8043
 
8025
8044
  // apps/desktop/src/shared/product.ts
8026
8045
  var SCOUT_PRODUCT_NAME = "Scout";
8027
- var SCOUT_APP_VERSION = process.env.SCOUT_APP_VERSION?.trim() || "0.2.29";
8046
+ var SCOUT_APP_VERSION = process.env.SCOUT_APP_VERSION?.trim() || "0.2.34";
8028
8047
 
8029
8048
  // apps/desktop/src/shared/surface-capabilities.ts
8030
8049
  function resolveScoutSurfaceCapabilities(surface) {
@@ -8543,6 +8562,7 @@ async function resolveConversationActorId(baseUrl, snapshot, nodeId, actorId, cu
8543
8562
  await syncBrokerBinding(baseUrl, snapshot, binding);
8544
8563
  return binding.actor.id;
8545
8564
  }
8565
+ await syncBrokerAgentRegistration(baseUrl, snapshot, scoutBrokerAgentRegistrationFromConfig(configured, nodeId));
8546
8566
  return configured.agentId;
8547
8567
  }
8548
8568
  async function ensureTargetRelayAgentRegistered(baseUrl, snapshot, nodeId, agentId, currentDirectory) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openscout/scout",
3
- "version": "0.2.29",
3
+ "version": "0.2.34",
4
4
  "description": "Published Scout package that installs the `scout` command",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -23,6 +23,6 @@
23
23
  "access": "public"
24
24
  },
25
25
  "dependencies": {
26
- "@openscout/runtime": "0.2.25"
26
+ "@openscout/runtime": "0.2.34"
27
27
  }
28
28
  }