@floless/app 0.43.0 → 0.44.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.
@@ -0,0 +1,294 @@
1
+ app: steel-to-ifc
2
+ version: 0.1.0
3
+ display-name: Steel to IFC
4
+ description: |
5
+ Bake a read steel model OUT to a universal IFC file — open it in Tekla, SDS2, Revit or
6
+ Navisworks. Companion to steel-from-drawings: that app reads a drawing into a 3D scene and shows
7
+ it; this one writes the SAME scene to an IFC file (IfcColumn/IfcBeam as extruded sections on the
8
+ real grid) so you can take the schematic model straight into your detailing tool and finish there.
9
+
10
+ Same terminal-bake pattern — the FloLess way: your AI terminal bakes the scene inline
11
+ (read-strategy: bake); a deterministic, MODEL-FREE exec node writes the .ifc (no Tekla needed to
12
+ export — it never touches a Tekla model, just writes the file). Ships with the same EXAMPLE
13
+ frame so it runs out of the box; the floless-app-steel-from-drawings skill bakes your drawing's
14
+ scene into both apps so the IFC matches what you saw in 3D.
15
+ exposes-as-agent: false
16
+ inputs:
17
+ # BAKED at compose time: the terminal AI reads this drawing and writes the `scene` block below
18
+ # (the run never reads the drawing). read-strategy: bake surfaces "Re-read & re-bake ▸".
19
+ drawing:
20
+ type: image
21
+ widget: file
22
+ accept: [pdf, png, jpg]
23
+ read-strategy: bake
24
+ description: A structural steel drawing — baked into the scene below, then written out as IFC; swap it to re-read & re-bake.
25
+ output_path:
26
+ type: string
27
+ default: steel-from-drawings.ifc
28
+ description: Where to write the .ifc — FloLess fills this with your Downloads folder; editable per run.
29
+ requires:
30
+ - ifc@0.1.x
31
+ layout: linear
32
+ nodes:
33
+ # Model-free exec: reads the baked `scene` and writes a valid IFC4 file (IfcColumn/IfcBeam as
34
+ # extruded rectangle sections on the real grid), returning a summary report. NEVER derefs `model`
35
+ # (no Tekla needed); writes the .ifc via System.IO to the user's Downloads (or home). Re-bake —
36
+ # or the floless-app-steel-from-drawings skill — replaces `scene` with YOUR drawing's read.
37
+ - id: bake-ifc
38
+ agent: ifc
39
+ command: write
40
+ config:
41
+ scene:
42
+ meta:
43
+ name: "Example \u2014 steel framing (sample, not your drawing)"
44
+ units: mm
45
+ up: z
46
+ groups:
47
+ - key: column
48
+ label: Columns (HSS6x6x3/8)
49
+ color: '#60a5fa'
50
+ - key: beam
51
+ label: Beams (W10x33)
52
+ color: '#94a3b8'
53
+ elements:
54
+ - id: COL-1A
55
+ group: column
56
+ kind: box
57
+ from:
58
+ - 0
59
+ - 0
60
+ - 0
61
+ to:
62
+ - 0
63
+ - 0
64
+ - 4500
65
+ section:
66
+ w: 150
67
+ d: 150
68
+ meta:
69
+ profile: HSS6x6x3/8
70
+ grid: 1-A
71
+ - id: COL-1B
72
+ group: column
73
+ kind: box
74
+ from:
75
+ - 0
76
+ - 6000
77
+ - 0
78
+ to:
79
+ - 0
80
+ - 6000
81
+ - 4500
82
+ section:
83
+ w: 150
84
+ d: 150
85
+ meta:
86
+ profile: HSS6x6x3/8
87
+ grid: 1-B
88
+ - id: COL-2A
89
+ group: column
90
+ kind: box
91
+ from:
92
+ - 6000
93
+ - 0
94
+ - 0
95
+ to:
96
+ - 6000
97
+ - 0
98
+ - 4500
99
+ section:
100
+ w: 150
101
+ d: 150
102
+ meta:
103
+ profile: HSS6x6x3/8
104
+ grid: 2-A
105
+ - id: COL-2B
106
+ group: column
107
+ kind: box
108
+ from:
109
+ - 6000
110
+ - 6000
111
+ - 0
112
+ to:
113
+ - 6000
114
+ - 6000
115
+ - 4500
116
+ section:
117
+ w: 150
118
+ d: 150
119
+ meta:
120
+ profile: HSS6x6x3/8
121
+ grid: 2-B
122
+ - id: COL-3A
123
+ group: column
124
+ kind: box
125
+ from:
126
+ - 12000
127
+ - 0
128
+ - 0
129
+ to:
130
+ - 12000
131
+ - 0
132
+ - 4500
133
+ section:
134
+ w: 150
135
+ d: 150
136
+ meta:
137
+ profile: HSS6x6x3/8
138
+ grid: 3-A
139
+ - id: COL-3B
140
+ group: column
141
+ kind: box
142
+ from:
143
+ - 12000
144
+ - 6000
145
+ - 0
146
+ to:
147
+ - 12000
148
+ - 6000
149
+ - 4500
150
+ section:
151
+ w: 150
152
+ d: 150
153
+ meta:
154
+ profile: HSS6x6x3/8
155
+ grid: 3-B
156
+ - id: BM-12A
157
+ group: beam
158
+ kind: box
159
+ from:
160
+ - 0
161
+ - 0
162
+ - 4500
163
+ to:
164
+ - 6000
165
+ - 0
166
+ - 4500
167
+ section:
168
+ w: 150
169
+ d: 250
170
+ meta:
171
+ profile: W10x33
172
+ - id: BM-23A
173
+ group: beam
174
+ kind: box
175
+ from:
176
+ - 6000
177
+ - 0
178
+ - 4500
179
+ to:
180
+ - 12000
181
+ - 0
182
+ - 4500
183
+ section:
184
+ w: 150
185
+ d: 250
186
+ meta:
187
+ profile: W10x33
188
+ - id: BM-12B
189
+ group: beam
190
+ kind: box
191
+ from:
192
+ - 0
193
+ - 6000
194
+ - 4500
195
+ to:
196
+ - 6000
197
+ - 6000
198
+ - 4500
199
+ section:
200
+ w: 150
201
+ d: 250
202
+ meta:
203
+ profile: W10x33
204
+ - id: BM-23B
205
+ group: beam
206
+ kind: box
207
+ from:
208
+ - 6000
209
+ - 6000
210
+ - 4500
211
+ to:
212
+ - 12000
213
+ - 6000
214
+ - 4500
215
+ section:
216
+ w: 150
217
+ d: 250
218
+ meta:
219
+ profile: W10x33
220
+ - id: BM-1AB
221
+ group: beam
222
+ kind: box
223
+ from:
224
+ - 0
225
+ - 0
226
+ - 4500
227
+ to:
228
+ - 0
229
+ - 6000
230
+ - 4500
231
+ section:
232
+ w: 150
233
+ d: 250
234
+ meta:
235
+ profile: W10x33
236
+ - id: BM-2AB
237
+ group: beam
238
+ kind: box
239
+ from:
240
+ - 6000
241
+ - 0
242
+ - 4500
243
+ to:
244
+ - 6000
245
+ - 6000
246
+ - 4500
247
+ section:
248
+ w: 150
249
+ d: 250
250
+ meta:
251
+ profile: W10x33
252
+ - id: BM-3AB
253
+ group: beam
254
+ kind: box
255
+ from:
256
+ - 12000
257
+ - 0
258
+ - 4500
259
+ to:
260
+ - 12000
261
+ - 6000
262
+ - 4500
263
+ section:
264
+ w: 150
265
+ d: 250
266
+ meta:
267
+ profile: W10x33
268
+ grids:
269
+ - label: '1'
270
+ at:
271
+ - 0
272
+ - -3000
273
+ - 0
274
+ - label: '2'
275
+ at:
276
+ - 6000
277
+ - -3000
278
+ - 0
279
+ - label: '3'
280
+ at:
281
+ - 12000
282
+ - -3000
283
+ - 0
284
+ - label: A
285
+ at:
286
+ - -3000
287
+ - 0
288
+ - 0
289
+ - label: B
290
+ at:
291
+ - -3000
292
+ - 6000
293
+ - 0
294
+ output-path: "{{ inputs.output_path }}"
@@ -0,0 +1,293 @@
1
+ app: steel-to-tekla
2
+ version: 0.1.0
3
+ display-name: Steel to Tekla
4
+ description: |
5
+ Bake the read steel model straight into a LIVE Tekla model as native parts (columns + beams) via
6
+ the Tekla Open API — the deepest bake-out: real Tekla objects you detail as usual, not an IFC
7
+ import. Companion to steel-from-drawings (the 3D view) and steel-to-ifc (the universal file).
8
+
9
+ How it works: Tekla must be OPEN with a model. Your terminal AI bakes the scene inline
10
+ (read-strategy: bake); a WRITE exec creates a Beam per member (the drawing's profile, falling back
11
+ to a sized rectangular section when your Tekla environment doesn't carry that catalogue profile),
12
+ then commits. A snapshot is taken first, so Tekla's Undo reverts the whole bake in one step. Ships
13
+ an EXAMPLE frame; the floless-app-steel-from-drawings skill bakes your own drawing's scene in.
14
+ exposes-as-agent: false
15
+ inputs:
16
+ # BAKED at compose time: the terminal AI reads this drawing and writes the `scene` block below.
17
+ # read-strategy: bake surfaces "Re-read & re-bake ▸". The deterministic run reads the scene, not the drawing.
18
+ drawing:
19
+ type: image
20
+ widget: file
21
+ accept: [pdf, png, jpg]
22
+ read-strategy: bake
23
+ description: A structural steel drawing — baked into the scene below, then created as native Tekla parts; swap it to re-read & re-bake.
24
+ requires:
25
+ - tekla@0.1.x
26
+ layout: linear
27
+ nodes:
28
+ # WRITE exec: creates real Tekla members (a Beam per scene element) via the Open API, then commits.
29
+ # Needs Tekla OPEN with a model. snapshot: true → one Undo reverts the whole bake. Re-bake — or the
30
+ # floless-app-steel-from-drawings skill — replaces `scene` with YOUR drawing's read.
31
+ - id: bake-tekla
32
+ agent: tekla
33
+ command: bake-scene
34
+ mode: write
35
+ config:
36
+ version: "2026.0"
37
+ scene:
38
+ meta:
39
+ name: "Example \u2014 steel framing (sample, not your drawing)"
40
+ units: mm
41
+ up: z
42
+ groups:
43
+ - key: column
44
+ label: Columns (HSS6x6x3/8)
45
+ color: '#60a5fa'
46
+ - key: beam
47
+ label: Beams (W10x33)
48
+ color: '#94a3b8'
49
+ elements:
50
+ - id: COL-1A
51
+ group: column
52
+ kind: box
53
+ from:
54
+ - 0
55
+ - 0
56
+ - 0
57
+ to:
58
+ - 0
59
+ - 0
60
+ - 4500
61
+ section:
62
+ w: 150
63
+ d: 150
64
+ meta:
65
+ profile: HSS6x6x3/8
66
+ grid: 1-A
67
+ - id: COL-1B
68
+ group: column
69
+ kind: box
70
+ from:
71
+ - 0
72
+ - 6000
73
+ - 0
74
+ to:
75
+ - 0
76
+ - 6000
77
+ - 4500
78
+ section:
79
+ w: 150
80
+ d: 150
81
+ meta:
82
+ profile: HSS6x6x3/8
83
+ grid: 1-B
84
+ - id: COL-2A
85
+ group: column
86
+ kind: box
87
+ from:
88
+ - 6000
89
+ - 0
90
+ - 0
91
+ to:
92
+ - 6000
93
+ - 0
94
+ - 4500
95
+ section:
96
+ w: 150
97
+ d: 150
98
+ meta:
99
+ profile: HSS6x6x3/8
100
+ grid: 2-A
101
+ - id: COL-2B
102
+ group: column
103
+ kind: box
104
+ from:
105
+ - 6000
106
+ - 6000
107
+ - 0
108
+ to:
109
+ - 6000
110
+ - 6000
111
+ - 4500
112
+ section:
113
+ w: 150
114
+ d: 150
115
+ meta:
116
+ profile: HSS6x6x3/8
117
+ grid: 2-B
118
+ - id: COL-3A
119
+ group: column
120
+ kind: box
121
+ from:
122
+ - 12000
123
+ - 0
124
+ - 0
125
+ to:
126
+ - 12000
127
+ - 0
128
+ - 4500
129
+ section:
130
+ w: 150
131
+ d: 150
132
+ meta:
133
+ profile: HSS6x6x3/8
134
+ grid: 3-A
135
+ - id: COL-3B
136
+ group: column
137
+ kind: box
138
+ from:
139
+ - 12000
140
+ - 6000
141
+ - 0
142
+ to:
143
+ - 12000
144
+ - 6000
145
+ - 4500
146
+ section:
147
+ w: 150
148
+ d: 150
149
+ meta:
150
+ profile: HSS6x6x3/8
151
+ grid: 3-B
152
+ - id: BM-12A
153
+ group: beam
154
+ kind: box
155
+ from:
156
+ - 0
157
+ - 0
158
+ - 4500
159
+ to:
160
+ - 6000
161
+ - 0
162
+ - 4500
163
+ section:
164
+ w: 150
165
+ d: 250
166
+ meta:
167
+ profile: W10x33
168
+ - id: BM-23A
169
+ group: beam
170
+ kind: box
171
+ from:
172
+ - 6000
173
+ - 0
174
+ - 4500
175
+ to:
176
+ - 12000
177
+ - 0
178
+ - 4500
179
+ section:
180
+ w: 150
181
+ d: 250
182
+ meta:
183
+ profile: W10x33
184
+ - id: BM-12B
185
+ group: beam
186
+ kind: box
187
+ from:
188
+ - 0
189
+ - 6000
190
+ - 4500
191
+ to:
192
+ - 6000
193
+ - 6000
194
+ - 4500
195
+ section:
196
+ w: 150
197
+ d: 250
198
+ meta:
199
+ profile: W10x33
200
+ - id: BM-23B
201
+ group: beam
202
+ kind: box
203
+ from:
204
+ - 6000
205
+ - 6000
206
+ - 4500
207
+ to:
208
+ - 12000
209
+ - 6000
210
+ - 4500
211
+ section:
212
+ w: 150
213
+ d: 250
214
+ meta:
215
+ profile: W10x33
216
+ - id: BM-1AB
217
+ group: beam
218
+ kind: box
219
+ from:
220
+ - 0
221
+ - 0
222
+ - 4500
223
+ to:
224
+ - 0
225
+ - 6000
226
+ - 4500
227
+ section:
228
+ w: 150
229
+ d: 250
230
+ meta:
231
+ profile: W10x33
232
+ - id: BM-2AB
233
+ group: beam
234
+ kind: box
235
+ from:
236
+ - 6000
237
+ - 0
238
+ - 4500
239
+ to:
240
+ - 6000
241
+ - 6000
242
+ - 4500
243
+ section:
244
+ w: 150
245
+ d: 250
246
+ meta:
247
+ profile: W10x33
248
+ - id: BM-3AB
249
+ group: beam
250
+ kind: box
251
+ from:
252
+ - 12000
253
+ - 0
254
+ - 4500
255
+ to:
256
+ - 12000
257
+ - 6000
258
+ - 4500
259
+ section:
260
+ w: 150
261
+ d: 250
262
+ meta:
263
+ profile: W10x33
264
+ grids:
265
+ - label: '1'
266
+ at:
267
+ - 0
268
+ - -3000
269
+ - 0
270
+ - label: '2'
271
+ at:
272
+ - 6000
273
+ - -3000
274
+ - 0
275
+ - label: '3'
276
+ at:
277
+ - 12000
278
+ - -3000
279
+ - 0
280
+ - label: A
281
+ at:
282
+ - -3000
283
+ - 0
284
+ - 0
285
+ - label: B
286
+ at:
287
+ - -3000
288
+ - 6000
289
+ - 0
290
+ safety:
291
+ transaction-group: steel-from-drawings
292
+ snapshot: true
293
+
@@ -0,0 +1,63 @@
1
+ app: supabase-drawing-register
2
+ version: 0.1.0
3
+ display-name: Supabase Drawing Register
4
+ description: |
5
+ Reproduces the desktop "supabase-drawing-register" outcome on AWARE
6
+ (end goal, not the desktop mechanics):
7
+
8
+ Keep a Supabase drawing register in lock-step with the Tekla model. On
9
+ every drawing-change event, re-read the model's drawings and idempotently
10
+ upsert each into the Supabase `drawings` table (PostgREST). Long-running:
11
+ the tekla watch node makes this a stateful sync app (aware app stop to end).
12
+
13
+ Composed only against installed agents — tekla (curated) + http (the
14
+ http agent's supabase-rest recipe: apikey + Bearer, POST upsert with
15
+ Prefer: resolution=merge-duplicates on on_conflict=number). No Supabase-
16
+ specific agent needed; the key is provisioned once via `aware connect supabase`.
17
+
18
+ exposes-as-agent: false
19
+
20
+ requires:
21
+ - tekla@0.1.x
22
+ - http@0.1.x
23
+
24
+ requires-permissions:
25
+ network:
26
+ - https://app.connect.trimble.com # placeholder; Supabase host is per-project
27
+ filesystem: []
28
+
29
+ layout: linear
30
+
31
+ nodes:
32
+ # Read the model's drawings (identity = Mark, never Name). One-shot bulk sync;
33
+ # the live `tekla watch` (stream) variant is blocked on AWARE's invoke_stream
34
+ # (unimplemented in 0.37 — see gap note), so this runs on demand / model-open.
35
+ - id: drawings
36
+ agent: tekla
37
+ command: drawing-list
38
+ config:
39
+ status: any
40
+
41
+ # Idempotent BULK upsert of the whole drawing set in one PostgREST call.
42
+ # PostgREST accepts a JSON array body; `resolution=merge-duplicates` on
43
+ # `on_conflict=number` makes re-runs safe (new rows insert, existing update).
44
+ # (A top-level node rather than for-each: 0.37's compiler doesn't yet resolve
45
+ # the inner node of a `for-each do:` body — see gap note.)
46
+ - id: upsert
47
+ agent: http
48
+ command: post
49
+ config:
50
+ url: '{{ inputs.supabase_url }}/rest/v1/drawings'
51
+ headers:
52
+ apikey: '{{ secrets.supabase }}'
53
+ Authorization: 'Bearer {{ secrets.supabase }}'
54
+ Prefer: 'resolution=merge-duplicates,return=representation'
55
+ query:
56
+ on_conflict: 'number'
57
+ body: '{{ drawings.drawings }}'
58
+ safety:
59
+ transaction-group: register-sync
60
+ snapshot: false
61
+
62
+ connections:
63
+ - { from: drawings, to: upsert }