mulmoterminal 4.8.3 → 4.8.5
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/common/firebaseConfig.ts +7 -0
- package/common/sharedAppPreview.ts +145 -0
- package/dist/assets/{abnfDiagram-N423BO3Z-D0pzqjdS-BUEzXU7-.js → abnfDiagram-N423BO3Z-D0pzqjdS-CLMgDPgg.js} +1 -1
- package/dist/assets/architecture-TIHT7OUA-Cqhmai3f-C_dk8ekC.js +1 -0
- package/dist/assets/{architectureDiagram-T3A2C74G-CX-Yoe5G-WO8ZZ5hV.js → architectureDiagram-T3A2C74G-CX-Yoe5G-gJcY4m0S.js} +1 -1
- package/dist/assets/{blockDiagram-VBNYF7ZC-B1eQZQ68-k3zBEumU.js → blockDiagram-VBNYF7ZC-B1eQZQ68-B-UqkxpV.js} +1 -1
- package/dist/assets/{c4Diagram-5PPSVZJV-SBrN9MrU-DJyJmi0Z.js → c4Diagram-5PPSVZJV-SBrN9MrU-CsJDUTjY.js} +1 -1
- package/dist/assets/channel-DKMa7Sn5-kBWLZpi9.js +1 -0
- package/dist/assets/{chunk-2GRJ4B5K-DdkAx9o--CtXZO-EX.js → chunk-2GRJ4B5K-DdkAx9o--DxCBa6Or.js} +1 -1
- package/dist/assets/{chunk-3NCLNEKW-CBztX243-ChFYkHfP.js → chunk-3NCLNEKW-CBztX243-CisAcavI.js} +1 -1
- package/dist/assets/{chunk-4I5QYGJK-CmBJaHzs-Bm62Y3D2.js → chunk-4I5QYGJK-CmBJaHzs-BWzGWcmG.js} +1 -1
- package/dist/assets/{chunk-5RXB4S5H-iaipMW_h-DEVTDwqc.js → chunk-5RXB4S5H-iaipMW_h-BDKMJQSH.js} +1 -1
- package/dist/assets/{chunk-6Q2QTUOP-Cx8nz5_t-BOfQsmdP.js → chunk-6Q2QTUOP-Cx8nz5_t-DutsMg17.js} +1 -1
- package/dist/assets/{chunk-7Z6QIM7H-CZs6l8Md-Do5_5MRy.js → chunk-7Z6QIM7H-CZs6l8Md-DT7lnpSv.js} +1 -1
- package/dist/assets/{chunk-GF5L2VYU-9OEKHEe4-AmDI7rEM.js → chunk-GF5L2VYU-9OEKHEe4-Ds79_5QJ.js} +1 -1
- package/dist/assets/{chunk-I66GZJ75-DSPCVCny-j7cLCRvd.js → chunk-I66GZJ75-DSPCVCny-DJV8P6pl.js} +1 -1
- package/dist/assets/{chunk-J7OUQ5F2-CQoryswr-Cg0dLUo9.js → chunk-J7OUQ5F2-CQoryswr-XR-sAwFE.js} +2 -2
- package/dist/assets/{chunk-JQJVKLGR-6F2ui09L-zzRmhTVI.js → chunk-JQJVKLGR-6F2ui09L-C8zuDJ_V.js} +1 -1
- package/dist/assets/{chunk-KBJHAD2P-DXXCSVOS-BTbG9EBk.js → chunk-KBJHAD2P-DXXCSVOS-Cv-NtF1J.js} +1 -1
- package/dist/assets/{chunk-NSK5VX7P-DQgMj0Kn-C7zBoCQL.js → chunk-NSK5VX7P-DQgMj0Kn-CNqGZRSV.js} +1 -1
- package/dist/assets/{chunk-QR6OTTB3-BQl8P7pD-MEPt0Y91.js → chunk-QR6OTTB3-BQl8P7pD-DyrF3cyZ.js} +1 -1
- package/dist/assets/{chunk-UBXNYLIW-BbdYEvTI-VqdYieFu.js → chunk-UBXNYLIW-BbdYEvTI-DqIpcaCp.js} +1 -1
- package/dist/assets/{chunk-W5SLKNZC-DSJLk1SI-VPw5Pjzg.js → chunk-W5SLKNZC-DSJLk1SI-ZNVcsmzu.js} +1 -1
- package/dist/assets/{chunk-WRU74C26-DOE_TBL8-DHbOuCok.js → chunk-WRU74C26-DOE_TBL8-DrJrPu6s.js} +1 -1
- package/dist/assets/classDiagram-JCYQIIEL-C1ePmEG1-BZFRySrF.js +1 -0
- package/dist/assets/classDiagram-v2-OCEON4UE-C_O3VNBf-BZFRySrF.js +1 -0
- package/dist/assets/cynefin-VYW2F7L2-DvSvuXnG-BakBXo3c.js +1 -0
- package/dist/assets/{cynefinDiagram-MW4NZA55-DuBeESb6-D6_mAjNA.js → cynefinDiagram-MW4NZA55-DuBeESb6-BLtaB9J1.js} +1 -1
- package/dist/assets/{dagre-VZM6K2ZE-W5cB3U70-D7FFnwoM.js → dagre-VZM6K2ZE-W5cB3U70-s5agyARt.js} +1 -1
- package/dist/assets/{diagram-7IWD3JNH-Fk1aWqfX-Bh12UhXU.js → diagram-7IWD3JNH-Fk1aWqfX-CNuziIrz.js} +1 -1
- package/dist/assets/{diagram-B4RE2ZJO-q-8xygfU-C9wxc-GM.js → diagram-B4RE2ZJO-q-8xygfU-HcKNU2mF.js} +1 -1
- package/dist/assets/{diagram-LBJQPF4R-1SKCcOis-CqRHacMO.js → diagram-LBJQPF4R-1SKCcOis-D-W0CMrn.js} +1 -1
- package/dist/assets/{diagram-Q27KOJAE-CtW4StAQ-CYiDyxcF.js → diagram-Q27KOJAE-CtW4StAQ-CHkCjH5a.js} +1 -1
- package/dist/assets/{diagram-UB23O5K3-r5fK-tbF-Bi_FwLPS.js → diagram-UB23O5K3-r5fK-tbF-yTiEBCms.js} +1 -1
- package/dist/assets/{dist-CO4BIKZL.js → dist-B_ZTyg3M.js} +1 -1
- package/dist/assets/{dist-eE3p97ig.js → dist-Co7Nvi-Q.js} +1 -1
- package/dist/assets/{dist-cFsAUX4o.js → dist-DIi1G49s.js} +1 -1
- package/dist/assets/{dist-CqzxGXJS.js → dist-DWEgQbK8.js} +1 -1
- package/dist/assets/{ebnfDiagram-BXEA7PRR-BZoIqTyx-Cd_1jE2t.js → ebnfDiagram-BXEA7PRR-BZoIqTyx-Bb7uEwm9.js} +1 -1
- package/dist/assets/{erDiagram-JOGREHBK-CM8pI2JI-Buk10pBd.js → erDiagram-JOGREHBK-CM8pI2JI-BXuh_jKO.js} +1 -1
- package/dist/assets/eventmodeling-45OFAUF4-jdctDg0T-CT_-cMj2.js +1 -0
- package/dist/assets/flowDiagram-UKHOOZJN-CR3dcoRl-BBoVdO3U.js +1 -0
- package/dist/assets/{ganttDiagram-PKOTCBZU-DYTkxDIh-CqU6YC49.js → ganttDiagram-PKOTCBZU-DYTkxDIh-CbFRCyNe.js} +1 -1
- package/dist/assets/gitGraph-TEB2WS4Q-C4cKwl5j-BSF8CxUO.js +1 -0
- package/dist/assets/{gitGraphDiagram-DS77QQ5N-DafidN4D-w68Vbb_a.js → gitGraphDiagram-DS77QQ5N-DafidN4D-DY-4l_pH.js} +1 -1
- package/dist/assets/index-CL3V4zV8.css +1 -0
- package/dist/assets/index-D7nhSJrm.js +703 -0
- package/dist/assets/info-DKCQHKI2-DPUCBYWS-C7wov2cD.js +1 -0
- package/dist/assets/{infoDiagram-6WML65LV-DxSxsg1o-BsTGEEUd.js → infoDiagram-6WML65LV-DxSxsg1o-BtfKo_Bs.js} +1 -1
- package/dist/assets/{ishikawaDiagram-WSZJBQD7-kAIMMFB5-o1K9iQLz.js → ishikawaDiagram-WSZJBQD7-kAIMMFB5-DVc6lLzP.js} +1 -1
- package/dist/assets/{journeyDiagram-NVQOT4AX-ClybI8XI-ffXeCp87.js → journeyDiagram-NVQOT4AX-ClybI8XI-CxveiGze.js} +1 -1
- package/dist/assets/{kanban-definition-27J2QSJJ-DDYHyW1q-DrGRavO5.js → kanban-definition-27J2QSJJ-DDYHyW1q-DFgKf8MT.js} +1 -1
- package/dist/assets/{lib-B-Uaiffr.js → lib-BbkFas5C.js} +1 -1
- package/dist/assets/{line-CtRAsVKI-BNctooIe.js → line-CtRAsVKI-TfyFQLoF.js} +1 -1
- package/dist/assets/{marp-BOJtZch0.js → marp-CcloGsGx.js} +1 -1
- package/dist/assets/{mermaid-parser.core-C1baW7NG-Bbu-Zwi4.js → mermaid-parser.core-C1baW7NG-CEcX_pqa.js} +2 -2
- package/dist/assets/{mermaid.core-CGR3z-ay-CFg0QiLR.js → mermaid.core-CGR3z-ay-CGM0rhJt.js} +3 -3
- package/dist/assets/{mindmap-definition-FAOFIHXS-DU-wbYKK-CgvK273C.js → mindmap-definition-FAOFIHXS-DU-wbYKK-BeS-VCem.js} +1 -1
- package/dist/assets/packet-7NZHBO7P-CC7His0F-BKZjlLxG.js +1 -0
- package/dist/assets/{pegDiagram-VL7TDLO6-CZuV1UUk-B6YJmD0c.js → pegDiagram-VL7TDLO6-CZuV1UUk-B4RhdVLe.js} +1 -1
- package/dist/assets/pie-RZYD4A2V-CCrcq2sL-CAS76XU6.js +1 -0
- package/dist/assets/{pieDiagram-7S7Q4E2Y-B6cd1CWd-rfzlH8Ma.js → pieDiagram-7S7Q4E2Y-B6cd1CWd-CQNUkARz.js} +1 -1
- package/dist/assets/{quadrantDiagram-CIZ2JOQS-BvGHVjRA-NzM-AzBP.js → quadrantDiagram-CIZ2JOQS-BvGHVjRA-Br3mI6Nv.js} +1 -1
- package/dist/assets/radar-I7S5WNFK-C5TUrpHf-CsdDA7fu.js +1 -0
- package/dist/assets/railroad-3IZDKUUU-CGuuFEd8-DMltSGj6.js +1 -0
- package/dist/assets/railroad-abnf-AHOZXSZD-DuoCSFZY-BACCU32-.js +1 -0
- package/dist/assets/railroad-ebnf-EBAXGLYW-ig-DG9e_-8RqPuM9u.js +1 -0
- package/dist/assets/railroad-peg-LSFZ7HO6-BkBgpyvu-Ci7ZgYVc.js +1 -0
- package/dist/assets/{railroadDiagram-AXF67PYL-DDtBla5s-CfdyAahV.js → railroadDiagram-AXF67PYL-DDtBla5s-DEBX2ZZa.js} +1 -1
- package/dist/assets/{requirementDiagram-LRYGKXZP-DEh2MJlW-uD_TKJdP.js → requirementDiagram-LRYGKXZP-DEh2MJlW-CWz9ZBC9.js} +1 -1
- package/dist/assets/{sankeyDiagram-W5VNT64P-CHkaBx7U-CUzwA-x1.js → sankeyDiagram-W5VNT64P-CHkaBx7U-Cxv19a8X.js} +1 -1
- package/dist/assets/{sequenceDiagram-SI44F4Z6-D8tHDhWP-8SAFRxEZ.js → sequenceDiagram-SI44F4Z6-D8tHDhWP-Bt0r18gE.js} +1 -1
- package/dist/assets/{stateDiagram-OKZ733FA-KNjKsfsT-xMpzFiGU.js → stateDiagram-OKZ733FA-KNjKsfsT-CJexSgXn.js} +1 -1
- package/dist/assets/stateDiagram-v2-UEYNNEHI-B88w7Ous-Bh0Pvd7p.js +1 -0
- package/dist/assets/{swimlanes-SLNWSIFB-D_yJNxBK-CnzP6SsO.js → swimlanes-SLNWSIFB-D_yJNxBK-DVmaqc1F.js} +1 -1
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-DNcZzqTp-DJOsaAgA.js +8 -0
- package/dist/assets/{timeline-definition-Z64GVDOM-BcEcbSq1-C8coL46S.js → timeline-definition-Z64GVDOM-BcEcbSq1-GBEdiOgQ.js} +1 -1
- package/dist/assets/treeView-QDETBFTQ-CqfT0I1z-a31Drpac.js +1 -0
- package/dist/assets/treemap-6X3UGDF4-CiJkiGWo-DCLdFMTQ.js +1 -0
- package/dist/assets/{vennDiagram-T6HMQDX7-CxS3fcVg-E_L5qNHt.js → vennDiagram-T6HMQDX7-CxS3fcVg-BKJz8wFG.js} +1 -1
- package/dist/assets/wardley-OPB4EBWU-D1tuVHAV-DZlxNv5j.js +1 -0
- package/dist/assets/{wardleyDiagram-T6FBY63Y-D_XCiR14-C1PqnnKt.js → wardleyDiagram-T6FBY63Y-D_XCiR14-BUIxKXRD.js} +1 -1
- package/dist/assets/{xychartDiagram-ELKLHX3M-BU4yBDeE-Dm2FQAqw.js → xychartDiagram-ELKLHX3M-BU4yBDeE-BqbqYpuH.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +4 -4
- package/server/backends/remoteHost/skillOverrides.spec.ts +95 -0
- package/server/backends/remoteHost/skillOverrides.ts +75 -0
- package/server/backends/remoteHost/skills.spec.ts +55 -0
- package/server/backends/remoteHost/skills.ts +11 -2
- package/server/backends/sharedApp/appViews.ts +9 -6
- package/server/backends/sharedApp/deploy.ts +3 -0
- package/server/backends/sharedApp/modalCall.ts +497 -0
- package/server/backends/sharedApp/preview.ts +277 -0
- package/server/backends/sharedApp/previewWrite.ts +251 -0
- package/server/backends/sharedApp/publicView.ts +88 -2
- package/server/backends/sharedApp/publish.ts +3 -0
- package/server/backends/sharedApp/slug.ts +1 -1
- package/server/backends/sharedAppPreviewRoutes.ts +182 -0
- package/server/config/header-resolve.ts +0 -7
- package/server/infra/pty-env.ts +37 -0
- package/server/infra/shared-app-tool.ts +39 -11
- package/server/infra/shell-quote.ts +26 -0
- package/server/infra/tmux.ts +9 -1
- package/server/routes/app-routes.ts +3 -0
- package/server/routes/hook-routes.ts +18 -6
- package/server/routes/ws-routes.ts +14 -11
- package/server/session/codex-activity-track.ts +3 -3
- package/server/session/pty-spawn.ts +24 -3
- package/server/session/shell-command.ts +59 -5
- package/server/session/spawn-shell.ts +12 -10
- package/server/session/task-push.ts +40 -10
- package/server/session/taskPushRules.ts +9 -6
- package/server/skills/mulmoterminal-shared-app/SKILL.md +38 -0
- package/server/skills/mulmoterminal-shared-app/templates/meeting-room.md +73 -18
- package/server/skills/mulmoterminal-shared-app/templates/salon.md +17 -3
- package/dist/assets/architecture-TIHT7OUA-Cqhmai3f-DKxow7MX.js +0 -1
- package/dist/assets/channel-DKMa7Sn5-DXfk-pmR.js +0 -1
- package/dist/assets/classDiagram-JCYQIIEL-C1ePmEG1-B3i_KKpa.js +0 -1
- package/dist/assets/classDiagram-v2-OCEON4UE-C_O3VNBf-B3i_KKpa.js +0 -1
- package/dist/assets/cynefin-VYW2F7L2-DvSvuXnG-CqfiaAyR.js +0 -1
- package/dist/assets/eventmodeling-45OFAUF4-jdctDg0T-Bn8nOYEy.js +0 -1
- package/dist/assets/flowDiagram-UKHOOZJN-CR3dcoRl-BxBIpUfi.js +0 -1
- package/dist/assets/gitGraph-TEB2WS4Q-C4cKwl5j-Dbu1Qyjw.js +0 -1
- package/dist/assets/index-BjTAj1ZH.css +0 -1
- package/dist/assets/index-Cuz-LCIn.js +0 -625
- package/dist/assets/info-DKCQHKI2-DPUCBYWS-SU-TWbo5.js +0 -1
- package/dist/assets/packet-7NZHBO7P-CC7His0F-DAOgr6cQ.js +0 -1
- package/dist/assets/pie-RZYD4A2V-CCrcq2sL-xi5VG5VX.js +0 -1
- package/dist/assets/radar-I7S5WNFK-C5TUrpHf-i8K7RZ0u.js +0 -1
- package/dist/assets/railroad-3IZDKUUU-CGuuFEd8-DB7F_dkQ.js +0 -1
- package/dist/assets/railroad-abnf-AHOZXSZD-DuoCSFZY-CDOZa3yV.js +0 -1
- package/dist/assets/railroad-ebnf-EBAXGLYW-ig-DG9e_-B6N2Fb5S.js +0 -1
- package/dist/assets/railroad-peg-LSFZ7HO6-BkBgpyvu-BgOVUqp7.js +0 -1
- package/dist/assets/stateDiagram-v2-UEYNNEHI-B88w7Ous-CPHeWl4W.js +0 -1
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-DNcZzqTp-CYrdlCH9.js +0 -8
- package/dist/assets/treeView-QDETBFTQ-CqfT0I1z-DoUWczkJ.js +0 -1
- package/dist/assets/treemap-6X3UGDF4-CiJkiGWo-DYceyM_q.js +0 -1
- package/dist/assets/wardley-OPB4EBWU-D1tuVHAV-D0RuWWEW.js +0 -1
package/common/firebaseConfig.ts
CHANGED
|
@@ -13,3 +13,10 @@ export const firebaseConfig = {
|
|
|
13
13
|
appId: "1:830257137330:web:5cb8db01ae61b5d161abab",
|
|
14
14
|
measurementId: "G-Y75JGK1G4T",
|
|
15
15
|
} as const;
|
|
16
|
+
|
|
17
|
+
// Where that project is SERVED — the origin of every address this app hands a person: a shared
|
|
18
|
+
// app's public page, its staff and participant pages, the mobile companion. It lives beside the
|
|
19
|
+
// config because it is the same deployment's identity, and in `common/` because both sides print
|
|
20
|
+
// it: the UI shows it as a QR code, and `manageSharedApp` writes it into the sentence an author
|
|
21
|
+
// copies into an invitation. A URL missing its origin is one an author cannot paste anywhere.
|
|
22
|
+
export const MULMOSERVER_ORIGIN = "https://mulmoserver.web.app";
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// What the preview route sends, decided by BOTH sides.
|
|
2
|
+
//
|
|
3
|
+
// Here rather than in `server/` with a copy in `src/` because that is what this repository's rule
|
|
4
|
+
// says about a wire shape the two ends agree on: a rename or a new field on one side would drift
|
|
5
|
+
// silently until the pane drew nothing, and "nothing drawn" is the failure mode this whole feature
|
|
6
|
+
// exists to remove. The server's own result type extends this with what only it uses.
|
|
7
|
+
//
|
|
8
|
+
// Design: `plans/feat-shared-app-preview.md`.
|
|
9
|
+
|
|
10
|
+
/** Who a page was written for. Three audiences, three DOCUMENTS with three sets of rules — never
|
|
11
|
+
* one page shown three ways. Reading them as interchangeable is how a page written for the front
|
|
12
|
+
* desk gets published to the world. */
|
|
13
|
+
export type PreviewAudience = "public" | "member" | "roster";
|
|
14
|
+
|
|
15
|
+
/** One page the author can look at. */
|
|
16
|
+
export interface PreviewPage {
|
|
17
|
+
id: string;
|
|
18
|
+
html: string;
|
|
19
|
+
audience: PreviewAudience;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type PreviewDataset = Record<string, unknown>[];
|
|
23
|
+
|
|
24
|
+
/** The records ONE page is handed, per collection.
|
|
25
|
+
*
|
|
26
|
+
* Per page rather than one map for the app, and that is the point rather than tidiness: a member
|
|
27
|
+
* page may name a collection `public.read` does not open, so a single map is either missing those
|
|
28
|
+
* records on the member page or handing them to the public one. The second is worse — it would
|
|
29
|
+
* show the author a public page drawing private data, which is the preview being LOOSER than
|
|
30
|
+
* production, the one thing it must never be. */
|
|
31
|
+
export type PreviewDatasets = Record<string, Record<string, PreviewDataset>>;
|
|
32
|
+
|
|
33
|
+
/** The key a page's datasets sit under. Audience-qualified because a view id is unique within its
|
|
34
|
+
* tier and not across them. */
|
|
35
|
+
export const previewPageKey = (audience: PreviewAudience, id: string): string => `${audience}:${id}`;
|
|
36
|
+
|
|
37
|
+
/** One input of a GENERATED public form — an app that declares `public.submit` and publishes no
|
|
38
|
+
* page of its own.
|
|
39
|
+
*
|
|
40
|
+
* Already reduced to what a visitor may fill in: `createFields` minus the address (compared to
|
|
41
|
+
* their token) and minus the status (pinned to `initialStatus`), in the order the declaration
|
|
42
|
+
* lists them. The reduction happens on the SERVER, through the same `writableFields` the published
|
|
43
|
+
* site's submit path uses, so the pane draws boxes rather than deciding which boxes exist. */
|
|
44
|
+
export interface PreviewFormField {
|
|
45
|
+
name: string;
|
|
46
|
+
label: string;
|
|
47
|
+
required: boolean;
|
|
48
|
+
/** The schema's type, so a `enum` draws a select and a `text` draws a textarea. A pane that drew
|
|
49
|
+
* every field as a text box would let the author submit values the real form could not produce. */
|
|
50
|
+
type: string;
|
|
51
|
+
/** An `enum`'s choices, which travel with it for the same reason they travel to the public page:
|
|
52
|
+
* a visitor cannot read the schema. */
|
|
53
|
+
values?: string[];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** The generated form, per collection. Empty for an app that publishes a page of its own. */
|
|
57
|
+
export type PreviewForm = Record<string, PreviewFormField[]>;
|
|
58
|
+
|
|
59
|
+
export interface SharedAppPreview {
|
|
60
|
+
aid: string;
|
|
61
|
+
/** What a public create may carry, per collection, exactly as the published config declares it.
|
|
62
|
+
*
|
|
63
|
+
* Carried to the browser because the PARENT judges a submission against it — an unknown cid, a
|
|
64
|
+
* value that is not a string, a field outside `createFields` — and those three judgements are
|
|
65
|
+
* most of what a preview is for. Handing the parent an empty map instead does not disable the
|
|
66
|
+
* check; it makes the check REFUSE EVERYTHING, and it refuses with `unknown-collection`, which
|
|
67
|
+
* reads as "your declaration is wrong" about a declaration that is fine. That shipped once
|
|
68
|
+
* (2026-08-14) and cost an author a debugging session pointed at the wrong repository. */
|
|
69
|
+
submit: Record<string, { createFields: string[] }>;
|
|
70
|
+
/** Every page this publish would put live, public first. */
|
|
71
|
+
pages: PreviewPage[];
|
|
72
|
+
/** Whether this publish would leave the app open to anonymous visitors. False is normal: an app
|
|
73
|
+
* with no `public` block is one only its roster ever sees. */
|
|
74
|
+
publicOpen: boolean;
|
|
75
|
+
/** Whether there was a live `apps/{aid}` to project from. Said out loud because the projection
|
|
76
|
+
* DEPENDS on it — keys publish does not own are carried forward from the live document, so a
|
|
77
|
+
* preview computed without one is the projection of a FIRST publish, not of the next one. */
|
|
78
|
+
fromLiveApp: boolean;
|
|
79
|
+
/** The app publishes a GENERATED form rather than a page of its own.
|
|
80
|
+
*
|
|
81
|
+
* Carried as a fact rather than left to be inferred from an empty `pages`: those two states put
|
|
82
|
+
* the same empty frame on screen and mean opposite things — "there is nothing to draw" against
|
|
83
|
+
* "there is something to draw and this pane cannot draw it yet". */
|
|
84
|
+
generatedForm: boolean;
|
|
85
|
+
/** The inputs of that generated form. Carried rather than left to the pane to derive: the pane
|
|
86
|
+
* cannot read the schema either, and a form it built from field NAMES alone would ask for
|
|
87
|
+
* different things than the published site does — a preview of nothing real. */
|
|
88
|
+
formInputs: PreviewForm;
|
|
89
|
+
datasets: PreviewDatasets;
|
|
90
|
+
/** Collections a page names but whose records could not be read. Reported rather than silently
|
|
91
|
+
* empty: "no bookings yet" and "the read was refused" put identical pixels on the screen. */
|
|
92
|
+
unreadable: string[];
|
|
93
|
+
/** Pages that will go out but are worth looking at first — see `viewWarnings`. */
|
|
94
|
+
warnings: string[];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** The route's answer. Three shapes, and only one of them is a failure:
|
|
98
|
+
*
|
|
99
|
+
* - not declared — most directories are not shared apps, and the pane asks about whichever one a
|
|
100
|
+
* cell is open in. An error would make normal operation look like a fault.
|
|
101
|
+
* - declared and refused — the author's work in progress, and the reason the pane exists. These
|
|
102
|
+
* lines are the answer to the question asked; a status code could not carry them.
|
|
103
|
+
* - declared and computed. */
|
|
104
|
+
/** What the author accepted in the confirmation, on its way to the server. */
|
|
105
|
+
export interface PreviewSubmission {
|
|
106
|
+
cid: string;
|
|
107
|
+
/** Strings only. The rules compare stored values without coercing, so a number here would write a
|
|
108
|
+
* record that differs BY TYPE from the identical-looking one the published page writes. */
|
|
109
|
+
values: Record<string, string>;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** One record a preview wrote, and the mirror that travelled with it.
|
|
113
|
+
*
|
|
114
|
+
* Both ends hold this: the server returns it, the pane remembers it, and the pane hands it back to
|
|
115
|
+
* have it removed. It is the ONLY place a preview's writes are known — the rules read a public
|
|
116
|
+
* create with `hasOnly(createFields)`, so nothing can mark the document itself. */
|
|
117
|
+
export interface PreviewWrittenRecord {
|
|
118
|
+
cid: string;
|
|
119
|
+
id: string;
|
|
120
|
+
mirror?: { cid: string; id: string } | undefined;
|
|
121
|
+
/** The ONLY thing undo accepts, and the reason it is here rather than the record above.
|
|
122
|
+
*
|
|
123
|
+
* Undo runs through the author's own Firestore handle, so a route that took a cid and an id
|
|
124
|
+
* would take ANY cid and id in the app: a caller reaching this server could delete a stranger's
|
|
125
|
+
* real booking and put the slot it was holding back to `open`, and every write would be
|
|
126
|
+
* perfectly authorized. The cid and the id are still carried, because the author has to be able
|
|
127
|
+
* to read what this preview wrote — but they are for the SCREEN. What the server acts on is a
|
|
128
|
+
* token it minted itself when it made the write, held in memory and mapped to that exact record.
|
|
129
|
+
*
|
|
130
|
+
* In memory, for the lifetime of the process, which is the same lifetime as the list on screen:
|
|
131
|
+
* neither survives a restart, and a preview's writes become ordinary records when it ends. */
|
|
132
|
+
token: string;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** A write whose outcome is unknown: the request threw after the server may already have written.
|
|
136
|
+
*
|
|
137
|
+
* Kept because the alternative is worse. Dropping it leaves a real record in the app that nothing
|
|
138
|
+
* on this screen can name, so the author cannot remove what they cannot see. */
|
|
139
|
+
export interface PreviewUncertainWrite {
|
|
140
|
+
cid: string;
|
|
141
|
+
uncertain: true;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export type SharedAppPreviewResponse =
|
|
145
|
+
{ declared: false } | { declared: true; ok: false; problems: string[] } | { declared: true; ok: true; preview: SharedAppPreview };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./chunk-Y2CYZVJY-Bdt8pFDJ-DsF7k-Jl.js";import{f as t}from"./src-CvsWqFln-Tc7ZSrRz.js";import{_ as n,g as r}from"./mermaid-parser.core-C1baW7NG-
|
|
1
|
+
import{n as e}from"./chunk-Y2CYZVJY-Bdt8pFDJ-DsF7k-Jl.js";import{f as t}from"./src-CvsWqFln-Tc7ZSrRz.js";import{_ as n,g as r}from"./mermaid-parser.core-C1baW7NG-CEcX_pqa.js";import"./chunk-I66GZJ75-DSPCVCny-DJV8P6pl.js";import"./chunk-3NCLNEKW-CBztX243-CisAcavI.js";import{n as i,r as a,t as o}from"./chunk-6Q2QTUOP-Cx8nz5_t-DutsMg17.js";import{t as s}from"./chunk-JWPE2WC7-BQ3zXr2k-DSd3Ct95.js";var c=r().RailroadAbnf.parser.LangiumParser,l=e(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=e(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=e(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=e(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=e(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=e(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=e(e=>{s(e,a),e.title&&a.setTitle(e.title),e.rules.map(e=>a.addRule(m(e)))},`populateDb`),g={parser:{parse:e(e=>{a.clear(),t.debug(`[ABNF Parser] Starting Langium parse`);let r=c.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new n(r);let i=r.value;t.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),t.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:a}},db:a,renderer:o,styles:i};export{g as diagram};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as e}from"./mermaid-parser.core-C1baW7NG-CEcX_pqa.js";export{e as createArchitectureServices};
|