@galda/cli 0.10.110 → 0.10.111

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/app/index.html +20 -2
  2. package/package.json +1 -1
package/app/index.html CHANGED
@@ -3485,7 +3485,7 @@ const savedTheme = (() => {
3485
3485
  if (v !== s) localStorage.setItem('theme', v);
3486
3486
  return v;
3487
3487
  })();
3488
- const state = { repos: null, repoHome: '', /* GET /api/repos — the folders a project can point at (Context Bar) */ projects: [], goals: [], tasks: [], act: {}, actAt: {}, todos: {}, chatTurns: {}, active: localStorage.getItem('sel:project') || 'default', editing: null, attach: [], connectCommand: '', models: ['sonnet'], agentModels: null, agentEfforts: null, agents: ['claude-code', 'codex'], auth: null, expanded: new Set(), openThreads: new Set(), queueOrder: {}, externalActivity: [], selectedGoal: null, composerDetachedGoal: null, workflowColumns: {}, wfDraft: null, reviewDefinitions: {}, rdDraft: null, runningCounts: {}, parallelLimits: null, hostReadiness: [], connectedApp: localStorage.getItem('sel:agent') || 'claude-code', reviewOpenGoal: null, reviewApprovals: {}, goalDetailOpen: null, qreplyOpen: new Set(), logCollapsed: localStorage.getItem('logCollapsed') !== '0', logEntries: [], layout: localStorage.getItem('layout') || 'flagship', theme: savedTheme, boardskin: localStorage.getItem('boardskin') || 'auto', summaryPattern: Number(localStorage.getItem('summaryPattern')) || 3, peraSpot: 0, skill: null, skillsCache: null, projectRules: {}, rulesOpen: false,
3488
+ const state = { repos: null, repoHome: '', /* GET /api/repos — the folders a project can point at (Context Bar) */ projects: [], goals: [], tasks: [], act: {}, actAt: {}, todos: {}, chatTurns: {}, active: localStorage.getItem('sel:project') || 'default', editing: null, attach: [], connectCommand: '', models: ['sonnet'], agentModels: null, agentEfforts: null, agents: ['claude-code', 'codex'], auth: null, expanded: new Set(), openThreads: new Set(), queueOrder: {}, queueWaits: {}, externalActivity: [], selectedGoal: null, composerDetachedGoal: null, workflowColumns: {}, wfDraft: null, reviewDefinitions: {}, rdDraft: null, runningCounts: {}, parallelLimits: null, hostReadiness: [], connectedApp: localStorage.getItem('sel:agent') || 'claude-code', reviewOpenGoal: null, reviewApprovals: {}, goalDetailOpen: null, qreplyOpen: new Set(), logCollapsed: localStorage.getItem('logCollapsed') !== '0', logEntries: [], layout: localStorage.getItem('layout') || 'flagship', theme: savedTheme, boardskin: localStorage.getItem('boardskin') || 'auto', summaryPattern: Number(localStorage.getItem('summaryPattern')) || 3, peraSpot: 0, skill: null, skillsCache: null, projectRules: {}, rulesOpen: false,
3489
3489
  // per-message send overrides set via slash-commands (reset after each send,
3490
3490
  // except model which is sticky in localStorage). palette = open command list.
3491
3491
  // Scoped per project (msgByProject) so a skill/mode picked in one project can't leak
@@ -4617,7 +4617,25 @@ function renderQueue(){
4617
4617
  // layouts keep the explanatory sentence.
4618
4618
  const qn = ob.length + stacked.length + planning.length;
4619
4619
  const headHtml = qn > 0 ? `<div class="qhead">${state.layout === 'flagship' ? `Queued · ${qn}` : `${qn} queued · goals become To dos in ~30s`}</div>` : '';
4620
+ // Why this queued goal is not moving, in the SERVER's words (state.queueWaits,
4621
+ // keyed by goal id — engine/lib.mjs buildQueueWaits). The server owns the slot
4622
+ // accounting, so it is the only thing that can answer this without disagreeing
4623
+ // with itself.
4624
+ //
4625
+ // The fallback below is what this used to do always: re-derive the answer in the
4626
+ // browser from running TASKS plus planning goals. That is the accounting #541
4627
+ // replaced — a goal whose task sat in the queue counted for nothing — so the
4628
+ // browser could print "Next up · starts automatically" about a goal the server
4629
+ // had blocked. Kept only for a server older than queueWaits; when the field is
4630
+ // there, the row repeats the server rather than guessing alongside it.
4620
4631
  const stackedMeta = (g) => {
4632
+ const wait = state.queueWaits?.[g.id];
4633
+ if (wait) {
4634
+ const targets = (wait.targetGoalIds ?? []).filter((id) => id !== g.id);
4635
+ const active = targets.length ? ` · active ${targets.map((id) => `#${id}`).join(', ')}` : '';
4636
+ const ops = targets.length ? ' · Run next / switch Agent' : '';
4637
+ return `Waiting · ${wait.reason}${active} · starts when ${wait.condition}${ops}`;
4638
+ }
4621
4639
  const project = state.projects.find((p) => p.id === g.projectId);
4622
4640
  if (project?.paused) return 'Paused · press play to start';
4623
4641
  const activeIds = [...new Set([
@@ -8784,7 +8802,7 @@ async function refresh(){
8784
8802
  setAgentEffort(state.connectedApp);
8785
8803
  renderModelSelect();
8786
8804
  renderEffortSelect();
8787
- state.queueOrder = s.queueOrder ?? {}; state.externalActivity = s.externalActivity ?? [];
8805
+ state.queueOrder = s.queueOrder ?? {}; state.queueWaits = s.queueWaits ?? {}; state.externalActivity = s.externalActivity ?? [];
8788
8806
  state.runningCounts = s.runningCounts ?? {}; state.parallelLimits = s.parallelLimits ?? null;
8789
8807
  state.workflowColumns = s.workflowColumns ?? {};
8790
8808
  state.reviewDefinitions = s.reviewDefinitions ?? {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galda/cli",
3
- "version": "0.10.110",
3
+ "version": "0.10.111",
4
4
  "type": "module",
5
5
  "description": "Galda - hand off work to Claude Code or Codex, get proof back. Runs on your existing subscription, no extra API cost.",
6
6
  "scripts": {