@sergeychuvayev/claude-fleet 0.12.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sergeychuvayev/claude-fleet",
3
- "version": "0.12.0",
3
+ "version": "0.12.1",
4
4
  "description": "A local control room for Claude Code sessions",
5
5
  "keywords": [
6
6
  "claude",
package/public/app.js CHANGED
@@ -287,7 +287,8 @@ function sessionRowHtml(s, spawnCounts) {
287
287
  const childSelectedHere = !!selectedChild && (s.delegations || []).some(d => d.id === selectedChild)
288
288
  const name = (s.managed ? 'FLEET · ' : '') + (s.name || s.shortId || 'Unnamed session')
289
289
  const top = `<span class="session-top">${hasUnseen(s) ? '<span class="unseen" aria-label="New output"></span>' : ''}${status(s)}<span class="session-name">${esc(name)}</span>${rowTags(s, spawnCounts)}</span>`
290
- const body = `${top}${initiativeTag(s)}<span class="session-title">${esc(s.title || s.lastPrompt || 'Untitled session')}</span>${rowMeta(s)}${turnRow(s)}`
290
+ const title = `<span class="session-title">${esc(s.title || s.lastPrompt || 'Untitled session')}</span>`
291
+ const body = `${top}<span class="session-title-row">${initiativeTag(s)}${title}</span>${rowMeta(s)}${turnRow(s)}`
291
292
  return `<button class="session${childSelectedHere ? ' session-ancestor' : ''}" draggable="true" data-session="${esc(key(s))}" aria-pressed="${selected === key(s) && !childSelectedHere}" aria-controls="detail" title="${hasUnseen(s) ? 'New output since you last opened this' : ''}"><span>${body}</span>${contextCell(s)}</button>${childRowsHtml(s)}`
292
293
  }
293
294
  // The trigger names whichever combination is active instead of repeating every
package/public/control.js CHANGED
@@ -60,8 +60,14 @@ async function loadLaunchTeams() {
60
60
  function openLaunch(source=null) {
61
61
  window.FleetTeams?.reset()
62
62
  resumeSource=source
63
+ // Leftover text, a picked team, a swapped model or approval mode from a task that
64
+ // was never launched should not greet the next one. The remembered project
65
+ // directory is the one thing worth carrying forward, so it survives the reset.
66
+ const form=$('launch-form'), cwd=form.elements.cwd.value
67
+ form.reset()
68
+ form.elements.cwd.value=cwd
63
69
  $('launch-title').textContent=source ? 'Continue this conversation in Fleet.' : 'Give your next task a home.'
64
- if(source){$('launch-cwd').value=source.cwd || '';$('launch-form').elements.name.value=source.title || source.name || ''}
70
+ if(source){$('launch-cwd').value=source.cwd || '';form.elements.name.value=source.title || source.name || ''}
65
71
  loadLaunchTeams()
66
72
  $('launch-cwd').readOnly=!!source
67
73
  openModal('launch-backdrop', '[name=prompt]')
package/public/styles.css CHANGED
@@ -233,6 +233,16 @@ select {
233
233
  overflow:hidden;
234
234
  margin-bottom:8px;
235
235
  }
236
+ .session-title-row {
237
+ display:flex;
238
+ align-items:baseline;
239
+ gap:8px;
240
+ min-width:0;
241
+ }
242
+ .session-title-row .session-title {
243
+ flex:1;
244
+ min-width:0;
245
+ }
236
246
  .session-meta {
237
247
  display:flex;
238
248
  gap:9px;
@@ -1074,8 +1084,12 @@ body {
1074
1084
  }
1075
1085
  .filter-trigger:hover { background:color-mix(in oklab,var(--raised) 85%,var(--text)) }
1076
1086
  .filter-chevron {
1087
+ display:inline-block;
1088
+ position:relative;
1089
+ top:1px;
1077
1090
  color:var(--faint);
1078
1091
  font-size:var(--text-xs);
1092
+ line-height:1;
1079
1093
  transition:transform .12s ease;
1080
1094
  }
1081
1095
  .filter-trigger[aria-expanded="true"] .filter-chevron { transform:rotate(180deg) }
@@ -1268,8 +1282,9 @@ body {
1268
1282
  }
1269
1283
  .detail:has(#composer) .conversation-header {
1270
1284
  margin:0 0 10px;
1271
- padding:0;
1285
+ padding:0 0 10px;
1272
1286
  border:0;
1287
+ border-bottom:1px solid var(--line);
1273
1288
  flex:none;
1274
1289
  }
1275
1290
  /* The console takes whatever is left, until it is dragged to an explicit height. */
@@ -2197,14 +2212,17 @@ body[data-modal] { overflow:hidden }
2197
2212
  @keyframes update-pill-in { from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:none} }
2198
2213
  .initiative-tag {
2199
2214
  display:inline-block;
2200
- max-width:100%;
2201
- margin-top:6px;
2215
+ flex:none;
2216
+ max-width:50%;
2202
2217
  padding:2px 6px;
2203
2218
  border:1px solid var(--line);
2204
2219
  border-radius:var(--radius-sm);
2205
2220
  color:var(--muted);
2206
2221
  font-size:var(--text-xs);
2207
2222
  overflow-wrap:anywhere;
2223
+ white-space:nowrap;
2224
+ overflow:hidden;
2225
+ text-overflow:ellipsis;
2208
2226
  }
2209
2227
  .block[data-tool="Task"], .block[data-tool="Agent"] { border-left:2px solid var(--accent) }
2210
2228
  .block[data-tool="Task"] .block-tool, .block[data-tool="Agent"] .block-tool {
@@ -2684,7 +2702,6 @@ body[data-modal] { overflow:hidden }
2684
2702
  .block-reference summary{cursor:pointer;color:var(--accent);overflow-wrap:anywhere}
2685
2703
  .block-reference summary span,.block-reference p{color:var(--muted);font-size:10px}
2686
2704
  .block-reference pre{max-height:240px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;font:11px/1.6 var(--mono);color:var(--muted)}
2687
- .session[draggable=true]{cursor:grab}
2688
2705
  .session[draggable=true]:active{cursor:grabbing}
2689
2706
  .reference-state{font-size:10px;color:var(--muted)}
2690
2707
 
package/public/teams.js CHANGED
@@ -4,7 +4,7 @@ window.FleetTeams=(()=>{
4
4
  const { esc, toast } = window.Fleet
5
5
  const control = () => window.FleetControl
6
6
  const api = (...args) => window.FleetControl.api(...args)
7
- let draft=null,tools=[],originalId=null,returnTeam=null
7
+ let draft=null,tools=[],originalId=null,returnTeam=null,openToken=0
8
8
  const escape=value=>esc(String(value ?? ''))
9
9
  const field=(label,key,value,max=500)=>`<label>${label}<input data-team-field="${key}" value="${escape(value)}" maxlength="${max}" required></label>`
10
10
  function mount() {
@@ -34,9 +34,14 @@ window.FleetTeams=(()=>{
34
34
  }
35
35
  async function open() {
36
36
  mount()
37
+ // Closing (or resetting) the launch modal bumps this past whatever token a call
38
+ // to open() captured, so a fetch that resolves after the dialog moved on updates
39
+ // nothing instead of quietly hijacking whatever's open now into team-edit mode.
40
+ const token=++openToken
37
41
  try {
38
42
  const selected=document.getElementById('launch-team').value || 'delivery'
39
43
  const [data,catalog]=await Promise.all([api(`/api/teams/${encodeURIComponent(selected)}`),api('/api/teams')])
44
+ if(token!==openToken)return
40
45
  tools=catalog.tools;draft=data.team;returnTeam=selected
41
46
  const custom=catalog.teams.find(t=>t.id===selected)?.custom
42
47
  originalId=custom ? selected:null
@@ -44,7 +49,7 @@ window.FleetTeams=(()=>{
44
49
  draft.workflow ||= {reviewers:['qa'],maxAttempts:3,budgetUsd:10}
45
50
  for(const [name,role] of Object.entries(draft.roles))role.tools ||= tools.filter(t=>!(role.disallowedTools || []).includes(t) && (name!==draft.manager || ['Read','Glob','Grep','WebSearch','WebFetch'].includes(t)))
46
51
  render();toggle(true)
47
- } catch(error){toast(error.message)}
52
+ } catch(error){if(token===openToken)toast(error.message)}
48
53
  }
49
54
  function render() {
50
55
  document.getElementById('team-editor-error').hidden=true
@@ -134,6 +139,6 @@ window.FleetTeams=(()=>{
134
139
  catch(error){const el=box.querySelector('p');el.textContent=error.message;el.hidden=false;event.target.disabled=false}
135
140
  })
136
141
  }
137
- function reset(){if(document.getElementById('team-editor'))toggle(false)}
142
+ function reset(){openToken++;if(document.getElementById('team-editor'))toggle(false)}
138
143
  return {open,board,reset,save,isEditing:()=>!!document.getElementById('team-editor') && !document.getElementById('team-editor').hidden}
139
144
  })()