@floless/app 0.5.1

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.
Binary file
@@ -0,0 +1,98 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <svg
3
+ width="186.09097"
4
+ height="177.81497"
5
+ viewBox="0 0 186.09097 177.81497"
6
+ fill="none"
7
+ version="1.1"
8
+ id="svg9"
9
+ sodipodi:docname="favicon.svg"
10
+ inkscape:export-filename="apple-touch-icon.png"
11
+ inkscape:export-xdpi="101.83425"
12
+ inkscape:export-ydpi="101.83425"
13
+ inkscape:version="1.3.1 (91b66b0783, 2023-11-16)"
14
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
15
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
16
+ xmlns="http://www.w3.org/2000/svg"
17
+ xmlns:svg="http://www.w3.org/2000/svg">
18
+ <defs
19
+ id="defs9" />
20
+ <sodipodi:namedview
21
+ id="namedview9"
22
+ pagecolor="#ffffff"
23
+ bordercolor="#000000"
24
+ borderopacity="0.25"
25
+ inkscape:showpageshadow="2"
26
+ inkscape:pageopacity="0.0"
27
+ inkscape:pagecheckerboard="0"
28
+ inkscape:deskcolor="#d1d1d1"
29
+ inkscape:zoom="3.2464405"
30
+ inkscape:cx="45.896421"
31
+ inkscape:cy="97.79942"
32
+ inkscape:window-width="1920"
33
+ inkscape:window-height="1009"
34
+ inkscape:window-x="-8"
35
+ inkscape:window-y="-8"
36
+ inkscape:window-maximized="1"
37
+ inkscape:current-layer="svg9" />
38
+ <path
39
+ d="m 90.59682,24.776705 -61.1056,0.0011 c -6.7848,10e-5 -13.0292,5.9857 -17.3491,11.7712 -3.7996001,5.0887 -6.3061701,11.9297 -6.3061701,18.5289 0,8.1722 2.24347,15.3031 6.3061701,21.2537 4.2061,6.1608 11.1613,12.97 17.3491,12.97 h 126.7248 c 6.614,0 12.777,3.1335 17.076,8.056 4.477,5.125905 6.963,13.141905 6.963,19.945905 0,7.551 -1.62,12.785 -5.166,18.312 -3.822,5.958 -18.087,14.161 -18.087,14.161"
40
+ stroke="#3b82f6"
41
+ stroke-width="11.6719"
42
+ stroke-linecap="round"
43
+ id="path1" />
44
+ <path
45
+ d="m 87.23132,7.267455 16.5877,18.07555"
46
+ stroke="#3b82f6"
47
+ stroke-width="11.6712"
48
+ stroke-linecap="round"
49
+ id="path2" />
50
+ <path
51
+ d="m 87.23132,43.481105 16.5877,-18.0756"
52
+ stroke="#3b82f6"
53
+ stroke-width="11.6712"
54
+ stroke-linecap="round"
55
+ id="path3" />
56
+ <path
57
+ d="m 75.64862,135.29251 16.5877,18.076"
58
+ stroke="#3b82f6"
59
+ stroke-width="11.6712"
60
+ stroke-linecap="round"
61
+ id="path4" />
62
+ <path
63
+ d="m 75.64862,171.50651 16.5877,-18.075"
64
+ stroke="#3b82f6"
65
+ stroke-width="11.6712"
66
+ stroke-linecap="round"
67
+ id="path5" />
68
+ <path
69
+ d="m 58.55282,153.01251 h 20.8079"
70
+ stroke="#3b82f6"
71
+ stroke-width="11.6712"
72
+ stroke-linecap="square"
73
+ id="path6" />
74
+ <path
75
+ d="m 30.52942,173.45451 c 10.4383,0 18.9002,-8.462 18.9002,-18.9 0,-10.438 -8.4619,-18.9 -18.9002,-18.9 -10.4382,0 -18.9001,8.462 -18.9001,18.9 0,10.438 8.4619,18.9 18.9001,18.9 z"
76
+ fill="#ffffff"
77
+ stroke="#3b82f6"
78
+ stroke-width="8.72093"
79
+ stroke-linecap="round"
80
+ stroke-linejoin="round"
81
+ id="path7" />
82
+ <path
83
+ d="m 135.20702,173.45451 c 10.438,0 18.9,-8.462 18.9,-18.9 0,-10.438 -8.462,-18.9 -18.9,-18.9 -10.438,0 -18.9,8.462 -18.9,18.9 0,10.438 8.462,18.9 18.9,18.9 z"
84
+ fill="#ffffff"
85
+ stroke="#3b82f6"
86
+ stroke-width="8.72093"
87
+ stroke-linecap="round"
88
+ stroke-linejoin="round"
89
+ id="path8" />
90
+ <path
91
+ d="m 146.82902,42.160705 c 10.438,0 18.9,-8.4619 18.9,-18.9001 0,-10.4383 -8.462,-18.90014 -18.9,-18.90014 -10.438,0 -18.9,8.46184 -18.9,18.90014 0,10.4382 8.462,18.9001 18.9,18.9001 z"
92
+ fill="#ffffff"
93
+ stroke="#3b82f6"
94
+ stroke-width="8.72093"
95
+ stroke-linecap="round"
96
+ stroke-linejoin="round"
97
+ id="path9" />
98
+ </svg>
@@ -0,0 +1,484 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>floless.app — prompt-native front door to AWARE</title>
7
+ <meta name="theme-color" content="#1E3A5F" />
8
+ <!-- Favicons (mirrors floless-web) -->
9
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg?v=2" />
10
+ <link rel="icon" type="image/x-icon" href="/favicon.ico?v=2" />
11
+ <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=2" />
12
+ <link rel="stylesheet" href="app.css">
13
+ </head>
14
+ <body>
15
+ <div class="app" id="app">
16
+
17
+ <header>
18
+ <div class="header-left">
19
+ <button id="menu-btn" class="hamburger" data-tip="Menu" aria-label="Menu">≡</button>
20
+ <div class="brand">
21
+ <span class="mark" aria-hidden="true">
22
+ <svg viewBox="0 0 192 181" fill="none" xmlns="http://www.w3.org/2000/svg">
23
+ <path d="M93.4818 26.2302L32.3762 26.2313C25.5914 26.2314 19.347 32.217 15.0271 38.0025C11.2275 43.0912 8.72093 49.9322 8.72093 56.5314C8.72093 64.7036 10.9644 71.8345 15.0271 77.7851C19.2332 83.9459 26.1884 90.7551 32.3762 90.7551H159.101C165.715 90.7551 171.878 93.8886 176.177 98.8111C180.654 103.937 183.14 111.953 183.14 118.757C183.14 126.308 181.52 131.542 177.974 137.069C174.152 143.027 159.887 151.23 159.887 151.23" stroke="currentColor" stroke-width="11.6719" stroke-linecap="round"/>
24
+ <path d="M90.1163 8.72095L106.704 26.7965" stroke="currentColor" stroke-width="11.6712" stroke-linecap="round"/>
25
+ <path d="M90.1163 44.9346L106.704 26.859" stroke="currentColor" stroke-width="11.6712" stroke-linecap="round"/>
26
+ <path d="M78.5336 136.746L95.1213 154.822" stroke="currentColor" stroke-width="11.6712" stroke-linecap="round"/>
27
+ <path d="M78.5336 172.96L95.1213 154.885" stroke="currentColor" stroke-width="11.6712" stroke-linecap="round"/>
28
+ <path d="M61.4378 154.466H82.2457" stroke="currentColor" stroke-width="11.6712" stroke-linecap="square"/>
29
+ <path class="mark-node" d="M33.4144 174.908C43.8527 174.908 52.3146 166.446 52.3146 156.008C52.3146 145.57 43.8527 137.108 33.4144 137.108C22.9762 137.108 14.5143 145.57 14.5143 156.008C14.5143 166.446 22.9762 174.908 33.4144 174.908Z" stroke="currentColor" stroke-width="8.72093" stroke-linecap="round" stroke-linejoin="round"/>
30
+ <path class="mark-node" d="M138.092 174.908C148.53 174.908 156.992 166.446 156.992 156.008C156.992 145.57 148.53 137.108 138.092 137.108C127.654 137.108 119.192 145.57 119.192 156.008C119.192 166.446 127.654 174.908 138.092 174.908Z" stroke="currentColor" stroke-width="8.72093" stroke-linecap="round" stroke-linejoin="round"/>
31
+ <path class="mark-node" d="M149.714 43.6142C160.152 43.6142 168.614 35.1523 168.614 24.7141C168.614 14.2758 160.152 5.81396 149.714 5.81396C139.276 5.81396 130.814 14.2758 130.814 24.7141C130.814 35.1523 139.276 43.6142 149.714 43.6142Z" stroke="currentColor" stroke-width="8.72093" stroke-linecap="round" stroke-linejoin="round"/>
32
+ </svg>
33
+ </span>
34
+ <span class="name">FloLess</span>
35
+ </div>
36
+ </div>
37
+ <div class="controls">
38
+ <label id="wf-label">workflow</label>
39
+ <div class="wf-combo" id="wf-combo">
40
+ <button id="wf-trigger" class="wf-trigger" type="button" aria-haspopup="listbox" aria-expanded="false" aria-controls="wf-popover" aria-labelledby="wf-label wf-trigger-label" data-tip="Pick a workflow — type to search; grouped by provider">
41
+ <span class="wf-trigger-label" id="wf-trigger-label">loading…</span>
42
+ <span class="wf-dirty-dot" id="wf-dirty-dot" data-tip="Unsaved input changes — Save (Ctrl+S) to keep them" hidden>●</span>
43
+ <svg class="wf-caret" width="10" height="6" viewBox="0 0 10 6" aria-hidden="true"><path fill="currentColor" d="M0 0l5 6 5-6z"/></svg>
44
+ </button>
45
+ <div id="wf-popover" class="wf-popover" role="listbox" aria-label="Select workflow" hidden>
46
+ <div class="wf-search-wrap"><input id="wf-search" class="wf-search" type="text" placeholder="Search workflows…" autocomplete="off" aria-label="Search workflows" aria-controls="wf-list"></div>
47
+ <div class="wf-list" id="wf-list"></div>
48
+ </div>
49
+ </div>
50
+ <select id="prompt-select" hidden></select>
51
+ <button id="browse-btn" data-tip="Browse all installed agents">⊞ Agents</button>
52
+ <button id="routines-btn" data-tip="Routines — run a workflow on a schedule or a live trigger">⏱ Routines</button>
53
+ <span class="ctl-sep" aria-hidden="true"></span>
54
+ <span class="run-state" id="run-state"></span>
55
+ <button id="compile-btn" data-tip="Compile + approve → freeze the .lock">⎙ Compile</button>
56
+ <button id="sim-btn" data-tip="Simulate: stub every node from its output schema — no live host is contacted. Validates the workflow's composition end-to-end, even when the real agents aren't connected yet.">Simulate</button>
57
+ <button id="run-btn" data-tip="Run the workflow for real against the live host (uses the inputs; renders the report node in the HTML Viewer)">▶ Run workflow</button>
58
+ </div>
59
+ </header>
60
+
61
+ <aside class="chat" id="chat-panel">
62
+ <div class="panel-label">
63
+ <span>Narrative</span>
64
+ <span class="label-end">
65
+ <span class="role">curated · full chat in your terminal</span>
66
+ <button class="panel-toggle" data-side="left" data-tip="Collapse panel">‹</button>
67
+ </span>
68
+ </div>
69
+ <div class="collapsed-stub">
70
+ <button class="panel-toggle" data-side="left" data-tip="Expand">›</button>
71
+ <div class="vertical-label">Narrative</div>
72
+ <div class="stub-icon">💬</div>
73
+ </div>
74
+ <div class="host-banner">
75
+ <div class="host-line host-ok">✓ plugin: floless-aeco · <span id="agent-count-narr">—</span> agents available</div>
76
+ </div>
77
+ <div class="messages" id="messages"></div>
78
+ <div class="resize-handle resize-handle-right" data-resize="left" data-tip="Drag to resize · double-click to reset"></div>
79
+ </aside>
80
+
81
+ <main class="canvas">
82
+ <div class="panel-label">
83
+ <span>Canvas</span>
84
+ <span class="label-end">
85
+ <span class="role">transparency layer · read-mostly</span>
86
+ </span>
87
+ </div>
88
+ <div class="find-overlay" id="find-overlay">
89
+ <input type="text" id="find-input" placeholder="Find agent…">
90
+ <span class="find-count" id="find-count"></span>
91
+ <button class="find-close" id="find-close" data-tip="Close">×</button>
92
+ </div>
93
+ <div class="notes-strip" id="notes-strip" hidden></div>
94
+ <div class="topology" id="topology"></div>
95
+ <div class="canvas-toolbar">
96
+ <div class="toolbar-group">
97
+ <button class="tb-btn" id="zoom-out" data-tip="Zoom out">−</button>
98
+ <button class="tb-btn tb-pct" id="zoom-reset" data-tip="Reset to 100%">100%</button>
99
+ <button class="tb-btn" id="zoom-in" data-tip="Zoom in">+</button>
100
+ <button class="tb-btn" id="zoom-fit" data-tip="Fit the whole workflow to the screen (Home)">⤢</button>
101
+ </div>
102
+ </div>
103
+ <div class="hint" id="canvas-hint">Click any node to inspect. Star ★ a node to save it as a reusable Template.</div>
104
+ <div class="fav-bar" id="fav-bar">
105
+ <div class="fav-bar-label"><span class="star">★</span><span>Templates</span></div>
106
+ <div class="fav-chip-row" id="fav-chip-row"></div>
107
+ <div class="fav-bar-empty" id="fav-bar-empty">Star ★ a node to save it as a Template — reusable in any workflow.</div>
108
+ </div>
109
+ </main>
110
+
111
+ <aside class="inspect" id="inspect-panel">
112
+ <div class="resize-handle resize-handle-left" data-resize="right" data-tip="Drag to resize · double-click to reset"></div>
113
+ <div class="panel-label">
114
+ <span>Inspect</span>
115
+ <span class="label-end">
116
+ <span class="role" id="inspect-role">click an agent</span>
117
+ <button id="debug-btn" class="tweak-btn" data-tip="Re-run this exec node with the .NET debugger attached (Visual Studio)" hidden>⊟ Debug in VS</button>
118
+ <button id="tweak-btn" class="tweak-btn" data-tip="Ask the terminal AI to change just this node" hidden>✎ Tweak</button>
119
+ <button class="panel-toggle" data-side="right" data-tip="Collapse panel">›</button>
120
+ </span>
121
+ </div>
122
+ <div class="collapsed-stub">
123
+ <button class="panel-toggle" data-side="right" data-tip="Expand">‹</button>
124
+ <div class="vertical-label">Inspect</div>
125
+ <div class="stub-icon">⌕</div>
126
+ </div>
127
+ <div class="tabs" id="tabs">
128
+ <button data-tab="description" class="active">Description</button>
129
+ <button data-tab="skill">Skill</button>
130
+ <button data-tab="code">Code</button>
131
+ <button data-tab="execution">Execution</button>
132
+ </div>
133
+ <div class="inspect-body" id="inspect-body"></div>
134
+ </aside>
135
+
136
+ <footer>
137
+ <div class="status">
138
+ <span class="stat"><span class="dot"></span><span class="stat-val">runtime online</span></span>
139
+ <span class="sep">·</span>
140
+ <span class="stat"><span class="stat-key">agents</span><span class="stat-val" id="agents-count">—</span></span>
141
+ <span class="sep">·</span>
142
+ <span class="stat"><span class="stat-key">workflows</span><span class="stat-val" id="apps-count">—</span></span>
143
+ <span class="sep">·</span>
144
+ <span class="stat"><span class="stat-key">templates</span><span class="stat-val" id="fav-count">0</span></span>
145
+ <span class="sep">·</span>
146
+ <span class="stat stat-requests" id="req-stat" data-tip="Changes queued for your terminal AI — click to view & manage"><span class="stat-key">requests</span><span class="stat-val" id="req-count">0</span></span>
147
+ </div>
148
+ <span class="version-info">
149
+ <span class="aware-version" id="aware-version" data-tip="AWARE runtime version — the aware CLI/npm package this app drives"></span>
150
+ <span class="app-version" id="app-version" data-tip="floless.app build serving this window (installed build, or the dev build when run from source)"></span>
151
+ <button id="app-update" class="app-update" hidden></button>
152
+ </span>
153
+ </footer>
154
+ </div>
155
+
156
+ <div class="menu" id="menu" role="menu">
157
+ <button class="menu-item" data-action="open" role="menuitem">
158
+ <span class="menu-icon">⌸</span>
159
+ <span class="menu-label">Open</span>
160
+ <span class="menu-kbd">Ctrl+O</span>
161
+ </button>
162
+ <button class="menu-item" data-action="save" role="menuitem">
163
+ <span class="menu-icon">⤓</span>
164
+ <span class="menu-label">Save inputs</span>
165
+ <span class="menu-kbd">Ctrl+S</span>
166
+ </button>
167
+ <div class="menu-divider"></div>
168
+ <button class="menu-item" data-action="find" role="menuitem">
169
+ <span class="menu-icon">⌕</span>
170
+ <span class="menu-label">Find on canvas</span>
171
+ <span class="menu-kbd">Ctrl+F</span>
172
+ </button>
173
+ <div class="menu-divider"></div>
174
+ <button class="menu-item" data-action="graft" role="menuitem">
175
+ <span class="menu-icon">⊕</span>
176
+ <span class="menu-label">Graft into agent</span>
177
+ </button>
178
+ <button class="menu-item" data-action="bake" id="menu-bake-item" role="menuitem">
179
+ <span class="menu-icon">⊙</span>
180
+ <span class="menu-label" id="menu-bake-label">Bake into agent</span>
181
+ </button>
182
+ <div class="menu-divider"></div>
183
+ <button class="menu-item" data-action="integrations" role="menuitem">
184
+ <span class="menu-icon">⊟</span>
185
+ <span class="menu-label">Integrations</span>
186
+ <span class="menu-kbd">Ctrl+I</span>
187
+ </button>
188
+ <button class="menu-item" data-action="routines" role="menuitem">
189
+ <span class="menu-icon">⏱</span>
190
+ <span class="menu-label">Routines</span>
191
+ </button>
192
+ <!-- Start-on-login + Theme are sibling machine preferences (no divider between
193
+ them — UX review 2026-05-31). Start-on-login toggles the per-user logon
194
+ Scheduled Task that keeps the local server alive across logins; hidden unless
195
+ supported (Windows packaged build), JS unhides it from GET /api/autostart. -->
196
+ <div class="menu-theme menu-startup" id="menu-startup" hidden>
197
+ <span class="menu-label" data-tip="Starts the FloLess server automatically when you sign in, so your browser reconnects on its own">Start on startup</span>
198
+ <label class="rtn-toggle" aria-label="Start FloLess on startup">
199
+ <input type="checkbox" id="startup-toggle" role="switch">
200
+ <span class="rtn-toggle-track"></span>
201
+ </label>
202
+ </div>
203
+ <div class="menu-theme">
204
+ <span class="menu-label">Theme</span>
205
+ <div class="theme-toggle">
206
+ <button class="theme-btn" data-theme="light" data-tip="Light">☀</button>
207
+ <button class="theme-btn" data-theme="dark" data-tip="Dark">☾</button>
208
+ </div>
209
+ </div>
210
+ </div>
211
+
212
+ <!-- HTML Viewer — renders the report HTML an exec node returned, in-app.
213
+ Double-click a report node on the canvas to run it and open this. -->
214
+ <div class="modal-backdrop report-backdrop" id="report-modal">
215
+ <div class="modal report-viewer">
216
+ <div class="report-head">
217
+ <div class="report-titles">
218
+ <div class="modal-title" id="report-title">HTML Viewer</div>
219
+ <div class="modal-sub" id="report-sub">Rendered from the live run — never composed by the UI.</div>
220
+ </div>
221
+ <div class="report-actions">
222
+ <button id="report-open" class="ghost" data-tip="Open the report in a new browser tab">↗ Open</button>
223
+ <button id="report-close" data-tip="Close">×</button>
224
+ </div>
225
+ </div>
226
+ <div class="report-stage" id="report-stage">
227
+ <iframe id="report-frame" sandbox="allow-same-origin" title="Report"></iframe>
228
+ <div class="report-overlay" id="report-overlay" hidden></div>
229
+ </div>
230
+ </div>
231
+ </div>
232
+
233
+ <div class="toast-container" id="toast-container"></div>
234
+
235
+ <!-- Reusable styled prompt/form modal — used for node inputs (double-click an
236
+ input node) and Tweak. Replaces native window.prompt so dialogs match the
237
+ app's style and scale. Fields are injected into #form-modal-body. -->
238
+ <div class="modal-backdrop" id="form-modal">
239
+ <div class="modal">
240
+ <div class="modal-title" id="form-modal-title">Edit</div>
241
+ <div class="modal-sub" id="form-modal-sub"></div>
242
+ <div id="form-modal-body"></div>
243
+ <div class="modal-actions">
244
+ <button id="form-modal-cancel">Cancel</button>
245
+ <button id="form-modal-ok" class="primary">Save</button>
246
+ </div>
247
+ </div>
248
+ </div>
249
+
250
+ <!-- Save-on-switch confirmation — shown when switching workflows with unsaved
251
+ input changes. Reuses the shared modal styling; no new backdrop look. -->
252
+ <div class="modal-backdrop" id="confirm-modal">
253
+ <div class="modal">
254
+ <div class="modal-title">Unsaved input changes</div>
255
+ <div class="modal-sub" id="confirm-modal-sub"></div>
256
+ <div class="modal-actions">
257
+ <button id="confirm-dont-save">Don’t save</button>
258
+ <button id="confirm-cancel">Cancel</button>
259
+ <button id="confirm-save" class="primary">Save</button>
260
+ </div>
261
+ </div>
262
+ </div>
263
+
264
+ <div class="modal-backdrop" id="add-fav-modal">
265
+ <div class="modal">
266
+ <div class="modal-title">Save as Template</div>
267
+ <div class="modal-sub" id="add-fav-sub">Save this node as a reusable Template — usable in any workflow.</div>
268
+ <div class="modal-field">
269
+ <label for="fav-name">Name</label>
270
+ <input id="fav-name" type="text">
271
+ </div>
272
+ <div class="modal-field">
273
+ <label for="fav-cat">Category</label>
274
+ <input id="fav-cat" type="text" placeholder="e.g. Tekla, MEP, Fab Pipeline">
275
+ <div class="modal-categories" id="fav-cat-suggest"></div>
276
+ </div>
277
+ <div class="modal-actions">
278
+ <button id="fav-cancel">Cancel</button>
279
+ <button id="fav-save" class="primary">★ Save</button>
280
+ </div>
281
+ </div>
282
+ </div>
283
+
284
+ <div class="modal-backdrop" id="lib-modal">
285
+ <div class="modal library">
286
+ <div class="modal-title">Agent Library</div>
287
+ <div class="modal-sub">All installed agents · star a command to save it as a Template.</div>
288
+ <input id="lib-search" class="lib-search" type="text" placeholder="Search (tekla, slack, file, …)">
289
+ <div class="lib-list" id="lib-list"></div>
290
+ <div class="modal-actions">
291
+ <button id="lib-graft" style="margin-right:auto;" data-tip="Build a new agent from a tool you own — a DLL, C# source, NuGet package, or API spec.">⊕ Graft new agent</button>
292
+ <button id="lib-close">Close</button>
293
+ </div>
294
+ </div>
295
+ </div>
296
+
297
+ <div class="modal-backdrop" id="integrations-modal">
298
+ <div class="modal integrations">
299
+ <div class="modal-title">Integrations</div>
300
+ <div class="modal-sub">What FloLess can talk to. FloLess only displays connection state — auth happens in your terminal.</div>
301
+ <div class="integrations-hint">
302
+ Tokens are stored encrypted by AWARE under <code>~/.aware/credentials/</code>. To connect or refresh, run <code>aware connect &lt;name&gt;</code> in claude-code (or codex / opencode). FloLess never touches secrets directly.
303
+ </div>
304
+ <div class="integrations-list" id="integrations-list"></div>
305
+ <div class="modal-actions">
306
+ <button id="integrations-close">Close</button>
307
+ </div>
308
+ </div>
309
+ </div>
310
+
311
+ <div class="modal-backdrop" id="requests-modal">
312
+ <div class="modal requests">
313
+ <div class="modal-title">Requests for your terminal AI</div>
314
+ <div class="modal-sub">The UI can’t edit workflows itself — these are the changes it queued for your terminal AI (Claude Code / Codex / OpenCode) to apply. Copy one to paste, or clear ones already handled.</div>
315
+ <div class="requests-list" id="requests-list"></div>
316
+ <div class="modal-actions">
317
+ <button id="requests-clear">Clear all</button>
318
+ <button id="requests-copy">Copy all</button>
319
+ <button id="requests-close" class="primary">Close</button>
320
+ </div>
321
+ </div>
322
+ </div>
323
+
324
+ <!-- Routines — scheduled .flo runs. The list; the add/edit form is its own modal. -->
325
+ <div class="modal-backdrop" id="routines-modal">
326
+ <div class="modal routines">
327
+ <div class="modal-title">Routines</div>
328
+ <div class="modal-sub">Run a workflow automatically — on a schedule, or on a live trigger (e.g. whenever your model changes). Runs happen on this machine through your live host — exactly like clicking ▶ Run workflow.</div>
329
+ <div class="rtn-quota" id="rtn-quota"></div>
330
+ <div class="routines-list" id="routines-list"></div>
331
+ <div class="modal-actions">
332
+ <button id="rtn-add" class="primary">+ Add routine</button>
333
+ <button id="routines-close">Close</button>
334
+ </div>
335
+ </div>
336
+ </div>
337
+
338
+ <!-- Routine add/edit form. Opened on top of the list modal. -->
339
+ <div class="modal-backdrop" id="routine-edit-modal">
340
+ <div class="modal routine-edit">
341
+ <div class="modal-title" id="rtn-edit-title">New routine</div>
342
+ <div class="modal-sub">Pick a workflow and when it should run.</div>
343
+ <div class="modal-field">
344
+ <label for="rtn-name">Name</label>
345
+ <input id="rtn-name" type="text" placeholder="e.g. Morning BOM export" autocomplete="off">
346
+ </div>
347
+ <div class="modal-field">
348
+ <label for="rtn-workflow">Workflow</label>
349
+ <select id="rtn-workflow"></select>
350
+ </div>
351
+ <!-- Routine kind chooser — schedule vs event-trigger. Hidden unless the picked
352
+ workflow is trigger-eligible (its source is a streaming lifecycle:start command). -->
353
+ <div class="modal-field" id="rtn-mode-field" hidden>
354
+ <label>Runs</label>
355
+ <div class="rtn-mode" role="group" aria-label="Routine kind">
356
+ <button type="button" class="rtn-mode-btn active" data-mode="schedule" aria-pressed="true">On a schedule</button>
357
+ <button type="button" class="rtn-mode-btn" data-mode="trigger" aria-pressed="false">On a trigger</button>
358
+ </div>
359
+ </div>
360
+ <div class="modal-field" id="rtn-sched-kind-field">
361
+ <label for="rtn-kind">Schedule</label>
362
+ <select id="rtn-kind" class="rtn-kind-select">
363
+ <option value="daily">Every day</option>
364
+ <option value="weekdays">Every weekday (Mon–Fri)</option>
365
+ <option value="weekly">Specific days</option>
366
+ <option value="hourly">Every N hours</option>
367
+ <option value="cron">Custom (cron)</option>
368
+ </select>
369
+ </div>
370
+ <div id="rtn-sched-detail">
371
+ <div class="modal-field" data-sched="hourly" hidden>
372
+ <label for="rtn-everyhours">Run every</label>
373
+ <select id="rtn-everyhours" class="rtn-kind-select">
374
+ <option value="1">Every hour</option>
375
+ <option value="2" selected>Every 2 hours</option>
376
+ <option value="3">Every 3 hours</option>
377
+ <option value="4">Every 4 hours</option>
378
+ <option value="6">Every 6 hours</option>
379
+ <option value="8">Every 8 hours</option>
380
+ <option value="12">Every 12 hours</option>
381
+ <option value="24">Every 24 hours</option>
382
+ </select>
383
+ </div>
384
+ <div class="modal-field" data-sched="weekly" hidden>
385
+ <label>Days</label>
386
+ <div class="rtn-days" id="rtn-days"></div>
387
+ </div>
388
+ <div class="modal-field" data-sched="daily weekdays weekly" id="rtn-time-field">
389
+ <label for="rtn-hour">At (local time)</label>
390
+ <div class="rtn-time">
391
+ <select id="rtn-hour" aria-label="Hour"></select>
392
+ <span class="rtn-time-sep">:</span>
393
+ <select id="rtn-minute" aria-label="Minute"></select>
394
+ </div>
395
+ </div>
396
+ <div class="modal-field" data-sched="cron" hidden>
397
+ <label for="rtn-cron">Cron expression</label>
398
+ <input id="rtn-cron" type="text" placeholder="0 4 * * 1" autocomplete="off" spellcheck="false">
399
+ <div class="rtn-cron-hint"><code>min hour day-of-month month day-of-week</code> · e.g. <code>0 4 * * 1</code> = Mondays 04:00. Runs no finer than the ~1-minute scheduler tick.</div>
400
+ </div>
401
+ </div>
402
+ <!-- Shown instead of the schedule builder when "On a trigger" is chosen.
403
+ Read-only: v1 derives the source command server-side (no user-set params). -->
404
+ <div class="modal-field" id="rtn-trigger-field" hidden>
405
+ <label id="rtn-trigger-label">Triggers on</label>
406
+ <div class="rtn-trigger-info" role="group" aria-labelledby="rtn-trigger-label">
407
+ <span class="rtn-trigger-src" id="rtn-trigger-src">—</span>
408
+ <div class="rtn-trigger-note">Runs every time this source emits an event — no schedule needed.</div>
409
+ </div>
410
+ </div>
411
+ <div class="modal-field" id="rtn-inputs-field" hidden>
412
+ <label>Inputs</label>
413
+ <div id="rtn-inputs"></div>
414
+ </div>
415
+ <div class="modal-field rtn-enabled-field">
416
+ <label class="rtn-toggle">
417
+ <input type="checkbox" id="rtn-enabled" checked>
418
+ <span class="rtn-toggle-track"></span>
419
+ <span class="rtn-toggle-label" id="rtn-enabled-label">Enabled</span>
420
+ </label>
421
+ </div>
422
+ <div class="modal-actions">
423
+ <button id="rtn-edit-cancel">Cancel</button>
424
+ <button id="rtn-edit-save" class="primary">Save routine</button>
425
+ </div>
426
+ </div>
427
+ </div>
428
+
429
+ <!-- Routine delete confirmation — destructive, so Cancel holds focus (Enter cancels)
430
+ and the Delete button is danger-on-hover, never the accent primary. -->
431
+ <div class="modal-backdrop" id="rtn-delete-modal">
432
+ <div class="modal">
433
+ <div class="modal-title">Delete routine</div>
434
+ <div class="modal-sub" id="rtn-delete-sub"></div>
435
+ <div class="modal-actions">
436
+ <button id="rtn-delete-cancel">Cancel</button>
437
+ <button id="rtn-delete-confirm">Delete</button>
438
+ </div>
439
+ </div>
440
+ </div>
441
+
442
+ <!-- Graft into agent — build an agent from a foreign tool (DLL / C# source /
443
+ NuGet / OpenAPI / …). The wizard body (#graft-body) is built per-step in
444
+ aware.js. AWARE reads the source + builds the agent (incl. its Tekla
445
+ model-plugin recipe); floless only stages, previews, and surfaces it. -->
446
+ <div class="modal-backdrop" id="graft-modal">
447
+ <div class="modal graft">
448
+ <div class="modal-title" id="graft-title">Graft into agent</div>
449
+ <div class="modal-sub" id="graft-sub">Point at a DLL, package, or API spec — AWARE reads it and builds an agent you can drop into any workflow.</div>
450
+ <div id="graft-body"></div>
451
+ <div class="modal-actions" id="graft-actions">
452
+ <button id="graft-back" style="margin-right:auto;" hidden>‹ Back</button>
453
+ <button id="graft-cancel">Cancel</button>
454
+ <button id="graft-primary" class="primary" disabled>Introspect</button>
455
+ </div>
456
+ </div>
457
+ </div>
458
+
459
+ <!-- Bake into agent — preview + confirm. Packages the workflow as a reusable
460
+ agent (exposes-as-agent) and reinstalls so AWARE synthesizes it. -->
461
+ <div class="modal-backdrop" id="bake-modal">
462
+ <div class="modal">
463
+ <div class="modal-title" id="bake-title">Bake into agent</div>
464
+ <div class="modal-sub">Packages this workflow as a reusable agent. AWARE reinstalls it with an exposed interface, then it appears in the Agents library as a single callable node.</div>
465
+ <div id="bake-body">
466
+ <div class="modal-field">
467
+ <label>Agent name</label>
468
+ <div id="bake-name" class="bake-name"></div>
469
+ </div>
470
+ <div class="modal-field">
471
+ <label>Agent inputs</label>
472
+ <div id="bake-inputs" class="bake-inputs"></div>
473
+ </div>
474
+ </div>
475
+ <div class="modal-actions">
476
+ <button id="bake-cancel">Cancel</button>
477
+ <button id="bake-confirm" class="primary">⊙ Bake</button>
478
+ </div>
479
+ </div>
480
+ </div>
481
+ <script src="app.js"></script>
482
+ <script src="aware.js"></script>
483
+ </body>
484
+ </html>