shadok-ai 0.15.30 → 0.15.32

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/README.md CHANGED
@@ -79,11 +79,12 @@ Enter to skip; you can add it later from the web UI).
79
79
  - **Groups column** — on a desktop the groups get a column of their own, left
80
80
  of the agents: pick a group and the agents column shows only its agents
81
81
  (*Ungrouped* holds the rest, the home agent included unless you file it). Each
82
- group has an icon — drawn at random, click it to pick another or type any
83
- emoji — and a **+** that creates the new agent straight into that group.
82
+ group has an icon — drawn at random, double-click it to pick another or type
83
+ any emoji — and a **+** that creates the new agent straight into that group.
84
+ A single click on a group (its icon or its row) selects it; this matters once
85
+ **«** folds the column to its icons, where the icon is the whole row.
84
86
  Dragging an agent onto a group still files it there, and dragging groups
85
- reorders them. Double-click a name to rename it; **«** folds the column to
86
- its icons. A dot on a group you are not looking at says one of its agents
87
+ reorders them. Double-click a name to rename it. A dot on a group you are not looking at says one of its agents
87
88
  is waiting for you, has an unread answer, or is working. On a phone nothing
88
89
  changes: the agents sheet still lists every group.
89
90
  - **Worktree isolation** — spawned agents get their own git worktree and branch
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shadok-ai",
3
- "version": "0.15.30",
3
+ "version": "0.15.32",
4
4
  "main": "dist/session.js",
5
5
  "scripts": {
6
6
  "test": "node --import tsx --test --test-timeout=120000 test/*.ts context/*/test/*.test.mjs",
package/public/index.html CHANGED
@@ -4184,6 +4184,15 @@
4184
4184
  const moodOf = (t) =>
4185
4185
  ["needs-answer", "unread", "working"].find((m) => t.btnEl.classList.contains(m)) || null;
4186
4186
 
4187
+ // A single click on a group's icon SELECTS the group (when the rail is
4188
+ // collapsed to icons the icon is almost the whole row, so this is the primary
4189
+ // action); a double-click opens the icon picker. The stamp has to live out
4190
+ // here, not on the element: selecting a non-active group rebuilds the rail
4191
+ // (renderRail keys on the active view) and replaces the very icon between the
4192
+ // two clicks, so a native `dblclick` never fires and an element-local timer
4193
+ // would be thrown away with it.
4194
+ let lastIconClick = { view: null, t: 0 };
4195
+
4187
4196
  function railItem({ view, icon, name, group }) {
4188
4197
  const members = tabsInView(view);
4189
4198
  const item = document.createElement("div");
@@ -4199,7 +4208,7 @@
4199
4208
  ic.type = "button";
4200
4209
  ic.className = "rail-icon";
4201
4210
  ic.textContent = icon;
4202
- if (group) ic.title = "Change the icon";
4211
+ if (group) ic.title = "Double-click to change the icon";
4203
4212
  const nm = document.createElement("span");
4204
4213
  nm.className = "rail-name";
4205
4214
  nm.textContent = name;
@@ -4228,8 +4237,18 @@
4228
4237
  applyView();
4229
4238
  });
4230
4239
  ic.addEventListener("click", (e) => {
4240
+ // stopPropagation so the item's own click doesn't double-fire setView,
4241
+ // and so the document-level close-on-click doesn't shut the picker we
4242
+ // may be about to open with this very click.
4231
4243
  e.stopPropagation();
4232
- openIconPicker(group, ic);
4244
+ const now = Date.now();
4245
+ if (lastIconClick.view === view && now - lastIconClick.t < 350) {
4246
+ lastIconClick = { view: null, t: 0 };
4247
+ openIconPicker(group, ic);
4248
+ } else {
4249
+ lastIconClick = { view, t: now };
4250
+ setView(view);
4251
+ }
4233
4252
  });
4234
4253
  nm.addEventListener("dblclick", (e) => {
4235
4254
  e.stopPropagation();