@rool-dev/app 0.3.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.
Files changed (59) hide show
  1. package/README.md +306 -0
  2. package/dist/cli/dev.d.ts +10 -0
  3. package/dist/cli/dev.d.ts.map +1 -0
  4. package/dist/cli/dev.js +241 -0
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +22 -0
  8. package/dist/cli/init.d.ts +7 -0
  9. package/dist/cli/init.d.ts.map +1 -0
  10. package/dist/cli/init.js +108 -0
  11. package/dist/cli/publish.d.ts +9 -0
  12. package/dist/cli/publish.d.ts.map +1 -0
  13. package/dist/cli/publish.js +213 -0
  14. package/dist/cli/vite-utils.d.ts +22 -0
  15. package/dist/cli/vite-utils.d.ts.map +1 -0
  16. package/dist/cli/vite-utils.js +96 -0
  17. package/dist/client.d.ts +79 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +235 -0
  20. package/dist/dev/AppGrid.svelte +246 -0
  21. package/dist/dev/AppGrid.svelte.d.ts +14 -0
  22. package/dist/dev/AppGrid.svelte.d.ts.map +1 -0
  23. package/dist/dev/DevHostController.d.ts +86 -0
  24. package/dist/dev/DevHostController.d.ts.map +1 -0
  25. package/dist/dev/DevHostController.js +395 -0
  26. package/dist/dev/HostShell.svelte +110 -0
  27. package/dist/dev/HostShell.svelte.d.ts +11 -0
  28. package/dist/dev/HostShell.svelte.d.ts.map +1 -0
  29. package/dist/dev/Sidebar.svelte +223 -0
  30. package/dist/dev/Sidebar.svelte.d.ts +19 -0
  31. package/dist/dev/Sidebar.svelte.d.ts.map +1 -0
  32. package/dist/dev/TabBar.svelte +83 -0
  33. package/dist/dev/TabBar.svelte.d.ts +14 -0
  34. package/dist/dev/TabBar.svelte.d.ts.map +1 -0
  35. package/dist/dev/app.css +1 -0
  36. package/dist/dev/host-shell.d.ts +8 -0
  37. package/dist/dev/host-shell.d.ts.map +1 -0
  38. package/dist/dev/host-shell.js +14807 -0
  39. package/dist/dev/host-shell.js.map +1 -0
  40. package/dist/dev/vite-env.d.ts +4 -0
  41. package/dist/host.d.ts +54 -0
  42. package/dist/host.d.ts.map +1 -0
  43. package/dist/host.js +171 -0
  44. package/dist/index.d.ts +10 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +8 -0
  47. package/dist/manifest.d.ts +35 -0
  48. package/dist/manifest.d.ts.map +1 -0
  49. package/dist/manifest.js +10 -0
  50. package/dist/protocol.d.ts +46 -0
  51. package/dist/protocol.d.ts.map +1 -0
  52. package/dist/protocol.js +14 -0
  53. package/dist/reactive.svelte.d.ts +100 -0
  54. package/dist/reactive.svelte.d.ts.map +1 -0
  55. package/dist/reactive.svelte.js +267 -0
  56. package/dist/types.d.ts +119 -0
  57. package/dist/types.d.ts.map +1 -0
  58. package/dist/types.js +7 -0
  59. package/package.json +78 -0
@@ -0,0 +1,223 @@
1
+ <script lang="ts">
2
+ import type { DevHostController } from './DevHostController.js';
3
+ import type { RoolSpaceInfo } from '@rool-dev/sdk';
4
+ import type { AppManifest, Environment } from '../manifest.js';
5
+ import { ENV_URLS } from '../manifest.js';
6
+
7
+ interface Props {
8
+ controller: DevHostController;
9
+ // Reactive copies from the controller (Svelte $state)
10
+ manifest: AppManifest | null;
11
+ manifestError: string | null;
12
+ spaces: RoolSpaceInfo[];
13
+ currentSpaceId: string | null;
14
+ env: Environment;
15
+ statusText: string;
16
+ statusState: 'ok' | 'loading' | 'off';
17
+ sidebarCollapsed: boolean;
18
+ dropdownOpen: boolean;
19
+ }
20
+
21
+ let {
22
+ controller,
23
+ manifest,
24
+ manifestError,
25
+ spaces,
26
+ currentSpaceId,
27
+ env,
28
+ statusText,
29
+ statusState,
30
+ sidebarCollapsed,
31
+ dropdownOpen = $bindable(),
32
+ }: Props = $props();
33
+
34
+ let selectedSpace = $derived(spaces.find((s) => s.id === currentSpaceId));
35
+ </script>
36
+
37
+ {#if sidebarCollapsed}
38
+ <!-- Collapsed sidebar -->
39
+ <div class="w-10 shrink-0 bg-white border-r border-slate-200 flex flex-col items-center py-3">
40
+ <button
41
+ class="p-1.5 text-slate-400 hover:text-slate-600 transition-colors"
42
+ onclick={() => controller.toggleSidebar()}
43
+ title="Expand sidebar"
44
+ >
45
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18l6-6-6-6"/></svg>
46
+ </button>
47
+ <div class="mt-3">
48
+ <span
49
+ class="block w-2 h-2 rounded-full {statusState === 'ok' ? 'bg-green-500' : statusState === 'loading' ? 'bg-amber-500' : 'bg-slate-400'}"
50
+ title={statusText}
51
+ ></span>
52
+ </div>
53
+ </div>
54
+ {:else}
55
+ <!-- Expanded sidebar -->
56
+ <div class="w-[280px] shrink-0 bg-white border-r border-slate-200 flex flex-col overflow-y-auto">
57
+ <!-- App identity (hero) -->
58
+ <div class="px-4 pt-4 pb-3 border-b border-slate-100">
59
+ <div class="flex items-start justify-between mb-1">
60
+ {#if manifest}
61
+ <div class="min-w-0">
62
+ <div class="font-semibold text-base text-slate-800 leading-tight">{manifest.name}</div>
63
+ <div class="text-[11px] text-slate-400 font-mono mt-0.5">{manifest.id}</div>
64
+ </div>
65
+ {:else}
66
+ <div class="min-w-0">
67
+ <div class="font-semibold text-base text-slate-800 leading-tight">App</div>
68
+ </div>
69
+ {/if}
70
+ <button
71
+ class="p-1 -mr-1 text-slate-400 hover:text-slate-600 transition-colors shrink-0"
72
+ onclick={() => controller.toggleSidebar()}
73
+ title="Collapse sidebar"
74
+ >
75
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 18l-6-6 6-6"/></svg>
76
+ </button>
77
+ </div>
78
+ {#if manifest?.description}
79
+ <div class="text-xs text-slate-500 leading-snug mt-1">{manifest.description}</div>
80
+ {/if}
81
+ {#if manifestError && !manifest}
82
+ <div class="text-xs text-red-500 mt-1">{manifestError}</div>
83
+ {/if}
84
+ </div>
85
+
86
+ <!-- Collections -->
87
+ {#if manifest?.collections}
88
+ <div class="px-4 py-3 border-b border-slate-100">
89
+ <div class="text-[10px] font-semibold text-slate-400 uppercase tracking-wider mb-1.5">Collections</div>
90
+ <div class="space-y-2.5">
91
+ {#if manifest.collections.write && manifest.collections.write !== '*'}
92
+ <div>
93
+ <div class="text-[10px] font-semibold text-emerald-600 mb-1">Defines</div>
94
+ <div class="space-y-1">
95
+ {#each Object.entries(manifest.collections.write) as [name, fields]}
96
+ <div class="flex items-baseline gap-1.5 pl-2 border-l-2 border-emerald-200">
97
+ <span class="text-[11px] font-medium text-slate-700 shrink-0">{name}</span>
98
+ <span class="text-[10px] text-slate-400 truncate">{fields.map(f => f.name).join(', ')}</span>
99
+ </div>
100
+ {/each}
101
+ </div>
102
+ </div>
103
+ {/if}
104
+ {#if manifest.collections.read && manifest.collections.read !== '*'}
105
+ <div>
106
+ <div class="text-[10px] font-semibold text-blue-600 mb-1">Defines (read-only)</div>
107
+ <div class="space-y-1">
108
+ {#each Object.entries(manifest.collections.read) as [name, fields]}
109
+ <div class="flex items-baseline gap-1.5 pl-2 border-l-2 border-blue-200">
110
+ <span class="text-[11px] font-medium text-slate-700 shrink-0">{name}</span>
111
+ <span class="text-[10px] text-slate-400 truncate">{fields.map(f => f.name).join(', ')}</span>
112
+ </div>
113
+ {/each}
114
+ </div>
115
+ </div>
116
+ {/if}
117
+ {#if manifest.collections.write === '*' || manifest.collections.read === '*'}
118
+ <div>
119
+ <div class="text-[10px] font-semibold text-slate-500 mb-1">Requests access</div>
120
+ <div class="space-y-0.5 pl-2">
121
+ {#if manifest.collections.write === '*'}
122
+ <div class="text-[11px] text-slate-600">Read & write all collections</div>
123
+ {:else if manifest.collections.read === '*'}
124
+ <div class="text-[11px] text-slate-600">Read all collections</div>
125
+ {/if}
126
+ </div>
127
+ </div>
128
+ {/if}
129
+ </div>
130
+ </div>
131
+ {/if}
132
+
133
+ <!-- System Instruction -->
134
+ {#if manifest?.systemInstruction}
135
+ <div class="px-4 py-3 border-b border-slate-100">
136
+ <div class="text-[10px] font-semibold text-slate-400 uppercase tracking-wider mb-1.5">System Instruction</div>
137
+ <div class="text-xs text-slate-600 bg-slate-50 border border-slate-200 rounded-md px-2.5 py-2 whitespace-pre-wrap leading-snug max-h-24 overflow-y-auto">{manifest.systemInstruction}</div>
138
+ </div>
139
+ {/if}
140
+
141
+ <!-- Manifest warning -->
142
+ {#if manifestError && manifest}
143
+ <div class="px-3 py-2 mx-3 mt-2 text-xs text-amber-700 bg-amber-50 border border-amber-200 rounded-md">
144
+ {manifestError}
145
+ </div>
146
+ {/if}
147
+
148
+ <!-- Environment -->
149
+ <div class="px-4 py-3 border-b border-slate-100">
150
+ <div class="text-[10px] font-semibold text-slate-400 uppercase tracking-wider mb-1.5">Environment</div>
151
+ <div class="flex rounded-md border border-slate-200 overflow-hidden">
152
+ <button
153
+ class="flex-1 py-1.5 text-[11px] font-medium transition-colors {env === 'dev' ? 'bg-indigo-50 text-indigo-600 border-r border-slate-200' : 'text-slate-500 hover:bg-slate-50 border-r border-slate-200'}"
154
+ onclick={() => controller.switchEnv('dev')}
155
+ >
156
+ Dev
157
+ </button>
158
+ <button
159
+ class="flex-1 py-1.5 text-[11px] font-medium transition-colors {env === 'prod' ? 'bg-indigo-50 text-indigo-600' : 'text-slate-500 hover:bg-slate-50'}"
160
+ onclick={() => controller.switchEnv('prod')}
161
+ >
162
+ Prod
163
+ </button>
164
+ </div>
165
+ <div class="text-[10px] text-slate-400 mt-1 font-mono">{ENV_URLS[env].label}</div>
166
+ </div>
167
+
168
+ <!-- Space picker -->
169
+ <div class="px-4 py-3 border-b border-slate-100">
170
+ <div class="text-[10px] font-semibold text-slate-400 uppercase tracking-wider mb-1.5">Space</div>
171
+ <div class="relative" data-dropdown>
172
+ <button
173
+ class="w-full py-1.5 pl-2.5 pr-8 text-[13px] border border-slate-200 rounded-md bg-white text-slate-700 text-left truncate cursor-pointer outline-none hover:border-slate-300 {dropdownOpen ? 'border-indigo-500 ring-2 ring-indigo-500/12' : 'focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/12'}"
174
+ type="button"
175
+ onclick={(e) => { e.stopPropagation(); dropdownOpen = !dropdownOpen; }}
176
+ >
177
+ {selectedSpace?.name ?? 'Select a space...'}
178
+ <svg class="absolute right-2.5 top-1/2 -translate-y-1/2 text-slate-400 pointer-events-none" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"/></svg>
179
+ </button>
180
+ {#if dropdownOpen}
181
+ <div class="absolute top-full mt-1 left-0 min-w-full max-w-[360px] max-h-60 overflow-y-auto bg-white border border-slate-200 rounded-md shadow-lg z-50 py-1">
182
+ {#each spaces as space}
183
+ <button
184
+ class="block w-full px-2.5 py-1.5 text-[13px] text-left truncate border-none cursor-pointer hover:bg-slate-100 {space.id === currentSpaceId ? 'bg-indigo-50 text-indigo-600 font-medium' : 'text-slate-700 bg-transparent'}"
185
+ type="button"
186
+ onclick={() => { dropdownOpen = false; controller.selectSpace(space.id); }}
187
+ >
188
+ {space.name}
189
+ </button>
190
+ {:else}
191
+ <div class="px-2.5 py-1.5 text-[13px] text-slate-400">No spaces available</div>
192
+ {/each}
193
+ </div>
194
+ {/if}
195
+ </div>
196
+ <!-- Connection status -->
197
+ <div class="text-[11px] text-slate-400 leading-normal mt-1.5">
198
+ <span
199
+ class="inline-block w-1.5 h-1.5 rounded-full mr-1 align-middle {statusState === 'ok' ? 'bg-green-500' : statusState === 'loading' ? 'bg-amber-500' : 'bg-slate-400'}"
200
+ ></span>
201
+ {statusText}
202
+ </div>
203
+ </div>
204
+
205
+ <!-- Footer -->
206
+ <div class="px-4 py-3 mt-auto flex items-center justify-between">
207
+ <a
208
+ href="https://docs.rool.dev/app"
209
+ target="_blank"
210
+ rel="noopener noreferrer"
211
+ class="text-[11px] text-slate-400 hover:text-indigo-500 transition-colors"
212
+ >
213
+ Documentation
214
+ </a>
215
+ <button
216
+ class="text-[11px] text-slate-400 hover:text-red-500 transition-colors"
217
+ onclick={() => controller.logout()}
218
+ >
219
+ Sign out
220
+ </button>
221
+ </div>
222
+ </div>
223
+ {/if}
@@ -0,0 +1,19 @@
1
+ import type { DevHostController } from './DevHostController.js';
2
+ import type { RoolSpaceInfo } from '@rool-dev/sdk';
3
+ import type { AppManifest, Environment } from '../manifest.js';
4
+ interface Props {
5
+ controller: DevHostController;
6
+ manifest: AppManifest | null;
7
+ manifestError: string | null;
8
+ spaces: RoolSpaceInfo[];
9
+ currentSpaceId: string | null;
10
+ env: Environment;
11
+ statusText: string;
12
+ statusState: 'ok' | 'loading' | 'off';
13
+ sidebarCollapsed: boolean;
14
+ dropdownOpen: boolean;
15
+ }
16
+ declare const Sidebar: import("svelte").Component<Props, {}, "dropdownOpen">;
17
+ type Sidebar = ReturnType<typeof Sidebar>;
18
+ export default Sidebar;
19
+ //# sourceMappingURL=Sidebar.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar.svelte.d.ts","sourceRoot":"","sources":["../../src/dev/Sidebar.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7D,UAAU,KAAK;IACb,UAAU,EAAE,iBAAiB,CAAC;IAE9B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,GAAG,EAAE,WAAW,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,IAAI,GAAG,SAAS,GAAG,KAAK,CAAC;IACtC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;CACvB;AAmLH,QAAA,MAAM,OAAO,uDAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
@@ -0,0 +1,83 @@
1
+ <script lang="ts">
2
+ import type { AppTab } from './DevHostController.js';
3
+ import type { PublishedAppInfo } from '@rool-dev/sdk';
4
+
5
+ interface Props {
6
+ tabs: AppTab[];
7
+ activeTab: string;
8
+ uninstalledApps: PublishedAppInfo[];
9
+ onSelectTab: (id: string) => void;
10
+ onRemoveApp: (id: string) => void;
11
+ onInstallApp: (appId: string) => void;
12
+ }
13
+
14
+ let { tabs, activeTab, uninstalledApps, onSelectTab, onRemoveApp, onInstallApp }: Props = $props();
15
+
16
+ let addMenuOpen = $state(false);
17
+ </script>
18
+
19
+ <div class="flex items-end border-b border-slate-200 bg-slate-50 px-2 pt-1 shrink-0">
20
+ {#each tabs as tab}
21
+ <div
22
+ class="relative px-3 py-1.5 text-[12px] font-medium rounded-t-md transition-colors mr-0.5 flex items-center gap-1.5 cursor-pointer select-none
23
+ {activeTab === tab.id
24
+ ? 'bg-white text-slate-800 border border-slate-200 border-b-white -mb-px z-10'
25
+ : 'text-slate-500 hover:text-slate-700 hover:bg-slate-100 border border-transparent'}"
26
+ role="tab"
27
+ tabindex="0"
28
+ aria-selected={activeTab === tab.id}
29
+ onclick={() => onSelectTab(tab.id)}
30
+ onkeydown={(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onSelectTab(tab.id); } }}
31
+ >
32
+ {#if tab.isLocal}
33
+ <span class="inline-block w-1.5 h-1.5 rounded-full bg-emerald-500 shrink-0" title="Local dev"></span>
34
+ {/if}
35
+ {tab.name}
36
+ {#if !tab.isLocal}
37
+ <button
38
+ class="ml-1 text-slate-400 hover:text-red-500 transition-colors p-0 border-none bg-transparent leading-none"
39
+ type="button"
40
+ title="Uninstall app"
41
+ onclick={(e: MouseEvent) => { e.stopPropagation(); onRemoveApp(tab.id); }}
42
+ >
43
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6L6 18"/><path d="M6 6l12 12"/></svg>
44
+ </button>
45
+ {/if}
46
+ </div>
47
+ {/each}
48
+
49
+ <!-- Add app button -->
50
+ {#if uninstalledApps.length > 0}
51
+ <div class="relative ml-1 mb-0.5" data-add-menu>
52
+ <button
53
+ class="px-2 py-1 text-slate-400 hover:text-slate-600 hover:bg-slate-100 rounded transition-colors border-none bg-transparent"
54
+ type="button"
55
+ title="Install app"
56
+ onclick={(e: MouseEvent) => { e.stopPropagation(); addMenuOpen = !addMenuOpen; }}
57
+ >
58
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14"/><path d="M5 12h14"/></svg>
59
+ </button>
60
+ {#if addMenuOpen}
61
+ <div class="absolute top-full mt-1 left-0 min-w-[200px] max-h-60 overflow-y-auto bg-white border border-slate-200 rounded-md shadow-lg z-50 py-1">
62
+ <div class="px-2.5 py-1 text-[10px] font-semibold text-slate-400 uppercase tracking-wider">Install App</div>
63
+ {#each uninstalledApps as app}
64
+ <button
65
+ class="block w-full px-2.5 py-1.5 text-[13px] text-left truncate border-none cursor-pointer hover:bg-slate-100 text-slate-700 bg-transparent"
66
+ type="button"
67
+ onclick={() => { addMenuOpen = false; onInstallApp(app.appId); }}
68
+ >
69
+ <span class="font-medium">{app.name}</span>
70
+ <span class="text-[10px] text-slate-400 font-mono ml-1.5">{app.appId}</span>
71
+ </button>
72
+ {/each}
73
+ </div>
74
+ {/if}
75
+ </div>
76
+ {/if}
77
+ </div>
78
+
79
+ <svelte:document onclick={(e: MouseEvent) => {
80
+ if (addMenuOpen && !(e.target as Element)?.closest('[data-add-menu]')) {
81
+ addMenuOpen = false;
82
+ }
83
+ }} />
@@ -0,0 +1,14 @@
1
+ import type { AppTab } from './DevHostController.js';
2
+ import type { PublishedAppInfo } from '@rool-dev/sdk';
3
+ interface Props {
4
+ tabs: AppTab[];
5
+ activeTab: string;
6
+ uninstalledApps: PublishedAppInfo[];
7
+ onSelectTab: (id: string) => void;
8
+ onRemoveApp: (id: string) => void;
9
+ onInstallApp: (appId: string) => void;
10
+ }
11
+ declare const TabBar: import("svelte").Component<Props, {}, "">;
12
+ type TabBar = ReturnType<typeof TabBar>;
13
+ export default TabBar;
14
+ //# sourceMappingURL=TabBar.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabBar.svelte.d.ts","sourceRoot":"","sources":["../../src/dev/TabBar.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGpD,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,gBAAgB,EAAE,CAAC;IACpC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AA0DH,QAAA,MAAM,MAAM,2CAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
@@ -0,0 +1 @@
1
+ @import "tailwindcss";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Dev host shell entry point.
3
+ *
4
+ * Mounts the HostShell Svelte component into #rool-host.
5
+ * Built into a single bundle at publish time and served by the CLI dev server.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=host-shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-shell.d.ts","sourceRoot":"","sources":["../../src/dev/host-shell.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}