instar 1.3.1608 → 1.3.1609

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.
@@ -47,6 +47,8 @@ const expanded = new Set(); // cards the operator expanded; kept acr
47
47
  const openRows = new Set(); // rows the operator opened; kept across refreshes
48
48
  let rowSeq = 0;
49
49
  let homeChatId = null;
50
+ // The agent-wide Attention topic, where every attention item is posted.
51
+ let attentionTopicId = null;
50
52
  let homeRun = null;
51
53
 
52
54
  // ── tiny DOM helpers ──────────────────────────────────────────────────────
@@ -257,6 +259,8 @@ function actionHref(action) {
257
259
  return `#/work/promises?${params}`;
258
260
  }
259
261
  if (action.kind === 'topic') return topicLink(homeChatId, action.topicId);
262
+ if (action.kind === 'href') return action.href || null;
263
+ if (action.kind === 'attention') return attentionTopicId ? topicLink(homeChatId, attentionTopicId) : null;
260
264
  return null;
261
265
  }
262
266
 
@@ -449,7 +453,7 @@ function loadHome() {
449
453
  ? { ...model, retrying: true, line: [model.line, 'Checking again automatically.'].filter(Boolean).join(' ') } : model;
450
454
  const refresh = (key) => {
451
455
  const names = results.pool ? machineNames(results.pool) : {};
452
- if ((key === 'attention' || key === 'pool') && results.attention) set('needs', annotate(buildNeeds(results.attention, Date.now(), names), results.attention));
456
+ if ((key === 'attention' || key === 'pool' || key === 'systemTopics') && results.attention) set('needs', annotate(buildNeeds(results.attention, Date.now(), names), results.attention));
453
457
  if ((key === 'sessions' || key === 'pool' || key === 'topics') && results.sessions) set('doing', annotate(buildDoing(results.sessions, Date.now(), names, topicNameMap(results.topics)), results.sessions));
454
458
  if (key === 'pool' && results.pool) set('running', annotate(buildRunning(results.pool), results.pool));
455
459
  if ((key === 'commitments' || key === 'pool') && results.commitments) {
@@ -472,6 +476,10 @@ function loadHome() {
472
476
  || key === 'topics' && ((result.data?.pool?.failed?.length || 0) > 0 || (result.data?.pool?.unresolved?.length || 0) > 0));
473
477
  const retryable = partial || (!result.ok && !['not signed in', 'switched off on this agent'].includes(result.reason));
474
478
  results[key] = partial ? { ...result, retrying: true } : result;
479
+ if (key === 'systemTopics' && result.ok) {
480
+ const t = Number(result.data?.topics?.attention);
481
+ attentionTopicId = Number.isFinite(t) && t > 1 ? t : null;
482
+ }
475
483
  if (key === 'pool' && result.ok) {
476
484
  const self = (result.data?.machines || []).find((m) => m.isSelf || m.machineId === result.data.selfMachineId);
477
485
  homeChatId = self?.servesChannels?.telegram?.chatIds?.[0] || null;
@@ -489,6 +497,7 @@ function loadHome() {
489
497
  // A slow source cannot block another card or start overlapping refreshes.
490
498
  read('pool', '/pool', POOL_TIMEOUT_MS);
491
499
  read('attention', '/attention?scope=pool', POOL_TIMEOUT_MS);
500
+ read('systemTopics', '/telegram/system-topics');
492
501
  read('sessions', '/sessions?scope=pool', POOL_TIMEOUT_MS);
493
502
  read('topics', '/telegram/topics?scope=pool', POOL_TIMEOUT_MS);
494
503
  read('commitments', '/commitments?scope=mesh', COMMITMENTS_TIMEOUT_MS);
@@ -115,6 +115,23 @@ export function needsOperator(item) {
115
115
  return /decision|approval|review|sign-?in|relogin/i.test(cat);
116
116
  }
117
117
 
118
+ /**
119
+ * Where the operator acts on an item. Every row in "needs you" gets one: its
120
+ * own conversation; the Desktop page for that machine; the Accounts page for a
121
+ * sign-in; otherwise the Attention topic, where the item was posted and can be
122
+ * answered.
123
+ */
124
+ export function needAction(item) {
125
+ if (item && item.topicId != null && Number.isFinite(Number(item.topicId))) return { kind: 'topic', topicId: Number(item.topicId) };
126
+ const cat = String((item && item.category) || '');
127
+ if (/^desktop$/i.test(cat)) {
128
+ const q = item.machineId ? `?machineId=${encodeURIComponent(item.machineId)}` : '';
129
+ return { kind: 'href', href: `/dashboard/desktop.html${q}` };
130
+ }
131
+ if (/sign-?in|relogin/i.test(cat)) return { kind: 'href', href: '#/capacity/accounts' };
132
+ return { kind: 'attention' };
133
+ }
134
+
118
135
  export const STALE_DAYS = 14;
119
136
  const DAY = 86400000;
120
137
 
@@ -154,7 +171,7 @@ export function buildNeeds(res, now = Date.now(), names = {}) {
154
171
  tone: stale ? 'unknown' : (top.priority === 'URGENT' ? 'bad' : 'attn'),
155
172
  detail: top.description || top.body || '',
156
173
  expandable: true,
157
- action: Number.isFinite(Number(top.topicId)) ? { kind: 'topic', topicId: Number(top.topicId) } : null,
174
+ action: needAction(top),
158
175
  };
159
176
  }).sort((a, b) => Number(a.stale) - Number(b.stale) || a.prio - b.prio || b.last - a.last);
160
177
  const current = all.filter((g) => !g.stale);
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 1,
3
3
  "generatedFrom": "source-tree",
4
4
  "registrySha256": "db01d9f92c6aa26ca903702896b41be53722982ed07d27633237bb254c214290",
5
- "packageVersion": "1.3.1608",
5
+ "packageVersion": "1.3.1609",
6
6
  "guards": [
7
7
  {
8
8
  "ref": "docs/audits/phase-b/f10-triage.md",
@@ -1,5 +1,5 @@
1
1
  {
2
- "sha256": "f8a624d90b7e0da9279f067fef9e141bac4834e4418d71b592ef4c5b07b6af49",
2
+ "sha256": "ccaa1ee5b44efb04fe258136a20c35325729fa9683990dc4015d33d480a8b715",
3
3
  "registrySha256": "db01d9f92c6aa26ca903702896b41be53722982ed07d27633237bb254c214290",
4
- "packageVersion": "1.3.1608"
4
+ "packageVersion": "1.3.1609"
5
5
  }
@@ -2,5 +2,5 @@
2
2
  "sha256": "db01d9f92c6aa26ca903702896b41be53722982ed07d27633237bb254c214290",
3
3
  "articleCount": 93,
4
4
  "generatedFrom": "docs/STANDARDS-REGISTRY.md",
5
- "packageVersion": "1.3.1608"
5
+ "packageVersion": "1.3.1609"
6
6
  }
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "1.3.1608",
3
+ "version": "1.3.1609",
4
4
  "description": "Coherence infrastructure for self-evolving AI agents — on the Claude Code or Codex subscription you already have.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-11-02T20:00:15.797Z",
5
- "instarVersion": "1.3.1608",
4
+ "generatedAt": "2026-11-02T20:33:29.976Z",
5
+ "instarVersion": "1.3.1609",
6
6
  "entryCount": 206,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 1,
3
3
  "generatedFrom": "source-tree",
4
4
  "registrySha256": "db01d9f92c6aa26ca903702896b41be53722982ed07d27633237bb254c214290",
5
- "packageVersion": "1.3.1608",
5
+ "packageVersion": "1.3.1609",
6
6
  "guards": [
7
7
  {
8
8
  "ref": "docs/audits/phase-b/f10-triage.md",
@@ -1,5 +1,5 @@
1
1
  {
2
- "sha256": "f8a624d90b7e0da9279f067fef9e141bac4834e4418d71b592ef4c5b07b6af49",
2
+ "sha256": "ccaa1ee5b44efb04fe258136a20c35325729fa9683990dc4015d33d480a8b715",
3
3
  "registrySha256": "db01d9f92c6aa26ca903702896b41be53722982ed07d27633237bb254c214290",
4
- "packageVersion": "1.3.1608"
4
+ "packageVersion": "1.3.1609"
5
5
  }
@@ -2,5 +2,5 @@
2
2
  "sha256": "db01d9f92c6aa26ca903702896b41be53722982ed07d27633237bb254c214290",
3
3
  "articleCount": 93,
4
4
  "generatedFrom": "docs/STANDARDS-REGISTRY.md",
5
- "packageVersion": "1.3.1608"
5
+ "packageVersion": "1.3.1609"
6
6
  }
@@ -0,0 +1,20 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ - Every item in the dashboard's "What needs you" card now links to where you act on it: its own conversation, the Desktop page for that machine, the Accounts page for a sign-in, or otherwise the Attention topic where it was posted. Before, items without a conversation were plain text.
9
+
10
+ ## What to Tell Your User
11
+
12
+ Everything in "What needs you" is now a link. Tap an item and you land where you can deal with it, for example the remote-desktop setup for that exact machine.
13
+
14
+ ## Summary of New Capabilities
15
+
16
+ None. This completes the existing "needs you" card.
17
+
18
+ ## Evidence
19
+
20
+ - On a live agent, both items in "What needs you" (remote-desktop permission on two machines) showed as plain text with no link. On the preview, each now links to the Desktop page with that machine selected.
@@ -0,0 +1,7 @@
1
+ # Every item in "What needs you" now has a place to tap
2
+
3
+ The dashboard's home screen has a card called "What needs you". It lists the things only you can do: approve something, sign in somewhere, or fix a setting on a machine. The rule we agreed is that everything in that list must come with a button or a link that takes you straight to where you act, because a request you cannot act on is just noise.
4
+
5
+ Until now that rule was only half true. An item tied to a conversation linked to that conversation. Anything else (for example "Remote Desktop needs its Mac permission again" on the Mac Mini) was shown as plain text you could expand and read, with nowhere to go. That is what both items on the list looked like this morning.
6
+
7
+ Now every item gets a destination. A remote-desktop item opens the Desktop page with that exact machine selected, where the step-by-step setup and the Retry button are. A sign-in item opens the Accounts page. Anything else opens the Attention conversation in Telegram, where that item was posted and where you can answer it. If the dashboard cannot work out where the Attention conversation is, the item falls back to readable text, never a broken link. Nothing is hidden or removed by this change; it only adds the missing links.
@@ -0,0 +1,33 @@
1
+ # Side-effects review: every "needs you" row has somewhere to act
2
+
3
+ ## Change
4
+ `dashboard/console/home-model.js` adds `needAction(item)`; `buildNeeds` uses it for every row. Order: the item's own topic; a `desktop` item opens `/dashboard/desktop.html?machineId=<its machine>` (that page has the guided setup and Retry for that machine); a sign-in item opens Accounts; anything else opens the Attention topic in Telegram, where the item was posted. `dashboard/console/console.js` reads `GET /telegram/system-topics` once to learn the Attention topic and maps the new `href` and `attention` action kinds to links.
5
+
6
+ Before, a row without a topic id rendered as expandable text with no link. On the Studio today both rows in "needs you" (Remote Desktop permission on Mac Lan and Mac Mini) were like that.
7
+
8
+ ## 1. Over-block
9
+ None. Not a gate.
10
+
11
+ ## 2. Under-block
12
+ If the Attention topic cannot be read, an `attention` row falls back to the old expandable text (no link). It never shows a broken link.
13
+
14
+ ## 3. Level-of-abstraction fit
15
+ The console page model decides where a row links. Correct layer.
16
+
17
+ ## 4. Signal vs authority
18
+ No decision point. Not applicable.
19
+
20
+ ## 5. Interactions
21
+ A row with a link renders as a link instead of an expandable row, so its description is not shown inline; the destination (Desktop page, conversation, Attention topic) carries the full text. The headline now says "Tap to review and respond." for these items, as it already did for conversation items. The card still hides itself when there is exactly one actionable item, because the headline then links to it.
22
+
23
+ ## 6. External surfaces
24
+ One extra read (`GET /telegram/system-topics`) per console load. It is read-only and already authenticated.
25
+
26
+ ## 6b. Operator-surface quality
27
+ Checked on the preview: each of the two Remote Desktop rows links to the Desktop page with that machine selected.
28
+
29
+ ## 7. Multi-machine posture
30
+ Items come from `/attention?scope=pool` and carry their machine id; the Desktop link uses the item's own machine. The Attention topic is the agent-wide system topic (one per agent). Machine-local page code.
31
+
32
+ ## 8. Rollback cost
33
+ Revert the commit; no data or migration.