@jxsuite/studio 3.0.0 → 4.0.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/README.md +5 -5
- package/dist/chunks/Overlay.dev-723bv0df.js +23 -0
- package/dist/chunks/{cf-settings-zj2cj1ar.js → cf-settings-45fgyx8y.js} +6 -5
- package/dist/chunks/{components-z6cnkyy1.js → components-zmx10t62.js} +6 -5
- package/dist/chunks/content-source-t88vb2dr.js +49 -0
- package/dist/chunks/{convert-to-repeater-6vvx96n2.js → convert-to-repeater-dhw1nrz9.js} +27 -19
- package/dist/chunks/entry-commands-6z6bhxg0.js +46 -0
- package/dist/chunks/{extension-sections-kwzvpemr.js → extension-sections-3ydgjbdy.js} +32 -24
- package/dist/chunks/file-ops-rskmhxyq.js +48 -0
- package/dist/chunks/files-0cratsr0.js +92 -0
- package/dist/chunks/{format-host-8fr3545e.js → format-host-tgcmfs4p.js} +3 -3
- package/dist/chunks/fs-events-hrrg328g.js +21 -0
- package/dist/chunks/{git-panel-g01d93vc.js → git-panel-0yywyk76.js} +21 -16
- package/dist/chunks/{jx-validate-jj9rnt4n.js → jx-validate-8q2g05x1.js} +6 -4
- package/dist/chunks/layers-panel-z3tqe5cd.js +67 -0
- package/dist/chunks/layers-q75tj2mf.js +45 -0
- package/dist/chunks/lit-html-j055mkh8.js +22 -0
- package/dist/chunks/monaco-buffer-dqw0xxpx.js +25 -0
- package/dist/chunks/{monaco-setup-a5wkmbgh.js → monaco-setup-rws7k4br.js} +4 -4
- package/dist/chunks/notify-yjm79n4s.js +30 -0
- package/dist/chunks/parse-24d0gay3.js +19 -0
- package/dist/chunks/platform-ba1j1gbh.js +16 -0
- package/dist/chunks/publish-panel-54jvhskq.js +28 -0
- package/dist/chunks/quick-search-cgfmjwq5.js +65 -0
- package/dist/chunks/references-3qx8fkyp.js +29 -0
- package/dist/chunks/right-panel-cqp8bc4v.js +46 -0
- package/dist/chunks/sp-overlay.dev-yztmtrs1.js +18 -0
- package/dist/chunks/sp-popover.dev-n2etmqdp.js +9 -0
- package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +15 -0
- package/dist/chunks/sp-tooltip.dev-xcvpnqr0.js +15 -0
- package/dist/chunks/{sp-tray.dev-64v4pxw8.js → sp-tray.dev-tkbscm06.js} +5 -5
- package/dist/chunks/{studio-8ezdegcx.js → studio-1hbqnt19.js} +36 -32
- package/dist/chunks/{studio-r5xbtctf.js → studio-2zkz8evn.js} +446 -2451
- package/dist/chunks/{studio-pkp61mh8.js → studio-4pqqxbrt.js} +23 -15
- package/dist/chunks/{studio-kvfx9z2c.js → studio-4rzyrtjz.js} +70 -31
- package/dist/chunks/{studio-3dkcd4c5.js → studio-5q69gfag.js} +60 -56
- package/dist/chunks/{studio-rh1cnamv.js → studio-5rywrkxz.js} +563 -133
- package/dist/chunks/{studio-6kv3apa9.js → studio-68n67094.js} +25 -9
- package/dist/chunks/{studio-0rqqhrdy.js → studio-7nte2hj4.js} +2 -2
- package/dist/chunks/{studio-xntfdy1x.js → studio-8swrjbny.js} +31 -18
- package/dist/chunks/studio-92ab2jqe.js +282 -0
- package/dist/chunks/{studio-sas7mt3k.js → studio-9ab8gqsm.js} +2 -2
- package/dist/chunks/{studio-ry1vz5sv.js → studio-9c4k4vhv.js} +15 -13
- package/dist/chunks/studio-9n4mrmnb.js +184 -0
- package/dist/chunks/{studio-tr20m8g8.js → studio-9r6j5ev1.js} +37 -2
- package/dist/chunks/{studio-2x9zbxmx.js → studio-ahjfdy6e.js} +9 -7
- package/dist/chunks/{studio-s519zc99.js → studio-bgxt93ga.js} +3 -3
- package/dist/chunks/{studio-dc8s8heb.js → studio-cb12yz9w.js} +8528 -8780
- package/dist/chunks/studio-cft9r4r7.js +119 -0
- package/dist/chunks/{studio-hcxzyk3x.js → studio-eenfkt4e.js} +6 -6
- package/dist/chunks/studio-eesa1myv.js +498 -0
- package/dist/chunks/{studio-ay8wcr2b.js → studio-eqq1w638.js} +7 -9
- package/dist/chunks/{studio-7p35254k.js → studio-ex8zyp98.js} +30 -26
- package/dist/chunks/studio-gv8vvshc.js +118 -0
- package/dist/chunks/studio-hbtp0eh1.js +1315 -0
- package/dist/chunks/{studio-a0yp7syn.js → studio-htsf0w6m.js} +29 -114
- package/dist/chunks/{studio-j595e748.js → studio-kjjsjak4.js} +139 -63
- package/dist/chunks/{studio-5x5774ak.js → studio-kryvsw6j.js} +3 -3
- package/dist/chunks/{studio-kfpek536.js → studio-kyh9avvv.js} +2 -2
- package/dist/chunks/{studio-g5gdqnyd.js → studio-kyk2v92a.js} +14 -14
- package/dist/chunks/{studio-twsafr1e.js → studio-m3hwn7y1.js} +3 -3
- package/dist/chunks/{studio-tzx3xmvx.js → studio-mmv72a27.js} +8 -8
- package/dist/chunks/{studio-vhk5fmfv.js → studio-n8b9wqwy.js} +5 -5
- package/dist/chunks/{studio-cjm7fdjf.js → studio-p4ngc046.js} +8 -104
- package/dist/chunks/{studio-p5dja96s.js → studio-p8j86wag.js} +2 -2
- package/dist/chunks/{studio-6z5eyjwn.js → studio-pdfjntbk.js} +66 -129
- package/dist/chunks/studio-q43a5y9h.js +394 -0
- package/dist/chunks/studio-q7v10cg2.js +106 -0
- package/dist/chunks/{studio-2w11grav.js → studio-qq6jym04.js} +3 -3
- package/dist/chunks/studio-r1r7afxx.js +1066 -0
- package/dist/chunks/{studio-3fk1ac9z.js → studio-rdx8jcxy.js} +4 -4
- package/dist/chunks/{studio-4mqb9a0j.js → studio-rn9ta2mz.js} +4 -4
- package/dist/chunks/studio-sf7zjgv1.js +91 -0
- package/dist/chunks/studio-t7qb9db8.js +665 -0
- package/dist/chunks/studio-tmc5emrw.js +8 -0
- package/dist/chunks/{studio-wdt9y92a.js → studio-txwkm6p9.js} +2 -2
- package/dist/chunks/{studio-k4jvjcfx.js → studio-v38hmvx1.js} +7 -7
- package/dist/chunks/{studio-7ejemhej.js → studio-vadzgkrz.js} +6 -6
- package/dist/chunks/studio-wcy8trfx.js +263 -0
- package/dist/chunks/{studio-5efrtn1m.js → studio-wx5609xd.js} +21 -17
- package/dist/chunks/{studio-qpfq7xhm.js → studio-xrapxwwc.js} +22 -285
- package/dist/chunks/{studio-hj2se583.js → studio-yxrkyv8a.js} +41 -31
- package/dist/chunks/{studio-xm3dbxvn.js → studio-zczps70q.js} +2 -2
- package/dist/chunks/workspace-xpres40v.js +89 -0
- package/dist/iframe-entry.js +108 -24
- package/dist/studio.js +2362 -1695
- package/package.json +16 -15
- package/src/browse/library-pane.ts +57 -3
- package/src/canvas/canvas-render.ts +23 -1
- package/src/canvas/iframe-patch.ts +47 -21
- package/src/canvas/iframe-render.ts +22 -6
- package/src/commands/app-commands.ts +4 -0
- package/src/commands/command-args.ts +29 -0
- package/src/commands/context.ts +15 -1
- package/src/commands/defaults.ts +29 -1
- package/src/commands/levels.ts +16 -0
- package/src/commands/live-context.ts +3 -0
- package/src/content/collection-match.ts +267 -0
- package/src/content/entry-commands.ts +38 -29
- package/src/content/entry-fields.ts +6 -0
- package/src/editor/shortcuts.ts +5 -0
- package/src/files/file-ops.ts +10 -42
- package/src/files/files.ts +485 -59
- package/src/files/fs-events.ts +9 -0
- package/src/files/gitignore.ts +432 -0
- package/src/files/serialize-document.ts +60 -0
- package/src/format/convert-file.ts +511 -0
- package/src/format/format-choices.ts +199 -0
- package/src/grid/grid-view.ts +16 -2
- package/src/media/media-open.ts +58 -0
- package/src/media/media-pane.ts +310 -0
- package/src/new-project/import-tab.ts +332 -160
- package/src/new-project/new-project-modal.ts +27 -34
- package/src/packages/ensure-deps.ts +14 -7
- package/src/packages/jxsuite-update.ts +11 -11
- package/src/page-params.ts +10 -46
- package/src/panels/activity-bar.ts +45 -16
- package/src/panels/ai-chat/attached-context.ts +6 -1
- package/src/panels/ai-chat/chat-view.ts +255 -13
- package/src/panels/ai-chat/composer.ts +21 -97
- package/src/panels/ai-panel.ts +116 -2
- package/src/panels/navigator-panels.ts +7 -6
- package/src/panels/settings-menu.ts +799 -0
- package/src/panels/toolbar.ts +135 -15
- package/src/platforms/cloud.ts +20 -0
- package/src/platforms/devserver.ts +67 -33
- package/src/preview/preview-overlay.ts +226 -0
- package/src/services/ai-ask.ts +247 -0
- package/src/services/ai-import-tools.ts +494 -0
- package/src/services/ai-project-tools.ts +20 -26
- package/src/services/ai-system-prompt.ts +88 -2
- package/src/services/ai-turn-signal.ts +70 -0
- package/src/services/connection.ts +74 -0
- package/src/services/context-manager.ts +89 -0
- package/src/services/document-assistant.ts +45 -4
- package/src/services/import-client.ts +33 -6
- package/src/services/import-run.ts +158 -0
- package/src/services/import-seed.ts +120 -0
- package/src/services/jx-validate.ts +58 -6
- package/src/services/project-adoption.ts +71 -0
- package/src/services/references.ts +0 -0
- package/src/services/settings/definitions.ts +17 -0
- package/src/services/tool-executor.ts +34 -2
- package/src/settings/contexts-section.ts +45 -3
- package/src/settings/dependencies-editor.ts +43 -23
- package/src/settings/general-settings.ts +30 -12
- package/src/settings/preferences-dialog.ts +18 -41
- package/src/settings/preferences-sections.ts +57 -0
- package/src/settings/settings-document.ts +65 -9
- package/src/studio.ts +33 -6
- package/src/tabs/transact.ts +42 -19
- package/src/types.ts +103 -5
- package/src/ui/ai-model-picker.ts +162 -0
- package/src/ui/choice-field.ts +72 -0
- package/src/ui/layers.ts +83 -5
- package/src/utils/studio-utils.ts +22 -52
- package/styles/forced-colors.css +7 -0
- package/styles/overlays.css +256 -0
- package/styles/panels.css +13 -1
- package/styles/shell.css +111 -0
- package/dist/chunks/Overlay.dev-d2ajy6sj.js +0 -23
- package/dist/chunks/content-source-7fy9qrm0.js +0 -40
- package/dist/chunks/files-xcybanxe.js +0 -70
- package/dist/chunks/layers-panel-27essgkc.js +0 -60
- package/dist/chunks/publish-panel-09sy2bab.js +0 -22
- package/dist/chunks/quick-search-sefb61v8.js +0 -55
- package/dist/chunks/right-panel-9r32jd5j.js +0 -39
- package/dist/chunks/sp-overlay.dev-s18hymn9.js +0 -18
- package/dist/chunks/sp-popover.dev-dj9x7e7a.js +0 -9
- package/dist/chunks/sp-progress-circle.dev-0zxcyz3r.js +0 -15
- package/dist/chunks/sp-tooltip.dev-5c6d1kjz.js +0 -15
- package/dist/chunks/studio-c31yb4t6.js +0 -55
- package/src/canvas/site-style-css.ts +0 -117
package/src/panels/ai-panel.ts
CHANGED
|
@@ -34,6 +34,10 @@ import { undo } from "../tabs/transact";
|
|
|
34
34
|
import { activeTab } from "../workspace/workspace";
|
|
35
35
|
import { setOpenAiKey } from "../services/ai-settings";
|
|
36
36
|
import { hasAiCredentials } from "../services/ai-models";
|
|
37
|
+
import { answerAsk, isAwaitingAnswer, pendingAsk, skipAsk } from "../services/ai-ask";
|
|
38
|
+
import { activeImportRun, importRun } from "../services/import-run";
|
|
39
|
+
import type { ImportBrief } from "../services/import-seed";
|
|
40
|
+
import type { ImportBreakpointPolicy } from "../types";
|
|
37
41
|
import { openPreferences } from "../settings/preferences-dialog";
|
|
38
42
|
import { onCredentialsChanged } from "../settings/preferences-accounts";
|
|
39
43
|
import { setDockCollapsed } from "../shell";
|
|
@@ -42,6 +46,7 @@ import { clearMarkdownCache } from "./ai-chat/chat-markdown";
|
|
|
42
46
|
import { renderChatHeader, renderMessageList } from "./ai-chat/chat-view";
|
|
43
47
|
import { createComposer } from "./ai-chat/composer";
|
|
44
48
|
import { renderSessionsList } from "./ai-chat/sessions-view";
|
|
49
|
+
import { buildMessageWithContext } from "./ai-chat/attached-context";
|
|
45
50
|
import { setInspectorTab } from "./right-panel";
|
|
46
51
|
|
|
47
52
|
import type { AnyCommand } from "../commands/registry";
|
|
@@ -109,6 +114,17 @@ function watchAssistant() {
|
|
|
109
114
|
void last?.toolCalls?.length;
|
|
110
115
|
void cs.status;
|
|
111
116
|
void cs.error;
|
|
117
|
+
// The question is not chat state — it lives in `services/ai-ask.ts` — but it is drawn into
|
|
118
|
+
// This panel, so the same effect has to track it or a question would appear a frame late
|
|
119
|
+
// (and its ANSWER would never repaint the card at all).
|
|
120
|
+
void pendingAsk();
|
|
121
|
+
/* The run record, for the same reason: an import reports a line at a time from a store that
|
|
122
|
+
is not chat state, and its chip has to repaint on every one of them. Reading the ACTIVE
|
|
123
|
+
run tracks the whole record, so any field moving schedules a frame. */
|
|
124
|
+
const run = activeImportRun();
|
|
125
|
+
void run?.message;
|
|
126
|
+
void run?.log.length;
|
|
127
|
+
void run?.status;
|
|
112
128
|
scheduleAiRender();
|
|
113
129
|
});
|
|
114
130
|
});
|
|
@@ -179,11 +195,23 @@ function renderSetupNotice(): TemplateResult {
|
|
|
179
195
|
|
|
180
196
|
// ─── Sending ────────────────────────────────────────────────────────────────
|
|
181
197
|
|
|
182
|
-
/**
|
|
198
|
+
/**
|
|
199
|
+
* Send a message through the document assistant agent loop — or answer the question it is waiting
|
|
200
|
+
* on, which is the same keystroke and a different act.
|
|
201
|
+
*
|
|
202
|
+
* The answer must NOT become a user message. `toMessagesArray` serialises the array verbatim and a
|
|
203
|
+
* provider requires a `tool` reply to follow its `tool_calls` request; a user turn spliced between
|
|
204
|
+
* them is a 400. It travels as the tool result instead, and the question's own card renders it.
|
|
205
|
+
*/
|
|
183
206
|
async function handleAssistantSend(text: string) {
|
|
184
207
|
if (!text.trim() || assistant.chatState.status === "streaming") {
|
|
185
208
|
return;
|
|
186
209
|
}
|
|
210
|
+
if (answerAsk(text.trim())) {
|
|
211
|
+
stickToBottom = true;
|
|
212
|
+
scheduleAiRender();
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
187
215
|
// A send always lands in the chat view, pinned to the newest message.
|
|
188
216
|
view = "chat";
|
|
189
217
|
stickToBottom = true;
|
|
@@ -264,6 +292,66 @@ export async function seedAssistantPrompt(text: string): Promise<void> {
|
|
|
264
292
|
await handleAssistantSend(text);
|
|
265
293
|
}
|
|
266
294
|
|
|
295
|
+
/**
|
|
296
|
+
* Take the New Project Import form's brief and start the run as an assistant turn.
|
|
297
|
+
*
|
|
298
|
+
* The wizard closes without having created anything: `import_site` is `no-project` tiered and does
|
|
299
|
+
* the creating, so the window is still on the welcome screen when this runs — which is exactly the
|
|
300
|
+
* state the assistant is designed to be usable in (`specs/studio.md` §6).
|
|
301
|
+
*
|
|
302
|
+
* A fresh chat, deliberately. An import is the start of a project, and threading it onto whatever
|
|
303
|
+
* conversation the previous project left behind would put another project's document context in
|
|
304
|
+
* front of the model on its very first decision.
|
|
305
|
+
*
|
|
306
|
+
* The brief is already in `services/import-seed.ts` — the form that gathered it put it there, so
|
|
307
|
+
* `import_site` can read the destination later whether or not this hand-off is what started it.
|
|
308
|
+
*
|
|
309
|
+
* @param {ImportBrief} brief
|
|
310
|
+
*/
|
|
311
|
+
export async function revealImportHandoff(brief: ImportBrief): Promise<void> {
|
|
312
|
+
revealAssistant();
|
|
313
|
+
newChat();
|
|
314
|
+
await seedAssistantPrompt(buildImportTurn(brief));
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* The user message that opens an import turn.
|
|
319
|
+
*
|
|
320
|
+
* The parameters ride in an attached-context block — the composer's own convention for facts the
|
|
321
|
+
* model must see but the reader should not have to re-read (`ai-chat/attached-context.ts`). The
|
|
322
|
+
* body is the user's own brief, so the transcript reads as what they asked for rather than as a
|
|
323
|
+
* form submission.
|
|
324
|
+
*
|
|
325
|
+
* @param {ImportBrief} brief
|
|
326
|
+
* @returns {string}
|
|
327
|
+
*/
|
|
328
|
+
/** The breakpoint policy in a sentence the model can act on rather than a JSON blob. */
|
|
329
|
+
function describeBreakpoints(policy: ImportBreakpointPolicy): string {
|
|
330
|
+
if (policy.mode === "all") {
|
|
331
|
+
return "keep every one the site declares";
|
|
332
|
+
}
|
|
333
|
+
if (policy.mode === "explicit") {
|
|
334
|
+
return `${(policy.widths ?? []).join(", ")} (rounding ${policy.rounding ?? "nearest"})`;
|
|
335
|
+
}
|
|
336
|
+
return `keep ${policy.count ?? 3}, evenly spaced (rounding ${policy.rounding ?? "nearest"})`;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
export function buildImportTurn(brief: ImportBrief): string {
|
|
340
|
+
const body = brief.prompt.trim() || `Import ${brief.url} and get it ready for me to work on.`;
|
|
341
|
+
return buildMessageWithContext(body, [
|
|
342
|
+
{
|
|
343
|
+
detail:
|
|
344
|
+
`Import request from the New Project form — url: ${brief.url}, ` +
|
|
345
|
+
`destination: ${brief.directory}, depth: ${brief.depth}, ` +
|
|
346
|
+
`max pages: ${brief.maxPages}, AI component naming: ${brief.aiComponents}, ` +
|
|
347
|
+
`breakpoints: ${describeBreakpoints(brief.breakpoints)}. ` +
|
|
348
|
+
"Call import_site with the url; the destination and options above are already settled.",
|
|
349
|
+
kind: "import",
|
|
350
|
+
label: `Import ${brief.url}`,
|
|
351
|
+
},
|
|
352
|
+
]);
|
|
353
|
+
}
|
|
354
|
+
|
|
267
355
|
// ─── Automation seeding (screenshot runner) ─────────────────────────────────
|
|
268
356
|
|
|
269
357
|
/** A canned tool-call chip for {@link seedAssistantMessages}. */
|
|
@@ -331,6 +419,17 @@ export function revealAssistant(): void {
|
|
|
331
419
|
setInspectorTab("assistant");
|
|
332
420
|
}
|
|
333
421
|
|
|
422
|
+
/**
|
|
423
|
+
* Whether a turn is suspended on the reader.
|
|
424
|
+
*
|
|
425
|
+
* Not the same as streaming and not the opposite of idle: no tokens are moving, but the loop is
|
|
426
|
+
* alive and holding a tool open. `assistant.stop` is enabled on the union of the two, because a
|
|
427
|
+
* turn waiting forever on a question nobody wants to answer is exactly what Stop is for.
|
|
428
|
+
*/
|
|
429
|
+
export function isAssistantWaiting(): boolean {
|
|
430
|
+
return isAwaitingAnswer();
|
|
431
|
+
}
|
|
432
|
+
|
|
334
433
|
/**
|
|
335
434
|
* Whether a turn is in flight — the probe `commands/live-context.ts` declares as `aiStreaming` and
|
|
336
435
|
* projects onto `ctx.ai.streaming`.
|
|
@@ -388,6 +487,7 @@ function activeSessionTitle(): string | null {
|
|
|
388
487
|
// ─── Composer ───────────────────────────────────────────────────────────────
|
|
389
488
|
|
|
390
489
|
const composer = createComposer({
|
|
490
|
+
isAwaiting: isAssistantWaiting,
|
|
391
491
|
isStreaming: isAssistantStreaming,
|
|
392
492
|
onOpenSettings: () => {
|
|
393
493
|
void openPreferences("assistant");
|
|
@@ -533,7 +633,10 @@ export function assistantCommands(): AnyCommand[] {
|
|
|
533
633
|
menus: ["palette"],
|
|
534
634
|
group: "2_turn",
|
|
535
635
|
requires: "a turn in flight",
|
|
536
|
-
|
|
636
|
+
/* The union, not just `streaming`. A turn suspended on `ask_user` moves no tokens, so
|
|
637
|
+
`ctx.ai.streaming` reads false — and that is precisely the turn a reader who does not want
|
|
638
|
+
to answer needs to end. */
|
|
639
|
+
enablement: (ctx: CommandContext) => ctx.ai.streaming || ctx.ai.waiting,
|
|
537
640
|
run: stop,
|
|
538
641
|
},
|
|
539
642
|
];
|
|
@@ -565,6 +668,17 @@ export function renderAiPanelTemplate(): TemplateResult {
|
|
|
565
668
|
tokens: cs.tokenCount,
|
|
566
669
|
})}
|
|
567
670
|
${renderMessageList({
|
|
671
|
+
ask: {
|
|
672
|
+
importRun,
|
|
673
|
+
onAnswer: (text) => {
|
|
674
|
+
void handleAssistantSend(text);
|
|
675
|
+
},
|
|
676
|
+
onSkip: () => {
|
|
677
|
+
skipAsk();
|
|
678
|
+
scheduleAiRender();
|
|
679
|
+
},
|
|
680
|
+
pendingId: pendingAsk()?.id ?? null,
|
|
681
|
+
},
|
|
568
682
|
error: cs.error,
|
|
569
683
|
listRef: onMessagesListRef,
|
|
570
684
|
messages: cs.messages,
|
|
@@ -79,7 +79,7 @@ export function registerNavigatorPanels(): void {
|
|
|
79
79
|
// ── Off-rail: reachable by command and palette, no rail button ──────────────
|
|
80
80
|
registerInsertPanel();
|
|
81
81
|
|
|
82
|
-
// ── The Bottom dock's tabs (§3.2 ⑪): Problems ·
|
|
82
|
+
// ── The Bottom dock's tabs (§3.2 ⑪): Problems · Logic · Activity ────────────
|
|
83
83
|
// Composed here, in the one place panel records are gathered, so the shell has ONE composition
|
|
84
84
|
// Site rather than one per dock. Importing the module is also what attaches the dock to the
|
|
85
85
|
// Shell's mount lifecycle — see its `registerShellSurface` call. Problems arrives with them and
|
|
@@ -110,12 +110,13 @@ export function navigatorPanelSet(): readonly PanelRecord[] {
|
|
|
110
110
|
* The roster `panel.focus.*` is generated from: rail order first, then the rail-less Navigator
|
|
111
111
|
* panels.
|
|
112
112
|
*
|
|
113
|
-
* Not `railPanelSet()`: Insert and
|
|
114
|
-
* `Show …` command and a palette row, which is the whole point of `rail: false` (a surface
|
|
115
|
-
* reachable by name, not by number).
|
|
113
|
+
* Not `railPanelSet()`: Insert and Languages have no rail button and no chord, and they still need
|
|
114
|
+
* a `Show …` command and a palette row, which is the whole point of `rail: false` (a surface
|
|
115
|
+
* reachable by name, not by number). State used to be the third of them and is gone: its editor is
|
|
116
|
+
* the Data panel's now, so there is no second record to roster.
|
|
116
117
|
*
|
|
117
|
-
* The Bottom dock's
|
|
118
|
-
*
|
|
118
|
+
* The Bottom dock's three tabs are deliberately absent — Problems as of this change, and Logic and
|
|
119
|
+
* Activity all along. Each is `rail: false` AND hosted there, so each is addressed by
|
|
119
120
|
* `view.setBottomTab`: one verb per surface, and the dock's own strip is how a human picks between
|
|
120
121
|
* them. That is also why the filter here is by DOCK and not merely by `rail`, and why Problems
|
|
121
122
|
* leaving the rail removed `panel.focus.problems` rather than demoting it to a chordless row.
|