@qontinui/navigation 0.1.6 → 0.2.0

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/dist/index.cjs CHANGED
@@ -244,7 +244,13 @@ var REVIEW_ITEMS = [
244
244
  icon: "History",
245
245
  description: "Browse and manage all runs",
246
246
  hasChildren: true,
247
+ // Runs is a parent WITH a page of its own (/runs — the run browser).
248
+ // `selectsFirstChild: false` alone means "expand only, activate nothing",
249
+ // which left the item inert: clicking Runs opened the flyout but never
250
+ // dispatched a tab change. It must activate its OWN id, not its first
251
+ // child's ("run-recap"), so `selectsFirstChild` cannot express this.
247
252
  selectsFirstChild: false,
253
+ hasOwnPage: true,
248
254
  route: "/runs",
249
255
  color: "#4A90D9",
250
256
  productMode: "ai"
@@ -259,12 +265,21 @@ var REVIEW_ITEMS = [
259
265
  productMode: "ai"
260
266
  },
261
267
  {
262
- id: "memory",
268
+ // Id is "observations" (NOT "memory"): it must match the runner's
269
+ // `MainTabId` union member / `TabContent` case that actually renders this
270
+ // page. The old "memory" id was in no consumer's tab union, so clicking
271
+ // the item activated a tab that did not exist.
272
+ id: "observations",
263
273
  label: "Memory",
264
274
  icon: "Brain",
265
275
  description: "Cross-session observation memory from past runs",
266
276
  route: "/observe/memory",
267
277
  color: "#8B5CF6",
278
+ // Runner-only: qontinui-web has no `observe/` route tree at all, so this
279
+ // item's route 404s there — and because qontinui-web derives its co-pilot
280
+ // page map from getWebNavigation(), an un-gated item also advertises that
281
+ // 404 as a navigable target to the planner. Gate it at the source.
282
+ platforms: ["runner"],
268
283
  productMode: "ai"
269
284
  },
270
285
  {
@@ -276,6 +291,16 @@ var REVIEW_ITEMS = [
276
291
  color: "#F97316",
277
292
  platforms: ["runner"],
278
293
  productMode: "ai"
294
+ },
295
+ {
296
+ id: "helper-tasks",
297
+ label: "Helper Tasks",
298
+ icon: "MessageSquare",
299
+ description: "Helper Task Queue \u2014 emit human spot-check tasks, review helper verdicts, invite helpers",
300
+ route: "/review/helper-tasks",
301
+ color: "#10B981",
302
+ platforms: ["runner"],
303
+ productMode: "ai"
279
304
  }
280
305
  ];
281
306
  var REVIEW_GROUP = {
package/dist/index.d.cts CHANGED
@@ -30,6 +30,25 @@ interface NavigationItem {
30
30
  hasChildren?: boolean;
31
31
  /** If true, clicking this item selects its first child instead of itself */
32
32
  selectsFirstChild?: boolean;
33
+ /**
34
+ * If true, this item is a parent (`hasChildren: true`) that ALSO has a page
35
+ * of its own: clicking it must activate the item's own id (in addition to
36
+ * opening its children flyout/submenu), not just expand.
37
+ *
38
+ * This is the third case in the parent-click contract, and it exists because
39
+ * the other two cannot express it:
40
+ * - `selectsFirstChild: true` — activates the FIRST CHILD's id (e.g.
41
+ * "settings" → "settings-account"). The parent has no page of its own.
42
+ * - `selectsFirstChild: false` — activates NOTHING; the click only
43
+ * expands. Correct for a pure container.
44
+ * - `hasOwnPage: true` — activates the PARENT's own id (e.g.
45
+ * "runs" → the Runs page). Use when the parent is a real destination.
46
+ *
47
+ * Consumers implementing item-click MUST honour this: when a parent has
48
+ * `hasOwnPage`, dispatch the tab/route change for `item.id` itself.
49
+ * Ignored for items without children.
50
+ */
51
+ hasOwnPage?: boolean;
33
52
  /** Platform availability - if not set, available on all platforms */
34
53
  platforms?: Platform[];
35
54
  /** Badge count or status to show on this item */
@@ -192,8 +211,10 @@ type NavigationAction = {
192
211
  * Both platforms share this structure; per-item `platforms`/`productMode`
193
212
  * filters yield the right view for each (web has no Terminal; runner has no
194
213
  * Dashboard/Runners, etc.). qontinui-web additionally demotes a few items the
195
- * runner keeps (runs/active/findings/memory — task_run-scoped, not session-
196
- * scoped) via its own local list; those stay un-`hidden` here.
214
+ * runner keeps (runs/active/findings — task_run-scoped, not session-scoped)
215
+ * via its own local list; those stay un-`hidden` here. The observation-memory
216
+ * item is no longer among them: it is `platforms: ["runner"]` now, since web
217
+ * has no `observe/` route tree (its route 404s there).
197
218
  */
198
219
 
199
220
  declare const WORKSPACE_ITEMS: NavigationItem[];
package/dist/index.d.ts CHANGED
@@ -30,6 +30,25 @@ interface NavigationItem {
30
30
  hasChildren?: boolean;
31
31
  /** If true, clicking this item selects its first child instead of itself */
32
32
  selectsFirstChild?: boolean;
33
+ /**
34
+ * If true, this item is a parent (`hasChildren: true`) that ALSO has a page
35
+ * of its own: clicking it must activate the item's own id (in addition to
36
+ * opening its children flyout/submenu), not just expand.
37
+ *
38
+ * This is the third case in the parent-click contract, and it exists because
39
+ * the other two cannot express it:
40
+ * - `selectsFirstChild: true` — activates the FIRST CHILD's id (e.g.
41
+ * "settings" → "settings-account"). The parent has no page of its own.
42
+ * - `selectsFirstChild: false` — activates NOTHING; the click only
43
+ * expands. Correct for a pure container.
44
+ * - `hasOwnPage: true` — activates the PARENT's own id (e.g.
45
+ * "runs" → the Runs page). Use when the parent is a real destination.
46
+ *
47
+ * Consumers implementing item-click MUST honour this: when a parent has
48
+ * `hasOwnPage`, dispatch the tab/route change for `item.id` itself.
49
+ * Ignored for items without children.
50
+ */
51
+ hasOwnPage?: boolean;
33
52
  /** Platform availability - if not set, available on all platforms */
34
53
  platforms?: Platform[];
35
54
  /** Badge count or status to show on this item */
@@ -192,8 +211,10 @@ type NavigationAction = {
192
211
  * Both platforms share this structure; per-item `platforms`/`productMode`
193
212
  * filters yield the right view for each (web has no Terminal; runner has no
194
213
  * Dashboard/Runners, etc.). qontinui-web additionally demotes a few items the
195
- * runner keeps (runs/active/findings/memory — task_run-scoped, not session-
196
- * scoped) via its own local list; those stay un-`hidden` here.
214
+ * runner keeps (runs/active/findings — task_run-scoped, not session-scoped)
215
+ * via its own local list; those stay un-`hidden` here. The observation-memory
216
+ * item is no longer among them: it is `platforms: ["runner"]` now, since web
217
+ * has no `observe/` route tree (its route 404s there).
197
218
  */
198
219
 
199
220
  declare const WORKSPACE_ITEMS: NavigationItem[];
package/dist/index.js CHANGED
@@ -154,7 +154,13 @@ var REVIEW_ITEMS = [
154
154
  icon: "History",
155
155
  description: "Browse and manage all runs",
156
156
  hasChildren: true,
157
+ // Runs is a parent WITH a page of its own (/runs — the run browser).
158
+ // `selectsFirstChild: false` alone means "expand only, activate nothing",
159
+ // which left the item inert: clicking Runs opened the flyout but never
160
+ // dispatched a tab change. It must activate its OWN id, not its first
161
+ // child's ("run-recap"), so `selectsFirstChild` cannot express this.
157
162
  selectsFirstChild: false,
163
+ hasOwnPage: true,
158
164
  route: "/runs",
159
165
  color: "#4A90D9",
160
166
  productMode: "ai"
@@ -169,12 +175,21 @@ var REVIEW_ITEMS = [
169
175
  productMode: "ai"
170
176
  },
171
177
  {
172
- id: "memory",
178
+ // Id is "observations" (NOT "memory"): it must match the runner's
179
+ // `MainTabId` union member / `TabContent` case that actually renders this
180
+ // page. The old "memory" id was in no consumer's tab union, so clicking
181
+ // the item activated a tab that did not exist.
182
+ id: "observations",
173
183
  label: "Memory",
174
184
  icon: "Brain",
175
185
  description: "Cross-session observation memory from past runs",
176
186
  route: "/observe/memory",
177
187
  color: "#8B5CF6",
188
+ // Runner-only: qontinui-web has no `observe/` route tree at all, so this
189
+ // item's route 404s there — and because qontinui-web derives its co-pilot
190
+ // page map from getWebNavigation(), an un-gated item also advertises that
191
+ // 404 as a navigable target to the planner. Gate it at the source.
192
+ platforms: ["runner"],
178
193
  productMode: "ai"
179
194
  },
180
195
  {
@@ -186,6 +201,16 @@ var REVIEW_ITEMS = [
186
201
  color: "#F97316",
187
202
  platforms: ["runner"],
188
203
  productMode: "ai"
204
+ },
205
+ {
206
+ id: "helper-tasks",
207
+ label: "Helper Tasks",
208
+ icon: "MessageSquare",
209
+ description: "Helper Task Queue \u2014 emit human spot-check tasks, review helper verdicts, invite helpers",
210
+ route: "/review/helper-tasks",
211
+ color: "#10B981",
212
+ platforms: ["runner"],
213
+ productMode: "ai"
189
214
  }
190
215
  ];
191
216
  var REVIEW_GROUP = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qontinui/navigation",
3
- "version": "0.1.6",
3
+ "version": "0.2.0",
4
4
  "description": "Shared navigation structure for Qontinui applications",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",