@atolis-hq/wake 0.2.81 → 0.2.83

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.
@@ -61,7 +61,10 @@ export const indexHtml = `<!DOCTYPE html>
61
61
  main { padding: 1rem; }
62
62
  .columns { display: grid; grid-template-columns: repeat(6, minmax(180px, 1fr)); gap: 0.6rem; overflow-x: auto; }
63
63
  .col { background: #1a1d23; border-radius: 10px; padding: 0.5rem; min-height: 200px; }
64
- .col h2 { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.04em; color: #9aa2ad; margin: 0.2rem 0.4rem 0.5rem; }
64
+ .col-header { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; margin: 0.2rem 0.4rem 0.5rem; }
65
+ .col h2 { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.04em; color: #9aa2ad; margin: 0; }
66
+ .col-toggle { display: none; width: 1.65rem; height: 1.65rem; flex: 0 0 auto; align-items: center; justify-content: center; background: transparent; border: 1px solid #3a4150; border-radius: 6px; color: #cbd5e1; cursor: pointer; font-size: 1rem; line-height: 1; }
67
+ .col-toggle:hover { border-color: var(--accent); color: var(--accent-light); }
65
68
  .card { background: #22262e; border: 1px solid #2c313a; border-radius: 8px; padding: 0.5rem; margin-bottom: 0.5rem; cursor: pointer; font-size: 0.8rem; transition: border-color 0.12s ease; }
66
69
  .card:hover { border-color: var(--accent); }
67
70
  .card .title { font-weight: 600; margin-bottom: 0.25rem; }
@@ -126,8 +129,10 @@ export const indexHtml = `<!DOCTYPE html>
126
129
  .modal { width: 100%; height: 100%; max-height: none; border-radius: 0; border-left: 0; border-right: 0; }
127
130
  .columns { display: flex; flex-direction: column; overflow-x: unset; }
128
131
  .col { min-height: unset; }
132
+ .col-toggle { display: inline-flex; }
133
+ .col.is-collapsed .col-cards { display: none; }
129
134
  .col-empty { padding: 0.25rem 0.5rem; }
130
- .col-empty h2 { margin: 0.1rem 0.4rem; }
135
+ .col-empty .col-header { margin: 0.1rem 0.4rem; }
131
136
  .event-summary { grid-template-columns: minmax(8.5rem, 10rem) minmax(8rem, 1fr) 2.2rem; gap: 0.5rem; }
132
137
  .event-id { display: none; }
133
138
  }
@@ -210,6 +215,7 @@ const COND_CARD = {
210
215
  'needs-human': 'card-needs-human',
211
216
  error: 'card-error',
212
217
  };
218
+ const BOARD_COLLAPSE_STORAGE_KEY = 'wake:board:collapsed-columns';
213
219
  let currentView = 'board';
214
220
  let analyticsWindow = '1d';
215
221
  let analyticsMetric = 'runs-over-time';
@@ -280,6 +286,35 @@ function isActiveRequest(requestId) {
280
286
  return activeViewRequest && activeViewRequest.id === requestId;
281
287
  }
282
288
 
289
+ function readCollapsedColumns() {
290
+ try {
291
+ const raw = window.localStorage.getItem(BOARD_COLLAPSE_STORAGE_KEY);
292
+ if (!raw) return new Set();
293
+ const values = JSON.parse(raw);
294
+ if (!Array.isArray(values)) return new Set();
295
+ return new Set(values.filter((value) => CONDITIONS.includes(value)));
296
+ } catch {
297
+ return new Set();
298
+ }
299
+ }
300
+
301
+ function writeCollapsedColumns(collapsed) {
302
+ try {
303
+ window.localStorage.setItem(BOARD_COLLAPSE_STORAGE_KEY, JSON.stringify([...collapsed]));
304
+ } catch {
305
+ // Ignore storage failures; the toggle should still work for this render.
306
+ }
307
+ }
308
+
309
+ function setColumnCollapsed(column, button, collapsed) {
310
+ const label = collapsed ? 'Expand column' : 'Collapse column';
311
+ column.classList.toggle('is-collapsed', collapsed);
312
+ button.textContent = collapsed ? '+' : '-';
313
+ button.setAttribute('aria-label', label);
314
+ button.setAttribute('aria-expanded', String(!collapsed));
315
+ button.setAttribute('title', label);
316
+ }
317
+
283
318
  function loadingNode(label) {
284
319
  return el('p', { class: 'meta', text: 'Loading ' + label + '...' });
285
320
  }
@@ -345,6 +380,7 @@ async function renderBoard(context) {
345
380
  const board = await getJson('/board', context.signal);
346
381
  if (!isActiveRequest(context.requestId)) return;
347
382
  const main = document.getElementById('main');
383
+ const collapsedColumns = readCollapsedColumns();
348
384
  const columns = el('div', { class: 'columns' }, CONDITIONS.map((cond) => {
349
385
  const items = board.filter((c) => c.condition === cond);
350
386
  if (cond === 'finished') items.sort((a, b) => a.timeInStageMs - b.timeInStageMs);
@@ -358,10 +394,27 @@ async function renderBoard(context) {
358
394
  ...renderCardSummaryNodes(item),
359
395
  ]);
360
396
  });
361
- return el('div', { class: 'col' + (items.length === 0 ? ' col-empty' : '') }, [
362
- el('h2', { text: cond + ' (' + items.length + ')' }),
363
- ...cards,
397
+ const isCollapsed = collapsedColumns.has(cond);
398
+ const toggle = el('button', {
399
+ class: 'col-toggle',
400
+ type: 'button',
401
+ onclick: () => {
402
+ const nextCollapsed = !collapsedColumns.has(cond);
403
+ if (nextCollapsed) collapsedColumns.add(cond);
404
+ else collapsedColumns.delete(cond);
405
+ writeCollapsedColumns(collapsedColumns);
406
+ setColumnCollapsed(column, toggle, nextCollapsed);
407
+ },
408
+ });
409
+ const column = el('div', { class: 'col' + (items.length === 0 ? ' col-empty' : '') }, [
410
+ el('div', { class: 'col-header' }, [
411
+ el('h2', { text: cond + ' (' + items.length + ')' }),
412
+ toggle,
413
+ ]),
414
+ el('div', { class: 'col-cards' }, cards),
364
415
  ]);
416
+ setColumnCollapsed(column, toggle, isCollapsed);
417
+ return column;
365
418
  }));
366
419
  main.replaceChildren(columns);
367
420
  }
@@ -1,4 +1,5 @@
1
1
  import { waitForActiveRuns } from './stop-command.js';
2
+ import { resolveWakeVersion } from '../version.js';
2
3
  const HEALTHCHECK_WAKE_ROOT = '/tmp/wake-self-update-healthcheck';
3
4
  const START_PROCESS_CHECK_ATTEMPTS = 15;
4
5
  const START_PROCESS_CHECK_INTERVAL_MS = 1000;
@@ -97,12 +98,13 @@ export async function runSelfUpdateCommand(input) {
97
98
  };
98
99
  try {
99
100
  await input.git.checkoutTag(tag);
100
- // Matches wake sandbox build's WAKE_BUILD_TAG handling (sandbox-command.ts).
101
+ const buildVersion = input.resolveBuildVersion?.(input.repoRoot) ??
102
+ resolveWakeVersion({ repoRoot: input.repoRoot });
101
103
  await input.docker.build({
102
104
  image: newImage,
103
105
  dockerfile: input.dockerfilePath,
104
106
  contextDir: input.repoRoot,
105
- buildArgs: { WAKE_BUILD_TAG: tag },
107
+ buildArgs: { WAKE_BUILD_TAG: buildVersion },
106
108
  });
107
109
  await input.docker.update({ ...updateInput, image: newImage });
108
110
  input.logger.info('[self-update] recreated container; entrypoint will keep wake start running');
@@ -124,4 +124,4 @@ export function resolveWakeVersion(options = {}) {
124
124
  }
125
125
  return '0.1.0-dev';
126
126
  }
127
- export const wakeVersion = "ge91aa2a";
127
+ export const wakeVersion = "gf3111aa";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atolis-hq/wake",
3
- "version": "0.2.81",
3
+ "version": "0.2.83",
4
4
  "description": "Local autonomous agent control plane for software development",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {