windmill-components 1.700.2 → 1.700.3
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/dist/appPolicy/myFunction.es.js +1337 -0
- package/dist/sharedUtils/common.d.ts +2 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -2
- package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +3 -14
- package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +1 -1
- package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +1 -12
- package/dist/sharedUtils/components/apps/editor/component/components.d.ts +2 -68
- package/dist/sharedUtils/components/apps/inputType.d.ts +2 -4
- package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -2
- package/dist/sharedUtils/components/dbTypes.d.ts +0 -3
- package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +1 -1
- package/dist/sharedUtils/components/raw_apps/utils.d.ts +1 -1
- package/dist/sharedUtils/components/triggers/utils.d.ts +3 -2
- package/dist/sharedUtils/gen/schemas.gen.d.ts +71 -915
- package/dist/sharedUtils/gen/services.gen.d.ts +23 -329
- package/dist/sharedUtils/gen/types.gen.d.ts +141 -1870
- package/dist/sharedUtils/hub.d.ts +0 -1
- package/dist/sharedUtils/jsr.json +5 -5
- package/dist/sharedUtils/lib.d.ts +1 -1
- package/dist/sharedUtils/lib.es.js +79 -241
- package/dist/sharedUtils/package.json +11 -11
- package/dist/sharedUtils/stores.d.ts +0 -1
- package/dist/sharedUtils/svelte5Utils.svelte.d.ts +1 -32
- package/dist/sharedUtils/utils.d.ts +4 -19
- package/package/components/DisplayResultControlBar.svelte +26 -11
- package/package/components/JobArgs.svelte +43 -24
- package/package/components/ShareModal.svelte.d.ts +1 -1
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +0 -3
- package/package/components/copilot/CustomAIPrompts.svelte +3 -2
- package/package/components/copilot/chat/AIChatInput.svelte +2 -0
- package/package/components/copilot/chat/AIChatManager.svelte.js +52 -14
- package/package/components/copilot/chat/CreatedResourceActionDrawers.svelte +15 -0
- package/package/components/copilot/chat/ToolMessageActions.svelte +4 -2
- package/package/components/copilot/chat/app/core.js +2 -30
- package/package/components/copilot/chat/flow/core.js +13 -351
- package/package/components/copilot/chat/flow/editableFlowJson.d.ts +52 -0
- package/package/components/copilot/chat/flow/editableFlowJson.js +328 -0
- package/package/components/copilot/chat/flow/inlineScriptsUtils.js +2 -2
- package/package/components/copilot/chat/global/core.d.ts +5 -0
- package/package/components/copilot/chat/global/core.js +1739 -0
- package/package/components/copilot/chat/global/core.test.d.ts +1 -0
- package/package/components/copilot/chat/global/core.test.js +123 -0
- package/package/components/copilot/chat/global/deployRequests.d.ts +7 -0
- package/package/components/copilot/chat/global/deployRequests.js +76 -0
- package/package/components/copilot/chat/global/deployRequests.test.d.ts +1 -0
- package/package/components/copilot/chat/global/deployRequests.test.js +142 -0
- package/package/components/copilot/chat/global/draftStore.svelte.d.ts +55 -0
- package/package/components/copilot/chat/global/draftStore.svelte.js +78 -0
- package/package/components/copilot/chat/global/draftStore.test.d.ts +1 -0
- package/package/components/copilot/chat/global/draftStore.test.js +44 -0
- package/package/components/copilot/chat/global/gate.d.ts +1 -0
- package/package/components/copilot/chat/global/gate.js +27 -0
- package/package/components/copilot/chat/shared.d.ts +16 -2
- package/package/components/copilot/chat/shared.js +40 -0
- package/package/components/copilot/chat/workspaceToolsZod.gen.d.ts +28 -9
- package/package/components/copilot/chat/workspaceToolsZod.gen.js +19 -0
- package/package/components/raw_apps/templates.d.ts +77 -0
- package/package/components/raw_apps/templates.js +618 -0
- package/package/components/runs/runsFilter.d.ts +1 -1
- package/package/components/settings/AIPromptsModal.svelte +5 -2
- package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte.d.ts +1 -1
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +37 -355
- package/package/gen/schemas.gen.js +39 -359
- package/package/gen/services.gen.d.ts +4 -280
- package/package/gen/services.gen.js +7 -565
- package/package/gen/types.gen.d.ts +77 -1135
- package/package/system_prompts/index.d.ts +2 -0
- package/package/system_prompts/index.js +8 -0
- package/package/system_prompts/prompts.d.ts +2 -0
- package/package/system_prompts/prompts.js +381 -0
- package/package/utils_deployable.d.ts +5 -318
- package/package.json +1 -1
- package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
- package/dist/sharedUtils/components/icons/index.d.ts +0 -101
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
const reactIndex = `
|
|
2
|
+
import React from 'react'
|
|
3
|
+
|
|
4
|
+
import { createRoot } from 'react-dom/client'
|
|
5
|
+
import App from './App'
|
|
6
|
+
|
|
7
|
+
const root = createRoot(document.getElementById('root')!);
|
|
8
|
+
root.render(<App/>);
|
|
9
|
+
`;
|
|
10
|
+
const appTsx = `import React, { useState } from 'react'
|
|
11
|
+
import { backend } from './wmill'
|
|
12
|
+
import './index.css'
|
|
13
|
+
|
|
14
|
+
const App = () => {
|
|
15
|
+
const [value, setValue] = useState(undefined as string | undefined)
|
|
16
|
+
const [loading, setLoading] = useState(false)
|
|
17
|
+
|
|
18
|
+
async function runA() {
|
|
19
|
+
setLoading(true)
|
|
20
|
+
try {
|
|
21
|
+
setValue(await backend.a({ x: 42 }))
|
|
22
|
+
} catch (e) {
|
|
23
|
+
console.error()
|
|
24
|
+
}
|
|
25
|
+
setLoading(false)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return <div style={{ width: "100%" }}>
|
|
29
|
+
<h1>hello world</h1>
|
|
30
|
+
|
|
31
|
+
<button style={{ marginTop: "2px" }} onClick={runA}>Run 'a'</button>
|
|
32
|
+
|
|
33
|
+
<div style={{ marginTop: "20px", width: '250px' }} className='myclass'>
|
|
34
|
+
{loading ? 'Loading ...' : value ?? 'Click button to see value here'}
|
|
35
|
+
</div>
|
|
36
|
+
</div>;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export default App;
|
|
40
|
+
`;
|
|
41
|
+
const appSvelte = `<script lang="ts">
|
|
42
|
+
import { backend } from "./wmill";
|
|
43
|
+
|
|
44
|
+
let name = "world";
|
|
45
|
+
let result = "";
|
|
46
|
+
|
|
47
|
+
async function callScript() {
|
|
48
|
+
result = await backend.a({ x: name });
|
|
49
|
+
}
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
<main>
|
|
53
|
+
<h1>Hello {name}</h1>
|
|
54
|
+
|
|
55
|
+
<input type="text" bind:value={name} placeholder="Enter a name" />
|
|
56
|
+
<button on:click={callScript}>Call runnable 'a'</button>
|
|
57
|
+
|
|
58
|
+
{#if result}
|
|
59
|
+
<p>Result: {result}</p>
|
|
60
|
+
{/if}
|
|
61
|
+
</main>
|
|
62
|
+
|
|
63
|
+
<style>
|
|
64
|
+
h1 {
|
|
65
|
+
font-size: 1.5rem;
|
|
66
|
+
}
|
|
67
|
+
</style>`;
|
|
68
|
+
const indexSvelte = `
|
|
69
|
+
import { mount } from 'svelte';
|
|
70
|
+
import App from './App.svelte'
|
|
71
|
+
import './index.css'
|
|
72
|
+
|
|
73
|
+
const app = mount(App, { target: document.getElementById("root")! });
|
|
74
|
+
|
|
75
|
+
export default app;
|
|
76
|
+
`;
|
|
77
|
+
const appVue = `<template>
|
|
78
|
+
<h1>Hello {{ msg }}</h1>
|
|
79
|
+
</template>
|
|
80
|
+
|
|
81
|
+
<script setup>
|
|
82
|
+
import { ref } from 'vue';
|
|
83
|
+
const msg = ref('world');
|
|
84
|
+
</script>`;
|
|
85
|
+
const indexVue = `import { createApp } from 'vue'
|
|
86
|
+
import App from './App.vue'
|
|
87
|
+
import "./index.css";
|
|
88
|
+
|
|
89
|
+
createApp(App).mount('#root')`;
|
|
90
|
+
const indexCss = `.myclass {
|
|
91
|
+
border: 1px solid gray;
|
|
92
|
+
padding: 2px;
|
|
93
|
+
}`;
|
|
94
|
+
export const react19Template = {
|
|
95
|
+
'/index.tsx': reactIndex,
|
|
96
|
+
'/App.tsx': appTsx,
|
|
97
|
+
'/index.css': indexCss,
|
|
98
|
+
'/package.json': `{
|
|
99
|
+
"dependencies": {
|
|
100
|
+
"react": "19.0.0",
|
|
101
|
+
"react-dom": "19.0.0",
|
|
102
|
+
"windmill-client": "^1"
|
|
103
|
+
},
|
|
104
|
+
"devDependencies": {
|
|
105
|
+
"@types/react-dom": "^19.0.0",
|
|
106
|
+
"@types/react": "^19.0.0"
|
|
107
|
+
}
|
|
108
|
+
}`
|
|
109
|
+
};
|
|
110
|
+
export const react18Template = {
|
|
111
|
+
'/index.tsx': reactIndex,
|
|
112
|
+
'/App.tsx': appTsx,
|
|
113
|
+
'/index.css': indexCss,
|
|
114
|
+
'/package.json': `{
|
|
115
|
+
"dependencies": {
|
|
116
|
+
"react": "18.3.1",
|
|
117
|
+
"react-dom": "18.3.1"
|
|
118
|
+
},
|
|
119
|
+
"devDependencies": {
|
|
120
|
+
"@types/react-dom": "^19.0.0",
|
|
121
|
+
"@types/react": "^19.0.0"
|
|
122
|
+
}
|
|
123
|
+
}`
|
|
124
|
+
};
|
|
125
|
+
export const svelte5Template = {
|
|
126
|
+
'/index.ts': indexSvelte,
|
|
127
|
+
'/App.svelte': appSvelte,
|
|
128
|
+
'/index.css': indexCss,
|
|
129
|
+
'/package.json': `{
|
|
130
|
+
"dependencies": {
|
|
131
|
+
"svelte": "^5.55.5",
|
|
132
|
+
"windmill-client": "^1"
|
|
133
|
+
}
|
|
134
|
+
}`
|
|
135
|
+
};
|
|
136
|
+
export const vueTemplate = {
|
|
137
|
+
'/index.ts': indexVue,
|
|
138
|
+
'/App.vue': appVue,
|
|
139
|
+
'/index.css': indexCss,
|
|
140
|
+
'/package.json': `{
|
|
141
|
+
"dependencies": {
|
|
142
|
+
"core-js": "3.26.1",
|
|
143
|
+
"vue": "3.5.13"
|
|
144
|
+
}
|
|
145
|
+
}`
|
|
146
|
+
};
|
|
147
|
+
export const FRAMEWORK_TEMPLATES = {
|
|
148
|
+
react19: react19Template,
|
|
149
|
+
react18: react18Template,
|
|
150
|
+
svelte5: svelte5Template,
|
|
151
|
+
vue: vueTemplate
|
|
152
|
+
};
|
|
153
|
+
export const STARTER_RUNNABLE_KEY = 'a';
|
|
154
|
+
// Matches the starter runnable that the apps_raw/add page seeds, so the
|
|
155
|
+
// React/Svelte demo button (`backend.a({ x: 42 })`) works on first render.
|
|
156
|
+
export const STARTER_RUNNABLE = {
|
|
157
|
+
name: 'a',
|
|
158
|
+
fields: {},
|
|
159
|
+
type: 'inline',
|
|
160
|
+
inlineScript: {
|
|
161
|
+
content: '// import * as wmill from "windmill-client"\n\nexport async function main(x: string) {\n return x\n}\n',
|
|
162
|
+
language: 'bun',
|
|
163
|
+
schema: {
|
|
164
|
+
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
165
|
+
properties: {
|
|
166
|
+
x: {
|
|
167
|
+
default: null,
|
|
168
|
+
description: '',
|
|
169
|
+
originalType: 'string',
|
|
170
|
+
type: 'string'
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
required: ['x'],
|
|
174
|
+
type: 'object'
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
export const appVueRouter = `
|
|
179
|
+
<template>
|
|
180
|
+
<div class="container">
|
|
181
|
+
<!-- Navigation tabs -->
|
|
182
|
+
<nav class="tabs">
|
|
183
|
+
<button
|
|
184
|
+
v-for="tab in tabs"
|
|
185
|
+
:key="tab.id"
|
|
186
|
+
:class="{ active: currentTab === tab.id }"
|
|
187
|
+
@click="changeTab(tab.id)"
|
|
188
|
+
>
|
|
189
|
+
{{ tab.name }}
|
|
190
|
+
</button>
|
|
191
|
+
</nav>
|
|
192
|
+
|
|
193
|
+
<!-- Content sections -->
|
|
194
|
+
<div class="content">
|
|
195
|
+
<div v-if="currentTab === 'home'" class="tab-content">
|
|
196
|
+
<h2>Home</h2>
|
|
197
|
+
<p>Welcome to the home tab!</p>
|
|
198
|
+
<!-- Nested navigation example -->
|
|
199
|
+
<div class="sub-nav">
|
|
200
|
+
<button
|
|
201
|
+
v-for="subItem in ['latest', 'popular']"
|
|
202
|
+
:key="subItem"
|
|
203
|
+
:class="{ active: currentSort === subItem }"
|
|
204
|
+
@click="changeSort(subItem)"
|
|
205
|
+
>
|
|
206
|
+
{{ subItem }}
|
|
207
|
+
</button>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
|
|
211
|
+
<div v-else-if="currentTab === 'about'" class="tab-content">
|
|
212
|
+
<h2>About</h2>
|
|
213
|
+
<p>This is the about section</p>
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
<div v-else-if="currentTab === 'contact'" class="tab-content">
|
|
217
|
+
<h2>Contact</h2>
|
|
218
|
+
<p>Contact information here</p>
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
221
|
+
|
|
222
|
+
<!-- Debug info -->
|
|
223
|
+
<div class="debug">
|
|
224
|
+
<p>Current Tab: {{ currentTab }}</p>
|
|
225
|
+
<p>Current Sort: {{ currentSort }}</p>
|
|
226
|
+
<p>Current Hash: {{ currentHash }}</p>
|
|
227
|
+
</div>
|
|
228
|
+
</div>
|
|
229
|
+
</template>
|
|
230
|
+
|
|
231
|
+
<script setup>
|
|
232
|
+
import { ref, onMounted, onUnmounted } from 'vue';
|
|
233
|
+
|
|
234
|
+
// Available tabs
|
|
235
|
+
const tabs = [
|
|
236
|
+
{ id: 'home', name: 'Home' },
|
|
237
|
+
{ id: 'about', name: 'About' },
|
|
238
|
+
{ id: 'contact', name: 'Contact' }
|
|
239
|
+
];
|
|
240
|
+
|
|
241
|
+
const currentTab = ref('home');
|
|
242
|
+
const currentSort = ref('latest');
|
|
243
|
+
const currentHash = ref('');
|
|
244
|
+
|
|
245
|
+
// Navigation functions
|
|
246
|
+
function changeTab(tabId) {
|
|
247
|
+
currentTab.value = tabId;
|
|
248
|
+
updateHash();
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function changeSort(sort) {
|
|
252
|
+
currentSort.value = sort;
|
|
253
|
+
updateHash();
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function updateHash() {
|
|
257
|
+
const params = new URLSearchParams();
|
|
258
|
+
params.set('tab', currentTab.value);
|
|
259
|
+
if (currentSort.value !== 'latest') {
|
|
260
|
+
params.set('sort', currentSort.value);
|
|
261
|
+
}
|
|
262
|
+
window.location.hash = params.toString();
|
|
263
|
+
currentHash.value = window.location.hash;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function parseHash() {
|
|
267
|
+
const params = new URLSearchParams(window.location.hash.slice(1));
|
|
268
|
+
currentTab.value = params.get('tab') || 'home';
|
|
269
|
+
currentSort.value = params.get('sort') || 'latest';
|
|
270
|
+
currentHash.value = window.location.hash;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Hash change handler
|
|
274
|
+
function handleHashChange() {
|
|
275
|
+
parseHash();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
onMounted(() => {
|
|
279
|
+
if (window.location.hash) {
|
|
280
|
+
parseHash();
|
|
281
|
+
} else {
|
|
282
|
+
updateHash();
|
|
283
|
+
}
|
|
284
|
+
window.addEventListener('hashchange', handleHashChange);
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
onUnmounted(() => {
|
|
288
|
+
window.removeEventListener('hashchange', handleHashChange);
|
|
289
|
+
});
|
|
290
|
+
</script>
|
|
291
|
+
|
|
292
|
+
<style scoped>
|
|
293
|
+
.container {
|
|
294
|
+
max-width: 800px;
|
|
295
|
+
margin: 0 auto;
|
|
296
|
+
padding: 20px;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.tabs {
|
|
300
|
+
display: flex;
|
|
301
|
+
gap: 10px;
|
|
302
|
+
margin-bottom: 20px;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
button {
|
|
306
|
+
padding: 8px 16px;
|
|
307
|
+
border: 1px solid #ddd;
|
|
308
|
+
background: #fff;
|
|
309
|
+
border-radius: 4px;
|
|
310
|
+
cursor: pointer;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
button.active {
|
|
314
|
+
background: #4CAF50;
|
|
315
|
+
color: white;
|
|
316
|
+
border-color: #4CAF50;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.content {
|
|
320
|
+
padding: 20px;
|
|
321
|
+
border: 1px solid #ddd;
|
|
322
|
+
border-radius: 4px;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.tab-content {
|
|
326
|
+
margin-bottom: 20px;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
.sub-nav {
|
|
330
|
+
margin-top: 10px;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.debug {
|
|
334
|
+
margin-top: 20px;
|
|
335
|
+
padding: 10px;
|
|
336
|
+
background: #f5f5f5;
|
|
337
|
+
border-radius: 4px;
|
|
338
|
+
font-size: 0.9em;
|
|
339
|
+
color: #666;
|
|
340
|
+
}
|
|
341
|
+
</style>`;
|
|
342
|
+
export const appSvelteRouter = `
|
|
343
|
+
<script>
|
|
344
|
+
import { onMount, onDestroy } from 'svelte';
|
|
345
|
+
|
|
346
|
+
// Available tabs
|
|
347
|
+
const tabs = [
|
|
348
|
+
{ id: 'home', name: 'Home' },
|
|
349
|
+
{ id: 'about', name: 'About' },
|
|
350
|
+
{ id: 'contact', name: 'Contact' }
|
|
351
|
+
];
|
|
352
|
+
|
|
353
|
+
let currentTab = 'home';
|
|
354
|
+
let currentSort = 'latest';
|
|
355
|
+
let currentHash = '';
|
|
356
|
+
|
|
357
|
+
// Navigation functions
|
|
358
|
+
function changeTab(tabId) {
|
|
359
|
+
currentTab = tabId;
|
|
360
|
+
updateHash();
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function changeSort(sort) {
|
|
364
|
+
currentSort = sort;
|
|
365
|
+
updateHash();
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
function updateHash() {
|
|
369
|
+
const params = new URLSearchParams();
|
|
370
|
+
params.set('tab', currentTab);
|
|
371
|
+
if (currentSort !== 'latest') {
|
|
372
|
+
params.set('sort', currentSort);
|
|
373
|
+
}
|
|
374
|
+
window.location.hash = params.toString();
|
|
375
|
+
currentHash = window.location.hash;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
function parseHash() {
|
|
379
|
+
const params = new URLSearchParams(window.location.hash.slice(1));
|
|
380
|
+
currentTab = params.get('tab') || 'home';
|
|
381
|
+
currentSort = params.get('sort') || 'latest';
|
|
382
|
+
currentHash = window.location.hash;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Hash change handler
|
|
386
|
+
function handleHashChange() {
|
|
387
|
+
parseHash();
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
onMount(() => {
|
|
391
|
+
if (window.location.hash) {
|
|
392
|
+
parseHash();
|
|
393
|
+
} else {
|
|
394
|
+
updateHash();
|
|
395
|
+
}
|
|
396
|
+
window.addEventListener('hashchange', handleHashChange);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
onDestroy(() => {
|
|
400
|
+
window.removeEventListener('hashchange', handleHashChange);
|
|
401
|
+
});
|
|
402
|
+
</script>
|
|
403
|
+
|
|
404
|
+
<div class="container">
|
|
405
|
+
<!-- Navigation tabs -->
|
|
406
|
+
<nav class="tabs">
|
|
407
|
+
{#each tabs as tab}
|
|
408
|
+
<button
|
|
409
|
+
class:active={currentTab === tab.id}
|
|
410
|
+
on:click={() => changeTab(tab.id)}
|
|
411
|
+
>
|
|
412
|
+
{tab.name}
|
|
413
|
+
</button>
|
|
414
|
+
{/each}
|
|
415
|
+
</nav>
|
|
416
|
+
|
|
417
|
+
<!-- Content sections -->
|
|
418
|
+
<div class="content">
|
|
419
|
+
{#if currentTab === 'home'}
|
|
420
|
+
<div class="tab-content">
|
|
421
|
+
<h2>Home</h2>
|
|
422
|
+
<p>Welcome to the home tab!</p>
|
|
423
|
+
<!-- Nested navigation example -->
|
|
424
|
+
<div class="sub-nav">
|
|
425
|
+
{#each ['latest', 'popular'] as subItem}
|
|
426
|
+
<button
|
|
427
|
+
class:active={currentSort === subItem}
|
|
428
|
+
on:click={() => changeSort(subItem)}
|
|
429
|
+
>
|
|
430
|
+
{subItem}
|
|
431
|
+
</button>
|
|
432
|
+
{/each}
|
|
433
|
+
</div>
|
|
434
|
+
</div>
|
|
435
|
+
{:else if currentTab === 'about'}
|
|
436
|
+
<div class="tab-content">
|
|
437
|
+
<h2>About</h2>
|
|
438
|
+
<p>This is the about section</p>
|
|
439
|
+
</div>
|
|
440
|
+
{:else if currentTab === 'contact'}
|
|
441
|
+
<div class="tab-content">
|
|
442
|
+
<h2>Contact</h2>
|
|
443
|
+
<p>Contact information here</p>
|
|
444
|
+
</div>
|
|
445
|
+
{/if}
|
|
446
|
+
</div>
|
|
447
|
+
|
|
448
|
+
<!-- Debug info -->
|
|
449
|
+
<div class="debug">
|
|
450
|
+
<p>Current Tab: {currentTab}</p>
|
|
451
|
+
<p>Current Sort: {currentSort}</p>
|
|
452
|
+
<p>Current Hash: {currentHash}</p>
|
|
453
|
+
</div>
|
|
454
|
+
</div>
|
|
455
|
+
|
|
456
|
+
<style>
|
|
457
|
+
.container {
|
|
458
|
+
max-width: 800px;
|
|
459
|
+
margin: 0 auto;
|
|
460
|
+
padding: 20px;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
.tabs {
|
|
464
|
+
display: flex;
|
|
465
|
+
gap: 10px;
|
|
466
|
+
margin-bottom: 20px;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
button {
|
|
470
|
+
padding: 8px 16px;
|
|
471
|
+
border: 1px solid #ddd;
|
|
472
|
+
background: #fff;
|
|
473
|
+
border-radius: 4px;
|
|
474
|
+
cursor: pointer;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
button.active {
|
|
478
|
+
background: #4CAF50;
|
|
479
|
+
color: white;
|
|
480
|
+
border-color: #4CAF50;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
.content {
|
|
484
|
+
padding: 20px;
|
|
485
|
+
border: 1px solid #ddd;
|
|
486
|
+
border-radius: 4px;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
.tab-content {
|
|
490
|
+
margin-bottom: 20px;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
.sub-nav {
|
|
494
|
+
margin-top: 10px;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
.debug {
|
|
498
|
+
margin-top: 20px;
|
|
499
|
+
padding: 10px;
|
|
500
|
+
background: #f5f5f5;
|
|
501
|
+
border-radius: 4px;
|
|
502
|
+
font-size: 0.9em;
|
|
503
|
+
color: #666;
|
|
504
|
+
}
|
|
505
|
+
</style>`;
|
|
506
|
+
export const appReactRouter = `
|
|
507
|
+
import React, { useState, useEffect } from 'react';
|
|
508
|
+
|
|
509
|
+
const tabs = [
|
|
510
|
+
{ id: 'home', name: 'Home' },
|
|
511
|
+
{ id: 'about', name: 'About' },
|
|
512
|
+
{ id: 'contact', name: 'Contact' }
|
|
513
|
+
];
|
|
514
|
+
|
|
515
|
+
const App = () => {
|
|
516
|
+
const [currentTab, setCurrentTab] = useState('home');
|
|
517
|
+
const [currentSort, setCurrentSort] = useState('latest');
|
|
518
|
+
const [currentHash, setCurrentHash] = useState('');
|
|
519
|
+
|
|
520
|
+
const updateHash = (newTab?: string, newSort?: string) => {
|
|
521
|
+
const params = new URLSearchParams();
|
|
522
|
+
params.set('tab', newTab ?? currentTab);
|
|
523
|
+
if ((newSort ?? currentSort) !== 'latest') {
|
|
524
|
+
params.set('sort', newSort ?? currentSort);
|
|
525
|
+
}
|
|
526
|
+
window.location.hash = params.toString();
|
|
527
|
+
setCurrentHash(window.location.hash);
|
|
528
|
+
if (newTab) setCurrentTab(newTab);
|
|
529
|
+
if (newSort) setCurrentSort(newSort);
|
|
530
|
+
};
|
|
531
|
+
|
|
532
|
+
const parseHash = () => {
|
|
533
|
+
const params = new URLSearchParams(window.location.hash.slice(1));
|
|
534
|
+
setCurrentTab(params.get('tab') || 'home');
|
|
535
|
+
setCurrentSort(params.get('sort') || 'latest');
|
|
536
|
+
setCurrentHash(window.location.hash);
|
|
537
|
+
};
|
|
538
|
+
|
|
539
|
+
useEffect(() => {
|
|
540
|
+
if (!window.location.hash) {
|
|
541
|
+
updateHash(currentTab, currentSort);
|
|
542
|
+
} else {
|
|
543
|
+
parseHash();
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
const handleHashChange = () => parseHash();
|
|
547
|
+
window.addEventListener('hashchange', handleHashChange);
|
|
548
|
+
return () => window.removeEventListener('hashchange', handleHashChange);
|
|
549
|
+
}, []);
|
|
550
|
+
|
|
551
|
+
return (
|
|
552
|
+
<div className="max-w-3xl mx-auto p-5">
|
|
553
|
+
<nav className="flex gap-3 mb-5">
|
|
554
|
+
{tabs.map(tab => (
|
|
555
|
+
<button
|
|
556
|
+
key={tab.id}
|
|
557
|
+
onClick={() => updateHash(tab.id)}
|
|
558
|
+
className={\`px-4 py-2 border rounded-md cursor-pointer
|
|
559
|
+
$\{currentTab === tab.id
|
|
560
|
+
? 'bg-green-500 text-white border-green-500'
|
|
561
|
+
: 'bg-white border-gray-300 hover:bg-gray-50'}\`}
|
|
562
|
+
>
|
|
563
|
+
{tab.name}
|
|
564
|
+
</button>
|
|
565
|
+
))}
|
|
566
|
+
</nav>
|
|
567
|
+
|
|
568
|
+
<div className="p-5 border rounded-md">
|
|
569
|
+
{currentTab === 'home' && (
|
|
570
|
+
<div className="mb-5">
|
|
571
|
+
<h2 className="text-xl font-bold">Home</h2>
|
|
572
|
+
<p>Welcome to the home tab!</p>
|
|
573
|
+
|
|
574
|
+
<div className="mt-3 flex gap-3">
|
|
575
|
+
{['latest', 'popular'].map(sort => (
|
|
576
|
+
<button
|
|
577
|
+
key={sort}
|
|
578
|
+
onClick={() => updateHash(currentTab, sort)}
|
|
579
|
+
className={\`px-4 py-2 border rounded-md cursor-pointer
|
|
580
|
+
$\{
|
|
581
|
+
currentSort === sort
|
|
582
|
+
? 'bg-green-500 text-white border-green-500'
|
|
583
|
+
: 'bg-white border-gray-300 hover:bg-gray-50'
|
|
584
|
+
}\`}
|
|
585
|
+
>
|
|
586
|
+
{sort}
|
|
587
|
+
</button>
|
|
588
|
+
))}
|
|
589
|
+
</div>
|
|
590
|
+
</div>
|
|
591
|
+
)}
|
|
592
|
+
|
|
593
|
+
{currentTab === 'about' && (
|
|
594
|
+
<div>
|
|
595
|
+
<h2 className="text-xl font-bold">About</h2>
|
|
596
|
+
<p>This is the about section</p>
|
|
597
|
+
</div>
|
|
598
|
+
)}
|
|
599
|
+
|
|
600
|
+
{currentTab === 'contact' && (
|
|
601
|
+
<div>
|
|
602
|
+
<h2 className="text-xl font-bold">Contact</h2>
|
|
603
|
+
<p>Contact information here</p>
|
|
604
|
+
</div>
|
|
605
|
+
)}
|
|
606
|
+
</div>
|
|
607
|
+
|
|
608
|
+
<div className="mt-5 p-3 bg-gray-100 rounded-md text-sm text-gray-600">
|
|
609
|
+
<p>Current Tab: {currentTab}</p>
|
|
610
|
+
<p>Current Sort: {currentSort}</p>
|
|
611
|
+
<p>Current Hash: {currentHash}</p>
|
|
612
|
+
</div>
|
|
613
|
+
</div>
|
|
614
|
+
);
|
|
615
|
+
};
|
|
616
|
+
|
|
617
|
+
export default App
|
|
618
|
+
`;
|
|
@@ -178,7 +178,7 @@ export declare function buildRunsFilterSearchbarSchema({ paths, usernames, folde
|
|
|
178
178
|
label: string;
|
|
179
179
|
icon: typeof Zap;
|
|
180
180
|
options: {
|
|
181
|
-
label:
|
|
181
|
+
label: "Google" | "Schedule" | "HTTP" | "WebSocket" | "Postgres" | "Kafka" | "NATS" | "MQTT" | "SQS" | "GCP Pub/Sub" | "Email" | "Webhook" | "Default Email";
|
|
182
182
|
value: JobTriggerKind;
|
|
183
183
|
}[];
|
|
184
184
|
allowNegative: true;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import Button from '../common/button/Button.svelte';
|
|
3
3
|
import Label from '../Label.svelte';
|
|
4
4
|
import TextInput from '../text_input/TextInput.svelte';
|
|
5
|
-
import { AIMode } from '../copilot/chat/AIChatManager.svelte';
|
|
5
|
+
import { AIMode, getVisibleAIModes } from '../copilot/chat/AIChatManager.svelte';
|
|
6
6
|
const MAX_CUSTOM_PROMPT_LENGTH = 5000;
|
|
7
7
|
let { open = $bindable(false), customPrompts = $bindable(), onSave, onReset, hasChanges, scope = 'user' } = $props();
|
|
8
8
|
const placeholders = {
|
|
@@ -11,6 +11,7 @@ const placeholders = {
|
|
|
11
11
|
[AIMode.APP]: 'Enter custom instructions for UI and app development',
|
|
12
12
|
[AIMode.NAVIGATOR]: 'Enter custom instructions for navigation and guidance',
|
|
13
13
|
[AIMode.API]: 'Enter custom instructions for API interactions and integrations',
|
|
14
|
+
[AIMode.GLOBAL]: 'Enter custom instructions for workspace-wide draft assistance',
|
|
14
15
|
[AIMode.ASK]: 'Enter custom instructions for general questions and assistance'
|
|
15
16
|
};
|
|
16
17
|
const modeLabels = {
|
|
@@ -19,8 +20,10 @@ const modeLabels = {
|
|
|
19
20
|
[AIMode.APP]: 'App Mode',
|
|
20
21
|
[AIMode.NAVIGATOR]: 'Navigator Mode',
|
|
21
22
|
[AIMode.API]: 'API Mode',
|
|
23
|
+
[AIMode.GLOBAL]: 'Global Mode',
|
|
22
24
|
[AIMode.ASK]: 'Ask Mode'
|
|
23
25
|
};
|
|
26
|
+
let visibleModes = $derived(getVisibleAIModes());
|
|
24
27
|
function handleSave() {
|
|
25
28
|
onSave?.();
|
|
26
29
|
open = false;
|
|
@@ -52,7 +55,7 @@ function handleReset() {
|
|
|
52
55
|
{/if}
|
|
53
56
|
</div>
|
|
54
57
|
|
|
55
|
-
{#each
|
|
58
|
+
{#each visibleModes as mode (mode)}
|
|
56
59
|
<div class="flex flex-col gap-2 pb-4 last:border-b-0">
|
|
57
60
|
<Label label={modeLabels[mode]} for={`custom-prompt-${mode}`}>
|
|
58
61
|
<TextInput
|
|
@@ -11,6 +11,6 @@ interface Props {
|
|
|
11
11
|
event_type_filters?: string[];
|
|
12
12
|
path?: string;
|
|
13
13
|
}
|
|
14
|
-
declare const AzureTriggerEditorConfigSection: import("svelte").Component<Props, {}, "
|
|
14
|
+
declare const AzureTriggerEditorConfigSection: import("svelte").Component<Props, {}, "azure_resource_path" | "azure_mode" | "scope_resource_id" | "topic_name" | "subscription_name" | "event_type_filters" | "isValid">;
|
|
15
15
|
type AzureTriggerEditorConfigSection = ReturnType<typeof AzureTriggerEditorConfigSection>;
|
|
16
16
|
export default AzureTriggerEditorConfigSection;
|