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.
- package/dashboard/console/console.js +10 -1
- package/dashboard/console/home-model.js +18 -1
- package/dist/data/standards-guard-index.json +1 -1
- package/dist/data/standards-guard-index.meta.json +2 -2
- package/dist/data/standards-registry.meta.json +1 -1
- package/dist/native/instar-desktop-host +0 -0
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +2 -2
- package/src/data/standards-guard-index.json +1 -1
- package/src/data/standards-guard-index.meta.json +2 -2
- package/src/data/standards-registry.meta.json +1 -1
- package/upgrades/1.3.1609.md +20 -0
- package/upgrades/side-effects/console-needs-you-links.eli16.md +7 -0
- package/upgrades/side-effects/console-needs-you-links.md +33 -0
|
@@ -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:
|
|
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.
|
|
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": "
|
|
2
|
+
"sha256": "ccaa1ee5b44efb04fe258136a20c35325729fa9683990dc4015d33d480a8b715",
|
|
3
3
|
"registrySha256": "db01d9f92c6aa26ca903702896b41be53722982ed07d27633237bb254c214290",
|
|
4
|
-
"packageVersion": "1.3.
|
|
4
|
+
"packageVersion": "1.3.1609"
|
|
5
5
|
}
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-11-02T20:
|
|
5
|
-
"instarVersion": "1.3.
|
|
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.
|
|
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": "
|
|
2
|
+
"sha256": "ccaa1ee5b44efb04fe258136a20c35325729fa9683990dc4015d33d480a8b715",
|
|
3
3
|
"registrySha256": "db01d9f92c6aa26ca903702896b41be53722982ed07d27633237bb254c214290",
|
|
4
|
-
"packageVersion": "1.3.
|
|
4
|
+
"packageVersion": "1.3.1609"
|
|
5
5
|
}
|
|
@@ -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.
|