@floless/app 0.52.0 → 0.53.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.
- package/dist/floless-server.cjs +4 -4
- package/dist/skills/floless-app-queue/SKILL.md +1 -1
- package/dist/skills/floless-app-steel-model/SKILL.md +1 -1
- package/dist/skills/floless-app-steel-takeoff/SKILL.md +8 -8
- package/dist/skills/floless-app-tweak-contract/SKILL.md +2 -2
- package/dist/templates/{steel-takeoff.flo → steel-model.flo} +2 -2
- package/dist/web/aware.js +1 -1
- package/dist/web/steel-3d-view.js +1 -1
- package/dist/web/steel-editor.html +2 -2
- package/package.json +1 -1
package/dist/floless-server.cjs
CHANGED
|
@@ -52856,7 +52856,7 @@ function appVersion() {
|
|
|
52856
52856
|
return resolveVersion({
|
|
52857
52857
|
isSea: isSea2(),
|
|
52858
52858
|
sqVersionXml: readSqVersionXml(),
|
|
52859
|
-
define: true ? "0.
|
|
52859
|
+
define: true ? "0.53.0" : void 0,
|
|
52860
52860
|
pkgVersion: readPkgVersion()
|
|
52861
52861
|
});
|
|
52862
52862
|
}
|
|
@@ -52866,7 +52866,7 @@ function resolveChannel(s) {
|
|
|
52866
52866
|
return "dev";
|
|
52867
52867
|
}
|
|
52868
52868
|
function appChannel() {
|
|
52869
|
-
return resolveChannel({ isSea: isSea2(), define: true ? "0.
|
|
52869
|
+
return resolveChannel({ isSea: isSea2(), define: true ? "0.53.0" : void 0 });
|
|
52870
52870
|
}
|
|
52871
52871
|
|
|
52872
52872
|
// workflow-update.ts
|
|
@@ -53893,7 +53893,7 @@ function contractToScene(contractInput) {
|
|
|
53893
53893
|
color: pickColor(profile, i, contract)
|
|
53894
53894
|
}));
|
|
53895
53895
|
return {
|
|
53896
|
-
scene: { meta: { name: contract.title || "Steel
|
|
53896
|
+
scene: { meta: { name: contract.title || "Steel Model", units: "mm", up: "z" }, groups, elements },
|
|
53897
53897
|
skipped
|
|
53898
53898
|
};
|
|
53899
53899
|
}
|
|
@@ -60636,7 +60636,7 @@ var PRODUCT_SKILLS = [
|
|
|
60636
60636
|
"floless-app-steel-takeoff",
|
|
60637
60637
|
// read a steel drawing into an editable steel.takeoff/v1 contract (the Steel Takeoff reader)
|
|
60638
60638
|
"floless-app-tweak-contract",
|
|
60639
|
-
// handle a tweak-contract request from the
|
|
60639
|
+
// handle a tweak-contract request from the Steel Model contract editor (Slice 2 AI round-trip)
|
|
60640
60640
|
"floless-app-ui",
|
|
60641
60641
|
// compose Custom Panels (~/.floless/ui/extensions.json) for the Dashboard
|
|
60642
60642
|
"floless-app-workflows",
|
|
@@ -40,7 +40,7 @@ documented in `floless-app-bridge`; the five types map to:
|
|
|
40
40
|
|---|---|---|
|
|
41
41
|
| `tweak` | "Tweak node **`<nodeId>`** in **`<appId>`** — *<instruction>*" | `floless-app-workflows` |
|
|
42
42
|
| `use-template` | "Add template **<template.name>** to **`<appId>`**" | `floless-app-workflows` |
|
|
43
|
-
| `tweak-contract` | "Edit the
|
|
43
|
+
| `tweak-contract` | "Edit the Steel Model contract for **`<appId>`** — *<instruction>* (+N screenshot(s))" | `floless-app-tweak-contract` |
|
|
44
44
|
| `ui-customize` | "Customize the Dashboard (optionally `panel <panelId>`) — *<instruction>*" | `floless-app-ui` |
|
|
45
45
|
| `rebake` | "Re-read the **<inputName>** drawing (<sourceName>) in **`<appId>`** — *<instruction>*" | `floless-app-rebake` |
|
|
46
46
|
|
|
@@ -127,7 +127,7 @@ the user at the editor:
|
|
|
127
127
|
- **Read each framing plan** via **`floless-app-steel-takeoff`** — it runs the filter pre-stage
|
|
128
128
|
(isolate the steel linework by layer/thickness/colour), the vision read, the AISC/EN/BS lookup
|
|
129
129
|
via the detailer, honors `target_confidence`, writes the `steel.takeoff/v1` contract, and opens
|
|
130
|
-
the overlay editor. One contract per `steel-
|
|
130
|
+
the overlay editor. One contract per `steel-model` app; multi-sheet sets ride the filter's
|
|
131
131
|
`sheets[]` + the editor's plan switcher.
|
|
132
132
|
- **Pre-fill the connection library** from `company-rules.md` (stage 2): emit the firm's rows into
|
|
133
133
|
the contract's `connections[]` with `source:"company-rules"`; the user reviews/assigns them per
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: floless-app-steel-takeoff
|
|
3
|
-
description: Read a structural steel drawing into an editable steel.takeoff/v1 contract in floless.app — the "Steel Takeoff" reader. Triggers on a pending floless `rebake` request for the `steel-
|
|
3
|
+
description: Read a structural steel drawing into an editable steel.takeoff/v1 contract in floless.app — the "Steel Takeoff" reader. Triggers on a pending floless `rebake` request for the `steel-model` app (queued from its "Re-read & re-bake ▸" button), or asks like "read this framing plan into a takeoff", "turn this structural drawing into a takeoff", "bake my drawing into steel-model", "extract members from this PDF". Teaches the host AI to READ a steel drawing (PDF/image) with its own vision at COMPOSE time, build a steel.takeoff/v1 contract (members + profiles + elevations + weights from AISC lookup), write it to the contract store, and hand control to the editor — no model in the run path, no API key.
|
|
4
4
|
metadata:
|
|
5
5
|
version: 0.1.0
|
|
6
6
|
---
|
|
@@ -9,7 +9,7 @@ metadata:
|
|
|
9
9
|
|
|
10
10
|
## What this is
|
|
11
11
|
|
|
12
|
-
`steel-
|
|
12
|
+
`steel-model` is a FloLess app that turns a structural steel drawing into an editable
|
|
13
13
|
**takeoff contract** — members, profiles, AISC weights, T.O. elevations, connection detail refs
|
|
14
14
|
— rendered in the overlay editor, then baked at Approve into the app's `read` node.
|
|
15
15
|
|
|
@@ -34,7 +34,7 @@ but do not attempt them here.
|
|
|
34
34
|
### 1. Find the drawing
|
|
35
35
|
|
|
36
36
|
From a `rebake` request: `GET http://localhost:<port>/api/requests` → the entry with
|
|
37
|
-
`type:"rebake"` and `appId:"steel-
|
|
37
|
+
`type:"rebake"` and `appId:"steel-model"` carries `snapshots: ["<abs path>"]` (the drawing
|
|
38
38
|
file) and optionally `sourceName` (the original filename — use it for the `source.name`
|
|
39
39
|
provenance field). If the user just attaches or points at a drawing in prose, skip the lookup
|
|
40
40
|
and proceed from that path.
|
|
@@ -72,7 +72,7 @@ native/display coords):
|
|
|
72
72
|
`*BEAM*STEL*`, `*COL*`, `*BRACE*`, `*JOIST*`) → default **on**; others off. Mark
|
|
73
73
|
`drawable: false` on pure text/dimension/title-block layers.
|
|
74
74
|
5. Set `filter.mode: "layer"`, `filter.active: 0`. **PUT** the contract
|
|
75
|
-
(`PUT /api/contract/steel-
|
|
75
|
+
(`PUT /api/contract/steel-model`). On a re-read, preserve any existing per-facet `on` flags.
|
|
76
76
|
|
|
77
77
|
Then tell the user to open the **Filter** node, flip through the sheets, narrow to the steel, and
|
|
78
78
|
**Save**. The saved `on` flags + `mode` are what step 2 reads — **per sheet** (each sheet's elements
|
|
@@ -180,7 +180,7 @@ excluded from the average and counted separately as the headline drag).
|
|
|
180
180
|
**The score endpoint is your gauge — call it, don't guess:**
|
|
181
181
|
|
|
182
182
|
```
|
|
183
|
-
POST http://localhost:<port>/api/contract/steel-
|
|
183
|
+
POST http://localhost:<port>/api/contract/steel-model/score
|
|
184
184
|
Content-Type: application/json
|
|
185
185
|
{ "contract": <your draft contract>, "target": <target_confidence, e.g. 70> }
|
|
186
186
|
```
|
|
@@ -309,7 +309,7 @@ Key field rules:
|
|
|
309
309
|
### 5. Write to the contract store
|
|
310
310
|
|
|
311
311
|
```
|
|
312
|
-
PUT http://localhost:<port>/api/contract/steel-
|
|
312
|
+
PUT http://localhost:<port>/api/contract/steel-model
|
|
313
313
|
Content-Type: application/json
|
|
314
314
|
|
|
315
315
|
<contract JSON body>
|
|
@@ -317,7 +317,7 @@ Content-Type: application/json
|
|
|
317
317
|
|
|
318
318
|
The server schema-validates the body. If it responds with `400`, read the error, fix the
|
|
319
319
|
offending fields, and re-PUT. You can read back the current contract with
|
|
320
|
-
`GET /api/contract/steel-
|
|
320
|
+
`GET /api/contract/steel-model`.
|
|
321
321
|
|
|
322
322
|
### 6. Hand off to the user
|
|
323
323
|
|
|
@@ -347,7 +347,7 @@ DELETE http://localhost:<port>/api/requests/<id>
|
|
|
347
347
|
|
|
348
348
|
Never write client, firm, or project identifiers into files, commits, or responses. The
|
|
349
349
|
contract carries the source path in `source.path` and an embedded raster in `raster_b64` — both
|
|
350
|
-
are machine-local (stored under `~/.floless/contracts/steel-
|
|
350
|
+
are machine-local (stored under `~/.floless/contracts/steel-model.json` by the server and
|
|
351
351
|
never committed). Clip title blocks from any embedded preview.
|
|
352
352
|
|
|
353
353
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: floless-app-tweak-contract
|
|
3
|
-
description: This skill should be used when there is a pending floless `tweak-contract` request — the user typed an instruction in the
|
|
3
|
+
description: This skill should be used when there is a pending floless `tweak-contract` request — the user typed an instruction in the Steel Model contract editor and clicked Send (Ask AI). Also triggers on asks like "edit the steel takeoff contract via AI", "adjust the steel takeoff in the contract editor", "the user asked me to change the steel contract", "pick up my tweak-contract request", "update the member profile in the contract". It teaches the host AI to read the request, fetch the current steel.takeoff/v1 contract, apply the instruction (and any pasted screenshots), PUT the updated contract back, and resolve the request.
|
|
4
4
|
metadata:
|
|
5
5
|
version: 0.1.0
|
|
6
6
|
---
|
|
@@ -9,7 +9,7 @@ metadata:
|
|
|
9
9
|
|
|
10
10
|
## What this is
|
|
11
11
|
|
|
12
|
-
The floless.app
|
|
12
|
+
The floless.app Steel Model contract editor surfaces an **Ask AI** panel: the user types
|
|
13
13
|
an instruction ("change all W12X26 to W14X30", "add a new beam on sheet S-202", "mark this
|
|
14
14
|
member as moment-frame") and optionally pastes screenshots, then clicks **Send**. That records
|
|
15
15
|
a `tweak-contract` request in the reverse channel. You pick it up here, edit the contract
|
package/dist/web/aware.js
CHANGED
|
@@ -2880,7 +2880,7 @@
|
|
|
2880
2880
|
}
|
|
2881
2881
|
|
|
2882
2882
|
// ── Workflow update (module-shaped) ─────────────────────────────────────────────
|
|
2883
|
-
// A FloLess-published workflow (e.g. steel-
|
|
2883
|
+
// A FloLess-published workflow (e.g. steel-model) has a newer bundled template. Poll GET
|
|
2884
2884
|
// /api/workflows/updates; when the OPEN app has one, show a pill → modal with the changelog →
|
|
2885
2885
|
// "Back up & update" POSTs /api/workflows/:id/update (backup → swap structure → re-bake the user's
|
|
2886
2886
|
// data from the contract store → recompile) → reload the app. No auto-update. `_wfUpdates` + the
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* steel-3d-view.js — the 3D render/interaction layer for the steel-
|
|
2
|
+
* steel-3d-view.js — the 3D render/interaction layer for the steel-model editor's 3D mode.
|
|
3
3
|
*
|
|
4
4
|
* Three.js lives ONLY here (the rest of the editor is import-free). It renders the SAME scene the
|
|
5
5
|
* IFC/Tekla bake uses (fetched from /api/contract/:id/scene → contractToScene), so the editable 3D
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<!doctype html><html><head><meta charset=utf-8>
|
|
2
|
-
<title>Steel
|
|
2
|
+
<title>Steel Model — editor</title>
|
|
3
3
|
<style>
|
|
4
4
|
:root{--bg:#0f172a;--panel:#1e293b;--line:#334155;--text:#e2e8f0;--mut:#94a3b8;--brand:#3b82f6}
|
|
5
5
|
/* Theme EVERY scrollbar — no native white default may leak (applies to the canvas, panels, and every modal list). */
|
|
@@ -204,7 +204,7 @@
|
|
|
204
204
|
<script type="module" src="./steel-3d-view.js"></script>
|
|
205
205
|
</head><body>
|
|
206
206
|
<header>
|
|
207
|
-
<b>Steel
|
|
207
|
+
<b>Steel Model</b>
|
|
208
208
|
<div id=viewToggle role=group aria-label="Canvas view"><button id=vt2d class="seg on" aria-pressed=true title="Plan view (2D overlay)">2D</button><button id=vt3d class=seg aria-pressed=false title="3D model view">3D</button></div>
|
|
209
209
|
<select id=planSel title="Switch plan view"></select>
|
|
210
210
|
<span class=stat>Members <b id=mc>0</b></span><span class=stat>Weight <b id=wt>0</b> tons · <b id=wtlb>0</b> lb</span>
|