@jxsuite/studio 5.5.0 → 5.7.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/LICENSE +1 -1
- package/dist/chunks/{2020-g8mwpbkq.js → 2020-cs2sb9t1.js} +3 -3
- package/dist/chunks/adapter-y5gdq19c.js +4 -0
- package/dist/chunks/cf-account-picker-882a7ecm.js +4 -0
- package/dist/chunks/cf-settings-20dznc3j.js +4 -0
- package/dist/chunks/components-q037dya7.js +4 -0
- package/dist/chunks/content-source-37x3vsap.js +4 -0
- package/dist/chunks/convert-to-repeater-grfep2w8.js +4 -0
- package/dist/chunks/editor-j5sq149q.js +4 -0
- package/dist/chunks/entry-commands-c5h3nqck.js +4 -0
- package/dist/chunks/extension-sections-dp8endhx.js +4 -0
- package/dist/chunks/file-ops-937cvqk6.js +4 -0
- package/dist/chunks/files-tznwe1p1.js +4 -0
- package/dist/chunks/format-host-e2pjvd25.js +4 -0
- package/dist/chunks/fs-events-fv64ak3s.js +4 -0
- package/dist/chunks/git-panel-gb713ttc.js +4 -0
- package/dist/chunks/grid-view-5amhg604.js +51 -0
- package/dist/chunks/grid-view-5mqv1cbd.css +1 -0
- package/dist/chunks/iframe-host-t819mcg5.js +4 -0
- package/dist/chunks/{index-arg188jq.js → index-9ydfe04y.js} +3 -3
- package/dist/chunks/index-m0x5ztax.js +4 -0
- package/dist/chunks/{javascript-zcdmye2k.js → javascript-d9pqgc2p.js} +2 -2
- package/dist/chunks/{jsonMode-6x5e1nbf.js → jsonMode-800yvbem.js} +5 -5
- package/dist/chunks/jx-validate-zc9zp77s.js +4 -0
- package/dist/chunks/layers-4bsr82wz.js +4 -0
- package/dist/chunks/layers-panel-b6shnaax.js +4 -0
- package/dist/chunks/lit-html-cfn61dn7.js +4 -0
- package/dist/chunks/media-picker-ej0kdh1j.js +4 -0
- package/dist/chunks/menu-rtxf9chb.js +4 -0
- package/dist/chunks/{monaco-binding-4az2kh5p.js → monaco-binding-62dtmgbf.js} +3 -3
- package/dist/chunks/monaco-buffer-nn4dtx27.js +4 -0
- package/dist/chunks/{monaco-setup-d7mwkcx3.js → monaco-setup-tj13ndtm.js} +3 -3
- package/dist/chunks/notify-ahs57a2z.js +4 -0
- package/dist/chunks/platform-v9xyfkbx.js +4 -0
- package/dist/chunks/publish-panel-bq36xcmj.js +4 -0
- package/dist/chunks/quick-search-zm00h9dh.js +4 -0
- package/dist/chunks/references-99ws0b0m.js +4 -0
- package/dist/chunks/right-panel-pq2f71q3.js +4 -0
- package/dist/chunks/section-registry-b2yzp9sw.js +4 -0
- package/dist/chunks/studio-01kbbqg3.js +928 -0
- package/dist/chunks/{studio-hf4qdjc8.js → studio-01qza1n3.js} +4 -4
- package/dist/chunks/{studio-pkkw32j0.js → studio-03wwfvyt.js} +4 -4
- package/dist/chunks/{studio-7gqyhjns.js → studio-0bbxhhce.js} +4 -4
- package/dist/chunks/studio-0k9mvpgj.js +14 -0
- package/dist/chunks/studio-0scebvb9.js +6 -0
- package/dist/chunks/studio-1a99w39s.js +5 -0
- package/dist/chunks/studio-1wvfxkyy.js +5 -0
- package/dist/chunks/studio-1x8x26k3.js +5 -0
- package/dist/chunks/studio-222rqyyc.js +5 -0
- package/dist/chunks/studio-4xppwncr.js +4 -0
- package/dist/chunks/{studio-xcng8nx7.js → studio-54g077x3.js} +5 -5
- package/dist/chunks/studio-56z7evx4.js +10 -0
- package/dist/chunks/studio-5e9zsamh.js +9 -0
- package/dist/chunks/studio-65fhspdd.js +5 -0
- package/dist/chunks/studio-693nhyky.js +5 -0
- package/dist/chunks/{studio-7jazdy6y.js → studio-7pgy3xaf.js} +4 -4
- package/dist/chunks/studio-888knnkc.js +5 -0
- package/dist/chunks/studio-9mqfamps.js +5 -0
- package/dist/chunks/studio-a7xqhc3n.js +5 -0
- package/dist/chunks/studio-aje966s9.js +5 -0
- package/dist/chunks/studio-aqmph6k4.js +5 -0
- package/dist/chunks/studio-c6w3tq7t.js +5 -0
- package/dist/chunks/{studio-6j2jn55a.js → studio-c6zdm25z.js} +8 -8
- package/dist/chunks/{studio-f8jyp45j.js → studio-c9d3pxf7.js} +4 -4
- package/dist/chunks/studio-ceb34dxj.js +5 -0
- package/dist/chunks/studio-cvbkkfqb.js +5 -0
- package/dist/chunks/studio-cxt150pj.js +7 -0
- package/dist/chunks/studio-dkn3x3hz.js +5 -0
- package/dist/chunks/studio-e6re3rk1.js +5 -0
- package/dist/chunks/{studio-5n1km79v.js → studio-edbtvcd1.js} +4 -4
- package/dist/chunks/{studio-xc8ebsts.js → studio-eh0rac07.js} +4 -4
- package/dist/chunks/{studio-625ezz59.js → studio-evwgp1ym.js} +4 -4
- package/dist/chunks/{studio-he2fhrgp.js → studio-f195h2hq.js} +4 -4
- package/dist/chunks/studio-fqq890ap.js +4 -0
- package/dist/chunks/studio-frb0qbf7.js +6 -0
- package/dist/chunks/studio-gfn1kpxj.js +6 -0
- package/dist/chunks/studio-gh97gngt.js +5 -0
- package/dist/chunks/{studio-awqghqxv.js → studio-gp02nqnw.js} +4 -4
- package/dist/chunks/{studio-x9sagq2d.js → studio-hjbg8d5y.js} +7 -7
- package/dist/chunks/studio-j6gnhvaa.js +5 -0
- package/dist/chunks/studio-mwxgyn9h.js +7 -0
- package/dist/chunks/{studio-x5esgzct.js → studio-n78gjfy8.js} +4 -4
- package/dist/chunks/studio-nbxqcgvf.js +5 -0
- package/dist/chunks/{studio-p1eggxcf.js → studio-nt06yybj.js} +4 -4
- package/dist/chunks/{studio-hc9q4j24.js → studio-p7c1agz0.js} +5 -5
- package/dist/chunks/{studio-8r4y2x0z.js → studio-pwqfmt4p.js} +4 -4
- package/dist/chunks/{studio-5wfrgee9.js → studio-r3kaka4d.js} +4 -4
- package/dist/chunks/studio-semd1s8s.js +5 -0
- package/dist/chunks/studio-skzanb0k.js +5 -0
- package/dist/chunks/studio-spf2skgc.js +5 -0
- package/dist/chunks/{studio-b4epb26c.js → studio-st75kn99.js} +7 -7
- package/dist/chunks/{studio-eq27rrr0.js → studio-sxc0zvpt.js} +3 -3
- package/dist/chunks/studio-t1eedsyx.js +4 -0
- package/dist/chunks/{studio-73czgk6a.js → studio-tp642n5g.js} +4 -4
- package/dist/chunks/studio-tw7rre6s.js +5 -0
- package/dist/chunks/{studio-7by9a93k.js → studio-tzegmy4w.js} +4 -4
- package/dist/chunks/studio-vavmwshr.js +5 -0
- package/dist/chunks/studio-wma2c6g8.js +5 -0
- package/dist/chunks/studio-x92tgnee.js +64 -0
- package/dist/chunks/studio-xk0z6msk.js +5 -0
- package/dist/chunks/{studio-c4pnt1c6.js → studio-xry7tk3z.js} +5 -5
- package/dist/chunks/studio-xta2vxp6.js +9 -0
- package/dist/chunks/{studio-21enxdr8.js → studio-xy3tv3az.js} +4 -4
- package/dist/chunks/studio-y7jehjrp.js +5 -0
- package/dist/chunks/{studio-k1eaqyzm.js → studio-yr04mv2j.js} +4 -4
- package/dist/chunks/{studio-mhhc9btt.js → studio-zd4kayn2.js} +4 -4
- package/dist/chunks/studio-zpnk016a.js +16 -0
- package/dist/chunks/{tsMode-rtwt7w1a.js → tsMode-k9s9fcag.js} +5 -5
- package/dist/chunks/workspace-b69mgm0e.js +4 -0
- package/dist/chunks/ws-client-0ja08haa.js +4 -0
- package/dist/iframe-entry.js +14 -14
- package/dist/manifest.json +62 -59
- package/dist/studio.css +1 -1
- package/dist/studio.js +121 -123
- package/package.json +5 -5
- package/src/account/action-flow.ts +294 -0
- package/src/account/action-required.ts +68 -0
- package/src/account-status.ts +29 -1
- package/src/browse/library-model.ts +3 -1
- package/src/browse/library-preview.ts +6 -2
- package/src/canvas/asset-refs.ts +3 -1
- package/src/canvas/asset-resolve.ts +79 -1
- package/src/canvas/iframe-entry.ts +38 -1
- package/src/canvas/iframe-host.ts +85 -0
- package/src/canvas/iframe-protocol.ts +13 -0
- package/src/canvas/stage-scrollbar.ts +7 -7
- package/src/files/asset-versions.ts +294 -0
- package/src/files/file-ops.ts +5 -8
- package/src/files/files.ts +61 -9
- package/src/files/fs-events.ts +279 -28
- package/src/files/media-meta.ts +2 -1
- package/src/files/media-paths.ts +5 -2
- package/src/files/media-upload.ts +5 -1
- package/src/new-project/add-repo-modal.ts +12 -1
- package/src/new-project/new-project-modal.ts +12 -1
- package/src/panels/git-panel.ts +25 -2
- package/src/panels/jump-bar.ts +132 -158
- package/src/panels/pane-context.ts +8 -8
- package/src/panels/pane-grid.ts +18 -26
- package/src/panels/style-panel.ts +2 -2
- package/src/platform-errors.ts +61 -1
- package/src/platforms/cloud.ts +389 -50
- package/src/platforms/devserver.ts +17 -1
- package/src/publish/pages-service.ts +17 -7
- package/src/services/ai-models.ts +30 -6
- package/src/services/ai-system-prompt.ts +81 -51
- package/src/services/context-manager.ts +41 -70
- package/src/services/document-assistant.ts +12 -3
- package/src/services/harness/chat-reducer.ts +115 -0
- package/src/services/harness/turn-hooks.ts +50 -0
- package/src/services/tool-executor.ts +69 -288
- package/src/services/tool-outcomes.ts +12 -10
- package/src/settings/preferences-accounts.ts +42 -3
- package/src/settings/preferences-dialog.ts +8 -1
- package/src/studio.ts +20 -6
- package/src/surfaces/block-action-bar.json +6 -1
- package/src/surfaces/dialog.ts +5 -0
- package/src/surfaces/jump-bar.json +9 -12
- package/src/surfaces/jump-bar.ts +15 -16
- package/src/surfaces/pane-context.json +2 -2
- package/src/surfaces/pane-grid.json +8 -25
- package/src/surfaces/pane-grid.ts +7 -8
- package/src/surfaces/statusbar.json +71 -3
- package/src/surfaces/statusbar.ts +66 -139
- package/src/surfaces/style-panel.json +3 -3
- package/src/surfaces/style-panel.ts +11 -1
- package/src/surfaces/welcome.json +86 -1
- package/src/surfaces/welcome.ts +61 -2
- package/src/types.ts +84 -2
- package/src/ui/ai-managed-connect.ts +41 -4
- package/src/ui/media-picker.ts +2 -1
- package/dist/chunks/adapter-bsbs78x9.js +0 -4
- package/dist/chunks/cf-account-picker-gnm7xeqb.js +0 -4
- package/dist/chunks/cf-settings-9y6jyscp.js +0 -4
- package/dist/chunks/components-s51h3b7c.js +0 -4
- package/dist/chunks/content-source-ty3be0qg.js +0 -4
- package/dist/chunks/convert-to-repeater-c3e7q61z.js +0 -4
- package/dist/chunks/editor-t002b41m.js +0 -4
- package/dist/chunks/entry-commands-sb72e9gy.js +0 -4
- package/dist/chunks/extension-sections-ktn2ntnj.js +0 -4
- package/dist/chunks/file-ops-78zeytkm.js +0 -4
- package/dist/chunks/files-gatzrz8v.js +0 -4
- package/dist/chunks/format-host-r59b1651.js +0 -4
- package/dist/chunks/fs-events-f8h91ndt.js +0 -4
- package/dist/chunks/git-panel-y12zf7nj.js +0 -4
- package/dist/chunks/grid-view-rfd8b2pg.js +0 -51
- package/dist/chunks/grid-view-tafenfm2.css +0 -1
- package/dist/chunks/iframe-host-vsrsj20g.js +0 -4
- package/dist/chunks/index-5aghyrfh.js +0 -4
- package/dist/chunks/jx-validate-653krkrf.js +0 -4
- package/dist/chunks/layers-32p8gtae.js +0 -4
- package/dist/chunks/layers-panel-rs58m105.js +0 -4
- package/dist/chunks/lit-html-54bmkwz3.js +0 -4
- package/dist/chunks/media-picker-5bb04wct.js +0 -4
- package/dist/chunks/menu-cbha7w2e.js +0 -4
- package/dist/chunks/monaco-buffer-9vbbyfr1.js +0 -4
- package/dist/chunks/notify-dc1nz5ar.js +0 -4
- package/dist/chunks/platform-2m49s1zf.js +0 -4
- package/dist/chunks/publish-panel-nx3ycmma.js +0 -4
- package/dist/chunks/quick-search-yzrzh9x3.js +0 -4
- package/dist/chunks/references-vx7mbj9f.js +0 -4
- package/dist/chunks/right-panel-7jzpbxja.js +0 -4
- package/dist/chunks/section-registry-gjryse41.js +0 -4
- package/dist/chunks/studio-3znfhcxg.js +0 -5
- package/dist/chunks/studio-58qam27v.js +0 -4
- package/dist/chunks/studio-6j59fwaw.js +0 -5
- package/dist/chunks/studio-7z69g1gx.js +0 -5
- package/dist/chunks/studio-93j3v6zx.js +0 -5
- package/dist/chunks/studio-9gf6v8zy.js +0 -5
- package/dist/chunks/studio-9rhmettf.js +0 -4
- package/dist/chunks/studio-ac5aq677.js +0 -10
- package/dist/chunks/studio-as65vbns.js +0 -5
- package/dist/chunks/studio-bkv0sga4.js +0 -6
- package/dist/chunks/studio-bttmqef4.js +0 -5
- package/dist/chunks/studio-c3y9d41k.js +0 -5
- package/dist/chunks/studio-ccegp7gz.js +0 -9
- package/dist/chunks/studio-chxabn98.js +0 -6
- package/dist/chunks/studio-cktcdsxz.js +0 -16
- package/dist/chunks/studio-cnspfke5.js +0 -5
- package/dist/chunks/studio-de3p1ktm.js +0 -5
- package/dist/chunks/studio-fsbcn530.js +0 -928
- package/dist/chunks/studio-gftga7a3.js +0 -64
- package/dist/chunks/studio-hf1rpcq0.js +0 -4
- package/dist/chunks/studio-hz02hq70.js +0 -5
- package/dist/chunks/studio-jnb285we.js +0 -5
- package/dist/chunks/studio-jsv3s3s1.js +0 -5
- package/dist/chunks/studio-ks7cksh0.js +0 -5
- package/dist/chunks/studio-nptx0dbs.js +0 -5
- package/dist/chunks/studio-pg0z7k98.js +0 -5
- package/dist/chunks/studio-pve0b2f2.js +0 -5
- package/dist/chunks/studio-q7zmjv3b.js +0 -6
- package/dist/chunks/studio-rpmvw7kj.js +0 -5
- package/dist/chunks/studio-rwhss52s.js +0 -5
- package/dist/chunks/studio-sbg3g3h0.js +0 -5
- package/dist/chunks/studio-sq1bn60g.js +0 -14
- package/dist/chunks/studio-vwz7rma2.js +0 -5
- package/dist/chunks/studio-wa55e8gf.js +0 -5
- package/dist/chunks/studio-x0mzdha2.js +0 -5
- package/dist/chunks/studio-xrgpakvc.js +0 -9
- package/dist/chunks/studio-xt3djk1w.js +0 -7
- package/dist/chunks/studio-yh3nggx1.js +0 -7
- package/dist/chunks/studio-zmecp6hq.js +0 -5
- package/dist/chunks/workspace-g6dvaete.js +0 -4
- package/dist/chunks/ws-client-shf41j5p.js +0 -4
package/src/types.ts
CHANGED
|
@@ -14,6 +14,7 @@ import type {
|
|
|
14
14
|
import type {
|
|
15
15
|
AppInfo,
|
|
16
16
|
AssetCapabilities,
|
|
17
|
+
OfferedAction,
|
|
17
18
|
CfAccountSummary,
|
|
18
19
|
CfConnection,
|
|
19
20
|
CfConnectOutcome,
|
|
@@ -57,6 +58,8 @@ export type {
|
|
|
57
58
|
AiModelInfo,
|
|
58
59
|
AiModelsResponse,
|
|
59
60
|
AppInfo,
|
|
61
|
+
OfferedAction,
|
|
62
|
+
RetryHint,
|
|
60
63
|
CfAccountSummary,
|
|
61
64
|
CfConnection,
|
|
62
65
|
CfConnectOutcome,
|
|
@@ -122,8 +125,58 @@ export interface AccountStatus {
|
|
|
122
125
|
installations: { id: number; account: string | null; manageUrl?: string }[];
|
|
123
126
|
/** Where to install the App (github.com/apps/<slug>/installations/new), when known. */
|
|
124
127
|
appInstallUrl?: string;
|
|
128
|
+
/** Rows the platform adds to Preferences › Accounts (desktop.md §10.4). Absent: none. */
|
|
129
|
+
entries?: AccountEntry[];
|
|
130
|
+
/** Things the platform wants said: Start-pane banners and one-time toasts. Absent: none. */
|
|
131
|
+
notices?: AccountNotice[];
|
|
125
132
|
}
|
|
126
133
|
|
|
134
|
+
/**
|
|
135
|
+
* A row the platform adds to Preferences › Accounts. Every word is the platform's; Studio draws it
|
|
136
|
+
* after its own credential rows and runs its actions through `performAction`.
|
|
137
|
+
*/
|
|
138
|
+
export interface AccountEntry {
|
|
139
|
+
/** Stable — the row's `data-account`, prefixed so it can never collide with Studio's own. */
|
|
140
|
+
id: string;
|
|
141
|
+
/** What the row is about. */
|
|
142
|
+
label: string;
|
|
143
|
+
/** One sentence: where the user stands, and the next move when there is one. */
|
|
144
|
+
detail: string;
|
|
145
|
+
/** Whether the row reads as active. */
|
|
146
|
+
connected?: boolean;
|
|
147
|
+
/** What the user can do from the row. */
|
|
148
|
+
actions?: OfferedAction[];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Something the platform wants said that no request asked about (desktop.md §10.4). A `banner` is
|
|
153
|
+
* drawn on the Start pane while the platform keeps sending it; a `toast` is shown once — which is
|
|
154
|
+
* how a platform announces how an action that left the page ended.
|
|
155
|
+
*/
|
|
156
|
+
export interface AccountNotice {
|
|
157
|
+
id: string;
|
|
158
|
+
title: string;
|
|
159
|
+
message: string;
|
|
160
|
+
level?: "info" | "warning";
|
|
161
|
+
display?: "banner" | "toast";
|
|
162
|
+
actions?: OfferedAction[];
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* How {@link StudioPlatform.performAction} ended.
|
|
167
|
+
*
|
|
168
|
+
* - `done` — the platform says the action completed.
|
|
169
|
+
* - `redirect` — no window could be opened, so the whole page is navigating to the action. The caller
|
|
170
|
+
* must draw nothing more: the document is on its way out.
|
|
171
|
+
* - `canceled` — the user closed the action's window having said so.
|
|
172
|
+
* - `unknown` — the window closed, or the wait ran out, without anything being said.
|
|
173
|
+
*/
|
|
174
|
+
export type ActionOutcome =
|
|
175
|
+
| { status: "done" }
|
|
176
|
+
| { status: "redirect" }
|
|
177
|
+
| { status: "canceled" }
|
|
178
|
+
| { status: "unknown" };
|
|
179
|
+
|
|
127
180
|
/** A repository visible to `StudioPlatform.listRepos` (the add-existing-repository picker). */
|
|
128
181
|
export interface RepoInfo {
|
|
129
182
|
owner: string;
|
|
@@ -204,6 +257,13 @@ export interface SitePreviewResult extends SiteBuildResult {
|
|
|
204
257
|
reused?: boolean;
|
|
205
258
|
}
|
|
206
259
|
|
|
260
|
+
/**
|
|
261
|
+
* Why a file-event transport asks Studio to re-read rather than trust its event stream (see
|
|
262
|
+
* `StudioPlatform.subscribeFileEvents`). Studio-side only: no wire message carries this union, so
|
|
263
|
+
* `FsEvent` itself is unchanged.
|
|
264
|
+
*/
|
|
265
|
+
export type FsResyncReason = "reconnect" | "commit" | "open";
|
|
266
|
+
|
|
207
267
|
export interface StudioPlatform {
|
|
208
268
|
id: string;
|
|
209
269
|
projectRoot: string;
|
|
@@ -361,8 +421,21 @@ export interface StudioPlatform {
|
|
|
361
421
|
/**
|
|
362
422
|
* Subscribe to backend filesystem change events for the active project. Returns an unsubscribe
|
|
363
423
|
* function. Optional: platforms without a watcher omit it and the sidebar stays manual-refresh.
|
|
364
|
-
|
|
365
|
-
|
|
424
|
+
*
|
|
425
|
+
* `options.onResync` is how a transport admits that the event stream alone may not describe the
|
|
426
|
+
* tree any more. `"reconnect"`: the stream dropped and came back, so every event in between was
|
|
427
|
+
* lost and Studio must re-read what it has cached. `"commit"`: the backend committed without
|
|
428
|
+
* emitting per-file events, so the listings are re-read but open documents are not. `"open"`: the
|
|
429
|
+
* stream's FIRST open — events sent before it reached nobody, and listings made before it (the
|
|
430
|
+
* project's first ones, raced against the handshake) may already be stale; a transport whose
|
|
431
|
+
* listings carry `DirEntry.version` reports it, so content versions noted before the stream was
|
|
432
|
+
* live are dropped and the loaded listings re-read. A platform whose stream cannot lose events
|
|
433
|
+
* (an in-process watcher) never calls it.
|
|
434
|
+
*/
|
|
435
|
+
subscribeFileEvents?: (
|
|
436
|
+
handler: (events: FsEvent[]) => void,
|
|
437
|
+
options?: { onResync?: (reason: FsResyncReason) => void },
|
|
438
|
+
) => () => void;
|
|
366
439
|
discoverComponents: (dir?: string) => Promise<ComponentMeta[]>;
|
|
367
440
|
addPackage: (name: string) => Promise<unknown>;
|
|
368
441
|
removePackage: (name: string) => Promise<unknown>;
|
|
@@ -639,6 +712,15 @@ export interface StudioPlatform {
|
|
|
639
712
|
* prompt).
|
|
640
713
|
*/
|
|
641
714
|
getAccountStatus?: () => Promise<AccountStatus | null>;
|
|
715
|
+
/**
|
|
716
|
+
* Perform an action the backend offered (desktop.md §10.4) — on an `action-required` refusal, a
|
|
717
|
+
* notice or an account row. The platform decides what it means; for an action with an `href`,
|
|
718
|
+
* that is a window of the platform's own, and the outcome is what the platform heard back.
|
|
719
|
+
*
|
|
720
|
+
* MUST open its window before its first `await`: it is called from a click, and a browser grants
|
|
721
|
+
* a popup only to code still running inside that click.
|
|
722
|
+
*/
|
|
723
|
+
performAction?: (action: OfferedAction) => Promise<ActionOutcome | null>;
|
|
642
724
|
/**
|
|
643
725
|
* Browse every repository the platform's account link can reach — personal and organization repos
|
|
644
726
|
* covered by a GitHub App installation on cloud. Backs the "Add Existing Repository" picker;
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
* State is per-instance (closure-scoped) like the credentials form; the capability probe behind
|
|
20
20
|
* `ensureProbe` is shared module-wide by services/ai-models.ts.
|
|
21
21
|
*
|
|
22
|
-
* @docs studio/ai
|
|
23
22
|
* @license MIT
|
|
23
|
+
* @docs studio/ai
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
26
|
import { getPlatform, hasPlatform } from "../platform";
|
|
@@ -30,8 +30,10 @@ import {
|
|
|
30
30
|
isManagedProxy,
|
|
31
31
|
isProxyConfigured,
|
|
32
32
|
proxyStateCode,
|
|
33
|
+
proxyActionOffer,
|
|
33
34
|
resetModelCache,
|
|
34
35
|
} from "../services/ai-models";
|
|
36
|
+
import { canPerformActions, leadingActions, promptAction } from "../account/action-flow";
|
|
35
37
|
import { createManagedConnectSurface } from "../surfaces/ai-managed-connect";
|
|
36
38
|
import type { ManagedConnectSurface, ManagedConnectView } from "../surfaces/ai-managed-connect";
|
|
37
39
|
import type { CfConnectOutcome } from "../types";
|
|
@@ -99,6 +101,12 @@ export function createManagedConnect(opts: ManagedConnectOptions): ManagedConnec
|
|
|
99
101
|
* round trip.
|
|
100
102
|
*/
|
|
101
103
|
function canOffer(): boolean {
|
|
104
|
+
/* A backend that asks for an action first is offered on any platform that can perform one,
|
|
105
|
+
whether or not it can broker Cloudflare: no connection fixes it, so the connect member is
|
|
106
|
+
beside the point. An offer with nothing in it is no offer. */
|
|
107
|
+
if (needsAction()) {
|
|
108
|
+
return canPerformActions() && Boolean(proxyActionOffer()?.actions.length);
|
|
109
|
+
}
|
|
102
110
|
if (!isManagedProxy() || !hasPlatform() || !getPlatform().cfConnect) {
|
|
103
111
|
return false;
|
|
104
112
|
}
|
|
@@ -112,6 +120,21 @@ export function createManagedConnect(opts: ManagedConnectOptions): ManagedConnec
|
|
|
112
120
|
*/
|
|
113
121
|
const needsAccount = () => proxyStateCode() === "cf_account_required";
|
|
114
122
|
|
|
123
|
+
/**
|
|
124
|
+
* The backend requires something of the user before the assistant runs (ai.md §2.1) — a state no
|
|
125
|
+
* Cloudflare round trip changes, so the button offers what the backend offers instead.
|
|
126
|
+
*/
|
|
127
|
+
const needsAction = () => proxyStateCode() === "action_required";
|
|
128
|
+
|
|
129
|
+
/** Offer the backend's actions, and re-probe once one is done: the gate opens on its new answer. */
|
|
130
|
+
async function act(): Promise<void> {
|
|
131
|
+
const offer = proxyActionOffer();
|
|
132
|
+
if (offer && (await promptAction(offer))) {
|
|
133
|
+
resetModelCache();
|
|
134
|
+
await fetchAvailableModels({ force: true });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
115
138
|
/**
|
|
116
139
|
* Re-probe after the connection changed, and CHECK the answer, because a change the backend does
|
|
117
140
|
* not honour must not look like one that worked. This is the only place that can tell.
|
|
@@ -194,9 +217,13 @@ export function createManagedConnect(opts: ManagedConnectOptions): ManagedConnec
|
|
|
194
217
|
try {
|
|
195
218
|
/* `cf_account_required` is a grant that already works for authorization and names no
|
|
196
219
|
account; the OAuth flow would land straight back here (ai.md §2.1). */
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
220
|
+
if (needsAction()) {
|
|
221
|
+
await act();
|
|
222
|
+
} else if (needsAccount()) {
|
|
223
|
+
await chooseAccount();
|
|
224
|
+
} else {
|
|
225
|
+
await settle((await getPlatform().cfConnect?.()) ?? null);
|
|
226
|
+
}
|
|
200
227
|
} catch (error) {
|
|
201
228
|
connectError = error instanceof Error ? error.message : String(error);
|
|
202
229
|
}
|
|
@@ -206,6 +233,16 @@ export function createManagedConnect(opts: ManagedConnectOptions): ManagedConnec
|
|
|
206
233
|
|
|
207
234
|
/** What the offer says right now — the whole of what the surface is told. */
|
|
208
235
|
function view(): ManagedConnectView {
|
|
236
|
+
if (needsAction()) {
|
|
237
|
+
const offer = proxyActionOffer();
|
|
238
|
+
const lead = leadingActions(offer?.actions ?? [])?.lead;
|
|
239
|
+
return {
|
|
240
|
+
buttonLabel: busy ? "Waiting…" : (lead?.label ?? "Continue"),
|
|
241
|
+
busy,
|
|
242
|
+
error: connectError,
|
|
243
|
+
intro: offer?.detail ?? "The assistant here needs one more step first.",
|
|
244
|
+
};
|
|
245
|
+
}
|
|
209
246
|
if (needsAccount()) {
|
|
210
247
|
return {
|
|
211
248
|
buttonLabel: busy ? "Choosing…" : "Choose Cloudflare account",
|
package/src/ui/media-picker.ts
CHANGED
|
@@ -47,6 +47,7 @@ import {
|
|
|
47
47
|
seedMediaMeta,
|
|
48
48
|
} from "../files/media-meta";
|
|
49
49
|
import { mediaSiteUrl, previewFileSrc } from "../files/media-paths";
|
|
50
|
+
import { notedListing } from "../files/asset-versions";
|
|
50
51
|
import type { MediaBrowserRow, MediaBrowserSurfaceHandle } from "../surfaces/media-browser";
|
|
51
52
|
import type { MediaFieldHandle, MediaFieldView } from "../surfaces/media-field";
|
|
52
53
|
|
|
@@ -75,7 +76,7 @@ async function collectMedia(
|
|
|
75
76
|
): Promise<MediaEntry[]> {
|
|
76
77
|
const results: MediaEntry[] = [];
|
|
77
78
|
try {
|
|
78
|
-
const entries = await platform.listDirectory(dir);
|
|
79
|
+
const entries = await notedListing(() => platform.listDirectory(dir));
|
|
79
80
|
seedMediaMeta(entries);
|
|
80
81
|
for (const entry of entries) {
|
|
81
82
|
if (entry.type === "directory") {
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{f,et}from"./studio-jsv3s3s1.js";import"./studio-ery42sqr.js";import{v}from"./studio-9rhmettf.js";import"./studio-eq27rrr0.js";import{hn,sn}from"./studio-sq1bn60g.js";import{rt,zt,T,R,Nn,Lt}from"./studio-zmecp6hq.js";import"./studio-xcng8nx7.js";import"./studio-jnb285we.js";import"./studio-7z69g1gx.js";import"./studio-pve0b2f2.js";import{Hh}from"./studio-pg0z7k98.js";var d={$schema:"https://jxsuite.com/schema/v1",$id:"StudioCfAccountPicker",$description:"The Cloudflare account picker: which of the accounts this grant reaches should publishing and the assistant run against. A `jx-dialog`, so the platform owns modality, Escape, focus restoration and the backdrop — which is what retired the `sp-dialog-wrapper` this surface used to open by hand, along with the focus trap and the `aria-modal` slot `showDialog` wrapped around it. There is no confirming button: each row commits itself, because a picker whose answer is one of N rows has N answers rather than one. The adapter (`surfaces/cf-account-picker.ts`) hands in rows that are already strings and booleans — nothing here knows what `cf_account_required` is, which call refused, or whether the list came back empty because the grant reaches nothing or because Cloudflare could not be reached.",tagName:"jx-dialog",$props:{headline:"Choose a Cloudflare account",confirmLabel:"",cancelLabel:"Cancel",size:"sm"},attributes:{part:"cf-accounts"},oncancel:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/closed"},value:[]}]},onclose:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/closed"},value:[]}]},style:{$description:"The picker's own look. Four `.cf-account-picker*` rules in `styles/shell.css` become the parts below and one of them does not come with them: `min-width: 320px` was this surface sizing its own box, and `jx-dialog` is what sizes a dialog now — `sm` is `min(90vw, 24rem)`, which is wider than the 320px it asked for. The row shape came from `.prefs-account`, which the lit template BORROWED from Preferences › Accounts; it is copied here rather than shared, because a class in a stylesheet is a thing two surfaces can drift apart on and `preferences-dialog.ts` still draws its own rows from it. Three token repairs travel with them: `--spectrum-font-size-75` and `--spectrum-font-size-50` resolve only inside `<sp-theme>`, and a document mounted in the dialog layer is outside it, so every one of them would silently have taken its hard-coded fallback.",'& [part="picker"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-4)"},'& [part="intro"], & [part="empty"]':{$description:"The lede and the two absences read as the same secondary line, so they are one rule: the sentence over the list and the sentence drawn instead of it are the same voice.",margin:"0",fontSize:"var(--jx-text-md)",color:"var(--fg-dim)"},'& [part="failure"]':{$description:'A commit the broker refused, said above the list the reader is still looking at. It is not an announcement of the same thing twice: the list survives a refusal, because listing again is not what would fix an account Cloudflare will not accept, so the reason has to sit beside the rows that are still on offer. It is `failure` rather than `error` because every kit field draws a permanent, empty `[part="error"]` of its own, and the kit is light DOM: a rule on that name here would reach any field this dialog ever holds.',margin:"0",fontSize:"var(--jx-text-md)",color:"var(--danger)"},'& [part="fail"]':{$description:"The one state that offers a verb of its own. Retrying is right for a listing that never landed and wrong for a grant that genuinely reaches nothing, so the button lives in this branch rather than under both.",display:"flex",flexDirection:"column",alignItems:"flex-start",gap:"var(--jx-space-3)"},'& [part="list"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-2)"},'& [part="row"]':{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--jx-space-4)",padding:"var(--jx-space-3)",border:"1px solid var(--border)",borderRadius:"var(--radius)"},'& [part="text"]':{$description:"`min-width: 0` lets the column shrink below its content, so the name and id reflow inside the row instead of pushing its own button off the end of it; what lets them reflow is their own `overflow-wrap`. Nothing here ellipsizes. Unlike Preferences › Accounts, the row does not wrap its button onto a line of its own: in an `sm` dialog the arithmetic (a 120px basis, the gap and a 105px button against a 236px row) would wrap every row at rest.",display:"flex",flexDirection:"column",gap:"var(--jx-space-1)",minWidth:"0"},'& [part="name"]':{$description:"`overflow-wrap: anywhere` because Cloudflare names a new account after the email that opened it (`name@example.com's Account`), and an address has no break opportunity in it.",color:"var(--fg)",overflowWrap:"anywhere"},'& [part="detail"]':{$description:"The account id under the name. Two Cloudflare accounts may carry the same name and the id is what is stored, so the row shows both rather than the half a reader would have to guess from. `overflow-wrap: anywhere` because the id is 32 hex digits with no break opportunity: it measured 203px in a 119px column and ran under the row's own button. It reflows rather than ellipsizing, because the id is the half that tells two same-named accounts apart.",fontSize:"var(--jx-text-sm)",color:"var(--fg-dim)",overflowWrap:"anywhere"}},children:[{tagName:"div",attributes:{part:"picker"},children:[{tagName:"p",attributes:{part:"intro"},textContent:"Your Cloudflare login reaches more than one account. Publishing and the assistant both run against the one you pick; you can change it in Preferences › Accounts."},{tagName:"div",attributes:{part:"body-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/listState"},cases:{loading:{tagName:"p",attributes:{part:"empty"},textContent:"Reading your Cloudflare accounts…"},empty:{tagName:"p",attributes:{part:"empty"},textContent:"This Cloudflare login reaches no accounts. Create one at dash.cloudflare.com, then try again."},failed:{tagName:"div",attributes:{part:"fail"},children:[{tagName:"p",attributes:{part:"empty"},textContent:"${state.failureMessage}"},{tagName:"jx-button",attributes:{part:"retry"},$props:{size:"sm"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/retry"},value:[]}]},children:[{tagName:"span",textContent:"Try again"}]}]},listed:{tagName:"div",attributes:{part:"listed",role:"none"},style:{display:"contents"},children:[{tagName:"div",attributes:{part:"failure-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasFailure"},cases:{true:{tagName:"p",attributes:{part:"failure"},textContent:"${state.failure}"}}},{tagName:"div",attributes:{part:"list"},children:[{$prototype:"Array",items:{$ref:"#/state/rows"},key:{$ref:"$map/item/id"},map:{tagName:"div",attributes:{part:"row","data-account":"${$map.item.id}"},children:[{tagName:"div",attributes:{part:"text"},children:[{tagName:"span",attributes:{part:"name"},textContent:"${$map.item.name}"},{tagName:"span",attributes:{part:"detail"},textContent:"${$map.item.id}"}]},{tagName:"jx-button",attributes:{part:"choose"},$props:{size:"sm",variant:"accent",disabled:{$ref:"$map/item/busy"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/choose"},value:[{$ref:"$map/item/id"}]}]},children:[{tagName:"span",textContent:"${$map.item.label}"}]}]}}]}]}}}]}]};T("cf-account-picker",d);function h(t){let a=t.choosing!=="";return{...t,failureMessage:`Cloudflare could not be reached: ${t.failure}`,hasFailure:t.failure!=="",listState:t.loading?"loading":t.accounts.length>0?"listed":t.failure!==""?"failed":"empty",rows:t.accounts.map((o)=>({busy:a,id:o.id,label:t.choosing===o.id?"Selecting…":"Use this account",name:o.name}))}}function p(t){let a=document.createElement("div");a.style.pointerEvents="auto",a.setAttribute(rt,zt("dialog","cf-accounts")),t.layer.append(a);let o=!1,i=()=>{if(o)return;o=!0,t.onClosed()},n=v({...h({accounts:[],choosing:"",failure:"",loading:!0}),choose:(e)=>{t.onChoose(e)},closed:i,retry:()=>{t.onRetry()}}),s=null,l=R("cf-account-picker",n,a).then(async(e)=>{s=e;let r=e.root;if(o)return e.dispose(),r;if(await Nn(r),o)return r;return hn(r),r});return{close(){if(o)return;let e=s?.root;if(e instanceof HTMLElement)sn(e);s?.dispose(),s=null,a.remove(),i()},host:a,ready:l,update(e){Object.assign(n,h({accounts:e.accounts??n.accounts,choosing:e.choosing??n.choosing,failure:e.failure??n.failure,loading:e.loading??n.loading}))}}}function w(){if(!et())return!1;let t=f();return Boolean(t.cfAccounts&&t.cfSelectAccount)}function m(t){return t instanceof Error?t.message:String(t)}function E(){if(!w())return Promise.resolve(null);return new Promise((t)=>{let a=[],o="",i=!1,n=(e)=>{if(i)return;i=!0,c.close(),t(e)};async function s(){c.update({failure:"",loading:!0});let e="";try{a=await f().cfAccounts?.()??[]}catch(r){a=[],e=m(r)}if(i)return;c.update({accounts:a,failure:e,loading:!1})}async function l(e){let r=a.find((u)=>u.id===e);if(!r||o!=="")return;o=e,c.update({choosing:e,failure:""});try{await f().cfSelectAccount?.({id:r.id,name:r.name})}catch(u){if(o="",!i)c.update({choosing:"",failure:m(u)});return}Hh(),n(r)}let c=p({layer:Lt("dialog"),onChoose:(e)=>{l(e)},onClosed:()=>{n(null)},onRetry:()=>{s()}});s()})}export{E as openCfAccountPicker};
|
|
2
|
-
|
|
3
|
-
//# debugId=110EF365CF3119D664756E2164756E21
|
|
4
|
-
//# sourceMappingURL=cf-account-picker-gnm7xeqb.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{Sf,f_,m_,MR,g_}from"./studio-7z69g1gx.js";import"./studio-jnb285we.js";import"./studio-jsv3s3s1.js";import"./studio-9rhmettf.js";export{g_ as clearCfConnection,m_ as getCfAccountId,Sf as getCfToken,MR as setCfAccountId,f_ as setCfToken};
|
|
2
|
-
|
|
3
|
-
//# debugId=131B1B274A1D438A64756E2164756E21
|
|
4
|
-
//# sourceMappingURL=cf-settings-9y6jyscp.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{at,Tl,pC,rm,gc}from"./studio-8r4y2x0z.js";import"./studio-jsv3s3s1.js";export{rm as buildComponentInstance,at as componentRegistry,gc as computeRelativePath,Tl as loadComponentRegistry,pC as noteComponentSaved};
|
|
2
|
-
|
|
3
|
-
//# debugId=0C4E0177AE318DCE64756E2164756E21
|
|
4
|
-
//# sourceMappingURL=components-s51h3b7c.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{cb,Ew,d1,u1,h1,p1}from"./studio-hz02hq70.js";import"./studio-6j59fwaw.js";import"./studio-rwhss52s.js";import"./studio-chxabn98.js";import"./studio-xrgpakvc.js";import"./studio-yh3nggx1.js";import"./studio-c4pnt1c6.js";import"./studio-k1eaqyzm.js";import"./studio-vwz7rma2.js";import"./studio-cktcdsxz.js";import"./studio-8r4y2x0z.js";import"./studio-jnb285we.js";import"./studio-x0mzdha2.js";import"./studio-nptx0dbs.js";import"./studio-ks7cksh0.js";import"./studio-7jazdy6y.js";import"./studio-b4epb26c.js";import"./studio-de3p1ktm.js";import"./studio-jsv3s3s1.js";import"./studio-p1eggxcf.js";import"./studio-zmecp6hq.js";import"./studio-eq27rrr0.js";import"./studio-sq1bn60g.js";import"./studio-ery42sqr.js";import"./studio-9rhmettf.js";export{Ew as collectionDirs,cb as collectionInfo,h1 as createCollectionSource,p1 as createPagesSource,d1 as listCollectionEntryIds,u1 as reloadDraftAwareGrids};
|
|
2
|
-
|
|
3
|
-
//# debugId=C7ECB94F1D4F55FE64756E2164756E21
|
|
4
|
-
//# sourceMappingURL=content-source-ty3be0qg.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{v}from"./studio-9rhmettf.js";import"./studio-7jazdy6y.js";import{Te,q,u}from"./studio-ks7cksh0.js";import"./studio-jsv3s3s1.js";import"./studio-de3p1ktm.js";import"./studio-eq27rrr0.js";import{hn,sn,Im}from"./studio-sq1bn60g.js";import{rt,zt,T,R,Nn,Lt}from"./studio-zmecp6hq.js";import"./studio-ery42sqr.js";import{Aa}from"./studio-bkv0sga4.js";import"./studio-21enxdr8.js";import"./studio-k1wvtp03.js";import"./studio-c4pnt1c6.js";import"./studio-jnb285we.js";import"./studio-cktcdsxz.js";import"./studio-8r4y2x0z.js";import"./studio-vwz7rma2.js";import"./studio-b4epb26c.js";import"./studio-p1eggxcf.js";import"./studio-rpmvw7kj.js";import"./studio-x0mzdha2.js";import"./studio-k1eaqyzm.js";import"./studio-9gf6v8zy.js";import{mb}from"./studio-chxabn98.js";import"./studio-nptx0dbs.js";import{K,ro,ht,_n}from"./studio-73czgk6a.js";var m={$schema:"https://jxsuite.com/schema/v1",$id:"StudioConvertRepeater",$description:'Repeat…: the dialog that turns the selected element into an `$prototype: "Array"` template. One `jx-dialog`, so the platform owns modality, Escape, the backdrop and focus restoration — which is what retired the `sp-dialog-wrapper` this surface used to open through its bare `open` attribute, and the hand-rolled `requestAnimationFrame` focus move that had to follow it. Three questions in one form: which state definition holds the items, and optionally which function filters and which sorts. The name field appears only when the answer to the first is "Create new…", because a definition that already exists needs no name. Nothing here knows what makes a definition an array — `editor/convert-to-repeater.ts` asks the plugin schemas, keeps the refusals and writes the repeater — and it hands over rows that are already strings.',tagName:"jx-dialog",$props:{headline:"Repeat…",confirmLabel:"Create Repeater",cancelLabel:"Cancel",size:"sm"},attributes:{part:"convert-repeater"},onconfirm:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/confirm"},value:[]}]},oncancel:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/closed"},value:[]}]},onclose:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/closed"},value:[]}]},style:{$description:"There is no stylesheet to transcribe: the lit version carried one inline `display:flex;flex-direction:column;gap:12px` on a wrapper div and nothing else, because `sp-field-label` and `sp-dialog-wrapper` drew the rest. Both of those are gone — the label is `jx-field`'s, which actually NAMES the control it wraps rather than sitting beside it, and the box is the dialog's — so the whole of this block is the one gap that separated the rows, said in the kit's scale instead of in the twelve pixels somebody typed.",'& [part="form"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-4)"},'& [part="new-slot"], & [part="functions-slot"], & [part="functions"]':{$description:"A branch host and the pair inside it are structure rather than layout: `display: contents` puts the rows they carry straight into the form's own column, so one gap rule spaces every row whether it is drawn or not.",display:"contents"}},children:[{tagName:"div",attributes:{part:"form"},children:[{tagName:"jx-field",attributes:{part:"source-row"},$props:{span:!0,label:"Items source"},children:[{tagName:"jx-select",attributes:{part:"source"},$props:{size:"sm",options:{$ref:"#/state/sourceOptions"},value:{$ref:"#/state/source"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pickSource"},value:[{$ref:"event#/target/value"}]}]}}]},{tagName:"div",attributes:{part:"new-slot",role:"none"},$switch:{$ref:"#/state/creating"},cases:{true:{tagName:"jx-field",attributes:{part:"new-row"},$props:{span:!0,label:"New definition name",invalid:{$ref:"#/state/invalid"}},children:[{tagName:"jx-textfield",attributes:{part:"new-name"},$props:{size:"sm",placeholder:"myItems",value:{$ref:"#/state/newName"},invalid:{$ref:"#/state/invalid"},error:{$ref:"#/state/error"}},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setName"},value:[{$ref:"event#/target/value"}]}]},onkeydown:{$prototype:"Function",body:[{$switch:{$ref:"event#/key"},cases:{Enter:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/confirm"},value:[]}]}}]}}]}}},{tagName:"div",attributes:{part:"functions-slot",role:"none"},$switch:{$ref:"#/state/hasFunctions"},cases:{true:{tagName:"div",attributes:{part:"functions",role:"none"},children:[{tagName:"jx-field",attributes:{part:"filter-row"},$props:{span:!0,label:"Filter (optional)"},children:[{tagName:"jx-select",attributes:{part:"filter"},$props:{size:"sm",options:{$ref:"#/state/functionOptions"},value:{$ref:"#/state/filter"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pickFilter"},value:[{$ref:"event#/target/value"}]}]}}]},{tagName:"jx-field",attributes:{part:"sort-row"},$props:{span:!0,label:"Sort (optional)"},children:[{tagName:"jx-select",attributes:{part:"sort"},$props:{size:"sm",options:{$ref:"#/state/functionOptions"},value:{$ref:"#/state/sort"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pickSort"},value:[{$ref:"event#/target/value"}]}]}}]}]}}}]}]};T("convert-repeater",m);var d="__new__";function h(r){return{...r,creating:r.source===d,functionOptions:[{label:"None",value:""},...r.functions.map((o)=>({label:o,value:o}))],hasFunctions:r.functions.length>0,invalid:r.error!=="",sourceOptions:[...r.sources.map((o)=>({label:o,value:o})),{label:"Create new…",value:d}]}}function g(r){let o=document.createElement("div");o.style.pointerEvents="auto",o.setAttribute(rt,zt("dialog","convert-repeater")),r.layer.append(o);let l=!1,i=()=>{if(l)return;l=!0,r.onClosed()},e=v({...h(r.view),closed:i,confirm:()=>{r.onConfirm()},pickFilter:(t)=>{e.filter=t,r.onPickFilter(t)},pickSort:(t)=>{e.sort=t,r.onPickSort(t)},pickSource:(t)=>{e.source=t,r.onPickSource(t)},setName:(t)=>{e.newName=t,r.onName(t)}}),s=null,c=()=>{setTimeout(()=>{let t=s?.root;if(l||!(t instanceof HTMLElement))return;let a=t.querySelector('jx-textfield[part="new-name"]');if(a)Im(a,"all")},0)},f=R("convert-repeater",e,o).then(async(t)=>{s=t;let a=t.root;if(l)return t.dispose(),a;if(await Nn(a),l)return a;if(hn(a),e.creating)c();return a});return{close(){let t=s?.root;if(t instanceof HTMLElement)sn(t);s?.dispose(),s=null,o.remove(),i()},host:o,ready:f,update(t){let a=h(t),p=a.creating&&!e.creating,n=a.error!==""&&a.error===e.error;if(Object.assign(e,n?{...a,error:""}:a),n){let y=a.error;queueMicrotask(()=>{e.error=y})}if(p)c()}}}var b=/^[a-zA-Z_$][a-zA-Z0-9_$]*$/;async function J(){let r=u.value,o=Te(r?.session.selection);if(!r||!o||o.length<2)return;if(!K(r.doc.document,o))return;let i=r.doc.document.state||{},e=await C(i);if(!e)return;q(r,(s)=>{let c=s.doc.document;if(e.newDef){if(!c.state)c.state={};c.state[e.newDef.name]={default:[],type:"array"}}let f=ht(o);if(!f)return;let t=_n(o),a=K(c,f);if(!a?.children)return;let p=ro(a)[t],n={$prototype:"Array",items:e.items,map:p};if(e.filter)n.filter=e.filter;if(e.sort)n.sort=e.sort;a.children[t]=n})}async function x(r){let o=Object.entries(r).filter(([,i])=>{let e=i;return e?.type==="array"||Array.isArray(e?.default)||e?.$prototype==="Array"}).map(([i])=>i),l=u.value?.documentPath;for(let[i,e]of Object.entries(r)){let s=e;if(!s?.$prototype||s.$prototype==="Function"||s.$prototype==="Array")continue;if(o.includes(i))continue;if((await mb({...s.$src!=null&&{$src:s.$src},$prototype:s.$prototype},{...l!=null&&{documentPath:l}}))?.returns?.type==="array")o.push(i)}return o}async function C(r){let o=await x(r),l=Object.entries(r).filter(([,i])=>Aa(i)==="function").map(([i])=>i);return new Promise((i)=>{let e={error:"",filter:"",functions:l,newName:"",sort:"",source:o[0]??d,sources:o},s=!1,c=(n)=>{if(s)return;s=!0,p.close(),i(n)},f=(n)=>{e.error=n,p.update(e)},t=()=>({...e.filter&&{filter:{$ref:`#/state/${e.filter}`}},...e.sort&&{sort:{$ref:`#/state/${e.sort}`}}}),a=()=>{if(e.source!==d){c({items:{$ref:`#/state/${e.source}`},...t()});return}let n=e.newName.trim();if(!n){f("Enter a name for the new state definition.");return}if(r[n]){f(`"${n}" already exists.`);return}if(!b.test(n)){f("Invalid identifier name.");return}c({items:{$ref:`#/state/${n}`},...t(),newDef:{name:n}})},p=g({layer:Lt("dialog"),onClosed:()=>c(null),onConfirm:a,onName:(n)=>{e.newName=n,e.error="",p.update(e)},onPickFilter:(n)=>{e.filter=n,p.update(e)},onPickSort:(n)=>{e.sort=n,p.update(e)},onPickSource:(n)=>{e.source=n,e.error="",p.update(e)},view:e})})}export{J as convertToRepeater};
|
|
2
|
-
|
|
3
|
-
//# debugId=C8AEDDE28287879464756E2164756E21
|
|
4
|
-
//# sourceMappingURL=convert-to-repeater-c3e7q61z.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{TR,Mh,LR,IR,RR,cu,$R,DR,Ls,ky,tc,AR,Tn,pe}from"./studio-fsbcn530.js";export{TR as CancellationTokenSource,Mh as Emitter,LR as KeyCode,IR as KeyMod,Ls as MarkerSeverity,ky as MarkerTag,RR as Position,cu as Range,$R as Selection,DR as SelectionDirection,AR as Token,tc as Uri,Tn as editor,pe as languages};
|
|
2
|
-
|
|
3
|
-
//# debugId=1294570D4671C0FB64756E2164756E21
|
|
4
|
-
//# sourceMappingURL=editor-t002b41m.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{fw,e1}from"./studio-3znfhcxg.js";import"./studio-93j3v6zx.js";import"./studio-21enxdr8.js";import"./studio-hz02hq70.js";import"./studio-6j59fwaw.js";import"./studio-rwhss52s.js";import"./studio-chxabn98.js";import"./studio-xrgpakvc.js";import"./studio-yh3nggx1.js";import"./studio-c4pnt1c6.js";import"./studio-k1eaqyzm.js";import"./studio-vwz7rma2.js";import"./studio-cktcdsxz.js";import"./studio-8r4y2x0z.js";import"./studio-jnb285we.js";import"./studio-x0mzdha2.js";import"./studio-nptx0dbs.js";import"./studio-ks7cksh0.js";import"./studio-7jazdy6y.js";import"./studio-b4epb26c.js";import"./studio-de3p1ktm.js";import"./studio-jsv3s3s1.js";import"./studio-p1eggxcf.js";import"./studio-zmecp6hq.js";import"./studio-eq27rrr0.js";import"./studio-sq1bn60g.js";import"./studio-ery42sqr.js";import"./studio-9rhmettf.js";import"./studio-k1wvtp03.js";export{fw as createEntry,e1 as registerContentCommands};
|
|
2
|
-
|
|
3
|
-
//# debugId=616DEB720341987764756E2164756E21
|
|
4
|
-
//# sourceMappingURL=entry-commands-sb72e9gy.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import"./studio-jsv3s3s1.js";import{qt,Id,vp}from"./studio-de3p1ktm.js";import{rs,i1}from"./studio-hf1rpcq0.js";import"./studio-ery42sqr.js";import{v}from"./studio-9rhmettf.js";import"./studio-7jazdy6y.js";import"./studio-ks7cksh0.js";import"./studio-sq1bn60g.js";import"./studio-21enxdr8.js";import"./studio-eq27rrr0.js";import{T,R,Va,Lt}from"./studio-zmecp6hq.js";import"./studio-p1eggxcf.js";import"./studio-k1wvtp03.js";import"./studio-hf4qdjc8.js";import{n1}from"./studio-he2fhrgp.js";import{vw,lE,o1,vE}from"./studio-ac5aq677.js";import"./studio-k1eaqyzm.js";import"./studio-rwhss52s.js";import"./studio-jnb285we.js";import"./studio-cktcdsxz.js";import"./studio-yh3nggx1.js";import"./studio-xrgpakvc.js";import"./studio-c4pnt1c6.js";import"./studio-hz02hq70.js";import"./studio-x0mzdha2.js";import"./studio-6j59fwaw.js";import"./studio-8r4y2x0z.js";import"./studio-vwz7rma2.js";import"./studio-b4epb26c.js";import"./studio-chxabn98.js";import"./studio-nptx0dbs.js";var m={$schema:"https://jxsuite.com/schema/v1",$id:"StudioDataActions",$description:"The actions row a data-domain settings section grows: test a connection, push the schema, open the rows as a grid. It is an ISLAND inside `surfaces/settings-contributed.json` — the generic contributed-section renderer stays extension-agnostic and draws an empty host, and `panels/data-grid.ts` mounts this into it — which is the seam that lets the data surface contribute verbs without the settings machinery learning what a connection is.",tagName:"div",attributes:{part:"data-actions"},style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"var(--jx-space-2)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",'& [part="result"]':{fontSize:"var(--jx-text-sm)",color:"var(--fg-dim)"},'& [part="result"][data-ok="false"]':{color:"var(--danger)"},'& [part="result"][data-ok="true"]':{color:"var(--success, var(--accent))"}},children:[{tagName:"span",attributes:{part:"test-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/testState"},cases:{shown:{tagName:"jx-button",attributes:{part:"test"},$props:{variant:"secondary",size:"sm",disabled:{$ref:"#/state/testDisabled"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/test"},value:[]}]},children:[{tagName:"span",textContent:"${state.testLabel}"}]}}},{tagName:"jx-button",attributes:{part:"push"},$props:{variant:"secondary",size:"sm"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/push"},value:[]}]},children:[{tagName:"span",textContent:"Push Schema"}]},{tagName:"jx-button",attributes:{part:"grid"},$props:{variant:"secondary",size:"sm"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openGrid"},value:[]}]},children:[{tagName:"span",textContent:"Open Data Grid"}]},{tagName:"span",attributes:{part:"result-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/resultState"},cases:{shown:{$description:"The last test's verdict, and a live region because it arrives after the press that asked for it.",tagName:"span",attributes:{part:"result",role:"status","data-ok":"${state.resultOk}",title:"${state.resultTitle}"},textContent:"${state.resultText}"}}}]};T("data-actions",m);function f(t,n){t.testState=n.testState,t.testLabel=n.testLabel,t.testDisabled=n.testDisabled,t.resultState=n.resultState,t.resultOk=n.resultOk,t.resultText=n.resultText,t.resultTitle=n.resultTitle}function h(t,n,e){let a=v({openGrid:e.openGrid,push:e.push,resultOk:"false",resultState:"hidden",resultText:"",resultTitle:"",test:e.test,testDisabled:!1,testLabel:"Test Connection",testState:"hidden"});f(a,n);let s=null,i=!1,o=R("data-actions",a,t).then((r)=>{if(i)return r.dispose(),r.root;return s=r,r.root});return{dispose(){i=!0,s?.dispose(),s=null},ready:o,update:(r)=>f(a,r)}}var g={$schema:"https://jxsuite.com/schema/v1",$id:"StudioPushPlan",$description:"What pushing the schema would do, or what it did. The dry run is the whole point of the surface: a push rewrites a live database's shape, so the plan is read before the apply, and the confirm dialog around this document is the one that gates it. The ISLAND of `ui/layers.ts`'s confirm dialog rather than a dialog of its own (studio-ui-guidelines.md §12.5).",tagName:"div",attributes:{part:"plan"},style:{display:"flex",flexDirection:"column",gap:"var(--jx-space-2)",minWidth:"0",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",color:"var(--fg)",'& [part="steps"]':{margin:"0",padding:"0",listStyle:"none",display:"flex",flexDirection:"column",gap:"2px",maxHeight:"40vh",overflowY:"auto"},'& [part="step"]':{fontFamily:"var(--font-mono)",fontSize:"var(--jx-text-sm)",padding:"2px var(--jx-space-2)",borderLeft:"2px solid var(--border)"},'& [part="step"][data-kind="drop"]':{borderLeftColor:"var(--danger)"},'& [part="step"][data-kind="create"]':{borderLeftColor:"var(--success, var(--accent))"},'& [part="warning"]':{margin:"0",fontSize:"var(--jx-text-sm)",color:"var(--warning, var(--fg-dim))"},'& [part="failure"]':{$description:'`failure` rather than `error`: every kit field draws a permanent, empty `[part="error"]` of its own, and the kit is light DOM, so a rule on that name here would reach any field the plan ever holds.',margin:"0",fontSize:"var(--jx-text-sm)",color:"var(--danger)"}},children:[{tagName:"ul",attributes:{part:"steps"},children:[{$prototype:"Array",items:{$ref:"#/state/steps"},key:{$ref:"$map/item/key"},map:{tagName:"li",attributes:{part:"step","data-kind":"${$map.item.kind}"},textContent:"${$map.item.summary}"}}]},{$prototype:"Array",items:{$ref:"#/state/warnings"},key:{$ref:"$map/item/key"},map:{tagName:"p",attributes:{part:"warning"},textContent:"${$map.item.text}"}},{$prototype:"Array",items:{$ref:"#/state/errors"},key:{$ref:"$map/item/key"},map:{tagName:"p",attributes:{part:"failure",role:"alert"},textContent:"${$map.item.text}"}}]};T("push-plan",g);function y(t,n){let e=v({errors:n.errors,steps:n.steps,warnings:n.warnings}),a=null,s=!1,i=R("push-plan",e,t).then((o)=>{if(s)return o.dispose(),o.root;return a=o,o.root});return{dispose(){s=!0,a?.dispose(),a=null},ready:i,update(o){e.steps=o.steps,e.warnings=o.warnings,e.errors=o.errors}}}var l=null;function S(){let t=l;l=null,t?.plan?.dispose(),t?.handle.close()}function x(t,n){return t.map((e,a)=>({key:`${n}:${a}`,text:e}))}function w(t){let n=t.phase==="done"?t.result:t.dryRun;return{errors:x(n?.errors??[],"error"),steps:(n?.plan??[]).map((e,a)=>({key:`${e.kind}:${a}`,kind:e.kind,summary:e.summary})),warnings:x(n?.warnings??[],"warning")}}function C(t){if(t.phase==="loading")return"Compiling plan…";if(t.phase==="applying")return"Applying…";if(t.phase==="done")return t.result?.applied?"Schema applied.":"Push failed.";let n=t.dryRun?.plan.length??0,e=t.dryRun?.errors?.length??0;return n===0&&e===0?"Nothing to push — the schema is up to date.":""}function d(){let t=l;if(!t)return;let n=t.phase==="confirm"&&(t.dryRun?.plan.length??0)>0;t.handle.update({cancelLabel:t.phase==="done"?"Close":"Cancel",confirmLabel:n?"Apply":"",message:C(t)}),t.plan?.update(w(t))}async function H(t,n){if(l)return;let e={connection:t,dryRun:null,handle:null,onDone:n,phase:"loading",plan:null,result:null};e.handle=Va({cancelLabel:"Cancel",confirmLabel:"",headline:t?`Push Schema — ${t}`:"Push Schema",island:(s)=>{e.plan=y(s,w(e))},layer:Lt("dialog"),message:"Compiling plan…",onCancel:S,onClosed:()=>{if(l===e)S()},onConfirm:()=>{L()},region:"data/push"}),l=e;let a=await o1({dryRun:!0,...t===void 0?{}:{connection:t}});if(l!==e)return;e.dryRun=a,e.phase="confirm",d()}async function L(){let t=l;if(!t)return;t.phase="applying",d();let n=await o1(t.connection===void 0?{}:{connection:t.connection});if(l!==t)return;t.result=n,t.phase="done",d(),t.onDone()}var u={pushing:!1,testResult:null,testing:null},b=new Map;function P(t,n){let{testResult:e}=u;return{resultOk:e?.ok?"true":"false",resultState:e?"shown":"hidden",resultText:e?`${e.connection}: ${e.ok?"connected":e.error??"failed"}`:"",resultTitle:e?.error??"",testDisabled:!n||u.testing!==null,testLabel:u.testing?"Testing…":"Test Connection",testState:t==="connections"?"shown":"hidden"}}function D(t){if(t!=="connections"&&t!=="data"||!vw())return null;return(n,e)=>N(n,t,e)}async function j(t,n){u.testing=t,u.testResult=null,n();let e=await lE(t);u.testing=null,u.testResult={...e,connection:t},n()}function N(t,n,e){let{rerender:a,selected:s}=e,i=b.get(t);if(i){i.update(P(n,s));return}let o=()=>n==="connections"?e.selected??void 0:void 0;b.set(t,h(t,P(n,s),{openGrid:()=>{vE()},push:()=>{H(o(),a)},test:()=>{let r=e.selected;if(r)j(r,a)}}))}var E=100;function M(t){let e=t.studio?.settings;if(!e)return null;let{key:a}=t.project,s=e.layout??"form",i=t.entrySchema??{},o=s==="map"?typeof i.additionalProperties==="object"?i.additionalProperties:{}:i,r=e.label??t.project.title??a;return{contribution:{entrySchema:o,key:a,settings:{...e.entry===void 0?{}:{entry:e.entry},...e.layout===void 0?{}:{layout:e.layout}},title:r},icon:e.icon,key:a,label:r,order:e.order??E}}var p=new Set,c=null;function ot(){return c??Promise.resolve()}function rt(){return c??=V().finally(()=>{c=null}),c}async function V(){let[t]=await Promise.all([Id(),qt()]),n=new Set;for(let e of t)for(let a of e.contributions){let s=M(a);if(!s)continue;let{contribution:i}=s;rs({icon:s.icon,key:s.key,label:s.label,order:s.order,render:(o)=>{let r=D(s.key);n1(o,i,{formats:vp(),...r===null?{}:{actions:r}})}}),n.add(s.key)}for(let e of p)if(!n.has(e))i1(e);p.clear();for(let e of n)p.add(e)}export{ot as extensionSectionsReady,rt as syncExtensionSettingsSections};
|
|
2
|
-
|
|
3
|
-
//# debugId=77A93E9967A9DC0164756E2164756E21
|
|
4
|
-
//# sourceMappingURL=extension-sections-ktn2ntnj.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{kr,m1,g1,Xh,b1,Uf,qf}from"./studio-6j59fwaw.js";import"./studio-rwhss52s.js";import"./studio-chxabn98.js";import"./studio-xrgpakvc.js";import"./studio-yh3nggx1.js";import"./studio-c4pnt1c6.js";import"./studio-k1eaqyzm.js";import"./studio-vwz7rma2.js";import"./studio-cktcdsxz.js";import"./studio-8r4y2x0z.js";import"./studio-jnb285we.js";import"./studio-x0mzdha2.js";import"./studio-nptx0dbs.js";import"./studio-ks7cksh0.js";import"./studio-7jazdy6y.js";import"./studio-b4epb26c.js";import"./studio-de3p1ktm.js";import"./studio-jsv3s3s1.js";import"./studio-p1eggxcf.js";import"./studio-zmecp6hq.js";import"./studio-eq27rrr0.js";import"./studio-sq1bn60g.js";import"./studio-ery42sqr.js";import"./studio-9rhmettf.js";export{Uf as confirmFileDelete,b1 as exportFile,m1 as parseCollabSource,kr as parseSourceForPath,qf as renamePromptMessage,Xh as saveFile,g1 as setDocumentSavedListener};
|
|
2
|
-
|
|
3
|
-
//# debugId=DBB33F512BE0FC5F64756E2164756E21
|
|
4
|
-
//# sourceMappingURL=file-ops-78zeytkm.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{Lo,O_,M_,P_,nw,Af,F_,j_,iw,qk,kR,Io,ow,H_,Nf,B_}from"./studio-xt3djk1w.js";import"./studio-sbg3g3h0.js";import"./studio-xcng8nx7.js";import"./studio-9gf6v8zy.js";import"./studio-93j3v6zx.js";import"./studio-ac5aq677.js";import"./studio-hz02hq70.js";import"./studio-6j59fwaw.js";import"./studio-rwhss52s.js";import"./studio-chxabn98.js";import"./studio-xrgpakvc.js";import"./studio-yh3nggx1.js";import"./studio-c4pnt1c6.js";import"./studio-k1eaqyzm.js";import"./studio-vwz7rma2.js";import"./studio-cktcdsxz.js";import"./studio-8r4y2x0z.js";import"./studio-jnb285we.js";import"./studio-x0mzdha2.js";import"./studio-nptx0dbs.js";import"./studio-ks7cksh0.js";import"./studio-7jazdy6y.js";import"./studio-b4epb26c.js";import"./studio-de3p1ktm.js";import"./studio-jsv3s3s1.js";import"./studio-p1eggxcf.js";import"./studio-zmecp6hq.js";import"./studio-eq27rrr0.js";import"./studio-sq1bn60g.js";import"./studio-ery42sqr.js";import"./studio-9rhmettf.js";export{iw as createFileIn,nw as findHomePage,P_ as initProjectRepo,Lo as loadDirectory,O_ as loadProject,qk as notifyMoveOutcome,ow as openFileInPane,Io as openFileInTab,Af as openLastSessionOrHome,M_ as openProject,j_ as registerFileTreeDnD,B_ as registerFilesPanel,H_ as reloadCleanTab,Nf as reloadFileInTab,F_ as renderFilesTemplate,kR as settleRename};
|
|
2
|
-
|
|
3
|
-
//# debugId=ABCCF3C7A149DF8D64756E2164756E21
|
|
4
|
-
//# sourceMappingURL=files-gatzrz8v.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{qt,Ld,Id,Cm,fv,za,vp,js,yi,yp,Zt,Wa,Lr,FC,Hs,jC}from"./studio-de3p1ktm.js";import"./studio-jsv3s3s1.js";export{Lr as defaultContentFormat,Wa as documentExtensions,js as formatByExtension,yi as formatByName,Zt as formatForPath,FC as formatParse,Hs as formatSerialize,fv as getExtensionCatalog,Cm as getExtensions,vp as getFormats,Id as loadExtensions,qt as loadFormats,yp as noFormatError,za as refreshExtensionUi,Ld as refreshFormats,jC as splitFormatDocument};
|
|
2
|
-
|
|
3
|
-
//# debugId=80F2AD5B257926B064756E2164756E21
|
|
4
|
-
//# sourceMappingURL=format-host-r59b1651.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{Ds,hc,v1}from"./studio-rwhss52s.js";import"./studio-k1eaqyzm.js";import"./studio-jsv3s3s1.js";import"./studio-ery42sqr.js";export{hc as isRecentLocal,Ds as markLocalMutation,v1 as startFsSync};
|
|
2
|
-
|
|
3
|
-
//# debugId=905B4E2A92C8FBEA64756E2164756E21
|
|
4
|
-
//# sourceMappingURL=fs-events-f8h91ndt.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{ac,W_,cw,dw,V_,U_,q_,Mf,G_}from"./studio-sbg3g3h0.js";import"./studio-xcng8nx7.js";import"./studio-9gf6v8zy.js";import"./studio-xrgpakvc.js";import"./studio-yh3nggx1.js";import"./studio-c4pnt1c6.js";import"./studio-k1eaqyzm.js";import"./studio-vwz7rma2.js";import"./studio-cktcdsxz.js";import"./studio-8r4y2x0z.js";import"./studio-jnb285we.js";import"./studio-x0mzdha2.js";import"./studio-nptx0dbs.js";import"./studio-ks7cksh0.js";import"./studio-7jazdy6y.js";import"./studio-b4epb26c.js";import"./studio-de3p1ktm.js";import"./studio-jsv3s3s1.js";import"./studio-zmecp6hq.js";import"./studio-eq27rrr0.js";import"./studio-sq1bn60g.js";import"./studio-ery42sqr.js";import"./studio-9rhmettf.js";export{Mf as cleanupGitPanel,cw as cloneRepository,V_ as loadDiffForLens,W_ as noteFileSaved,dw as platformSupportsClone,ac as refreshGitStatus,G_ as registerGitPanel,q_ as registerSourceControlCommands,U_ as renderGitPanel};
|
|
2
|
-
|
|
3
|
-
//# debugId=35B802C907979FE664756E2164756E21
|
|
4
|
-
//# sourceMappingURL=git-panel-y12zf7nj.js.map
|