{"ok":true,"service":"dibrix-web","product":"Dibrix Draw","doc_version":2,"registry_version":"2026-10-30.1","rev":"3c00e39b","base_url":"https://draw.dibrix.com","start_her":"Start her: Tegning/skann → modell → tegningssett → PDF (oppskrift `tegning-til-pdf`; alt skjer i Dibrix)\n1. Tilgang: `login` eller agentnøkkel (DIBRIX_API_KEY, `Authorization: Bearer dk_…`); nytt prosjekt `create_project`, så `bind_session` (project=<id>).\n2. Bygg: `get_spec_schema` → `build_house_from_spec` (POST /sessions/{sid}/spec). PDF/skann: `import_drawings_job` → `get_import_job` → `confirm_import_job` (Konverteringer).\n3. Etasjer (audit_storeys): `delivery_check` (only=etg) og `list_tags`; rett med `set_storeys` / `tag_by_storey`. Se på modellen: `render`.\n4. Eksisterende bygg: `import_approved_drawings` (approved_date=…) legger originalen inn som sidene «Sist godkjent – …».\n5. Tegningssett i Pages: `add_sheet_set` med set = soknad | presentasjon | konstruksjon (`missing` i svaret = sider Dibrix ikke lager ennå).\n6. Firmaets tittelfelt: `list_layout_profiles` → `apply_layout_profile`, eller feltene med `set_sheet_chrome`.\n7. PDF: `delivery_check`, så `export_sheets_pdf` = GET /sessions/{sid}/export/sheets.pdf (?sheet= for ett ark).\n8. `save_version` (comment) etter hvert ferdig steg, ikke bare til slutt.\nREGEL: Lag aldri tegninger utenfor Dibrix; mangler noe i Pages, meld det (`report_to_developer`) i stedet for å omgå det.\nFlere oppskrifter: `recipes` i /agent.json, MCP `list_recipes` / `get_recipe`. HTTP-rute per verktøy: `tools[].path` i /agent.json. Hele guiden: /agent.","recipes":[{"id":"tegning-til-pdf","no":"Tegning/skann → modell → tegningssett → PDF","en":"Drawing/scan → model → drawing set → PDF","steps":[{"tools":["login","create_project","bind_session"],"no":"Tilgang: `login` eller agentnøkkel (DIBRIX_API_KEY, `Authorization: Bearer dk_…`); nytt prosjekt `create_project`, så `bind_session` (project=<id>).","en":"Access: `login` or an agent key (DIBRIX_API_KEY, `Authorization: Bearer dk_…`); new project `create_project`, then `bind_session` (project=<id>)."},{"tools":["get_spec_schema","build_house_from_spec","import_drawings_job","get_import_job","confirm_import_job"],"no":"Bygg: `get_spec_schema` → `build_house_from_spec` (POST /sessions/{sid}/spec). PDF/skann: `import_drawings_job` → `get_import_job` → `confirm_import_job` (Konverteringer).","en":"Build: `get_spec_schema` → `build_house_from_spec` (POST /sessions/{sid}/spec). PDF/scan: `import_drawings_job` → `get_import_job` → `confirm_import_job` (Conversions)."},{"tools":["delivery_check","list_tags","set_storeys","tag_by_storey","render"],"no":"Etasjer (audit_storeys): `delivery_check` (only=etg) og `list_tags`; rett med `set_storeys` / `tag_by_storey`. Se på modellen: `render`.","en":"Storeys (audit_storeys): `delivery_check` (only=etg) and `list_tags`; fix with `set_storeys` / `tag_by_storey`. Look at the model: `render`."},{"tools":["import_approved_drawings"],"no":"Eksisterende bygg: `import_approved_drawings` (approved_date=…) legger originalen inn som sidene «Sist godkjent – …».","en":"Existing building: `import_approved_drawings` (approved_date=…) adds the original as the pages «Sist godkjent – …»."},{"tools":["add_sheet_set"],"no":"Tegningssett i Pages: `add_sheet_set` med set = soknad | presentasjon | konstruksjon (`missing` i svaret = sider Dibrix ikke lager ennå).","en":"Drawing set in Pages: `add_sheet_set` with set = soknad | presentasjon | konstruksjon (`missing` in the answer = pages Dibrix cannot make yet)."},{"tools":["list_layout_profiles","apply_layout_profile","set_sheet_chrome"],"no":"Firmaets tittelfelt: `list_layout_profiles` → `apply_layout_profile`, eller feltene med `set_sheet_chrome`.","en":"The firm's title block: `list_layout_profiles` → `apply_layout_profile`, or the fields with `set_sheet_chrome`."},{"tools":["delivery_check","export_sheets_pdf"],"no":"PDF: `delivery_check`, så `export_sheets_pdf` = GET /sessions/{sid}/export/sheets.pdf (?sheet= for ett ark).","en":"PDF: `delivery_check`, then `export_sheets_pdf` = GET /sessions/{sid}/export/sheets.pdf (?sheet= for one sheet)."},{"tools":["save_version"],"no":"`save_version` (comment) etter hvert ferdig steg, ikke bare til slutt.","en":"`save_version` (comment) after every finished step, not only at the end."}],"rule":{"no":"Lag aldri tegninger utenfor Dibrix; mangler noe i Pages, meld det (`report_to_developer`) i stedet for å omgå det.","en":"Never make drawings outside Dibrix; if Pages lacks something, report it (`report_to_developer`) instead of working around it."}}],"discovery":{"agent_md":"https://draw.dibrix.com/agent","agent_json":"https://draw.dibrix.com/agent.json","well_known":"https://draw.dibrix.com/.well-known/dibrix-agent.json","llms_txt":"https://draw.dibrix.com/llms.txt","quick":"https://draw.dibrix.com/agent/quick","openapi_compact":"https://draw.dibrix.com/openapi-sandbox.json","openapi":"https://draw.dibrix.com/openapi.json","health":"https://draw.dibrix.com/health"},"start_here":{"no_login":[{"step":1,"method":"POST","url":"https://draw.dibrix.com/configurator/sandbox/session","returns":"{id}"},{"step":2,"method":"POST","url":"https://draw.dibrix.com/configurator/sandbox/session/{sid}/drawing","body":{"type":"garasje","boundary":[[0,0],[8,0],[8,6],[0,6]],"openings":[{"wall":"south","kind":"door","w_m":1.0,"h_m":2.1,"pos_m":2.0},{"wall":"east","kind":"window","w_m":1.2,"h_m":1.2}]}},{"step":3,"method":"GET","url":"https://draw.dibrix.com/sessions/{sid}/composer/plan"},{"step":3,"method":"POST","url":"https://draw.dibrix.com/configurator/sandbox/session/{sid}/price","body":{"choices":{}}},{"step":3,"method":"GET","url":"https://draw.dibrix.com/configurator/sandbox/session/{sid}/compliance?type=garasje"}],"sandbox_enabled":true,"without_sandbox":["POST https://draw.dibrix.com/configurator/public/quote (plan: true)","POST https://draw.dibrix.com/configurator/public/compliance"],"logged_in":["POST https://draw.dibrix.com/auth/login","POST https://draw.dibrix.com/sessions","POST https://draw.dibrix.com/sessions/{sid}/agent/walls","POST https://draw.dibrix.com/sessions/{sid}/agent/openings","GET https://draw.dibrix.com/sessions/{sid}/composer/plan","GET https://draw.dibrix.com/configurator/session/{sid}/price","GET https://draw.dibrix.com/sessions/{sid}/agent/compliance"]},"share_link":{"example":"https://draw.dibrix.com/?session=<32 hex>&share=<token>","sid_param":"session","share_param":"share","use":"viewer (vw_) and propose (pr_, or the old session key) links: POST /view/open {session, share} -> a private copy (session_id); propose copies are writable and save as a NEW draft version (POST /sessions/{copy}/versions). A write key (wr_): log in (or Bearer dk_…) AND append ?share=<token> to /sessions/{sid}/agent/* (wr_ alone → 401; 24 h)","levels":{"read":{"no":"les (viewer-nøkkel)","en":"read (viewer key)"},"propose":{"no":"lage nye versjoner (propose-nøkkel, standard for agenter)","en":"make new versions (propose key, default for agents)"},"write":{"no":"overskrive den kjørende økta (write-nøkkel)","en":"overwrite the running session (write key)"},"owner":{"no":"bare innlogget eier/admin (aldri med nøkkel)","en":"logged-in owner/admin only (never with a key)"}}},"auth":{"modes":{"public":{"no":"åpen, uten innlogging","en":"open, no login"},"sandbox":{"no":"sandkasse (anonym) eller innlogget","en":"sandbox (anonymous) or logged in"},"share":{"no":"innlogget: eier, admin, redigerer i prosjektet — eller wr_-nøkkel (?share=) OPPÅ innlogging/dk_","en":"logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_"},"login":{"no":"innlogget","en":"logged in"}},"login":"POST https://draw.dibrix.com/auth/login {email, password} -> session cookie","api_key":{"no":"Personlig API-nøkkel (agentnøkkel): be Kjetil lage den i Konto → API-nøkler, legg den i DIBRIX_API_KEY. Authorization: Bearer dk_… (aldri i URL). Ingen innlogging nødvendig.","en":"Personal API key (agent key): ask Kjetil to make one in Account → API keys and put it in DIBRIX_API_KEY. Authorization: Bearer dk_... (never in a URL). No login needed.","header":"Authorization: Bearer dk_…","env":"DIBRIX_API_KEY","prefix":"dk_","levels":{"read":"reads (GET) and a read-only copy","propose":"private working copy + NEW draft version (default)","write":"changes the running session / project"},"scope":"exactly one session OR a few projects","never":["approve versions","share links","API keys","account / billing / team / admin","delete projects"],"routes":{"who_am_i":"GET /key/self","open_session":"POST /key/open","withdraw_self":"DELETE /key/self","manage (logged-in person only)":"POST|GET|DELETE /api-keys"}},"hint":"401/403 on agent/*: log in or use Authorization: Bearer dk_…. A wr_ share alone is never enough (login/dk_ first, then ?share=wr_… for non-owners). viewer/propose links: POST /view/open first."},"units":{"length":"metre","up":"Z"},"defaults":{"wall_thickness_m":0.25,"storey_height_m":2.65},"categories":[{"key":"okt","no":"Økt og delelenke","en":"Session & share link","drawing":false},{"key":"spec","no":"Hus-spec (hele huset fra én JSON)","en":"House spec (a whole house from one JSON)","drawing":false},{"key":"utkast","no":"Utkast: tegn først, spør etterpå (hverdagsspråk)","en":"Draft: draw first, ask later (everyday language)","drawing":false},{"key":"anker","no":"Mål på stedet (måle-ankere)","en":"Site measurements (anchors)","drawing":false},{"key":"bildetur","no":"Bildetur: bilder med pinne på planen","en":"Photo tour: photos pinned on the plan","drawing":false},{"key":"tolkebenk","no":"Tolkebenk: oppdrag, avklaringer, rettelser og regler (C18)","en":"Interpretation bench: tasks, clarifications, corrections and rules (C18)","drawing":false},{"key":"punktsky","no":"Punktsky (skann): lagre, snitt og mål fra mobil","en":"Point cloud (scan): store, slice and measure from a phone","drawing":false},{"key":"fasadefoto","no":"Fasadefoto: tagger på veggen → mål → hus-spec","en":"Facade photo: tags on the wall → measurements → house spec","drawing":false},{"key":"faser","no":"Faser, rehab, tidsplan (4D) og kost (5D)","en":"Phases, rehab, schedule (4D) and cost (5D)","drawing":false},{"key":"komponent","no":"Komponenter (parametriske møbler og sanitær)","en":"Components (parametric furniture and sanitary)","drawing":false},{"key":"inspeksjon","no":"Inspiser og velg","en":"Inspect & select","drawing":false},{"key":"se","no":"Se: bilde, kamera, sammenligning","en":"See: picture, camera, compare","drawing":false},{"key":"vegg","no":"Vegg (yttervegg)","en":"Wall (exterior)","drawing":true},{"key":"innervegg","no":"Innervegg","en":"Inner wall","drawing":true},{"key":"apning","no":"Åpning (dør/vindu/port)","en":"Opening (door/window/gate)","drawing":true},{"key":"dekke","no":"Dekke og gulv","en":"Slab & floor","drawing":true},{"key":"tak","no":"Tak, ark og takvindu","en":"Roof, dormer & roof window","drawing":true},{"key":"utvendig","no":"Terrasse, rekkverk, pergola","en":"Deck, railing, pergola","drawing":false},{"key":"etasje","no":"Etasje","en":"Storey","drawing":true},{"key":"rom","no":"Rom og areal","en":"Rooms & areas","drawing":true},{"key":"snitt","no":"Snitt","en":"Section","drawing":true},{"key":"terreng","no":"Terreng","en":"Terrain","drawing":true},{"key":"georef","no":"Georeferanse, koordinatplan og plankrav","en":"Georeference, coordinate plan and plan constraints","drawing":false},{"key":"maal","no":"Mål","en":"Dimension","drawing":true},{"key":"tekst","no":"Tekst og strek på ark","en":"Text & lines on sheets","drawing":true},{"key":"scene","no":"Scene, ark og side","en":"Scene, sheet & page","drawing":true},{"key":"plan","no":"Plan, stil og presets","en":"Plan, style & presets","drawing":false},{"key":"regelsjekk","no":"Regelsjekk","en":"Compliance check","drawing":false},{"key":"energi","no":"Energi (klimaskjerm og energiberegning)","en":"Energy (building envelope and energy calculation)","drawing":false},{"key":"pris","no":"Pris og konfigurator","en":"Price & configurator","drawing":false},{"key":"konstruksjon","no":"Konstruksjon (bindingsverk)","en":"Construction (framing)","drawing":false},{"key":"eksport","no":"Eksport og import","en":"Export & import","drawing":false},{"key":"historikk","no":"Angre / gjør om","en":"Undo / redo","drawing":false},{"key":"versjon","no":"Versjoner og godkjenning","en":"Versions & approval","drawing":false},{"key":"konto","no":"Konto og prosjekt","en":"Account & projects","drawing":false},{"key":"buildchat","no":"BuildChat (KI i appen)","en":"BuildChat (in-app AI)","drawing":false},{"key":"drift","no":"Drift og feilsøking (bare systemadmin)","en":"Operations & debugging (system admin only)","drawing":false}],"tools":[{"name":"list_recipes","cat":"okt","no":"Oppskriftene for vanlige jobber (id, tittel, steg med verktøynavn). Start her ved første besøk; samme liste som recipes i /agent.json.","en":"The recipes for common jobs (id, title, steps with tool names). Start here on a first visit; same list as recipes in /agent.json.","access":"public","effect":"read","mcp":"web","params":{"type":"object","properties":{}},"status":"live","server":"web","returns":"{ok, rule, recipes:[{id, no, en, steps:[{tools, no, en}]}]}","description":"The recipes for common jobs (id, title, steps with tool names). Start here on a first visit; same list as recipes in /agent.json. [open, no login] — NO: Oppskriftene for vanlige jobber (id, tittel, steg med verktøynavn). Start her ved første besøk; samme liste som recipes i /agent.json.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{}}},{"name":"agent_actions","cat":"okt","no":"Alle verktøy med det folk kaller dem (fraser, synonymer, når ikke) og hvor de finnes i appen, og alle innstillinger med gruppe. Svar på «hvor finner jeg …» herfra.","en":"Every tool with what people call it (phrases, synonyms, when not) and where it is in the app, and every setting with its group. Answer «where do I find …» from here.","method":"GET","path":"/agent/actions.json","access":"public","effect":"read","py":"hvor_finner(sok='kledning')","status":"live","server":"web","returns":"{ok, tools:[{name, phrases, synonyms?, not_for?, api?, ui?}], settings:[…]}","description":"Every tool with what people call it (phrases, synonyms, when not) and where it is in the app, and every setting with its group. Answer «where do I find …» from here. [open, no login] — NO: Alle verktøy med det folk kaller dem (fraser, synonymer, når ikke) og hvor de finnes i appen, og alle innstillinger med gruppe. Svar på «hvor finner jeg …» herfra.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{}}},{"name":"get_recipe","cat":"okt","no":"Én oppskrift med alle steg (id fra list_recipes, f.eks. tegning-til-pdf: tegning/skann → modell → tegningssett → PDF).","en":"One recipe with all its steps (id from list_recipes, e.g. tegning-til-pdf: drawing/scan → model → drawing set → PDF).","access":"public","effect":"read","mcp":"web","params":{"type":"object","properties":{"id":{"type":"string"}}},"example":{"id":"tegning-til-pdf"},"status":"live","server":"web","returns":"{ok, recipe:{id, no, en, steps}, rule, text}","description":"One recipe with all its steps (id from list_recipes, e.g. tegning-til-pdf: drawing/scan → model → drawing set → PDF). [open, no login] — NO: Én oppskrift med alle steg (id fra list_recipes, f.eks. tegning-til-pdf: tegning/skann → modell → tegningssett → PDF).","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{"id":{"type":"string"}}}},{"name":"bind_session","cat":"okt","no":"Bind økta fra en delelenke (?session=&share=), sid+share, eller project=<id> (innlogget eller API-nøkkel: åpner prosjektets økt). Én gang per chat.","en":"Bind the live session from a share link (?session=&share=), sid+share, or project=<id> (logged in or API key: opens the project's session). Once per chat.","access":"public","effect":"read","mcp":"web","params":{"type":"object","properties":{"url":{"type":"string"},"sid":{"type":"string"},"share":{"type":"string"},"project":{"type":"string"}}},"example":{"url":"https://draw.dibrix.com/?session=<32 hex>&share=<token>"},"status":"live","server":"web","description":"Bind the live session from a share link (?session=&share=), sid+share, or project=<id> (logged in or API key: opens the project's session). Once per chat. [open, no login] — NO: Bind økta fra en delelenke (?session=&share=), sid+share, eller project=<id> (innlogget eller API-nøkkel: åpner prosjektets økt). Én gang per chat.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{"url":{"type":"string"},"sid":{"type":"string"},"share":{"type":"string"},"project":{"type":"string"}}}},{"name":"create_session","cat":"okt","no":"Ny tom redigeringsøkt (innlogget, ikke med API-nøkkel). Økta blir den bundne økta for senere verktøy. Vil du ha den i et prosjekt: create_project, så bind_session(project=<id>).","en":"New empty editor session (logged in, never with an API key). It becomes the bound session for later tools. To work inside a project: create_project, then bind_session(project=<id>).","method":"POST","path":"/sessions","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"lang":{"type":"string"}}},"example":{"lang":"nb"},"status":"live","server":"web","returns":"{id, version}","level":"owner","description":"New empty editor session (logged in, never with an API key). It becomes the bound session for later tools. To work inside a project: create_project, then bind_session(project=<id>). [logged in] — NO: Ny tom redigeringsøkt (innlogget, ikke med API-nøkkel). Økta blir den bundne økta for senere verktøy. Vil du ha den i et prosjekt: create_project, så bind_session(project=<id>).","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{"lang":{"type":"string"}}}},{"name":"close_session","cat":"okt","no":"Lukk en økt.","en":"Close a session.","method":"DELETE","path":"/sessions/{sid}","access":"login","effect":"write","status":"live","server":"web","level":"write","description":"Close a session. [logged in] — NO: Lukk en økt.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{}}},{"name":"create_share_link","cat":"okt","no":"Lag/hent økta sin gamle delingsnøkkel (?share=<token>). Nå nivå PROPOSE: den åpner en privat arbeidskopi (view_open med session=<økt-id>), aldri den kjørende økta. Vil du gi overskriv-tilgang, bruk share_link role=write. Tilbakekall med unshare_session.","en":"Mint/fetch the session's old share key (?share=<token>). Now level PROPOSE: it opens a private working copy (view_open with session=<session id>), never the running session. For overwrite access use share_link role=write. Withdraw with unshare_session.","method":"POST","path":"/sessions/{sid}/share","access":"login","effect":"account","mcp":"web","status":"live","server":"web","returns":"{id, share, clients}","level":"owner","description":"Mint/fetch the session's old share key (?share=<token>). Now level PROPOSE: it opens a private working copy (view_open with session=<session id>), never the running session. For overwrite access use share_link role=write. Withdraw with unshare_session. [logged in] — NO: Lag/hent økta sin gamle delingsnøkkel (?share=<token>). Nå nivå PROPOSE: den åpner en privat arbeidskopi (view_open med session=<økt-id>), aldri den kjørende økta. Vil du gi overskriv-tilgang, bruk share_link role=write. Tilbakekall med unshare_session.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"unshare_session","cat":"okt","no":"Trekk tilbake økta sin gamle delingsnøkkel; åpne arbeidskopier laget med den lukkes med en gang.","en":"Withdraw the session's old share key; working copies opened with it close at once.","method":"DELETE","path":"/sessions/{sid}/share","access":"login","effect":"account","mcp":"web","status":"live","server":"web","returns":"{ok, had_token, copies_closed}","level":"owner","description":"Withdraw the session's old share key; working copies opened with it close at once. [logged in] — NO: Trekk tilbake økta sin gamle delingsnøkkel; åpne arbeidskopier laget med den lukkes med en gang.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"sandbox_session","cat":"okt","no":"Anonym sandkasseøkt (uten innlogging, 30 min, maks 2 per IP). 404 når serveren ikke har sandkasse.","en":"Anonymous sandbox session (no login, 30 min idle, max 2 per IP). 404 when the server has no sandbox.","method":"POST","path":"/configurator/sandbox/session","access":"public","effect":"write","mcp":"web","status":"live","server":"web","returns":"{id, ttl_s}","description":"Anonymous sandbox session (no login, 30 min idle, max 2 per IP). 404 when the server has no sandbox. [open, no login] — NO: Anonym sandkasseøkt (uten innlogging, 30 min, maks 2 per IP). 404 når serveren ikke har sandkasse.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{}}},{"name":"ordbok","cat":"okt","no":"BIM-ordbok: norsk/engelsk/kode, dør-/vindu-/belegg-typer, oppskrifter, fallgruver. ?q=ord søker.","en":"BIM dictionary: terms, door/window/covering types, recipes, pitfalls. ?q=word filters.","method":"GET","path":"/ordbok","access":"public","effect":"read","status":"live","server":"web","returns":"markdown","description":"BIM dictionary: terms, door/window/covering types, recipes, pitfalls. ?q=word filters. [open, no login] — NO: BIM-ordbok: norsk/engelsk/kode, dør-/vindu-/belegg-typer, oppskrifter, fallgruver. ?q=ord søker.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{"q":{"type":"string","default":"","title":"Q"}}}},{"name":"get_spec_schema","cat":"spec","no":"Hus-spec v1: JSON Schema + et bygbart eksempel (kopier og endre) + bruksnotater. Åpen, uten økt. Start her for å bygge et helt hus fra én JSON.","en":"House spec v1: JSON Schema + a buildable example (copy and edit) + usage notes. Open, no session. Start here to build a whole house from one JSON.","method":"GET","path":"/spec/schema","access":"public","effect":"read","mcp":"web","status":"live","server":"web","returns":"{schema, example, usage}","description":"House spec v1: JSON Schema + a buildable example (copy and edit) + usage notes. Open, no session. Start here to build a whole house from one JSON. [open, no login] — NO: Hus-spec v1: JSON Schema + et bygbart eksempel (kopier og endre) + bruksnotater. Åpen, uten økt. Start her for å bygge et helt hus fra én JSON.","category_label":"Hus-spec (hele huset fra én JSON)","input_schema":{"type":"object","properties":{}}},{"name":"build_house_from_spec","cat":"spec","no":"Bygg et helt hus fra ÉN hus-spec (etasjer, vegger, åpninger, dekker, tak, trapper, søyler, bjelker, rekkverk, skorstein, terreng) på sekunder, ett angresteg. Kledning/hjørnekasser/rom bygges én gang på slutten. replace=true fjerner BIM-elementene først. Svar: counts, ids, warnings, timing.","en":"Build a whole house from ONE house spec (levels, walls, openings, slabs, roofs, stairs, columns, beams, railings, chimney, terrain) in seconds, one undo step. Cladding/corner boards/rooms are built once at the end. replace=true removes the BIM elements first. Answer: counts, ids, warnings, timing.","method":"POST","path":"/sessions/{sid}/spec","access":"share","effect":"write","mcp":"web","py":"build_house_from_spec(spec, replace=False)","ops":["build_house_from_spec"],"params":{"type":"object","properties":{"spec":{"type":"object","description":"hus-spec v1 (se get_spec_schema)"},"replace":{"type":"boolean"},"sid":{"type":"string"}},"required":["spec"]},"example":{"spec":{"spec":"hus-spec","version":1,"walls":[{"id":"w1","a":[0,0],"b":[6,0],"height_m":2.5}],"roofs":[]},"replace":false},"status":"live","server":"web","returns":"{ok, counts, ids, warnings, timing:{valider_s, bygge_s, totalt_s}}","level":"propose","description":"Build a whole house from ONE house spec (levels, walls, openings, slabs, roofs, stairs, columns, beams, railings, chimney, terrain) in seconds, one undo step. Cladding/corner boards/rooms are built once at the end. replace=true removes the BIM elements first. Answer: counts, ids, warnings, timing. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Bygg et helt hus fra ÉN hus-spec (etasjer, vegger, åpninger, dekker, tak, trapper, søyler, bjelker, rekkverk, skorstein, terreng) på sekunder, ett angresteg. Kledning/hjørnekasser/rom bygges én gang på slutten. replace=true fjerner BIM-elementene først. Svar: counts, ids, warnings, timing.","category_label":"Hus-spec (hele huset fra én JSON)","input_schema":{"type":"object","properties":{"spec":{"type":"object","description":"hus-spec v1 (se get_spec_schema)"},"replace":{"type":"boolean"},"sid":{"type":"string"}},"required":["spec"]}},{"name":"get_house_spec","cat":"spec","no":"Les modellen ut som hus-spec (JSON): rediger og bygg tilbake med build_house_from_spec. meta.not_carried viser det v1 ikke bærer.","en":"Read the model out as a house spec (JSON): edit it and build it back with build_house_from_spec. meta.not_carried lists what v1 leaves out.","method":"GET","path":"/sessions/{sid}/spec","access":"share","effect":"read","mcp":"web","py":"get_house_spec()","ops":["get_house_spec"],"status":"live","server":"web","returns":"{spec, counts, timing:{lese_s}}","level":"read","description":"Read the model out as a house spec (JSON): edit it and build it back with build_house_from_spec. meta.not_carried lists what v1 leaves out. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Les modellen ut som hus-spec (JSON): rediger og bygg tilbake med build_house_from_spec. meta.not_carried viser det v1 ikke bærer.","category_label":"Hus-spec (hele huset fra én JSON)","input_schema":{"type":"object","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"list_anchors","cat":"anker","no":"Måle-ankere i økta: mål fra stedet (tastet, laser, avlest fra tegning, Finn) knyttet til vegg/åpning/etasje/side. Svar: anchors + valglistene (kind, source, side).","en":"Measurement anchors in the session: site measurements (typed, laser, read from drawing, Finn) tied to a wall / opening / storey / side. Answer: anchors + the choice lists.","method":"GET","path":"/sessions/{sid}/agent/anchors","access":"share","effect":"read","mcp":"web","py":"list_anchors()","ops":["list_anchors"],"status":"live","server":"web","returns":"{anchors:[{id, kind, value_m, precision_mm, source, ref}], count, choices}","level":"read","description":"Measurement anchors in the session: site measurements (typed, laser, read from drawing, Finn) tied to a wall / opening / storey / side. Answer: anchors + the choice lists. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Måle-ankere i økta: mål fra stedet (tastet, laser, avlest fra tegning, Finn) knyttet til vegg/åpning/etasje/side. Svar: anchors + valglistene (kind, source, side).","category_label":"Mål på stedet (måle-ankere)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"add_anchor","cat":"anker","no":"Lagre ETT måle-anker (ett angresteg). kind: ytterlengde|bredde|dybde|hoyde_raft|hoyde_mone|etasjehoyde|apning_bredde|apning_hoyde|apning_brystning|veggtykkelse|romlengde|etasjeareal; value i unit (m|mm); source: tastet|laser|tegning|finn; én referanse: wall (vegg-id), side (nord|sor|ost|vest), opening, level, room, eller page+p0+p1 (piksler på arket). Brukeren sier «nordveggen er 8,03 m»: add_anchor(kind='ytterlengde', value=8.03, side='nord'). Ankeret skalerer skann og kontrollerer modellen.","en":"Save ONE measurement anchor (one undo step). kind: ytterlengde|bredde|dybde|hoyde_raft|hoyde_mone|etasjehoyde|apning_bredde|apning_hoyde|apning_brystning|veggtykkelse|romlengde|etasjeareal; value in unit (m|mm); source: tastet|laser|tegning|finn; one reference: wall, side (nord|sor|ost|vest), opening, level, room, or page+p0+p1 (pixels on the sheet). The anchor scales scans and checks the model.","method":"POST","path":"/sessions/{sid}/agent/anchors","access":"share","effect":"write","mcp":"web","py":"add_anchor('ytterlengde', 8.03, side='nord', source='laser')","ops":["add_anchor"],"example":{"kind":"ytterlengde","value":8.03,"unit":"m","source":"laser","side":"nord"},"status":"live","server":"web","returns":"{ok, anchor, count}","level":"propose","description":"Save ONE measurement anchor (one undo step). kind: ytterlengde|bredde|dybde|hoyde_raft|hoyde_mone|etasjehoyde|apning_bredde|apning_hoyde|apning_brystning|veggtykkelse|romlengde|etasjeareal; value in unit (m|mm); source: tastet|laser|tegning|finn; one reference: wall, side (nord|sor|ost|vest), opening, level, room, or page+p0+p1 (pixels on the sheet). The anchor scales scans and checks the model. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Lagre ETT måle-anker (ett angresteg). kind: ytterlengde|bredde|dybde|hoyde_raft|hoyde_mone|etasjehoyde|apning_bredde|apning_hoyde|apning_brystning|veggtykkelse|romlengde|etasjeareal; value i unit (m|mm); source: tastet|laser|tegning|finn; én referanse: wall (vegg-id), side (nord|sor|ost|vest), opening, level, room, eller page+p0+p1 (piksler på arket). Brukeren sier «nordveggen er 8,03 m»: add_anchor(kind='ytterlengde', value=8.03, side='nord'). Ankeret skalerer skann og kontrollerer modellen.","category_label":"Mål på stedet (måle-ankere)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"kind":{"type":"string","enum":["ytterlengde","bredde","dybde","hoyde_raft","hoyde_mone","etasjehoyde","apning_bredde","apning_hoyde","apning_brystning","veggtykkelse","romlengde","etasjeareal"],"title":"Kind"},"value":{"type":"number","maximum":200000.0,"exclusiveMinimum":0.0,"title":"Value"},"unit":{"type":"string","enum":["m","mm"],"title":"Unit","default":"m"},"source":{"type":"string","enum":["tastet","laser","tegning","finn"],"title":"Source","default":"tastet"},"precision_mm":{"anyOf":[{"type":"number","maximum":5000.0,"minimum":0.1},{"type":"null"}],"title":"Precision Mm"},"wall":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Wall"},"side":{"anyOf":[{"type":"string","enum":["nord","sor","ost","vest"]},{"type":"null"}],"title":"Side"},"opening":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Opening"},"level":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Level"},"room":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Room"},"page":{"anyOf":[{"type":"integer","maximum":999.0,"minimum":1.0},{"type":"null"}],"title":"Page"},"p0":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2},{"type":"null"}],"title":"P0"},"p1":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2},{"type":"null"}],"title":"P1"}},"required":["kind","value"]}},{"name":"edit_anchor","cat":"anker","no":"Endre et måle-anker (bare feltene du gir; ny referanse erstatter den gamle). Ett angresteg.","en":"Change a measurement anchor (only the fields you give; a new reference replaces the old one). One undo step.","method":"PATCH","path":"/sessions/{sid}/agent/anchors/{aid}","access":"share","effect":"write","mcp":"web","py":"edit_anchor('a1', value=8.05)","ops":["edit_anchor"],"example":{"value":8.05,"unit":"m"},"status":"live","server":"web","returns":"{ok, anchor, count}","level":"propose","description":"Change a measurement anchor (only the fields you give; a new reference replaces the old one). One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Endre et måle-anker (bare feltene du gir; ny referanse erstatter den gamle). Ett angresteg.","category_label":"Mål på stedet (måle-ankere)","input_schema":{"type":"object","properties":{"aid":{"type":"string","title":"Aid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"kind":{"anyOf":[{"type":"string","enum":["ytterlengde","bredde","dybde","hoyde_raft","hoyde_mone","etasjehoyde","apning_bredde","apning_hoyde","apning_brystning","veggtykkelse","romlengde","etasjeareal"]},{"type":"null"}],"title":"Kind"},"value":{"anyOf":[{"type":"number","maximum":200000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Value"},"unit":{"type":"string","enum":["m","mm"],"title":"Unit","default":"m"},"source":{"anyOf":[{"type":"string","enum":["tastet","laser","tegning","finn"]},{"type":"null"}],"title":"Source"},"precision_mm":{"anyOf":[{"type":"number","maximum":5000.0,"minimum":0.1},{"type":"null"}],"title":"Precision Mm"},"wall":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Wall"},"side":{"anyOf":[{"type":"string","enum":["nord","sor","ost","vest"]},{"type":"null"}],"title":"Side"},"opening":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Opening"},"level":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Level"},"room":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Room"}},"required":["aid"]}},{"name":"delete_anchor","cat":"anker","no":"Slett et måle-anker (ett angresteg).","en":"Delete a measurement anchor (one undo step).","method":"DELETE","path":"/sessions/{sid}/agent/anchors/{aid}","access":"share","effect":"write","mcp":"web","py":"delete_anchor('a1')","ops":["delete_anchor"],"status":"live","server":"web","returns":"{ok, deleted, count}","level":"propose","description":"Delete a measurement anchor (one undo step). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Slett et måle-anker (ett angresteg).","category_label":"Mål på stedet (måle-ankere)","input_schema":{"type":"object","properties":{"aid":{"type":"string","title":"Aid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["aid"]}},{"name":"check_anchors","cat":"anker","no":"Kontroller modellen mot ankerne: per anker målt, modell og avvik (mm), status ok|advarsel|rod|ukjent. Terskel fra innstillingene anchor.warn_mm / anchor.red_mm (kan overstyres).","en":"Check the model against the anchors: per anchor measured, model and deviation (mm), status ok|advarsel|rod|ukjent. Thresholds come from the settings anchor.warn_mm / anchor.red_mm (can be overridden).","method":"GET","path":"/sessions/{sid}/agent/anchors/check","access":"share","effect":"read","mcp":"web","py":"check_anchors()","ops":["check_anchors"],"status":"live","server":"web","returns":"{ankere:[{id, kind, malt, modell, avvik_mm, status}], ok, advarsel, rod, ukjent, alt_ok}","level":"read","description":"Check the model against the anchors: per anchor measured, model and deviation (mm), status ok|advarsel|rod|ukjent. Thresholds come from the settings anchor.warn_mm / anchor.red_mm (can be overridden). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Kontroller modellen mot ankerne: per anker målt, modell og avvik (mm), status ok|advarsel|rod|ukjent. Terskel fra innstillingene anchor.warn_mm / anchor.red_mm (kan overstyres).","category_label":"Mål på stedet (måle-ankere)","input_schema":{"type":"object","properties":{"warn_mm":{"anyOf":[{"type":"number","maximum":1000,"minimum":1},{"type":"null"}],"title":"Warn Mm"},"red_mm":{"anyOf":[{"type":"number","maximum":5000,"minimum":1},{"type":"null"}],"title":"Red Mm"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"list_photos","cat":"bildetur","no":"Bildeturen: bildene i økta i turrekkefølge, filtrert på etasje (level), rom, element («D2», «V7», navn eller id), fasade (Nord/Øst/Syd/Vest), fag (arkitekt/tomrer/elektro/ror/ventilasjon/annet), vegg, kind (rett/perspektiv/oversikt/innhuk/detalj) og tidspunkt (since/until) — kombinerbare. Hvert bilde: id, name, x, y, level, yaw_deg (kompass i modellen, 0 = +y), fov_deg, fag, fasade, vegg, kind, focal_mm, focal35_mm, pixels, distance_m, target, geo, device, occlusion, hides, elements + element_names, room, note, order, taken. Svaret har også counts_by_element (antall bilder per element).","en":"The photo tour: the photos of the session in tour order, filtered by storey (level), room, element ('D2', 'V7', name or id), facade (Nord/Øst/Syd/Vest), trade (fag), wall, kind and time (since/until) — combinable. Each photo: id, name, x, y, level, yaw_deg (compass in the model, 0 = +y), fov_deg, fag, fasade, vegg, kind, focal_mm, focal35_mm, pixels, distance_m, target, geo, device, occlusion, hides, elements + element_names, room, note, order, taken. The answer also has counts_by_element (photos per element).","method":"GET","path":"/sessions/{sid}/agent/photos","access":"share","effect":"read","mcp":"web","py":"list_photos(element='D2')","ops":["list_photos"],"status":"live","server":"web","returns":"{photos:[{id, name, x, y, level, yaw_deg, fov_deg, fag, fasade, vegg, kind, elements, element_names, room, note, order, taken}], count, total, counts_by_element, choices}","level":"read","description":"The photo tour: the photos of the session in tour order, filtered by storey (level), room, element ('D2', 'V7', name or id), facade (Nord/Øst/Syd/Vest), trade (fag), wall, kind and time (since/until) — combinable. Each photo: id, name, x, y, level, yaw_deg (compass in the model, 0 = +y), fov_deg, fag, fasade, vegg, kind, focal_mm, focal35_mm, pixels, distance_m, target, geo, device, occlusion, hides, elements + element_names, room, note, order, taken. The answer also has counts_by_element (photos per element). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Bildeturen: bildene i økta i turrekkefølge, filtrert på etasje (level), rom, element («D2», «V7», navn eller id), fasade (Nord/Øst/Syd/Vest), fag (arkitekt/tomrer/elektro/ror/ventilasjon/annet), vegg, kind (rett/perspektiv/oversikt/innhuk/detalj) og tidspunkt (since/until) — kombinerbare. Hvert bilde: id, name, x, y, level, yaw_deg (kompass i modellen, 0 = +y), fov_deg, fag, fasade, vegg, kind, focal_mm, focal35_mm, pixels, distance_m, target, geo, device, occlusion, hides, elements + element_names, room, note, order, taken. Svaret har også counts_by_element (antall bilder per element).","category_label":"Bildetur: bilder med pinne på planen","input_schema":{"type":"object","properties":{"level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"},"room":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room"},"element":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Element"},"order":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"},"fasade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fasade"},"fag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fag"},"vegg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vegg"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"},"until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Until"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"add_photo","cat":"bildetur","no":"Legg ETT bilde (jpg/png/heic) i bildeturen (ett angresteg). Originalen lagres uforandret med EXIF, miniatyr lages. Gi bildet som data_base64 (JSON) eller send filen som kropp med Content-Type image/*; pose og kobling er valgfrie: x, y (m i modellen), level (etasje-n), yaw_deg (kompass i modellen, 0 = +y/nord, med klokka), fov_deg (synsfelt, standard fra innstillingen photo.fov_deg), elements (D2, V7, navn eller id), room, note. Maskinen gjetter ALDRI posen: sett den bare når brukeren har sagt hvor bildet er tatt. Kundebilder blir i prosjektet og sendes ikke videre. Kall save_version etterpå.","en":"Add ONE photo (jpg/png/heic) to the photo tour (one undo step). The original is stored unchanged with EXIF, a thumbnail is made. Give the photo as data_base64 (JSON) or send the file as the body with Content-Type image/*; pose and links are optional: x, y (m in the model), level (storey n), yaw_deg (compass in the model, 0 = +y/north, clockwise), fov_deg (field of view, default from the setting photo.fov_deg), elements (D2, V7, name or id), room, note. The machine NEVER guesses the pose: set it only when the user said where the photo was taken. Customer photos stay in the project and are not sent on. Call save_version afterwards.","method":"POST","path":"/sessions/{sid}/agent/photos","access":"share","effect":"write","mcp":"web","py":"add_photo(file_key='…', x=3.2, y=4.1, level='1', yaw_deg=90, elements=['D2'])","ops":["add_photo"],"params":{"type":"object","properties":{"name":{"type":"string"},"data_base64":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"},"level":{"type":"string"},"yaw_deg":{"type":"number"},"fov_deg":{"type":"number"},"elements":{"type":"array","items":{"type":"string"}},"room":{"type":"string"},"note":{"type":"string"},"sid":{"type":"string"}},"required":["data_base64"]},"example":{"name":"stue-1.jpg","data_base64":"<base64 of the jpg>","x":3.2,"y":4.1,"level":"1","yaw_deg":90,"elements":["D2"],"room":"Stue","note":"Glassdøra mot terrassen"},"status":"live","server":"web","returns":"{ok, photo:{id, ...}, count}","level":"propose","description":"Add ONE photo (jpg/png/heic) to the photo tour (one undo step). The original is stored unchanged with EXIF, a thumbnail is made. Give the photo as data_base64 (JSON) or send the file as the body with Content-Type image/*; pose and links are optional: x, y (m in the model), level (storey n), yaw_deg (compass in the model, 0 = +y/north, clockwise), fov_deg (field of view, default from the setting photo.fov_deg), elements (D2, V7, name or id), room, note. The machine NEVER guesses the pose: set it only when the user said where the photo was taken. Customer photos stay in the project and are not sent on. Call save_version afterwards. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Legg ETT bilde (jpg/png/heic) i bildeturen (ett angresteg). Originalen lagres uforandret med EXIF, miniatyr lages. Gi bildet som data_base64 (JSON) eller send filen som kropp med Content-Type image/*; pose og kobling er valgfrie: x, y (m i modellen), level (etasje-n), yaw_deg (kompass i modellen, 0 = +y/nord, med klokka), fov_deg (synsfelt, standard fra innstillingen photo.fov_deg), elements (D2, V7, navn eller id), room, note. Maskinen gjetter ALDRI posen: sett den bare når brukeren har sagt hvor bildet er tatt. Kundebilder blir i prosjektet og sendes ikke videre. Kall save_version etterpå.","category_label":"Bildetur: bilder med pinne på planen","input_schema":{"type":"object","properties":{"name":{"type":"string"},"data_base64":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"},"level":{"type":"string"},"yaw_deg":{"type":"number"},"fov_deg":{"type":"number"},"elements":{"type":"array","items":{"type":"string"}},"room":{"type":"string"},"note":{"type":"string"},"sid":{"type":"string"}},"required":["data_base64"]}},{"name":"set_photo_pose","cat":"bildetur","no":"Flytt/drei pinnen til et bilde (ett angresteg). x, y (m) og level flytter hele pinnen (alle bilder på den); yaw_deg (kompass i modellen, 0 = +y, med klokka) og fov_deg gjelder bare dette bildet; order = plass i turen; same_pin_as = id til et bilde du vil dele pinne med; unplace=true tar pinnen bort. Posen er omtrentlig: dokumentasjon, ikke måling.","en":"Move/turn the pin of a photo (one undo step). x, y (m) and level move the whole pin (all photos on it); yaw_deg (compass in the model, 0 = +y, clockwise) and fov_deg apply to this photo only; order = place in the tour; same_pin_as = id of a photo to share a pin with; unplace=true removes the pin. The pose is approximate: documentation, not measurement.","method":"PATCH","path":"/sessions/{sid}/agent/photos/{pid}/pose","access":"share","effect":"write","mcp":"web","py":"set_photo_pose('ph1a2b3c4d', x=3.2, y=4.1, yaw_deg=90)","ops":["set_photo_pose"],"example":{"x":3.2,"y":4.1,"level":"1","yaw_deg":90,"fov_deg":70},"status":"live","server":"web","returns":"{ok, photo}","level":"propose","description":"Move/turn the pin of a photo (one undo step). x, y (m) and level move the whole pin (all photos on it); yaw_deg (compass in the model, 0 = +y, clockwise) and fov_deg apply to this photo only; order = place in the tour; same_pin_as = id of a photo to share a pin with; unplace=true removes the pin. The pose is approximate: documentation, not measurement. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Flytt/drei pinnen til et bilde (ett angresteg). x, y (m) og level flytter hele pinnen (alle bilder på den); yaw_deg (kompass i modellen, 0 = +y, med klokka) og fov_deg gjelder bare dette bildet; order = plass i turen; same_pin_as = id til et bilde du vil dele pinne med; unplace=true tar pinnen bort. Posen er omtrentlig: dokumentasjon, ikke måling.","category_label":"Bildetur: bilder med pinne på planen","input_schema":{"type":"object","properties":{"pid":{"type":"string","title":"Pid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"x":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"X"},"y":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y"},"level":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Level"},"yaw_deg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Yaw Deg"},"fov_deg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fov Deg"},"order":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Order"},"same_pin_as":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Same Pin As"},"unplace":{"type":"boolean","title":"Unplace","default":false}},"required":["pid"]}},{"name":"link_photo","cat":"bildetur","no":"Knytt et bilde til elementer, rom og notat (ett angresteg; bare feltene du gir). elements: «D2», «V7», navn eller id; mode: add (standard) | set (erstatt) | remove. Bildet viser da disse elementene, og Entity Info på elementet teller bildet. BuildChat kan foreslå «dette bildet viser D2»; brukeren bekrefter.","en":"Link a photo to elements, a room and a note (one undo step; only the fields you give). elements: 'D2', 'V7', name or id; mode: add (default) | set (replace) | remove. The photo then shows those elements, and Entity Info on the element counts the photo. BuildChat may suggest 'this photo shows D2'; the user confirms.","method":"POST","path":"/sessions/{sid}/agent/photos/{pid}/link","access":"share","effect":"write","mcp":"web","py":"link_photo('ph1a2b3c4d', elements=['D2'], note='Glassdøra')","ops":["link_photo"],"example":{"elements":["D2"],"room":"Stue","note":"Glassdøra mot terrassen","mode":"add"},"status":"live","server":"web","returns":"{ok, photo}","level":"propose","description":"Link a photo to elements, a room and a note (one undo step; only the fields you give). elements: 'D2', 'V7', name or id; mode: add (default) | set (replace) | remove. The photo then shows those elements, and Entity Info on the element counts the photo. BuildChat may suggest 'this photo shows D2'; the user confirms. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Knytt et bilde til elementer, rom og notat (ett angresteg; bare feltene du gir). elements: «D2», «V7», navn eller id; mode: add (standard) | set (erstatt) | remove. Bildet viser da disse elementene, og Entity Info på elementet teller bildet. BuildChat kan foreslå «dette bildet viser D2»; brukeren bekrefter.","category_label":"Bildetur: bilder med pinne på planen","input_schema":{"type":"object","properties":{"pid":{"type":"string","title":"Pid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"elements":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Elements"},"room":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Room"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"},"mode":{"type":"string","title":"Mode","default":"add"},"fag":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fag"},"fasade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fasade"},"vegg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vegg"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"distance_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance M"},"occlusion":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Occlusion"},"hides":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Hides"}},"required":["pid"]}},{"name":"get_photo_image","cat":"bildetur","no":"Selve bildet (original, uforandret, med EXIF) som bytes; miniatyr er .../thumb (for UI). Bare bilder i økta/prosjektet.","en":"The photo itself (original, unchanged, with EXIF) as bytes; the thumbnail is .../thumb (for the UI). Only photos in the session/project.","method":"GET","path":"/sessions/{sid}/agent/photos/{pid}/image","access":"share","effect":"read","mcp":"web","status":"live","server":"web","returns":"image bytes","level":"read","description":"The photo itself (original, unchanged, with EXIF) as bytes; the thumbnail is .../thumb (for the UI). Only photos in the session/project. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Selve bildet (original, uforandret, med EXIF) som bytes; miniatyr er .../thumb (for UI). Bare bilder i økta/prosjektet.","category_label":"Bildetur: bilder med pinne på planen","input_schema":{"type":"object","properties":{"pid":{"type":"string","title":"Pid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["pid"]}},{"name":"delete_photo","cat":"bildetur","no":"Slett et bilde fra turen. BARE en innlogget person med rett (oppretter, team-admin, eier, systemadmin) gjør det i appen: agenter, API-nøkler og delelenker får 403 (samme regel som sletting av versjoner). Er bildet med i «Sist godkjent»/«Som bygget»-versjonen, kreves confirm_name = prosjektnavnet (409 protected_versions). Original og miniatyr slettes fra lageret. Ingen MCP-tool.","en":"Delete a photo from the tour. ONLY a logged-in person with the right (creator, team admin, owner, system admin) does it in the app: agents, API keys and share links get 403 (same rule as deleting versions). If the photo is part of the 'Last approved'/'As built' version, confirm_name = the project name is required (409 protected_versions). The original and thumbnail are deleted from storage. No MCP tool.","method":"DELETE","path":"/sessions/{sid}/agent/photos/{pid}","access":"login","effect":"write","status":"live","server":"web","returns":"{ok, deleted, count}","level":"propose","description":"Delete a photo from the tour. ONLY a logged-in person with the right (creator, team admin, owner, system admin) does it in the app: agents, API keys and share links get 403 (same rule as deleting versions). If the photo is part of the 'Last approved'/'As built' version, confirm_name = the project name is required (409 protected_versions). The original and thumbnail are deleted from storage. No MCP tool. [logged in] — NO: Slett et bilde fra turen. BARE en innlogget person med rett (oppretter, team-admin, eier, systemadmin) gjør det i appen: agenter, API-nøkler og delelenker får 403 (samme regel som sletting av versjoner). Er bildet med i «Sist godkjent»/«Som bygget»-versjonen, kreves confirm_name = prosjektnavnet (409 protected_versions). Original og miniatyr slettes fra lageret. Ingen MCP-tool.","category_label":"Bildetur: bilder med pinne på planen","input_schema":{"type":"object","properties":{"pid":{"type":"string","title":"Pid"},"confirm_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirm Name"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["pid"]}},{"name":"list_tasks","cat":"tolkebenk","no":"Tolkebenk-oppdragene du har tilgang til (valgfritt project_id), med fremdrift (deler, akseptert, åpne spørsmål). Nøkkel: bare oppdrag i prosjekter innenfor nøkkelens omfang.","en":"The interpretation-bench tasks you can access (optional project_id), with progress (parts, accepted, open questions). Key: only tasks in projects inside the key's scope.","method":"GET","path":"/c18/tasks","access":"login","effect":"read","mcp":"web","status":"live","server":"web","returns":"{tasks:[{id, title, project_id, progress:{total, accepted, open_questions}}]}","level":"read","description":"The interpretation-bench tasks you can access (optional project_id), with progress (parts, accepted, open questions). Key: only tasks in projects inside the key's scope. [logged in] — NO: Tolkebenk-oppdragene du har tilgang til (valgfritt project_id), med fremdrift (deler, akseptert, åpne spørsmål). Nøkkel: bare oppdrag i prosjekter innenfor nøkkelens omfang.","category_label":"Tolkebenk: oppdrag, avklaringer, rettelser og regler (C18)","input_schema":{"type":"object","properties":{"project_id":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Project Id"},"archived":{"type":"boolean","default":false,"title":"Archived"}}}},{"name":"get_task","cat":"tolkebenk","no":"Ett oppdrag med de sju feltene, delene (status, kilde, mål, kvitteringer), avklaringene, rettelsene og målefaktatabellen (avvik over terskelen er markert).","en":"One task with its seven fields, parts (status, source, facts, receipts), clarifications, corrections and the fact table (deviations over the threshold are marked).","method":"GET","path":"/c18/tasks/{tid}","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"tid":{"type":"string"}},"required":["tid"]},"status":"live","server":"web","returns":"{task:{id, title, parts, clarifications, corrections, table, settings}}","level":"read","description":"One task with its seven fields, parts (status, source, facts, receipts), clarifications, corrections and the fact table (deviations over the threshold are marked). [logged in] — NO: Ett oppdrag med de sju feltene, delene (status, kilde, mål, kvitteringer), avklaringene, rettelsene og målefaktatabellen (avvik over terskelen er markert).","category_label":"Tolkebenk: oppdrag, avklaringer, rettelser og regler (C18)","input_schema":{"type":"object","properties":{"tid":{"type":"string"}},"required":["tid"]}},{"name":"create_task","cat":"tolkebenk","no":"Nytt tolkebenk-oppdrag i et prosjekt (kort uten tavle): title (nøytral, uten kundenavn), project_id, user_instruction, agent_instruction. Krever redigeringsrett i prosjektet.","en":"New interpretation-bench task in a project (a card without a board): title (neutral, no customer name), project_id, user_instruction, agent_instruction. Needs edit access to the project.","method":"POST","path":"/c18/tasks","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"title":{"type":"string"},"project_id":{"type":"string"},"version_ref":{"type":"string"},"user_instruction":{"type":"string"},"agent_instruction":{"type":"string"}},"required":["title","project_id"]},"example":{"title":"H1 etasje 1","project_id":"<32 hex>","user_instruction":"Mål rom og dører."},"status":"live","server":"web","returns":"{task}","level":"propose","description":"New interpretation-bench task in a project (a card without a board): title (neutral, no customer name), project_id, user_instruction, agent_instruction. Needs edit access to the project. [logged in] — NO: Nytt tolkebenk-oppdrag i et prosjekt (kort uten tavle): title (nøytral, uten kundenavn), project_id, user_instruction, agent_instruction. Krever redigeringsrett i prosjektet.","category_label":"Tolkebenk: oppdrag, avklaringer, rettelser og regler (C18)","input_schema":{"type":"object","properties":{"title":{"type":"string"},"project_id":{"type":"string"},"version_ref":{"type":"string"},"user_instruction":{"type":"string"},"agent_instruction":{"type":"string"}},"required":["title","project_id"]}},{"name":"add_task_part","cat":"tolkebenk","no":"Legg en del til oppdraget: kind = form | plan | vegg | rom | bilde_rom | bilde_vegg | apning | fasade | snitt | tak, label, ref (side/bilde-id), step (1 ytre form, 2 innvendig per rom og vegg, 3 ytre fasade og tak), element_ids (D2, V7), source (handmaal|laser|skann|foto|salgsoppgave|antatt) og facts (mm per kilde, «modell» = modellens mål). Delen starter som ikke_sett; aksept er et menneskes.","en":"Add a part to the task: kind = form | plan | vegg | rom | bilde_rom | bilde_vegg | apning | fasade | snitt | tak, label, ref (page / photo id), step (1 outer shape, 2 interior per room and wall, 3 outer facade and roof), element_ids (D2, V7), source (handmaal|laser|skann|foto|salgsoppgave|antatt) and facts (mm per source, 'modell' = the model's measure). The part starts as ikke_sett; acceptance is a person's.","method":"POST","path":"/c18/tasks/{tid}/parts","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"tid":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"},"ref":{"type":"string"},"step":{"type":"integer"},"note":{"type":"string"},"element_ids":{"type":"array","items":{"type":"string"}},"source":{"type":"string"},"facts":{"type":"object"}},"required":["tid","kind"]},"status":"live","server":"web","returns":"{part}","level":"propose","description":"Add a part to the task: kind = form | plan | vegg | rom | bilde_rom | bilde_vegg | apning | fasade | snitt | tak, label, ref (page / photo id), step (1 outer shape, 2 interior per room and wall, 3 outer facade and roof), element_ids (D2, V7), source (handmaal|laser|skann|foto|salgsoppgave|antatt) and facts (mm per source, 'modell' = the model's measure). The part starts as ikke_sett; acceptance is a person's. [logged in] — NO: Legg en del til oppdraget: kind = form | plan | vegg | rom | bilde_rom | bilde_vegg | apning | fasade | snitt | tak, label, ref (side/bilde-id), step (1 ytre form, 2 innvendig per rom og vegg, 3 ytre fasade og tak), element_ids (D2, V7), source (handmaal|laser|skann|foto|salgsoppgave|antatt) og facts (mm per kilde, «modell» = modellens mål). Delen starter som ikke_sett; aksept er et menneskes.","category_label":"Tolkebenk: oppdrag, avklaringer, rettelser og regler (C18)","input_schema":{"type":"object","properties":{"tid":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"},"ref":{"type":"string"},"step":{"type":"integer"},"note":{"type":"string"},"element_ids":{"type":"array","items":{"type":"string"}},"source":{"type":"string"},"facts":{"type":"object"}},"required":["tid","kind"]}},{"name":"add_clarification","cat":"tolkebenk","no":"Still et spørsmål til brukeren på oppdraget (valgfritt part_id og element_id). Et åpent spørsmål stopper aksept av delen; bare et menneske svarer.","en":"Ask the user a question on the task (optional part_id and element_id). An open question blocks the acceptance of the part; only a person answers.","method":"POST","path":"/c18/tasks/{tid}/clarifications","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"tid":{"type":"string"},"question":{"type":"string"},"part_id":{"type":"string"},"element_id":{"type":"string"}},"required":["tid","question"]},"status":"live","server":"web","returns":"{clarification}","level":"propose","description":"Ask the user a question on the task (optional part_id and element_id). An open question blocks the acceptance of the part; only a person answers. [logged in] — NO: Still et spørsmål til brukeren på oppdraget (valgfritt part_id og element_id). Et åpent spørsmål stopper aksept av delen; bare et menneske svarer.","category_label":"Tolkebenk: oppdrag, avklaringer, rettelser og regler (C18)","input_schema":{"type":"object","properties":{"tid":{"type":"string"},"question":{"type":"string"},"part_id":{"type":"string"},"element_id":{"type":"string"}},"required":["tid","question"]}},{"name":"log_correction","cat":"tolkebenk","no":"Logg en rettelse (rettelse): hva du hadde tolket (interpreted) og hva som var riktig (correct), med kilde (handmaal|laser|skann|foto|salgsoppgave|antatt) og element. Hver agentkjøring skal avsluttes med rettelser og regelforslag (propose_rule).","en":"Log a correction: what you had interpreted (interpreted) and what was right (correct), with the source and element. Every agent run should end with corrections and rule proposals (propose_rule).","method":"POST","path":"/c18/tasks/{tid}/corrections","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"tid":{"type":"string"},"part_id":{"type":"string"},"element_id":{"type":"string"},"element_kind":{"type":"string"},"interpreted":{"type":"object"},"correct":{"type":"object"},"source":{"type":"string"},"note":{"type":"string"}},"required":["tid"]},"status":"live","server":"web","returns":"{correction}","level":"propose","description":"Log a correction: what you had interpreted (interpreted) and what was right (correct), with the source and element. Every agent run should end with corrections and rule proposals (propose_rule). [logged in] — NO: Logg en rettelse (rettelse): hva du hadde tolket (interpreted) og hva som var riktig (correct), med kilde (handmaal|laser|skann|foto|salgsoppgave|antatt) og element. Hver agentkjøring skal avsluttes med rettelser og regelforslag (propose_rule).","category_label":"Tolkebenk: oppdrag, avklaringer, rettelser og regler (C18)","input_schema":{"type":"object","properties":{"tid":{"type":"string"},"part_id":{"type":"string"},"element_id":{"type":"string"},"element_kind":{"type":"string"},"interpreted":{"type":"object"},"correct":{"type":"object"},"source":{"type":"string"},"note":{"type":"string"}},"required":["tid"]}},{"name":"propose_rule","cat":"tolkebenk","no":"Foreslå en tolkeregel (status forslag; bare systemadmin godkjenner). Teksten er anonym: ingen navn, adresser, gnr/bnr eller prosjektnavn (renses, og avvises hvis den nevner oppdraget). task_id er påkrevd med nøkkel; correction_ids er beviset.","en":"Propose an interpretation rule (status forslag; only a system admin approves). The text is anonymous: no names, addresses, gnr/bnr or project names (scrubbed, and refused if it names the task). task_id is required with a key; correction_ids are the evidence.","method":"POST","path":"/c18/rules","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"text":{"type":"string"},"scope_kind":{"type":"string","enum":["symboltype","byggetype","element","annet"]},"scope_value":{"type":"string"},"correction_ids":{"type":"array","items":{"type":"string"}},"task_id":{"type":"string"}},"required":["text"]},"status":"live","server":"web","returns":"{rule, scrubbed}","level":"propose","description":"Propose an interpretation rule (status forslag; only a system admin approves). The text is anonymous: no names, addresses, gnr/bnr or project names (scrubbed, and refused if it names the task). task_id is required with a key; correction_ids are the evidence. [logged in] — NO: Foreslå en tolkeregel (status forslag; bare systemadmin godkjenner). Teksten er anonym: ingen navn, adresser, gnr/bnr eller prosjektnavn (renses, og avvises hvis den nevner oppdraget). task_id er påkrevd med nøkkel; correction_ids er beviset.","category_label":"Tolkebenk: oppdrag, avklaringer, rettelser og regler (C18)","input_schema":{"type":"object","properties":{"text":{"type":"string"},"scope_kind":{"type":"string","enum":["symboltype","byggetype","element","annet"]},"scope_value":{"type":"string"},"correction_ids":{"type":"array","items":{"type":"string"}},"task_id":{"type":"string"}},"required":["text"]}},{"name":"list_rules","cat":"tolkebenk","no":"Tolkereglene: godkjente (alle innloggede) og eget teams forslag. Anonymt: id (R12), tekst, gjelder, bevis, treff/bom. Valgfritt status = forslag|godkjent|avvist.","en":"The interpretation rules: approved (all logged in) and your own team's proposals. Anonymous: id (R12), text, scope, evidence, hits/misses. Optional status = forslag|godkjent|avvist.","method":"GET","path":"/c18/rules","access":"login","effect":"read","mcp":"web","status":"live","server":"web","returns":"{rules:[{ref, text, scope_kind, scope_value, status, evidence_n, hits, misses}]}","level":"read","description":"The interpretation rules: approved (all logged in) and your own team's proposals. Anonymous: id (R12), text, scope, evidence, hits/misses. Optional status = forslag|godkjent|avvist. [logged in] — NO: Tolkereglene: godkjente (alle innloggede) og eget teams forslag. Anonymt: id (R12), tekst, gjelder, bevis, treff/bom. Valgfritt status = forslag|godkjent|avvist.","category_label":"Tolkebenk: oppdrag, avklaringer, rettelser og regler (C18)","input_schema":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","maxLength":12},{"type":"null"}],"title":"Status"}}}},{"name":"get_georef","cat":"georef","no":"Prosjektets georeferanse (EUREF89 UTM): crs, origin {n, e, h} = verdenskoordinatene til modellens (0,0), rotation_deg (fra modellens +y til nord, med klokka), limits og plankrav (constraints), hjørnene A, B, C … i verdenskoordinater, fasadenavn etter sann nord og valglistene. georef null = ingen (nord = oppover i planen).","en":"The project's georeference (EUREF89 UTM): crs, origin {n, e, h} = world coordinates of the model's (0,0), rotation_deg (model +y to north, clockwise), limits and plan constraints, corners A, B, C … in world coordinates, facade names by true north and the choice lists. georef null = none (north = up in the plan).","method":"GET","path":"/sessions/{sid}/agent/georef","access":"share","effect":"read","mcp":"web","py":"get_georef()","ops":["get_georef"],"status":"live","server":"web","returns":"{georef, crs_name, corners:[{label, n, e, model}], facades, north_deg, convergence_deg, distance_ref, choices}","level":"read","description":"The project's georeference (EUREF89 UTM): crs, origin {n, e, h} = world coordinates of the model's (0,0), rotation_deg (model +y to north, clockwise), limits and plan constraints, corners A, B, C … in world coordinates, facade names by true north and the choice lists. georef null = none (north = up in the plan). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Prosjektets georeferanse (EUREF89 UTM): crs, origin {n, e, h} = verdenskoordinatene til modellens (0,0), rotation_deg (fra modellens +y til nord, med klokka), limits og plankrav (constraints), hjørnene A, B, C … i verdenskoordinater, fasadenavn etter sann nord og valglistene. georef null = ingen (nord = oppover i planen).","category_label":"Georeferanse, koordinatplan og plankrav","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"set_georef","cat":"georef","no":"Sett georeferansen (ett angresteg): crs 25832|25833|25835 eller en annen EPSG, origin {n, e, h?}, rotation_deg, limits {ridge_max_m, gesims_max_m, min_distance_m, avg_terrain_h}, constraints [{kind plangrense|byggegrense|nabogrense|bygg, points [[N, E], …], keep ost|vest|nord|sor|venstre|hoyre, closed, ref fasadeliv|yttervegg|takutstikk, min_m, name}]. Bare feltene du gir endres; constraints erstatter listen; clear=true fjerner alt. Koordinater fra brukeren: [N, E] (x = nord).","en":"Set the georeference (one undo step): crs, origin {n, e, h?}, rotation_deg, limits, constraints (zoning line with the side to keep to, neighbour boundary, other buildings; ref = what the distance is measured from). Only the fields you give change; constraints replaces the list; clear=true removes it all.","method":"PUT","path":"/sessions/{sid}/agent/georef","access":"share","effect":"write","mcp":"web","py":"set_georef(crs=25832, origin={'n': 6600000.0, 'e': 500000.0}, rotation_deg=31.4)","ops":["set_georef"],"example":{"crs":25832,"origin":{"n":6600000.0,"e":500000.0,"h":100.0},"rotation_deg":31.4,"limits":{"ridge_max_m":4.0,"gesims_max_m":3.0},"constraints":[{"kind":"plangrense","keep":"ost","points":[[6599990.0,499995.0],[6600020.0,499995.0]]}]},"status":"live","server":"web","returns":"{ok, georef, corners, facades, ...}","level":"propose","description":"Set the georeference (one undo step): crs, origin {n, e, h?}, rotation_deg, limits, constraints (zoning line with the side to keep to, neighbour boundary, other buildings; ref = what the distance is measured from). Only the fields you give change; constraints replaces the list; clear=true removes it all. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Sett georeferansen (ett angresteg): crs 25832|25833|25835 eller en annen EPSG, origin {n, e, h?}, rotation_deg, limits {ridge_max_m, gesims_max_m, min_distance_m, avg_terrain_h}, constraints [{kind plangrense|byggegrense|nabogrense|bygg, points [[N, E], …], keep ost|vest|nord|sor|venstre|hoyre, closed, ref fasadeliv|yttervegg|takutstikk, min_m, name}]. Bare feltene du gir endres; constraints erstatter listen; clear=true fjerner alt. Koordinater fra brukeren: [N, E] (x = nord).","category_label":"Georeferanse, koordinatplan og plankrav","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"crs":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Crs","description":"EPSG: 25832 | 25833 | 25835 eller en annen kode"},"origin":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Origin","description":"{n, e, h?}: nord, øst (UTM, m) og høyde NN2000 for modellens z = 0"},"rotation_deg":{"anyOf":[{"type":"number","maximum":360.0,"minimum":-360.0},{"type":"null"}],"title":"Rotation Deg","description":"fra modellens +y til nord, med klokka (grader)"},"limits":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Limits","description":"{ridge_max_m, gesims_max_m, min_distance_m, avg_terrain_h, avg_terrain_z}"},"constraints":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":200},{"type":"null"}],"title":"Constraints","description":"[{kind, points [[N, E], …], keep, closed, ref, min_m, name}]"},"source":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Source"},"clear":{"type":"boolean","title":"Clear","default":false}}}},{"name":"fit_georef","cat":"georef","no":"Tilpass georeferansen fra 2 eller flere kjente hjørner (rotasjon + forskyvning): corners [{model: [x, y], world: [N, E]}], eller bare [[N, E], …] for alle hjørnene i fasadelivet (rekkefølgen finnes selv). Svar: rotation_deg, origin, restavvik per hjørne, rms_m, max_m, warn (over georef.fit_warn_m, standard 0,05 m). apply=false regner bare.","en":"Fit the georeference from 2 or more known corners (rotation + translation): corners [{model, world}] or just the world points of all facade corners (order found). Answer: rotation_deg, origin, residual per corner, rms_m, max_m, warn (over georef.fit_warn_m, default 0.05 m). apply=false only computes.","method":"POST","path":"/sessions/{sid}/agent/georef/fit","access":"share","effect":"write","mcp":"web","py":"fit_georef([[6600000.0, 500000.0], [6600004.1, 500002.5]], apply=False)","ops":["fit_georef"],"example":{"corners":[{"model":[0,0],"world":[6600000.0,500000.0]},{"model":[4.8,0],"world":[6600002.5,500004.1]}],"apply":true},"status":"live","server":"web","returns":"{ok, applied, fit:{origin, rotation_deg, residuals_m, rms_m, max_m, scale, warn, melding}, georef}","level":"propose","description":"Fit the georeference from 2 or more known corners (rotation + translation): corners [{model, world}] or just the world points of all facade corners (order found). Answer: rotation_deg, origin, residual per corner, rms_m, max_m, warn (over georef.fit_warn_m, default 0.05 m). apply=false only computes. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Tilpass georeferansen fra 2 eller flere kjente hjørner (rotasjon + forskyvning): corners [{model: [x, y], world: [N, E]}], eller bare [[N, E], …] for alle hjørnene i fasadelivet (rekkefølgen finnes selv). Svar: rotation_deg, origin, restavvik per hjørne, rms_m, max_m, warn (over georef.fit_warn_m, standard 0,05 m). apply=false regner bare.","category_label":"Georeferanse, koordinatplan og plankrav","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"corners":{"items":{},"type":"array","maxItems":200,"minItems":2,"title":"Corners","description":"[{model: [x, y], world: [N, E]}] eller [[N, E], …]"},"apply":{"type":"boolean","title":"Apply","default":true},"crs":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Crs"}},"required":["corners"]}},{"name":"check_plan_constraints","cat":"georef","no":"Bygget mot plankravene: plan-/byggegrense (hele bygget på riktig side), minsteavstand til nabogrense og andre bygg (georef.min_distance_m, standard 1,0 m), møne- og gesimshøyde over gjennomsnittlig terreng (limits). Margin i cm per krav og hvilken referanse avstanden er målt fra: ref fasadeliv (utvendig kledning, standard) | yttervegg (bindingsverk) | takutstikk (inkludert takutstikk). Endrer ingenting.","en":"The building against the plan constraints: zoning line (the whole building on the right side), minimum distance to the neighbour boundary and other buildings, ridge and gesims height over average terrain. Margin in cm per constraint and the reference used: ref fasadeliv (default) | yttervegg | takutstikk. Changes nothing.","method":"GET","path":"/sessions/{sid}/agent/georef/check","access":"share","effect":"read","mcp":"web","py":"check_plan_constraints()","ops":["check_plan_constraints"],"params":{"type":"object","properties":{"ref":{"type":"string","enum":["fasadeliv","yttervegg","takutstikk"]}}},"status":"live","server":"web","returns":"{ok, krav:[{id, kind, name, status ok|brudd|ukjent, margin_cm, ref, ref_label, what}], brudd, referanse, text}","level":"read","description":"The building against the plan constraints: zoning line (the whole building on the right side), minimum distance to the neighbour boundary and other buildings, ridge and gesims height over average terrain. Margin in cm per constraint and the reference used: ref fasadeliv (default) | yttervegg | takutstikk. Changes nothing. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Bygget mot plankravene: plan-/byggegrense (hele bygget på riktig side), minsteavstand til nabogrense og andre bygg (georef.min_distance_m, standard 1,0 m), møne- og gesimshøyde over gjennomsnittlig terreng (limits). Margin i cm per krav og hvilken referanse avstanden er målt fra: ref fasadeliv (utvendig kledning, standard) | yttervegg (bindingsverk) | takutstikk (inkludert takutstikk). Endrer ingenting.","category_label":"Georeferanse, koordinatplan og plankrav","input_schema":{"type":"object","properties":{"ref":{"type":"string","enum":["fasadeliv","yttervegg","takutstikk"]}}}},{"name":"delivery_check","cat":"scene","no":"Leveringssjekk av tegningssettet FØR det sendes til kunde/kommune: etasjer, kledning (bord, hjørner, åpninger), baksider/dobbeltflater/kantlinjetetthet, tak, Layout-sider (visninger, papir/målestokk, snittmerker, tittelfelt, dato), mål, spor av etterbehandling (maske kun i PDF, tvunget etasje, fjernede mål), rom, terreng og mot fasit. Endrer ingenting; en sjekk som kræsjer gir bare en info-linje. Svar per funn: id, severity (feil|advarsel|info), where, what (hverdagsnorsk), fix (hvor du retter for hånd), key. only/skip = sjekk-id eller prefiks (kommaseparert). Terskler = innstillinger i gruppen «Leveringssjekk» (get_prefs/set_prefs).","en":"Delivery check of the drawing set BEFORE it goes to the client/municipality: storeys, cladding (boards, corners, openings), back faces/double faces/edge density, roof, Layout pages (views, paper/scale, section marks, title block, date), dimensions, traces of post-processing (mask only in the PDF, forced storey, removed dimensions), rooms, terrain and against reference measures. Changes nothing; a check that crashes just gives an info line. Per finding: id, severity (feil|advarsel|info), where, what (everyday Norwegian), fix (where to fix it by hand), key. only/skip = check id or prefix (comma separated). Thresholds are settings in the group 'Leveringssjekk' (get_prefs/set_prefs).","method":"GET","path":"/sessions/{sid}/agent/delivery-check","access":"share","effect":"read","mcp":"web","py":"delivery_check()","ops":["delivery_check"],"params":{"type":"object","properties":{"only":{"type":"string","description":"sjekk-id eller prefiks, kommaseparert (kled,sider.dato)"},"skip":{"type":"string"},"max_findings":{"type":"integer"},"offset":{"type":"integer"},"compact":{"type":"boolean"}}},"example":{"only":"kled,flater"},"status":"live","server":"web","returns":"{ok, teller:{feil,advarsel,info}, findings:[{id, severity, where, what, fix, key}], accepted, checks, text}","level":"read","description":"Delivery check of the drawing set BEFORE it goes to the client/municipality: storeys, cladding (boards, corners, openings), back faces/double faces/edge density, roof, Layout pages (views, paper/scale, section marks, title block, date), dimensions, traces of post-processing (mask only in the PDF, forced storey, removed dimensions), rooms, terrain and against reference measures. Changes nothing; a check that crashes just gives an info line. Per finding: id, severity (feil|advarsel|info), where, what (everyday Norwegian), fix (where to fix it by hand), key. only/skip = check id or prefix (comma separated). Thresholds are settings in the group 'Leveringssjekk' (get_prefs/set_prefs). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Leveringssjekk av tegningssettet FØR det sendes til kunde/kommune: etasjer, kledning (bord, hjørner, åpninger), baksider/dobbeltflater/kantlinjetetthet, tak, Layout-sider (visninger, papir/målestokk, snittmerker, tittelfelt, dato), mål, spor av etterbehandling (maske kun i PDF, tvunget etasje, fjernede mål), rom, terreng og mot fasit. Endrer ingenting; en sjekk som kræsjer gir bare en info-linje. Svar per funn: id, severity (feil|advarsel|info), where, what (hverdagsnorsk), fix (hvor du retter for hånd), key. only/skip = sjekk-id eller prefiks (kommaseparert). Terskler = innstillinger i gruppen «Leveringssjekk» (get_prefs/set_prefs).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"only":{"type":"string","description":"sjekk-id eller prefiks, kommaseparert (kled,sider.dato)"},"skip":{"type":"string"},"max_findings":{"type":"integer"},"offset":{"type":"integer"},"compact":{"type":"boolean"}}}},{"name":"accept_delivery_finding","cat":"scene","no":"Merk ETT funn i leveringssjekken som «godtatt manuelt» (key står i funnet; «sjekk-id|*» godtar hele sjekken). Lagres i dokumentet (ett angresteg), kommer ikke igjen, og står under «Godtatt manuelt». undo=true tar det tilbake. Mennesket har siste ord når en sjekk tar feil.","en":"Mark ONE finding of the delivery check as 'accepted manually' (the key is in the finding; 'check-id|*' accepts the whole check). Stored in the document (one undo step), does not come back, and is listed under 'Accepted manually'. undo=true takes it back. The human has the last word when a check is wrong.","method":"POST","path":"/sessions/{sid}/agent/delivery-check/accept","access":"share","effect":"write","mcp":"web","py":"accept_delivery_finding('kled.hjorne|abc', 'bevisst')","ops":["accept_delivery_finding","unaccept_delivery_finding"],"params":{"type":"object","properties":{"key":{"type":"string"},"note":{"type":"string"},"undo":{"type":"boolean"}},"required":["key"]},"example":{"key":"kled.hjorne|abc","note":"bevisst"},"status":"live","server":"web","returns":"{ok, key, godtatt}","level":"propose","description":"Mark ONE finding of the delivery check as 'accepted manually' (the key is in the finding; 'check-id|*' accepts the whole check). Stored in the document (one undo step), does not come back, and is listed under 'Accepted manually'. undo=true takes it back. The human has the last word when a check is wrong. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Merk ETT funn i leveringssjekken som «godtatt manuelt» (key står i funnet; «sjekk-id|*» godtar hele sjekken). Lagres i dokumentet (ett angresteg), kommer ikke igjen, og står under «Godtatt manuelt». undo=true tar det tilbake. Mennesket har siste ord når en sjekk tar feil.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"key":{"type":"string"},"note":{"type":"string"},"undo":{"type":"boolean"}},"required":["key"]}},{"name":"auto_fix_delivery_finding","cat":"scene","no":"Automatisk retting av utvalgte leveransefunn (ett angresteg). Nå: finding_id=kled.ytter_uten (sett standardkledning på yttervegger uten cladding.on). Valgfritt wall_ids.","en":"Automatic fix for selected delivery findings (one undo step). Now: finding_id=kled.ytter_uten (default cladding on exterior walls with cladding.on off). Optional wall_ids.","method":"POST","path":"/sessions/{sid}/agent/delivery-check/auto-fix","access":"share","effect":"write","mcp":"web","ops":["ensure_exterior_cladding"],"params":{"type":"object","properties":{"finding_id":{"type":"string"},"wall_ids":{"type":"array","items":{"type":"string"}}},"required":["finding_id"]},"example":{"finding_id":"kled.ytter_uten"},"status":"live","server":"web","returns":"{ok, finding_id, n, ids, version}","level":"propose","description":"Automatic fix for selected delivery findings (one undo step). Now: finding_id=kled.ytter_uten (default cladding on exterior walls with cladding.on off). Optional wall_ids. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Automatisk retting av utvalgte leveransefunn (ett angresteg). Nå: finding_id=kled.ytter_uten (sett standardkledning på yttervegger uten cladding.on). Valgfritt wall_ids.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"finding_id":{"type":"string"},"wall_ids":{"type":"array","items":{"type":"string"}}},"required":["finding_id"]}},{"name":"configurator_link_to_spec","cat":"spec","no":"Konfigurator-lenke (/konfigurator/plan#c=… eller selve state) som hus-spec: omriss, etasjer, yttervegger, innervegger MED justering slik konfiguratoren bygde dem, dører/vinduer (hengsel, slå), tak, kledning. Åpen, beholder ingenting (maks 12/min). Svar: spec, counts, rooms, not_carried (det som ikke følger med). Bygg den videre med build_house_from_spec, eller åpne direkte med open_configurator_link.","en":"A configurator link (/konfigurator/plan#c=… or the state itself) as a house spec: outline, storeys, outer walls, inner walls WITH the alignment the configurator built, doors/windows (hinge, swing), roof, cladding. Open, keeps nothing (max 12/min). Answer: spec, counts, rooms, not_carried (what stays behind). Build it on with build_house_from_spec, or open it directly with open_configurator_link.","method":"POST","path":"/spec/from-configurator","access":"public","effect":"read","mcp":"web","params":{"type":"object","properties":{"link":{"type":"string","description":"URL, #c=… or the bare token (max 120 000 tegn)"},"state":{"type":"object","description":"i stedet for link: den dekodede state"},"name":{"type":"string"}}},"example":{"link":"https://draw.dibrix.com/konfigurator/plan#c=<token>"},"status":"live","server":"web","returns":"{ok, spec, counts, rooms, not_carried, warnings, timing, src}","description":"A configurator link (/konfigurator/plan#c=… or the state itself) as a house spec: outline, storeys, outer walls, inner walls WITH the alignment the configurator built, doors/windows (hinge, swing), roof, cladding. Open, keeps nothing (max 12/min). Answer: spec, counts, rooms, not_carried (what stays behind). Build it on with build_house_from_spec, or open it directly with open_configurator_link. [open, no login] — NO: Konfigurator-lenke (/konfigurator/plan#c=… eller selve state) som hus-spec: omriss, etasjer, yttervegger, innervegger MED justering slik konfiguratoren bygde dem, dører/vinduer (hengsel, slå), tak, kledning. Åpen, beholder ingenting (maks 12/min). Svar: spec, counts, rooms, not_carried (det som ikke følger med). Bygg den videre med build_house_from_spec, eller åpne direkte med open_configurator_link.","category_label":"Hus-spec (hele huset fra én JSON)","input_schema":{"type":"object","properties":{"link":{"type":"string","description":"URL, #c=… or the bare token (max 120 000 tegn)"},"state":{"type":"object","description":"i stedet for link: den dekodede state"},"name":{"type":"string"}}}},{"name":"open_configurator_link","cat":"spec","no":"«Åpne i Dibrix»: bygg planen fra en konfigurator-lenke som NY økt (mode=new, standard) eller som NY VERSJON (utkast) av en økt du kan redigere (mode=version + source_sid). Den kjørende økta overskrives aldri; eieren godkjenner utkastet. Innlogget. Svar: session_id, url, counts, rooms, not_carried, warnings. Med bare propose-nøkkel: configurator_link_to_spec + build_house_from_spec på arbeidskopien + save_version.","en":"\"Open in Dibrix\": build the plan from a configurator link as a NEW session (mode=new, default) or a NEW DRAFT VERSION of a session you may edit (mode=version + source_sid). The running session is never overwritten; the owner approves the draft. Logged in. Answer: session_id, url, counts, rooms, not_carried, warnings. With only a propose key: configurator_link_to_spec + build_house_from_spec on the working copy + save_version.","method":"POST","path":"/spec/from-configurator/open","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"link":{"type":"string"},"state":{"type":"object"},"mode":{"type":"string","enum":["new","version"]},"source_sid":{"type":"string"},"name":{"type":"string"},"comment":{"type":"string"}}},"example":{"link":"https://draw.dibrix.com/konfigurator/plan#c=<token>","mode":"new"},"status":"live","server":"web","returns":"{ok, mode, session_id, url, counts, rooms, not_carried, warnings, timing, version?}","level":"propose","description":"\"Open in Dibrix\": build the plan from a configurator link as a NEW session (mode=new, default) or a NEW DRAFT VERSION of a session you may edit (mode=version + source_sid). The running session is never overwritten; the owner approves the draft. Logged in. Answer: session_id, url, counts, rooms, not_carried, warnings. With only a propose key: configurator_link_to_spec + build_house_from_spec on the working copy + save_version. [logged in] — NO: «Åpne i Dibrix»: bygg planen fra en konfigurator-lenke som NY økt (mode=new, standard) eller som NY VERSJON (utkast) av en økt du kan redigere (mode=version + source_sid). Den kjørende økta overskrives aldri; eieren godkjenner utkastet. Innlogget. Svar: session_id, url, counts, rooms, not_carried, warnings. Med bare propose-nøkkel: configurator_link_to_spec + build_house_from_spec på arbeidskopien + save_version.","category_label":"Hus-spec (hele huset fra én JSON)","input_schema":{"type":"object","properties":{"link":{"type":"string"},"state":{"type":"object"},"mode":{"type":"string","enum":["new","version"]},"source_sid":{"type":"string"},"name":{"type":"string"},"comment":{"type":"string"}}}},{"name":"list_phases","cat":"faser","no":"Fasene i modellen (eksisterende, rivning, nybygg, tilbygg …) med antall element per fase og kind, status, datoer, farge og skjult/vist. Element uten fase er i «ny» (Nytt). elements=true gir element→fase.","en":"The model's phases (existing, demolition, new, extension …) with element counts per phase and kind, status, dates, colour and hidden/shown. Elements without a phase are in «ny» (New). elements=true adds element→phase.","method":"GET","path":"/sessions/{sid}/phases","access":"share","effect":"read","mcp":"web","py":"list_phases()","ops":["list_phases"],"params":{"type":"object","properties":{"elements":{"type":"boolean"},"sid":{"type":"string"}}},"status":"live","server":"web","returns":"{phases:[{id,name,kind,status,color,elements,kinds,hidden}], default, view}","level":"read","description":"The model's phases (existing, demolition, new, extension …) with element counts per phase and kind, status, dates, colour and hidden/shown. Elements without a phase are in «ny» (New). elements=true adds element→phase. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Fasene i modellen (eksisterende, rivning, nybygg, tilbygg …) med antall element per fase og kind, status, datoer, farge og skjult/vist. Element uten fase er i «ny» (Nytt). elements=true gir element→fase.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"elements":{"type":"boolean"},"sid":{"type":"string"}}}},{"name":"create_phase","cat":"faser","no":"Ny fase: name, kind (existing|demolition|new|custom; eksisterende vises grå og koster 0, rivning koster rivepris), color #rrggbb, start/end ÅÅÅÅ-MM-DD, deps (fase-id-er som må være ferdige først), status planlagt|pågår|ferdig. Ett angresteg.","en":"New phase: name, kind (existing|demolition|new|custom; existing shows grey and costs 0, demolition costs a demolition price), color #rrggbb, start/end YYYY-MM-DD, deps (phase ids that must finish first), status. One undo step.","method":"POST","path":"/sessions/{sid}/phases","access":"share","effect":"write","mcp":"web","py":"create_phase(name, kind='new')","ops":["create_phase"],"params":{"type":"object","properties":{"name":{"type":"string"},"kind":{"type":"string"},"color":{"type":"string"},"status":{"type":"string"},"start":{"type":"string"},"end":{"type":"string"},"deps":{"type":"array","items":{"type":"string"}},"id":{"type":"string"},"sid":{"type":"string"}},"required":["name"]},"example":{"name":"Tilbygg nord","kind":"new","start":"2027-05-03","deps":["ny"]},"status":"live","server":"web","level":"propose","description":"New phase: name, kind (existing|demolition|new|custom; existing shows grey and costs 0, demolition costs a demolition price), color #rrggbb, start/end YYYY-MM-DD, deps (phase ids that must finish first), status. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Ny fase: name, kind (existing|demolition|new|custom; eksisterende vises grå og koster 0, rivning koster rivepris), color #rrggbb, start/end ÅÅÅÅ-MM-DD, deps (fase-id-er som må være ferdige først), status planlagt|pågår|ferdig. Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"name":{"type":"string"},"kind":{"type":"string"},"color":{"type":"string"},"status":{"type":"string"},"start":{"type":"string"},"end":{"type":"string"},"deps":{"type":"array","items":{"type":"string"}},"id":{"type":"string"},"sid":{"type":"string"}},"required":["name"]}},{"name":"set_phase","cat":"faser","no":"Endre en fase (navn, farge, status planlagt|pågår|ferdig, start/slutt, deps, kind, rekkefølge). Ett angresteg.","en":"Change a phase (name, colour, status, start/end, deps, kind, order). One undo step.","method":"POST","path":"/sessions/{sid}/phases/{pid}","access":"share","effect":"write","mcp":"web","py":"set_phase(id, status='pågår')","ops":["set_phase"],"params":{"type":"object","properties":{"pid":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string"},"color":{"type":"string"},"status":{"type":"string"},"start":{"type":"string"},"end":{"type":"string"},"deps":{"type":"array","items":{"type":"string"}},"order":{"type":"integer"},"sid":{"type":"string"}},"required":["pid"]},"status":"live","server":"web","level":"propose","description":"Change a phase (name, colour, status, start/end, deps, kind, order). One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Endre en fase (navn, farge, status planlagt|pågår|ferdig, start/slutt, deps, kind, rekkefølge). Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"pid":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string"},"color":{"type":"string"},"status":{"type":"string"},"start":{"type":"string"},"end":{"type":"string"},"deps":{"type":"array","items":{"type":"string"}},"order":{"type":"integer"},"sid":{"type":"string"}},"required":["pid"]}},{"name":"delete_phase","cat":"faser","no":"Fjern en fase; elementene i den faller tilbake til «ny». Ett angresteg.","en":"Remove a phase; its elements fall back to «ny». One undo step.","method":"DELETE","path":"/sessions/{sid}/phases/{pid}","access":"share","effect":"write","mcp":"web","py":"delete_phase(id)","ops":["delete_phase"],"params":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"}},"required":["pid"]},"status":"live","server":"web","level":"propose","description":"Remove a phase; its elements fall back to «ny». One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Fjern en fase; elementene i den faller tilbake til «ny». Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"}},"required":["pid"]}},{"name":"add_phase_presets","cat":"faser","no":"Legg til forvalgsfaser (eksisterende, rivning, ny, tilbygg, utvendig, innvendig, ferdig); ids = bare disse. Eksisterende faser beholdes.","en":"Add the preset phases (existing, demolition, new, extension, exterior, interior, handover); ids = only these. Existing phases are kept.","method":"POST","path":"/sessions/{sid}/phases/presets","access":"share","effect":"write","mcp":"web","py":"add_phase_presets()","ops":["add_phase_presets"],"params":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}},"sid":{"type":"string"}}},"status":"live","server":"web","level":"propose","description":"Add the preset phases (existing, demolition, new, extension, exterior, interior, handover); ids = only these. Existing phases are kept. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Legg til forvalgsfaser (eksisterende, rivning, ny, tilbygg, utvendig, innvendig, ferdig); ids = bare disse. Eksisterende faser beholdes.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}},"sid":{"type":"string"}}}},{"name":"assign_phase","cat":"faser","no":"Legg elementer i en fase: element_ids, og/eller alle av kind (wall|roof|slab|door|window …), level, wall_type; all_elements=true tar alt; selection=true de valgte. Kledning, dørblad og vindusramme følger verten; en dør kan ha egen fase. phase «ny» = standard. Ett angresteg.","en":"Put elements in a phase: element_ids, and/or all of kind (wall|roof|slab|door|window …), level, wall_type; all_elements=true takes everything; selection=true the selected ones. Cladding, door leaves and window frames follow their host; an opening can have its own phase. phase «ny» = default. One undo step.","method":"POST","path":"/sessions/{sid}/phases/{pid}/assign","access":"share","effect":"write","mcp":"web","py":"assign_phase(phase, element_ids)","ops":["assign_phase"],"params":{"type":"object","properties":{"pid":{"type":"string"},"element_ids":{"type":"array","items":{"type":"string"}},"kind":{"type":"string"},"level":{"type":"string"},"wall_type":{"type":"string"},"all_elements":{"type":"boolean"},"selection":{"type":"boolean"},"sid":{"type":"string"}},"required":["pid"]},"example":{"pid":"eksisterende","kind":"wall"},"status":"live","server":"web","returns":"{assigned, phase, version}","level":"propose","description":"Put elements in a phase: element_ids, and/or all of kind (wall|roof|slab|door|window …), level, wall_type; all_elements=true takes everything; selection=true the selected ones. Cladding, door leaves and window frames follow their host; an opening can have its own phase. phase «ny» = default. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Legg elementer i en fase: element_ids, og/eller alle av kind (wall|roof|slab|door|window …), level, wall_type; all_elements=true tar alt; selection=true de valgte. Kledning, dørblad og vindusramme følger verten; en dør kan ha egen fase. phase «ny» = standard. Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"pid":{"type":"string"},"element_ids":{"type":"array","items":{"type":"string"}},"kind":{"type":"string"},"level":{"type":"string"},"wall_type":{"type":"string"},"all_elements":{"type":"boolean"},"selection":{"type":"boolean"},"sid":{"type":"string"}},"required":["pid"]}},{"name":"set_phase_visibility","cat":"faser","no":"Vis/skjul/farge per fase i 3D: hidden (fase-id-er som skjules; erstatter listen), mode phase (fasefarge) | material, existing_grey. Ett angresteg.","en":"Show/hide/colour per phase in 3D: hidden (phase ids to hide; replaces the list), mode phase | material, existing_grey. One undo step.","method":"POST","path":"/sessions/{sid}/phases/visibility","access":"share","effect":"write","mcp":"web","py":"set_phase_visibility(hidden=['rivning'])","ops":["set_phase_visibility"],"params":{"type":"object","properties":{"hidden":{"type":"array","items":{"type":"string"}},"mode":{"type":"string"},"existing_grey":{"type":"boolean"},"sid":{"type":"string"}}},"status":"live","server":"web","level":"propose","description":"Show/hide/colour per phase in 3D: hidden (phase ids to hide; replaces the list), mode phase | material, existing_grey. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Vis/skjul/farge per fase i 3D: hidden (fase-id-er som skjules; erstatter listen), mode phase (fasefarge) | material, existing_grey. Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"hidden":{"type":"array","items":{"type":"string"}},"mode":{"type":"string"},"existing_grey":{"type":"boolean"},"sid":{"type":"string"}}}},{"name":"plan_summary","cat":"faser","no":"Alt om planen i ett svar: faser, Gantt (rader med datoer, slakk og kritisk sti, ressursdager), kost per fase og kind (5D), kostkurve per måned (S-kurve) og avvik mot budsjett.","en":"Everything about the plan in one answer: phases, Gantt (rows with dates, slack and critical path, resource days), cost per phase and kind (5D), monthly cost curve (S-curve) and variance against budget.","method":"GET","path":"/sessions/{sid}/plan","access":"share","effect":"read","mcp":"web","py":"plan_summary()","ops":["plan_summary"],"params":{"type":"object","properties":{"sid":{"type":"string"}}},"status":"live","server":"web","returns":"{phases, gantt:{rows,critical,days,start,end}, cost:{total,phases,kinds,budget}, curve:{months}}","level":"read","description":"Everything about the plan in one answer: phases, Gantt (rows with dates, slack and critical path, resource days), cost per phase and kind (5D), monthly cost curve (S-curve) and variance against budget. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Alt om planen i ett svar: faser, Gantt (rader med datoer, slakk og kritisk sti, ressursdager), kost per fase og kind (5D), kostkurve per måned (S-kurve) og avvik mot budsjett.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"sid":{"type":"string"}}}},{"name":"plan_tasks","cat":"faser","no":"4D: oppgavene med datoer, slakk og kritisk sti (Gantt-data).","en":"4D: the tasks with dates, slack and critical path (Gantt data).","method":"GET","path":"/sessions/{sid}/plan/tasks","access":"share","effect":"read","mcp":"web","py":"plan_tasks()","ops":["plan_tasks"],"params":{"type":"object","properties":{"sid":{"type":"string"}}},"status":"live","server":"web","level":"read","description":"4D: the tasks with dates, slack and critical path (Gantt data). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: 4D: oppgavene med datoer, slakk og kritisk sti (Gantt-data).","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"sid":{"type":"string"}}}},{"name":"set_task","cat":"faser","no":"Legg til/endre én oppgave: id?, name, phase, duration_d (arbeidsdager), deps (task-id eller {id, lag_d}), resource, kinds (wall …), elements (id-er), start ÅÅÅÅ-MM-DD, pct. Avvises med norsk feil ved syklus. Ett angresteg.","en":"Add/change one task: id?, name, phase, duration_d (working days), deps (task id or {id, lag_d}), resource, kinds, elements, start, pct. Rejected with a readable error on a cycle. One undo step.","method":"POST","path":"/sessions/{sid}/plan/tasks","access":"share","effect":"write","mcp":"web","py":"set_task({'name': 'Vegger', 'phase': 'ny', 'duration_d': 5})","ops":["set_task"],"params":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"phase":{"type":"string"},"duration_d":{"type":"number"},"deps":{"type":"array"},"resource":{"type":"string"},"kinds":{"type":"array","items":{"type":"string"}},"elements":{"type":"array","items":{"type":"string"}},"start":{"type":"string"},"pct":{"type":"number"},"sid":{"type":"string"}},"required":["name","phase"]},"example":{"name":"Reis vegger","phase":"ny","duration_d":6,"deps":["t1"],"kinds":["wall"]},"status":"live","server":"web","level":"propose","description":"Add/change one task: id?, name, phase, duration_d (working days), deps (task id or {id, lag_d}), resource, kinds, elements, start, pct. Rejected with a readable error on a cycle. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Legg til/endre én oppgave: id?, name, phase, duration_d (arbeidsdager), deps (task-id eller {id, lag_d}), resource, kinds (wall …), elements (id-er), start ÅÅÅÅ-MM-DD, pct. Avvises med norsk feil ved syklus. Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"phase":{"type":"string"},"duration_d":{"type":"number"},"deps":{"type":"array"},"resource":{"type":"string"},"kinds":{"type":"array","items":{"type":"string"}},"elements":{"type":"array","items":{"type":"string"}},"start":{"type":"string"},"pct":{"type":"number"},"sid":{"type":"string"}},"required":["name","phase"]}},{"name":"delete_task","cat":"faser","no":"Fjern en oppgave. Ett angresteg.","en":"Remove a task. One undo step.","method":"DELETE","path":"/sessions/{sid}/plan/tasks/{tid}","access":"share","effect":"write","mcp":"web","py":"delete_task(id)","ops":["delete_task"],"params":{"type":"object","properties":{"tid":{"type":"string"},"sid":{"type":"string"}},"required":["tid"]},"status":"live","server":"web","level":"propose","description":"Remove a task. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Fjern en oppgave. Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"tid":{"type":"string"},"sid":{"type":"string"}},"required":["tid"]}},{"name":"suggest_plan","cat":"faser","no":"Foreslå tidsplan: tasks per fase og byggegruppe (dekker, vegger, åpninger, tak …) med varighet fra mengder og produktivitet (estimat). apply=true (standard) erstatter tasks. start ÅÅÅÅ-MM-DD, crew = antall lag.","en":"Suggest a schedule: tasks per phase and build group (slabs, walls, openings, roof …) with durations from quantities and productivity (estimate). apply=true (default) replaces the tasks.","method":"POST","path":"/sessions/{sid}/plan/suggest","access":"share","effect":"write","mcp":"web","py":"suggest_plan(start='2027-03-01')","ops":["suggest_plan"],"params":{"type":"object","properties":{"start":{"type":"string"},"crew":{"type":"number"},"apply":{"type":"boolean"},"sid":{"type":"string"}}},"example":{"start":"2027-03-01","crew":1},"status":"live","server":"web","level":"propose","description":"Suggest a schedule: tasks per phase and build group (slabs, walls, openings, roof …) with durations from quantities and productivity (estimate). apply=true (default) replaces the tasks. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Foreslå tidsplan: tasks per fase og byggegruppe (dekker, vegger, åpninger, tak …) med varighet fra mengder og produktivitet (estimat). apply=true (standard) erstatter tasks. start ÅÅÅÅ-MM-DD, crew = antall lag.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"start":{"type":"string"},"crew":{"type":"number"},"apply":{"type":"boolean"},"sid":{"type":"string"}}}},{"name":"set_plan_settings","cat":"faser","no":"Plan-innstillinger: start, calendar work5|all, unit_prices {'wall:ytter_250'|'wall'|'roof'|'rive:wall'…: {unit m2|m3|m|stk, nok}}, overrides {element-id: kr}, budget {total, phases:{fase: kr}}. Hver nøkkel som sendes erstatter sin del. Ett angresteg.","en":"Plan settings: start, calendar, unit_prices, overrides per element, budget. Each key sent replaces its part. One undo step.","method":"POST","path":"/sessions/{sid}/plan/settings","access":"share","effect":"write","mcp":"web","py":"set_plan_settings(unit_prices={'wall': {'unit': 'm2', 'nok': 1200}})","ops":["set_plan_settings"],"params":{"type":"object","properties":{"start":{"type":"string"},"calendar":{"type":"string"},"unit_prices":{"type":"object"},"overrides":{"type":"object"},"budget":{"type":"object"},"sid":{"type":"string"}}},"example":{"unit_prices":{"wall":{"unit":"m2","nok":1200}},"budget":{"total":2500000}},"status":"live","server":"web","level":"propose","description":"Plan settings: start, calendar, unit_prices, overrides per element, budget. Each key sent replaces its part. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Plan-innstillinger: start, calendar work5|all, unit_prices {'wall:ytter_250'|'wall'|'roof'|'rive:wall'…: {unit m2|m3|m|stk, nok}}, overrides {element-id: kr}, budget {total, phases:{fase: kr}}. Hver nøkkel som sendes erstatter sin del. Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"start":{"type":"string"},"calendar":{"type":"string"},"unit_prices":{"type":"object"},"overrides":{"type":"object"},"budget":{"type":"object"},"sid":{"type":"string"}}}},{"name":"plan_visible_at","cat":"faser","no":"4D-animasjon: element-id-ene som står på en dato (ÅÅÅÅ-MM-DD): visible, hidden, progress 0..1. Eksisterende står alltid, revet forsvinner etter rivefasen.","en":"4D animation: the element ids standing on a date (YYYY-MM-DD): visible, hidden, progress 0..1. Existing always stands, demolished disappears after the demolition phase.","method":"GET","path":"/sessions/{sid}/plan/visible","access":"share","effect":"read","mcp":"web","py":"plan_visible_at(date)","ops":["plan_visible_at"],"params":{"type":"object","properties":{"date":{"type":"string"},"sid":{"type":"string"}},"required":["date"]},"status":"live","server":"web","level":"read","description":"4D animation: the element ids standing on a date (YYYY-MM-DD): visible, hidden, progress 0..1. Existing always stands, demolished disappears after the demolition phase. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: 4D-animasjon: element-id-ene som står på en dato (ÅÅÅÅ-MM-DD): visible, hidden, progress 0..1. Eksisterende står alltid, revet forsvinner etter rivefasen.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"date":{"type":"string"},"sid":{"type":"string"}},"required":["date"]}},{"name":"plan_timeline","cat":"faser","no":"Jevnt fordelte datoer fra plan-start til slutt med antall synlige element (forhåndsvisning av byggefremdriften).","en":"Evenly spaced dates from plan start to end with the number of visible elements (preview of construction progress).","method":"GET","path":"/sessions/{sid}/plan/timeline","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"steps":{"type":"integer"},"sid":{"type":"string"}}},"status":"live","server":"web","level":"read","description":"Evenly spaced dates from plan start to end with the number of visible elements (preview of construction progress). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Jevnt fordelte datoer fra plan-start til slutt med antall synlige element (forhåndsvisning av byggefremdriften).","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"steps":{"type":"integer"},"sid":{"type":"string"}}}},{"name":"set_plan_date","cat":"faser","no":"4D i 3D: skjul det som ikke er bygget på en dato (ÅÅÅÅ-MM-DD) for alle som ser økta; date=null viser alt. Endrer ikke modellen (ikke i angrehistorikken). Svar: progress 0..1, antall synlige/skjulte.","en":"4D in 3D: hide what is not built on a date (YYYY-MM-DD) for everyone viewing the session; date=null shows everything. Does not change the model (not in undo history). Answer: progress 0..1, visible/hidden counts.","method":"POST","path":"/sessions/{sid}/plan/date","access":"share","effect":"write","mcp":"web","params":{"type":"object","properties":{"date":{"type":"string"},"sid":{"type":"string"}}},"example":{"date":"2027-04-15"},"status":"live","server":"web","level":"propose","description":"4D in 3D: hide what is not built on a date (YYYY-MM-DD) for everyone viewing the session; date=null shows everything. Does not change the model (not in undo history). Answer: progress 0..1, visible/hidden counts. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: 4D i 3D: skjul det som ikke er bygget på en dato (ÅÅÅÅ-MM-DD) for alle som ser økta; date=null viser alt. Endrer ikke modellen (ikke i angrehistorikken). Svar: progress 0..1, antall synlige/skjulte.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"date":{"type":"string"},"sid":{"type":"string"}}}},{"name":"plan_snapshot","cat":"faser","no":"Faser, plan og kostoppsummering som JSON (det en versjonspost lagrer i phases/plan). Bruk cost-delen i compare_cost.","en":"Phases, plan and cost summary as JSON (what a version record stores in phases/plan). Use its cost part in compare_cost.","method":"GET","path":"/sessions/{sid}/plan/snapshot","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"cost":{"type":"boolean"},"sid":{"type":"string"}}},"status":"live","server":"web","level":"read","description":"Phases, plan and cost summary as JSON (what a version record stores in phases/plan). Use its cost part in compare_cost. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Faser, plan og kostoppsummering som JSON (det en versjonspost lagrer i phases/plan). Bruk cost-delen i compare_cost.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"cost":{"type":"boolean"},"sid":{"type":"string"}}}},{"name":"cost_summary","cat":"faser","no":"5D: kost per fase og kind, uten-pris-antall, budsjett og avvik, kostkurve per måned. Pris: overstyring, egne enhetspriser, konfiguratorens prisgrunnlag. rows=true gir kost per element.","en":"5D: cost per phase and kind, unpriced count, budget and variance, monthly curve. Price order: override, own unit prices, the configurator price list. rows=true gives cost per element.","method":"GET","path":"/sessions/{sid}/cost","access":"share","effect":"read","mcp":"web","py":"cost_summary()","ops":["cost_summary"],"params":{"type":"object","properties":{"rows":{"type":"boolean"},"sid":{"type":"string"}}},"status":"live","server":"web","returns":"{total, phases, kinds, unpriced, budget, curve:{months}}","level":"read","description":"5D: cost per phase and kind, unpriced count, budget and variance, monthly curve. Price order: override, own unit prices, the configurator price list. rows=true gives cost per element. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: 5D: kost per fase og kind, uten-pris-antall, budsjett og avvik, kostkurve per måned. Pris: overstyring, egne enhetspriser, konfiguratorens prisgrunnlag. rows=true gir kost per element.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"rows":{"type":"boolean"},"sid":{"type":"string"}}}},{"name":"compare_cost","cat":"faser","no":"Kostnad før/etter: before (cost-oppsummering fra plan_snapshot eller en versjonspost) eller with_session (annen økt) mot after (utelatt = modellen nå). Svar: total, per fase og per kind med før, etter, delta, prosent.","en":"Cost before/after: before (a cost summary from plan_snapshot or a version record) or with_session (another session) against after (omitted = the model now). Answer: total, per phase and per kind with before, after, delta, percent.","method":"POST","path":"/sessions/{sid}/cost/compare","access":"share","effect":"read","mcp":"web","py":"compare_cost(before)","ops":["compare_cost"],"params":{"type":"object","properties":{"before":{"type":"object"},"after":{"type":"object"},"with_session":{"type":"string"},"sid":{"type":"string"}}},"status":"live","server":"web","level":"read","description":"Cost before/after: before (a cost summary from plan_snapshot or a version record) or with_session (another session) against after (omitted = the model now). Answer: total, per phase and per kind with before, after, delta, percent. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Kostnad før/etter: before (cost-oppsummering fra plan_snapshot eller en versjonspost) eller with_session (annen økt) mot after (utelatt = modellen nå). Svar: total, per fase og per kind med før, etter, delta, prosent.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"before":{"type":"object"},"after":{"type":"object"},"with_session":{"type":"string"},"sid":{"type":"string"}}}},{"name":"mark_all_existing","cat":"faser","no":"Start på et rehab-prosjekt: legg ALLE elementer i fasen «eksisterende» (grå, koster 0). Lager forvalgsfasene ved behov. Deretter assign_phase(phase=\"ny\"|\"rivning\"|\"endres\", …) på det som skal endres. Ett angresteg.","en":"Start of a rehab project: put ALL elements in the «eksisterende» (existing) phase (grey, costs 0). Creates the preset phases when needed. Then assign_phase(phase=\"ny\"|\"rivning\"|\"endres\", ...) on what will change. One undo step.","method":"POST","path":"/sessions/{sid}/rehab/mark-existing","access":"share","effect":"write","mcp":"web","py":"mark_all_existing()","ops":["mark_all_existing"],"params":{"type":"object","properties":{"sid":{"type":"string"}}},"status":"live","server":"web","level":"propose","description":"Start of a rehab project: put ALL elements in the «eksisterende» (existing) phase (grey, costs 0). Creates the preset phases when needed. Then assign_phase(phase=\"ny\"|\"rivning\"|\"endres\", ...) on what will change. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Start på et rehab-prosjekt: legg ALLE elementer i fasen «eksisterende» (grå, koster 0). Lager forvalgsfasene ved behov. Deretter assign_phase(phase=\"ny\"|\"rivning\"|\"endres\", …) på det som skal endres. Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"sid":{"type":"string"}}}},{"name":"show_phases_only","cat":"faser","no":"Filter i 3D: vis bare fasene med disse kind-ene (existing|demolition|new|modified|custom) eller fase-id-ene; utelatt = vis alt. Ett angresteg.","en":"Filter in 3D: show only the phases of these kinds (existing|demolition|new|modified|custom) or phase ids; omitted = show all. One undo step.","method":"POST","path":"/sessions/{sid}/rehab/show","access":"share","effect":"write","mcp":"web","py":"show_phases_only(kinds=['new', 'modified'])","ops":["show_phases_only"],"params":{"type":"object","properties":{"kinds":{"type":"array","items":{"type":"string"}},"phases":{"type":"array","items":{"type":"string"}},"sid":{"type":"string"}}},"status":"live","server":"web","level":"propose","description":"Filter in 3D: show only the phases of these kinds (existing|demolition|new|modified|custom) or phase ids; omitted = show all. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Filter i 3D: vis bare fasene med disse kind-ene (existing|demolition|new|modified|custom) eller fase-id-ene; utelatt = vis alt. Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"kinds":{"type":"array","items":{"type":"string"}},"phases":{"type":"array","items":{"type":"string"}},"sid":{"type":"string"}}}},{"name":"rehab_summary","cat":"faser","no":"Rehab i ett svar: elementer per status (eksisterende/rives/ny/endres), kost per fase (arbeid/materiell/mva; intervall når pris mangler), utførende, varer og tidsplan.","en":"Rehab in one answer: elements per status (existing/demolition/new/modified), cost per phase (labour/material/VAT; an interval when prices are missing), performers, goods and schedule.","method":"GET","path":"/sessions/{sid}/rehab","access":"share","effect":"read","mcp":"web","py":"rehab_summary()","ops":["rehab_summary"],"params":{"type":"object","properties":{"sid":{"type":"string"}}},"status":"live","server":"web","level":"read","description":"Rehab in one answer: elements per status (existing/demolition/new/modified), cost per phase (labour/material/VAT; an interval when prices are missing), performers, goods and schedule. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Rehab i ett svar: elementer per status (eksisterende/rives/ny/endres), kost per fase (arbeid/materiell/mva; intervall når pris mangler), utførende, varer og tidsplan.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"sid":{"type":"string"}}}},{"name":"rehab_report","cat":"faser","no":"Hele kunderapporten som JSON: per fase hva som endres, hva det koster (arbeid/materiell/mva, usikkerhet som intervall), hvem som utfører, hva som må kjøpes og tidsplan; baseline=true (standard) tar med «sist godkjent av kommunen» og «endret siden».","en":"The whole customer report as JSON: per phase what changes, what it costs (labour/material/VAT, uncertainty as an interval), who performs it, what to buy, and the schedule; baseline=true (default) adds the municipal baseline and the changes since.","method":"GET","path":"/sessions/{sid}/rehab/report.json","access":"share","effect":"read","mcp":"web","py":"rehab_report()","ops":["rehab_report"],"params":{"type":"object","properties":{"baseline":{"type":"boolean"},"title":{"type":"string"},"sid":{"type":"string"}}},"status":"live","server":"web","level":"read","description":"The whole customer report as JSON: per phase what changes, what it costs (labour/material/VAT, uncertainty as an interval), who performs it, what to buy, and the schedule; baseline=true (default) adds the municipal baseline and the changes since. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Hele kunderapporten som JSON: per fase hva som endres, hva det koster (arbeid/materiell/mva, usikkerhet som intervall), hvem som utfører, hva som må kjøpes og tidsplan; baseline=true (standard) tar med «sist godkjent av kommunen» og «endret siden».","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"baseline":{"type":"boolean"},"title":{"type":"string"},"sid":{"type":"string"}}}},{"name":"rehab_report_html","cat":"faser","no":"Kundevennlig rapport som HTML (utskriftsvennlig, lagre som PDF fra nettleseren). Fungerer også med en viewer-lenke.","en":"Customer-friendly report as HTML (print-friendly; save as PDF from the browser). Also works with a viewer link.","method":"GET","path":"/sessions/{sid}/rehab/report.html","access":"share","effect":"read","params":{"type":"object","properties":{"baseline":{"type":"boolean"},"title":{"type":"string"},"sid":{"type":"string"}}},"status":"live","server":"web","returns":"text/html","level":"read","description":"Customer-friendly report as HTML (print-friendly; save as PDF from the browser). Also works with a viewer link. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Kundevennlig rapport som HTML (utskriftsvennlig, lagre som PDF fra nettleseren). Fungerer også med en viewer-lenke.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"baseline":{"type":"boolean"},"title":{"type":"string"},"sid":{"type":"string"}}}},{"name":"rehab_report_csv","cat":"faser","no":"Rehab-rapporten som CSV (semikolon, UTF-8): oversikt, poster, utførende, varer, tidsplan.","en":"The rehab report as CSV (semicolon, UTF-8): overview, lines, performers, goods, schedule.","method":"GET","path":"/sessions/{sid}/rehab/report.csv","access":"share","effect":"read","params":{"type":"object","properties":{"baseline":{"type":"boolean"},"title":{"type":"string"},"sid":{"type":"string"}}},"status":"live","server":"web","returns":"text/csv","level":"read","description":"The rehab report as CSV (semicolon, UTF-8): overview, lines, performers, goods, schedule. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Rehab-rapporten som CSV (semikolon, UTF-8): oversikt, poster, utførende, varer, tidsplan.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"baseline":{"type":"boolean"},"title":{"type":"string"},"sid":{"type":"string"}}}},{"name":"rehab_report_xlsx","cat":"faser","no":"Rehab-rapporten som Excel (.xlsx, ett ark per del; uten ekstra avhengigheter).","en":"The rehab report as Excel (.xlsx, one sheet per part; no extra dependencies).","method":"GET","path":"/sessions/{sid}/rehab/report.xlsx","access":"share","effect":"read","params":{"type":"object","properties":{"baseline":{"type":"boolean"},"title":{"type":"string"},"sid":{"type":"string"}}},"status":"live","server":"web","returns":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","level":"read","description":"The rehab report as Excel (.xlsx, one sheet per part; no extra dependencies). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Rehab-rapporten som Excel (.xlsx, ett ark per del; uten ekstra avhengigheter).","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"baseline":{"type":"boolean"},"title":{"type":"string"},"sid":{"type":"string"}}}},{"name":"set_work_item","cat":"faser","no":"Arbeidspost i en fase: {phase, kind | element_ids, name?, qty? (utelatt = fra modellen), unit?, labor?, material? (kr per enhet; utelatt = prisliste, ellers «ukjent»), performer?: {role, name}, id?}. Samme id erstatter. Ett angresteg.","en":"Work item in a phase: {phase, kind | element_ids, name?, qty? (omitted = from the model), unit?, labor?, material? (NOK per unit; omitted = price list, else unknown), performer?: {role, name}, id?}. Same id replaces. One undo step.","method":"POST","path":"/sessions/{sid}/rehab/work-items","access":"share","effect":"write","mcp":"web","py":"set_work_item({'phase': 'ny', 'kind': 'wall', 'labor': 900, 'performer': {'role': 'Tømrer'}})","ops":["set_work_item"],"params":{"type":"object","properties":{"phase":{"type":"string"},"kind":{"type":"string"},"element_ids":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"qty":{"type":"number"},"unit":{"type":"string"},"labor":{"type":"number"},"material":{"type":"number"},"performer":{"type":"object"},"id":{"type":"string"},"sid":{"type":"string"}},"required":["phase"]},"example":{"phase":"ny","kind":"wall","labor":900,"material":600,"performer":{"role":"Tømrer","name":""}},"status":"live","server":"web","level":"propose","description":"Work item in a phase: {phase, kind | element_ids, name?, qty? (omitted = from the model), unit?, labor?, material? (NOK per unit; omitted = price list, else unknown), performer?: {role, name}, id?}. Same id replaces. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Arbeidspost i en fase: {phase, kind | element_ids, name?, qty? (utelatt = fra modellen), unit?, labor?, material? (kr per enhet; utelatt = prisliste, ellers «ukjent»), performer?: {role, name}, id?}. Samme id erstatter. Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"phase":{"type":"string"},"kind":{"type":"string"},"element_ids":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"qty":{"type":"number"},"unit":{"type":"string"},"labor":{"type":"number"},"material":{"type":"number"},"performer":{"type":"object"},"id":{"type":"string"},"sid":{"type":"string"}},"required":["phase"]}},{"name":"delete_work_item","cat":"faser","no":"Fjern en arbeidspost (den automatiske linjen per fase og type kommer tilbake). Ett angresteg.","en":"Remove a work item (the automatic line per phase and kind comes back). One undo step.","method":"DELETE","path":"/sessions/{sid}/rehab/work-items/{wid}","access":"share","effect":"write","mcp":"web","py":"delete_work_item(id)","ops":["delete_work_item"],"params":{"type":"object","properties":{"wid":{"type":"string"},"sid":{"type":"string"}},"required":["wid"]},"status":"live","server":"web","level":"propose","description":"Remove a work item (the automatic line per phase and kind comes back). One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Fjern en arbeidspost (den automatiske linjen per fase og type kommer tilbake). Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"wid":{"type":"string"},"sid":{"type":"string"}},"required":["wid"]}},{"name":"set_performer","cat":"faser","no":"Standard utførende for en fase: role Entreprenør|Tømrer|Elektriker|Rørlegger|Maler|Selvbygger/kunde (eller fritekst), name = firma/person; role tom = fjern. Ett angresteg.","en":"Default performer of a phase: role (contractor, carpenter, electrician, plumber, painter, self-build/customer, or free text), name = firm/person; empty role = remove. One undo step.","method":"POST","path":"/sessions/{sid}/rehab/performers","access":"share","effect":"write","mcp":"web","py":"set_performer('ny', 'Tømrer', 'Firma AS')","ops":["set_performer"],"params":{"type":"object","properties":{"phase":{"type":"string"},"role":{"type":"string"},"name":{"type":"string"},"sid":{"type":"string"}},"required":["phase"]},"status":"live","server":"web","level":"propose","description":"Default performer of a phase: role (contractor, carpenter, electrician, plumber, painter, self-build/customer, or free text), name = firm/person; empty role = remove. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Standard utførende for en fase: role Entreprenør|Tømrer|Elektriker|Rørlegger|Maler|Selvbygger/kunde (eller fritekst), name = firma/person; role tom = fjern. Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"phase":{"type":"string"},"role":{"type":"string"},"name":{"type":"string"},"sid":{"type":"string"}},"required":["phase"]}},{"name":"set_goods_item","cat":"faser","no":"Vare som må innhentes: {name, phase, supplier, qty, unit, unit_price, deadline ÅÅÅÅ-MM-DD, status planlagt|bestilt|levert, id?}. Samme id erstatter. Ett angresteg.","en":"Goods to procure: {name, phase, supplier, qty, unit, unit_price, deadline YYYY-MM-DD, status planlagt|bestilt|levert, id?}. Same id replaces. One undo step.","method":"POST","path":"/sessions/{sid}/rehab/goods","access":"share","effect":"write","mcp":"web","py":"set_goods_item({'name': 'Vindu 120x120', 'phase': 'ny', 'qty': 3, 'supplier': '...', 'deadline': '2027-04-01'})","ops":["set_goods_item"],"params":{"type":"object","properties":{"name":{"type":"string"},"phase":{"type":"string"},"supplier":{"type":"string"},"qty":{"type":"number"},"unit":{"type":"string"},"unit_price":{"type":"number"},"deadline":{"type":"string"},"status":{"type":"string"},"id":{"type":"string"},"note":{"type":"string"},"sid":{"type":"string"}},"required":["name"]},"status":"live","server":"web","level":"propose","description":"Goods to procure: {name, phase, supplier, qty, unit, unit_price, deadline YYYY-MM-DD, status planlagt|bestilt|levert, id?}. Same id replaces. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Vare som må innhentes: {name, phase, supplier, qty, unit, unit_price, deadline ÅÅÅÅ-MM-DD, status planlagt|bestilt|levert, id?}. Samme id erstatter. Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"name":{"type":"string"},"phase":{"type":"string"},"supplier":{"type":"string"},"qty":{"type":"number"},"unit":{"type":"string"},"unit_price":{"type":"number"},"deadline":{"type":"string"},"status":{"type":"string"},"id":{"type":"string"},"note":{"type":"string"},"sid":{"type":"string"}},"required":["name"]}},{"name":"delete_goods_item","cat":"faser","no":"Fjern en vare fra innkjøpslisten. Ett angresteg.","en":"Remove an item from the procurement list. One undo step.","method":"DELETE","path":"/sessions/{sid}/rehab/goods/{gid}","access":"share","effect":"write","mcp":"web","py":"delete_goods_item(id)","ops":["delete_goods_item"],"params":{"type":"object","properties":{"gid":{"type":"string"},"sid":{"type":"string"}},"required":["gid"]},"status":"live","server":"web","level":"propose","description":"Remove an item from the procurement list. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Fjern en vare fra innkjøpslisten. Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"gid":{"type":"string"},"sid":{"type":"string"}},"required":["gid"]}},{"name":"get_pricelist","cat":"faser","no":"Prosjektets prisliste (JSON). Uten lagret liste: tom eksempelmal (enheter, ingen priser).","en":"The project's price list (JSON). Without a saved list: an empty example template (units, no prices).","method":"GET","path":"/sessions/{sid}/rehab/pricelist","access":"share","effect":"read","params":{"type":"object","properties":{"sid":{"type":"string"}}},"status":"live","server":"web","level":"read","description":"The project's price list (JSON). Without a saved list: an empty example template (units, no prices). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Prosjektets prisliste (JSON). Uten lagret liste: tom eksempelmal (enheter, ingen priser).","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"sid":{"type":"string"}}}},{"name":"set_pricelist","cat":"faser","no":"Sett prisliste: pricelist {items: {\"wall\"|\"wall:ytter_250\"|\"rive:wall\"…: {unit, labor, material, labor_low/high, material_low/high}}, vat_pct} eller csv_text (kolonner key;unit;labor;material;…). Uten argumenter lagres tom eksempelmal. Ukjent pris = null (markedspriser blir aldri funnet på). Ett angresteg.","en":"Set the price list: pricelist {items, vat_pct} or csv_text (columns key;unit;labor;material;...). No arguments saves the empty example template. Unknown price = null (market prices are never invented). One undo step.","method":"POST","path":"/sessions/{sid}/rehab/pricelist","access":"share","effect":"write","mcp":"web","py":"set_pricelist({'items': {'wall': {'unit': 'm2', 'labor': 900, 'material': 600}}})","ops":["set_pricelist"],"params":{"type":"object","properties":{"pricelist":{"type":"object"},"csv_text":{"type":"string"},"vat_pct":{"type":"number"},"name":{"type":"string"},"sid":{"type":"string"}}},"status":"live","server":"web","level":"propose","description":"Set the price list: pricelist {items, vat_pct} or csv_text (columns key;unit;labor;material;...). No arguments saves the empty example template. Unknown price = null (market prices are never invented). One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Sett prisliste: pricelist {items: {\"wall\"|\"wall:ytter_250\"|\"rive:wall\"…: {unit, labor, material, labor_low/high, material_low/high}}, vat_pct} eller csv_text (kolonner key;unit;labor;material;…). Uten argumenter lagres tom eksempelmal. Ukjent pris = null (markedspriser blir aldri funnet på). Ett angresteg.","category_label":"Faser, rehab, tidsplan (4D) og kost (5D)","input_schema":{"type":"object","properties":{"pricelist":{"type":"object"},"csv_text":{"type":"string"},"vat_pct":{"type":"number"},"name":{"type":"string"},"sid":{"type":"string"}}}},{"name":"list_punktsky","cat":"punktsky","no":"Punktskyene som er lagt inn i prosjektet: id, navn, antall punkter, utstrekning (m), etasjenivåer. Skyen bygges lokalt med `python -m ingest.punktsky bygg`.","en":"The point clouds stored in the project: id, name, point count, extent (m), floor levels. Build one locally with `python -m ingest.punktsky bygg`.","method":"GET","path":"/sessions/{sid}/punktsky","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"sid":{"type":"string"}}},"status":"live","server":"web","level":"read","description":"The point clouds stored in the project: id, name, point count, extent (m), floor levels. Build one locally with `python -m ingest.punktsky bygg`. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Punktskyene som er lagt inn i prosjektet: id, navn, antall punkter, utstrekning (m), etasjenivåer. Skyen bygges lokalt med `python -m ingest.punktsky bygg`.","category_label":"Punktsky (skann): lagre, snitt og mål fra mobil","input_schema":{"type":"object","properties":{"sid":{"type":"string"}}}},{"name":"punktsky_stotte","cat":"punktsky","no":"Støttemål (tolkesjekk): andel av hver vegg, hvert dekke og hver takflate i modellen som har skypunkter innen ca. 5 cm; flagger flater under min_andel. Gjelder modeller bygget fra skyen (samme koordinater). Leser bare.","en":"Support measure (interpretation check): share of each wall, slab and roof face in the model with cloud points within about 5 cm; flags faces below min_andel. For models built from the cloud (same coordinates). Read-only.","method":"GET","path":"/sessions/{sid}/punktsky/{pid}/stotte","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"},"min_andel":{"type":"number"}},"required":["pid"]},"status":"live","server":"web","level":"read","description":"Support measure (interpretation check): share of each wall, slab and roof face in the model with cloud points within about 5 cm; flags faces below min_andel. For models built from the cloud (same coordinates). Read-only. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Støttemål (tolkesjekk): andel av hver vegg, hvert dekke og hver takflate i modellen som har skypunkter innen ca. 5 cm; flagger flater under min_andel. Gjelder modeller bygget fra skyen (samme koordinater). Leser bare.","category_label":"Punktsky (skann): lagre, snitt og mål fra mobil","input_schema":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"},"min_andel":{"type":"number"}},"required":["pid"]}},{"name":"upload_punktsky","cat":"punktsky","no":"Legg inn en ferdig bygd sky (kroppen = .dpc.npz, maks 80 MB; samme innhold gir samme id). Av på serveren til DIBRIX_PUNKTSKY_UPLOAD=1 (disk/backup avklares først); svarer 503 da. Skrives aldri om.","en":"Store a built cloud (body = .dpc.npz, max 80 MB; same content gives the same id). Off on the server until DIBRIX_PUNKTSKY_UPLOAD=1 (disk/backup to be decided); answers 503 then. Never overwritten.","method":"POST","path":"/sessions/{sid}/punktsky","access":"share","effect":"write","params":{"type":"object","properties":{"navn":{"type":"string"},"sid":{"type":"string"}}},"status":"live","server":"web","level":"propose","description":"Store a built cloud (body = .dpc.npz, max 80 MB; same content gives the same id). Off on the server until DIBRIX_PUNKTSKY_UPLOAD=1 (disk/backup to be decided); answers 503 then. Never overwritten. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Legg inn en ferdig bygd sky (kroppen = .dpc.npz, maks 80 MB; samme innhold gir samme id). Av på serveren til DIBRIX_PUNKTSKY_UPLOAD=1 (disk/backup avklares først); svarer 503 da. Skrives aldri om.","category_label":"Punktsky (skann): lagre, snitt og mål fra mobil","input_schema":{"type":"object","properties":{"navn":{"type":"string"},"sid":{"type":"string"}}}},{"name":"delete_punktsky","cat":"punktsky","no":"Slett en lagret punktsky (blob-filer i prosjektet). Bare innlogget person med slett-rett; agenter og API-nøkler får 403. Krever prosjektnavn hvis prosjektet har «Sist godkjent»/«Som bygget».","en":"Delete a stored point cloud (blob files in the project). Logged-in person with delete rights only; agents and API keys get 403. Requires the project name if the project has an approved/as-built mark.","method":"DELETE","path":"/sessions/{sid}/punktsky/{pid}","access":"share","effect":"write","mcp":"web","params":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"},"confirm_name":{"type":"string"}},"required":["pid"]},"status":"live","server":"web","level":"propose","description":"Delete a stored point cloud (blob files in the project). Logged-in person with delete rights only; agents and API keys get 403. Requires the project name if the project has an approved/as-built mark. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Slett en lagret punktsky (blob-filer i prosjektet). Bare innlogget person med slett-rett; agenter og API-nøkler får 403. Krever prosjektnavn hvis prosjektet har «Sist godkjent»/«Som bygget».","category_label":"Punktsky (skann): lagre, snitt og mål fra mobil","input_schema":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"},"confirm_name":{"type":"string"}},"required":["pid"]}},{"name":"get_punktsky","cat":"punktsky","no":"En sky: metadata (kilde, voksel, origo, rotasjon, nord, bbox) og standard snitt (plan 0,9 m over gulvet; loddrette snitt i midten).","en":"One cloud: metadata (source, voxel, origin, rotation, north, bbox) and the default sections (plan 0.9 m above the floor; vertical ones through the middle).","method":"GET","path":"/sessions/{sid}/punktsky/{pid}","access":"share","effect":"read","params":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"}},"required":["pid"]},"status":"live","server":"web","level":"read","description":"One cloud: metadata (source, voxel, origin, rotation, north, bbox) and the default sections (plan 0.9 m above the floor; vertical ones through the middle). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: En sky: metadata (kilde, voksel, origo, rotasjon, nord, bbox) og standard snitt (plan 0,9 m over gulvet; loddrette snitt i midten).","category_label":"Punktsky (skann): lagre, snitt og mål fra mobil","input_schema":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"}},"required":["pid"]}},{"name":"punktsky_snitt","cat":"punktsky","no":"Snitt gjennom en sky som PNG: axis z (plan) | x | y, lo/hi i meter, px_per_m, grid_m, point_px, gray, u0/u1/v0/v1 for utsnitt. Mål ut av bildet: headeren X-Snitt-Info har px_per_m, utstrekning og bildestorrelse (u = u0 + px/px_per_m, v = v0 + (h-1-py)/px_per_m). 404 når snittet er tomt.","en":"A section through a cloud as PNG: axis z (plan) | x | y, lo/hi in metres, px_per_m, grid_m, point_px, gray, u0/u1/v0/v1 for a crop. Measure from the image: the X-Snitt-Info header has px_per_m, extent and image size (u = u0 + px/px_per_m, v = v0 + (h-1-py)/px_per_m). 404 when the section is empty.","method":"GET","path":"/sessions/{sid}/punktsky/{pid}/snitt.png","access":"share","effect":"read","params":{"type":"object","properties":{"pid":{"type":"string"},"axis":{"type":"string"},"lo":{"type":"number"},"hi":{"type":"number"},"px_per_m":{"type":"number"},"grid_m":{"type":"number"},"point_px":{"type":"number"},"gray":{"type":"boolean"},"sid":{"type":"string"}},"required":["pid"]},"status":"live","server":"web","returns":"image/png","level":"read","description":"A section through a cloud as PNG: axis z (plan) | x | y, lo/hi in metres, px_per_m, grid_m, point_px, gray, u0/u1/v0/v1 for a crop. Measure from the image: the X-Snitt-Info header has px_per_m, extent and image size (u = u0 + px/px_per_m, v = v0 + (h-1-py)/px_per_m). 404 when the section is empty. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Snitt gjennom en sky som PNG: axis z (plan) | x | y, lo/hi i meter, px_per_m, grid_m, point_px, gray, u0/u1/v0/v1 for utsnitt. Mål ut av bildet: headeren X-Snitt-Info har px_per_m, utstrekning og bildestorrelse (u = u0 + px/px_per_m, v = v0 + (h-1-py)/px_per_m). 404 når snittet er tomt.","category_label":"Punktsky (skann): lagre, snitt og mål fra mobil","input_schema":{"type":"object","properties":{"pid":{"type":"string"},"axis":{"type":"string"},"lo":{"type":"number"},"hi":{"type":"number"},"px_per_m":{"type":"number"},"grid_m":{"type":"number"},"point_px":{"type":"number"},"gray":{"type":"boolean"},"sid":{"type":"string"}},"required":["pid"]}},{"name":"punktsky_mobil","cat":"punktsky","no":"Lett side for mobil (ikke 3D): velg plan eller snitt, dra glidebrytere, trykk to punkter for å måle avstanden. Samme lenke som skyen, med /mobil bak. Legg ?share=… eller innlogging som ellers.","en":"Light page for phones (not 3D): pick plan or section, drag sliders, tap two points to measure the distance. Same link as the cloud with /mobil appended; use ?share=… or a login as usual.","method":"GET","path":"/sessions/{sid}/punktsky/{pid}/mobil","access":"share","effect":"read","params":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"}},"required":["pid"]},"status":"live","server":"web","returns":"text/html","level":"read","description":"Light page for phones (not 3D): pick plan or section, drag sliders, tap two points to measure the distance. Same link as the cloud with /mobil appended; use ?share=… or a login as usual. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Lett side for mobil (ikke 3D): velg plan eller snitt, dra glidebrytere, trykk to punkter for å måle avstanden. Samme lenke som skyen, med /mobil bak. Legg ?share=… eller innlogging som ellers.","category_label":"Punktsky (skann): lagre, snitt og mål fra mobil","input_schema":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"}},"required":["pid"]}},{"name":"punktsky_viewer","cat":"punktsky","no":"Full 3D-viewer (Three.js): orbit, navigere og måle i 3D. Samme produkt som python -m ingest.punktsky viewer / *_viewer.html — ikke PNG-snittet /mobil. Bruk denne når brukeren vil se skyen i 3D.","en":"Full 3D viewer (Three.js): orbit, navigate and measure in 3D. Same product as python -m ingest.punktsky viewer / *_viewer.html — not the /mobil PNG slice. Use this when the user wants to see the cloud in 3D.","method":"GET","path":"/sessions/{sid}/punktsky/{pid}/viewer","access":"share","effect":"read","params":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"}},"required":["pid"]},"status":"live","server":"web","returns":"text/html","level":"read","description":"Full 3D viewer (Three.js): orbit, navigate and measure in 3D. Same product as python -m ingest.punktsky viewer / *_viewer.html — not the /mobil PNG slice. Use this when the user wants to see the cloud in 3D. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Full 3D-viewer (Three.js): orbit, navigere og måle i 3D. Samme produkt som python -m ingest.punktsky viewer / *_viewer.html — ikke PNG-snittet /mobil. Bruk denne når brukeren vil se skyen i 3D.","category_label":"Punktsky (skann): lagre, snitt og mål fra mobil","input_schema":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"}},"required":["pid"]}},{"name":"punktsky_points","cat":"punktsky","no":"Binær xyz(+rgb) for å tegne skyen i Draw modell-3D sammen med vegger/tak (T-1912). Query max=LOD-tak (standard 54000). Header X-Punktsky-Points har n/n_full. Ikke viewer-HTML.","en":"Binary xyz(+rgb) to draw the cloud in Draw model-3D with walls/roofs (T-1912). Query max=LOD cap (default 54000). Header X-Punktsky-Points has n/n_full. Not the viewer HTML.","method":"GET","path":"/sessions/{sid}/punktsky/{pid}/points.bin","access":"share","effect":"read","params":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"},"max":{"type":"integer"}},"required":["pid"]},"status":"live","server":"web","returns":"application/octet-stream","level":"read","description":"Binary xyz(+rgb) to draw the cloud in Draw model-3D with walls/roofs (T-1912). Query max=LOD cap (default 54000). Header X-Punktsky-Points has n/n_full. Not the viewer HTML. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Binær xyz(+rgb) for å tegne skyen i Draw modell-3D sammen med vegger/tak (T-1912). Query max=LOD-tak (standard 54000). Header X-Punktsky-Points har n/n_full. Ikke viewer-HTML.","category_label":"Punktsky (skann): lagre, snitt og mål fra mobil","input_schema":{"type":"object","properties":{"pid":{"type":"string"},"sid":{"type":"string"},"max":{"type":"integer"}},"required":["pid"]}},{"name":"list_baselines","cat":"versjon","no":"Sist godkjent av KOMMUNEN (ikke eierens «godkjent»): gjeldende referanse og historikk med saksnummer, vedtaksdato, kilde og versjon.","en":"Last approved by the MUNICIPALITY (not the owner's «approved»): the current reference and history with case reference, decision date, source and version.","method":"GET","path":"/sessions/{sid}/baselines","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"sid":{"type":"string"}}},"status":"live","server":"web","level":"read","description":"Last approved by the MUNICIPALITY (not the owner's «approved»): the current reference and history with case reference, decision date, source and version. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Sist godkjent av KOMMUNEN (ikke eierens «godkjent»): gjeldende referanse og historikk med saksnummer, vedtaksdato, kilde og versjon.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"sid":{"type":"string"}}}},{"name":"set_municipal_baseline","cat":"versjon","no":"Registrer en lagret versjon som godkjent av kommunen: version (id/nummer/latest), case_ref (saksnummer/vedtaksreferanse), decided_at ÅÅÅÅ-MM-DD, source (godkjent tegning), note. Uforanderlig og kan ikke overskrives; flere gir historikk, siste vedtak er gjeldende. Bare innlogget eier/admin, aldri med nøkkel.","en":"Register a stored version as approved by the municipality: version (id/number/latest), case_ref, decided_at YYYY-MM-DD, source, note. Immutable, cannot be overwritten; several make a history, the latest decision is current. Logged-in owner/admin only, never with a key.","method":"POST","path":"/sessions/{sid}/baselines","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"version":{"type":"string"},"case_ref":{"type":"string"},"decided_at":{"type":"string"},"source":{"type":"string"},"note":{"type":"string"},"sid":{"type":"string"}},"required":["case_ref","decided_at"]},"example":{"version":"latest","case_ref":"2026/12345","decided_at":"2026-05-12","source":"Godkjent plantegning 1. etasje"},"status":"live","server":"web","level":"owner","description":"Register a stored version as approved by the municipality: version (id/number/latest), case_ref, decided_at YYYY-MM-DD, source, note. Immutable, cannot be overwritten; several make a history, the latest decision is current. Logged-in owner/admin only, never with a key. [logged in] — NO: Registrer en lagret versjon som godkjent av kommunen: version (id/nummer/latest), case_ref (saksnummer/vedtaksreferanse), decided_at ÅÅÅÅ-MM-DD, source (godkjent tegning), note. Uforanderlig og kan ikke overskrives; flere gir historikk, siste vedtak er gjeldende. Bare innlogget eier/admin, aldri med nøkkel.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"version":{"type":"string"},"case_ref":{"type":"string"},"decided_at":{"type":"string"},"source":{"type":"string"},"note":{"type":"string"},"sid":{"type":"string"}},"required":["case_ref","decided_at"]}},{"name":"baseline_changes","cat":"versjon","no":"«Endret siden sist godkjent»: elementer lagt til, fjernet og endret (vegger, åpninger, dekker, tak, mål) i den levende modellen mot gjeldende (eller valgt) kommune-godkjenning, med tegn på om det krever søknad om endring av tillatelse.","en":"«Changed since last approved»: elements added, removed and changed (walls, openings, slabs, roofs, dimensions) in the live model against the current (or chosen) municipal baseline, flagging whether it needs an application for changed permit.","method":"GET","path":"/sessions/{sid}/baselines/changes","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"baseline":{"type":"string"},"limit":{"type":"integer"},"sid":{"type":"string"}}},"status":"live","server":"web","level":"read","description":"«Changed since last approved»: elements added, removed and changed (walls, openings, slabs, roofs, dimensions) in the live model against the current (or chosen) municipal baseline, flagging whether it needs an application for changed permit. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: «Endret siden sist godkjent»: elementer lagt til, fjernet og endret (vegger, åpninger, dekker, tak, mål) i den levende modellen mot gjeldende (eller valgt) kommune-godkjenning, med tegn på om det krever søknad om endring av tillatelse.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"baseline":{"type":"string"},"limit":{"type":"integer"},"sid":{"type":"string"}}}},{"name":"mark_phases_from_baseline","cat":"versjon","no":"Merk den levende modellen fra «endret siden sist godkjent»: uendret = eksisterende, endret = endres, nytt = ny (fasefarger slås på). Fjernede elementer finnes ikke i modellen og listes i svaret. Ett angresteg.","en":"Mark the live model from «changed since last approved»: unchanged = existing, changed = modified, added = new (phase colours switched on). Removed elements are not in the model and are listed in the answer. One undo step.","method":"POST","path":"/sessions/{sid}/baselines/mark-phases","access":"share","effect":"write","mcp":"web","params":{"type":"object","properties":{"baseline":{"type":"string"},"only_unmarked":{"type":"boolean"},"mode":{"type":"string"},"sid":{"type":"string"}}},"status":"live","server":"web","level":"propose","description":"Mark the live model from «changed since last approved»: unchanged = existing, changed = modified, added = new (phase colours switched on). Removed elements are not in the model and are listed in the answer. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Merk den levende modellen fra «endret siden sist godkjent»: uendret = eksisterende, endret = endres, nytt = ny (fasefarger slås på). Fjernede elementer finnes ikke i modellen og listes i svaret. Ett angresteg.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"baseline":{"type":"string"},"only_unmarked":{"type":"boolean"},"mode":{"type":"string"},"sid":{"type":"string"}}}},{"name":"punktsky_infrastruktur","cat":"punktsky","no":"Finn infrastruktur-møbler i en punktsky: toalett, servant, badekar, dusj, trapp, pipe/skorstein og peis (og vinduer/dører i veggbildene). Hvert funn: type, etasje, sentrum, rot_deg (fronten), mot_vegg, skann_maal_m, maal_m (forslag; standard når skannet er usikkert), sikkerhet, status (usikker = rødt, bekreft_maal = oransje) og spor (ETT mål å bekrefte). Trapper er alltid røde (antall trinn oppgis). plasser=true setter funnene inn som bibliotekkomponenter / parametrisk trapp og pipe i riktig etasje. Veggbildene (1 cm/px, sett fra rommet) hentes med punktsky_veggbilde. Tersklene er brukerinnstillinger skann_infra.* (get_prefs).","en":"Find fixtures in a point cloud: toilet, basin, bathtub, shower, stair, chimney and fireplace (and windows/doors in the wall images). Each find: type, storey, centre, rot_deg (front), mot_vegg, scan size, proposed size (standard when the scan is unsure), confidence, status (usikker = red, bekreft_maal = orange) and spor (ONE measure to confirm). Stairs are always red (give the number of steps). plasser=true inserts them as library components / parametric stair and chimney in the right storey. Wall images (1 cm/px, seen from the room) via punktsky_veggbilde. Thresholds are user settings skann_infra.* (get_prefs).","method":"POST","path":"/sessions/{sid}/punktsky/{pid}/infrastruktur","access":"share","effect":"write","mcp":"web","params":{"type":"object","properties":{"pid":{"type":"string"},"plasser":{"type":"boolean"},"typer":{"type":"array","items":{"type":"string"}},"forskyv":{"type":"array","items":{"type":"number"}},"innstillinger":{"type":"object"},"sid":{"type":"string"}},"required":["pid"]},"example":{"pid":"0123456789abcdef","plasser":true},"status":"live","server":"web","returns":"{ok, funn:[{type, etasje, sentrum, rot_deg, maal_m, status, spor, sikkerhet}], etasjer, veggbilder:[{n, url}], plassering?}","level":"propose","description":"Find fixtures in a point cloud: toilet, basin, bathtub, shower, stair, chimney and fireplace (and windows/doors in the wall images). Each find: type, storey, centre, rot_deg (front), mot_vegg, scan size, proposed size (standard when the scan is unsure), confidence, status (usikker = red, bekreft_maal = orange) and spor (ONE measure to confirm). Stairs are always red (give the number of steps). plasser=true inserts them as library components / parametric stair and chimney in the right storey. Wall images (1 cm/px, seen from the room) via punktsky_veggbilde. Thresholds are user settings skann_infra.* (get_prefs). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Finn infrastruktur-møbler i en punktsky: toalett, servant, badekar, dusj, trapp, pipe/skorstein og peis (og vinduer/dører i veggbildene). Hvert funn: type, etasje, sentrum, rot_deg (fronten), mot_vegg, skann_maal_m, maal_m (forslag; standard når skannet er usikkert), sikkerhet, status (usikker = rødt, bekreft_maal = oransje) og spor (ETT mål å bekrefte). Trapper er alltid røde (antall trinn oppgis). plasser=true setter funnene inn som bibliotekkomponenter / parametrisk trapp og pipe i riktig etasje. Veggbildene (1 cm/px, sett fra rommet) hentes med punktsky_veggbilde. Tersklene er brukerinnstillinger skann_infra.* (get_prefs).","category_label":"Punktsky (skann): lagre, snitt og mål fra mobil","input_schema":{"type":"object","properties":{"pid":{"type":"string"},"plasser":{"type":"boolean"},"typer":{"type":"array","items":{"type":"string"}},"forskyv":{"type":"array","items":{"type":"number"}},"innstillinger":{"type":"object"},"sid":{"type":"string"}},"required":["pid"]}},{"name":"punktsky_veggbilde","cat":"punktsky","no":"Et veggbilde (PNG, 1 cm/px, punktene fra 8 cm bak til 0,9 m foran veggen, sett fra rommet) fra punktsky_infrastruktur: bruk veggbilder[].url.","en":"A wall image (PNG, 1 cm/px, points from 8 cm behind to 0.9 m in front of the wall, seen from the room) from punktsky_infrastruktur: use veggbilder[].url.","method":"GET","path":"/sessions/{sid}/punktsky/{pid}/veggbilde/{navn}.png","access":"share","effect":"read","params":{"type":"object","properties":{"pid":{"type":"string"},"navn":{"type":"string"},"sid":{"type":"string"}},"required":["pid","navn"]},"status":"live","server":"web","returns":"image/png","level":"read","description":"A wall image (PNG, 1 cm/px, points from 8 cm behind to 0.9 m in front of the wall, seen from the room) from punktsky_infrastruktur: use veggbilder[].url. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Et veggbilde (PNG, 1 cm/px, punktene fra 8 cm bak til 0,9 m foran veggen, sett fra rommet) fra punktsky_infrastruktur: bruk veggbilder[].url.","category_label":"Punktsky (skann): lagre, snitt og mål fra mobil","input_schema":{"type":"object","properties":{"pid":{"type":"string"},"navn":{"type":"string"},"sid":{"type":"string"}},"required":["pid","navn"]}},{"name":"bekreft_skann_funn","cat":"punktsky","no":"Tegneren har målt et skann-funn (gruppe fra punktsky_infrastruktur plassering): sett bredde_m/dybde_m/hoyde_m og merk det bekreftet (ikke lenger rødt/oransje). Uten mål: bare bekreft typen og målet som står.","en":"The drafter measured a scan find (group from punktsky_infrastruktur placement): set bredde_m/dybde_m/hoyde_m and mark it confirmed (no longer red/orange). Without sizes: confirm the type and the size as it is.","method":"POST","path":"/sessions/{sid}/skann-funn/bekreft","access":"share","effect":"write","mcp":"web","params":{"type":"object","properties":{"gruppe":{"type":"string"},"bredde_m":{"type":"number"},"dybde_m":{"type":"number"},"hoyde_m":{"type":"number"},"sid":{"type":"string"}},"required":["gruppe"]},"example":{"gruppe":"<uid>","bredde_m":1.43},"status":"live","server":"web","level":"propose","description":"The drafter measured a scan find (group from punktsky_infrastruktur placement): set bredde_m/dybde_m/hoyde_m and mark it confirmed (no longer red/orange). Without sizes: confirm the type and the size as it is. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Tegneren har målt et skann-funn (gruppe fra punktsky_infrastruktur plassering): sett bredde_m/dybde_m/hoyde_m og merk det bekreftet (ikke lenger rødt/oransje). Uten mål: bare bekreft typen og målet som står.","category_label":"Punktsky (skann): lagre, snitt og mål fra mobil","input_schema":{"type":"object","properties":{"gruppe":{"type":"string"},"bredde_m":{"type":"number"},"dybde_m":{"type":"number"},"hoyde_m":{"type":"number"},"sid":{"type":"string"}},"required":["gruppe"]}},{"name":"find_component","cat":"komponent","no":"Søk i komponentbiblioteket: Dibrix' parametriske møbler, kjøkken, hvitevarer og sanitær (seng, sofa, spisebord, kjøkken-underskap, kjøleskap, vaskemaskin, badekar, toalett …; id dibrix-furn-<type>, params med område) og dør- / vindustyper. q, category, page. Hver treff har id, navn, mål i cm og params. Ingen mesh-katalog. Åpen, uten økt. Miniatyr (SVG): GET /library/{id}/thumb.","en":"Search the component library: Dibrix' parametric furniture, kitchen, appliance and sanitary types (bed, sofa, dining table, base cabinet, fridge, washer, bathtub, toilet …; id dibrix-furn-<type>, params with range) and door / window types. q, category, page. Each hit has id, name, size in cm and params. No mesh catalogue. Open, no session. Thumbnail (SVG): GET /library/{id}/thumb.","method":"GET","path":"/library","access":"public","effect":"read","mcp":"web","py":"find_component(q)","ops":["find_component"],"params":{"type":"object","properties":{"q":{"type":"string"},"category":{"type":"string"},"license":{"type":"string"},"page":{"type":"integer"},"size":{"type":"integer"}}},"example":{"q":"seng"},"status":"live","server":"web","returns":"{items:[{id, name, category, size_cm, params, defaults, furniture, kind}], total, page, pages, categories}","description":"Search the component library: Dibrix' parametric furniture, kitchen, appliance and sanitary types (bed, sofa, dining table, base cabinet, fridge, washer, bathtub, toilet …; id dibrix-furn-<type>, params with range) and door / window types. q, category, page. Each hit has id, name, size in cm and params. No mesh catalogue. Open, no session. Thumbnail (SVG): GET /library/{id}/thumb. [open, no login] — NO: Søk i komponentbiblioteket: Dibrix' parametriske møbler, kjøkken, hvitevarer og sanitær (seng, sofa, spisebord, kjøkken-underskap, kjøleskap, vaskemaskin, badekar, toalett …; id dibrix-furn-<type>, params med område) og dør- / vindustyper. q, category, page. Hver treff har id, navn, mål i cm og params. Ingen mesh-katalog. Åpen, uten økt. Miniatyr (SVG): GET /library/{id}/thumb.","category_label":"Komponenter (parametriske møbler og sanitær)","input_schema":{"type":"object","properties":{"q":{"type":"string"},"category":{"type":"string"},"license":{"type":"string"},"page":{"type":"integer"},"size":{"type":"integer"}}}},{"name":"library_thumb","cat":"komponent","no":"Miniatyr (SVG) av en komponent, cachet.","en":"Thumbnail (SVG) of a component, cached.","method":"GET","path":"/library/{id}/thumb","access":"public","effect":"read","status":"live","server":"web","returns":"image/png","description":"Thumbnail (SVG) of a component, cached. [open, no login] — NO: Miniatyr (SVG) av en komponent, cachet.","category_label":"Komponenter (parametriske møbler og sanitær)","input_schema":{"type":"object","properties":{}}},{"name":"insert_component","cat":"komponent","no":"Sett inn et parametrisk møbel (id fra find_component, f.eks. dibrix-furn-seng) med midten av bunnen i (x, y, z) meter, rot grader om Z; size_m=[b, d, h] i meter gir møbelets størrelse (innenfor typens område); params = typens øvrige parametre (sink, drawers, appliance, round …). Front mot -y, rygg / vegg mot +y; kjøkkenmoduler med samme y står på linje. Instans av en DELT prototype (lett selv med hundrevis), ett angresteg. Uten x og y startes klikk-plassering i modellen. Samme id brukes i hus-spec furniture[].ref.","en":"Insert a parametric furniture type (id from find_component, e.g. dibrix-furn-seng) with the base centre at (x, y, z) metres, rot degrees about Z; size_m=[width, depth, height] m builds it at those sizes (within the type's range); params = the type's other params (sink, drawers, appliance, round …). Front towards -y, back / wall towards +y; kitchen modules at the same y line up. An instance of a SHARED prototype (cheap even by the hundred), one undo step. Without x and y the click-to-place tool starts. The same id is used in house-spec furniture[].ref.","method":"POST","path":"/sessions/{sid}/library/insert","access":"share","effect":"write","mcp":"web","py":"insert_component(id, x, y, z)","ops":["insert_component"],"params":{"type":"object","properties":{"id":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"rot":{"type":"number"},"scale":{"type":"number"},"place":{"type":"boolean"},"size_m":{"type":"array","items":{"type":"number"},"maxItems":3},"params":{"type":"object"},"sid":{"type":"string"}},"required":["id"]},"example":{"id":"dibrix-furn-kjokken-underskap","x":2.0,"y":0.31,"z":0.0,"rot":0,"size_m":[0.8,null,null],"params":{"sink":1}},"status":"live","server":"web","returns":"{ok, id, name, license, license_class, author, group, at, size_m, params, version}","level":"propose","description":"Insert a parametric furniture type (id from find_component, e.g. dibrix-furn-seng) with the base centre at (x, y, z) metres, rot degrees about Z; size_m=[width, depth, height] m builds it at those sizes (within the type's range); params = the type's other params (sink, drawers, appliance, round …). Front towards -y, back / wall towards +y; kitchen modules at the same y line up. An instance of a SHARED prototype (cheap even by the hundred), one undo step. Without x and y the click-to-place tool starts. The same id is used in house-spec furniture[].ref. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Sett inn et parametrisk møbel (id fra find_component, f.eks. dibrix-furn-seng) med midten av bunnen i (x, y, z) meter, rot grader om Z; size_m=[b, d, h] i meter gir møbelets størrelse (innenfor typens område); params = typens øvrige parametre (sink, drawers, appliance, round …). Front mot -y, rygg / vegg mot +y; kjøkkenmoduler med samme y står på linje. Instans av en DELT prototype (lett selv med hundrevis), ett angresteg. Uten x og y startes klikk-plassering i modellen. Samme id brukes i hus-spec furniture[].ref.","category_label":"Komponenter (parametriske møbler og sanitær)","input_schema":{"type":"object","properties":{"id":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"rot":{"type":"number"},"scale":{"type":"number"},"place":{"type":"boolean"},"size_m":{"type":"array","items":{"type":"number"},"maxItems":3},"params":{"type":"object"},"sid":{"type":"string"}},"required":["id"]}},{"name":"share_link","cat":"okt","no":"Lag en delelenke for økta på ett av TRE nivåer. role=viewer (LESE: ingen innlogging, privat skrivebeskyttet kopi per seer), role=propose (LAGE NYE VERSJONER, standard for agenter: ingen innlogging, privat ARBEIDSKOPI der alle agent-ruter, igz-opplasting og endringer virker; resultatet lagres som NY versjon med status utkast, merket med lenken. Kan ikke røre den kjørende økta, overskrive, godkjenne eller endre siste godkjente) eller role=write (OVERSKRIVE den kjørende økta; krever innlogging; utløper etter 24 t, maks 7 d; lag den bare når eieren ber om det). Godkjenning går aldri med nøkkel. role=editor er gammelt navn for propose. version (viewer/propose): approved (viewer-standard: SIST GODKJENTE versjon), latest (propose-standard: den levende modellen, utkast og alt) eller et versjonsnummer (v3: låst). ttl_days (viewer 1-730, standard 90; propose 1-90, standard 30) eller ttl_hours (write 1-168, standard 24). Svar: link.path (?session=<lenke-id>&share=<token>, token vises BARE nå; legg til &scene=<navn> for å åpne en bestemt scene), link.level, shows, warning=no_approved_version. Lenke-id er ikke økt-id. Tilbakekall med revoke_share.","en":"Mint a share link for the session at one of THREE levels. role=viewer (READ: no login, a private read-only copy per viewer), role=propose (MAKE NEW VERSIONS, the default for agents: no login, a private WORKING copy where every agent route, igz upload and edit works; the result is saved as a NEW version with status draft, tagged with the link. Cannot touch the running session, overwrite, approve or change the last approved version) or role=write (OVERWRITE the running session; needs a login; expires after 24 h, 7 days at most; mint it only when the owner asks). Approval never goes with a key. role=editor is the old name of propose. version (viewer/propose): approved (viewer default: the LAST APPROVED version), latest (propose default: the running model, drafts and all) or a version number (v3: pinned). ttl_days (viewer 1-730, default 90; propose 1-90, default 30) or ttl_hours (write 1-168, default 24). Answer: link.path (?session=<link id>&share=<token>, the token is shown ONLY now; add &scene=<name> to open a given scene), link.level, shows, warning=no_approved_version. show (viewer/propose, 3A «Hva kunden ser»): what the customer sees besides the 3D model, any of visninger (the Plan / Fasader / Snitt tabs), tegninger, pris, konstruksjon, bildetur, versjoner; left out = everything except prices (as before), [] = only the 3D model. The link id is not a session id. Revoke with revoke_share.","method":"POST","path":"/sessions/{sid}/share-links","access":"share","effect":"write","mcp":"web","py":"share_link('approved')","params":{"type":"object","properties":{"role":{"type":"string","enum":["viewer","propose","write"]},"version":{"type":"string"},"ttl_days":{"type":"integer"},"ttl_hours":{"type":"integer"},"label":{"type":"string"},"sid":{"type":"string"},"show":{"type":"array","items":{"type":"string","enum":["visninger","tegninger","pris","konstruksjon","bildetur","versjoner"]}}}},"example":{"role":"propose","version":"latest","ttl_days":14,"label":"agent"},"status":"live","server":"web","returns":"{ok, link:{id, role, level, token, path, expires_at, active}}","level":"owner","description":"Mint a share link for the session at one of THREE levels. role=viewer (READ: no login, a private read-only copy per viewer), role=propose (MAKE NEW VERSIONS, the default for agents: no login, a private WORKING copy where every agent route, igz upload and edit works; the result is saved as a NEW version with status draft, tagged with the link. Cannot touch the running session, overwrite, approve or change the last approved version) or role=write (OVERWRITE the running session; needs a login; expires after 24 h, 7 days at most; mint it only when the owner asks). Approval never goes with a key. role=editor is the old name of propose. version (viewer/propose): approved (viewer default: the LAST APPROVED version), latest (propose default: the running model, drafts and all) or a version number (v3: pinned). ttl_days (viewer 1-730, default 90; propose 1-90, default 30) or ttl_hours (write 1-168, default 24). Answer: link.path (?session=<link id>&share=<token>, the token is shown ONLY now; add &scene=<name> to open a given scene), link.level, shows, warning=no_approved_version. show (viewer/propose, 3A «Hva kunden ser»): what the customer sees besides the 3D model, any of visninger (the Plan / Fasader / Snitt tabs), tegninger, pris, konstruksjon, bildetur, versjoner; left out = everything except prices (as before), [] = only the 3D model. The link id is not a session id. Revoke with revoke_share. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Lag en delelenke for økta på ett av TRE nivåer. role=viewer (LESE: ingen innlogging, privat skrivebeskyttet kopi per seer), role=propose (LAGE NYE VERSJONER, standard for agenter: ingen innlogging, privat ARBEIDSKOPI der alle agent-ruter, igz-opplasting og endringer virker; resultatet lagres som NY versjon med status utkast, merket med lenken. Kan ikke røre den kjørende økta, overskrive, godkjenne eller endre siste godkjente) eller role=write (OVERSKRIVE den kjørende økta; krever innlogging; utløper etter 24 t, maks 7 d; lag den bare når eieren ber om det). Godkjenning går aldri med nøkkel. role=editor er gammelt navn for propose. version (viewer/propose): approved (viewer-standard: SIST GODKJENTE versjon), latest (propose-standard: den levende modellen, utkast og alt) eller et versjonsnummer (v3: låst). ttl_days (viewer 1-730, standard 90; propose 1-90, standard 30) eller ttl_hours (write 1-168, standard 24). Svar: link.path (?session=<lenke-id>&share=<token>, token vises BARE nå; legg til &scene=<navn> for å åpne en bestemt scene), link.level, shows, warning=no_approved_version. Lenke-id er ikke økt-id. Tilbakekall med revoke_share.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{"role":{"type":"string","enum":["viewer","propose","write"]},"version":{"type":"string"},"ttl_days":{"type":"integer"},"ttl_hours":{"type":"integer"},"label":{"type":"string"},"sid":{"type":"string"},"show":{"type":"array","items":{"type":"string","enum":["visninger","tegninger","pris","konstruksjon","bildetur","versjoner"]}}}}},{"name":"list_share_links","cat":"okt","no":"List delelenkene til økta (uten token): rolle, utløp, tilbakekalt, sist brukt, antall åpninger.","en":"List the session's share links (no tokens): role, expiry, revoked, last used, open count.","method":"GET","path":"/sessions/{sid}/share-links","access":"share","effect":"read","mcp":"web","status":"live","server":"web","returns":"{links:[{id, role, active, expires_at, revoked_at, use_count}]}","level":"owner","description":"List the session's share links (no tokens): role, expiry, revoked, last used, open count. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: List delelenkene til økta (uten token): rolle, utløp, tilbakekalt, sist brukt, antall åpninger.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"revoke_share","cat":"okt","no":"Tilbakekall en delelenke (link_id fra list_share_links). Åpne kopier lukkes med en gang.","en":"Revoke a share link (link_id from list_share_links). Open copies are closed at once.","method":"DELETE","path":"/sessions/{sid}/share-links/{link_id}","access":"share","effect":"write","mcp":"web","params":{"type":"object","properties":{"link_id":{"type":"string"},"sid":{"type":"string"}},"required":["link_id"]},"status":"live","server":"web","level":"owner","description":"Revoke a share link (link_id from list_share_links). Open copies are closed at once. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Tilbakekall en delelenke (link_id fra list_share_links). Åpne kopier lukkes med en gang.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{"link_id":{"type":"string"},"sid":{"type":"string"}},"required":["link_id"]}},{"name":"view_open","cat":"okt","no":"Åpne en viewer- eller propose-lenke uten innlogging: session=<lenke-id>, share=<token> -> en privat økt (session_id). viewer: skrivebeskyttet (les med scene_summary, render, list_entities; skrive-kall gir 403). propose: en ARBEIDSKOPI du kan endre fritt (agent-ruter, igz-opplasting maks 100 MB med Content-Length); lagre resultatet med save_version, det blir en NY versjon med status utkast merket med lenka. Samme 404 for ukjent, utløpt og tilbakekalt lenke; maks 10 bomskudd per minutt. Den gamle økt-nøkkelen (session=<økt-id>) åpner også en arbeidskopi.","en":"Open a viewer or propose link without login: session=<link id>, share=<token> -> a private session (session_id). viewer: read-only (read with scene_summary, render, list_entities; writes answer 403). propose: a WORKING copy you may change freely (agent routes, igz upload up to 100 MB with a Content-Length); save the result with save_version, it becomes a NEW version with status draft tagged with the link. Same 404 for unknown, expired and revoked links; 10 misses a minute at most. The old session key (session=<session id>) also opens a working copy.","method":"POST","path":"/view/open","access":"public","effect":"read","mcp":"web","params":{"type":"object","properties":{"session":{"type":"string"},"share":{"type":"string"}},"required":["session","share"]},"example":{"session":"<lenke-id>","share":"pr_<token>"},"status":"live","server":"web","returns":"{ok, session_id, read_only, role, level, link_id, version}","description":"Open a viewer or propose link without login: session=<link id>, share=<token> -> a private session (session_id). viewer: read-only (read with scene_summary, render, list_entities; writes answer 403). propose: a WORKING copy you may change freely (agent routes, igz upload up to 100 MB with a Content-Length); save the result with save_version, it becomes a NEW version with status draft tagged with the link. Same 404 for unknown, expired and revoked links; 10 misses a minute at most. The old session key (session=<session id>) also opens a working copy. [open, no login] — NO: Åpne en viewer- eller propose-lenke uten innlogging: session=<lenke-id>, share=<token> -> en privat økt (session_id). viewer: skrivebeskyttet (les med scene_summary, render, list_entities; skrive-kall gir 403). propose: en ARBEIDSKOPI du kan endre fritt (agent-ruter, igz-opplasting maks 100 MB med Content-Length); lagre resultatet med save_version, det blir en NY versjon med status utkast merket med lenka. Samme 404 for ukjent, utløpt og tilbakekalt lenke; maks 10 bomskudd per minutt. Den gamle økt-nøkkelen (session=<økt-id>) åpner også en arbeidskopi.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{"session":{"type":"string"},"share":{"type":"string"}},"required":["session","share"]}},{"name":"save_version","cat":"versjon","no":"Lagre økta som en NY uforanderlig versjon (igz + hus-spec + forhåndsvisning + tall). comment = hva er endret. Samme innhold som siste versjon lagres ikke to ganger (created=false). Prosjektets lagring (Ctrl+S) lager også versjon; 2-minutters autolagring gjør det ikke. phases/plan er reservert for faser og 5D (lagres med versjonen).","en":"Save the session as a NEW immutable version (igz + house spec + preview + numbers). comment = what changed. Content identical to the newest version is not saved twice (created=false). A project save (Ctrl+S) also makes a version; the 2-minute autosave does not. phases/plan are reserved for phases and 5D (stored with the version).","method":"POST","path":"/sessions/{sid}/versions","access":"share","effect":"write","mcp":"web","py":"save_version('Lagt til garasje')","params":{"type":"object","properties":{"comment":{"type":"string"},"phases":{"type":"object"},"plan":{"type":"object"},"force":{"type":"boolean"},"sid":{"type":"string"}}},"example":{"comment":"Lagt til garasje"},"status":"live","server":"web","returns":"{ok, created, version:{id, seq, label, comment, size_bytes, stored_bytes, sha256, status}}","level":"propose","description":"Save the session as a NEW immutable version (igz + house spec + preview + numbers). comment = what changed. Content identical to the newest version is not saved twice (created=false). A project save (Ctrl+S) also makes a version; the 2-minute autosave does not. phases/plan are reserved for phases and 5D (stored with the version). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Lagre økta som en NY uforanderlig versjon (igz + hus-spec + forhåndsvisning + tall). comment = hva er endret. Samme innhold som siste versjon lagres ikke to ganger (created=false). Prosjektets lagring (Ctrl+S) lager også versjon; 2-minutters autolagring gjør det ikke. phases/plan er reservert for faser og 5D (lagres med versjonen).","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"comment":{"type":"string"},"phases":{"type":"object"},"plan":{"type":"object"},"force":{"type":"boolean"},"sid":{"type":"string"}}}},{"name":"list_versions","cat":"versjon","no":"List versjonene (nyeste først): nummer, tid, forfatter, kommentar, størrelse, hash, status (utkast/til gjennomgang/godkjent) og siste godkjente.","en":"List the versions (newest first): number, time, author, comment, size, hash, status (draft/review/approved) and the last approved one.","method":"GET","path":"/sessions/{sid}/versions","access":"share","effect":"read","mcp":"web","py":"list_versions()","params":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"sid":{"type":"string"}}},"status":"live","server":"web","returns":"{scope, total, approved_id, versions:[...]}","level":"read","description":"List the versions (newest first): number, time, author, comment, size, hash, status (draft/review/approved) and the last approved one. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: List versjonene (nyeste først): nummer, tid, forfatter, kommentar, størrelse, hash, status (utkast/til gjennomgang/godkjent) og siste godkjente.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"sid":{"type":"string"}}}},{"name":"open_info","cat":"versjon","no":"Hva en lenke trenger for å åpne «klart til test»: prosjektet økta hører til (navn til tittelen), siste versjon og om en nyere lagret versjon enn prosjektfila finnes (newer_version; åpne den med POST /projects/{id}/sessions?version=latest). Lenker kan ta ?scene=<navn> og ?version=latest|vN.","en":"What a link needs to open ready to test: the project the session belongs to (name for the title), the latest version and whether a newer saved version than the project file exists (newer_version; open it with POST /projects/{id}/sessions?version=latest). Links take ?scene=<name> and ?version=latest|vN.","method":"GET","path":"/sessions/{sid}/open-info","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"sid":{"type":"string"}}},"status":"live","server":"web","returns":"{ok, project:{id,name}|null, role, latest_version, newer_version:{label,author_name,created_at,comment}|null}","level":"read","description":"What a link needs to open ready to test: the project the session belongs to (name for the title), the latest version and whether a newer saved version than the project file exists (newer_version; open it with POST /projects/{id}/sessions?version=latest). Links take ?scene=<name> and ?version=latest|vN. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Hva en lenke trenger for å åpne «klart til test»: prosjektet økta hører til (navn til tittelen), siste versjon og om en nyere lagret versjon enn prosjektfila finnes (newer_version; åpne den med POST /projects/{id}/sessions?version=latest). Lenker kan ta ?scene=<navn> og ?version=latest|vN.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"sid":{"type":"string"}}}},{"name":"get_version","cat":"versjon","no":"Hent én versjon (id, nummer 3 / v3 eller latest) med tall (elementer per type, areal, volum, bbox) og historikk. Selve filene: /igz, /spec, /preview.png.","en":"Get one version (id, number 3 / v3, or latest) with its numbers (elements per type, area, volume, bbox) and history. The files: /igz, /spec, /preview.png.","method":"GET","path":"/sessions/{sid}/versions/{vref}","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"vref":{"type":"string"},"sid":{"type":"string"}},"required":["vref"]},"status":"live","server":"web","returns":"{ok, version:{..., summary, history}}","level":"read","description":"Get one version (id, number 3 / v3, or latest) with its numbers (elements per type, area, volume, bbox) and history. The files: /igz, /spec, /preview.png. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Hent én versjon (id, nummer 3 / v3 eller latest) med tall (elementer per type, areal, volum, bbox) og historikk. Selve filene: /igz, /spec, /preview.png.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"vref":{"type":"string"},"sid":{"type":"string"}},"required":["vref"]}},{"name":"version_igz","cat":"versjon","no":"Last ned versjonen som .igz (byte for byte som den ble lagret).","en":"Download the version as .igz (byte for byte as saved).","method":"GET","path":"/sessions/{sid}/versions/{vref}/igz","access":"share","effect":"read","status":"live","server":"web","returns":"application/octet-stream","level":"owner","description":"Download the version as .igz (byte for byte as saved). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Last ned versjonen som .igz (byte for byte som den ble lagret).","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"vref":{"type":"string","title":"Vref"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["vref"]}},{"name":"version_spec","cat":"versjon","no":"Hus-spec (JSON) som versjonen bar: les, rediger og bygg med build_house_from_spec.","en":"The house spec (JSON) the version carried: read, edit and build with build_house_from_spec.","method":"GET","path":"/sessions/{sid}/versions/{vref}/spec","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"vref":{"type":"string"},"sid":{"type":"string"}},"required":["vref"]},"status":"live","server":"web","level":"read","description":"The house spec (JSON) the version carried: read, edit and build with build_house_from_spec. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Hus-spec (JSON) som versjonen bar: les, rediger og bygg med build_house_from_spec.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"vref":{"type":"string"},"sid":{"type":"string"}},"required":["vref"]}},{"name":"version_preview","cat":"versjon","no":"Liten forhåndsvisning (PNG, iso) av versjonen.","en":"Small preview (PNG, iso) of the version.","method":"GET","path":"/sessions/{sid}/versions/{vref}/preview.png","access":"share","effect":"read","status":"live","server":"web","returns":"image/png","level":"read","description":"Small preview (PNG, iso) of the version. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Liten forhåndsvisning (PNG, iso) av versjonen.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"vref":{"type":"string","title":"Vref"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["vref"]}},{"name":"compare_versions","cat":"versjon","no":"Sammenlign to versjoner: elementer per type, bbox, areal, volum og hva som er lagt til/fjernet per spec-liste (vegger, åpninger, dekker, tak ...).","en":"Compare two versions: elements per type, bbox, area, volume, and what was added/removed per spec list (walls, openings, slabs, roofs ...).","method":"GET","path":"/sessions/{sid}/versions/{a}/compare/{b}","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"a":{"type":"string"},"b":{"type":"string"},"sid":{"type":"string"}},"required":["a","b"]},"example":{"a":"1","b":"latest"},"status":"live","server":"web","level":"read","description":"Compare two versions: elements per type, bbox, area, volume, and what was added/removed per spec list (walls, openings, slabs, roofs ...). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Sammenlign to versjoner: elementer per type, bbox, areal, volum og hva som er lagt til/fjernet per spec-liste (vegger, åpninger, dekker, tak ...).","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"a":{"type":"string"},"b":{"type":"string"},"sid":{"type":"string"}},"required":["a","b"]}},{"name":"approve_version","cat":"versjon","no":"Godkjenn en versjon = «Sist godkjent» (BARE eier/admin). source (godkjenningskilde) er PÅKREVD: hva godkjenningen bygger på (saksnummer, signert tegning, e-post fra kunden, befaring). comment = notatet med underlaget for kilden (hvor dokumentet ligger). Lagrer hvem og når. Delelenker (viewer, standard) viser sist godkjente versjon. Den siste godkjente versjonen kan aldri trekkes tilbake, bare avløses av å godkjenne en nyere (med kilde). En endring etter godkjenning er en ny versjon (utkast) som må godkjennes på nytt.","en":"Approve a version = «Last approved» (owner/admin ONLY). source (godkjenningskilde) is REQUIRED: what the approval rests on (case number, signed drawing, mail from the client, inspection). comment = the note with the basis for the source (where the document is). Records who and when. Share links (viewer, default) show the last approved version. The last approved version can never be withdrawn, only replaced by approving a newer one (with a source). A change after the approval is a new version (draft) that has to be approved again.","method":"POST","path":"/sessions/{sid}/versions/{vref}/approve","access":"share","effect":"write","mcp":"web","py":"approve_version(3, 'Signert tegning, sak 24/1234', 'Ligger i Tegnebua/Kunder/…/vedtak.pdf')","params":{"type":"object","properties":{"vref":{"type":"string"},"source":{"type":"string"},"comment":{"type":"string"},"sid":{"type":"string"}},"required":["vref","source"]},"example":{"vref":"3","source":"Kundens godkjenning på e-post 18.10","comment":"E-posten ligger i kundemappen, vedlegg 2"},"status":"live","server":"web","returns":"{ok, version:{status:'approved', approved_by_name, approved_at, approval_source, approval_comment, history}, overview}","level":"owner","description":"Approve a version = «Last approved» (owner/admin ONLY). source (godkjenningskilde) is REQUIRED: what the approval rests on (case number, signed drawing, mail from the client, inspection). comment = the note with the basis for the source (where the document is). Records who and when. Share links (viewer, default) show the last approved version. The last approved version can never be withdrawn, only replaced by approving a newer one (with a source). A change after the approval is a new version (draft) that has to be approved again. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Godkjenn en versjon = «Sist godkjent» (BARE eier/admin). source (godkjenningskilde) er PÅKREVD: hva godkjenningen bygger på (saksnummer, signert tegning, e-post fra kunden, befaring). comment = notatet med underlaget for kilden (hvor dokumentet ligger). Lagrer hvem og når. Delelenker (viewer, standard) viser sist godkjente versjon. Den siste godkjente versjonen kan aldri trekkes tilbake, bare avløses av å godkjenne en nyere (med kilde). En endring etter godkjenning er en ny versjon (utkast) som må godkjennes på nytt.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"vref":{"type":"string"},"source":{"type":"string"},"comment":{"type":"string"},"sid":{"type":"string"}},"required":["vref","source"]}},{"name":"mark_as_built","cat":"versjon","no":"Merk en versjon «Som bygget» (BARE eier/admin). source er PÅKREVD: hva som-bygget-tilstanden bygger på (oppmåling, iGUIDE-tur, bilder, kontrollrapport). note = underlaget for kilden. Den nyeste merkingen er gjeldende; tidligere merker blir stående i historikken, og et merke kan ikke fjernes. Versjonen kan ikke slettes.","en":"Mark a version «As built» (owner/admin ONLY). source is REQUIRED: what the as-built state rests on (survey, iGUIDE tour, photos, inspection report). note = the basis for the source. The newest mark is current; earlier marks stay in the history and a mark cannot be removed. The version cannot be deleted.","method":"POST","path":"/sessions/{sid}/versions/{vref}/as-built","access":"share","effect":"write","mcp":"web","py":"mark_as_built(5, 'Oppmåling 12.10', 'Målene ligger i Survey/oppmaling.pdf')","params":{"type":"object","properties":{"vref":{"type":"string"},"source":{"type":"string"},"note":{"type":"string"},"sid":{"type":"string"}},"required":["vref","source"]},"example":{"vref":"5","source":"Oppmåling på stedet 12.10","note":"Rapport og bilder i Survey-mappen"},"status":"live","server":"web","returns":"{ok, version:{as_built, as_built_at, as_built_source, as_built_note, history}, overview}","level":"owner","description":"Mark a version «As built» (owner/admin ONLY). source is REQUIRED: what the as-built state rests on (survey, iGUIDE tour, photos, inspection report). note = the basis for the source. The newest mark is current; earlier marks stay in the history and a mark cannot be removed. The version cannot be deleted. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Merk en versjon «Som bygget» (BARE eier/admin). source er PÅKREVD: hva som-bygget-tilstanden bygger på (oppmåling, iGUIDE-tur, bilder, kontrollrapport). note = underlaget for kilden. Den nyeste merkingen er gjeldende; tidligere merker blir stående i historikken, og et merke kan ikke fjernes. Versjonen kan ikke slettes.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"vref":{"type":"string"},"source":{"type":"string"},"note":{"type":"string"},"sid":{"type":"string"}},"required":["vref","source"]}},{"name":"set_version_status","cat":"versjon","no":"Sett status draft / review / approved: send til gjennomgang (redigeringsrett), avvis eller trekk tilbake godkjenning (eier; ikke den siste godkjente). Godkjenning krever source. Alt skrives til historikken.","en":"Set the status draft / review / approved: send to review (edit rights), reject or withdraw an approval (owner; not the last approved one). Approving needs source. Everything goes into the history.","method":"POST","path":"/sessions/{sid}/versions/{vref}/status","access":"share","effect":"write","mcp":"web","params":{"type":"object","properties":{"vref":{"type":"string"},"status":{"type":"string","enum":["draft","review","approved"]},"comment":{"type":"string"},"source":{"type":"string"},"sid":{"type":"string"}},"required":["vref","status"]},"example":{"vref":"3","status":"review","comment":"Klar for gjennomgang"},"status":"live","server":"web","level":"owner","description":"Set the status draft / review / approved: send to review (edit rights), reject or withdraw an approval (owner; not the last approved one). Approving needs source. Everything goes into the history. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Sett status draft / review / approved: send til gjennomgang (redigeringsrett), avvis eller trekk tilbake godkjenning (eier; ikke den siste godkjente). Godkjenning krever source. Alt skrives til historikken.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"vref":{"type":"string"},"status":{"type":"string","enum":["draft","review","approved"]},"comment":{"type":"string"},"source":{"type":"string"},"sid":{"type":"string"}},"required":["vref","status"]}},{"name":"approved_overview","cat":"versjon","no":"Siste godkjente versjon, «Som bygget», nyeste versjon, hvor mange som kom etter godkjenningen (needs_approval), hva som er til gjennomgang, hvilke versjoner som er beskyttet (kan ikke slettes) og statushistorikken (hvem/når).","en":"The last approved version, the as-built version, the newest version, how many came after the approval (needs_approval), what is in review, which versions are protected (cannot be deleted) and the status history (who/when).","method":"GET","path":"/sessions/{sid}/approved","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"sid":{"type":"string"}}},"status":"live","server":"web","returns":"{approved, as_built, protected, latest, newer_than_approved, needs_approval, in_review, history}","level":"read","description":"The last approved version, the as-built version, the newest version, how many came after the approval (needs_approval), what is in review, which versions are protected (cannot be deleted) and the status history (who/when). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Siste godkjente versjon, «Som bygget», nyeste versjon, hvor mange som kom etter godkjenningen (needs_approval), hva som er til gjennomgang, hvilke versjoner som er beskyttet (kan ikke slettes) og statushistorikken (hvem/når).","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"sid":{"type":"string"}}}},{"name":"restore_version","cat":"versjon","no":"Gjenopprett en gammel versjon SOM NY versjon øverst (aldri overskriv). Den levende økta får innholdet (load=true). Den gamle versjonen er uendret.","en":"Restore an old version AS A NEW version on top (never overwrites). The live session takes its content (load=true). The old version is unchanged.","method":"POST","path":"/sessions/{sid}/versions/{vref}/restore","access":"share","effect":"write","mcp":"web","params":{"type":"object","properties":{"vref":{"type":"string"},"comment":{"type":"string"},"load":{"type":"boolean"},"sid":{"type":"string"}},"required":["vref"]},"example":{"vref":"2","comment":"tilbake til v2"},"status":"live","server":"web","level":"owner","description":"Restore an old version AS A NEW version on top (never overwrites). The live session takes its content (load=true). The old version is unchanged. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Gjenopprett en gammel versjon SOM NY versjon øverst (aldri overskriv). Den levende økta får innholdet (load=true). Den gamle versjonen er uendret.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"vref":{"type":"string"},"comment":{"type":"string"},"load":{"type":"boolean"},"sid":{"type":"string"}},"required":["vref"]}},{"name":"sandbox_release","cat":"okt","no":"Frigi sandkasseøkta når du er ferdig.","en":"Release the sandbox session when done.","method":"POST","path":"/configurator/sandbox/session/{sid}/release","access":"public","effect":"write","mcp":"web","status":"live","server":"web","description":"Release the sandbox session when done. [open, no login] — NO: Frigi sandkasseøkta når du er ferdig.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{}}},{"name":"select_tool","cat":"okt","no":"Velg et pekerverktøy i UI (vegg, dør, vindu …); tegning skjer med pekeren over WS.","en":"Pick a pointer tool in the UI (wall, door, window ...); drawing then happens with the pointer over WS.","method":"POST","path":"/sessions/{sid}/tool","access":"sandbox","effect":"write","example":{"name":"wall"},"status":"live","server":"web","level":"propose","description":"Pick a pointer tool in the UI (wall, door, window ...); drawing then happens with the pointer over WS. [sandbox (anonymous) or logged in] — NO: Velg et pekerverktøy i UI (vegg, dør, vindu …); tegning skjer med pekeren over WS.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"seq":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seq"}},"required":["name"]}},{"name":"release_tool","cat":"okt","no":"Slipp aktivt pekerverktøy.","en":"Release the active pointer tool.","method":"POST","path":"/sessions/{sid}/tool/release","access":"sandbox","effect":"write","status":"live","server":"web","level":"propose","description":"Release the active pointer tool. [sandbox (anonymous) or logged in] — NO: Slipp aktivt pekerverktøy.","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{}}},{"name":"inspect","cat":"inspeksjon","no":"Oversikt: flater/kanter/etasjer, antall per type, problemer, arealer, lenke. Start her.","en":"Overview: faces/edges/levels, counts per kind, problems, areas, link. Start here.","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"sid":{"type":"string"}}},"status":"live","server":"web","level":"read","description":"Overview: faces/edges/levels, counts per kind, problems, areas, link. Start here. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Oversikt: flater/kanter/etasjer, antall per type, problemer, arealer, lenke. Start her.","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"sid":{"type":"string"}}}},{"name":"plan_build","cat":"inspeksjon","no":"Gjør et mål om til en kort plan ut fra modellen (endrer ingenting).","en":"Turn a goal into a short plan from the live model (does not mutate).","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"goal":{"type":"string"},"sid":{"type":"string"}},"required":["goal"]},"status":"live","server":"web","level":"read","description":"Turn a goal into a short plan from the live model (does not mutate). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Gjør et mål om til en kort plan ut fra modellen (endrer ingenting).","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"goal":{"type":"string"},"sid":{"type":"string"}},"required":["goal"]}},{"name":"query","cat":"inspeksjon","no":"Rå modellstatus (flater, kanter, utvalg, verktøy).","en":"Raw model state (faces, edges, selection, tool).","method":"GET","path":"/sessions/{sid}/query","access":"sandbox","effect":"read","status":"live","server":"web","level":"read","description":"Raw model state (faces, edges, selection, tool). [sandbox (anonymous) or logged in] — NO: Rå modellstatus (flater, kanter, utvalg, verktøy).","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{}}},{"name":"list_entities","cat":"inspeksjon","no":"loose=true tar ogsa med grupper og komponenter som ikke er BIM-elementer (id g<uid>, kan velges og slettes). List BIM-elementer (vegger, dekker, tak …); problems_only=true finner dårlige skjøter.","en":"List BIM elements (walls, slabs, roofs ...); problems_only=true finds broken joins; loose=true also lists groups and components that are not BIM elements (id g<uid>, can be selected and deleted).","method":"GET","path":"/sessions/{sid}/agent/entities","access":"share","effect":"read","mcp":"web","py":"list_entities()","ops":["list_entities"],"status":"live","server":"web","level":"read","description":"List BIM elements (walls, slabs, roofs ...); problems_only=true finds broken joins; loose=true also lists groups and components that are not BIM elements (id g<uid>, can be selected and deleted). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: loose=true tar ogsa med grupper og komponenter som ikke er BIM-elementer (id g<uid>, kan velges og slettes). List BIM-elementer (vegger, dekker, tak …); problems_only=true finner dårlige skjøter.","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"problems_only":{"type":"boolean","default":false,"title":"Problems Only"},"loose":{"type":"boolean","default":false,"title":"Loose"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"get_entity","cat":"inspeksjon","no":"Ett element med mål, payload og helse.","en":"One element with size, payload and health.","method":"GET","path":"/sessions/{sid}/agent/entities/{eid}","access":"share","effect":"read","mcp":"web","ops":["describe","describe_loose","get_group","wall_health"],"status":"live","server":"web","level":"read","description":"One element with size, payload and health. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Ett element med mål, payload og helse.","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"eid":{"type":"string","title":"Eid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["eid"]}},{"name":"select_entities","cat":"inspeksjon","no":"Velg elementer etter id i den levende visningen.","en":"Select elements by id in the live view.","method":"POST","path":"/sessions/{sid}/agent/select","access":"share","effect":"write","mcp":"web","ops":["select_ids"],"example":{"ids":["<id>"],"add":false},"status":"live","server":"web","level":"propose","description":"Select elements by id in the live view. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Velg elementer etter id i den levende visningen.","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Ids"},"add":{"type":"boolean","title":"Add","default":false}},"required":["ids"]}},{"name":"select_all","cat":"inspeksjon","no":"Velg alt (Ctrl+A).","en":"Select all (Ctrl+A).","method":"POST","path":"/sessions/{sid}/selection/all","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Select all (Ctrl+A). [logged in] — NO: Velg alt (Ctrl+A).","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"select_box","cat":"inspeksjon","no":"Velg med rektangel (vindu/kryssing).","en":"Rubber-band select (window/crossing).","method":"POST","path":"/sessions/{sid}/selection/box","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Rubber-band select (window/crossing). [logged in] — NO: Velg med rektangel (vindu/kryssing).","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"x0":{"type":"number","title":"X0"},"y0":{"type":"number","title":"Y0"},"x1":{"type":"number","title":"X1"},"y1":{"type":"number","title":"Y1"},"modifiers":{"items":{"type":"string"},"type":"array","title":"Modifiers"},"camera":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Camera"}},"required":["x0","y0","x1","y1"]}},{"name":"delete_selection","cat":"inspeksjon","no":"Slett det som er valgt (angre virker).","en":"Delete the selection (undoable).","method":"POST","path":"/sessions/{sid}/selection/delete","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Delete the selection (undoable). [logged in] — NO: Slett det som er valgt (angre virker).","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"get_selection_props","cat":"inspeksjon","no":"Egenskaper for utvalget (Entity Info).","en":"Properties of the selection (Entity Info).","method":"GET","path":"/sessions/{sid}/selection/props","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Properties of the selection (Entity Info). [logged in] — NO: Egenskaper for utvalget (Entity Info).","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"set_selection_props","cat":"inspeksjon","no":"Endre egenskaper på utvalget (veggtype, høyde, stil …).","en":"Change properties of the selection (wall type, height, style ...).","method":"POST","path":"/sessions/{sid}/selection/props","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Change properties of the selection (wall type, height, style ...). [logged in] — NO: Endre egenskaper på utvalget (veggtype, høyde, stil …).","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"props":{"additionalProperties":true,"type":"object","title":"Props"}}}},{"name":"transform_selection","cat":"inspeksjon","no":"Speil eller roter utvalget (høyreklikk ▸ Speil / Roter).","en":"Mirror or rotate the selection (right-click ▸ Mirror / Rotate).","method":"POST","path":"/sessions/{sid}/selection/transform","access":"login","effect":"write","py":"speil_roter(['<id>'], op='mirror', akse='x')  # eller op='rotate', akse='z', grader=90","status":"live","server":"web","level":"propose","description":"Mirror or rotate the selection (right-click ▸ Mirror / Rotate). [logged in] — NO: Speil eller roter utvalget (høyreklikk ▸ Speil / Roter).","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"op":{"type":"string","title":"Op","default":"mirror"},"axis":{"type":"string","title":"Axis","default":"x"},"degrees":{"type":"number","title":"Degrees","default":90.0}}}},{"name":"duplicate_selection","cat":"inspeksjon","no":"Kopier det valgte (vegger med dører/vinduer, grupper) dx/dy meter i plan; kopiene blir valgt (Ctrl+D / Ctrl+C, Ctrl+V).","en":"Copy the selection (walls with their doors/windows, groups) dx/dy metres in plan; the copies become the selection (Ctrl+D / Ctrl+C, Ctrl+V).","method":"POST","path":"/sessions/{sid}/selection/duplicate","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Copy the selection (walls with their doors/windows, groups) dx/dy metres in plan; the copies become the selection (Ctrl+D / Ctrl+C, Ctrl+V). [logged in] — NO: Kopier det valgte (vegger med dører/vinduer, grupper) dx/dy meter i plan; kopiene blir valgt (Ctrl+D / Ctrl+C, Ctrl+V).","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"dx":{"type":"number","title":"Dx","default":1.0},"dy":{"type":"number","title":"Dy","default":0.0},"source":{"type":"string","title":"Source","default":"selection"}}}},{"name":"copy_selection","cat":"inspeksjon","no":"Husk utvalget for innliming (Ctrl+C); duplicate_selection(source='clipboard') limer inn.","en":"Remember the selection for paste (Ctrl+C); duplicate_selection(source='clipboard') pastes.","method":"POST","path":"/sessions/{sid}/selection/copy","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Remember the selection for paste (Ctrl+C); duplicate_selection(source='clipboard') pastes. [logged in] — NO: Husk utvalget for innliming (Ctrl+C); duplicate_selection(source='clipboard') limer inn.","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"list_buildings","cat":"inspeksjon","no":"Bygninger i modellen.","en":"Buildings in the model.","method":"GET","path":"/sessions/{sid}/buildings","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Buildings in the model. [logged in] — NO: Bygninger i modellen.","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"select_building","cat":"inspeksjon","no":"Velg aktiv bygning.","en":"Pick the active building.","method":"POST","path":"/sessions/{sid}/building/select","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Pick the active building. [logged in] — NO: Velg aktiv bygning.","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"building_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Id"}}}},{"name":"render","cat":"se","no":"Bilde (PNG) av økta uten nettleser: view=iso|front|back|left|right|top|bottom, layers=a,b (bare disse), hide=lag/type/id, focus=<element-id|selection|x0,y0,z0,x1,y1,z1> (kommaseparert streng, ikke JSON-objekt), section=z:2.4, projection, w/h, side_by_side=<sid2>. isolate=<id|short_id|navn,…> tegner BARE de elementene (en dør med bladene sine, ingen vegg eller annen dør foran) og rammer inn det første: nærbilde av ett element. Se på modellen etter hver endring.","en":"A PNG of the session without a browser: view=iso|front|back|left|right|top|bottom, layers=a,b (only these), hide=layer/kind/id, focus=<element-id|selection|x0,y0,z0,x1,y1,z1> (comma-separated string, not a JSON object), section=z:2.4, projection, w/h, side_by_side=<sid2>. isolate=<id|short_id|name,...> draws ONLY those elements (a door with its leaves, no wall or other door in front) and frames the first: a close-up of one element. Look at the model after each change.","method":"GET","path":"/sessions/{sid}/render.png","access":"sandbox","effect":"read","mcp":"web","params":{"type":"object","properties":{"view":{"type":"string"},"cam":{"type":"string"},"proj":{"type":"string"},"zoom":{"type":"string"},"projection":{"type":"string"},"eye":{"type":"string"},"target":{"type":"string"},"fov":{"type":"number"},"w":{"type":"integer"},"h":{"type":"integer"},"layers":{"type":"string"},"hide":{"type":"string"},"focus":{"type":"string"},"isolate":{"type":"string"},"section":{"type":"string"},"side_by_side":{"type":"string"},"bg":{"type":"string"},"edges":{"type":"integer"},"aa":{"type":"string"},"sid":{"type":"string"}}},"example":{"view":"iso","hide":"SKP-import","focus":"13.5,-2.5,7.5,26,12,10.6","w":1200,"h":800},"status":"live","server":"web","returns":"image/png","level":"read","description":"A PNG of the session without a browser: view=iso|front|back|left|right|top|bottom, layers=a,b (only these), hide=layer/kind/id, focus=<element-id|selection|x0,y0,z0,x1,y1,z1> (comma-separated string, not a JSON object), section=z:2.4, projection, w/h, side_by_side=<sid2>. isolate=<id|short_id|name,...> draws ONLY those elements (a door with its leaves, no wall or other door in front) and frames the first: a close-up of one element. Look at the model after each change. [sandbox (anonymous) or logged in] — NO: Bilde (PNG) av økta uten nettleser: view=iso|front|back|left|right|top|bottom, layers=a,b (bare disse), hide=lag/type/id, focus=<element-id|selection|x0,y0,z0,x1,y1,z1> (kommaseparert streng, ikke JSON-objekt), section=z:2.4, projection, w/h, side_by_side=<sid2>. isolate=<id|short_id|navn,…> tegner BARE de elementene (en dør med bladene sine, ingen vegg eller annen dør foran) og rammer inn det første: nærbilde av ett element. Se på modellen etter hver endring.","category_label":"Se: bilde, kamera, sammenligning","input_schema":{"type":"object","properties":{"view":{"type":"string"},"cam":{"type":"string"},"proj":{"type":"string"},"zoom":{"type":"string"},"projection":{"type":"string"},"eye":{"type":"string"},"target":{"type":"string"},"fov":{"type":"number"},"w":{"type":"integer"},"h":{"type":"integer"},"layers":{"type":"string"},"hide":{"type":"string"},"focus":{"type":"string"},"isolate":{"type":"string"},"section":{"type":"string"},"side_by_side":{"type":"string"},"bg":{"type":"string"},"edges":{"type":"integer"},"aa":{"type":"string"},"sid":{"type":"string"}}}},{"name":"render_index","cat":"se","no":"Hva som er hvor i bildet render ville gitt (samme parametre): hvert element med piksler, senter og boks, og med at=x,y;x,y elementet under pikselen. Gjør «vinduet ved piksel (500,300)» om til en element-id. Sender ikke bildet.","en":"What is where in the picture render would give (same parameters): every element with pixels, centre and box, and with at=x,y;x,y the element under each pixel. Turns «the window at pixel (500,300)» into an element id. No image is sent.","method":"GET","path":"/sessions/{sid}/render.json","access":"sandbox","effect":"read","mcp":"web","params":{"type":"object","properties":{"view":{"type":"string"},"cam":{"type":"string"},"proj":{"type":"string"},"zoom":{"type":"string"},"projection":{"type":"string"},"eye":{"type":"string"},"target":{"type":"string"},"fov":{"type":"number"},"w":{"type":"integer"},"h":{"type":"integer"},"layers":{"type":"string"},"hide":{"type":"string"},"focus":{"type":"string"},"isolate":{"type":"string"},"section":{"type":"string"},"at":{"type":"string"},"limit":{"type":"integer"},"sid":{"type":"string"}}},"example":{"view":"front","at":"500,300;120,80"},"status":"live","server":"web","returns":"{elements[{id,kind,pixels,centroid,box}], at[]}","level":"read","description":"What is where in the picture render would give (same parameters): every element with pixels, centre and box, and with at=x,y;x,y the element under each pixel. Turns «the window at pixel (500,300)» into an element id. No image is sent. [sandbox (anonymous) or logged in] — NO: Hva som er hvor i bildet render ville gitt (samme parametre): hvert element med piksler, senter og boks, og med at=x,y;x,y elementet under pikselen. Gjør «vinduet ved piksel (500,300)» om til en element-id. Sender ikke bildet.","category_label":"Se: bilde, kamera, sammenligning","input_schema":{"type":"object","properties":{"view":{"type":"string"},"cam":{"type":"string"},"proj":{"type":"string"},"zoom":{"type":"string"},"projection":{"type":"string"},"eye":{"type":"string"},"target":{"type":"string"},"fov":{"type":"number"},"w":{"type":"integer"},"h":{"type":"integer"},"layers":{"type":"string"},"hide":{"type":"string"},"focus":{"type":"string"},"isolate":{"type":"string"},"section":{"type":"string"},"at":{"type":"string"},"limit":{"type":"integer"},"sid":{"type":"string"}}}},{"name":"geometry_rules","cat":"versjon","no":"Hvilke geometriregler modellen er lagret med mot dagens (vegg til tak o.l.): saved, now, older. En eldre modell bygges ikke om bak brukerens rygg; geometry_rules_update gjør det som ett angresteg.","en":"Which geometry rules the model was saved under against today's (wall to roof etc.): saved, now, older. An older model is not rebuilt behind the user's back; geometry_rules_update does it as one undo step.","method":"GET","path":"/sessions/{sid}/geometry/rules","access":"share","effect":"read","mcp":"web","status":"live","server":"web","returns":"{saved, now, older, banner}","level":"read","description":"Which geometry rules the model was saved under against today's (wall to roof etc.): saved, now, older. An older model is not rebuilt behind the user's back; geometry_rules_update does it as one undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Hvilke geometriregler modellen er lagret med mot dagens (vegg til tak o.l.): saved, now, older. En eldre modell bygges ikke om bak brukerens rygg; geometry_rules_update gjør det som ett angresteg.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"geometry_rules_update","cat":"versjon","no":"«Oppdater til dagens regler»: bygg vegger som følger tak/dekke på nytt med dagens regler og stempl modellen, ett angresteg. Svaret viser vegger over tak før/etter og hvilke veggtopper som flyttet seg. Spør brukeren først.","en":"«Update to today's rules»: rebuild the walls that follow roofs / slabs with today's rules and stamp the model, one undo step. The answer shows walls over the roof before / after and which wall tops moved. Ask the user first.","method":"POST","path":"/sessions/{sid}/geometry/update","access":"share","effect":"write","mcp":"web","status":"live","server":"web","returns":"{fra, til, vegger_over_tak_for, vegger_over_tak_etter, flyttet}","level":"propose","description":"«Update to today's rules»: rebuild the walls that follow roofs / slabs with today's rules and stamp the model, one undo step. The answer shows walls over the roof before / after and which wall tops moved. Ask the user first. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: «Oppdater til dagens regler»: bygg vegger som følger tak/dekke på nytt med dagens regler og stempl modellen, ett angresteg. Svaret viser vegger over tak før/etter og hvilke veggtopper som flyttet seg. Spør brukeren først.","category_label":"Versjoner og godkjenning","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"scene_summary","cat":"se","no":"Kompakt JSON om økta uten å bygge mesh: antall per type, boks per element, lag, etasjer, referansegrupper. Start her på store filer.","en":"Compact JSON about the session without building the mesh: counts per kind, box per element, layers, levels, reference groups. Start here on big files.","method":"GET","path":"/sessions/{sid}/scene-summary","access":"sandbox","effect":"read","mcp":"web","py":"scene_summary()","params":{"type":"object","properties":{"limit":{"type":"integer"},"bbox":{"type":"integer"},"sid":{"type":"string"}}},"example":{"limit":100},"status":"live","server":"web","returns":"{counts, bbox, groups[], layers[], levels[], references[]}","level":"read","description":"Compact JSON about the session without building the mesh: counts per kind, box per element, layers, levels, reference groups. Start here on big files. [sandbox (anonymous) or logged in] — NO: Kompakt JSON om økta uten å bygge mesh: antall per type, boks per element, lag, etasjer, referansegrupper. Start her på store filer.","category_label":"Se: bilde, kamera, sammenligning","input_schema":{"type":"object","properties":{"limit":{"type":"integer"},"bbox":{"type":"integer"},"sid":{"type":"string"}}}},{"name":"get_camera","cat":"se","no":"Agentens eget kamera (eye, target, projeksjon). Nettleserens kamera er klientens.","en":"The agent's own camera (eye, target, projection). The browser camera stays on the client.","method":"GET","path":"/sessions/{sid}/camera","access":"sandbox","effect":"read","status":"live","server":"web","level":"read","description":"The agent's own camera (eye, target, projection). The browser camera stays on the client. [sandbox (anonymous) or logged in] — NO: Agentens eget kamera (eye, target, projeksjon). Nettleserens kamera er klientens.","category_label":"Se: bilde, kamera, sammenligning","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"set_camera","cat":"se","no":"Sett agentens kamera: preset (iso/front/…) eller eye+target, projection, zoom_to=all|selection|<element-id>. Brukes av render uten view. Endrer ikke modellen.","en":"Set the agent camera: preset (iso/front/...) or eye+target, projection, zoom_to=all|selection|<element-id>. Used by render without view. Does not change the model.","method":"POST","path":"/sessions/{sid}/camera","access":"sandbox","effect":"read","mcp":"web","params":{"type":"object","properties":{"preset":{"type":"string"},"eye":{"type":"array","items":{"type":"number"}},"target":{"type":"array","items":{"type":"number"}},"projection":{"type":"string"},"fov_deg":{"type":"number"},"zoom_to":{"type":"string"},"margin":{"type":"number"},"zoom":{"type":"number"},"sid":{"type":"string"}}},"example":{"preset":"front","zoom_to":"all"},"status":"live","server":"web","level":"read","description":"Set the agent camera: preset (iso/front/...) or eye+target, projection, zoom_to=all|selection|<element-id>. Used by render without view. Does not change the model. [sandbox (anonymous) or logged in] — NO: Sett agentens kamera: preset (iso/front/…) eller eye+target, projection, zoom_to=all|selection|<element-id>. Brukes av render uten view. Endrer ikke modellen.","category_label":"Se: bilde, kamera, sammenligning","input_schema":{"type":"object","properties":{"preset":{"type":"string"},"eye":{"type":"array","items":{"type":"number"}},"target":{"type":"array","items":{"type":"number"}},"projection":{"type":"string"},"fov_deg":{"type":"number"},"zoom_to":{"type":"string"},"margin":{"type":"number"},"zoom":{"type":"number"},"sid":{"type":"string"}}}},{"name":"compare","cat":"se","no":"Sammenlign to økter (original og tolket): bbox, areal, volum, antall per type, og valgfritt ett bilde ved siden av hverandre.","en":"Compare two sessions (original and interpreted): bbox, area, volume, counts per kind, optionally one picture side by side.","method":"GET","path":"/sessions/{sid}/compare","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"with":{"type":"string"},"with_share":{"type":"string"},"include_reference":{"type":"integer"},"picture":{"type":"integer"},"view":{"type":"string"},"layers":{"type":"string"},"hide":{"type":"string"},"w":{"type":"integer"},"h":{"type":"integer"},"sid":{"type":"string"}},"required":["with"]},"example":{"with":"<annen sid>","picture":1},"status":"live","server":"web","level":"read","description":"Compare two sessions (original and interpreted): bbox, area, volume, counts per kind, optionally one picture side by side. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Sammenlign to økter (original og tolket): bbox, areal, volum, antall per type, og valgfritt ett bilde ved siden av hverandre.","category_label":"Se: bilde, kamera, sammenligning","input_schema":{"type":"object","properties":{"with":{"type":"string"},"with_share":{"type":"string"},"include_reference":{"type":"integer"},"picture":{"type":"integer"},"view":{"type":"string"},"layers":{"type":"string"},"hide":{"type":"string"},"w":{"type":"integer"},"h":{"type":"integer"},"sid":{"type":"string"}},"required":["with"]}},{"name":"set_layers","cat":"se","no":"Vis/skjul flere lag i ett kall: show=[…], hide=[…], only=[…] (alle andre av), all=true. Navn velges fra list_tags; ukjent navn gir 404 med «mente du …?»; et navn som slutter på * er et prefiks («Sist godkjent*» = alle underlagene fra godkjente tegninger). Endrer hva mennesket ser; for bare et bilde bruk render?layers=&hide=.","en":"Show/hide several layers in one call: show=[...], hide=[...], only=[...] (all others off), all=true. Names come from list_tags; an unknown name gives 404 with 'did you mean ...?'; a name ending in * is a prefix ('Sist godkjent*' = every underlay from approved drawings). Changes what the human sees; for a picture only use render?layers=&hide=.","method":"POST","path":"/sessions/{sid}/layers","access":"share","effect":"write","mcp":"web","py":"set_layers(hide=['Sist godkjent*'])","params":{"type":"object","properties":{"show":{"type":"array","items":{"type":"string"}},"hide":{"type":"array","items":{"type":"string"}},"only":{"type":"array","items":{"type":"string"}},"all":{"type":"boolean"},"sid":{"type":"string"}}},"example":{"only":["Wall","Roof"]},"status":"live","server":"web","level":"propose","description":"Show/hide several layers in one call: show=[...], hide=[...], only=[...] (all others off), all=true. Names come from list_tags; an unknown name gives 404 with 'did you mean ...?'; a name ending in * is a prefix ('Sist godkjent*' = every underlay from approved drawings). Changes what the human sees; for a picture only use render?layers=&hide=. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Vis/skjul flere lag i ett kall: show=[…], hide=[…], only=[…] (alle andre av), all=true. Navn velges fra list_tags; ukjent navn gir 404 med «mente du …?»; et navn som slutter på * er et prefiks («Sist godkjent*» = alle underlagene fra godkjente tegninger). Endrer hva mennesket ser; for bare et bilde bruk render?layers=&hide=.","category_label":"Se: bilde, kamera, sammenligning","input_schema":{"type":"object","properties":{"show":{"type":"array","items":{"type":"string"}},"hide":{"type":"array","items":{"type":"string"}},"only":{"type":"array","items":{"type":"string"}},"all":{"type":"boolean"},"sid":{"type":"string"}}}},{"name":"list_tags","cat":"se","no":"Merkelappene du kan VELGE mellom: etasjer (egen gruppe, med synlighet og antall) og lag/tagger. Bruk id/navn herfra i set_layers, set_selection_props (layer, tags, storey) og render?layers=; skriv aldri navn fra hukommelsen. Ukjente navn avvises med «mente du …?».","en":"The tags you CHOOSE from: storeys (own group, with visibility and count) and layers/tags. Use the id/name from here in set_layers, set_selection_props (layer, tags, storey) and render?layers=; never type a name from memory. Unknown names are refused with 'did you mean ...?'.","method":"GET","path":"/sessions/{sid}/tags","access":"share","effect":"read","mcp":"web","py":"list_tags()","params":{"type":"object","properties":{"sid":{"type":"string"}}},"status":"live","server":"web","returns":"{storeys:[{id,name,visible,elements}], layers:[{id,name,label,visible,locked,default,elements}], names[]}","level":"read","description":"The tags you CHOOSE from: storeys (own group, with visibility and count) and layers/tags. Use the id/name from here in set_layers, set_selection_props (layer, tags, storey) and render?layers=; never type a name from memory. Unknown names are refused with 'did you mean ...?'. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Merkelappene du kan VELGE mellom: etasjer (egen gruppe, med synlighet og antall) og lag/tagger. Bruk id/navn herfra i set_layers, set_selection_props (layer, tags, storey) og render?layers=; skriv aldri navn fra hukommelsen. Ukjente navn avvises med «mente du …?».","category_label":"Se: bilde, kamera, sammenligning","input_schema":{"type":"object","properties":{"sid":{"type":"string"}}}},{"name":"create_tag","cat":"se","no":"Ny merkelapp: den ene, eksplisitte veien til en ny tagg. Unike, normaliserte navn: «1.etasje» ved siden av «1. etasje» avvises (422 med did_you_mean). Nesten-likt navn krever confirm_similar=true.","en":"New tag: the one explicit way to make a tag. Unique, normalised names: '1.etasje' next to '1. etasje' is refused (422 with did_you_mean). A near duplicate needs confirm_similar=true.","method":"POST","path":"/sessions/{sid}/tags","access":"share","effect":"write","mcp":"web","py":"create_tag('Ringmur')","params":{"type":"object","properties":{"name":{"type":"string"},"confirm_similar":{"type":"boolean"},"sid":{"type":"string"}},"required":["name"]},"example":{"name":"Ny merkelapp"},"status":"live","server":"web","level":"propose","description":"New tag: the one explicit way to make a tag. Unique, normalised names: '1.etasje' next to '1. etasje' is refused (422 with did_you_mean). A near duplicate needs confirm_similar=true. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Ny merkelapp: den ene, eksplisitte veien til en ny tagg. Unike, normaliserte navn: «1.etasje» ved siden av «1. etasje» avvises (422 med did_you_mean). Nesten-likt navn krever confirm_similar=true.","category_label":"Se: bilde, kamera, sammenligning","input_schema":{"type":"object","properties":{"name":{"type":"string"},"confirm_similar":{"type":"boolean"},"sid":{"type":"string"}},"required":["name"]}},{"name":"session_status","cat":"se","no":"Status for økta: laster en stor fil (fase, fremdrift) eller klar; bruk etter opplasting av store igz/skp.","en":"Session status: loading a big file (phase, progress) or ready; use after uploading big igz/skp.","method":"GET","path":"/sessions/{sid}/status","access":"sandbox","effect":"read","mcp":"web","params":{"type":"object","properties":{"summary":{"type":"integer"},"sid":{"type":"string"}}},"status":"live","server":"web","returns":"{state, phase, progress, version, n_groups}","level":"read","description":"Session status: loading a big file (phase, progress) or ready; use after uploading big igz/skp. [sandbox (anonymous) or logged in] — NO: Status for økta: laster en stor fil (fase, fremdrift) eller klar; bruk etter opplasting av store igz/skp.","category_label":"Se: bilde, kamera, sammenligning","input_schema":{"type":"object","properties":{"summary":{"type":"integer"},"sid":{"type":"string"}}}},{"name":"draw_walls","cat":"vegg","no":"Tegn veggløp: corners=[[x,y],…] i meter; closed=true for en ring. wall_type for innervegg.","en":"Draw a wall path: corners=[[x,y],...] in metres; closed=true for a loop. wall_type for inner walls.","method":"POST","path":"/sessions/{sid}/agent/walls","access":"share","effect":"write","mcp":"web","py":"walls_closed([(0,0),(8,0),(8,6),(0,6)], height=2.65, thickness=0.25)","ops":["create_wall_path","walls_closed"],"example":{"corners":[[0,0],[8,0],[8,6],[0,6]],"closed":true,"height_m":2.65,"thickness_m":0.25},"status":"live","server":"web","level":"propose","description":"Draw a wall path: corners=[[x,y],...] in metres; closed=true for a loop. wall_type for inner walls. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Tegn veggløp: corners=[[x,y],…] i meter; closed=true for en ring. wall_type for innervegg.","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"corners":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","minItems":2,"title":"Corners"},"closed":{"type":"boolean","title":"Closed","default":false},"height_m":{"type":"number","title":"Height M","default":2.65},"thickness_m":{"type":"number","title":"Thickness M","default":0.25},"z0":{"type":"number","title":"Z0","default":0.0},"join_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Join Mode"},"alignment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alignment"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"to_roof":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"To Roof"}},"required":["corners"]}},{"name":"draw_rectangle","cat":"vegg","no":"Rektangulært fotavtrykk (vegger), valgfritt dekke og tak.","en":"Rectangular footprint (walls), optional slab and roof.","access":"share","effect":"write","mcp":"web","params":{"type":"object","properties":{"width_m":{"type":"number"},"depth_m":{"type":"number"},"x":{"type":"number"},"y":{"type":"number"},"height_m":{"type":"number"},"thickness_m":{"type":"number"},"z0":{"type":"number"},"add_slab":{"type":"boolean"},"add_roof":{"type":"boolean"},"sid":{"type":"string"}},"required":["width_m","depth_m"]},"example":{"width_m":8,"depth_m":6,"add_slab":true,"add_roof":true},"status":"live","server":"web","level":"propose","description":"Rectangular footprint (walls), optional slab and roof. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Rektangulært fotavtrykk (vegger), valgfritt dekke og tak.","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"width_m":{"type":"number"},"depth_m":{"type":"number"},"x":{"type":"number"},"y":{"type":"number"},"height_m":{"type":"number"},"thickness_m":{"type":"number"},"z0":{"type":"number"},"add_slab":{"type":"boolean"},"add_roof":{"type":"boolean"},"sid":{"type":"string"}},"required":["width_m","depth_m"]}},{"name":"create_wall","cat":"vegg","no":"Én vegg a→b (BuildChat). Bruk walls_closed for en ring.","en":"One wall a->b (BuildChat).","access":"login","effect":"read","py":"create_wall((0,0), (6,0))","ops":["create_wall"],"status":"live","server":"buildchat","description":"One wall a->b (BuildChat). [logged in] — NO: Én vegg a→b (BuildChat). Bruk walls_closed for en ring.","category_label":"Vegg (yttervegg)"},{"name":"wall_segment","cat":"vegg","no":"Én vegg a→b over vanlig økt-API (fallback når agent/* er stengt).","en":"One wall a->b over the plain session API (fallback when agent/* is closed).","method":"POST","path":"/sessions/{sid}/wall","access":"login","effect":"write","example":{"a":[0,0],"b":[6,0],"height_m":2.65},"status":"live","server":"web","level":"propose","description":"One wall a->b over the plain session API (fallback when agent/* is closed). [logged in] — NO: Én vegg a→b over vanlig økt-API (fallback når agent/* er stengt).","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"a":{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":2,"title":"A"},"b":{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":2,"title":"B"},"height_m":{"type":"number","title":"Height M","default":2.65},"thickness_m":{"type":"number","title":"Thickness M","default":0.25},"z0":{"type":"number","title":"Z0","default":0.0}},"required":["a","b"]}},{"name":"bim_wall","cat":"vegg","no":"Én BIM-vegg a→b.","en":"One BIM wall a->b.","method":"POST","path":"/sessions/{sid}/bim/wall","access":"login","effect":"write","example":{"a":[0,0],"b":[6,0]},"status":"live","server":"web","level":"propose","description":"One BIM wall a->b. [logged in] — NO: Én BIM-vegg a→b.","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"a":{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":2,"title":"A"},"b":{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":2,"title":"B"},"height_m":{"type":"number","title":"Height M","default":2.65},"thickness_m":{"type":"number","title":"Thickness M","default":0.25},"z0":{"type":"number","title":"Z0","default":0.0}},"required":["a","b"]}},{"name":"house","cat":"vegg","no":"Hel bygning fra form (rect, L, T, H, U …): vegger, dekke, tak, vinduer og dør.","en":"Whole building from a form (rect, L, T, H, U ...): walls, slab, roof, windows and door.","method":"POST","path":"/sessions/{sid}/house","access":"login","effect":"write","example":{"width":10,"depth":8,"form_type":"L"},"status":"live","server":"web","level":"propose","description":"Whole building from a form (rect, L, T, H, U ...): walls, slab, roof, windows and door. [logged in] — NO: Hel bygning fra form (rect, L, T, H, U …): vegger, dekke, tak, vinduer og dør.","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"width":{"type":"number","title":"Width","default":8.0},"depth":{"type":"number","title":"Depth","default":6.0},"height_m":{"type":"number","title":"Height M","default":2.65},"thickness_m":{"type":"number","title":"Thickness M","default":0.25},"form":{"type":"string","enum":["gable","hip","shed","flat"],"title":"Form","default":"gable"},"form_type":{"type":"string","enum":["rect","L","T","H","U_up","U_down","S_left","S_right","plus","step"],"title":"Form Type","default":"rect"},"wall_type":{"anyOf":[{"type":"string","enum":["ytter_198","ytter_250","ytter_300","inner_98"]},{"type":"null"}],"title":"Wall Type"},"roof_pitch_deg":{"type":"number","title":"Roof Pitch Deg","default":22.0},"overhang_m":{"type":"number","title":"Overhang M","default":0.4},"name":{"type":"string","title":"Name","default":"Building"},"to_roof":{"type":"boolean","title":"To Roof","default":true},"corner_boards":{"type":"boolean","title":"Corner Boards","default":false},"cladding":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cladding"},"wing_width_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wing Width M"},"wing_depth_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wing Depth M"},"slab_thickness_m":{"type":"number","title":"Slab Thickness M","default":0.2},"add_windows":{"type":"boolean","title":"Add Windows","default":true},"window_width_m":{"type":"number","title":"Window Width M","default":1.2},"window_height_m":{"type":"number","title":"Window Height M","default":1.2},"window_sill_m":{"type":"number","title":"Window Sill M","default":0.9},"add_door":{"type":"boolean","title":"Add Door","default":true},"door_width_m":{"type":"number","title":"Door Width M","default":0.9},"door_height_m":{"type":"number","title":"Door Height M","default":2.1},"add_default_roof":{"type":"boolean","title":"Add Default Roof","default":true},"boundary":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Boundary"},"roof_edge_roles":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Roof Edge Roles"},"roof_edge_slopes_deg":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Roof Edge Slopes Deg"},"roof_edge_abut":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Roof Edge Abut"},"ensure_standard":{"type":"boolean","title":"Ensure Standard","default":false}}}},{"name":"heal_problems","cat":"vegg","no":"Finn problemvegger og -tak og reparer dem (eller ett element med eid).","en":"Find problem walls and roofs and repair them (or one element with eid).","access":"share","effect":"write","mcp":"web","py":"heal_problems()","params":{"type":"object","properties":{"eid":{"type":"string"},"keep_miter":{"type":"boolean"},"limit":{"type":"integer"},"sid":{"type":"string"}}},"status":"live","server":"web","level":"propose","description":"Find problem walls and roofs and repair them (or one element with eid). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Finn problemvegger og -tak og reparer dem (eller ett element med eid).","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"eid":{"type":"string"},"keep_miter":{"type":"boolean"},"limit":{"type":"integer"},"sid":{"type":"string"}}}},{"name":"heal_wall","cat":"vegg","no":"Bygg én vegg på nytt fra sin payload (reparer skjøt).","en":"Rebuild one wall from its payload (heal join).","method":"POST","path":"/sessions/{sid}/agent/walls/{eid}/heal","access":"share","effect":"write","py":"heal_wall(eid)","ops":["heal_wall"],"status":"live","server":"web","level":"propose","description":"Rebuild one wall from its payload (heal join). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Bygg én vegg på nytt fra sin payload (reparer skjøt).","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"eid":{"type":"string","title":"Eid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"keep_miter":{"type":"boolean","title":"Keep Miter","default":false}},"required":["eid"]}},{"name":"heal_walls","cat":"vegg","no":"Lukk alle åpne vegger (ingen åpne kanter, også toppen når taket mangler eller er ødelagt). ids=[…] for bare noen. Ett angre-steg.","en":"Close every open wall (no open edges, the top too when the roof is gone or broken). ids=[...] for only some. One undo step.","method":"POST","path":"/sessions/{sid}/agent/walls/heal","access":"share","effect":"write","py":"heal_walls()","ops":["heal_walls"],"example":{"ids":[]},"status":"live","server":"web","level":"propose","description":"Close every open wall (no open edges, the top too when the roof is gone or broken). ids=[...] for only some. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Lukk alle åpne vegger (ingen åpne kanter, også toppen når taket mangler eller er ødelagt). ids=[…] for bare noen. Ett angre-steg.","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"ids":{"items":{"type":"string"},"type":"array","title":"Ids"}}}},{"name":"join_plan_walls","cat":"vegg","no":"Skjøt overlappende / T / L-vegger i plan (som UI).","en":"Join overlapping / T / L walls in plan.","access":"login","effect":"read","py":"join_plan_walls()","ops":["join_plan_walls"],"status":"live","server":"buildchat","description":"Join overlapping / T / L walls in plan. [logged in] — NO: Skjøt overlappende / T / L-vegger i plan (som UI).","category_label":"Vegg (yttervegg)"},{"name":"create_railing","cat":"dekke","no":"Parametrisk rekkverk langs en sti (liggende|spiler|glass|massiv), avkortes mot tak (BuildChat).","en":"Parametric railing along a path (liggende|spiler|glass|massiv), clipped against roofs (BuildChat).","access":"login","effect":"read","py":"create_railing([(0,0),(4,0)], z0=0, style='liggende', height=0.9)","ops":["create_railing"],"status":"live","server":"buildchat","description":"Parametric railing along a path (liggende|spiler|glass|massiv), clipped against roofs (BuildChat). [logged in] — NO: Parametrisk rekkverk langs en sti (liggende|spiler|glass|massiv), avkortes mot tak (BuildChat).","category_label":"Dekke og gulv"},{"name":"create_column","cat":"tak","no":"Søyle i (x, y); høyde utelatt = opp til bjelken eller takundersiden over (BuildChat).","en":"Column at (x, y); height omitted = up to the beam or roof underside above it (BuildChat).","access":"login","effect":"read","py":"create_column((3.0, 0.07), size=(0.14, 0.14))","ops":["create_column"],"status":"live","server":"buildchat","description":"Column at (x, y); height omitted = up to the beam or roof underside above it (BuildChat). [logged in] — NO: Søyle i (x, y); høyde utelatt = opp til bjelken eller takundersiden over (BuildChat).","category_label":"Tak, ark og takvindu"},{"name":"create_beam","cat":"tak","no":"Bjelke a→b; z0 utelatt = bærer taket: toppen mot sperrene, følger taket, søylene under følger (BuildChat).","en":"Beam a→b; z0 omitted = carries the roof: top at the rafters, follows the roof, the columns under it follow (BuildChat).","access":"login","effect":"read","py":"create_beam((0, 0.07), (6, 0.07), width_m=0.14, depth_m=0.36, name='Limtrebjelke GL30c 140x360')","ops":["create_beam"],"status":"live","server":"buildchat","description":"Beam a→b; z0 omitted = carries the roof: top at the rafters, follows the roof, the columns under it follow (BuildChat). [logged in] — NO: Bjelke a→b; z0 utelatt = bærer taket: toppen mot sperrene, følger taket, søylene under følger (BuildChat).","category_label":"Tak, ark og takvindu"},{"name":"create_chimney","cat":"tak","no":"Parametrisk skorstein (rect|round, seksjoner, røykløp, hatt) med topp over møne (BuildChat).","en":"Parametric chimney (rect|round, sections, flue, cap) with its top above the ridge (BuildChat).","access":"login","effect":"read","py":"create_chimney((2,1), shape='rect', size=(0.52,0.63), z0=0, z1=6, above_ridge_m=0.8)","ops":["create_chimney"],"status":"live","server":"buildchat","description":"Parametric chimney (rect|round, sections, flue, cap) with its top above the ridge (BuildChat). [logged in] — NO: Parametrisk skorstein (rect|round, seksjoner, røykløp, hatt) med topp over møne (BuildChat).","category_label":"Tak, ark og takvindu"},{"name":"set_cladding","cat":"vegg","no":"Parametrisk kledning på ytterveggene (motoren lager bordene).","en":"Parametric cladding on the exterior walls (the engine makes the boards).","access":"login","effect":"read","py":"set_cladding(type='liggende')","ops":["set_cladding"],"status":"live","server":"buildchat","description":"Parametric cladding on the exterior walls (the engine makes the boards). [logged in] — NO: Parametrisk kledning på ytterveggene (motoren lager bordene).","category_label":"Vegg (yttervegg)"},{"name":"define_spilevegg","cat":"vegg","no":"Veggtype «spilevegg»: åpent stenderverk (48x148 / 48x98, c/c) med åpne liggende spiler (bredde, tykkelse, luft, side).","en":"Wall type «spilevegg»: open stud frame (48x148 / 48x98, c/c) with open horizontal slats (width, thickness, air, side).","access":"login","effect":"read","py":"define_spilevegg(stud_h=0.148, stud_cc=0.6, slat_w=0.07, slat_t=0.028, gap=0.025, sides='outside')","ops":["define_spilevegg"],"status":"live","server":"buildchat","description":"Wall type «spilevegg»: open stud frame (48x148 / 48x98, c/c) with open horizontal slats (width, thickness, air, side). [logged in] — NO: Veggtype «spilevegg»: åpent stenderverk (48x148 / 48x98, c/c) med åpne liggende spiler (bredde, tykkelse, luft, side).","category_label":"Vegg (yttervegg)"},{"name":"set_cladding_sides","cat":"vegg","no":"Kledning/spiler per vegg: ute, inne eller begge sider (resten av stilen beholdes).","en":"Cladding / slats per wall: outside, inside or both faces (the rest of the style is kept).","access":"login","effect":"read","py":"set_cladding_sides('both', wall_ids=[...])","ops":["set_cladding_sides"],"status":"live","server":"buildchat","description":"Cladding / slats per wall: outside, inside or both faces (the rest of the style is kept). [logged in] — NO: Kledning/spiler per vegg: ute, inne eller begge sider (resten av stilen beholdes).","category_label":"Vegg (yttervegg)"},{"name":"corner_boards","cat":"vegg","no":"Hjørnekasser av/på.","en":"Corner boards on/off.","method":"POST","path":"/sessions/{sid}/facade/corner_boards","access":"login","effect":"write","py":"set_corner_boards(True)","ops":["set_corner_boards"],"status":"live","server":"web","level":"propose","description":"Corner boards on/off. [logged in] — NO: Hjørnekasser av/på.","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"on":{"type":"boolean","title":"On","default":true}}}},{"name":"walls_to_roof","cat":"vegg","no":"Yttervegger følger takets underside.","en":"Exterior walls follow the roof underside.","method":"POST","path":"/sessions/{sid}/walls/to_roof","access":"login","effect":"write","py":"set_walls_to_roof(True)","ops":["set_walls_to_roof"],"status":"live","server":"web","level":"propose","description":"Exterior walls follow the roof underside. [logged in] — NO: Yttervegger følger takets underside.","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"on":{"type":"boolean","title":"On","default":true}}}},{"name":"get_wall_types","cat":"vegg","no":"Veggtype-biblioteket (tykkelse, lag, bindingsverk).","en":"Wall type library (thickness, layers, framing).","method":"GET","path":"/sessions/{sid}/wall-types","access":"login","effect":"read","py":"list_wall_types()","ops":["list_wall_types"],"status":"live","server":"web","level":"read","description":"Wall type library (thickness, layers, framing). [logged in] — NO: Veggtype-biblioteket (tykkelse, lag, bindingsverk).","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"set_wall_types","cat":"vegg","no":"Erstatt veggtype-biblioteket; vegger av endret type følger.","en":"Replace the wall type library; walls of a changed type follow.","method":"PUT","path":"/sessions/{sid}/wall-types","access":"login","effect":"write","py":"set_wall_types([...])","ops":["set_wall_types"],"status":"live","server":"web","level":"propose","description":"Replace the wall type library; walls of a changed type follow. [logged in] — NO: Erstatt veggtype-biblioteket; vegger av endret type følger.","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"wall_types":{"items":{},"type":"array","title":"Wall Types"}}}},{"name":"rebuild_entity","cat":"vegg","no":"Bygg ett element på nytt med endrede payload-felt (veggtype, takform, dørstil …).","en":"Rebuild one element with changed payload fields (wall type, roof form, door style ...).","method":"POST","path":"/sessions/{sid}/agent/entities/{eid}/rebuild","access":"share","effect":"write","mcp":"web","py":"rebuild_element(eid, {'wall_type': 'inner_98'})","ops":["rebuild_element"],"example":{"updates":{"wall_type":"inner_98"}},"status":"live","server":"web","level":"propose","description":"Rebuild one element with changed payload fields (wall type, roof form, door style ...). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Bygg ett element på nytt med endrede payload-felt (veggtype, takform, dørstil …).","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"eid":{"type":"string","title":"Eid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"updates":{"additionalProperties":true,"type":"object","title":"Updates"}},"required":["eid"]}},{"name":"list_rooms","cat":"rom","no":"Rom i modellen: id, navn, nummer, areal, etasje, farge.","en":"Rooms in the model: id, name, number, area, storey, colour.","method":"GET","path":"/sessions/{sid}/agent/rooms","access":"share","effect":"read","mcp":"web","py":"list_rooms()","ops":["list_rooms"],"status":"live","server":"web","level":"read","description":"Rooms in the model: id, name, number, area, storey, colour. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Rom i modellen: id, navn, nummer, areal, etasje, farge.","category_label":"Rom og areal","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"edit_room","cat":"rom","no":"Gi ett eller flere rom navn (fra romlisten: Stue, Soverom …), nummer (unikt per etasje), farge eller bruksenhet; én angre.","en":"Name one or more rooms (from the room list: Stue, Soverom ...), set number (unique per storey), colour or unit; one undo.","method":"POST","path":"/sessions/{sid}/agent/rooms/edit","access":"share","effect":"write","mcp":"web","py":"edit_room(['<id>'], name='Stue')","ops":["edit_room","rename_room"],"example":{"ids":["<id>"],"name":"Stue"},"status":"live","server":"web","level":"propose","description":"Name one or more rooms (from the room list: Stue, Soverom ...), set number (unique per storey), colour or unit; one undo. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Gi ett eller flere rom navn (fra romlisten: Stue, Soverom …), nummer (unikt per etasje), farge eller bruksenhet; én angre.","category_label":"Rom og areal","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"ids":{"items":{"type":"string"},"type":"array","title":"Ids"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"auto":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"}}}},{"name":"rebuild_rooms","cat":"rom","no":"Legg rom (alle, eller ids) på veggflatene rundt dem etter at en vegg fikk ny tykkelse eller plass. Id, navn, nummer, enhet og farge beholdes; rom som ikke er lukket av vegger står urørt og svaret sier hvorfor (reason + missing: vegg-id-er, glipp i cm, sted). Skjøter som glipper opptil 12 cm lukkes (2/6/12 cm, som detect_rooms). Ett angre-steg. Rom følger også av seg selv når tykkelsen endres (opptil 0,3 m).","en":"Put rooms (all, or ids) on the wall faces round them after a wall changed thickness or place. Id, name, number, unit and colour stay; a room not enclosed by walls is left alone and the reply says why (reason + missing: wall ids, gap in cm, place). Joints that miss by up to 12 cm are closed (2/6/12 cm, as detect_rooms). One undo step. Rooms also follow by themselves when the thickness changes (up to 0.3 m).","method":"POST","path":"/sessions/{sid}/agent/rooms/rebuild","access":"share","effect":"write","mcp":"web","py":"rebuild_rooms(['<id>'])","ops":["rebuild_rooms"],"example":{"ids":["<id>"],"force":false},"status":"live","server":"web","level":"propose","description":"Put rooms (all, or ids) on the wall faces round them after a wall changed thickness or place. Id, name, number, unit and colour stay; a room not enclosed by walls is left alone and the reply says why (reason + missing: wall ids, gap in cm, place). Joints that miss by up to 12 cm are closed (2/6/12 cm, as detect_rooms). One undo step. Rooms also follow by themselves when the thickness changes (up to 0.3 m). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Legg rom (alle, eller ids) på veggflatene rundt dem etter at en vegg fikk ny tykkelse eller plass. Id, navn, nummer, enhet og farge beholdes; rom som ikke er lukket av vegger står urørt og svaret sier hvorfor (reason + missing: vegg-id-er, glipp i cm, sted). Skjøter som glipper opptil 12 cm lukkes (2/6/12 cm, som detect_rooms). Ett angre-steg. Rom følger også av seg selv når tykkelsen endres (opptil 0,3 m).","category_label":"Rom og areal","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"ids":{"items":{"type":"string"},"type":"array","title":"Ids"},"force":{"type":"boolean","title":"Force","default":false},"max_move_m":{"type":"number","maximum":5.0,"minimum":0.0,"title":"Max Move M","default":0.5}}}},{"name":"set_terrace_shed","cat":"rom","no":"Gjør et rom (og veggene som bare omslutter det) til terrasse-bod: lett rom på en terrasse utenfor bygningskroppen, uten BRA, BTA og BYA (står under utebygg i measure_areas). on=false angrer. Ett angre-steg.","en":"Make a room (and the walls that enclose only it) a terrace shed: a light room on a terrace outside the building body, with no BRA, BTA or BYA (listed under utebygg in measure_areas). on=false undoes it. One undo step.","method":"POST","path":"/sessions/{sid}/agent/rooms/{eid}/terrace_shed","access":"share","effect":"write","mcp":"web","py":"set_terrace_shed('<room id>')","ops":["set_terrace_shed"],"example":{"on":true},"status":"live","server":"web","level":"propose","description":"Make a room (and the walls that enclose only it) a terrace shed: a light room on a terrace outside the building body, with no BRA, BTA or BYA (listed under utebygg in measure_areas). on=false undoes it. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Gjør et rom (og veggene som bare omslutter det) til terrasse-bod: lett rom på en terrasse utenfor bygningskroppen, uten BRA, BTA og BYA (står under utebygg i measure_areas). on=false angrer. Ett angre-steg.","category_label":"Rom og areal","input_schema":{"type":"object","properties":{"eid":{"type":"string","title":"Eid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"on":{"type":"boolean","title":"On","default":true},"wall_ids":{"items":{"type":"string"},"type":"array","title":"Wall Ids"}},"required":["eid"]}},{"name":"fit_slab_to_walls","cat":"dekke","no":"Legg omrisset til et dekke (terrassedekke) på ytterflatene til vegger (wall_ids; tomt = terrasse-bod-veggene ved dekket) pluss margin_m, behold id. follow (standard): dekket følger veggene når de flyttes eller får ny tykkelse. slab_type=terrasse + thickness_m 0,10-0,20 gjør det til lett terrassedekke. Danner veggene bare en åpen U (fjerde side er bygningsveggen), lukkes omrisset over åpningen og svaret har warnings + suggest_wall_id (veggen å legge til); faller arealet mer enn 50 % nektes det uten force=true. Ett angre-steg.","en":"Lay a slab's (terrace deck's) outline on the outer faces of walls (wall_ids; empty = the terrace-shed walls next to the slab) plus margin_m, keep id. follow (default): the slab follows the walls when they move or change thickness. slab_type=terrasse + thickness_m 0.10-0.20 makes it a light terrace deck. Walls that only form an open U (fourth side is the building wall) are closed over the mouth and the reply has warnings + suggest_wall_id (the wall to add); an area drop of more than 50 % is refused unless force=true. One undo step.","method":"POST","path":"/sessions/{sid}/agent/slabs/{eid}/fit","access":"share","effect":"write","mcp":"web","py":"fit_slab_to_walls('<slab id>', ['<wall id>'], slab_type='terrasse', thickness_m=0.15)","ops":["fit_slab_to_walls"],"example":{"wall_ids":["<wall id>"],"slab_type":"terrasse","thickness_m":0.15},"status":"live","server":"web","level":"propose","description":"Lay a slab's (terrace deck's) outline on the outer faces of walls (wall_ids; empty = the terrace-shed walls next to the slab) plus margin_m, keep id. follow (default): the slab follows the walls when they move or change thickness. slab_type=terrasse + thickness_m 0.10-0.20 makes it a light terrace deck. Walls that only form an open U (fourth side is the building wall) are closed over the mouth and the reply has warnings + suggest_wall_id (the wall to add); an area drop of more than 50 % is refused unless force=true. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Legg omrisset til et dekke (terrassedekke) på ytterflatene til vegger (wall_ids; tomt = terrasse-bod-veggene ved dekket) pluss margin_m, behold id. follow (standard): dekket følger veggene når de flyttes eller får ny tykkelse. slab_type=terrasse + thickness_m 0,10-0,20 gjør det til lett terrassedekke. Danner veggene bare en åpen U (fjerde side er bygningsveggen), lukkes omrisset over åpningen og svaret har warnings + suggest_wall_id (veggen å legge til); faller arealet mer enn 50 % nektes det uten force=true. Ett angre-steg.","category_label":"Dekke og gulv","input_schema":{"type":"object","properties":{"eid":{"type":"string","title":"Eid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"wall_ids":{"items":{"type":"string"},"type":"array","title":"Wall Ids"},"margin_m":{"type":"number","maximum":3.0,"minimum":-1.0,"title":"Margin M","default":0.0},"follow":{"type":"boolean","title":"Follow","default":true},"slab_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slab Type"},"thickness_m":{"anyOf":[{"type":"number","maximum":1.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Thickness M"},"force":{"type":"boolean","title":"Force","default":false}},"required":["eid"]}},{"name":"delete_entities","cat":"vegg","no":"Slett elementer etter id (åpninger lukker hullet).","en":"Delete elements by id (openings heal the wall).","method":"POST","path":"/sessions/{sid}/agent/delete","access":"share","effect":"write","mcp":"web","py":"delete_ids(['<id>'])","ops":["delete_ids"],"example":{"ids":["<id>"]},"status":"live","server":"web","level":"propose","description":"Delete elements by id (openings heal the wall). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Slett elementer etter id (åpninger lukker hullet).","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Ids"},"add":{"type":"boolean","title":"Add","default":false}},"required":["ids"]}},{"name":"clear_model","cat":"vegg","no":"Slett alle BIM-elementer (for test/reset).","en":"Delete every BIM element (test reset).","method":"POST","path":"/sessions/{sid}/agent/clear","access":"share","effect":"write","mcp":"web","status":"live","server":"web","level":"propose","description":"Delete every BIM element (test reset). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Slett alle BIM-elementer (for test/reset).","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"batch","cat":"vegg","no":"Flere operasjoner i én forespørsel: walls, slab, roof, house, terrain, delete, clear …","en":"Several operations in one request: walls, slab, roof, house, terrain, delete, clear ...","method":"POST","path":"/sessions/{sid}/agent/batch","access":"share","effect":"write","mcp":"web","example":{"ops":[{"op":"walls","corners":[[0,0],[8,0],[8,6],[0,6]],"closed":true},{"op":"roof_from_walls"}]},"status":"live","server":"web","level":"propose","description":"Several operations in one request: walls, slab, roof, house, terrain, delete, clear ... [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Flere operasjoner i én forespørsel: walls, slab, roof, house, terrain, delete, clear …","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"ops":{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":100,"minItems":1,"title":"Ops"},"stop_on_error":{"type":"boolean","title":"Stop On Error","default":true}},"required":["ops"]}},{"name":"draw_inner_wall","cat":"innervegg","no":"Innervegg: draw_walls med wall_type='inner_98' (eller annen innerveggtype), closed=false.","en":"Inner wall: draw_walls with wall_type='inner_98' (or another inner type), closed=false.","method":"POST","path":"/sessions/{sid}/agent/walls","access":"share","effect":"write","py":"create_wall((3,0), (3,6), wall_type='inner_98')","example":{"corners":[[3,0],[3,6]],"closed":false,"thickness_m":0.098,"wall_type":"inner_98"},"status":"live","server":"web","level":"propose","description":"Inner wall: draw_walls with wall_type='inner_98' (or another inner type), closed=false. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Innervegg: draw_walls med wall_type='inner_98' (eller annen innerveggtype), closed=false.","category_label":"Innervegg","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"corners":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","minItems":2,"title":"Corners"},"closed":{"type":"boolean","title":"Closed","default":false},"height_m":{"type":"number","title":"Height M","default":2.65},"thickness_m":{"type":"number","title":"Thickness M","default":0.25},"z0":{"type":"number","title":"Z0","default":0.0},"join_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Join Mode"},"alignment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alignment"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"to_roof":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"To Roof"}},"required":["corners"]}},{"name":"place_opening","cat":"apning","no":"Dør/vindu/port i vegg host_id: offset_m langs veggen, width_m, height_m, sill_m. Rundt vindu: shape='circle' (width_m = diameter); rundbue: shape='arch' (arch_rise_m = stikk, standard halvsirkel). Trekant-/gavlvindu: outer_loop_uv=[[u,z],...] (z absolutt).","en":"Door/window/gate in wall host_id: offset_m along the wall, width_m, height_m, sill_m. Round window: shape='circle' (width_m = diameter); arched: shape='arch' (arch_rise_m = rise, default semicircle). Triangle/gable window: outer_loop_uv=[[u,z],...] (absolute z).","method":"POST","path":"/sessions/{sid}/agent/openings","access":"share","effect":"write","mcp":"web","py":"place_opening(host_id, kind='window', offset_m=2.0, width_m=1.2, height_m=1.2, sill_m=0.9)","ops":["place_opening"],"example":{"host_id":"<wall id>","kind":"window","offset_m":2.0,"width_m":1.2,"height_m":1.2,"sill_m":0.9},"status":"live","server":"web","level":"propose","description":"Door/window/gate in wall host_id: offset_m along the wall, width_m, height_m, sill_m. Round window: shape='circle' (width_m = diameter); arched: shape='arch' (arch_rise_m = rise, default semicircle). Triangle/gable window: outer_loop_uv=[[u,z],...] (absolute z). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Dør/vindu/port i vegg host_id: offset_m langs veggen, width_m, height_m, sill_m. Rundt vindu: shape='circle' (width_m = diameter); rundbue: shape='arch' (arch_rise_m = stikk, standard halvsirkel). Trekant-/gavlvindu: outer_loop_uv=[[u,z],...] (z absolutt).","category_label":"Åpning (dør/vindu/port)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"host_id":{"type":"string","title":"Host Id"},"kind":{"type":"string","pattern":"^(door|window|gate|opening|void)$","title":"Kind","default":"window"},"offset_m":{"anyOf":[{"type":"number","maximum":200.0,"minimum":0.0},{"type":"null"}],"title":"Offset M"},"width_m":{"anyOf":[{"type":"number","maximum":20.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Width M"},"height_m":{"anyOf":[{"type":"number","maximum":20.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Height M"},"sill_m":{"anyOf":[{"type":"number","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Sill M"},"hinge":{"type":"string","pattern":"^(left|right)$","title":"Hinge","default":"right"},"style":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Style"},"outer_loop_uv":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":64,"minItems":3},{"type":"null"}],"title":"Outer Loop Uv"},"frame_width_m":{"anyOf":[{"type":"number","maximum":0.5,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Frame Width M"},"shape":{"anyOf":[{"type":"string","pattern":"^(rect|circle|arch)$"},{"type":"null"}],"title":"Shape"},"arch_rise_m":{"anyOf":[{"type":"number","maximum":10.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Arch Rise M"}},"required":["host_id"]}},{"name":"face_opening","cat":"apning","no":"Dør/vindu/åpning i valgt flate.","en":"Door/window/opening in the selected face.","method":"POST","path":"/sessions/{sid}/selection/face-opening","access":"login","effect":"write","example":{"kind":"door"},"status":"live","server":"web","level":"propose","description":"Door/window/opening in the selected face. [logged in] — NO: Dør/vindu/åpning i valgt flate.","category_label":"Åpning (dør/vindu/port)","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"kind":{"type":"string","title":"Kind","default":"window"}}}},{"name":"delete_openings","cat":"apning","no":"Slett valgte åpninger og lukk hullet.","en":"Delete selected openings and heal the hole.","method":"POST","path":"/sessions/{sid}/selection/delete-openings","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Delete selected openings and heal the hole. [logged in] — NO: Slett valgte åpninger og lukk hullet.","category_label":"Åpning (dør/vindu/port)","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"add_slab","cat":"dekke","no":"Dekke/gulv fra en ring boundary=[[x,y],…] (eller fra veggene).","en":"Slab/floor from a ring boundary=[[x,y],...] (or from the walls).","method":"POST","path":"/sessions/{sid}/slab","access":"login","effect":"write","mcp":"web","py":"create_slab([(0,0),(8,0),(8,6),(0,6)])","ops":["create_slab"],"example":{"boundary":[[0,0],[8,0],[8,6],[0,6]],"thickness_m":0.2,"z_top":0},"status":"live","server":"web","level":"propose","description":"Slab/floor from a ring boundary=[[x,y],...] (or from the walls). [logged in] — NO: Dekke/gulv fra en ring boundary=[[x,y],…] (eller fra veggene).","category_label":"Dekke og gulv","input_schema":{"type":"object","properties":{"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Boundary"},"origin":{"items":{"type":"number"},"type":"array","title":"Origin"},"size":{"items":{"type":"number"},"type":"array","title":"Size"},"thickness_m":{"type":"number","title":"Thickness M","default":0.2},"z_top":{"type":"number","title":"Z Top","default":0.0},"name":{"type":"string","title":"Name","default":"Slab"}}}},{"name":"slab_from_walls","cat":"dekke","no":"Dekke på yttervegg-ringen: kind='sole' (såle under veggene, topp = veggenes z0) eller 'floor' (etasjeskille på veggtoppene, veggene under følger undersiden). Følger veggene når de flyttes. Neste etasje bygges ikke: next_storey_z0 sier hvor den starter. Ett angre-steg.","en":"Slab on the exterior wall ring: kind='sole' (under the walls, top = their base) or 'floor' (on the wall tops, the walls under it follow its underside). Follows the walls when they move. The next storey is not built: next_storey_z0 says where it starts. One undo step.","method":"POST","path":"/sessions/{sid}/slab_from_walls","access":"login","effect":"write","mcp":"web","py":"create_slab_from_walls('sole')","ops":["create_slab_from_walls"],"example":{"kind":"sole"},"status":"live","server":"web","level":"propose","description":"Slab on the exterior wall ring: kind='sole' (under the walls, top = their base) or 'floor' (on the wall tops, the walls under it follow its underside). Follows the walls when they move. The next storey is not built: next_storey_z0 says where it starts. One undo step. [logged in] — NO: Dekke på yttervegg-ringen: kind='sole' (såle under veggene, topp = veggenes z0) eller 'floor' (etasjeskille på veggtoppene, veggene under følger undersiden). Følger veggene når de flyttes. Neste etasje bygges ikke: next_storey_z0 sier hvor den starter. Ett angre-steg.","category_label":"Dekke og gulv","input_schema":{"type":"object","properties":{"kind":{"type":"string","enum":["sole","floor"],"title":"Kind","default":"sole"},"thickness_m":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.02},{"type":"null"}],"title":"Thickness M"},"wall_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Wall Ids"},"z0":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Z0"}}}},{"name":"slab_from_walls_status","cat":"dekke","no":"Lukkede veggringer per etasje: har de såle / etasjeskille, og hva «Dekke» foreslår.","en":"Closed wall rings per storey: do they have a sole / a floor, and what «Slab» suggests.","method":"GET","path":"/sessions/{sid}/slab_from_walls","access":"login","effect":"read","mcp":"web","status":"live","server":"web","level":"read","description":"Closed wall rings per storey: do they have a sole / a floor, and what «Slab» suggests. [logged in] — NO: Lukkede veggringer per etasje: har de såle / etasjeskille, og hva «Dekke» foreslår.","category_label":"Dekke og gulv","input_schema":{"type":"object","properties":{}}},{"name":"heal_slab","cat":"dekke","no":"Legg et dekke fra vegger tilbake på veggene: omriss på ringen, høyde på veggene, veggene under et etasjeskille følger det. Helse før/etter. Ett angre-steg.","en":"Put a slab laid on a wall ring back on its walls: outline on the ring, height on the walls, the walls under a floor follow it. Health before/after. One undo step.","method":"POST","path":"/sessions/{sid}/agent/slabs/{eid}/heal","access":"share","effect":"write","mcp":"web","py":"heal_slab(eid)","ops":["heal_slab"],"status":"live","server":"web","level":"propose","description":"Put a slab laid on a wall ring back on its walls: outline on the ring, height on the walls, the walls under a floor follow it. Health before/after. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Legg et dekke fra vegger tilbake på veggene: omriss på ringen, høyde på veggene, veggene under et etasjeskille følger det. Helse før/etter. Ett angre-steg.","category_label":"Dekke og gulv","input_schema":{"type":"object","properties":{"eid":{"type":"string","title":"Eid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["eid"]}},{"name":"set_slab_boundary","cat":"dekke","no":"Endre omrisset til et dekke (beholder id).","en":"Change a slab's outline (keeps id).","access":"login","effect":"read","py":"set_slab_boundary(slab_id, [(0,0),(8,0),(8,6),(0,6)])","ops":["set_slab_boundary"],"status":"live","server":"buildchat","description":"Change a slab's outline (keeps id). [logged in] — NO: Endre omrisset til et dekke (beholder id).","category_label":"Dekke og gulv"},{"name":"add_roof","cat":"tak","no":"Tak over ytterveggene: form gable|hip|shed|flat.","en":"Roof over the exterior walls: form gable|hip|shed|flat.","method":"POST","path":"/sessions/{sid}/roof_from_walls","access":"login","effect":"write","mcp":"web","py":"create_roof_from_walls(form='gable', slope_deg=30)","ops":["create_roof_from_walls"],"example":{"form":"gable"},"status":"live","server":"web","level":"propose","description":"Roof over the exterior walls: form gable|hip|shed|flat. [logged in] — NO: Tak over ytterveggene: form gable|hip|shed|flat.","category_label":"Tak, ark og takvindu","input_schema":{"type":"object","properties":{"form":{"type":"string","enum":["gable","hip","shed","flat"],"title":"Form","default":"gable"}}}},{"name":"heal_roof","cat":"tak","no":"Reparer et tak og veggene under: omriss på veggene, saltak pr fløy, gavlvegger opp til taket, veggtopper. Helse før/etter. Ett angre-steg.","en":"Repair a roof and the walls under it: outline on the walls, saltak per wing, gable walls up to the roof, wall tops. Health before/after. One undo step.","method":"POST","path":"/sessions/{sid}/agent/roofs/{eid}/heal","access":"share","effect":"write","mcp":"web","py":"heal_roof(eid)","ops":["heal_roof"],"status":"live","server":"web","level":"propose","description":"Repair a roof and the walls under it: outline on the walls, saltak per wing, gable walls up to the roof, wall tops. Health before/after. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Reparer et tak og veggene under: omriss på veggene, saltak pr fløy, gavlvegger opp til taket, veggtopper. Helse før/etter. Ett angre-steg.","category_label":"Tak, ark og takvindu","input_schema":{"type":"object","properties":{"eid":{"type":"string","title":"Eid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["eid"]}},{"name":"join_roofs_as_t","cat":"tak","no":"Slå sammen to tak til ett T-tak med kehl (samme som leveringssjekk tak.sammenfoying). Største fotavtrykk = hovedtak. Ett angre-steg.","en":"Join two roofs into one T-roof with valleys (delivery check tak.sammenfoying). Larger plan footprint = main roof. One undo step.","method":"POST","path":"/sessions/{sid}/agent/roofs/join_t","access":"share","effect":"write","mcp":"web","py":"join_roofs_as_t(main_id, wing_id)","ops":["join_roofs_as_t"],"example":{"main_id":"<roof-id>","wing_id":"<roof-id>"},"status":"live","server":"web","level":"propose","description":"Join two roofs into one T-roof with valleys (delivery check tak.sammenfoying). Larger plan footprint = main roof. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Slå sammen to tak til ett T-tak med kehl (samme som leveringssjekk tak.sammenfoying). Største fotavtrykk = hovedtak. Ett angre-steg.","category_label":"Tak, ark og takvindu","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"main_id":{"type":"string","title":"Main Id"},"wing_id":{"type":"string","title":"Wing Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","default":"Tak (T-tak)"}},"required":["main_id","wing_id"]}},{"name":"list_roof_finishes","cat":"tak","no":"Lovlige verdier for taktekking og tilbehør: tekketyper med farger, vindski/renne/nedløp-brytere, trimfarger, og hvert taks nåværende finish. Gjett aldri nøkler.","en":"Allowed roof covering types with colours, trim switches (vindski, gutter, downpipes ...), trim colours and each roof's current finish. Never guess keys.","method":"GET","path":"/sessions/{sid}/agent/roofs/finishes","access":"share","effect":"read","mcp":"web","py":"list_roof_finishes()","ops":["list_roof_finishes"],"status":"live","server":"web","level":"read","description":"Allowed roof covering types with colours, trim switches (vindski, gutter, downpipes ...), trim colours and each roof's current finish. Never guess keys. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Lovlige verdier for taktekking og tilbehør: tekketyper med farger, vindski/renne/nedløp-brytere, trimfarger, og hvert taks nåværende finish. Gjett aldri nøkler.","category_label":"Tak, ark og takvindu","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"set_roof_finish","cat":"tak","no":"Takshingel/takstein/falset, farge, vindski, takrenne, nedløp, israft, snøfanger på ett eller alle tak i ETT kall (samme vei som Tak-dialogen, ett angresteg). Bruk denne for «takshingel», «sort takstein», «vindski og takrenner»; ikke utforsk payload. downpipe_ends = nedløpets ende: samme|syd|nord|ost|vest|start|slutt|begge|ingen|auto, eller per langside {\"vest\": \"syd\"} («nedløp mot syd på begge sider» = downpipe_ends=\"syd\").","en":"Roof covering (shingle/tile/standing seam), colour, vindski, gutter, downpipes, israft, snow guard on one or all roofs in ONE call (same rebuild as the roof dialog, one undo step). roof_id omitted = all roofs. downpipe_ends = which end of each eave gets the downpipe: samme|syd|nord|ost|vest|start|slutt|begge|ingen|auto, or per eave side {\"vest\": \"syd\", \"ost\": \"syd\"}.","method":"POST","path":"/sessions/{sid}/agent/roofs/finish","access":"share","effect":"write","mcp":"web","py":"set_roof_finish(covering_type='shingel_rett', color='Sort', vindski=True, gutter=True, downpipes=True)","ops":["set_roof_finish"],"params":{"type":"object","properties":{"roof_id":{"type":"string"},"covering_type":{"type":"string"},"color":{"type":"string"},"vindski":{"type":"boolean"},"gutter":{"type":"boolean"},"downpipes":{"type":"boolean"},"israft":{"type":"boolean"},"snofanger":{"type":"boolean"},"accent":{"type":"boolean"},"trim_color":{"type":"string"},"gutter_color":{"type":"string"},"downpipe_ends":{"type":["string","object"]},"sid":{"type":"string"}}},"example":{"covering_type":"shingel_rett","color":"Sort","vindski":true,"gutter":true,"downpipes":true},"status":"live","server":"web","level":"propose","description":"Roof covering (shingle/tile/standing seam), colour, vindski, gutter, downpipes, israft, snow guard on one or all roofs in ONE call (same rebuild as the roof dialog, one undo step). roof_id omitted = all roofs. downpipe_ends = which end of each eave gets the downpipe: samme|syd|nord|ost|vest|start|slutt|begge|ingen|auto, or per eave side {\"vest\": \"syd\", \"ost\": \"syd\"}. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Takshingel/takstein/falset, farge, vindski, takrenne, nedløp, israft, snøfanger på ett eller alle tak i ETT kall (samme vei som Tak-dialogen, ett angresteg). Bruk denne for «takshingel», «sort takstein», «vindski og takrenner»; ikke utforsk payload. downpipe_ends = nedløpets ende: samme|syd|nord|ost|vest|start|slutt|begge|ingen|auto, eller per langside {\"vest\": \"syd\"} («nedløp mot syd på begge sider» = downpipe_ends=\"syd\").","category_label":"Tak, ark og takvindu","input_schema":{"type":"object","properties":{"roof_id":{"type":"string"},"covering_type":{"type":"string"},"color":{"type":"string"},"vindski":{"type":"boolean"},"gutter":{"type":"boolean"},"downpipes":{"type":"boolean"},"israft":{"type":"boolean"},"snofanger":{"type":"boolean"},"accent":{"type":"boolean"},"trim_color":{"type":"string"},"gutter_color":{"type":"string"},"downpipe_ends":{"type":["string","object"]},"sid":{"type":"string"}}}},{"name":"set_storeys","cat":"vegg","no":"Lag/endre etasjer (navn, z, h) og knytt elementene til dem (alle, id-liste, eller etter høyde), kjør etasjemerking og revisjon, ett angresteg. Bruk når leveringssjekken sier «etg.uplassert» eller modellen mangler etasjer. Uten storeys lages én «1. etg» fra modellens høyde.","en":"Create/change storeys (name, z, h) and put the elements in them (all, an id list, or by height), run the storey tags and the audit, one undo step. Use when the delivery check says «etg.uplassert» or the model has no storeys. Without storeys one «1. etg» is made from the model height.","method":"POST","path":"/sessions/{sid}/agent/storeys","access":"share","effect":"write","mcp":"web","py":"set_storeys([{'n': '1. etg', 'z': 0.0, 'h': 2.7}])","ops":["set_storeys"],"params":{"type":"object","properties":{"storeys":{"type":"array","items":{"type":"object"}},"ids":{"type":"array","items":{"type":"string"}},"storey":{"type":"string"},"reassign":{"type":"boolean"},"sid":{"type":"string"}}},"example":{"storeys":[{"n":"1. etg","z":0.0,"h":2.7}]},"status":"live","server":"web","level":"propose","description":"Create/change storeys (name, z, h) and put the elements in them (all, an id list, or by height), run the storey tags and the audit, one undo step. Use when the delivery check says «etg.uplassert» or the model has no storeys. Without storeys one «1. etg» is made from the model height. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Lag/endre etasjer (navn, z, h) og knytt elementene til dem (alle, id-liste, eller etter høyde), kjør etasjemerking og revisjon, ett angresteg. Bruk når leveringssjekken sier «etg.uplassert» eller modellen mangler etasjer. Uten storeys lages én «1. etg» fra modellens høyde.","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"storeys":{"type":"array","items":{"type":"object"}},"ids":{"type":"array","items":{"type":"string"}},"storey":{"type":"string"},"reassign":{"type":"boolean"},"sid":{"type":"string"}}}},{"name":"tag_by_storey","cat":"vegg","no":"Reparer etasjemerking: merk ALLE elementer (vegger, dekker, tak, åpninger, trapper, rom, stendere, kledning, rekkverk) med etasjetagg ut fra etasjelisten og høyde. Bruk når «GET /tags» viser 0 elementer per etasje eller en 2D-/3D-etasjescene viser hele huset. Idempotent (i takt = ingen endring), ett angresteg.","en":"Repair the storey tags: tag EVERY element (walls, slabs, roofs, openings, stairs, rooms, posts, cladding, railings) with its storey from the storey list and height. Use when «GET /tags» shows 0 elements per storey or a 2D-/3D-<storey> scene shows the whole house. Idempotent (in step = no change), one undo step.","method":"POST","path":"/sessions/{sid}/agent/storeys/tag","access":"share","effect":"write","mcp":"web","py":"tag_by_storey()","ops":["tag_by_storey"],"params":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}},"storey":{"type":"string"},"reassign":{"type":"boolean"},"sid":{"type":"string"}}},"example":{},"status":"live","server":"web","level":"propose","description":"Repair the storey tags: tag EVERY element (walls, slabs, roofs, openings, stairs, rooms, posts, cladding, railings) with its storey from the storey list and height. Use when «GET /tags» shows 0 elements per storey or a 2D-/3D-<storey> scene shows the whole house. Idempotent (in step = no change), one undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Reparer etasjemerking: merk ALLE elementer (vegger, dekker, tak, åpninger, trapper, rom, stendere, kledning, rekkverk) med etasjetagg ut fra etasjelisten og høyde. Bruk når «GET /tags» viser 0 elementer per etasje eller en 2D-/3D-etasjescene viser hele huset. Idempotent (i takt = ingen endring), ett angresteg.","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}},"storey":{"type":"string"},"reassign":{"type":"boolean"},"sid":{"type":"string"}}}},{"name":"roof","cat":"tak","no":"Tak fra et eget omriss.","en":"Roof from its own outline.","method":"POST","path":"/sessions/{sid}/roof","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Roof from its own outline. [logged in] — NO: Tak fra et eget omriss.","category_label":"Tak, ark og takvindu","input_schema":{"type":"object","properties":{"boundary":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","title":"Boundary"},"form":{"type":"string","enum":["gable","hip","shed","flat"],"title":"Form","default":"gable"},"slope_pct":{"type":"number","title":"Slope Pct","default":35.0},"overhang_m":{"type":"number","title":"Overhang M","default":0.4},"z_eave":{"type":"number","title":"Z Eave","default":2.65},"name":{"type":"string","title":"Name","default":"Roof"}},"required":["boundary"]}},{"name":"building_roof","cat":"tak","no":"Tak for en bygning (kanter: fall/gavl).","en":"Roof of one building (edges: slope/gable).","method":"POST","path":"/sessions/{sid}/building_roof","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Roof of one building (edges: slope/gable). [logged in] — NO: Tak for en bygning (kanter: fall/gavl).","category_label":"Tak, ark og takvindu","input_schema":{"type":"object","properties":{"building_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Id"},"placement":{"type":"string","enum":["whole","part1","part2","part3"],"title":"Placement","default":"whole"},"boundary":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Boundary"},"form":{"type":"string","enum":["gable","hip","shed","flat"],"title":"Form","default":"gable"},"roof_pitch_deg":{"type":"number","title":"Roof Pitch Deg","default":22.0},"overhang_m":{"type":"number","title":"Overhang M","default":0.4},"name":{"type":"string","title":"Name","default":"Tak"},"edge_roles":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Edge Roles"},"edge_slopes_deg":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Edge Slopes Deg"},"edge_abut":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Edge Abut"},"edge_overhangs":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Edge Overhangs"},"z_eave":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Z Eave"}}}},{"name":"dormer","cat":"tak","no":"Ark (kvist) i taket.","en":"Dormer in the roof.","method":"POST","path":"/sessions/{sid}/dormer","access":"login","effect":"write","py":"kvist(antall=2, side='south', width_m=1.8)","status":"live","server":"web","level":"propose","description":"Dormer in the roof. [logged in] — NO: Ark (kvist) i taket.","category_label":"Tak, ark og takvindu","input_schema":{"type":"object","properties":{"building_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Id"},"roof_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Roof Id"},"edge":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Edge"},"side":{"anyOf":[{"type":"string","enum":["north","south","east","west"]},{"type":"null"}],"title":"Side"},"offset_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Offset M"},"count":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Count","default":1},"width_m":{"type":"number","maximum":6.0,"exclusiveMinimum":0.6,"title":"Width M","default":1.8},"inset_m":{"type":"number","maximum":3.0,"minimum":0.2,"title":"Inset M","default":0.8},"pitch_deg":{"type":"number","maximum":60.0,"minimum":10.0,"title":"Pitch Deg","default":30.0},"window_width_m":{"type":"number","maximum":4.0,"exclusiveMinimum":0.2,"title":"Window Width M","default":0.9},"window_height_m":{"type":"number","maximum":3.0,"exclusiveMinimum":0.2,"title":"Window Height M","default":1.1},"window_sill_m":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Window Sill M","default":0.45},"walls_up_to":{"type":"string","enum":["roof","eave"],"title":"Walls Up To","default":"roof"},"walls_down_to":{"type":"string","enum":["roof","underside","floor"],"title":"Walls Down To","default":"roof"},"opening":{"type":"string","enum":["outside","centre","inside","none"],"title":"Opening","default":"outside"},"floor_z":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Floor Z"},"cladding":{"type":"string","enum":["inherit","none"],"title":"Cladding","default":"inherit"},"roof_style":{"type":"string","enum":["inherit","default"],"title":"Roof Style","default":"inherit"},"through":{"type":"boolean","title":"Through","default":false},"eave_notch":{"type":"boolean","title":"Eave Notch","default":false},"name":{"type":"string","title":"Name","default":"Ark"}}}},{"name":"roof_window","cat":"tak","no":"Takvindu.","en":"Roof window.","method":"POST","path":"/sessions/{sid}/roof_window","access":"login","effect":"write","py":"takvindu(antall=2, side='south', size='MK06')","status":"live","server":"web","level":"propose","description":"Roof window. [logged in] — NO: Takvindu.","category_label":"Tak, ark og takvindu","input_schema":{"type":"object","properties":{"building_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Id"},"roof_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Roof Id"},"edge":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Edge"},"side":{"anyOf":[{"type":"string","enum":["north","south","east","west"]},{"type":"null"}],"title":"Side"},"offset_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Offset M"},"count":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Count","default":1},"slope_m":{"type":"number","maximum":8.0,"minimum":0.2,"title":"Slope M","default":0.9},"series":{"type":"string","enum":["GGL","GGU","GPL","GPU"],"title":"Series","default":"GGU"},"size":{"type":"string","enum":["CK02","CK04","CK06","FK06","FK08","MK04","MK06","MK08","MK10","PK04","PK06","PK08","PK10","SK06","SK08","SK10","UK04","UK08","UK10"],"title":"Size","default":"MK06"}}}},{"name":"add_stair","cat":"vegg","no":"Trapp fra aktiv etasje til neste, med trappehull i dekket (rett, L eller U; TEK17).","en":"Stair from the active storey to the next, with its opening in the floor (straight, L or U; TEK17).","access":"login","effect":"write","py":"trapp(start=(2.0, 1.0), retning=(0, 1), innstillinger={'type': 'rett', 'width': 0.9})","status":"live","server":"web","level":"propose","description":"Stair from the active storey to the next, with its opening in the floor (straight, L or U; TEK17). [logged in] — NO: Trapp fra aktiv etasje til neste, med trappehull i dekket (rett, L eller U; TEK17).","category_label":"Vegg (yttervegg)"},{"name":"stair_in_shape","cat":"vegg","no":"Trapp i form: en lukket form i plan (tegnet flate, trappehull, skannets fotavtrykk) og startkanten gir trappa som fyller formen. Rektangel -> rett løp, L-form -> kvartsvingt, U-form -> halvsvingt, med svingtrinn eller repos (innstillingen stair.corner). Antall opptrinn fra etasjehøyden (2R + G = 620 ± 20, SlimBim-reglene); lås tall med locks {riser_count, flight_tread_counts: [før, etter svingen], winder_count}. Hullet i etasjeskillet blir formen. dry_run=true viser tallene og røde varsler uten å endre modellen.","en":"Stair in a shape: a closed plan polygon (drawn face, stair opening, scanned footprint) and the start edge give the stair that fills it. Rectangle -> straight run, L -> quarter turn, U -> half turn, with winders or a landing (setting stair.corner). Riser count from the storey height (2R + G = 620 ± 20, SlimBim rules); lock numbers with locks {riser_count, flight_tread_counts: [before, after the turn], winder_count}. The floor opening is the shape. dry_run=true returns the numbers and red warnings without changing the model.","method":"POST","path":"/sessions/{sid}/agent/stairs/shape","access":"share","effect":"write","mcp":"web","py":"stair_in_shape([[0, 0], [1, 0], [1, 2.82], [-1.04, 2.82], [-1.04, 1.82], [0, 1.82]], start=[0.5, 0])","ops":["stair_in_shape"],"params":{"type":"object","properties":{"boundary":{"type":"array","items":{"type":"array","items":{"type":"number"}}},"start":{"description":"start edge index, or [x, y] at/near the start edge"},"direction":{"type":"array","items":{"type":"number"}},"z0":{"type":"number"},"z1":{"type":"number"},"locks":{"type":"object"},"profile":{"type":"string"},"settings":{"type":"object"},"dry_run":{"type":"boolean"},"sid":{"type":"string"}},"required":["boundary"]},"example":{"boundary":[[0,0],[1,0],[1,2.82],[-1.04,2.82],[-1.04,1.82],[0,1.82]],"start":[0.5,0],"locks":{"flight_tread_counts":[7,4],"winder_count":3}},"status":"live","server":"web","level":"propose","description":"Stair in a shape: a closed plan polygon (drawn face, stair opening, scanned footprint) and the start edge give the stair that fills it. Rectangle -> straight run, L -> quarter turn, U -> half turn, with winders or a landing (setting stair.corner). Riser count from the storey height (2R + G = 620 ± 20, SlimBim rules); lock numbers with locks {riser_count, flight_tread_counts: [before, after the turn], winder_count}. The floor opening is the shape. dry_run=true returns the numbers and red warnings without changing the model. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Trapp i form: en lukket form i plan (tegnet flate, trappehull, skannets fotavtrykk) og startkanten gir trappa som fyller formen. Rektangel -> rett løp, L-form -> kvartsvingt, U-form -> halvsvingt, med svingtrinn eller repos (innstillingen stair.corner). Antall opptrinn fra etasjehøyden (2R + G = 620 ± 20, SlimBim-reglene); lås tall med locks {riser_count, flight_tread_counts: [før, etter svingen], winder_count}. Hullet i etasjeskillet blir formen. dry_run=true viser tallene og røde varsler uten å endre modellen.","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"boundary":{"type":"array","items":{"type":"array","items":{"type":"number"}}},"start":{"description":"start edge index, or [x, y] at/near the start edge"},"direction":{"type":"array","items":{"type":"number"}},"z0":{"type":"number"},"z1":{"type":"number"},"locks":{"type":"object"},"profile":{"type":"string"},"settings":{"type":"object"},"dry_run":{"type":"boolean"},"sid":{"type":"string"}},"required":["boundary"]}},{"name":"roof_window_catalog","cat":"tak","no":"Katalog over takvindustørrelser.","en":"Roof window size catalog.","method":"GET","path":"/roof_windows/catalog","access":"public","effect":"read","status":"live","server":"web","description":"Roof window size catalog. [open, no login] — NO: Katalog over takvindustørrelser.","category_label":"Tak, ark og takvindu","input_schema":{"type":"object","properties":{}}},{"name":"deck","cat":"utvendig","no":"Terrasse/platting.","en":"Deck.","method":"POST","path":"/sessions/{sid}/deck","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Deck. [logged in] — NO: Terrasse/platting.","category_label":"Terrasse, rekkverk, pergola","input_schema":{"type":"object","properties":{"kind":{"type":"string","enum":["veranda","balkong","takaltan","terrasse"],"title":"Kind","default":"veranda"},"building_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Id"},"edge":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Edge"},"side":{"anyOf":[{"type":"string","enum":["north","south","east","west"]},{"type":"null"}],"title":"Side"},"offset_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Offset M"},"width_m":{"type":"number","maximum":20.0,"exclusiveMinimum":0.5,"title":"Width M","default":4.0},"depth_m":{"type":"number","maximum":8.0,"exclusiveMinimum":0.5,"title":"Depth M","default":2.0},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Boundary"},"floor_z":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Floor Z"},"storey":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Storey"},"ground_z":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ground Z"},"thickness_m":{"anyOf":[{"type":"number","maximum":0.6,"exclusiveMinimum":0.03},{"type":"null"}],"title":"Thickness M"},"railing":{"type":"string","enum":["auto","none","spiler","glass","wire","brystning"],"title":"Railing","default":"auto"},"railing_height_m":{"type":"number","maximum":2.0,"minimum":0.3,"title":"Railing Height M","default":1.0},"posts":{"type":"string","enum":["auto","none"],"title":"Posts","default":"auto"},"post_size_m":{"type":"number","maximum":0.4,"exclusiveMinimum":0.04,"title":"Post Size M","default":0.12},"door":{"type":"boolean","title":"Door","default":true},"material":{"type":"string","title":"Material","default":"Wood"},"recessed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Recessed"},"slope_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":0.2},{"type":"null"}],"title":"Slope M"},"fall_pct":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Fall Pct"},"fall_to":{"anyOf":[{"type":"string","enum":["north","south","east","west"]},{"type":"null"}],"title":"Fall To"},"edge_style":{"type":"string","enum":["rekkverk","brystning","begge"],"title":"Edge Style","default":"rekkverk"},"drainage":{"anyOf":[{"type":"string","enum":["sluk","renne_utvendig","renne_i_gesimskasse","ingen"]},{"type":"null"}],"title":"Drainage"},"parapet_height_m":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.2},{"type":"null"}],"title":"Parapet Height M"},"parapet_cladding":{"type":"string","enum":["outside","inside"],"title":"Parapet Cladding","default":"outside"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}}}},{"name":"railing","cat":"utvendig","no":"Rekkverk.","en":"Railing.","method":"POST","path":"/sessions/{sid}/railing","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Railing. [logged in] — NO: Rekkverk.","category_label":"Terrasse, rekkverk, pergola","input_schema":{"type":"object","properties":{"path":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","minItems":2,"title":"Path"},"closed":{"type":"boolean","title":"Closed","default":false},"z":{"type":"number","title":"Z","default":0.0},"type":{"type":"string","enum":["spiler","glass","wire","brystning"],"title":"Type","default":"spiler"},"height_m":{"type":"number","maximum":2.0,"minimum":0.3,"title":"Height M","default":1.0},"post_cc_m":{"type":"number","maximum":3.0,"exclusiveMinimum":0.3,"title":"Post Cc M","default":1.2},"baluster_gap_m":{"type":"number","maximum":0.3,"exclusiveMinimum":0.0,"title":"Baluster Gap M","default":0.09},"material":{"type":"string","title":"Material","default":"White"},"fall_m":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Fall M","default":0.0},"building_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Id"},"name":{"type":"string","title":"Name","default":"Rekkverk"}},"required":["path"]}},{"name":"roof_on_columns","cat":"utvendig","no":"Tak på søyler (pergola, carport).","en":"Roof on columns (pergola, carport).","method":"POST","path":"/sessions/{sid}/roof_on_columns","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Roof on columns (pergola, carport). [logged in] — NO: Tak på søyler (pergola, carport).","category_label":"Terrasse, rekkverk, pergola","input_schema":{"type":"object","properties":{"building_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Id"},"placement":{"type":"string","enum":["free","whole","part1","part2","part3"],"title":"Placement","default":"whole"},"width_m":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Width M","default":4.0},"depth_m":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Depth M","default":3.0},"at":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"At"},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Boundary"},"form":{"type":"string","enum":["gable","hip","shed","flat"],"title":"Form","default":"gable"},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Roof Pitch Deg","default":15.0},"overhang_m":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Overhang M","default":0.4},"z_eave":{"type":"number","maximum":8.0,"exclusiveMinimum":1.0,"title":"Z Eave","default":2.4},"column_size_m":{"type":"number","maximum":0.6,"minimum":0.05,"title":"Column Size M","default":0.15},"round_columns":{"type":"boolean","title":"Round Columns","default":false},"max_span_m":{"type":"number","maximum":8.0,"minimum":1.0,"title":"Max Span M","default":3.0},"inset_m":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Inset M","default":0.15},"name":{"type":"string","title":"Name","default":"Overbygg"}}}},{"name":"list_levels","cat":"etasje","no":"Etasjer (navn, z, høyde).","en":"Storeys (name, z, height).","method":"GET","path":"/sessions/{sid}/levels","access":"sandbox","effect":"read","py":"etasjer()","status":"live","server":"web","level":"read","description":"Storeys (name, z, height). [sandbox (anonymous) or logged in] — NO: Etasjer (navn, z, høyde).","category_label":"Etasje","input_schema":{"type":"object","properties":{"building_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Id"}}}},{"name":"ensure_levels","cat":"etasje","no":"Sørg for standard etasjeliste.","en":"Make sure the default storey list exists.","method":"POST","path":"/sessions/{sid}/levels/ensure","access":"sandbox","effect":"write","status":"live","server":"web","level":"propose","description":"Make sure the default storey list exists. [sandbox (anonymous) or logged in] — NO: Sørg for standard etasjeliste.","category_label":"Etasje","input_schema":{"type":"object","properties":{"scenes":{"type":"boolean","default":true,"title":"Scenes"}}}},{"name":"set_active_level","cat":"etasje","no":"Aktiv etasje (der nye vegger tegnes).","en":"Active storey (where new walls go).","method":"POST","path":"/sessions/{sid}/levels/active","access":"sandbox","effect":"write","py":"aktiv_etasje('2. etg')","example":{"guid":"<level guid>"},"status":"live","server":"web","level":"propose","description":"Active storey (where new walls go). [sandbox (anonymous) or logged in] — NO: Aktiv etasje (der nye vegger tegnes).","category_label":"Etasje","input_schema":{"type":"object","properties":{"guid":{"type":"string","title":"Guid"}},"required":["guid"]}},{"name":"save_levels","cat":"etasje","no":"Lagre etasjelisten (rader: navn, z, høyde).","en":"Save the storey list (rows: name, z, height).","method":"POST","path":"/sessions/{sid}/levels/save","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Save the storey list (rows: name, z, height). [logged in] — NO: Lagre etasjelisten (rader: navn, z, høyde).","category_label":"Etasje","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"rows":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Rows"},"building_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Id"}}}},{"name":"detect_rooms","cat":"rom","no":"Finn rom fra veggløkker og sett romnavn. Tåler glipper opptil 12 cm i skjøtene; count 0 forklares i report (løkker per toleranse, åpne skjøter med vegg-id og sted).","en":"Detect rooms from wall loops and place labels. Tolerates joint gaps up to 12 cm; count 0 is explained in report (loops per tolerance, open joints with wall ids and place).","method":"POST","path":"/sessions/{sid}/rooms/detect","access":"login","effect":"write","mcp":"web","py":"add_all_rooms()","ops":["add_all_rooms"],"status":"live","server":"web","level":"propose","description":"Detect rooms from wall loops and place labels. Tolerates joint gaps up to 12 cm; count 0 is explained in report (loops per tolerance, open joints with wall ids and place). [logged in] — NO: Finn rom fra veggløkker og sett romnavn. Tåler glipper opptil 12 cm i skjøtene; count 0 forklares i report (løkker per toleranse, åpne skjøter med vegg-id og sted).","category_label":"Rom og areal","input_schema":{"type":"object","properties":{}}},{"name":"measure_areas","cat":"rom","no":"BYA / BTA / BRA (NS 3940) for planen.","en":"BYA / BTA / BRA (NS 3940) of the plan.","method":"GET","path":"/sessions/{sid}/composer/areas","access":"sandbox","effect":"read","mcp":"web","py":"arealer()","status":"live","server":"web","level":"read","description":"BYA / BTA / BRA (NS 3940) of the plan. [sandbox (anonymous) or logged in] — NO: BYA / BTA / BRA (NS 3940) for planen.","category_label":"Rom og areal","input_schema":{"type":"object","properties":{}}},{"name":"areas_sheet","cat":"rom","no":"Arealtabell som ark.","en":"Area table as a sheet.","method":"POST","path":"/sessions/{sid}/composer/areas/sheet","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Area table as a sheet. [logged in] — NO: Arealtabell som ark.","category_label":"Rom og areal","input_schema":{"type":"object","properties":{"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"list_sections","cat":"snitt","no":"Snittplan i modellen (uid, symbol, punkt, normal).","en":"Section planes (uid, symbol, point, normal).","method":"GET","path":"/sessions/{sid}/sections","access":"login","effect":"read","mcp":"web","py":"snitt_liste()","status":"live","server":"web","level":"read","description":"Section planes (uid, symbol, point, normal). [logged in] — NO: Snittplan i modellen (uid, symbol, punkt, normal).","category_label":"Snitt","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"create_section","cat":"snitt","no":"Nytt snittplan (punkt+normal) og snittscene.","en":"New section plane (point+normal) and section scene.","method":"POST","path":"/sessions/{sid}/sections","access":"login","effect":"write","mcp":"web","example":{"point":[4,3,1.2],"normal":[0,1,0],"symbol":"A","from_camera":false},"status":"live","server":"web","level":"propose","description":"New section plane (point+normal) and section scene. [logged in] — NO: Nytt snittplan (punkt+normal) og snittscene.","category_label":"Snitt","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"point":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Point"},"normal":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Normal"},"name":{"type":"string","title":"Name","default":""},"symbol":{"type":"string","title":"Symbol","default":""},"activate":{"type":"boolean","title":"Activate","default":true},"bind_view":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bind View","default":""},"from_camera":{"type":"boolean","title":"From Camera","default":true}}}},{"name":"edit_section","cat":"snitt","no":"Rediger snitt i plan: op=create (from,to) | drag (uid, part, from, to; ende = drei + forleng) | flip | symbol | activate | delete | extent (uid, extent=[a,b] m utenfor bygget, 0,5-20; tom = følg bygget).","en":"Edit a section in plan: op=create (from,to) | drag (uid, part, from, to; end = turn + lengthen) | flip | symbol | activate | delete | extent (uid, extent=[a,b] m past the building, 0.5-20; none = follow it).","method":"POST","path":"/sessions/{sid}/sections/edit","access":"login","effect":"write","mcp":"web","py":"snitt_rediger(op='create', fra=(0,3), til=(8,3))","example":{"op":"create","from":[0,3],"to":[8,3]},"status":"live","server":"web","level":"propose","description":"Edit a section in plan: op=create (from,to) | drag (uid, part, from, to; end = turn + lengthen) | flip | symbol | activate | delete | extent (uid, extent=[a,b] m past the building, 0.5-20; none = follow it). [logged in] — NO: Rediger snitt i plan: op=create (from,to) | drag (uid, part, from, to; ende = drei + forleng) | flip | symbol | activate | delete | extent (uid, extent=[a,b] m utenfor bygget, 0,5-20; tom = følg bygget).","category_label":"Snitt","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"op":{"type":"string","title":"Op"},"uid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Uid"},"part":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Part"},"from":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"From"},"to":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"To"},"tol_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tol M"},"free":{"type":"boolean","title":"Free","default":false},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol"},"on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On"},"level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"},"extent":{"anyOf":[{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array"},{"type":"null"}],"title":"Extent"}},"required":["op"]}},{"name":"patch_section","cat":"snitt","no":"Flytt/snu/omdøp et snittplan.","en":"Move/flip/rename a section plane.","method":"PATCH","path":"/sessions/{sid}/sections/{uid}","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Move/flip/rename a section plane. [logged in] — NO: Flytt/snu/omdøp et snittplan.","category_label":"Snitt","input_schema":{"type":"object","properties":{"uid":{"type":"integer","title":"Uid"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"point":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Point"},"offset":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Offset"},"normal":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Normal"},"flip":{"type":"boolean","title":"Flip","default":false},"activate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Activate"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"rebind":{"type":"boolean","title":"Rebind","default":true},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol"}},"required":["uid"]}},{"name":"delete_section","cat":"snitt","no":"Slett et snittplan.","en":"Delete a section plane.","method":"DELETE","path":"/sessions/{sid}/sections/{uid}","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Delete a section plane. [logged in] — NO: Slett et snittplan.","category_label":"Snitt","input_schema":{"type":"object","properties":{"uid":{"type":"integer","title":"Uid"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["uid"]}},{"name":"move_section","cat":"snitt","no":"Flytt/drei/døp om et EKSISTERENDE snitt (aldri lag et nytt i stedet): section=«Snitt-AA»|«A»|uid, x/y (hvor linja skal stå), offset, axis, rotate_deg, extent, new_name, new_symbol. avoid_walls=true: ligger snittet langs en vegg, flyttes det til midten av nærmeste rom (svaret sier hvilken vegg og hvorfor). Samme vei som å dra snittlinja i planen: scenen, arkene og snittmerkene følger med.","en":"Move/turn/rename an EXISTING section (never create a new one instead): section=«Snitt-AA»|«A»|uid, x/y (where the line goes), offset, axis, rotate_deg, extent, new_name, new_symbol. avoid_walls=true: if the section lies along a wall it moves to the middle of the nearest room (the answer says which wall and why). Same path as dragging the section line in the plan: the scene, the sheets and the marks follow.","method":"POST","path":"/sessions/{sid}/agent/sections/move","access":"share","effect":"write","mcp":"web","py":"move_section('Snitt-AA', x=3.0)  # eller move_section('Snitt-AA', avoid_walls=True)","ops":["move_section"],"params":{"type":"object","properties":{"section":{"type":"string"},"uid":{"type":"integer"},"x":{"type":"number"},"y":{"type":"number"},"offset":{"type":"number"},"axis":{"type":"string"},"rotate_deg":{"type":"number"},"extent":{"type":"array","items":{"type":"number"}},"new_name":{"type":"string"},"new_symbol":{"type":"string"},"avoid_walls":{"type":"boolean"},"sid":{"type":"string"}}},"example":{"section":"Snitt-AA","avoid_walls":true},"status":"live","server":"web","level":"propose","description":"Move/turn/rename an EXISTING section (never create a new one instead): section=«Snitt-AA»|«A»|uid, x/y (where the line goes), offset, axis, rotate_deg, extent, new_name, new_symbol. avoid_walls=true: if the section lies along a wall it moves to the middle of the nearest room (the answer says which wall and why). Same path as dragging the section line in the plan: the scene, the sheets and the marks follow. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Flytt/drei/døp om et EKSISTERENDE snitt (aldri lag et nytt i stedet): section=«Snitt-AA»|«A»|uid, x/y (hvor linja skal stå), offset, axis, rotate_deg, extent, new_name, new_symbol. avoid_walls=true: ligger snittet langs en vegg, flyttes det til midten av nærmeste rom (svaret sier hvilken vegg og hvorfor). Samme vei som å dra snittlinja i planen: scenen, arkene og snittmerkene følger med.","category_label":"Snitt","input_schema":{"type":"object","properties":{"section":{"type":"string"},"uid":{"type":"integer"},"x":{"type":"number"},"y":{"type":"number"},"offset":{"type":"number"},"axis":{"type":"string"},"rotate_deg":{"type":"number"},"extent":{"type":"array","items":{"type":"number"}},"new_name":{"type":"string"},"new_symbol":{"type":"string"},"avoid_walls":{"type":"boolean"},"sid":{"type":"string"}}}},{"name":"suggest_section_position","cat":"snitt","no":"Endrer ingenting: vegger snittet treffer nå, og hvor det kan stå uten å treffe en vegg (midt i nærmeste rom), med begrunnelse.","en":"Changes nothing: the walls a section hits now and where it could stand without hitting a wall (middle of the nearest room), with the reason.","method":"GET","path":"/sessions/{sid}/agent/sections/suggest","access":"share","effect":"read","mcp":"web","py":"suggest_section_position('Snitt-AA')","ops":["suggest_section_position"],"params":{"type":"object","properties":{"section":{"type":"string"},"uid":{"type":"integer"},"sid":{"type":"string"}}},"status":"live","server":"web","level":"read","description":"Changes nothing: the walls a section hits now and where it could stand without hitting a wall (middle of the nearest room), with the reason. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Endrer ingenting: vegger snittet treffer nå, og hvor det kan stå uten å treffe en vegg (midt i nærmeste rom), med begrunnelse.","category_label":"Snitt","input_schema":{"type":"object","properties":{"section":{"type":"string"},"uid":{"type":"integer"},"sid":{"type":"string"}}}},{"name":"rename_scene","cat":"scene","no":"Døp om en scene (arkene som viser den følger med) og/eller flytt den i lista (move=-1/+1). Ett angresteg.","en":"Rename a scene (sheets that show it follow) and/or move it in the list (move=-1/+1). One undo step.","method":"POST","path":"/sessions/{sid}/agent/scenes/rename","access":"share","effect":"write","mcp":"web","py":"rename_scene('Snitt-AA', new_name='Snitt 1-1')","ops":["rename_scene"],"params":{"type":"object","properties":{"name":{"type":"string"},"new_name":{"type":"string"},"move":{"type":"integer"},"sid":{"type":"string"}},"required":["name"]},"example":{"name":"Snitt-AA","new_name":"Snitt 1-1"},"status":"live","server":"web","level":"propose","description":"Rename a scene (sheets that show it follow) and/or move it in the list (move=-1/+1). One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Døp om en scene (arkene som viser den følger med) og/eller flytt den i lista (move=-1/+1). Ett angresteg.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string"},"new_name":{"type":"string"},"move":{"type":"integer"},"sid":{"type":"string"}},"required":["name"]}},{"name":"edit_opening","cat":"apning","no":"Flytt/endre dør eller vindu i en vegg: offset_m (langs veggen), width_m/height_m/sill_m (midten beholdes), flip (slagretning), delete, shape rect|circle|arch (rundt vindu / rundbue, arch_rise_m = stikk). Samme kode som håndtakene i planen.","en":"Move/change a door or window in a wall: offset_m (along the wall), width_m/height_m/sill_m (centre kept), flip (swing), delete, shape rect|circle|arch (round / arched, arch_rise_m = rise). Same code as the plan handles.","method":"POST","path":"/sessions/{sid}/agent/openings/edit","access":"share","effect":"write","mcp":"web","py":"edit_opening('<id>', offset_m=2.5, width_m=1.0)","ops":["edit_opening"],"params":{"type":"object","properties":{"id":{"type":"string"},"offset_m":{"type":"number"},"width_m":{"type":"number"},"height_m":{"type":"number"},"sill_m":{"type":"number"},"flip":{"type":"boolean"},"delete":{"type":"boolean"},"shape":{"type":"string","enum":["rect","circle","arch"]},"arch_rise_m":{"type":"number"},"sid":{"type":"string"}},"required":["id"]},"example":{"id":"<opening id>","offset_m":2.5},"status":"live","server":"web","level":"propose","description":"Move/change a door or window in a wall: offset_m (along the wall), width_m/height_m/sill_m (centre kept), flip (swing), delete, shape rect|circle|arch (round / arched, arch_rise_m = rise). Same code as the plan handles. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Flytt/endre dør eller vindu i en vegg: offset_m (langs veggen), width_m/height_m/sill_m (midten beholdes), flip (slagretning), delete, shape rect|circle|arch (rundt vindu / rundbue, arch_rise_m = stikk). Samme kode som håndtakene i planen.","category_label":"Åpning (dør/vindu/port)","input_schema":{"type":"object","properties":{"id":{"type":"string"},"offset_m":{"type":"number"},"width_m":{"type":"number"},"height_m":{"type":"number"},"sill_m":{"type":"number"},"flip":{"type":"boolean"},"delete":{"type":"boolean"},"shape":{"type":"string","enum":["rect","circle","arch"]},"arch_rise_m":{"type":"number"},"sid":{"type":"string"}},"required":["id"]}},{"name":"move_walls","cat":"vegg","no":"Flytt vegger i planen (dx, dy meter): sammenhengende hjørner strekkes, åpninger følger. Samme kode som Flytt-verktøyet.","en":"Move walls in the plan (dx, dy metres): joined corners stretch, openings follow. Same code as the Move tool.","method":"POST","path":"/sessions/{sid}/agent/walls/move","access":"share","effect":"write","mcp":"web","py":"move_walls(['<wall id>'], dx=0.5, dy=0)","ops":["move_walls"],"params":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}},"dx":{"type":"number"},"dy":{"type":"number"},"sid":{"type":"string"}},"required":["ids"]},"example":{"ids":["<wall id>"],"dx":0.5},"status":"live","server":"web","level":"propose","description":"Move walls in the plan (dx, dy metres): joined corners stretch, openings follow. Same code as the Move tool. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Flytt vegger i planen (dx, dy meter): sammenhengende hjørner strekkes, åpninger følger. Samme kode som Flytt-verktøyet.","category_label":"Vegg (yttervegg)","input_schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}},"dx":{"type":"number"},"dy":{"type":"number"},"sid":{"type":"string"}},"required":["ids"]}},{"name":"edit_sheet_viewport","cat":"scene","no":"Flytt/endre størrelse/målestokk på en visning på et ark (papir-mm): sheet, index, scale_n, x_mm, y_mm, w_mm, h_mm, locked. Ett angresteg.","en":"Move/resize/rescale a viewport on a sheet (paper mm): sheet, index, scale_n, x_mm, y_mm, w_mm, h_mm, locked. One undo step.","method":"POST","path":"/sessions/{sid}/agent/sheets/viewport","access":"share","effect":"write","mcp":"web","py":"edit_viewport('Plan 1. etg', 0, x_mm=20, y_mm=30, scale_n=100)","ops":["edit_viewport"],"params":{"type":"object","properties":{"sheet":{"type":"string"},"index":{"type":"integer"},"scale_n":{"type":"number"},"x_mm":{"type":"number"},"y_mm":{"type":"number"},"w_mm":{"type":"number"},"h_mm":{"type":"number"},"locked":{"type":"boolean"},"sid":{"type":"string"}},"required":["sheet","index"]},"example":{"sheet":"Plan 1. etg","index":0,"x_mm":20,"y_mm":30},"status":"live","server":"web","level":"propose","description":"Move/resize/rescale a viewport on a sheet (paper mm): sheet, index, scale_n, x_mm, y_mm, w_mm, h_mm, locked. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Flytt/endre størrelse/målestokk på en visning på et ark (papir-mm): sheet, index, scale_n, x_mm, y_mm, w_mm, h_mm, locked. Ett angresteg.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"sheet":{"type":"string"},"index":{"type":"integer"},"scale_n":{"type":"number"},"x_mm":{"type":"number"},"y_mm":{"type":"number"},"w_mm":{"type":"number"},"h_mm":{"type":"number"},"locked":{"type":"boolean"},"sid":{"type":"string"}},"required":["sheet","index"]}},{"name":"element_props","cat":"inspeksjon","no":"Endrer ingenting: Entity Info-feltene til ett element (nøkkel, type, lovlige valg) og nåverdiene, med id (GUID), short_id (8 tegn) og navn. Elementet kan oppgis som id, short_id eller navn («D3»). Bruk FØR set_element_props.","en":"Changes nothing: the Entity Info fields of one element (key, type, choices) and its values, with id (GUID), short_id (8 chars) and name. The element may be given as id, short_id or name («D3»). Use BEFORE set_element_props.","method":"GET","path":"/sessions/{sid}/agent/elements/{eid}/props","access":"share","effect":"read","mcp":"web","py":"element_props('<id>')","ops":["element_props"],"status":"live","server":"web","level":"read","description":"Changes nothing: the Entity Info fields of one element (key, type, choices) and its values, with id (GUID), short_id (8 chars) and name. The element may be given as id, short_id or name («D3»). Use BEFORE set_element_props. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Endrer ingenting: Entity Info-feltene til ett element (nøkkel, type, lovlige valg) og nåverdiene, med id (GUID), short_id (8 tegn) og navn. Elementet kan oppgis som id, short_id eller navn («D3»). Bruk FØR set_element_props.","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"eid":{"type":"string","title":"Eid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["eid"]}},{"name":"set_element_props","cat":"inspeksjon","no":"Endre egenskaper på ett eller flere elementer som i Entity Info (height_m, thickness_m, wall_type, join_mode, cladding.on …); ukjente nøkler avvises. Ett angresteg. Sprosset glassdør (dørtype glass/helglass): style.glass_cols og style.glass_rows 1-4 (ruter bortover/oppover), style.glass_h (glassets del av bladet 0,2-1,0; 1 = hele bladet), style.glass_bar_w (sprossebredde i m), leaf_state open|closed; tegnes i 2D (dørlisten) og 3D, også for dobbeltdør (leaf_type glass). Vindu med overlys/lufteklaff: style.overlys_h (m, feltet over hovedglasset, del av vindushøyden; 0 = ingen) og style.vent ingen|spalte|klaff (ventilspalte i overlyset / toppstyrt lufteklaff; vent uten overlys_h gir 0,20 m); tegnes i 3D, fasade og vindusliste.","en":"Change properties of one or more elements as in Entity Info (height_m, thickness_m, wall_type, join_mode, cladding.on ...); unknown keys are refused. One undo step. Door with glazing bars (door type glass/helglass): style.glass_cols and style.glass_rows 1-4 (panes across / up), style.glass_h (glass part of the leaf 0.2-1.0; 1 = whole leaf), style.glass_bar_w (bar width in m), leaf_state open|closed; drawn in 2D (door schedule) and 3D, also for a double door (leaf_type glass). Window with transom / vent flap: style.overlys_h (m, the field above the main glass, part of the window height; 0 = none) and style.vent ingen|spalte|klaff (none / vent slot in the transom / top-hung flap; vent without overlys_h gives 0.20 m); drawn in 3D, elevation and the window schedule.","method":"POST","path":"/sessions/{sid}/agent/elements/props","access":"share","effect":"write","mcp":"web","py":"set_element_props(['<id>'], {'height_m': 3.0})","ops":["set_element_props"],"params":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}},"props":{"type":"object"},"sid":{"type":"string"}},"required":["ids","props"]},"example":{"ids":["<door id>"],"props":{"style.type":"glass","style.glass_cols":2,"style.glass_rows":3,"style.glass_h":1.0}},"status":"live","server":"web","level":"propose","description":"Change properties of one or more elements as in Entity Info (height_m, thickness_m, wall_type, join_mode, cladding.on ...); unknown keys are refused. One undo step. Door with glazing bars (door type glass/helglass): style.glass_cols and style.glass_rows 1-4 (panes across / up), style.glass_h (glass part of the leaf 0.2-1.0; 1 = whole leaf), style.glass_bar_w (bar width in m), leaf_state open|closed; drawn in 2D (door schedule) and 3D, also for a double door (leaf_type glass). Window with transom / vent flap: style.overlys_h (m, the field above the main glass, part of the window height; 0 = none) and style.vent ingen|spalte|klaff (none / vent slot in the transom / top-hung flap; vent without overlys_h gives 0.20 m); drawn in 3D, elevation and the window schedule. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Endre egenskaper på ett eller flere elementer som i Entity Info (height_m, thickness_m, wall_type, join_mode, cladding.on …); ukjente nøkler avvises. Ett angresteg. Sprosset glassdør (dørtype glass/helglass): style.glass_cols og style.glass_rows 1-4 (ruter bortover/oppover), style.glass_h (glassets del av bladet 0,2-1,0; 1 = hele bladet), style.glass_bar_w (sprossebredde i m), leaf_state open|closed; tegnes i 2D (dørlisten) og 3D, også for dobbeltdør (leaf_type glass). Vindu med overlys/lufteklaff: style.overlys_h (m, feltet over hovedglasset, del av vindushøyden; 0 = ingen) og style.vent ingen|spalte|klaff (ventilspalte i overlyset / toppstyrt lufteklaff; vent uten overlys_h gir 0,20 m); tegnes i 3D, fasade og vindusliste.","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}},"props":{"type":"object"},"sid":{"type":"string"}},"required":["ids","props"]}},{"name":"control_measure","cat":"inspeksjon","no":"Kontrollmåling: brukerens mål (tekst eller lest fra bilde av målebånd/laser) mot modellen. items [{ref «D3»/«V4»/navn eller id, width_m, height_m, sill_m, offset_m, source, confidence, note}], rules for flere (refs + mål, f.eks. alle faste glassfelt 0,90 x 2,10), source, at. Innenfor toleranse (innstillinger buildchat.tol_opening_cm, standard ±2 cm; rom ±5 cm): målet settes, taggen «Antatt (tolket)» fjernes og «Kontrollmålt» legges på (bare sporing, ingen farge: objektet beholder sin opprinnelige farge). Over toleransen: målet settes likevel, taggen blir «Avvik målt» (rød) og svaret har forskjellen. Målt verdi, kilde og tid lagres på elementet. Svaret: results per element (model_before_m, measured_m, diff_m, status), within_tolerance, deviations, failed. Kall save_version etterpå.","en":"Control measurement: the user's measures (text or read from a photo of a tape/laser) against the model. items [{ref 'D3'/'V4'/name or id, width_m, height_m, sill_m, offset_m, source, confidence, note}], rules for several (refs + measures, e.g. all fixed glass panes 0.90 x 2.10), source, at. Within tolerance (settings buildchat.tol_opening_cm, default ±2 cm; rooms ±5 cm): the measure is set, the tag 'Antatt (tolket)' is removed and 'Kontrollmålt' added (tracking only, no colour: the object keeps its original colour). Above tolerance: the measure is set anyway, the tag becomes 'Avvik målt' (red) and the answer has the difference. Measured value, source and time are stored on the element. Answer: results per element (model_before_m, measured_m, diff_m, status), within_tolerance, deviations, failed. Call save_version afterwards.","method":"POST","path":"/sessions/{sid}/agent/elements/control-measure","access":"share","effect":"write","mcp":"web","py":"control_measure([{'ref': 'D3', 'width_m': 0.91, 'source': 'laser, foto 4'}])","ops":["control_measure"],"params":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object"}},"rules":{"type":"array","items":{"type":"object"}},"source":{"type":"string"},"at":{"type":"string"},"tol_opening_m":{"type":"number"},"tol_room_m":{"type":"number"},"sid":{"type":"string"}},"required":["items"]},"example":{"items":[{"ref":"D3","width_m":0.91,"height_m":2.1,"source":"laser, foto 4","confidence":"høy"}]},"status":"live","server":"web","level":"propose","description":"Control measurement: the user's measures (text or read from a photo of a tape/laser) against the model. items [{ref 'D3'/'V4'/name or id, width_m, height_m, sill_m, offset_m, source, confidence, note}], rules for several (refs + measures, e.g. all fixed glass panes 0.90 x 2.10), source, at. Within tolerance (settings buildchat.tol_opening_cm, default ±2 cm; rooms ±5 cm): the measure is set, the tag 'Antatt (tolket)' is removed and 'Kontrollmålt' added (tracking only, no colour: the object keeps its original colour). Above tolerance: the measure is set anyway, the tag becomes 'Avvik målt' (red) and the answer has the difference. Measured value, source and time are stored on the element. Answer: results per element (model_before_m, measured_m, diff_m, status), within_tolerance, deviations, failed. Call save_version afterwards. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Kontrollmåling: brukerens mål (tekst eller lest fra bilde av målebånd/laser) mot modellen. items [{ref «D3»/«V4»/navn eller id, width_m, height_m, sill_m, offset_m, source, confidence, note}], rules for flere (refs + mål, f.eks. alle faste glassfelt 0,90 x 2,10), source, at. Innenfor toleranse (innstillinger buildchat.tol_opening_cm, standard ±2 cm; rom ±5 cm): målet settes, taggen «Antatt (tolket)» fjernes og «Kontrollmålt» legges på (bare sporing, ingen farge: objektet beholder sin opprinnelige farge). Over toleransen: målet settes likevel, taggen blir «Avvik målt» (rød) og svaret har forskjellen. Målt verdi, kilde og tid lagres på elementet. Svaret: results per element (model_before_m, measured_m, diff_m, status), within_tolerance, deviations, failed. Kall save_version etterpå.","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object"}},"rules":{"type":"array","items":{"type":"object"}},"source":{"type":"string"},"at":{"type":"string"},"tol_opening_m":{"type":"number"},"tol_room_m":{"type":"number"},"sid":{"type":"string"}},"required":["items"]}},{"name":"section_display","cat":"snitt","no":"Vis/skjul snittplan og snittflater.","en":"Show/hide section planes and cuts.","method":"PATCH","path":"/sessions/{sid}/sections/display","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Show/hide section planes and cuts. [logged in] — NO: Vis/skjul snittplan og snittflater.","category_label":"Snitt","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"show_planes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Planes"},"show_cuts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Cuts"},"bake_scene_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bake Scene Index"}}}},{"name":"get_terrain","cat":"terreng","no":"Tomteterreng: størrelse, fall %, høydepunkter, z-område, gjennomsnittlig terreng.","en":"Site terrain: size, fall %, height points, z range, mean terrain.","method":"GET","path":"/sessions/{sid}/agent/terrain","access":"share","effect":"read","mcp":"web","py":"get_terrain()","ops":["get_terrain"],"status":"live","server":"web","level":"read","description":"Site terrain: size, fall %, height points, z range, mean terrain. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Tomteterreng: størrelse, fall %, høydepunkter, z-område, gjennomsnittlig terreng.","category_label":"Terreng","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"set_terrain","cat":"terreng","no":"Lag/endre terreng: width_m, depth_m, slope_x_pct/slope_y_pct, points=[[x,y,z]], fit_floor_over_m.","en":"Create/edit terrain: width_m, depth_m, slope_x_pct/slope_y_pct, points=[[x,y,z]], fit_floor_over_m.","method":"POST","path":"/sessions/{sid}/agent/terrain","access":"share","effect":"write","mcp":"web","py":"set_terrain(width_m=30, depth_m=25, slope_y_pct=8)","ops":["set_terrain","create_terrain"],"example":{"width_m":30,"depth_m":25,"slope_y_pct":8,"centre_on_building":true,"fit_floor_over_m":0.2},"status":"live","server":"web","level":"propose","description":"Create/edit terrain: width_m, depth_m, slope_x_pct/slope_y_pct, points=[[x,y,z]], fit_floor_over_m. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Lag/endre terreng: width_m, depth_m, slope_x_pct/slope_y_pct, points=[[x,y,z]], fit_floor_over_m.","category_label":"Terreng","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"width_m":{"anyOf":[{"type":"number","maximum":2000.0,"minimum":1.0},{"type":"null"}],"title":"Width M"},"depth_m":{"anyOf":[{"type":"number","maximum":2000.0,"minimum":1.0},{"type":"null"}],"title":"Depth M"},"origin_x":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Origin X"},"origin_y":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Origin Y"},"z":{"anyOf":[{"type":"number","maximum":5000.0,"minimum":-500.0},{"type":"null"}],"title":"Z"},"slope_x_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":-100.0},{"type":"null"}],"title":"Slope X Pct"},"slope_y_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":-100.0},{"type":"null"}],"title":"Slope Y Pct"},"points":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":200},{"type":"null"}],"title":"Points"},"holes":{"anyOf":[{"items":{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},"type":"array","maxItems":10},{"type":"null"}],"title":"Holes"},"thickness_m":{"anyOf":[{"type":"number","maximum":20.0,"minimum":0.05},{"type":"null"}],"title":"Thickness M"},"grid_m":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.25},{"type":"null"}],"title":"Grid M"},"centre_on_building":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Centre On Building"},"fit_floor_over_m":{"anyOf":[{"type":"number","maximum":20.0,"minimum":-20.0},{"type":"null"}],"title":"Fit Floor Over M"},"name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Name"}}}},{"name":"fill_terrain_pit","cat":"terreng","no":"Fyll byggegrop: fjern terrenghull (holes) så marken er kontinuerlig under bygget. Ett angre-steg.","en":"Fill building pit: clear terrain holes so the ground is continuous under the building. One undo step.","method":"POST","path":"/sessions/{sid}/agent/terrain/fill_pit","access":"share","effect":"write","mcp":"web","py":"fill_terrain_pit()","ops":["fill_terrain_pit"],"status":"live","server":"web","level":"propose","description":"Fill building pit: clear terrain holes so the ground is continuous under the building. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Fyll byggegrop: fjern terrenghull (holes) så marken er kontinuerlig under bygget. Ett angre-steg.","category_label":"Terreng","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"list_dimensions","cat":"maal","no":"Målsetting (cotas) på et ark: index, tekst, side, avstand, scene.","en":"Dimensions (cotas) on a sheet: index, label, side, offset, scene. BuildChat: list_cotas(sheet) also gives the walls / openings each one measures.","method":"GET","path":"/sessions/{sid}/composer/sheets/{name}/cotas","access":"login","effect":"read","py":"list_cotas(sheet='…')","status":"live","server":"web","level":"read","description":"Dimensions (cotas) on a sheet: index, label, side, offset, scene. BuildChat: list_cotas(sheet) also gives the walls / openings each one measures. [logged in] — NO: Målsetting (cotas) på et ark: index, tekst, side, avstand, scene.","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"}},"required":["name"]}},{"name":"move_dimension","cat":"maal","no":"FLYTT mål: flytt målelinjen til ett (eller noen få) mål på arket: til annen side (over/under/høyre/venstre), lenger ut/inn (offset_mm / delta_mm) eller gjennom et punkt (x_mm/y_mm). Verdien, målepunktene og alle andre mål står urørt. clear=true skyver det ut av tegningen (balkong, terrasse, trapp). Bruk denne når brukeren sier «flytt målet/målene», IKKE tidy_cotas (som bygger alle om).","en":"MOVE a dimension: move the dimension line of one (or a few) dimensions on a sheet: to another side (over/under/høyre/venstre), further out/in (offset_mm / delta_mm) or through a paper point (x_mm/y_mm). The value, the measured points and every other dimension stay. clear=true pushes it out of the drawing (balcony, terrace, stair). Use this when the user says «move the dimension(s)», NOT tidy_cotas (which rebuilds all of them).","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/cotas/move","access":"login","effect":"write","mcp":"web","py":"move_cota(sheet='…', index=3, side='venstre')","params":{"type":"object","properties":{"name":{"type":"string"},"sid":{"type":"string"},"index":{"anyOf":[{"type":"integer"},{"type":"array","items":{"type":"integer"}}]},"view":{"type":"string"},"from_side":{"type":"string"},"side":{"type":"string"},"offset_mm":{"type":"number"},"delta_mm":{"type":"number"},"x_mm":{"type":"number"},"y_mm":{"type":"number"},"clear":{"type":"boolean"}},"required":["name"]},"example":{"index":[3],"side":"venstre","clear":true},"status":"live","server":"web","level":"propose","description":"MOVE a dimension: move the dimension line of one (or a few) dimensions on a sheet: to another side (over/under/høyre/venstre), further out/in (offset_mm / delta_mm) or through a paper point (x_mm/y_mm). The value, the measured points and every other dimension stay. clear=true pushes it out of the drawing (balcony, terrace, stair). Use this when the user says «move the dimension(s)», NOT tidy_cotas (which rebuilds all of them). [logged in] — NO: FLYTT mål: flytt målelinjen til ett (eller noen få) mål på arket: til annen side (over/under/høyre/venstre), lenger ut/inn (offset_mm / delta_mm) eller gjennom et punkt (x_mm/y_mm). Verdien, målepunktene og alle andre mål står urørt. clear=true skyver det ut av tegningen (balkong, terrasse, trapp). Bruk denne når brukeren sier «flytt målet/målene», IKKE tidy_cotas (som bygger alle om).","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string"},"sid":{"type":"string"},"index":{"anyOf":[{"type":"integer"},{"type":"array","items":{"type":"integer"}}]},"view":{"type":"string"},"from_side":{"type":"string"},"side":{"type":"string"},"offset_mm":{"type":"number"},"delta_mm":{"type":"number"},"x_mm":{"type":"number"},"y_mm":{"type":"number"},"clear":{"type":"boolean"}},"required":["name"]}},{"name":"set_dimension_extension","cat":"maal","no":"HJELPELINJER per mål: sett ext_gap_mm (avstand fra vegg/objekt til hjelpelinjestart, papir-mm) og/eller ext_over_mm (forbi målelinja) på ett eller flere mål. Flytter ikke målelinja og endrer ikke målepunktene. Bruk stor gap (f.eks. 26 mm ved 1:75) så hjelpelinjene starter utenfor balkong/terrasse foran fasaden. list_dimensions viser verdiene.","en":"EXTENSION LINES per dimension: set ext_gap_mm (paper mm from object to extension start) and/or ext_over_mm (past the dimension line) on one or more dimensions. Does not move the dimension line or measured points. Use a large gap (e.g. 26 mm at 1:75) so helpers start outside a balcony/terrace in front of the facade. list_dimensions shows the values.","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/cotas/extension","access":"login","effect":"write","mcp":"web","py":"set_dimension_extension(sheet='…', index=[0,1,21], ext_gap_mm=26)","params":{"type":"object","properties":{"name":{"type":"string"},"sid":{"type":"string"},"index":{"anyOf":[{"type":"integer"},{"type":"array","items":{"type":"integer"}}]},"ext_gap_mm":{"type":"number"},"ext_over_mm":{"type":"number"}},"required":["name"]},"example":{"index":[0,1,2,21],"ext_gap_mm":26},"status":"live","server":"web","level":"propose","description":"EXTENSION LINES per dimension: set ext_gap_mm (paper mm from object to extension start) and/or ext_over_mm (past the dimension line) on one or more dimensions. Does not move the dimension line or measured points. Use a large gap (e.g. 26 mm at 1:75) so helpers start outside a balcony/terrace in front of the facade. list_dimensions shows the values. [logged in] — NO: HJELPELINJER per mål: sett ext_gap_mm (avstand fra vegg/objekt til hjelpelinjestart, papir-mm) og/eller ext_over_mm (forbi målelinja) på ett eller flere mål. Flytter ikke målelinja og endrer ikke målepunktene. Bruk stor gap (f.eks. 26 mm ved 1:75) så hjelpelinjene starter utenfor balkong/terrasse foran fasaden. list_dimensions viser verdiene.","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string"},"sid":{"type":"string"},"index":{"anyOf":[{"type":"integer"},{"type":"array","items":{"type":"integer"}}]},"ext_gap_mm":{"type":"number"},"ext_over_mm":{"type":"number"}},"required":["name"]}},{"name":"add_dimension","cat":"maal","no":"Nytt mål på ark (papir-mm).","en":"New dimension on a sheet (paper mm).","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/cota","access":"login","effect":"write","mcp":"web","py":"mal_pa_ark(sheet='…', fra_mm=(40, 60), lengde_m=5.0, akse='h')","example":{"x0_mm":40,"y0_mm":60,"x1_mm":120,"y1_mm":60},"status":"live","server":"web","level":"propose","description":"New dimension on a sheet (paper mm). [logged in] — NO: Nytt mål på ark (papir-mm).","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"x0_mm":{"type":"number","title":"X0 Mm"},"y0_mm":{"type":"number","title":"Y0 Mm"},"x1_mm":{"type":"number","title":"X1 Mm"},"y1_mm":{"type":"number","title":"Y1 Mm"},"scale_n":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Scale N"},"axis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Axis"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"sep_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sep Mm"},"ext_gap_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ext Gap Mm"},"stroke_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stroke Mm"},"text_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Text Mm"}},"required":["name","x0_mm","y0_mm","x1_mm","y1_mm"]}},{"name":"edit_dimension","cat":"maal","no":"Endre ett mål på ark.","en":"Edit one dimension on a sheet.","method":"PATCH","path":"/sessions/{sid}/composer/sheets/{name}/cota/{index}","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Edit one dimension on a sheet. [logged in] — NO: Endre ett mål på ark.","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"index":{"type":"integer","title":"Index"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"sep_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sep Mm"},"ext_gap_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ext Gap Mm"},"ext_over_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ext Over Mm"},"x_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"X Mm"},"y_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y Mm"},"dx_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dx Mm"},"dy_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dy Mm"},"stroke_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stroke Mm"},"text_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Text Mm"},"text_pos":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Pos"},"units":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Units"},"decimals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Decimals"},"locked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Locked"}},"required":["name","index"]}},{"name":"delete_dimension","cat":"maal","no":"Slett ett mål på ark.","en":"Delete one dimension on a sheet.","method":"DELETE","path":"/sessions/{sid}/composer/sheets/{name}/cota/{index}","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Delete one dimension on a sheet. [logged in] — NO: Slett ett mål på ark.","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"index":{"type":"integer","title":"Index"},"x_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"X Mm"},"y_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y Mm"},"dx_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dx Mm"},"dy_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dy Mm"}},"required":["name","index"]}},{"name":"resuggest_dimensions","cat":"maal","no":"Lag foreslåtte mål på nytt (målkjeder) på arket.","en":"Regenerate the suggested dimension chains on the sheet.","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/cotas/resuggest","access":"login","effect":"write","mcp":"web","py":"tidy_cotas(sheet='…')","status":"live","server":"web","level":"propose","description":"Regenerate the suggested dimension chains on the sheet. [logged in] — NO: Lag foreslåtte mål på nytt (målkjeder) på arket.","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"}},"required":["name"]}},{"name":"check_sheet_dimensions","cat":"maal","no":"MÅLKONTROLL for én side (endrer ingenting): mål som ikke henger på veggene, måler feil lengde mot modellen (også «rotert 90°»), ligger inne i bygget, overlapper tekst/andre mål, står ulikt langt fra bygget eller blander enheter. Per funn: id, severity, index, what, fix. Terskler: innstillingene delivery.dim_wall_mm, delivery.dim_length_mm, delivery.dim_offset_spread_mm.","en":"DIMENSION CHECK for one sheet (changes nothing): dimensions that do not sit on the walls, measure a wrong length against the model (also «turned 90°»), lie inside the building, overlap text/other dimensions, stand at uneven distances from the building or mix units. Per finding: id, severity, index, what, fix. Thresholds: the settings delivery.dim_wall_mm, delivery.dim_length_mm, delivery.dim_offset_spread_mm.","method":"GET","path":"/sessions/{sid}/composer/sheets/{name}/cotas/check","access":"login","effect":"read","mcp":"web","py":"check_cotas(sheet='…')","params":{"type":"object","properties":{"name":{"type":"string"},"sid":{"type":"string"}},"required":["name"]},"status":"live","server":"web","level":"read","description":"DIMENSION CHECK for one sheet (changes nothing): dimensions that do not sit on the walls, measure a wrong length against the model (also «turned 90°»), lie inside the building, overlap text/other dimensions, stand at uneven distances from the building or mix units. Per finding: id, severity, index, what, fix. Thresholds: the settings delivery.dim_wall_mm, delivery.dim_length_mm, delivery.dim_offset_spread_mm. [logged in] — NO: MÅLKONTROLL for én side (endrer ingenting): mål som ikke henger på veggene, måler feil lengde mot modellen (også «rotert 90°»), ligger inne i bygget, overlapper tekst/andre mål, står ulikt langt fra bygget eller blander enheter. Per funn: id, severity, index, what, fix. Terskler: innstillingene delivery.dim_wall_mm, delivery.dim_length_mm, delivery.dim_offset_spread_mm.","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string"},"sid":{"type":"string"}},"required":["name"]}},{"name":"fix_sheet_dimensions","cat":"maal","no":"RETT målene på en side: fester målepunktene til veggene (totalmål til ytterlinjene) og flytter målelinjene like langt ut (offset_m meter i modellen; uten: medianen av dagens avstand). index = bare disse. Bare arket endres; svaret har kontrollen før og etter.","en":"FIX the dimensions of a sheet: snaps the measured points to the walls (overall dimensions to the outer lines) and moves the dimension lines out to the same distance (offset_m metres in the model; without: the median of today's distances). index = only these. Only the sheet changes; the answer has the check before and after.","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/cotas/fix","access":"login","effect":"write","mcp":"web","py":"fix_cotas(sheet='…', offset_m=1.0)","params":{"type":"object","properties":{"name":{"type":"string"},"sid":{"type":"string"},"offset_m":{"type":"number"},"snap":{"type":"boolean"},"index":{"type":"array","items":{"type":"integer"}}},"required":["name"]},"example":{"offset_m":1.0},"status":"live","server":"web","level":"propose","description":"FIX the dimensions of a sheet: snaps the measured points to the walls (overall dimensions to the outer lines) and moves the dimension lines out to the same distance (offset_m metres in the model; without: the median of today's distances). index = only these. Only the sheet changes; the answer has the check before and after. [logged in] — NO: RETT målene på en side: fester målepunktene til veggene (totalmål til ytterlinjene) og flytter målelinjene like langt ut (offset_m meter i modellen; uten: medianen av dagens avstand). index = bare disse. Bare arket endres; svaret har kontrollen før og etter.","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string"},"sid":{"type":"string"},"offset_m":{"type":"number"},"snap":{"type":"boolean"},"index":{"type":"array","items":{"type":"integer"}}},"required":["name"]}},{"name":"regenerate_sheet_dimensions","cat":"maal","no":"LAG MÅLENE PÅ NYTT på en side der bygget faktisk er tegnet: foreslåtte mål bygges fra modellen, egne mål flyttes til festepunktene sine. Bruk den FØRST når brukeren sier at målene er feil, står skjevt eller ved siden av bygget (ett kall, ett angresteg). Svaret har kontrollen før og etter.","en":"REGENERATE the dimensions of a sheet where the building is actually drawn: suggested dimensions are rebuilt from the model, own dimensions move to their anchor points. Use it FIRST when the user says the dimensions are wrong, skewed or beside the building (one call, one undo step). The answer has the check before and after.","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/cotas/regenerate","access":"login","effect":"write","mcp":"web","py":"regen_cotas(sheet='…')","params":{"type":"object","properties":{"name":{"type":"string"},"sid":{"type":"string"}},"required":["name"]},"status":"live","server":"web","level":"propose","description":"REGENERATE the dimensions of a sheet where the building is actually drawn: suggested dimensions are rebuilt from the model, own dimensions move to their anchor points. Use it FIRST when the user says the dimensions are wrong, skewed or beside the building (one call, one undo step). The answer has the check before and after. [logged in] — NO: LAG MÅLENE PÅ NYTT på en side der bygget faktisk er tegnet: foreslåtte mål bygges fra modellen, egne mål flyttes til festepunktene sine. Bruk den FØRST når brukeren sier at målene er feil, står skjevt eller ved siden av bygget (ett kall, ett angresteg). Svaret har kontrollen før og etter.","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string"},"sid":{"type":"string"}},"required":["name"]}},{"name":"sheet_dims","cat":"maal","no":"Slå mål på/av for én side i søknadssettet (dims=on|off|settings).","en":"Switch dimensions on/off for one page of the application set (dims=on|off|settings).","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/dims","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Switch dimensions on/off for one page of the application set (dims=on|off|settings). [logged in] — NO: Slå mål på/av for én side i søknadssettet (dims=on|off|settings).","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"dims":{"type":"string","default":"settings","title":"Dims"}},"required":["name"]}},{"name":"rebuild_sheet_terrain","cat":"maal","no":"Bygg terrenglinje og maske på fasade-/snittsiden på nytt (force=true tar også dine endringer).","en":"Rebuild the ground line and mask elements of an elevation/section page (force=true also resets your edits).","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/terrain","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Rebuild the ground line and mask elements of an elevation/section page (force=true also resets your edits). [logged in] — NO: Bygg terrenglinje og maske på fasade-/snittsiden på nytt (force=true tar også dine endringer).","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"force":{"type":"boolean","default":false,"title":"Force"}},"required":["name"]}},{"name":"clear_dimensions","cat":"maal","no":"Fjern mål på arket.","en":"Clear dimensions on the sheet.","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/cotas/clear","access":"login","effect":"write","py":"clear_cotas(sheet='…')","status":"live","server":"web","level":"propose","description":"Clear dimensions on the sheet. [logged in] — NO: Fjern mål på arket.","category_label":"Mål","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"suggested_only":{"type":"boolean","default":false,"title":"Suggested Only"}},"required":["name"]}},{"name":"dim_units","cat":"maal","no":"Måleenheter på ark (les/sett).","en":"Dimension units on sheets (get/set).","method":"GET","path":"/sessions/{sid}/composer/dim-units","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Dimension units on sheets (get/set). [logged in] — NO: Måleenheter på ark (les/sett).","category_label":"Mål","input_schema":{"type":"object","properties":{}}},{"name":"set_dim_units","cat":"maal","no":"Sett måleenheter på ark.","en":"Set dimension units on sheets.","method":"PUT","path":"/sessions/{sid}/composer/dim-units","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Set dimension units on sheets. [logged in] — NO: Sett måleenheter på ark.","category_label":"Mål","input_schema":{"type":"object","properties":{"units":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Units"},"decimals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Decimals"},"apply_all":{"type":"boolean","title":"Apply All","default":true},"show_on_dims":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show On Dims"},"show_legend":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Legend"}}}},{"name":"add_sheet_text","cat":"tekst","no":"Tekst på ark (papir-mm, Y opp fra arkets nederste kant: (x_mm, y_mm) er første linjes grunnlinje, flere linjer går nedover; size_pt i punkt; w_mm bryter linjene). Svar har warning hvis teksten går utenfor arket.","en":"Text on a sheet (paper mm, Y up from the bottom edge: (x_mm, y_mm) is the first baseline, more lines go down; size_pt in points; w_mm wraps the lines). The answer has warning when the text runs off the sheet.","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/text","access":"login","effect":"write","mcp":"web","example":{"x_mm":30,"y_mm":30,"text":"Notat"},"status":"live","server":"web","level":"propose","description":"Text on a sheet (paper mm, Y up from the bottom edge: (x_mm, y_mm) is the first baseline, more lines go down; size_pt in points; w_mm wraps the lines). The answer has warning when the text runs off the sheet. [logged in] — NO: Tekst på ark (papir-mm, Y opp fra arkets nederste kant: (x_mm, y_mm) er første linjes grunnlinje, flere linjer går nedover; size_pt i punkt; w_mm bryter linjene). Svar har warning hvis teksten går utenfor arket.","category_label":"Tekst og strek på ark","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"x_mm":{"type":"number","title":"X Mm"},"y_mm":{"type":"number","title":"Y Mm"},"text":{"type":"string","title":"Text","default":"Notat"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"size_pt":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Size Pt"},"page_scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Scope"},"w_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"W Mm"}},"required":["name","x_mm","y_mm"]}},{"name":"edit_sheet_text","cat":"tekst","no":"Endre tekst på ark.","en":"Edit text on a sheet.","method":"PATCH","path":"/sessions/{sid}/composer/sheets/{name}/text/{index}","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Edit text on a sheet. [logged in] — NO: Endre tekst på ark.","category_label":"Tekst og strek på ark","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"index":{"type":"integer","title":"Index"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"x_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"X Mm"},"y_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y Mm"},"size_pt":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Size Pt"},"family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Family"},"bold":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bold"},"italic":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Italic"},"underline":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Underline"},"weight":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weight"},"page_scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Scope"},"w_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"W Mm"}},"required":["name","index"]}},{"name":"add_sheet_line","cat":"tekst","no":"Strek/pil på ark (papir-mm, fra (x0_mm,y0_mm) til (x1_mm,y1_mm)). Kropp: x0_mm, y0_mm, x1_mm, y1_mm er påkrevd; valgfritt color, stroke_mm, dash solid|dashed|dotted|dashdot, kind linea|terreno|flecha, arrows none|start|end|both. Ukjent ark gir 404, manglende/ugyldige tall 422.","en":"Line/arrow on a sheet (paper mm, from (x0_mm,y0_mm) to (x1_mm,y1_mm)). Body: x0_mm, y0_mm, x1_mm, y1_mm are required; optional color, stroke_mm, dash solid|dashed|dotted|dashdot, kind linea|terreno|flecha, arrows none|start|end|both. Unknown sheet = 404, missing/invalid numbers = 422.","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/line","access":"login","effect":"write","params":{"type":"object","properties":{"name":{"type":"string"},"x0_mm":{"type":"number"},"y0_mm":{"type":"number"},"x1_mm":{"type":"number"},"y1_mm":{"type":"number"},"color":{"type":"string"},"stroke_mm":{"type":"number"},"dash":{"type":"string"},"kind":{"type":"string"},"arrows":{"type":"string"}},"required":["name","x0_mm","y0_mm","x1_mm","y1_mm"]},"example":{"x0_mm":40,"y0_mm":60,"x1_mm":120,"y1_mm":60,"arrows":"end"},"status":"live","server":"web","level":"propose","description":"Line/arrow on a sheet (paper mm, from (x0_mm,y0_mm) to (x1_mm,y1_mm)). Body: x0_mm, y0_mm, x1_mm, y1_mm are required; optional color, stroke_mm, dash solid|dashed|dotted|dashdot, kind linea|terreno|flecha, arrows none|start|end|both. Unknown sheet = 404, missing/invalid numbers = 422. [logged in] — NO: Strek/pil på ark (papir-mm, fra (x0_mm,y0_mm) til (x1_mm,y1_mm)). Kropp: x0_mm, y0_mm, x1_mm, y1_mm er påkrevd; valgfritt color, stroke_mm, dash solid|dashed|dotted|dashdot, kind linea|terreno|flecha, arrows none|start|end|both. Ukjent ark gir 404, manglende/ugyldige tall 422.","category_label":"Tekst og strek på ark","input_schema":{"type":"object","properties":{"name":{"type":"string"},"x0_mm":{"type":"number"},"y0_mm":{"type":"number"},"x1_mm":{"type":"number"},"y1_mm":{"type":"number"},"color":{"type":"string"},"stroke_mm":{"type":"number"},"dash":{"type":"string"},"kind":{"type":"string"},"arrows":{"type":"string"}},"required":["name","x0_mm","y0_mm","x1_mm","y1_mm"]}},{"name":"plan_labels","cat":"tekst","no":"Romnavn/etiketter på ark.","en":"Room names/labels on a sheet.","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/plan-labels","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Room names/labels on a sheet. [logged in] — NO: Romnavn/etiketter på ark.","category_label":"Tekst og strek på ark","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind","default":"areas"},"x_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"X Mm"},"y_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y Mm"}},"required":["name"]}},{"name":"opening_marks","cat":"tekst","no":"Merk dører/vinduer på ark.","en":"Mark doors/windows on a sheet.","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/opening-marks","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Mark doors/windows on a sheet. [logged in] — NO: Merk dører/vinduer på ark.","category_label":"Tekst og strek på ark","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"}},"required":["name"]}},{"name":"list_scenes","cat":"scene","no":"Lagrede scener (plan, fasader, snitt, 3D).","en":"Saved scenes (plan, facades, sections, 3D).","method":"GET","path":"/sessions/{sid}/scenes","access":"login","effect":"read","mcp":"web","py":"list_views()","status":"live","server":"web","level":"read","description":"Saved scenes (plan, facades, sections, 3D). [logged in] — NO: Lagrede scener (plan, fasader, snitt, 3D).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"capture_scene","cat":"scene","no":"Lagre nåværende kamera som scene.","en":"Save the current camera as a scene.","method":"POST","path":"/sessions/{sid}/scenes","access":"login","effect":"write","py":"save_view('Fasade sør')","status":"live","server":"web","level":"propose","description":"Save the current camera as a scene. [logged in] — NO: Lagre nåværende kamera som scene.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"name":{"type":"string","title":"Name","default":""},"camera":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Camera"},"construction":{"type":"boolean","title":"Construction","default":false}}}},{"name":"apply_scene","cat":"scene","no":"Gå til scene (indeks).","en":"Go to scene (index).","method":"POST","path":"/sessions/{sid}/scenes/{index}/apply","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Go to scene (index). [logged in] — NO: Gå til scene (indeks).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"index":{"type":"integer","title":"Index"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["index"]}},{"name":"delete_scene_index","cat":"scene","no":"Slett scene etter indeks.","en":"Delete scene by index.","method":"DELETE","path":"/sessions/{sid}/scenes/{index}","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Delete scene by index. [logged in] — NO: Slett scene etter indeks.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"index":{"type":"integer","title":"Index"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["index"]}},{"name":"patch_scene","cat":"scene","no":"Omdøp/flytt/oppdater scene. point_cloud=true/false: punktskyen av/på i DENNE scenen (de andre beholder sitt).","en":"Rename/reorder/update a scene. point_cloud=true/false: the point cloud on/off in THIS scene (the others keep theirs).","method":"PATCH","path":"/sessions/{sid}/scenes/{index}","access":"login","effect":"write","params":{"type":"object","properties":{"name":{"type":"string"},"in_menu":{"type":"boolean"},"recapture":{"type":"boolean"},"move":{"type":"integer"},"point_cloud":{"type":"boolean"},"index":{"type":"integer"},"sid":{"type":"string"}}},"status":"live","server":"web","level":"propose","description":"Rename/reorder/update a scene. point_cloud=true/false: the point cloud on/off in THIS scene (the others keep theirs). [logged in] — NO: Omdøp/flytt/oppdater scene. point_cloud=true/false: punktskyen av/på i DENNE scenen (de andre beholder sitt).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string"},"in_menu":{"type":"boolean"},"recapture":{"type":"boolean"},"move":{"type":"integer"},"point_cloud":{"type":"boolean"},"index":{"type":"integer"},"sid":{"type":"string"}}}},{"name":"bake_doors","cat":"scene","no":"Lagre dørstilling (åpen/lukket) i scenen.","en":"Store door state (open/closed) in the scene.","method":"POST","path":"/sessions/{sid}/scenes/{index}/bake_doors","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Store door state (open/closed) in the scene. [logged in] — NO: Lagre dørstilling (åpen/lukket) i scenen.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"index":{"type":"integer","title":"Index"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},"required":["index"]}},{"name":"ensure_standard_scenes","cat":"scene","no":"Standard scener + arkpakke for bygningen.","en":"Standard scenes + sheet pack for the building.","method":"POST","path":"/sessions/{sid}/scenes/ensure-building-standard","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Standard scenes + sheet pack for the building. [logged in] — NO: Standard scener + arkpakke for bygningen.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"land_3d","cat":"scene","no":"3D-scenen 3D-knappen lander i (lager 3D-Bygning med/uten terreng ved behov).","en":"The 3D scene the 3D button lands in (makes 3D-Bygning with/without terrain when missing).","method":"POST","path":"/sessions/{sid}/scenes/land-3d","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"The 3D scene the 3D button lands in (makes 3D-Bygning with/without terrain when missing). [logged in] — NO: 3D-scenen 3D-knappen lander i (lager 3D-Bygning med/uten terreng ved behov).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"plan_scene","cat":"scene","no":"Planscene for en etasje.","en":"Plan scene for a storey.","method":"POST","path":"/sessions/{sid}/composer/plan_scene","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Plan scene for a storey. [logged in] — NO: Planscene for en etasje.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"storey":{"type":"string","title":"Storey","default":""},"camera":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Camera"}}}},{"name":"enter_plan","cat":"scene","no":"Gå inn i planen i ett kall: etasjer, lag (andre etasjer og tak skjult), planscene, scener, dører åpne, plandokument + stil, enheter og eventuelt verktøy.","en":"Enter the floor plan in one call: storeys, layers (other storeys and roof hidden), plan scene, scenes, doors open, plan document + style, units and optionally a tool.","method":"POST","path":"/sessions/{sid}/enter_plan","access":"login","effect":"write","example":{"hide_layers":["Roof","Tak"],"preset":"presentasjon","tool":"select"},"status":"live","server":"web","level":"propose","description":"Enter the floor plan in one call: storeys, layers (other storeys and roof hidden), plan scene, scenes, doors open, plan document + style, units and optionally a tool. [logged in] — NO: Gå inn i planen i ett kall: etasjer, lag (andre etasjer og tak skjult), planscene, scener, dører åpne, plandokument + stil, enheter og eventuelt verktøy.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"},"building_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Id"},"camera":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Camera"},"hide_layers":{"items":{"type":"string"},"type":"array","title":"Hide Layers"},"filter_layers":{"type":"boolean","title":"Filter Layers","default":true},"recapture":{"type":"boolean","title":"Recapture","default":true},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset"},"scale_n":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Scale N","default":50},"tool":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool"}}}},{"name":"list_sheets","cat":"scene","no":"Ark (navn, papir, visninger). Store sett: include_cotas=false&include_guides=false (kort svar), name_contains=/sheet_no=, fields=sheet_no,name,scene_name,scale_n.","en":"Sheets (name, paper, viewports). Large sets: include_cotas=false&include_guides=false (brief), name_contains=/sheet_no=, fields=sheet_no,name,scene_name,scale_n.","method":"GET","path":"/sessions/{sid}/composer/sheets","access":"login","effect":"read","mcp":"web","py":"list_sheets()","params":{"type":"object","properties":{"name_contains":{"type":"string"},"sheet_no":{"type":"string"},"include_cotas":{"type":"boolean"},"include_guides":{"type":"boolean"},"fields":{"type":"string"},"sid":{"type":"string"}}},"example":{"include_cotas":false,"include_guides":false,"fields":"sheet_no,name,scene_name,scale_n"},"status":"live","server":"web","level":"read","description":"Sheets (name, paper, viewports). Large sets: include_cotas=false&include_guides=false (brief), name_contains=/sheet_no=, fields=sheet_no,name,scene_name,scale_n. [logged in] — NO: Ark (navn, papir, visninger). Store sett: include_cotas=false&include_guides=false (kort svar), name_contains=/sheet_no=, fields=sheet_no,name,scene_name,scale_n.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name_contains":{"type":"string"},"sheet_no":{"type":"string"},"include_cotas":{"type":"boolean"},"include_guides":{"type":"boolean"},"fields":{"type":"string"},"sid":{"type":"string"}}}},{"name":"create_sheet","cat":"scene","no":"Nytt ark.","en":"New sheet.","method":"POST","path":"/sessions/{sid}/composer/sheets","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"New sheet. [logged in] — NO: Nytt ark.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"patch_sheet","cat":"scene","no":"Endre ark (tittel, nummer …).","en":"Edit a sheet (title, number ...).","method":"PATCH","path":"/sessions/{sid}/composer/sheets/{name}","access":"login","effect":"write","py":"rename_sheet('Tegninger', title='…')","status":"live","server":"web","level":"propose","description":"Edit a sheet (title, number ...). [logged in] — NO: Endre ark (tittel, nummer …).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"sheet_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheet No"}},"required":["name"]}},{"name":"sheet_paper","cat":"scene","no":"Papirformat for ark.","en":"Paper size of a sheet.","method":"PUT","path":"/sessions/{sid}/composer/sheets/{name}/paper","access":"login","effect":"write","py":"set_paper('A101', 'A3')","status":"live","server":"web","level":"propose","description":"Paper size of a sheet. [logged in] — NO: Papirformat for ark.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"paper":{"type":"string","title":"Paper","default":"A3"},"landscape":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Landscape"}},"required":["name"]}},{"name":"sheet_title_pos","cat":"scene","no":"Plassering av tittelfeltet på ett ark: right, bottom, none eller auto.","en":"Title block placement of one sheet: right, bottom, none or auto.","method":"PUT","path":"/sessions/{sid}/composer/sheets/{name}/title-pos","access":"login","effect":"write","py":"set_title_pos('A101', 'bottom')","status":"live","server":"web","level":"propose","description":"Title block placement of one sheet: right, bottom, none or auto. [logged in] — NO: Plassering av tittelfeltet på ett ark: right, bottom, none eller auto.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"pos":{"type":"string","title":"Pos","default":"auto"}},"required":["name"]}},{"name":"sheet_document","cat":"scene","no":"Arket som dokument (elementer i papir-mm).","en":"The sheet as a document (items in paper mm).","method":"GET","path":"/sessions/{sid}/composer/sheets/{name}/document","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"The sheet as a document (items in paper mm). [logged in] — NO: Arket som dokument (elementer i papir-mm).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"draft":{"type":"boolean","default":false,"title":"Draft"}},"required":["name"]}},{"name":"sheet_svg","cat":"scene","no":"Arket som SVG.","en":"The sheet as SVG.","method":"GET","path":"/sessions/{sid}/composer/sheet.svg","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"The sheet as SVG. [logged in] — NO: Arket som SVG.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"base":{"type":"boolean","default":false,"title":"Base"}},"required":["name"]}},{"name":"add_viewport","cat":"scene","no":"Ny visning (scene) på et ark.","en":"New viewport (scene) on a sheet.","method":"POST","path":"/sessions/{sid}/composer/sheets/{name}/frame","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"New viewport (scene) on a sheet. [logged in] — NO: Ny visning (scene) på et ark.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"scene_name":{"type":"string","title":"Scene Name"},"scale_n":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Scale N"},"x_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"X Mm"},"y_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y Mm"},"w_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"W Mm"},"h_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"H Mm"}},"required":["name","scene_name"]}},{"name":"composer_add_page","cat":"scene","no":"Ny side i arksettet.","en":"New page in the sheet set.","method":"POST","path":"/sessions/{sid}/composer/pages","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"New page in the sheet set. [logged in] — NO: Ny side i arksettet.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"paper":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paper"},"landscape":{"type":"boolean","title":"Landscape","default":true},"scene_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Name"},"scale_n":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Scale N"},"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After"}}}},{"name":"composer_delete_page","cat":"scene","no":"Slett side.","en":"Delete a page.","method":"DELETE","path":"/sessions/{sid}/composer/pages/{name}","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Delete a page. [logged in] — NO: Slett side.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"}},"required":["name"]}},{"name":"duplicate_page","cat":"scene","no":"Dupliser side.","en":"Duplicate a page.","method":"POST","path":"/sessions/{sid}/composer/pages/{name}/duplicate","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Duplicate a page. [logged in] — NO: Dupliser side.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"}},"required":["name"]}},{"name":"list_layout_profiles","cat":"scene","no":"Firmaprofiler for tegningshodet: innebygde (tegnebua, tom) + mine + teamets. Velg id og bruk apply_layout_profile.","en":"Firm profiles for the title strip: builtin (tegnebua, tom) + mine + the team's. Pick an id and use apply_layout_profile.","method":"GET","path":"/layout/profiles","access":"public","effect":"read","mcp":"web","status":"live","server":"web","description":"Firm profiles for the title strip: builtin (tegnebua, tom) + mine + the team's. Pick an id and use apply_layout_profile. [open, no login] — NO: Firmaprofiler for tegningshodet: innebygde (tegnebua, tom) + mine + teamets. Velg id og bruk apply_layout_profile.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{}}},{"name":"get_layout_profile","cat":"scene","no":"Én firmaprofil med alle felt.","en":"One firm profile with all fields.","method":"GET","path":"/layout/profiles/{profile_id}","access":"public","effect":"read","status":"live","server":"web","description":"One firm profile with all fields. [open, no login] — NO: Én firmaprofil med alle felt.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"profile_id":{"type":"string","title":"Profile Id"}},"required":["profile_id"]}},{"name":"save_layout_profile","cat":"scene","no":"Lagre en firmaprofil (firm, web, address, poststed, email, tegnet_av, papir A4-A0, mal_i m|cm|mm, strip_order, logo_brand, logo_data_url, lang) for meg (scope=user) eller teamet (scope=team + team_id). Samme navn oppdaterer.","en":"Save a firm profile (firm, web, address, poststed, email, tegnet_av, papir A4-A0, mal_i m|cm|mm, strip_order, logo_brand, logo_data_url, lang) for me (scope=user) or the team (scope=team + team_id). Same name updates it.","method":"POST","path":"/layout/profiles","access":"login","effect":"account","mcp":"web","example":{"name":"Min Snekker AS","firm":"MIN SNEKKER AS","web":"www.minsnekker.no","address":"Veien 1","poststed":"0150 OSLO","email":"post@minsnekker.no","tegnet_av":"Ola Nordmann","papir":"A3","scope":"user"},"status":"live","server":"web","level":"owner","description":"Save a firm profile (firm, web, address, poststed, email, tegnet_av, papir A4-A0, mal_i m|cm|mm, strip_order, logo_brand, logo_data_url, lang) for me (scope=user) or the team (scope=team + team_id). Same name updates it. [logged in] — NO: Lagre en firmaprofil (firm, web, address, poststed, email, tegnet_av, papir A4-A0, mal_i m|cm|mm, strip_order, logo_brand, logo_data_url, lang) for meg (scope=user) eller teamet (scope=team + team_id). Samme navn oppdaterer.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"title":"Name"},"firm":{"type":"string","title":"Firm","default":""},"web":{"type":"string","title":"Web","default":""},"address":{"type":"string","title":"Address","default":""},"poststed":{"type":"string","title":"Poststed","default":""},"email":{"type":"string","title":"Email","default":""},"tegnet_av":{"type":"string","title":"Tegnet Av","default":""},"papir":{"type":"string","title":"Papir","default":"A3"},"mal_i":{"type":"string","title":"Mal I","default":"m"},"strip_order":{"type":"string","title":"Strip Order","default":"firm_first"},"logo_brand":{"type":"string","title":"Logo Brand","default":""},"logo_data_url":{"type":"string","title":"Logo Data Url","default":""},"template":{"type":"string","title":"Template","default":"building"},"sheet_no_style":{"type":"string","title":"Sheet No Style","default":""},"logo_vector":{"title":"Logo Vector"},"lang":{"type":"string","title":"Lang","default":"nb"},"scope":{"type":"string","title":"Scope","description":"user | team","default":"user"},"team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Id"}},"required":["name"]}},{"name":"delete_layout_profile","cat":"scene","no":"Slett en egen firmaprofil (de innebygde kan ikke slettes).","en":"Delete one of your own firm profiles (builtin ones cannot be deleted).","method":"DELETE","path":"/layout/profiles/{profile_id}","access":"login","effect":"account","mcp":"web","status":"live","server":"web","level":"owner","description":"Delete one of your own firm profiles (builtin ones cannot be deleted). [logged in] — NO: Slett en egen firmaprofil (de innebygde kan ikke slettes).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"profile_id":{"type":"string","title":"Profile Id"}},"required":["profile_id"]}},{"name":"extract_vector_logo","cat":"scene","no":"Hent en linjelogo (vektor, ikke bilde) fra et område av en PDF-side: pdf_base64, page (0-basert), region_mm [x0,y0,x1,y1] fra øverste venstre hjørne (standard: nederste venstre 75 x 45 mm). Lagre svaret som logo_vector i en profil eller set_sheet_chrome.","en":"Extract a line logo (vector, not an image) from a region of a PDF page: pdf_base64, page (0-based), region_mm [x0,y0,x1,y1] from the top-left (default: bottom-left 75 x 45 mm). Save the result as logo_vector in a profile or set_sheet_chrome.","method":"POST","path":"/layout/logo/extract","access":"login","effect":"read","mcp":"web","example":{"pdf_base64":"<base64>","page":0,"region_mm":[0,165,75,210]},"status":"live","server":"web","level":"read","description":"Extract a line logo (vector, not an image) from a region of a PDF page: pdf_base64, page (0-based), region_mm [x0,y0,x1,y1] from the top-left (default: bottom-left 75 x 45 mm). Save the result as logo_vector in a profile or set_sheet_chrome. [logged in] — NO: Hent en linjelogo (vektor, ikke bilde) fra et område av en PDF-side: pdf_base64, page (0-basert), region_mm [x0,y0,x1,y1] fra øverste venstre hjørne (standard: nederste venstre 75 x 45 mm). Lagre svaret som logo_vector i en profil eller set_sheet_chrome.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"pdf_base64":{"type":"string","title":"Pdf Base64"},"page":{"type":"integer","title":"Page","default":0},"region_mm":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Region Mm"}},"required":["pdf_base64"]}},{"name":"seed_layout_profile_from_pdf","cat":"scene","no":"Teamadmin: lag/oppdater teamets firmaprofil fra firmaets egen LayOut-PDF (mal layout-stripe, E-1-numre, linjelogo, firmafelt lest fra PDF-en). dry_run viser profilen uten å lagre.","en":"Team admin: create/update the team's firm profile from the firm's own LayOut PDF (template layout-stripe, E-1 numbers, line logo, firm fields read from the PDF). dry_run shows the profile without saving.","method":"POST","path":"/layout/profiles/seed-from-pdf","access":"login","effect":"account","mcp":"web","example":{"team_id":"<team-id>","pdf_base64":"<base64>","name":"Firmanavn AS","dry_run":true},"status":"live","server":"web","level":"owner","description":"Team admin: create/update the team's firm profile from the firm's own LayOut PDF (template layout-stripe, E-1 numbers, line logo, firm fields read from the PDF). dry_run shows the profile without saving. [logged in] — NO: Teamadmin: lag/oppdater teamets firmaprofil fra firmaets egen LayOut-PDF (mal layout-stripe, E-1-numre, linjelogo, firmafelt lest fra PDF-en). dry_run viser profilen uten å lagre.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"team_id":{"type":"string","title":"Team Id"},"pdf_base64":{"type":"string","title":"Pdf Base64"},"name":{"type":"string","maxLength":80,"title":"Name","default":""},"page":{"type":"integer","title":"Page","default":0},"region_mm":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Region Mm"},"overrides":{"additionalProperties":{"type":"string"},"type":"object","title":"Overrides"},"lang":{"type":"string","title":"Lang","default":"nb"},"dry_run":{"type":"boolean","title":"Dry Run","default":false}},"required":["team_id","pdf_base64"]}},{"name":"apply_layout_profile","cat":"scene","no":"Bruk en firmaprofil i prosjektet: firmanavn, adresse, web, e-post, tegnet av, logo, papir og dokumentspråk settes på alle sider.","en":"Use a firm profile in the project: firm name, address, web, e-mail, drawn by, logo, paper and document language on every page.","method":"POST","path":"/sessions/{sid}/composer/chrome/profile","access":"login","effect":"write","mcp":"web","example":{"profile_id":"standard"},"status":"live","server":"web","level":"propose","description":"Use a firm profile in the project: firm name, address, web, e-mail, drawn by, logo, paper and document language on every page. [logged in] — NO: Bruk en firmaprofil i prosjektet: firmanavn, adresse, web, e-post, tegnet av, logo, papir og dokumentspråk settes på alle sider.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"profile_id":{"type":"string","title":"Profile Id"},"set_language":{"type":"boolean","title":"Set Language","default":true}},"required":["profile_id"]}},{"name":"get_sheet_chrome","cat":"scene","no":"Tegningshodet (firma, adresse, logo, prosjektfelt) som gjelder alle sider.","en":"The title strip fields (firm, address, logo, project fields) that apply to every page.","method":"GET","path":"/sessions/{sid}/composer/chrome","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"The title strip fields (firm, address, logo, project fields) that apply to every page. [logged in] — NO: Tegningshodet (firma, adresse, logo, prosjektfelt) som gjelder alle sider.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{}}},{"name":"set_sheet_chrome","cat":"scene","no":"Sett felt i tegningshodet: firm, web, address, poststed, email, tiltakadresse, tiltaksted, tiltakshaver, tegnet_av, versjon, dato, gnr_bnr_snr, project_name, logo_data_url (data:image, maks ~300 KB; SVG tegnes som linjer), logo_vector (linjelogo, JSON/SVG), mal_i, bg_style, bg_grid_mm, template (building | layout-stripe = LayOut-tittelfelt), sheet_no_style (hyphen = E-1 | plain = E1).","en":"Set title-strip fields: firm, web, address, poststed, email, tiltakadresse, tiltaksted, tiltakshaver, tegnet_av, versjon, dato, gnr_bnr_snr, project_name, logo_data_url (data:image, max ~300 KB; SVG is drawn as lines), logo_vector (line logo, JSON/SVG), mal_i, bg_style, bg_grid_mm, template (building | layout-stripe = LayOut title layout), sheet_no_style (hyphen = E-1 | plain = E1).","method":"PUT","path":"/sessions/{sid}/composer/chrome","access":"login","effect":"write","mcp":"web","example":{"tiltakshaver":"Familien Hansen","gnr_bnr_snr":"12/34/0"},"status":"live","server":"web","level":"propose","description":"Set title-strip fields: firm, web, address, poststed, email, tiltakadresse, tiltaksted, tiltakshaver, tegnet_av, versjon, dato, gnr_bnr_snr, project_name, logo_data_url (data:image, max ~300 KB; SVG is drawn as lines), logo_vector (line logo, JSON/SVG), mal_i, bg_style, bg_grid_mm, template (building | layout-stripe = LayOut title layout), sheet_no_style (hyphen = E-1 | plain = E1). [logged in] — NO: Sett felt i tegningshodet: firm, web, address, poststed, email, tiltakadresse, tiltaksted, tiltakshaver, tegnet_av, versjon, dato, gnr_bnr_snr, project_name, logo_data_url (data:image, maks ~300 KB; SVG tegnes som linjer), logo_vector (linjelogo, JSON/SVG), mal_i, bg_style, bg_grid_mm, template (building | layout-stripe = LayOut-tittelfelt), sheet_no_style (hyphen = E-1 | plain = E1).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"firm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firm"},"web":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Web"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"poststed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Poststed"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"tiltakadresse":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiltakadresse"},"tiltaksted":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiltaksted"},"tiltakshaver":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiltakshaver"},"tegnet_av":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tegnet Av"},"versjon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Versjon"},"dato":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dato"},"gnr_bnr_snr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gnr Bnr Snr"},"project_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Name"},"logo_data_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Data Url"},"mal_i":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mal I"},"papir":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Papir"},"strip_order":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strip Order"},"strip_labels":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strip Labels"},"logo_brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Brand"},"bg_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bg Style"},"bg_grid_mm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bg Grid Mm"},"template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template"},"logo_vector":{"title":"Logo Vector"},"sheet_no_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheet No Style"},"field_pos":{"anyOf":[{"additionalProperties":{"additionalProperties":{"type":"number"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Field Pos"}}}},{"name":"set_sheet_overlays","cat":"scene","no":"Vis/skjul overlegg på en side: nivel (koter), pitch (takvinkel), norte, sheet_no, firm.","en":"Show/hide overlays on a page: nivel (level marks), pitch (roof angle), norte, sheet_no, firm.","method":"PATCH","path":"/sessions/{sid}/composer/sheets/{name}/overlays","access":"login","effect":"write","mcp":"web","example":{"norte":false},"status":"live","server":"web","level":"propose","description":"Show/hide overlays on a page: nivel (level marks), pitch (roof angle), norte, sheet_no, firm. [logged in] — NO: Vis/skjul overlegg på en side: nivel (koter), pitch (takvinkel), norte, sheet_no, firm.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"nivel":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Nivel"},"pitch":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pitch"},"norte":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Norte"},"sheet_no":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sheet No"},"firm":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Firm"}},"required":["name"]}},{"name":"edit_north_arrow","cat":"scene","no":"Nordpil på en side: posisjon, størrelse og vinkel (x_mm, y_mm, size_mm, angle_deg).","en":"North arrow on a page: position, size and angle (x_mm, y_mm, size_mm, angle_deg).","method":"PATCH","path":"/sessions/{sid}/composer/sheets/{name}/norte/{index}","access":"login","effect":"write","mcp":"web","example":{"angle_deg":15,"size_mm":14},"status":"live","server":"web","level":"propose","description":"North arrow on a page: position, size and angle (x_mm, y_mm, size_mm, angle_deg). [logged in] — NO: Nordpil på en side: posisjon, størrelse og vinkel (x_mm, y_mm, size_mm, angle_deg).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"index":{"type":"integer","title":"Index"},"x_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"X Mm"},"y_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y Mm"},"angle_deg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Angle Deg"},"size_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Size Mm"}},"required":["name","index"]}},{"name":"list_page_layers","cat":"scene","no":"Sidelag (som LayOut-lag): navn på lagene og hvilke som er på hvilken side.","en":"Page layers (like LayOut layers): the layer names and which are on which page.","method":"GET","path":"/sessions/{sid}/composer/page-layers","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Page layers (like LayOut layers): the layer names and which are on which page. [logged in] — NO: Sidelag (som LayOut-lag): navn på lagene og hvilke som er på hvilken side.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{}}},{"name":"set_sheet_page_layers","cat":"scene","no":"Hvilke sidelag en side viser (layers: liste med lagnavn).","en":"Which page layers a page shows (layers: list of layer names).","method":"PUT","path":"/sessions/{sid}/composer/sheets/{name}/page-layers","access":"login","effect":"write","mcp":"web","example":{"layers":["Shared"]},"status":"live","server":"web","level":"propose","description":"Which page layers a page shows (layers: list of layer names). [logged in] — NO: Hvilke sidelag en side viser (layers: liste med lagnavn).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"layers":{"items":{"type":"string"},"type":"array","title":"Layers","default":[]}},"required":["name"]}},{"name":"set_sheet_annotations","cat":"scene","no":"Kotemerker og takvinkel på en side: level {side auto|right|left|both, gap_mm, size_mm, show{storeys,terrain,roof}}, roof_angle {size_mm}, reset positions|all.","en":"Level marks and roof angle on a page: level {side auto|right|left|both, gap_mm, size_mm, show{storeys,terrain,roof}}, roof_angle {size_mm}, reset positions|all.","method":"PATCH","path":"/sessions/{sid}/composer/sheets/{name}/annotations","access":"login","effect":"write","mcp":"web","example":{"level":{"side":"both","size_mm":3}},"status":"live","server":"web","level":"propose","description":"Level marks and roof angle on a page: level {side auto|right|left|both, gap_mm, size_mm, show{storeys,terrain,roof}}, roof_angle {size_mm}, reset positions|all. [logged in] — NO: Kotemerker og takvinkel på en side: level {side auto|right|left|both, gap_mm, size_mm, show{storeys,terrain,roof}}, roof_angle {size_mm}, reset positions|all.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"level":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Level"},"roof_angle":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Roof Angle"},"move":{"anyOf":[{"properties":{"view":{"type":"string","title":"View"},"side":{"type":"string","title":"Side","default":"right"},"dx_mm":{"type":"number","title":"Dx Mm","default":0.0},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},"type":"object","required":["view"],"title":"SheetAnnotMove","description":"Drag of a level-mark column (or one mark with ``key``) along x."},{"type":"null"}]},"reset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reset"}},"required":["name"]}},{"name":"list_sheet_annots","cat":"tekst","no":"Tekster og streker (med indeks) på en side, og sidelagene.","en":"Texts and lines (with index) on a page, and its page layers.","method":"GET","path":"/sessions/{sid}/composer/sheets/{name}/annots","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Texts and lines (with index) on a page, and its page layers. [logged in] — NO: Tekster og streker (med indeks) på en side, og sidelagene.","category_label":"Tekst og strek på ark","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"}},"required":["name"]}},{"name":"delete_sheet_annot","cat":"tekst","no":"Slett én tekst eller strek på en side (kind text|shape, index fra list_sheet_annots).","en":"Delete one text or line on a page (kind text|shape, index from list_sheet_annots).","method":"DELETE","path":"/sessions/{sid}/composer/sheets/{name}/annot/{kind}/{index}","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Delete one text or line on a page (kind text|shape, index from list_sheet_annots). [logged in] — NO: Slett én tekst eller strek på en side (kind text|shape, index fra list_sheet_annots).","category_label":"Tekst og strek på ark","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"index":{"type":"integer","title":"Index"}},"required":["name","kind","index"]}},{"name":"edit_sheet_shape","cat":"tekst","no":"Endre en strek/pil/figur på en side: x_mm, y_mm, w_mm, h_mm, pts_mm, color, stroke_mm, dash solid|dashed|dotted|dashdot, arrows none|start|end|both.","en":"Edit a line/arrow/shape on a page: x_mm, y_mm, w_mm, h_mm, pts_mm, color, stroke_mm, dash solid|dashed|dotted|dashdot, arrows none|start|end|both.","method":"PATCH","path":"/sessions/{sid}/composer/sheets/{name}/shape/{index}","access":"login","effect":"write","mcp":"web","example":{"dash":"dashed","arrows":"end"},"status":"live","server":"web","level":"propose","description":"Edit a line/arrow/shape on a page: x_mm, y_mm, w_mm, h_mm, pts_mm, color, stroke_mm, dash solid|dashed|dotted|dashdot, arrows none|start|end|both. [logged in] — NO: Endre en strek/pil/figur på en side: x_mm, y_mm, w_mm, h_mm, pts_mm, color, stroke_mm, dash solid|dashed|dotted|dashdot, arrows none|start|end|both.","category_label":"Tekst og strek på ark","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"index":{"type":"integer","title":"Index"},"x_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"X Mm"},"y_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y Mm"},"w_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"W Mm"},"h_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"H Mm"},"pts_mm":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Pts Mm"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"stroke_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stroke Mm"},"dash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dash"},"arrows":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arrows"}},"required":["name","index"]}},{"name":"edit_viewport","cat":"scene","no":"Endre en visning (viewport) på et ark: scale_n (1:N), x_mm, y_mm, w_mm, h_mm, locked, kamera (cam_yaw, cam_pitch, cam_distance, cam_fov, cam_target, clear_camera).","en":"Edit a viewport on a sheet: scale_n (1:N), x_mm, y_mm, w_mm, h_mm, locked, camera (cam_yaw, cam_pitch, cam_distance, cam_fov, cam_target, clear_camera).","method":"PATCH","path":"/sessions/{sid}/composer/sheets/{name}/frame/{index}","access":"login","effect":"write","mcp":"web","example":{"scale_n":100,"x_mm":20,"y_mm":20},"status":"live","server":"web","level":"propose","description":"Edit a viewport on a sheet: scale_n (1:N), x_mm, y_mm, w_mm, h_mm, locked, camera (cam_yaw, cam_pitch, cam_distance, cam_fov, cam_target, clear_camera). [logged in] — NO: Endre en visning (viewport) på et ark: scale_n (1:N), x_mm, y_mm, w_mm, h_mm, locked, kamera (cam_yaw, cam_pitch, cam_distance, cam_fov, cam_target, clear_camera).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"index":{"type":"integer","title":"Index"},"scale_n":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Scale N"},"x_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"X Mm"},"y_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y Mm"},"w_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"W Mm"},"h_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"H Mm"},"locked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Locked"},"cam_yaw":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cam Yaw"},"cam_pitch":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cam Pitch"},"cam_distance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cam Distance"},"cam_fov":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cam Fov"},"cam_target":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Cam Target"},"clear_camera":{"type":"boolean","title":"Clear Camera","default":false}},"required":["name","index"]}},{"name":"lock_page","cat":"scene","no":"Lås/lås opp en side så «Bygg sett på nytt» ikke erstatter den.","en":"Lock/unlock a page so «Rebuild set» does not replace it.","method":"PUT","path":"/sessions/{sid}/composer/pages/{name}/lock","access":"login","effect":"write","example":{"locked":true},"status":"live","server":"web","level":"propose","description":"Lock/unlock a page so «Rebuild set» does not replace it. [logged in] — NO: Lås/lås opp en side så «Bygg sett på nytt» ikke erstatter den.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string","title":"Name"},"locked":{"type":"boolean","title":"Locked","default":true}},"required":["name"]}},{"name":"sheet_index","cat":"scene","no":"Tegningsliste-ark.","en":"Sheet index sheet.","method":"POST","path":"/sessions/{sid}/composer/sheet_index","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Sheet index sheet. [logged in] — NO: Tegningsliste-ark.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"sheet_qa","cat":"scene","no":"Kvalitetssjekk av arkene.","en":"Quality check of the sheets.","method":"GET","path":"/sessions/{sid}/composer/qa","access":"login","effect":"read","py":"verify_delivery()","status":"live","server":"web","level":"read","description":"Quality check of the sheets. [logged in] — NO: Kvalitetssjekk av arkene.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"build_drawing_set","cat":"scene","no":"Nytt tegnesett fra scratch (BuildChat).","en":"New drawing set from scratch (BuildChat).","access":"login","effect":"read","py":"build_drawing_set(replace=False)","status":"live","server":"buildchat","description":"New drawing set from scratch (BuildChat). [logged in] — NO: Nytt tegnesett fra scratch (BuildChat).","category_label":"Scene, ark og side"},{"name":"list_drawings","cat":"scene","no":"Scener (og arkene som viser dem), ark/sider, hva «+» kan legge til.","en":"Scenes (and the sheets that show them), sheets/pages, what «+» can add.","method":"GET","path":"/sessions/{sid}/agent/drawings","access":"share","effect":"read","mcp":"web","py":"list_drawings()","ops":["list_drawings"],"status":"live","server":"web","level":"read","description":"Scenes (and the sheets that show them), sheets/pages, what «+» can add. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Scener (og arkene som viser dem), ark/sider, hva «+» kan legge til.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"add_scene","cat":"scene","no":"Ny scene: kind plan|fasade|snitt|situasjon|tak|detalj|3d|ringmur (fundamentplan 2D-Ringmur). kind='3d' med storey='4. etg' (eller 'øverste') lager «3D-<etasje>»: en 3D-scene filtrert til ÉN etasje (de andre etasjene skjules i selve scenen, aldri globalt; tak og terreng av som standard, show_roof/show_terrain=true tar dem med). Foreslå ALDRI en global stilregel for å vise én etasje. 2D-<etasje> og 3D-<etasje> kan ligge på samme ark (add_view). name (og/eller copy_from = en eksisterende scene) lager ALLTID en NY scene med det navnet (kopi av copy_from, ellers av standardscenen av den typen); standardscenen røres ikke.","en":"Add a scene: kind plan|fasade|snitt|situasjon|tak|detalj|3d|ringmur (foundation plan 2D-Ringmur). kind='3d' with storey='4. etg' (or 'øverste') makes «3D-<storey>»: a 3D scene filtered to ONE storey (the other storeys are hidden in that scene only, never globally; roof and terrain off by default, show_roof/show_terrain=true keep them). NEVER suggest a global style rule to show one storey. 2D-<storey> and 3D-<storey> can sit on one sheet (add_view). name (and/or copy_from = an existing scene) ALWAYS makes a NEW scene with that name (a copy of copy_from, else of the standard scene of that kind); the standard scene is left alone.","method":"POST","path":"/sessions/{sid}/agent/drawings/add_scene","access":"share","effect":"write","mcp":"web","py":"add_scene('3d', storey='4. etg')","ops":["add_scene"],"params":{"type":"object","properties":{"kind":{"type":"string"},"storey":{"type":"string"},"side":{"type":"string"},"name":{"type":"string"},"copy_from":{"type":"string"},"show_terrain":{"type":"boolean"},"show_roof":{"type":"boolean"},"discipline":{"type":"string"},"sid":{"type":"string"}},"required":["kind"]},"example":{"kind":"3d","storey":"4. etg"},"status":"live","server":"web","level":"propose","description":"Add a scene: kind plan|fasade|snitt|situasjon|tak|detalj|3d|ringmur (foundation plan 2D-Ringmur). kind='3d' with storey='4. etg' (or 'øverste') makes «3D-<storey>»: a 3D scene filtered to ONE storey (the other storeys are hidden in that scene only, never globally; roof and terrain off by default, show_roof/show_terrain=true keep them). NEVER suggest a global style rule to show one storey. 2D-<storey> and 3D-<storey> can sit on one sheet (add_view). name (and/or copy_from = an existing scene) ALWAYS makes a NEW scene with that name (a copy of copy_from, else of the standard scene of that kind); the standard scene is left alone. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Ny scene: kind plan|fasade|snitt|situasjon|tak|detalj|3d|ringmur (fundamentplan 2D-Ringmur). kind='3d' med storey='4. etg' (eller 'øverste') lager «3D-<etasje>»: en 3D-scene filtrert til ÉN etasje (de andre etasjene skjules i selve scenen, aldri globalt; tak og terreng av som standard, show_roof/show_terrain=true tar dem med). Foreslå ALDRI en global stilregel for å vise én etasje. 2D-<etasje> og 3D-<etasje> kan ligge på samme ark (add_view). name (og/eller copy_from = en eksisterende scene) lager ALLTID en NY scene med det navnet (kopi av copy_from, ellers av standardscenen av den typen); standardscenen røres ikke.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"kind":{"type":"string"},"storey":{"type":"string"},"side":{"type":"string"},"name":{"type":"string"},"copy_from":{"type":"string"},"show_terrain":{"type":"boolean"},"show_roof":{"type":"boolean"},"discipline":{"type":"string"},"sid":{"type":"string"}},"required":["kind"]}},{"name":"set_scene_camera","cat":"scene","no":"Sett kameraet som er LAGRET i en scene (det scenen åpner med): target [x,y,z] m, distance, yaw/pitch (grader), perspective, ortho_extent (meter verden en parallell visning viser), view top|front|back|left|right|iso. Bare oppgitte felt endres. Ikke render-kameraet (set_camera).","en":"Set the camera STORED in a scene (what it opens with): target [x,y,z] m, distance, yaw/pitch (degrees), perspective, ortho_extent (metres of world a parallel view shows), view top|front|back|left|right|iso. Only given fields change. Not the render camera (set_camera).","method":"POST","path":"/sessions/{sid}/agent/drawings/set_scene_camera","access":"share","effect":"write","mcp":"web","py":"set_scene_camera('2D plan', target=[19.75, 4.75, 9.1], ortho_extent=16)","ops":["set_scene_camera"],"params":{"type":"object","properties":{"scene":{"type":"string"},"target":{"type":"array","items":{"type":"number"}},"distance":{"type":"number"},"yaw":{"type":"number"},"pitch":{"type":"number"},"perspective":{"type":"boolean"},"ortho_extent":{"type":"number"},"fov_deg":{"type":"number"},"view":{"type":"string"},"sid":{"type":"string"}},"required":["scene"]},"example":{"scene":"2D plan","target":[19.75,4.75,9.1],"ortho_extent":16},"status":"live","server":"web","level":"propose","description":"Set the camera STORED in a scene (what it opens with): target [x,y,z] m, distance, yaw/pitch (degrees), perspective, ortho_extent (metres of world a parallel view shows), view top|front|back|left|right|iso. Only given fields change. Not the render camera (set_camera). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Sett kameraet som er LAGRET i en scene (det scenen åpner med): target [x,y,z] m, distance, yaw/pitch (grader), perspective, ortho_extent (meter verden en parallell visning viser), view top|front|back|left|right|iso. Bare oppgitte felt endres. Ikke render-kameraet (set_camera).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"scene":{"type":"string"},"target":{"type":"array","items":{"type":"number"}},"distance":{"type":"number"},"yaw":{"type":"number"},"pitch":{"type":"number"},"perspective":{"type":"boolean"},"ortho_extent":{"type":"number"},"fov_deg":{"type":"number"},"view":{"type":"string"},"sid":{"type":"string"}},"required":["scene"]}},{"name":"frame_scene","cat":"scene","no":"Sikt en scene på en del av modellen så den åpner der (lagres i scenen): zoom_to all|storey|layer|elements|bbox (storey=, layer=, ids=[…], bbox=[x0,y0,x1,y1] i meter), margin (1,1 = 10 % luft), view top|front|…, ortho. Plan, fasade og snitt forblir parallelle (ortografisk utsnitt).","en":"Aim a scene at part of the model so it opens there (stored in the scene): zoom_to all|storey|layer|elements|bbox (storey=, layer=, ids=[...], bbox=[x0,y0,x1,y1] metres), margin (1.1 = 10 % air), view top|front|..., ortho. Plan, facade and section stay parallel (orthographic frame).","method":"POST","path":"/sessions/{sid}/agent/drawings/frame_scene","access":"share","effect":"write","mcp":"web","py":"frame_scene('2D plan', zoom_to='bbox', bbox=[13.5, -2.5, 26, 12])","ops":["frame_scene"],"params":{"type":"object","properties":{"scene":{"type":"string"},"zoom_to":{"type":"string"},"storey":{"type":"string"},"layer":{"type":"string"},"ids":{"type":"array","items":{"type":"string"}},"bbox":{"type":"array","items":{"type":"number"}},"margin":{"type":"number"},"view":{"type":"string"},"ortho":{"type":"boolean"},"aspect":{"type":"number"},"sid":{"type":"string"}},"required":["scene"]},"example":{"scene":"2D plan","zoom_to":"bbox","bbox":[13.5,-2.5,26,12]},"status":"live","server":"web","level":"propose","description":"Aim a scene at part of the model so it opens there (stored in the scene): zoom_to all|storey|layer|elements|bbox (storey=, layer=, ids=[...], bbox=[x0,y0,x1,y1] metres), margin (1.1 = 10 % air), view top|front|..., ortho. Plan, facade and section stay parallel (orthographic frame). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Sikt en scene på en del av modellen så den åpner der (lagres i scenen): zoom_to all|storey|layer|elements|bbox (storey=, layer=, ids=[…], bbox=[x0,y0,x1,y1] i meter), margin (1,1 = 10 % luft), view top|front|…, ortho. Plan, fasade og snitt forblir parallelle (ortografisk utsnitt).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"scene":{"type":"string"},"zoom_to":{"type":"string"},"storey":{"type":"string"},"layer":{"type":"string"},"ids":{"type":"array","items":{"type":"string"}},"bbox":{"type":"array","items":{"type":"number"}},"margin":{"type":"number"},"view":{"type":"string"},"ortho":{"type":"boolean"},"aspect":{"type":"number"},"sid":{"type":"string"}},"required":["scene"]}},{"name":"delete_scene","cat":"scene","no":"Slett scene etter navn.","en":"Delete a scene by name.","method":"POST","path":"/sessions/{sid}/agent/drawings/delete_scene","access":"share","effect":"write","mcp":"web","py":"delete_scene('Fasade Syd')","ops":["delete_scene"],"example":{"name":"Fasade Syd"},"status":"live","server":"web","level":"propose","description":"Delete a scene by name. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Slett scene etter navn.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"set_scene_discipline","cat":"scene","no":"Legg scener i et fag (gruppe i scenepanelet): names=[…] (eller name), discipline Byggherre|ARK|RIB|RIV|RIE|RIBr|LARK|RIG|RIAku (også «Arkitekt», «elektro» …), et annet navn lager et eget fag i prosjektet, null/«Felles» = uten fag. Ett angresteg.","en":"Put scenes in a discipline (group in the scene panel): names=[...] (or name), discipline Byggherre|ARK|RIB|RIV|RIE|RIBr|LARK|RIG|RIAku (also «architect», «electrical» ...), another name makes an own discipline in the project, null/«Felles» = none. One undo step.","method":"POST","path":"/sessions/{sid}/agent/drawings/set_scene_discipline","access":"share","effect":"write","mcp":"web","py":"set_scene_discipline(['2D-1. etg', 'Snitt-AA'], 'ARK')","ops":["set_scene_discipline"],"params":{"type":"object","properties":{"names":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"discipline":{"type":"string"}}},"example":{"names":["2D-1. etg","Snitt-AA"],"discipline":"ARK"},"status":"live","server":"web","returns":"{ok, scenes, discipline (key: ark | rib | … | own name | null), version}","level":"propose","description":"Put scenes in a discipline (group in the scene panel): names=[...] (or name), discipline Byggherre|ARK|RIB|RIV|RIE|RIBr|LARK|RIG|RIAku (also «architect», «electrical» ...), another name makes an own discipline in the project, null/«Felles» = none. One undo step. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Legg scener i et fag (gruppe i scenepanelet): names=[…] (eller name), discipline Byggherre|ARK|RIB|RIV|RIE|RIBr|LARK|RIG|RIAku (også «Arkitekt», «elektro» …), et annet navn lager et eget fag i prosjektet, null/«Felles» = uten fag. Ett angresteg.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"names":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"discipline":{"type":"string"}}}},{"name":"delete_scenes","cat":"scene","no":"Slett flere scener på én gang (ett angresteg), f.eks. alle scenene i ett fag.","en":"Delete several scenes at once (one undo step), e.g. every scene of one discipline.","method":"POST","path":"/sessions/{sid}/agent/drawings/delete_scenes","access":"share","effect":"write","mcp":"web","py":"delete_scenes(['3D-Fasade-1', '3D-Fasade-2'])","ops":["delete_scenes"],"params":{"type":"object","properties":{"names":{"type":"array","items":{"type":"string"}}},"required":["names"]},"example":{"names":["3D-Fasade-1","3D-Fasade-2"]},"status":"live","server":"web","level":"propose","description":"Delete several scenes at once (one undo step), e.g. every scene of one discipline. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Slett flere scener på én gang (ett angresteg), f.eks. alle scenene i ett fag.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"names":{"type":"array","items":{"type":"string"}}},"required":["names"]}},{"name":"add_discipline","cat":"scene","no":"Eget fag (scenegruppe) i prosjektet, ved siden av Byggherre/ARK/RIB/RIV/RIE (maks 32 tegn).","en":"Own discipline (scene group) in the project, beside Byggherre/ARK/RIB/RIV/RIE (max 32 characters).","method":"POST","path":"/sessions/{sid}/agent/drawings/add_discipline","access":"share","effect":"write","mcp":"web","py":"add_discipline('Interiør')","ops":["add_discipline"],"params":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"example":{"name":"Interiør"},"status":"live","server":"web","level":"propose","description":"Own discipline (scene group) in the project, beside Byggherre/ARK/RIB/RIV/RIE (max 32 characters). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Eget fag (scenegruppe) i prosjektet, ved siden av Byggherre/ARK/RIB/RIV/RIE (maks 32 tegn).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}},{"name":"remove_discipline","cat":"scene","no":"Fjern et eget fag; scenene i det går til «Felles» (ingen scene slettes).","en":"Remove an own discipline; its scenes go to «Felles» (no scene is deleted).","method":"POST","path":"/sessions/{sid}/agent/drawings/remove_discipline","access":"share","effect":"write","mcp":"web","py":"remove_discipline('Interiør')","ops":["remove_discipline"],"params":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"status":"live","server":"web","level":"propose","description":"Remove an own discipline; its scenes go to «Felles» (no scene is deleted). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Fjern et eget fag; scenene i det går til «Felles» (ingen scene slettes).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}},{"name":"add_sheet","cat":"scene","no":"Nytt ark: kind plans|facades|view|empty.","en":"Add a sheet: kind plans|facades|view|empty.","method":"POST","path":"/sessions/{sid}/agent/drawings/add_sheet","access":"share","effect":"write","mcp":"web","py":"add_sheet('view', scene_name='…')","ops":["add_sheet"],"status":"live","server":"web","level":"propose","description":"Add a sheet: kind plans|facades|view|empty. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Nytt ark: kind plans|facades|view|empty.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"delete_sheet","cat":"scene","no":"Slett ark.","en":"Delete a sheet.","method":"POST","path":"/sessions/{sid}/agent/drawings/delete_sheet","access":"share","effect":"write","mcp":"web","py":"delete_sheet('…')","ops":["delete_sheet"],"status":"live","server":"web","level":"propose","description":"Delete a sheet. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Slett ark.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"add_page","cat":"scene","no":"Ny side (tom eller med én scene).","en":"Add a page (empty or with one scene).","method":"POST","path":"/sessions/{sid}/agent/drawings/add_page","access":"share","effect":"write","mcp":"web","py":"add_page(title='…')","ops":["add_page"],"status":"live","server":"web","level":"propose","description":"Add a page (empty or with one scene). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Ny side (tom eller med én scene).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"delete_page","cat":"scene","no":"Slett side.","en":"Delete a page.","method":"POST","path":"/sessions/{sid}/agent/drawings/delete_page","access":"share","effect":"write","mcp":"web","py":"delete_page('…')","ops":["delete_page"],"status":"live","server":"web","level":"propose","description":"Delete a page. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Slett side.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"add_view","cat":"scene","no":"Legg en scene på et ark (ny visning, f.eks. Snitt-AA ved siden av planen).","en":"Put a scene on a sheet (a new viewport, e.g. Snitt-AA next to the plan).","method":"POST","path":"/sessions/{sid}/agent/drawings/add_view","access":"share","effect":"write","py":"add_view('Plan 1. etg', 'Snitt-AA')","status":"live","server":"web","level":"propose","description":"Put a scene on a sheet (a new viewport, e.g. Snitt-AA next to the plan). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Legg en scene på et ark (ny visning, f.eks. Snitt-AA ved siden av planen).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"delete_view","cat":"scene","no":"Fjern en visning fra et ark.","en":"Remove a viewport from a sheet.","method":"POST","path":"/sessions/{sid}/agent/drawings/delete_view","access":"share","effect":"write","status":"live","server":"web","level":"propose","description":"Remove a viewport from a sheet. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Fjern en visning fra et ark.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"ensure_standard","cat":"scene","no":"Standard scener/ark for det som faktisk er tegnet (pack: standard|presentasjon|soknad|full).","en":"Standard scenes/sheets for what is drawn (pack: standard|presentasjon|soknad|konstruksjon|full).","method":"POST","path":"/sessions/{sid}/agent/drawings/ensure_standard","access":"share","effect":"write","params":{"type":"object","properties":{"sheets":{"type":"boolean"},"pack":{"type":"string","enum":["standard","presentasjon","soknad","konstruksjon","full"]}}},"status":"live","server":"web","level":"propose","description":"Standard scenes/sheets for what is drawn (pack: standard|presentasjon|soknad|konstruksjon|full). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Standard scener/ark for det som faktisk er tegnet (pack: standard|presentasjon|soknad|full).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"sheets":{"type":"boolean"},"pack":{"type":"string","enum":["standard","presentasjon","soknad","konstruksjon","full"]}}}},{"name":"add_sheet_set","cat":"scene","no":"Tegningssett: presentasjon, soknad eller konstruksjon, i fast rekkefølge E-serien (plan, snitt, fasader, perspektiver, vindu-/dørliste), D-serien (situasjonsplan …) og K-serien (ringmur, konstruksjonstegninger), nummer E1 …, D1 …, K1 … (eksisterende tegninger først). Innholdet per sett er innstillinger (sett.<sett>.<side>). Sider Dibrix ikke kan lage ennå står i «missing». Sletter aldri egne sider.","en":"Drawing set: presentasjon, soknad or konstruksjon, in fixed order: E series (plans, sections, elevations, perspectives, window/door schedule), D series (site plan ...) and K series (foundation plan, construction drawings), numbered E1 ..., D1 ..., K1 ... (existing drawings first). Contents per set are settings (sett.<set>.<kind>). Pages Dibrix cannot make yet are listed in «missing». Never deletes the user's own pages.","method":"POST","path":"/sessions/{sid}/agent/drawings/add_sheet_set","access":"share","effect":"write","mcp":"web","py":"add_sheet_set('soknad')","ops":["add_sheet_set"],"params":{"type":"object","properties":{"set":{"type":"string","enum":["soknad","presentasjon","konstruksjon"]}},"required":["set"]},"example":{"set":"konstruksjon"},"status":"live","server":"web","returns":"{ok, set, built, missing:[{kind, series, title, reason}], placeholders, pages:[{name, sheet_no, kind, series}], skipped_deleted}","level":"propose","description":"Drawing set: presentasjon, soknad or konstruksjon, in fixed order: E series (plans, sections, elevations, perspectives, window/door schedule), D series (site plan ...) and K series (foundation plan, construction drawings), numbered E1 ..., D1 ..., K1 ... (existing drawings first). Contents per set are settings (sett.<set>.<kind>). Pages Dibrix cannot make yet are listed in «missing». Never deletes the user's own pages. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Tegningssett: presentasjon, soknad eller konstruksjon, i fast rekkefølge E-serien (plan, snitt, fasader, perspektiver, vindu-/dørliste), D-serien (situasjonsplan …) og K-serien (ringmur, konstruksjonstegninger), nummer E1 …, D1 …, K1 … (eksisterende tegninger først). Innholdet per sett er innstillinger (sett.<sett>.<side>). Sider Dibrix ikke kan lage ennå står i «missing». Sletter aldri egne sider.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"set":{"type":"string","enum":["soknad","presentasjon","konstruksjon"]}},"required":["set"]}},{"name":"rename_page","cat":"scene","no":"Gi side nytt navn.","en":"Rename a page.","method":"POST","path":"/sessions/{sid}/agent/drawings/rename_page","access":"share","effect":"write","mcp":"web","py":"rename_page('Plan 1. etg', 'Plan første etasje')","ops":["rename_page"],"params":{"type":"object","properties":{"name":{"type":"string"},"title":{"type":"string"}},"required":["name","title"]},"status":"live","server":"web","level":"propose","description":"Rename a page. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Gi side nytt navn.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string"},"title":{"type":"string"}},"required":["name","title"]}},{"name":"set_page_number","cat":"scene","no":"Tegningsnummer på side (standard E1/D1/K1 via add_sheet_set; fritekst 1-16 tegn, f.eks. E-1). Beholdes ved ombygging. sheet.no_* styrer auto.","en":"Page drawing number (default E1/D1/K1 via add_sheet_set; free text 1-16 chars, e.g. E-1). Kept on rebuild. sheet.no_* prefs drive auto.","method":"POST","path":"/sessions/{sid}/agent/drawings/set_page_number","access":"share","effect":"write","mcp":"web","py":"set_page_number('Plan 1. etasje', 'E1')","ops":["set_page_number"],"params":{"type":"object","properties":{"name":{"type":"string"},"sheet_no":{"type":"string"}},"required":["name","sheet_no"]},"example":{"name":"Plan 1. etasje","sheet_no":"E1"},"status":"live","server":"web","level":"propose","description":"Page drawing number (default E1/D1/K1 via add_sheet_set; free text 1-16 chars, e.g. E-1). Kept on rebuild. sheet.no_* prefs drive auto. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Tegningsnummer på side (standard E1/D1/K1 via add_sheet_set; fritekst 1-16 tegn, f.eks. E-1). Beholdes ved ombygging. sheet.no_* styrer auto.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string"},"sheet_no":{"type":"string"}},"required":["name","sheet_no"]}},{"name":"move_page","cat":"scene","no":"Flytt side (to_index eller delta).","en":"Move a page (to_index or delta).","method":"POST","path":"/sessions/{sid}/agent/drawings/move_page","access":"share","effect":"write","mcp":"web","py":"move_page('…', to_index=0)","ops":["move_page"],"params":{"type":"object","properties":{"name":{"type":"string"},"to_index":{"type":"integer"},"delta":{"type":"integer"}},"required":["name"]},"status":"live","server":"web","level":"propose","description":"Move a page (to_index or delta). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Flytt side (to_index eller delta).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string"},"to_index":{"type":"integer"},"delta":{"type":"integer"}},"required":["name"]}},{"name":"copy_page","cat":"scene","no":"Dupliser side (undo-steg).","en":"Duplicate a page (one undo step).","method":"POST","path":"/sessions/{sid}/agent/drawings/duplicate_page","access":"share","effect":"write","mcp":"web","py":"duplicate_page('…')","ops":["duplicate_page"],"params":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"status":"live","server":"web","level":"propose","description":"Duplicate a page (one undo step). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Dupliser side (undo-steg).","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}},{"name":"set_page_paper","cat":"scene","no":"Papirformat og retning for side.","en":"Paper size and orientation of a page.","method":"POST","path":"/sessions/{sid}/agent/drawings/set_page_paper","access":"share","effect":"write","mcp":"web","py":"set_page_paper('…', 'A3', landscape=True)","ops":["set_page_paper"],"params":{"type":"object","properties":{"name":{"type":"string"},"paper":{"type":"string","enum":["A4","A3","A2","A1","A0"]},"landscape":{"type":"boolean"}},"required":["name","paper"]},"status":"live","server":"web","level":"propose","description":"Paper size and orientation of a page. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Papirformat og retning for side.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string"},"paper":{"type":"string","enum":["A4","A3","A2","A1","A0"]},"landscape":{"type":"boolean"}},"required":["name","paper"]}},{"name":"set_view_scene","cat":"scene","no":"Bytt scene i en visning på en side.","en":"Swap the scene a viewport on a page shows.","method":"POST","path":"/sessions/{sid}/agent/drawings/set_view_scene","access":"share","effect":"write","mcp":"web","py":"set_view_scene('…', 0, 'Nord')","ops":["set_view_scene"],"params":{"type":"object","properties":{"sheet":{"type":"string"},"index":{"type":"integer"},"scene_name":{"type":"string"}},"required":["sheet","index","scene_name"]},"status":"live","server":"web","level":"propose","description":"Swap the scene a viewport on a page shows. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Bytt scene i en visning på en side.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"sheet":{"type":"string"},"index":{"type":"integer"},"scene_name":{"type":"string"}},"required":["sheet","index","scene_name"]}},{"name":"set_view_scale","cat":"scene","no":"Målestokk 1:N for en visning.","en":"Scale 1:N of a viewport.","method":"POST","path":"/sessions/{sid}/agent/drawings/set_view_scale","access":"share","effect":"write","params":{"type":"object","properties":{"sheet":{"type":"string"},"index":{"type":"integer"},"scale_n":{"type":"number"}},"required":["sheet","index","scale_n"]},"status":"live","server":"web","level":"propose","description":"Scale 1:N of a viewport. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Målestokk 1:N for en visning.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"sheet":{"type":"string"},"index":{"type":"integer"},"scale_n":{"type":"number"}},"required":["sheet","index","scale_n"]}},{"name":"set_scene_openings","cat":"scene","no":"Dører i en scene: closed|open|model (hver dør som satt)|auto (fasade/snitt/3D lukket som standard); med door = bare den døren i scenen.","en":"Doors in a scene: closed|open|model (each door as set)|auto (facade/section/3D closed by default); with door = only that door in the scene.","method":"POST","path":"/sessions/{sid}/agent/drawings/set_scene_openings","access":"share","effect":"write","mcp":"web","py":"set_scene_openings('Syd', 'closed')","ops":["set_scene_openings"],"params":{"type":"object","properties":{"name":{"type":"string"},"state":{"type":"string","enum":["closed","open","model","auto"]},"door":{"type":"string"}},"required":["name","state"]},"status":"live","server":"web","level":"propose","description":"Doors in a scene: closed|open|model (each door as set)|auto (facade/section/3D closed by default); with door = only that door in the scene. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Dører i en scene: closed|open|model (hver dør som satt)|auto (fasade/snitt/3D lukket som standard); med door = bare den døren i scenen.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string"},"state":{"type":"string","enum":["closed","open","model","auto"]},"door":{"type":"string"}},"required":["name","state"]}},{"name":"set_scene_layers","cat":"scene","no":"Lag en scene viser/skjuler når den velges (lagret i scenen): show=[…], hide=[…]. Navn fra list_tags eller lagpanelet («Reisverk» = Construction); ukjent navn gir «mente du …?». F.eks. «vis reisverk i scenen Reisverk 3D». Arkene følger med.","en":"Layers a scene shows / hides when it is chosen (stored in the scene): show=[...], hide=[...]. Names from list_tags or the layer panel ('Reisverk' = Construction); an unknown name gives 'did you mean ...?'. E.g. 'show the framing in scene Reisverk 3D'.","method":"POST","path":"/sessions/{sid}/agent/drawings/set_scene_layers","access":"share","effect":"write","mcp":"web","py":"set_scene_layers('Reisverk 3D', show=['Reisverk'])","ops":["set_scene_layers"],"params":{"type":"object","properties":{"name":{"type":"string"},"show":{"type":"array","items":{"type":"string"}},"hide":{"type":"array","items":{"type":"string"}}},"required":["name"]},"example":{"name":"Reisverk 3D","show":["Construction"]},"status":"live","server":"web","level":"propose","description":"Layers a scene shows / hides when it is chosen (stored in the scene): show=[...], hide=[...]. Names from list_tags or the layer panel ('Reisverk' = Construction); an unknown name gives 'did you mean ...?'. E.g. 'show the framing in scene Reisverk 3D'. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Lag en scene viser/skjuler når den velges (lagret i scenen): show=[…], hide=[…]. Navn fra list_tags eller lagpanelet («Reisverk» = Construction); ukjent navn gir «mente du …?». F.eks. «vis reisverk i scenen Reisverk 3D». Arkene følger med.","category_label":"Scene, ark og side","input_schema":{"type":"object","properties":{"name":{"type":"string"},"show":{"type":"array","items":{"type":"string"}},"hide":{"type":"array","items":{"type":"string"}}},"required":["name"]}},{"name":"configurator_link","cat":"pris","no":"Modellen som delelenke til konfiguratoren (/konfigurator/plan#c=…): omriss, innervegger, åpninger; not_carried = det som ikke følger med. Åpen bygning (carport): omrisset fra gulvplata/taket/veggene, assumed/notes sier hva som er antatt.","en":"The model as a configurator share link (/konfigurator/plan#c=...): outline, inner walls, openings; not_carried = what stays behind. Open building (carport): outline from slab/roof/walls, assumed/notes say what was assumed.","method":"GET","path":"/sessions/{sid}/agent/configurator-link","access":"share","effect":"read","mcp":"web","status":"live","server":"web","level":"read","description":"The model as a configurator share link (/konfigurator/plan#c=...): outline, inner walls, openings; not_carried = what stays behind. Open building (carport): outline from slab/roof/walls, assumed/notes say what was assumed. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Modellen som delelenke til konfiguratoren (/konfigurator/plan#c=…): omriss, innervegger, åpninger; not_carried = det som ikke følger med. Åpen bygning (carport): omrisset fra gulvplata/taket/veggene, assumed/notes sier hva som er antatt.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"get_plan","cat":"plan","no":"Editorens 2D-plan som JSON (vegger, åpninger, rom, mål) for en etasje.","en":"The editor's 2D plan as JSON (walls, openings, rooms, dimensions) for a storey.","method":"GET","path":"/sessions/{sid}/composer/plan","access":"sandbox","effect":"read","mcp":"web","py":"plan_dokument()","status":"live","server":"web","level":"read","description":"The editor's 2D plan as JSON (walls, openings, rooms, dimensions) for a storey. [sandbox (anonymous) or logged in] — NO: Editorens 2D-plan som JSON (vegger, åpninger, rom, mål) for en etasje.","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"},"view":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"View"},"lite":{"type":"boolean","default":false,"title":"Lite"},"dims":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dims"},"expr":{"type":"boolean","default":false,"title":"Expr"},"scale_n":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Scale N"}}}},{"name":"get_plan_svg","cat":"plan","no":"2D-planen som SVG (se den).","en":"The 2D plan as SVG (look at it).","method":"GET","path":"/sessions/{sid}/composer/plan.svg","access":"sandbox","effect":"read","mcp":"web","status":"live","server":"web","level":"read","description":"The 2D plan as SVG (look at it). [sandbox (anonymous) or logged in] — NO: 2D-planen som SVG (se den).","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"},"view":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"View"},"dims":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dims"}}}},{"name":"style_document","cat":"plan","no":"Ferdig løst tegnestil; preset=standard|presentasjon|byggeplass|faggruppe:… .","en":"Resolved drawing style; preset=standard|presentasjon|byggeplass|faggruppe:... .","method":"GET","path":"/sessions/{sid}/composer/style","access":"sandbox","effect":"read","status":"live","server":"web","level":"read","description":"Resolved drawing style; preset=standard|presentasjon|byggeplass|faggruppe:... . [sandbox (anonymous) or logged in] — NO: Ferdig løst tegnestil; preset=standard|presentasjon|byggeplass|faggruppe:… .","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"medium":{"type":"string","default":"plan2d","title":"Medium"},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset"},"scale_n":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Scale N"}}}},{"name":"get_style","cat":"plan","no":"Modellstilen: valgt stil, farge/linje/skravur per objekttype (vegg, dekke, tak, dør, vindu ...), overstyringer per scene/ark og stilbiblioteket.","en":"The model style: the chosen style, colour/line/hatching per object type (wall, slab, roof, door, window ...), overrides per scene/sheet and the style library.","method":"GET","path":"/sessions/{sid}/style","access":"login","effect":"read","mcp":"web","py":"get_style()","status":"live","server":"web","level":"read","description":"The model style: the chosen style, colour/line/hatching per object type (wall, slab, roof, door, window ...), overrides per scene/sheet and the style library. [logged in] — NO: Modellstilen: valgt stil, farge/linje/skravur per objekttype (vegg, dekke, tak, dør, vindu ...), overstyringer per scene/ark og stilbiblioteket.","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"list_styles","cat":"plan","no":"Hva som kan stilsettes: objekttyper med egenskaper, fargepalett, linjevekter (0,05-1,0 mm), linjetyper, skravurer og navn på stiler (Arkitekt svart/hvit, Presentasjon farge, Søknad, Skisse). Les denne før set_style.","en":"What can be styled: object types with their properties, colour palette, line weights (0.05-1.0 mm), line types, hatchings and style names (Architect black/white, Presentation colour, Application, Sketch). Read this before set_style.","method":"GET","path":"/sessions/{sid}/style/catalog","access":"login","effect":"read","mcp":"web","py":"list_styles()","status":"live","server":"web","level":"read","description":"What can be styled: object types with their properties, colour palette, line weights (0.05-1.0 mm), line types, hatchings and style names (Architect black/white, Presentation colour, Application, Sketch). Read this before set_style. [logged in] — NO: Hva som kan stilsettes: objekttyper med egenskaper, fargepalett, linjevekter (0,05-1,0 mm), linjetyper, skravurer og navn på stiler (Arkitekt svart/hvit, Presentasjon farge, Søknad, Skisse). Les denne før set_style.","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"set_style","cat":"plan","no":"Sett utseendet: preset=<stilnavn> velger en navngitt stil; type+prop+value setter én egenskap på én objekttype (face_color, opacity, edge_color, edge_width_mm, line_type, cut_color, hatch, text_color, visible), props={...} flere; scope=document|scene:<navn>|sheet:<navn>|frame:<uid>; reset (+type, prop) / reset_all tilbakestiller; copy_from+type kopierer; save_as/delete lagrer/sletter en stil i dokumentet. Virker i 3D, 2D-plan, snitt/fasade og på ark/PDF.","en":"Set the look: preset=<style name> picks a named style; type+prop+value sets one property of one object type (face_color, opacity, edge_color, edge_width_mm, line_type, cut_color, hatch, text_color, visible), props={...} several; scope=document|scene:<name>|sheet:<name>|frame:<uid>; reset (+type, prop) / reset_all resets; copy_from+type copies; save_as/delete saves/deletes a style in the document. Works in 3D, 2D plan, section/elevation and on sheets/PDF.","method":"POST","path":"/sessions/{sid}/style","access":"login","effect":"write","mcp":"web","py":"set_style(type='wall', prop='face_color', value='plaster')","example":{"type":"wall","prop":"face_color","value":"plaster"},"status":"live","server":"web","level":"propose","description":"Set the look: preset=<style name> picks a named style; type+prop+value sets one property of one object type (face_color, opacity, edge_color, edge_width_mm, line_type, cut_color, hatch, text_color, visible), props={...} several; scope=document|scene:<name>|sheet:<name>|frame:<uid>; reset (+type, prop) / reset_all resets; copy_from+type copies; save_as/delete saves/deletes a style in the document. Works in 3D, 2D plan, section/elevation and on sheets/PDF. [logged in] — NO: Sett utseendet: preset=<stilnavn> velger en navngitt stil; type+prop+value setter én egenskap på én objekttype (face_color, opacity, edge_color, edge_width_mm, line_type, cut_color, hatch, text_color, visible), props={...} flere; scope=document|scene:<navn>|sheet:<navn>|frame:<uid>; reset (+type, prop) / reset_all tilbakestiller; copy_from+type kopierer; save_as/delete lagrer/sletter en stil i dokumentet. Virker i 3D, 2D-plan, snitt/fasade og på ark/PDF.","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset"},"style":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Style"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"prop":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prop"},"value":{"title":"Value"},"props":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Props"},"reset":{"type":"boolean","title":"Reset","default":false},"reset_all":{"type":"boolean","title":"Reset All","default":false},"copy_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Copy From"},"objects":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Objects"},"save_as":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Save As"},"delete":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delete"},"undo":{"type":"boolean","title":"Undo","default":false},"redo":{"type":"boolean","title":"Redo","default":false}}}},{"name":"get_style_mood","cat":"plan","no":"Uttrykk: glidere som tone (lys-mørk), livlighet, varme, skisse-faktor, detaljnivå, linjetykkelse, fyll (white|colour|hatch|keep) og papir, og ferdige uttrykk (clean_architect, sketch, watercolour, pencil, presentation, playful). Les denne før set_style_mood / adjust_style.","en":"Expression: dials such as tone (light-dark), vividness, warmth, sketchiness, detail level, line thickness, fill (white|colour|hatch|watercolour|pencil|keep) and paper, and ready-made expressions (clean_architect, sketch, watercolour, pencil, presentation, playful). Read this before set_style_mood / adjust_style.","method":"GET","path":"/sessions/{sid}/style/mood","access":"login","effect":"read","mcp":"web","py":"get_style()","status":"live","server":"web","level":"read","description":"Expression: dials such as tone (light-dark), vividness, warmth, sketchiness, detail level, line thickness, fill (white|colour|hatch|watercolour|pencil|keep) and paper, and ready-made expressions (clean_architect, sketch, watercolour, pencil, presentation, playful). Read this before set_style_mood / adjust_style. [logged in] — NO: Uttrykk: glidere som tone (lys-mørk), livlighet, varme, skisse-faktor, detaljnivå, linjetykkelse, fyll (white|colour|hatch|keep) og papir, og ferdige uttrykk (clean_architect, sketch, watercolour, pencil, presentation, playful). Les denne før set_style_mood / adjust_style.","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"set_style_mood","cat":"plan","no":"Sett uttrykket: preset=clean_architect|sketch|watercolour|pencil|presentation|playful og/eller values={tone, vividness, warmth, detail, line_weight: -1..1, sketch: 0..1, fill: keep|white|colour|hatch|watercolour|pencil, paper: keep|white|paper|warm|grey} og/eller palette=[hex fra fargelisten, opptil 5: vegg, tak, dør, terreng, kledning]. Reversibelt: 0 = grunnstilen. Til «gi meg samme uttrykk som dette bildet»: mål bildet med style_from_image og bruk forslaget (eller din tolkning) her. Forrige stil lagres (set_style undo=true).","en":"Set the expression: preset=clean_architect|sketch|watercolour|pencil|presentation|playful and/or values={tone, vividness, warmth, detail, line_weight: -1..1, sketch: 0..1, fill: keep|white|colour|hatch|watercolour|pencil, paper: keep|white|paper|warm|grey} and/or palette=[hex from the colour list, up to 5: wall, roof, door, terrain, cladding]. Reversible: 0 = the base style. For «give me the same look as this picture»: measure it with style_from_image and use the suggestion (or your own reading) here. The previous style is kept (set_style undo=true).","method":"POST","path":"/sessions/{sid}/style/mood","access":"login","effect":"write","mcp":"web","py":"set_style_mood(preset='sketch', values={'tone': -0.2})","example":{"preset":"sketch","values":{"tone":-0.2}},"status":"live","server":"web","level":"propose","description":"Set the expression: preset=clean_architect|sketch|watercolour|pencil|presentation|playful and/or values={tone, vividness, warmth, detail, line_weight: -1..1, sketch: 0..1, fill: keep|white|colour|hatch|watercolour|pencil, paper: keep|white|paper|warm|grey} and/or palette=[hex from the colour list, up to 5: wall, roof, door, terrain, cladding]. Reversible: 0 = the base style. For «give me the same look as this picture»: measure it with style_from_image and use the suggestion (or your own reading) here. The previous style is kept (set_style undo=true). [logged in] — NO: Sett uttrykket: preset=clean_architect|sketch|watercolour|pencil|presentation|playful og/eller values={tone, vividness, warmth, detail, line_weight: -1..1, sketch: 0..1, fill: keep|white|colour|hatch|watercolour|pencil, paper: keep|white|paper|warm|grey} og/eller palette=[hex fra fargelisten, opptil 5: vegg, tak, dør, terreng, kledning]. Reversibelt: 0 = grunnstilen. Til «gi meg samme uttrykk som dette bildet»: mål bildet med style_from_image og bruk forslaget (eller din tolkning) her. Forrige stil lagres (set_style undo=true).","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset"},"values":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Values"},"palette":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Palette"}}}},{"name":"adjust_style","cat":"plan","no":"Relativ justering av ett uttrykk: parameter=tone|vividness|warmth|sketch|detail|line_weight, direction=more|less, amount=little|some|much («litt mørkere» = tone more little; «mye mer sketchy» = sketch more much; «lysere» = tone less some); fill / paper: direction = valget (colour, warm ...). Forrige stil lagres.","en":"Relative change of one expression dial: parameter=tone|vividness|warmth|sketch|detail|line_weight, direction=more|less, amount=little|some|much («a bit darker» = tone more little; «much more sketchy» = sketch more much; «lighter» = tone less some); fill / paper: direction = the choice (colour, warm ...). The previous style is kept.","method":"POST","path":"/sessions/{sid}/style/mood/adjust","access":"login","effect":"write","mcp":"web","py":"adjust_style('tone', 'more', 'little')","example":{"parameter":"tone","direction":"more","amount":"little"},"status":"live","server":"web","level":"propose","description":"Relative change of one expression dial: parameter=tone|vividness|warmth|sketch|detail|line_weight, direction=more|less, amount=little|some|much («a bit darker» = tone more little; «much more sketchy» = sketch more much; «lighter» = tone less some); fill / paper: direction = the choice (colour, warm ...). The previous style is kept. [logged in] — NO: Relativ justering av ett uttrykk: parameter=tone|vividness|warmth|sketch|detail|line_weight, direction=more|less, amount=little|some|much («litt mørkere» = tone more little; «mye mer sketchy» = sketch more much; «lysere» = tone less some); fill / paper: direction = valget (colour, warm ...). Forrige stil lagres.","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"parameter":{"type":"string","title":"Parameter"},"direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direction"},"amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amount"},"delta":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta"}},"required":["parameter"]}},{"name":"reset_style_mood","cat":"plan","no":"Tilbake til grunnstilen (alle uttrykksglidere til 0).","en":"Back to the base style (all expression dials to 0).","method":"POST","path":"/sessions/{sid}/style/mood/reset","access":"login","effect":"write","mcp":"web","py":"reset_style_mood()","status":"live","server":"web","level":"propose","description":"Back to the base style (all expression dials to 0). [logged in] — NO: Tilbake til grunnstilen (alle uttrykksglidere til 0).","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"style_from_image","cat":"plan","no":"Mål et referansebilde LOKALT (palett, tone, metning, varme, kontrast, linjepreg, støy) og få et FORSLAG til uttrykk + palett; ingenting brukes og bildet sendes ikke videre. image_b64 = bildet (jpg/png, under ca. 1,5 MB). Bruk forslaget med set_style_mood.","en":"Measure a reference picture LOCALLY (palette, tone, saturation, warmth, contrast, line character, noise) and get a SUGGESTION of expression + palette; nothing is applied and the picture is not forwarded. image_b64 = the picture (jpg/png, under about 1.5 MB). Apply the suggestion with set_style_mood.","method":"POST","path":"/sessions/{sid}/style/mood/reference","access":"login","effect":"read","mcp":"web","status":"live","server":"web","level":"read","description":"Measure a reference picture LOCALLY (palette, tone, saturation, warmth, contrast, line character, noise) and get a SUGGESTION of expression + palette; nothing is applied and the picture is not forwarded. image_b64 = the picture (jpg/png, under about 1.5 MB). Apply the suggestion with set_style_mood. [logged in] — NO: Mål et referansebilde LOKALT (palett, tone, metning, varme, kontrast, linjepreg, støy) og få et FORSLAG til uttrykk + palett; ingenting brukes og bildet sendes ikke videre. image_b64 = bildet (jpg/png, under ca. 1,5 MB). Bruk forslaget med set_style_mood.","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"image_b64":{"type":"string","title":"Image B64"},"use_ai":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Ai"}},"required":["image_b64"]}},{"name":"list_style_rules","cat":"plan","no":"Stilregler «filter -> stil» i kjørerekkefølge (en senere regel vinner), med antall elementer hver treffer, og valgene å filtrere på: ytter/inner, bærende (bearing|non_bearing|unknown), brannklasse (none|EI30|EI60|EI90), brannvegg, veggtype, materiale, etasje, lag/tagg, åpningstype (door|window), tykkelse, objekttype.","en":"Style rules «filter -> style» in run order (a later rule wins), with how many elements each matches, and the filter choices: exterior/interior, load-bearing (bearing|non_bearing|unknown), fire class (none|EI30|EI60|EI90), fire wall, wall type, material, storey, layer/tag, opening kind (door|window), thickness, object type.","method":"GET","path":"/sessions/{sid}/style/rules","access":"login","effect":"read","mcp":"web","py":"list_style_rules()","status":"live","server":"web","level":"read","description":"Style rules «filter -> style» in run order (a later rule wins), with how many elements each matches, and the filter choices: exterior/interior, load-bearing (bearing|non_bearing|unknown), fire class (none|EI30|EI60|EI90), fire wall, wall type, material, storey, layer/tag, opening kind (door|window), thickness, object type. [logged in] — NO: Stilregler «filter -> stil» i kjørerekkefølge (en senere regel vinner), med antall elementer hver treffer, og valgene å filtrere på: ytter/inner, bærende (bearing|non_bearing|unknown), brannklasse (none|EI30|EI60|EI90), brannvegg, veggtype, materiale, etasje, lag/tagg, åpningstype (door|window), tykkelse, objekttype.","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"add_style_rule","cat":"plan","no":"Legg til en stilregel (op=add), eller update|remove|move|enable|clear. rule={name, combine:all|any, conds:[{prop:wall_position|bearing|fire_class|fire_wall|type|wall_type|material|storey|tag|opening_kind|thickness_mm, op:is|is_not|gte|lte, value}], style:{face_color, opacity, edge_color, edge_width_mm, line_type, cut_color, hatch}, dims:{edge_color, edge_width_mm, line_type}}. Eksempel «mål til yttervegger grønne»: conds=[{prop:wall_position,op:is,value:exterior}], dims={edge_color:green}. Farger er hex eller paletten fra list_styles; scope=document|scene:<navn>|ark:<navn> (regler kan gjelde ett ark). Virker i 3D, 2D-plan, Tegning og ark/PDF (også målene til elementene).","en":"Add a style rule (op=add), or update|remove|move|enable|clear. rule={name, combine:all|any, conds:[{prop:wall_position|bearing|fire_class|fire_wall|type|wall_type|material|storey|tag|opening_kind|thickness_mm, op:is|is_not|gte|lte, value}], style:{face_color, opacity, edge_color, edge_width_mm, line_type, cut_color, hatch}, dims:{edge_color, edge_width_mm, line_type}}. Example «dimensions of exterior walls green»: conds=[{prop:wall_position,op:is,value:exterior}], dims={edge_color:green}. Colours are hex or the palette from list_styles; scope=document|scene:<name>|ark:<name> (rules can apply to one sheet). Works in 3D, 2D plan, Drawing and sheets/PDF (also the dimensions of the elements).","method":"POST","path":"/sessions/{sid}/style/rules","access":"login","effect":"write","mcp":"web","py":"add_style_rule(name='Bærende blå', conds=[{'prop':'bearing','op':'is','value':'bearing'}], style={'edge_color':'#1a4fa0'})","example":{"op":"add","rule":{"name":"Bærende vegger blå","conds":[{"prop":"bearing","op":"is","value":"bearing"}],"style":{"edge_color":"#1a4fa0","cut_color":"#1a4fa0"}}},"status":"live","server":"web","level":"propose","description":"Add a style rule (op=add), or update|remove|move|enable|clear. rule={name, combine:all|any, conds:[{prop:wall_position|bearing|fire_class|fire_wall|type|wall_type|material|storey|tag|opening_kind|thickness_mm, op:is|is_not|gte|lte, value}], style:{face_color, opacity, edge_color, edge_width_mm, line_type, cut_color, hatch}, dims:{edge_color, edge_width_mm, line_type}}. Example «dimensions of exterior walls green»: conds=[{prop:wall_position,op:is,value:exterior}], dims={edge_color:green}. Colours are hex or the palette from list_styles; scope=document|scene:<name>|ark:<name> (rules can apply to one sheet). Works in 3D, 2D plan, Drawing and sheets/PDF (also the dimensions of the elements). [logged in] — NO: Legg til en stilregel (op=add), eller update|remove|move|enable|clear. rule={name, combine:all|any, conds:[{prop:wall_position|bearing|fire_class|fire_wall|type|wall_type|material|storey|tag|opening_kind|thickness_mm, op:is|is_not|gte|lte, value}], style:{face_color, opacity, edge_color, edge_width_mm, line_type, cut_color, hatch}, dims:{edge_color, edge_width_mm, line_type}}. Eksempel «mål til yttervegger grønne»: conds=[{prop:wall_position,op:is,value:exterior}], dims={edge_color:green}. Farger er hex eller paletten fra list_styles; scope=document|scene:<navn>|ark:<navn> (regler kan gjelde ett ark). Virker i 3D, 2D-plan, Tegning og ark/PDF (også målene til elementene).","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"op":{"type":"string","title":"Op","default":"add"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"rule":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rule"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"to":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"To"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}}}},{"name":"remove_style_rule","cat":"plan","no":"Fjern en stilregel (id fra list_style_rules).","en":"Remove a style rule (id from list_style_rules).","method":"DELETE","path":"/sessions/{sid}/style/rules/{rule_id}","access":"login","effect":"write","mcp":"web","py":"remove_style_rule('r2')","status":"live","server":"web","level":"propose","description":"Remove a style rule (id from list_style_rules). [logged in] — NO: Fjern en stilregel (id fra list_style_rules).","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"rule_id":{"type":"string","title":"Rule Id"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["rule_id"]}},{"name":"add_style_legend","cat":"plan","no":"Legg en tegnforklaring av stilreglene på et ark (erstatter en tidligere).","en":"Put a legend of the style rules on a sheet (replaces an earlier one).","method":"POST","path":"/sessions/{sid}/style/legend","access":"login","effect":"write","mcp":"web","py":"add_style_legend('Planer')","example":{"sheet":"Planer"},"status":"live","server":"web","level":"propose","description":"Put a legend of the style rules on a sheet (replaces an earlier one). [logged in] — NO: Legg en tegnforklaring av stilreglene på et ark (erstatter en tidligere).","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"sheet":{"type":"string","title":"Sheet"},"x_mm":{"type":"number","title":"X Mm","default":12.0},"y_mm":{"type":"number","title":"Y Mm","default":12.0}},"required":["sheet"]}},{"name":"schedules","cat":"plan","no":"Lister (dører, vinduer, rom).","en":"Schedules (doors, windows, rooms).","method":"GET","path":"/sessions/{sid}/composer/schedules","access":"login","effect":"read","py":"vindu_dorliste()","status":"live","server":"web","level":"read","description":"Schedules (doors, windows, rooms). [logged in] — NO: Lister (dører, vinduer, rom).","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{}}},{"name":"schedules_sheet","cat":"plan","no":"Lister som ark.","en":"Schedules as a sheet.","method":"POST","path":"/sessions/{sid}/composer/schedules/sheet","access":"login","effect":"write","py":"vindu_dorliste_ark(paper='A3')","status":"live","server":"web","level":"propose","description":"Schedules as a sheet. [logged in] — NO: Lister som ark.","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"body":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},{"name":"compliance","cat":"regelsjekk","no":"Regelsjekk av modellen i økta (nasjonale regler + kommune); type=hus|hytte|garasje …","en":"Compliance check of the session's model (national rules + municipality); type=hus|hytte|garasje ...","method":"GET","path":"/sessions/{sid}/agent/compliance","access":"share","effect":"read","mcp":"web","py":"regelsjekk(kommune='3212', type='garasje')","status":"live","server":"web","level":"read","description":"Compliance check of the session's model (national rules + municipality); type=hus|hytte|garasje ... [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Regelsjekk av modellen i økta (nasjonale regler + kommune); type=hus|hytte|garasje …","category_label":"Regelsjekk","input_schema":{"type":"object","properties":{"kommune":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kommune"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"sandbox_compliance","cat":"regelsjekk","no":"Regelsjekk av sandkasseøktas modell (uten innlogging).","en":"Compliance check of the sandbox session's model (no login).","method":"GET","path":"/configurator/sandbox/session/{sid}/compliance","access":"public","effect":"read","mcp":"web","status":"live","server":"web","description":"Compliance check of the sandbox session's model (no login). [open, no login] — NO: Regelsjekk av sandkasseøktas modell (uten innlogging).","category_label":"Regelsjekk","input_schema":{"type":"object","properties":{"kommune":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kommune"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}}}},{"name":"public_compliance","cat":"regelsjekk","no":"Regelsjekk av en konfigurasjon (samme felt som quote) + kommune og tomtefakta.","en":"Compliance check of a configuration (same fields as quote) + municipality and site facts.","method":"POST","path":"/configurator/public/compliance","access":"public","effect":"read","mcp":"web","example":{"config":{"type":"garasje","width":6,"depth":8},"kommune":"3212"},"status":"live","server":"web","description":"Compliance check of a configuration (same fields as quote) + municipality and site facts. [open, no login] — NO: Regelsjekk av en konfigurasjon (samme felt som quote) + kommune og tomtefakta.","category_label":"Regelsjekk","input_schema":{"type":"object","properties":{"type":{"type":"string","title":"Type","default":"garasje"},"width":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Width","default":6.0},"depth":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Depth","default":6.0},"height_m":{"type":"number","maximum":6.0,"exclusiveMinimum":1.8,"title":"Height M","default":2.5},"storey_heights_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":1},{"type":"null"}],"title":"Storey Heights M"},"loft":{"type":"boolean","title":"Loft","default":false},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Roof Pitch Deg","default":22.0},"add_windows":{"type":"boolean","title":"Add Windows","default":true},"add_door":{"type":"boolean","title":"Add Door","default":true},"form_type":{"type":"string","pattern":"^(rect|L|L_flip|T|T_up|H|H_rot|U_up|U_down|S_left|S_right|N_left|N_right|cross_off|plus|step)$","title":"Form Type","default":"rect"},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Width M"},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Depth M"},"modules":{"anyOf":[{"items":{"properties":{"x":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"X","default":0.0},"y":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"Y","default":0.0},"w":{"type":"number","maximum":20.0,"minimum":1.0,"title":"W"},"d":{"type":"number","maximum":20.0,"minimum":1.0,"title":"D"},"ridge":{"type":"string","pattern":"^(x|y)$","title":"Ridge","default":"x"}},"additionalProperties":false,"type":"object","required":["w","d"],"title":"ModuleIn","description":"One rectangular module of a free footprint (metres, plan coordinates)."},"type":"array","maxItems":8,"minItems":1},{"type":"null"}],"title":"Modules"},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":40,"minItems":3},{"type":"null"}],"title":"Boundary"},"walls":{"anyOf":[{"items":{"properties":{"a":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"A"},"b":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"B"},"storey":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Storey","default":0},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"},"align":{"type":"string","pattern":"^(left|center|right)$","title":"Align","default":"left"},"thickness_m":{"anyOf":[{"type":"number","maximum":0.6,"minimum":0.03},{"type":"null"}],"title":"Thickness M"}},"additionalProperties":false,"type":"object","required":["a","b"],"title":"FreeWallIn","description":"An inner wall drawn by the customer: from ``a`` to ``b`` (plan metres) on storey ``storey`` (0 = ground).\n\n``door`` puts one door in the middle (the old contract). ``openings`` (T6c), when set, replaces\nit: exactly those windows / doors, so a drawing with an opening-free wall round-trips."},"type":"array","maxItems":60},{"type":"null"}],"title":"Walls"},"roof_form":{"type":"string","pattern":"^(gable|hip|shed|flat)$","title":"Roof Form","default":"gable"},"window_count":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":0.0},{"type":"null"}],"title":"Window Count"},"window_top_m":{"type":"number","maximum":3.0,"minimum":1.5,"title":"Window Top M","default":2.1},"window_width_m":{"type":"number","maximum":3.0,"minimum":0.4,"title":"Window Width M","default":1.2},"window_height_m":{"type":"number","maximum":2.5,"minimum":0.4,"title":"Window Height M","default":1.2},"door_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Door Side","default":"south"},"gate_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Gate Side","default":"south"},"gate_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Type"},"gate_size_dm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Size Dm"},"openings":{"anyOf":[{"items":{"properties":{"id":{"type":"string","maxLength":24,"title":"Id","default":""},"wall":{"type":"string","pattern":"^(south|north|east|west)[2-9]?$","title":"Wall","default":"south"},"kind":{"type":"string","pattern":"^(window|door|gate)$","title":"Kind","default":"window"},"type":{"type":"string","maxLength":24,"title":"Type","default":""},"w_m":{"type":"number","maximum":6.0,"minimum":0.4,"title":"W M","default":1.2},"h_m":{"type":"number","maximum":3.5,"minimum":0.4,"title":"H M","default":1.2},"sill_m":{"anyOf":[{"type":"number","maximum":2.5,"minimum":0.0},{"type":"null"}],"title":"Sill M"},"pos_m":{"anyOf":[{"type":"number","maximum":40.0,"minimum":0.0},{"type":"null"}],"title":"Pos M"},"hinge":{"anyOf":[{"type":"string","pattern":"^(left|right)$"},{"type":"null"}],"title":"Hinge"},"swing":{"anyOf":[{"type":"string","pattern":"^(in|out)$"},{"type":"null"}],"title":"Swing"}},"additionalProperties":false,"type":"object","title":"OpeningIn","description":"One window, door or gate on a named wall (see ``configurator.validate.ring_walls``)."},"type":"array","maxItems":40},{"type":"null"}],"title":"Openings"},"cladding_type":{"type":"string","title":"Cladding Type","default":"liggende"},"wall_cladding":{"anyOf":[{"additionalProperties":{"properties":{"on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On"},"type":{"anyOf":[{"type":"string","pattern":"^(stående|liggende)$"},{"type":"null"}],"title":"Type"},"material":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Material"}},"additionalProperties":false,"type":"object","title":"WallCladIn","description":"Own cladding on one wall (key as in /validate walls); a missing field keeps the building's."},"type":"object","maxProperties":40},{"type":"null"}],"title":"Wall Cladding"},"cladding_material":{"type":"string","title":"Cladding Material","default":"White"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"overhang_m":{"anyOf":[{"type":"number","maximum":1.5,"minimum":0.0},{"type":"null"}],"title":"Overhang M"},"corner_boards":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Corner Boards"},"cladding_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cladding On"},"style":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Style"},"outdoor":{"anyOf":[{"items":{"properties":{"kind":{"type":"string","pattern":"^(veranda|balkong|takaltan|terrasse|pergola)$","title":"Kind","default":"terrasse"},"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"south"},"width_m":{"type":"number","maximum":12.0,"minimum":1.0,"title":"Width M","default":4.0},"depth_m":{"type":"number","maximum":6.0,"minimum":1.0,"title":"Depth M","default":2.5}},"additionalProperties":false,"type":"object","title":"OutdoorIn","description":"A veranda / balkong / takaltan / terrasse / pergola on one side of the building."},"type":"array","maxItems":4},{"type":"null"}],"title":"Outdoor"},"partitions":{"anyOf":[{"items":{"properties":{"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"north"},"at_m":{"type":"number","maximum":30.0,"minimum":1.0,"title":"At M","default":2.5},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"}},"additionalProperties":false,"type":"object","title":"PartitionIn","description":"An inner wall parallel to ``side``, ``at_m`` metres in from it, with an optional door."},"type":"array","maxItems":4},{"type":"null"}],"title":"Partitions"},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","title":"Interior Finish","default":"ingen"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Interior Color"},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","title":"Ceiling","default":"ingen"},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}],"title":"Foundation"},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Site Fall Pct"},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Window Color"},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Door Color"},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}],"title":"Roof Covering"},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Roof Color"},"roof_edges":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Roof Edges"},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Dormers","default":0},"dormer_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Dormer Side","default":"south"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Roof Windows","default":0},"roof_window_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Roof Window Side","default":"south"},"roof_window_size":{"type":"string","pattern":"^[A-Z]{2}[0-9]{2}$","title":"Roof Window Size","default":"MK06"},"matrikkel_alt":{"type":"boolean","title":"Matrikkel Alt","default":false},"basis":{"type":"string","pattern":"^(net|list|sales)$","title":"Basis","default":"net"},"mesh":{"type":"boolean","title":"Mesh","default":false},"mesh_format":{"type":"string","pattern":"^(json|b64)$","title":"Mesh Format","default":"json"},"markup_pct":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Markup Pct","default":0.0},"calibrate":{"type":"boolean","title":"Calibrate","default":false},"plan":{"type":"boolean","title":"Plan","default":false},"kommune":{"anyOf":[{"type":"string","pattern":"^[a-z]{1,40}$"},{"type":"null"}],"title":"Kommune"},"site":{"anyOf":[{"properties":{"tiltak":{"anyOf":[{"type":"string","pattern":"^(nybygg|tilbygg)$"},{"type":"null"}],"title":"Tiltak"},"bebygd_eiendom":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bebygd Eiendom"},"over_ledninger":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Over Ledninger"},"gulv_over_terreng_m":{"anyOf":[{"type":"number","maximum":5.0,"minimum":-3.0},{"type":"null"}],"title":"Gulv Over Terreng M"},"avstand_nabogrense_m":{"anyOf":[{"type":"number","maximum":1000.0,"minimum":0.0},{"type":"null"}],"title":"Avstand Nabogrense M"},"avstand_bygning_m":{"anyOf":[{"type":"number","maximum":1000.0,"minimum":0.0},{"type":"null"}],"title":"Avstand Bygning M"},"avstand_vei_senterlinje_m":{"anyOf":[{"type":"number","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Avstand Vei Senterlinje M"},"vei":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}],"title":"Vei"},"avstand_sjo_m":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Avstand Sjo M"},"avstand_elv_bekk_m":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Avstand Elv Bekk M"},"avstand_annet_vassdrag_m":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Avstand Annet Vassdrag M"},"tomt_m2":{"anyOf":[{"type":"number","maximum":10000000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Tomt M2"},"eksisterende_bya_m2":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Eksisterende Bya M2"},"eksisterende_bra_m2":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Eksisterende Bra M2"},"mua_m2":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"null"}],"title":"Mua M2"},"mua_terreng_m2":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"null"}],"title":"Mua Terreng M2"},"arealformal":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,40}$"},{"type":"null"}],"title":"Arealformal"},"stoysone":{"anyOf":[{"type":"string","pattern":"^(ingen|gul|rod)$"},{"type":"null"}],"title":"Stoysone"},"reguleringsplan":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reguleringsplan"}},"additionalProperties":false,"type":"object","title":"SiteIn","description":"What the model does not know about the site (all optional; unknown -> «ukjent» finding)."},{"type":"null"}]}}}},{"name":"energy_envelope","cat":"energi","no":"Klimaskjermens arealgrunnlag fra modellen: yttervegg over/under terreng, vinduer og dører per himmelretning, tak, gulv mot grunn / det fri / uoppvarmet, oppvarmet BRA og luftvolum. MÅLT og ANTATT holdes fra hverandre (kilder). uoppvarmet=Loft,Kjeller; maalemetode=ytre|indre; nord_grader (standard: georef eller 0); sektorer=8|4 (retninger).","en":"Building-envelope areas from the model: walls above/below terrain, windows and doors per compass direction, roof, floor against ground / open air / unheated space, heated BRA and air volume. MEASURED and ASSUMED are kept apart (kilder). uoppvarmet=Loft,Kjeller; maalemetode=ytre|indre; nord_grader (default: georef or 0); sektorer=8|4 (directions).","method":"GET","path":"/sessions/{sid}/agent/energy/envelope","access":"share","effect":"read","mcp":"web","py":"energy_envelope(uoppvarmet='Loft')","ops":["energy_envelope"],"status":"live","server":"web","returns":"poster{yttervegg,vegg_mot_grunn,vinduer,dorer,takvinduer,tak,gulv_*,tak_mot_uoppvarmet}.areal_m2/per_retning/per_etasje, bra_oppvarmet_m2, luftvolum_m3, klimaskjerm_m2, kilder{malt,antatt}, advarsler","level":"read","description":"Building-envelope areas from the model: walls above/below terrain, windows and doors per compass direction, roof, floor against ground / open air / unheated space, heated BRA and air volume. MEASURED and ASSUMED are kept apart (kilder). uoppvarmet=Loft,Kjeller; maalemetode=ytre|indre; nord_grader (default: georef or 0); sektorer=8|4 (directions). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Klimaskjermens arealgrunnlag fra modellen: yttervegg over/under terreng, vinduer og dører per himmelretning, tak, gulv mot grunn / det fri / uoppvarmet, oppvarmet BRA og luftvolum. MÅLT og ANTATT holdes fra hverandre (kilder). uoppvarmet=Loft,Kjeller; maalemetode=ytre|indre; nord_grader (standard: georef eller 0); sektorer=8|4 (retninger).","category_label":"Energi (klimaskjerm og energiberegning)","input_schema":{"type":"object","properties":{"uoppvarmet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uoppvarmet"},"maalemetode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maalemetode"},"nord_grader":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Nord Grader"},"gulv_margin_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gulv Margin M"},"sektorer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sektorer"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"energy_report","cat":"energi","no":"Utkast til energirapport (TEK17 kap. 14, 12 deler, markdown) fra klimaskjermens arealer. Tall er merket (M) målt, (O) oppgitt, (B) beregnet, (A) antatt; det som mangler står som [ ]/[NAVN]. inndata: adresse, gnr, bnr, kommune, n50, kuldebro, u{yttervegg,fri_kjellervegg,kjellervegg,plate,tak,vindu,dor}. Avgjør ingenting selv: konklusjon, ventilasjon, energiforsyning og energibudsjett kommer fra Rockwool.","en":"Draft energy report (TEK17 ch. 14, 12 parts, markdown) from the building-envelope areas. Numbers are tagged (M) measured, (O) given, (B) calculated, (A) assumed; what is missing stays [ ]/[NAME]. inndata: adresse, gnr, bnr, kommune, n50, kuldebro, u{yttervegg,fri_kjellervegg,kjellervegg,plate,tak,vindu,dor}. Decides nothing itself: conclusion, ventilation, energy supply and energy budget come from Rockwool.","method":"POST","path":"/sessions/{sid}/agent/energy/report","access":"share","effect":"read","mcp":"web","py":"energy_report({'adresse': 'Testveien 1', 'u': {'yttervegg': 0.18}})","ops":["energy_report"],"example":{"inndata":{"adresse":"Testveien 1","u":{"yttervegg":0.18,"tak":0.13}},"uoppvarmet":"Loft"},"status":"live","server":"web","returns":"{markdown, malt[], oppgitt[], beregnet[], antatt[], mangler_navngitte[], mangler_tall, veiledende}","level":"read","description":"Draft energy report (TEK17 ch. 14, 12 parts, markdown) from the building-envelope areas. Numbers are tagged (M) measured, (O) given, (B) calculated, (A) assumed; what is missing stays [ ]/[NAME]. inndata: adresse, gnr, bnr, kommune, n50, kuldebro, u{yttervegg,fri_kjellervegg,kjellervegg,plate,tak,vindu,dor}. Decides nothing itself: conclusion, ventilation, energy supply and energy budget come from Rockwool. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Utkast til energirapport (TEK17 kap. 14, 12 deler, markdown) fra klimaskjermens arealer. Tall er merket (M) målt, (O) oppgitt, (B) beregnet, (A) antatt; det som mangler står som [ ]/[NAVN]. inndata: adresse, gnr, bnr, kommune, n50, kuldebro, u{yttervegg,fri_kjellervegg,kjellervegg,plate,tak,vindu,dor}. Avgjør ingenting selv: konklusjon, ventilasjon, energiforsyning og energibudsjett kommer fra Rockwool.","category_label":"Energi (klimaskjerm og energiberegning)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"inndata":{"additionalProperties":true,"type":"object","title":"Inndata","default":{}},"uoppvarmet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uoppvarmet"},"maalemetode":{"anyOf":[{"type":"string","enum":["ytre","indre"]},{"type":"null"}],"title":"Maalemetode"},"nord_grader":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Nord Grader"},"merking":{"type":"boolean","title":"Merking","default":true}}}},{"name":"export_energi_xlsx","cat":"energi","no":"Klimaskjermens arealer som Excel i Tegnebuas mal Underlag_Energiberegninger (arket Underlag, A2:G55, en blokk per oppvarmet plan, fire fasader) pluss arkene Kilder (MÅLT/ANTATT) og Rockwool (innleggingsark). uoppvarmet=Loft,Kjeller; maalemetode=ytre|indre; nord_grader; u_vindu og u_dor fyller U-verdi-kolonnen.","en":"Building-envelope areas as Excel in Tegnebua's template Underlag_Energiberegninger (sheet Underlag, A2:G55, one block per heated storey, four facades) plus the sheets Kilder (MEASURED/ASSUMED) and Rockwool (entry sheet). uoppvarmet=Loft,Kjeller; maalemetode=ytre|indre; nord_grader; u_vindu and u_dor fill the U-value column.","method":"GET","path":"/sessions/{sid}/export/energi.xlsx","access":"login","effect":"read","mcp":"web","status":"live","server":"web","level":"read","description":"Building-envelope areas as Excel in Tegnebua's template Underlag_Energiberegninger (sheet Underlag, A2:G55, one block per heated storey, four facades) plus the sheets Kilder (MEASURED/ASSUMED) and Rockwool (entry sheet). uoppvarmet=Loft,Kjeller; maalemetode=ytre|indre; nord_grader; u_vindu and u_dor fill the U-value column. [logged in] — NO: Klimaskjermens arealer som Excel i Tegnebuas mal Underlag_Energiberegninger (arket Underlag, A2:G55, en blokk per oppvarmet plan, fire fasader) pluss arkene Kilder (MÅLT/ANTATT) og Rockwool (innleggingsark). uoppvarmet=Loft,Kjeller; maalemetode=ytre|indre; nord_grader; u_vindu og u_dor fyller U-verdi-kolonnen.","category_label":"Energi (klimaskjerm og energiberegning)","input_schema":{"type":"object","properties":{"uoppvarmet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uoppvarmet"},"maalemetode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maalemetode"},"nord_grader":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Nord Grader"},"u_vindu":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"U Vindu"},"u_dor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"U Dor"}}}},{"name":"public_catalog","cat":"pris","no":"Konfiguratorkatalog: bygningstyper (inkl. matrikkelkoder), former, valg.","en":"Configurator catalog: building types (incl. matrikkel codes), forms, choices.","method":"GET","path":"/configurator/public/catalog","access":"public","effect":"read","mcp":"web","status":"live","server":"web","description":"Configurator catalog: building types (incl. matrikkel codes), forms, choices. [open, no login] — NO: Konfiguratorkatalog: bygningstyper (inkl. matrikkelkoder), former, valg.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{}}},{"name":"public_quote","cat":"pris","no":"Bygg en konfigurasjon og få pris; plan=true gir 2D-planen, mesh=true 3D.","en":"Build a configuration and get a price; plan=true adds the 2D plan, mesh=true the 3D mesh.","method":"POST","path":"/configurator/public/quote","access":"public","effect":"read","mcp":"web","example":{"type":"garasje","width":6,"depth":8,"roof_form":"gable","plan":true},"status":"live","server":"web","description":"Build a configuration and get a price; plan=true adds the 2D plan, mesh=true the 3D mesh. [open, no login] — NO: Bygg en konfigurasjon og få pris; plan=true gir 2D-planen, mesh=true 3D.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"type":{"type":"string","title":"Type","default":"garasje"},"width":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Width","default":6.0},"depth":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Depth","default":6.0},"height_m":{"type":"number","maximum":6.0,"exclusiveMinimum":1.8,"title":"Height M","default":2.5},"storey_heights_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":1},{"type":"null"}],"title":"Storey Heights M"},"loft":{"type":"boolean","title":"Loft","default":false},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Roof Pitch Deg","default":22.0},"add_windows":{"type":"boolean","title":"Add Windows","default":true},"add_door":{"type":"boolean","title":"Add Door","default":true},"form_type":{"type":"string","pattern":"^(rect|L|L_flip|T|T_up|H|H_rot|U_up|U_down|S_left|S_right|N_left|N_right|cross_off|plus|step)$","title":"Form Type","default":"rect"},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Width M"},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Depth M"},"modules":{"anyOf":[{"items":{"properties":{"x":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"X","default":0.0},"y":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"Y","default":0.0},"w":{"type":"number","maximum":20.0,"minimum":1.0,"title":"W"},"d":{"type":"number","maximum":20.0,"minimum":1.0,"title":"D"},"ridge":{"type":"string","pattern":"^(x|y)$","title":"Ridge","default":"x"}},"additionalProperties":false,"type":"object","required":["w","d"],"title":"ModuleIn","description":"One rectangular module of a free footprint (metres, plan coordinates)."},"type":"array","maxItems":8,"minItems":1},{"type":"null"}],"title":"Modules"},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":40,"minItems":3},{"type":"null"}],"title":"Boundary"},"walls":{"anyOf":[{"items":{"properties":{"a":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"A"},"b":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"B"},"storey":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Storey","default":0},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"},"align":{"type":"string","pattern":"^(left|center|right)$","title":"Align","default":"left"},"thickness_m":{"anyOf":[{"type":"number","maximum":0.6,"minimum":0.03},{"type":"null"}],"title":"Thickness M"}},"additionalProperties":false,"type":"object","required":["a","b"],"title":"FreeWallIn","description":"An inner wall drawn by the customer: from ``a`` to ``b`` (plan metres) on storey ``storey`` (0 = ground).\n\n``door`` puts one door in the middle (the old contract). ``openings`` (T6c), when set, replaces\nit: exactly those windows / doors, so a drawing with an opening-free wall round-trips."},"type":"array","maxItems":60},{"type":"null"}],"title":"Walls"},"roof_form":{"type":"string","pattern":"^(gable|hip|shed|flat)$","title":"Roof Form","default":"gable"},"window_count":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":0.0},{"type":"null"}],"title":"Window Count"},"window_top_m":{"type":"number","maximum":3.0,"minimum":1.5,"title":"Window Top M","default":2.1},"window_width_m":{"type":"number","maximum":3.0,"minimum":0.4,"title":"Window Width M","default":1.2},"window_height_m":{"type":"number","maximum":2.5,"minimum":0.4,"title":"Window Height M","default":1.2},"door_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Door Side","default":"south"},"gate_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Gate Side","default":"south"},"gate_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Type"},"gate_size_dm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Size Dm"},"openings":{"anyOf":[{"items":{"properties":{"id":{"type":"string","maxLength":24,"title":"Id","default":""},"wall":{"type":"string","pattern":"^(south|north|east|west)[2-9]?$","title":"Wall","default":"south"},"kind":{"type":"string","pattern":"^(window|door|gate)$","title":"Kind","default":"window"},"type":{"type":"string","maxLength":24,"title":"Type","default":""},"w_m":{"type":"number","maximum":6.0,"minimum":0.4,"title":"W M","default":1.2},"h_m":{"type":"number","maximum":3.5,"minimum":0.4,"title":"H M","default":1.2},"sill_m":{"anyOf":[{"type":"number","maximum":2.5,"minimum":0.0},{"type":"null"}],"title":"Sill M"},"pos_m":{"anyOf":[{"type":"number","maximum":40.0,"minimum":0.0},{"type":"null"}],"title":"Pos M"},"hinge":{"anyOf":[{"type":"string","pattern":"^(left|right)$"},{"type":"null"}],"title":"Hinge"},"swing":{"anyOf":[{"type":"string","pattern":"^(in|out)$"},{"type":"null"}],"title":"Swing"}},"additionalProperties":false,"type":"object","title":"OpeningIn","description":"One window, door or gate on a named wall (see ``configurator.validate.ring_walls``)."},"type":"array","maxItems":40},{"type":"null"}],"title":"Openings"},"cladding_type":{"type":"string","title":"Cladding Type","default":"liggende"},"wall_cladding":{"anyOf":[{"additionalProperties":{"properties":{"on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On"},"type":{"anyOf":[{"type":"string","pattern":"^(stående|liggende)$"},{"type":"null"}],"title":"Type"},"material":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Material"}},"additionalProperties":false,"type":"object","title":"WallCladIn","description":"Own cladding on one wall (key as in /validate walls); a missing field keeps the building's."},"type":"object","maxProperties":40},{"type":"null"}],"title":"Wall Cladding"},"cladding_material":{"type":"string","title":"Cladding Material","default":"White"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"overhang_m":{"anyOf":[{"type":"number","maximum":1.5,"minimum":0.0},{"type":"null"}],"title":"Overhang M"},"corner_boards":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Corner Boards"},"cladding_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cladding On"},"style":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Style"},"outdoor":{"anyOf":[{"items":{"properties":{"kind":{"type":"string","pattern":"^(veranda|balkong|takaltan|terrasse|pergola)$","title":"Kind","default":"terrasse"},"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"south"},"width_m":{"type":"number","maximum":12.0,"minimum":1.0,"title":"Width M","default":4.0},"depth_m":{"type":"number","maximum":6.0,"minimum":1.0,"title":"Depth M","default":2.5}},"additionalProperties":false,"type":"object","title":"OutdoorIn","description":"A veranda / balkong / takaltan / terrasse / pergola on one side of the building."},"type":"array","maxItems":4},{"type":"null"}],"title":"Outdoor"},"partitions":{"anyOf":[{"items":{"properties":{"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"north"},"at_m":{"type":"number","maximum":30.0,"minimum":1.0,"title":"At M","default":2.5},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"}},"additionalProperties":false,"type":"object","title":"PartitionIn","description":"An inner wall parallel to ``side``, ``at_m`` metres in from it, with an optional door."},"type":"array","maxItems":4},{"type":"null"}],"title":"Partitions"},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","title":"Interior Finish","default":"ingen"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Interior Color"},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","title":"Ceiling","default":"ingen"},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}],"title":"Foundation"},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Site Fall Pct"},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Window Color"},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Door Color"},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}],"title":"Roof Covering"},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Roof Color"},"roof_edges":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Roof Edges"},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Dormers","default":0},"dormer_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Dormer Side","default":"south"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Roof Windows","default":0},"roof_window_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Roof Window Side","default":"south"},"roof_window_size":{"type":"string","pattern":"^[A-Z]{2}[0-9]{2}$","title":"Roof Window Size","default":"MK06"},"matrikkel_alt":{"type":"boolean","title":"Matrikkel Alt","default":false},"basis":{"type":"string","pattern":"^(net|list|sales)$","title":"Basis","default":"net"},"mesh":{"type":"boolean","title":"Mesh","default":false},"mesh_format":{"type":"string","pattern":"^(json|b64)$","title":"Mesh Format","default":"json"},"markup_pct":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Markup Pct","default":0.0},"calibrate":{"type":"boolean","title":"Calibrate","default":false},"plan":{"type":"boolean","title":"Plan","default":false}}}},{"name":"public_quote_get","cat":"pris","no":"GET-inngang (bare nettsidehenting): pris + matrikkelkode + regelsjekk + lenker fra query-parametre. Tomtedata (site_nabo_m, site_annen_bygning_m, site_vei_m, vei, site_sjo_m, gulv_over_terreng_m, bebygd_eiendom, tomt_m2 ...) gjør ukjente funn kjente (se `still_unknown`); full=1 gir alle funn; svaret har `defaults` (standardmål), `price_includes`/`price_excludes` og `links.plan_page` (lim ordrett).","en":"GET entry (web fetch only): price + matrikkel code + compliance + links from query parameters. Site parameters (site_nabo_m, site_annen_bygning_m, site_vei_m, vei, site_sjo_m, gulv_over_terreng_m, bebygd_eiendom, tomt_m2 ...) make unknown findings known (see still_unknown); full=1 returns all findings; the answer has defaults, price_includes/price_excludes and links.plan_page (paste verbatim).","method":"GET","path":"/configurator/public/quote","access":"public","effect":"read","mcp":"web","example":{"type":"garasje","width":8,"depth":6,"door":"south","window":"east"},"status":"live","server":"web","description":"GET entry (web fetch only): price + matrikkel code + compliance + links from query parameters. Site parameters (site_nabo_m, site_annen_bygning_m, site_vei_m, vei, site_sjo_m, gulv_over_terreng_m, bebygd_eiendom, tomt_m2 ...) make unknown findings known (see still_unknown); full=1 returns all findings; the answer has defaults, price_includes/price_excludes and links.plan_page (paste verbatim). [open, no login] — NO: GET-inngang (bare nettsidehenting): pris + matrikkelkode + regelsjekk + lenker fra query-parametre. Tomtedata (site_nabo_m, site_annen_bygning_m, site_vei_m, vei, site_sjo_m, gulv_over_terreng_m, bebygd_eiendom, tomt_m2 ...) gjør ukjente funn kjente (se `still_unknown`); full=1 gir alle funn; svaret har `defaults` (standardmål), `price_includes`/`price_excludes` og `links.plan_page` (lim ordrett).","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"type":{"type":"string","default":"garasje","title":"Type"},"width":{"type":"number","default":6.0,"title":"Width"},"depth":{"type":"number","default":6.0,"title":"Depth"},"door":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Door"},"window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window"},"roof":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Roof"},"plan":{"type":"boolean","default":false,"title":"Plan"},"kommune":{"anyOf":[{"type":"string","pattern":"^[a-z0-9]{1,40}$"},{"type":"null"}],"title":"Kommune"},"full":{"type":"boolean","default":false,"title":"Full"},"site_nabo_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"avstand til nabogrense, m","title":"Site Nabo M"},"site_annen_bygning_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"avstand til annen bygning, m","title":"Site Annen Bygning M"},"site_vei_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"avstand til veiens senterlinje, m","title":"Site Vei M"},"vei":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"veinummer, f.eks. fv157","title":"Vei"},"site_sjo_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"avstand til sjøen, m","title":"Site Sjo M"},"site_elv_bekk_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"avstand til elv/bekk, m","title":"Site Elv Bekk M"},"site_vassdrag_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"avstand til tjern/myr/dam, m","title":"Site Vassdrag M"},"gulv_over_terreng_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"gulv over terreng, m","title":"Gulv Over Terreng M"},"bebygd_eiendom":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"1/0","title":"Bebygd Eiendom"},"over_ledninger":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"1/0","title":"Over Ledninger"},"tomt_m2":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"tomteareal, m2","title":"Tomt M2"},"eksisterende_bya_m2":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"eksisterende BYA, m2","title":"Eksisterende Bya M2"},"eksisterende_bra_m2":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"eksisterende BRA, m2","title":"Eksisterende Bra M2"},"mua_m2":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"uteoppholdsareal, m2","title":"Mua M2"},"mua_terreng_m2":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"MUA paa terreng, m2","title":"Mua Terreng M2"},"arealformal":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"arealformaal","title":"Arealformal"},"stoysone":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ingen|gul|rod","title":"Stoysone"},"reguleringsplan":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"1/0","title":"Reguleringsplan"},"tiltak":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"nybygg|tilbygg","title":"Tiltak"}}}},{"name":"public_compliance_get","cat":"regelsjekk","no":"GET-inngang: regelsjekk fra query-parametre (type, width, depth, door, window, roof, kommune, full=1 og tomtedata: site_nabo_m, site_annen_bygning_m, site_vei_m, vei, site_sjo_m, gulv_over_terreng_m, bebygd_eiendom).","en":"GET entry: compliance check of a configuration from query parameters.","method":"GET","path":"/configurator/public/compliance","access":"public","effect":"read","mcp":"web","example":{"type":"garasje","width":8,"depth":6,"door":"south"},"status":"live","server":"web","description":"GET entry: compliance check of a configuration from query parameters. [open, no login] — NO: GET-inngang: regelsjekk fra query-parametre (type, width, depth, door, window, roof, kommune, full=1 og tomtedata: site_nabo_m, site_annen_bygning_m, site_vei_m, vei, site_sjo_m, gulv_over_terreng_m, bebygd_eiendom).","category_label":"Regelsjekk","input_schema":{"type":"object","properties":{"type":{"type":"string","default":"garasje","title":"Type"},"width":{"type":"number","default":6.0,"title":"Width"},"depth":{"type":"number","default":6.0,"title":"Depth"},"door":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Door"},"window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window"},"roof":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Roof"},"kommune":{"anyOf":[{"type":"string","pattern":"^[a-z0-9]{1,40}$"},{"type":"null"}],"title":"Kommune"},"full":{"type":"boolean","default":false,"title":"Full"},"site_nabo_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"avstand til nabogrense, m","title":"Site Nabo M"},"site_annen_bygning_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"avstand til annen bygning, m","title":"Site Annen Bygning M"},"site_vei_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"avstand til veiens senterlinje, m","title":"Site Vei M"},"vei":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"veinummer, f.eks. fv157","title":"Vei"},"site_sjo_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"avstand til sjøen, m","title":"Site Sjo M"},"site_elv_bekk_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"avstand til elv/bekk, m","title":"Site Elv Bekk M"},"site_vassdrag_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"avstand til tjern/myr/dam, m","title":"Site Vassdrag M"},"gulv_over_terreng_m":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"gulv over terreng, m","title":"Gulv Over Terreng M"},"bebygd_eiendom":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"1/0","title":"Bebygd Eiendom"},"over_ledninger":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"1/0","title":"Over Ledninger"},"tomt_m2":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"tomteareal, m2","title":"Tomt M2"},"eksisterende_bya_m2":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"eksisterende BYA, m2","title":"Eksisterende Bya M2"},"eksisterende_bra_m2":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"eksisterende BRA, m2","title":"Eksisterende Bra M2"},"mua_m2":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"uteoppholdsareal, m2","title":"Mua M2"},"mua_terreng_m2":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"MUA paa terreng, m2","title":"Mua Terreng M2"},"arealformal":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"arealformaal","title":"Arealformal"},"stoysone":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ingen|gul|rod","title":"Stoysone"},"reguleringsplan":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"1/0","title":"Reguleringsplan"},"tiltak":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"nybygg|tilbygg","title":"Tiltak"}}}},{"name":"public_plan_svg","cat":"plan","no":"GET-inngang: 2D-planen til en konfigurasjon som SVG (samme parametre som quote).","en":"GET entry: the 2D plan of a configuration as SVG (same parameters as quote).","method":"GET","path":"/configurator/public/plan.svg","access":"public","effect":"read","example":{"type":"garasje","width":8,"depth":6,"door":"south","window":"east"},"status":"live","server":"web","description":"GET entry: the 2D plan of a configuration as SVG (same parameters as quote). [open, no login] — NO: GET-inngang: 2D-planen til en konfigurasjon som SVG (samme parametre som quote).","category_label":"Plan, stil og presets","input_schema":{"type":"object","properties":{"type":{"type":"string","default":"garasje","title":"Type"},"width":{"type":"number","default":6.0,"title":"Width"},"depth":{"type":"number","default":6.0,"title":"Depth"},"door":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Door"},"window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window"},"roof":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Roof"}}}},{"name":"public_describe","cat":"pris","no":"Fritekst → endringer i konfigurasjonen.","en":"Free text -> changes to the configuration.","method":"POST","path":"/configurator/public/describe","access":"public","effect":"read","status":"live","server":"web","description":"Free text -> changes to the configuration. [open, no login] — NO: Fritekst → endringer i konfigurasjonen.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"text":{"type":"string","maxLength":1200,"minLength":2,"title":"Text"},"current":{"additionalProperties":true,"type":"object","title":"Current"}},"required":["text"]}},{"name":"public_layout","cat":"pris","no":"Automatiske åpninger for valgene.","en":"Automatic openings for the choices.","method":"POST","path":"/configurator/public/layout","access":"public","effect":"read","status":"live","server":"web","description":"Automatic openings for the choices. [open, no login] — NO: Automatiske åpninger for valgene.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"type":{"type":"string","title":"Type","default":"garasje"},"width":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Width","default":6.0},"depth":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Depth","default":6.0},"height_m":{"type":"number","maximum":6.0,"exclusiveMinimum":1.8,"title":"Height M","default":2.5},"storey_heights_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":1},{"type":"null"}],"title":"Storey Heights M"},"loft":{"type":"boolean","title":"Loft","default":false},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Roof Pitch Deg","default":22.0},"add_windows":{"type":"boolean","title":"Add Windows","default":true},"add_door":{"type":"boolean","title":"Add Door","default":true},"form_type":{"type":"string","pattern":"^(rect|L|L_flip|T|T_up|H|H_rot|U_up|U_down|S_left|S_right|N_left|N_right|cross_off|plus|step)$","title":"Form Type","default":"rect"},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Width M"},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Depth M"},"modules":{"anyOf":[{"items":{"properties":{"x":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"X","default":0.0},"y":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"Y","default":0.0},"w":{"type":"number","maximum":20.0,"minimum":1.0,"title":"W"},"d":{"type":"number","maximum":20.0,"minimum":1.0,"title":"D"},"ridge":{"type":"string","pattern":"^(x|y)$","title":"Ridge","default":"x"}},"additionalProperties":false,"type":"object","required":["w","d"],"title":"ModuleIn","description":"One rectangular module of a free footprint (metres, plan coordinates)."},"type":"array","maxItems":8,"minItems":1},{"type":"null"}],"title":"Modules"},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":40,"minItems":3},{"type":"null"}],"title":"Boundary"},"walls":{"anyOf":[{"items":{"properties":{"a":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"A"},"b":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"B"},"storey":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Storey","default":0},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"},"align":{"type":"string","pattern":"^(left|center|right)$","title":"Align","default":"left"},"thickness_m":{"anyOf":[{"type":"number","maximum":0.6,"minimum":0.03},{"type":"null"}],"title":"Thickness M"}},"additionalProperties":false,"type":"object","required":["a","b"],"title":"FreeWallIn","description":"An inner wall drawn by the customer: from ``a`` to ``b`` (plan metres) on storey ``storey`` (0 = ground).\n\n``door`` puts one door in the middle (the old contract). ``openings`` (T6c), when set, replaces\nit: exactly those windows / doors, so a drawing with an opening-free wall round-trips."},"type":"array","maxItems":60},{"type":"null"}],"title":"Walls"},"roof_form":{"type":"string","pattern":"^(gable|hip|shed|flat)$","title":"Roof Form","default":"gable"},"window_count":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":0.0},{"type":"null"}],"title":"Window Count"},"window_top_m":{"type":"number","maximum":3.0,"minimum":1.5,"title":"Window Top M","default":2.1},"window_width_m":{"type":"number","maximum":3.0,"minimum":0.4,"title":"Window Width M","default":1.2},"window_height_m":{"type":"number","maximum":2.5,"minimum":0.4,"title":"Window Height M","default":1.2},"door_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Door Side","default":"south"},"gate_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Gate Side","default":"south"},"gate_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Type"},"gate_size_dm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Size Dm"},"openings":{"anyOf":[{"items":{"properties":{"id":{"type":"string","maxLength":24,"title":"Id","default":""},"wall":{"type":"string","pattern":"^(south|north|east|west)[2-9]?$","title":"Wall","default":"south"},"kind":{"type":"string","pattern":"^(window|door|gate)$","title":"Kind","default":"window"},"type":{"type":"string","maxLength":24,"title":"Type","default":""},"w_m":{"type":"number","maximum":6.0,"minimum":0.4,"title":"W M","default":1.2},"h_m":{"type":"number","maximum":3.5,"minimum":0.4,"title":"H M","default":1.2},"sill_m":{"anyOf":[{"type":"number","maximum":2.5,"minimum":0.0},{"type":"null"}],"title":"Sill M"},"pos_m":{"anyOf":[{"type":"number","maximum":40.0,"minimum":0.0},{"type":"null"}],"title":"Pos M"},"hinge":{"anyOf":[{"type":"string","pattern":"^(left|right)$"},{"type":"null"}],"title":"Hinge"},"swing":{"anyOf":[{"type":"string","pattern":"^(in|out)$"},{"type":"null"}],"title":"Swing"}},"additionalProperties":false,"type":"object","title":"OpeningIn","description":"One window, door or gate on a named wall (see ``configurator.validate.ring_walls``)."},"type":"array","maxItems":40},{"type":"null"}],"title":"Openings"},"cladding_type":{"type":"string","title":"Cladding Type","default":"liggende"},"wall_cladding":{"anyOf":[{"additionalProperties":{"properties":{"on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On"},"type":{"anyOf":[{"type":"string","pattern":"^(stående|liggende)$"},{"type":"null"}],"title":"Type"},"material":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Material"}},"additionalProperties":false,"type":"object","title":"WallCladIn","description":"Own cladding on one wall (key as in /validate walls); a missing field keeps the building's."},"type":"object","maxProperties":40},{"type":"null"}],"title":"Wall Cladding"},"cladding_material":{"type":"string","title":"Cladding Material","default":"White"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"overhang_m":{"anyOf":[{"type":"number","maximum":1.5,"minimum":0.0},{"type":"null"}],"title":"Overhang M"},"corner_boards":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Corner Boards"},"cladding_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cladding On"},"style":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Style"},"outdoor":{"anyOf":[{"items":{"properties":{"kind":{"type":"string","pattern":"^(veranda|balkong|takaltan|terrasse|pergola)$","title":"Kind","default":"terrasse"},"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"south"},"width_m":{"type":"number","maximum":12.0,"minimum":1.0,"title":"Width M","default":4.0},"depth_m":{"type":"number","maximum":6.0,"minimum":1.0,"title":"Depth M","default":2.5}},"additionalProperties":false,"type":"object","title":"OutdoorIn","description":"A veranda / balkong / takaltan / terrasse / pergola on one side of the building."},"type":"array","maxItems":4},{"type":"null"}],"title":"Outdoor"},"partitions":{"anyOf":[{"items":{"properties":{"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"north"},"at_m":{"type":"number","maximum":30.0,"minimum":1.0,"title":"At M","default":2.5},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"}},"additionalProperties":false,"type":"object","title":"PartitionIn","description":"An inner wall parallel to ``side``, ``at_m`` metres in from it, with an optional door."},"type":"array","maxItems":4},{"type":"null"}],"title":"Partitions"},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","title":"Interior Finish","default":"ingen"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Interior Color"},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","title":"Ceiling","default":"ingen"},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}],"title":"Foundation"},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Site Fall Pct"},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Window Color"},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Door Color"},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}],"title":"Roof Covering"},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Roof Color"},"roof_edges":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Roof Edges"},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Dormers","default":0},"dormer_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Dormer Side","default":"south"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Roof Windows","default":0},"roof_window_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Roof Window Side","default":"south"},"roof_window_size":{"type":"string","pattern":"^[A-Z]{2}[0-9]{2}$","title":"Roof Window Size","default":"MK06"},"matrikkel_alt":{"type":"boolean","title":"Matrikkel Alt","default":false},"basis":{"type":"string","pattern":"^(net|list|sales)$","title":"Basis","default":"net"},"mesh":{"type":"boolean","title":"Mesh","default":false},"mesh_format":{"type":"string","pattern":"^(json|b64)$","title":"Mesh Format","default":"json"},"markup_pct":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Markup Pct","default":0.0},"calibrate":{"type":"boolean","title":"Calibrate","default":false},"plan":{"type":"boolean","title":"Plan","default":false}}}},{"name":"public_forms","cat":"pris","no":"Alle former (ringer) i én størrelse.","en":"Every form (rings) at one size.","method":"GET","path":"/configurator/public/forms","access":"public","effect":"read","status":"live","server":"web","description":"Every form (rings) at one size. [open, no login] — NO: Alle former (ringer) i én størrelse.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"width":{"type":"number","default":12.0,"title":"Width"},"depth":{"type":"number","default":9.0,"title":"Depth"}}}},{"name":"public_modules","cat":"pris","no":"En form som redigerbare moduler.","en":"A form as editable modules.","method":"POST","path":"/configurator/public/modules","access":"public","effect":"read","status":"live","server":"web","description":"A form as editable modules. [open, no login] — NO: En form som redigerbare moduler.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"form_type":{"type":"string","pattern":"^[A-Za-z_]{1,16}$","title":"Form Type","default":"rect"},"width":{"type":"number","maximum":20.0,"minimum":2.0,"title":"Width","default":8.0},"depth":{"type":"number","maximum":20.0,"minimum":2.0,"title":"Depth","default":6.0},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Width M"},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Depth M"}}}},{"name":"public_validate","cat":"pris","no":"Vegger og åpningsproblemer uten å bygge.","en":"Walls and opening problems without building.","method":"POST","path":"/configurator/public/validate","access":"public","effect":"read","mcp":"web","status":"live","server":"web","description":"Walls and opening problems without building. [open, no login] — NO: Vegger og åpningsproblemer uten å bygge.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"type":{"type":"string","title":"Type","default":"garasje"},"width":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Width","default":6.0},"depth":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Depth","default":6.0},"height_m":{"type":"number","maximum":6.0,"exclusiveMinimum":1.8,"title":"Height M","default":2.5},"storey_heights_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":1},{"type":"null"}],"title":"Storey Heights M"},"loft":{"type":"boolean","title":"Loft","default":false},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Roof Pitch Deg","default":22.0},"add_windows":{"type":"boolean","title":"Add Windows","default":true},"add_door":{"type":"boolean","title":"Add Door","default":true},"form_type":{"type":"string","pattern":"^(rect|L|L_flip|T|T_up|H|H_rot|U_up|U_down|S_left|S_right|N_left|N_right|cross_off|plus|step)$","title":"Form Type","default":"rect"},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Width M"},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Depth M"},"modules":{"anyOf":[{"items":{"properties":{"x":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"X","default":0.0},"y":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"Y","default":0.0},"w":{"type":"number","maximum":20.0,"minimum":1.0,"title":"W"},"d":{"type":"number","maximum":20.0,"minimum":1.0,"title":"D"},"ridge":{"type":"string","pattern":"^(x|y)$","title":"Ridge","default":"x"}},"additionalProperties":false,"type":"object","required":["w","d"],"title":"ModuleIn","description":"One rectangular module of a free footprint (metres, plan coordinates)."},"type":"array","maxItems":8,"minItems":1},{"type":"null"}],"title":"Modules"},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":40,"minItems":3},{"type":"null"}],"title":"Boundary"},"walls":{"anyOf":[{"items":{"properties":{"a":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"A"},"b":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"B"},"storey":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Storey","default":0},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"},"align":{"type":"string","pattern":"^(left|center|right)$","title":"Align","default":"left"},"thickness_m":{"anyOf":[{"type":"number","maximum":0.6,"minimum":0.03},{"type":"null"}],"title":"Thickness M"}},"additionalProperties":false,"type":"object","required":["a","b"],"title":"FreeWallIn","description":"An inner wall drawn by the customer: from ``a`` to ``b`` (plan metres) on storey ``storey`` (0 = ground).\n\n``door`` puts one door in the middle (the old contract). ``openings`` (T6c), when set, replaces\nit: exactly those windows / doors, so a drawing with an opening-free wall round-trips."},"type":"array","maxItems":60},{"type":"null"}],"title":"Walls"},"roof_form":{"type":"string","pattern":"^(gable|hip|shed|flat)$","title":"Roof Form","default":"gable"},"window_count":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":0.0},{"type":"null"}],"title":"Window Count"},"window_top_m":{"type":"number","maximum":3.0,"minimum":1.5,"title":"Window Top M","default":2.1},"window_width_m":{"type":"number","maximum":3.0,"minimum":0.4,"title":"Window Width M","default":1.2},"window_height_m":{"type":"number","maximum":2.5,"minimum":0.4,"title":"Window Height M","default":1.2},"door_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Door Side","default":"south"},"gate_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Gate Side","default":"south"},"gate_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Type"},"gate_size_dm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Size Dm"},"openings":{"anyOf":[{"items":{"properties":{"id":{"type":"string","maxLength":24,"title":"Id","default":""},"wall":{"type":"string","pattern":"^(south|north|east|west)[2-9]?$","title":"Wall","default":"south"},"kind":{"type":"string","pattern":"^(window|door|gate)$","title":"Kind","default":"window"},"type":{"type":"string","maxLength":24,"title":"Type","default":""},"w_m":{"type":"number","maximum":6.0,"minimum":0.4,"title":"W M","default":1.2},"h_m":{"type":"number","maximum":3.5,"minimum":0.4,"title":"H M","default":1.2},"sill_m":{"anyOf":[{"type":"number","maximum":2.5,"minimum":0.0},{"type":"null"}],"title":"Sill M"},"pos_m":{"anyOf":[{"type":"number","maximum":40.0,"minimum":0.0},{"type":"null"}],"title":"Pos M"},"hinge":{"anyOf":[{"type":"string","pattern":"^(left|right)$"},{"type":"null"}],"title":"Hinge"},"swing":{"anyOf":[{"type":"string","pattern":"^(in|out)$"},{"type":"null"}],"title":"Swing"}},"additionalProperties":false,"type":"object","title":"OpeningIn","description":"One window, door or gate on a named wall (see ``configurator.validate.ring_walls``)."},"type":"array","maxItems":40},{"type":"null"}],"title":"Openings"},"cladding_type":{"type":"string","title":"Cladding Type","default":"liggende"},"wall_cladding":{"anyOf":[{"additionalProperties":{"properties":{"on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On"},"type":{"anyOf":[{"type":"string","pattern":"^(stående|liggende)$"},{"type":"null"}],"title":"Type"},"material":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Material"}},"additionalProperties":false,"type":"object","title":"WallCladIn","description":"Own cladding on one wall (key as in /validate walls); a missing field keeps the building's."},"type":"object","maxProperties":40},{"type":"null"}],"title":"Wall Cladding"},"cladding_material":{"type":"string","title":"Cladding Material","default":"White"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"overhang_m":{"anyOf":[{"type":"number","maximum":1.5,"minimum":0.0},{"type":"null"}],"title":"Overhang M"},"corner_boards":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Corner Boards"},"cladding_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cladding On"},"style":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Style"},"outdoor":{"anyOf":[{"items":{"properties":{"kind":{"type":"string","pattern":"^(veranda|balkong|takaltan|terrasse|pergola)$","title":"Kind","default":"terrasse"},"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"south"},"width_m":{"type":"number","maximum":12.0,"minimum":1.0,"title":"Width M","default":4.0},"depth_m":{"type":"number","maximum":6.0,"minimum":1.0,"title":"Depth M","default":2.5}},"additionalProperties":false,"type":"object","title":"OutdoorIn","description":"A veranda / balkong / takaltan / terrasse / pergola on one side of the building."},"type":"array","maxItems":4},{"type":"null"}],"title":"Outdoor"},"partitions":{"anyOf":[{"items":{"properties":{"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"north"},"at_m":{"type":"number","maximum":30.0,"minimum":1.0,"title":"At M","default":2.5},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"}},"additionalProperties":false,"type":"object","title":"PartitionIn","description":"An inner wall parallel to ``side``, ``at_m`` metres in from it, with an optional door."},"type":"array","maxItems":4},{"type":"null"}],"title":"Partitions"},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","title":"Interior Finish","default":"ingen"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Interior Color"},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","title":"Ceiling","default":"ingen"},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}],"title":"Foundation"},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Site Fall Pct"},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Window Color"},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Door Color"},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}],"title":"Roof Covering"},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Roof Color"},"roof_edges":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Roof Edges"},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Dormers","default":0},"dormer_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Dormer Side","default":"south"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Roof Windows","default":0},"roof_window_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Roof Window Side","default":"south"},"roof_window_size":{"type":"string","pattern":"^[A-Z]{2}[0-9]{2}$","title":"Roof Window Size","default":"MK06"},"matrikkel_alt":{"type":"boolean","title":"Matrikkel Alt","default":false},"basis":{"type":"string","pattern":"^(net|list|sales)$","title":"Basis","default":"net"},"mesh":{"type":"boolean","title":"Mesh","default":false},"mesh_format":{"type":"string","pattern":"^(json|b64)$","title":"Mesh Format","default":"json"},"markup_pct":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Markup Pct","default":0.0},"calibrate":{"type":"boolean","title":"Calibrate","default":false},"plan":{"type":"boolean","title":"Plan","default":false}}}},{"name":"public_summary","cat":"pris","no":"Kort sammendrag av konfigurasjonen.","en":"Short summary of the configuration.","method":"POST","path":"/configurator/public/summary","access":"public","effect":"read","status":"live","server":"web","description":"Short summary of the configuration. [open, no login] — NO: Kort sammendrag av konfigurasjonen.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"type":{"type":"string","title":"Type","default":"garasje"},"width":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Width","default":6.0},"depth":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Depth","default":6.0},"height_m":{"type":"number","maximum":6.0,"exclusiveMinimum":1.8,"title":"Height M","default":2.5},"storey_heights_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":1},{"type":"null"}],"title":"Storey Heights M"},"loft":{"type":"boolean","title":"Loft","default":false},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Roof Pitch Deg","default":22.0},"add_windows":{"type":"boolean","title":"Add Windows","default":true},"add_door":{"type":"boolean","title":"Add Door","default":true},"form_type":{"type":"string","pattern":"^(rect|L|L_flip|T|T_up|H|H_rot|U_up|U_down|S_left|S_right|N_left|N_right|cross_off|plus|step)$","title":"Form Type","default":"rect"},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Width M"},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Depth M"},"modules":{"anyOf":[{"items":{"properties":{"x":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"X","default":0.0},"y":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"Y","default":0.0},"w":{"type":"number","maximum":20.0,"minimum":1.0,"title":"W"},"d":{"type":"number","maximum":20.0,"minimum":1.0,"title":"D"},"ridge":{"type":"string","pattern":"^(x|y)$","title":"Ridge","default":"x"}},"additionalProperties":false,"type":"object","required":["w","d"],"title":"ModuleIn","description":"One rectangular module of a free footprint (metres, plan coordinates)."},"type":"array","maxItems":8,"minItems":1},{"type":"null"}],"title":"Modules"},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":40,"minItems":3},{"type":"null"}],"title":"Boundary"},"walls":{"anyOf":[{"items":{"properties":{"a":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"A"},"b":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"B"},"storey":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Storey","default":0},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"},"align":{"type":"string","pattern":"^(left|center|right)$","title":"Align","default":"left"},"thickness_m":{"anyOf":[{"type":"number","maximum":0.6,"minimum":0.03},{"type":"null"}],"title":"Thickness M"}},"additionalProperties":false,"type":"object","required":["a","b"],"title":"FreeWallIn","description":"An inner wall drawn by the customer: from ``a`` to ``b`` (plan metres) on storey ``storey`` (0 = ground).\n\n``door`` puts one door in the middle (the old contract). ``openings`` (T6c), when set, replaces\nit: exactly those windows / doors, so a drawing with an opening-free wall round-trips."},"type":"array","maxItems":60},{"type":"null"}],"title":"Walls"},"roof_form":{"type":"string","pattern":"^(gable|hip|shed|flat)$","title":"Roof Form","default":"gable"},"window_count":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":0.0},{"type":"null"}],"title":"Window Count"},"window_top_m":{"type":"number","maximum":3.0,"minimum":1.5,"title":"Window Top M","default":2.1},"window_width_m":{"type":"number","maximum":3.0,"minimum":0.4,"title":"Window Width M","default":1.2},"window_height_m":{"type":"number","maximum":2.5,"minimum":0.4,"title":"Window Height M","default":1.2},"door_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Door Side","default":"south"},"gate_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Gate Side","default":"south"},"gate_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Type"},"gate_size_dm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Size Dm"},"openings":{"anyOf":[{"items":{"properties":{"id":{"type":"string","maxLength":24,"title":"Id","default":""},"wall":{"type":"string","pattern":"^(south|north|east|west)[2-9]?$","title":"Wall","default":"south"},"kind":{"type":"string","pattern":"^(window|door|gate)$","title":"Kind","default":"window"},"type":{"type":"string","maxLength":24,"title":"Type","default":""},"w_m":{"type":"number","maximum":6.0,"minimum":0.4,"title":"W M","default":1.2},"h_m":{"type":"number","maximum":3.5,"minimum":0.4,"title":"H M","default":1.2},"sill_m":{"anyOf":[{"type":"number","maximum":2.5,"minimum":0.0},{"type":"null"}],"title":"Sill M"},"pos_m":{"anyOf":[{"type":"number","maximum":40.0,"minimum":0.0},{"type":"null"}],"title":"Pos M"},"hinge":{"anyOf":[{"type":"string","pattern":"^(left|right)$"},{"type":"null"}],"title":"Hinge"},"swing":{"anyOf":[{"type":"string","pattern":"^(in|out)$"},{"type":"null"}],"title":"Swing"}},"additionalProperties":false,"type":"object","title":"OpeningIn","description":"One window, door or gate on a named wall (see ``configurator.validate.ring_walls``)."},"type":"array","maxItems":40},{"type":"null"}],"title":"Openings"},"cladding_type":{"type":"string","title":"Cladding Type","default":"liggende"},"wall_cladding":{"anyOf":[{"additionalProperties":{"properties":{"on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On"},"type":{"anyOf":[{"type":"string","pattern":"^(stående|liggende)$"},{"type":"null"}],"title":"Type"},"material":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Material"}},"additionalProperties":false,"type":"object","title":"WallCladIn","description":"Own cladding on one wall (key as in /validate walls); a missing field keeps the building's."},"type":"object","maxProperties":40},{"type":"null"}],"title":"Wall Cladding"},"cladding_material":{"type":"string","title":"Cladding Material","default":"White"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"overhang_m":{"anyOf":[{"type":"number","maximum":1.5,"minimum":0.0},{"type":"null"}],"title":"Overhang M"},"corner_boards":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Corner Boards"},"cladding_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cladding On"},"style":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Style"},"outdoor":{"anyOf":[{"items":{"properties":{"kind":{"type":"string","pattern":"^(veranda|balkong|takaltan|terrasse|pergola)$","title":"Kind","default":"terrasse"},"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"south"},"width_m":{"type":"number","maximum":12.0,"minimum":1.0,"title":"Width M","default":4.0},"depth_m":{"type":"number","maximum":6.0,"minimum":1.0,"title":"Depth M","default":2.5}},"additionalProperties":false,"type":"object","title":"OutdoorIn","description":"A veranda / balkong / takaltan / terrasse / pergola on one side of the building."},"type":"array","maxItems":4},{"type":"null"}],"title":"Outdoor"},"partitions":{"anyOf":[{"items":{"properties":{"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"north"},"at_m":{"type":"number","maximum":30.0,"minimum":1.0,"title":"At M","default":2.5},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"}},"additionalProperties":false,"type":"object","title":"PartitionIn","description":"An inner wall parallel to ``side``, ``at_m`` metres in from it, with an optional door."},"type":"array","maxItems":4},{"type":"null"}],"title":"Partitions"},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","title":"Interior Finish","default":"ingen"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Interior Color"},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","title":"Ceiling","default":"ingen"},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}],"title":"Foundation"},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Site Fall Pct"},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Window Color"},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Door Color"},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}],"title":"Roof Covering"},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Roof Color"},"roof_edges":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Roof Edges"},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Dormers","default":0},"dormer_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Dormer Side","default":"south"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Roof Windows","default":0},"roof_window_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Roof Window Side","default":"south"},"roof_window_size":{"type":"string","pattern":"^[A-Z]{2}[0-9]{2}$","title":"Roof Window Size","default":"MK06"},"matrikkel_alt":{"type":"boolean","title":"Matrikkel Alt","default":false},"basis":{"type":"string","pattern":"^(net|list|sales)$","title":"Basis","default":"net"},"mesh":{"type":"boolean","title":"Mesh","default":false},"mesh_format":{"type":"string","pattern":"^(json|b64)$","title":"Mesh Format","default":"json"},"markup_pct":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Markup Pct","default":0.0},"calibrate":{"type":"boolean","title":"Calibrate","default":false},"plan":{"type":"boolean","title":"Plan","default":false}}}},{"name":"public_drawings","cat":"pris","no":"Tegningssett (PDF) for en konfigurasjon; gir token.","en":"Drawing set (PDF) of a configuration; returns a token.","method":"POST","path":"/configurator/public/drawings","access":"public","effect":"write","status":"live","server":"web","description":"Drawing set (PDF) of a configuration; returns a token. [open, no login] — NO: Tegningssett (PDF) for en konfigurasjon; gir token.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"type":{"type":"string","title":"Type","default":"garasje"},"width":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Width","default":6.0},"depth":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Depth","default":6.0},"height_m":{"type":"number","maximum":6.0,"exclusiveMinimum":1.8,"title":"Height M","default":2.5},"storey_heights_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":1},{"type":"null"}],"title":"Storey Heights M"},"loft":{"type":"boolean","title":"Loft","default":false},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Roof Pitch Deg","default":22.0},"add_windows":{"type":"boolean","title":"Add Windows","default":true},"add_door":{"type":"boolean","title":"Add Door","default":true},"form_type":{"type":"string","pattern":"^(rect|L|L_flip|T|T_up|H|H_rot|U_up|U_down|S_left|S_right|N_left|N_right|cross_off|plus|step)$","title":"Form Type","default":"rect"},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Width M"},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Depth M"},"modules":{"anyOf":[{"items":{"properties":{"x":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"X","default":0.0},"y":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"Y","default":0.0},"w":{"type":"number","maximum":20.0,"minimum":1.0,"title":"W"},"d":{"type":"number","maximum":20.0,"minimum":1.0,"title":"D"},"ridge":{"type":"string","pattern":"^(x|y)$","title":"Ridge","default":"x"}},"additionalProperties":false,"type":"object","required":["w","d"],"title":"ModuleIn","description":"One rectangular module of a free footprint (metres, plan coordinates)."},"type":"array","maxItems":8,"minItems":1},{"type":"null"}],"title":"Modules"},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":40,"minItems":3},{"type":"null"}],"title":"Boundary"},"walls":{"anyOf":[{"items":{"properties":{"a":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"A"},"b":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"B"},"storey":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Storey","default":0},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"},"align":{"type":"string","pattern":"^(left|center|right)$","title":"Align","default":"left"},"thickness_m":{"anyOf":[{"type":"number","maximum":0.6,"minimum":0.03},{"type":"null"}],"title":"Thickness M"}},"additionalProperties":false,"type":"object","required":["a","b"],"title":"FreeWallIn","description":"An inner wall drawn by the customer: from ``a`` to ``b`` (plan metres) on storey ``storey`` (0 = ground).\n\n``door`` puts one door in the middle (the old contract). ``openings`` (T6c), when set, replaces\nit: exactly those windows / doors, so a drawing with an opening-free wall round-trips."},"type":"array","maxItems":60},{"type":"null"}],"title":"Walls"},"roof_form":{"type":"string","pattern":"^(gable|hip|shed|flat)$","title":"Roof Form","default":"gable"},"window_count":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":0.0},{"type":"null"}],"title":"Window Count"},"window_top_m":{"type":"number","maximum":3.0,"minimum":1.5,"title":"Window Top M","default":2.1},"window_width_m":{"type":"number","maximum":3.0,"minimum":0.4,"title":"Window Width M","default":1.2},"window_height_m":{"type":"number","maximum":2.5,"minimum":0.4,"title":"Window Height M","default":1.2},"door_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Door Side","default":"south"},"gate_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Gate Side","default":"south"},"gate_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Type"},"gate_size_dm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Size Dm"},"openings":{"anyOf":[{"items":{"properties":{"id":{"type":"string","maxLength":24,"title":"Id","default":""},"wall":{"type":"string","pattern":"^(south|north|east|west)[2-9]?$","title":"Wall","default":"south"},"kind":{"type":"string","pattern":"^(window|door|gate)$","title":"Kind","default":"window"},"type":{"type":"string","maxLength":24,"title":"Type","default":""},"w_m":{"type":"number","maximum":6.0,"minimum":0.4,"title":"W M","default":1.2},"h_m":{"type":"number","maximum":3.5,"minimum":0.4,"title":"H M","default":1.2},"sill_m":{"anyOf":[{"type":"number","maximum":2.5,"minimum":0.0},{"type":"null"}],"title":"Sill M"},"pos_m":{"anyOf":[{"type":"number","maximum":40.0,"minimum":0.0},{"type":"null"}],"title":"Pos M"},"hinge":{"anyOf":[{"type":"string","pattern":"^(left|right)$"},{"type":"null"}],"title":"Hinge"},"swing":{"anyOf":[{"type":"string","pattern":"^(in|out)$"},{"type":"null"}],"title":"Swing"}},"additionalProperties":false,"type":"object","title":"OpeningIn","description":"One window, door or gate on a named wall (see ``configurator.validate.ring_walls``)."},"type":"array","maxItems":40},{"type":"null"}],"title":"Openings"},"cladding_type":{"type":"string","title":"Cladding Type","default":"liggende"},"wall_cladding":{"anyOf":[{"additionalProperties":{"properties":{"on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On"},"type":{"anyOf":[{"type":"string","pattern":"^(stående|liggende)$"},{"type":"null"}],"title":"Type"},"material":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Material"}},"additionalProperties":false,"type":"object","title":"WallCladIn","description":"Own cladding on one wall (key as in /validate walls); a missing field keeps the building's."},"type":"object","maxProperties":40},{"type":"null"}],"title":"Wall Cladding"},"cladding_material":{"type":"string","title":"Cladding Material","default":"White"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"overhang_m":{"anyOf":[{"type":"number","maximum":1.5,"minimum":0.0},{"type":"null"}],"title":"Overhang M"},"corner_boards":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Corner Boards"},"cladding_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cladding On"},"style":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Style"},"outdoor":{"anyOf":[{"items":{"properties":{"kind":{"type":"string","pattern":"^(veranda|balkong|takaltan|terrasse|pergola)$","title":"Kind","default":"terrasse"},"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"south"},"width_m":{"type":"number","maximum":12.0,"minimum":1.0,"title":"Width M","default":4.0},"depth_m":{"type":"number","maximum":6.0,"minimum":1.0,"title":"Depth M","default":2.5}},"additionalProperties":false,"type":"object","title":"OutdoorIn","description":"A veranda / balkong / takaltan / terrasse / pergola on one side of the building."},"type":"array","maxItems":4},{"type":"null"}],"title":"Outdoor"},"partitions":{"anyOf":[{"items":{"properties":{"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"north"},"at_m":{"type":"number","maximum":30.0,"minimum":1.0,"title":"At M","default":2.5},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"}},"additionalProperties":false,"type":"object","title":"PartitionIn","description":"An inner wall parallel to ``side``, ``at_m`` metres in from it, with an optional door."},"type":"array","maxItems":4},{"type":"null"}],"title":"Partitions"},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","title":"Interior Finish","default":"ingen"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Interior Color"},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","title":"Ceiling","default":"ingen"},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}],"title":"Foundation"},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Site Fall Pct"},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Window Color"},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Door Color"},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}],"title":"Roof Covering"},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Roof Color"},"roof_edges":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Roof Edges"},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Dormers","default":0},"dormer_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Dormer Side","default":"south"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Roof Windows","default":0},"roof_window_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Roof Window Side","default":"south"},"roof_window_size":{"type":"string","pattern":"^[A-Z]{2}[0-9]{2}$","title":"Roof Window Size","default":"MK06"},"matrikkel_alt":{"type":"boolean","title":"Matrikkel Alt","default":false},"basis":{"type":"string","pattern":"^(net|list|sales)$","title":"Basis","default":"net"},"mesh":{"type":"boolean","title":"Mesh","default":false},"mesh_format":{"type":"string","pattern":"^(json|b64)$","title":"Mesh Format","default":"json"},"markup_pct":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Markup Pct","default":0.0},"calibrate":{"type":"boolean","title":"Calibrate","default":false},"plan":{"type":"boolean","title":"Plan","default":false}}}},{"name":"public_drawings_pdf","cat":"pris","no":"Hent PDF-en fra public_drawings.","en":"Fetch the PDF from public_drawings.","method":"GET","path":"/configurator/public/drawings/{token}.pdf","access":"public","effect":"read","status":"live","server":"web","description":"Fetch the PDF from public_drawings. [open, no login] — NO: Hent PDF-en fra public_drawings.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"token":{"type":"string","title":"Token"}},"required":["token"]}},{"name":"public_request","cat":"pris","no":"Send forespørsel (lead) til leverandør. SENDER til mennesker: spør brukeren først.","en":"Send a request (lead) to the supplier. SENDS to people: ask the user first.","method":"POST","path":"/configurator/public/request","access":"public","effect":"external","status":"live","server":"web","description":"Send a request (lead) to the supplier. SENDS to people: ask the user first. [open, no login] — NO: Send forespørsel (lead) til leverandør. SENDER til mennesker: spør brukeren først.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"name":{"type":"string","maxLength":120,"minLength":2,"title":"Name"},"email":{"type":"string","maxLength":200,"minLength":5,"pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Email"},"phone":{"type":"string","maxLength":40,"title":"Phone","default":""},"message":{"type":"string","maxLength":2000,"title":"Message","default":""},"consent":{"type":"boolean","title":"Consent"},"config":{"properties":{"type":{"type":"string","title":"Type","default":"garasje"},"width":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Width","default":6.0},"depth":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Depth","default":6.0},"height_m":{"type":"number","maximum":6.0,"exclusiveMinimum":1.8,"title":"Height M","default":2.5},"storey_heights_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":1},{"type":"null"}],"title":"Storey Heights M"},"loft":{"type":"boolean","title":"Loft","default":false},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Roof Pitch Deg","default":22.0},"add_windows":{"type":"boolean","title":"Add Windows","default":true},"add_door":{"type":"boolean","title":"Add Door","default":true},"form_type":{"type":"string","pattern":"^(rect|L|L_flip|T|T_up|H|H_rot|U_up|U_down|S_left|S_right|N_left|N_right|cross_off|plus|step)$","title":"Form Type","default":"rect"},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Width M"},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Depth M"},"modules":{"anyOf":[{"items":{"$ref":"#/components/schemas/ModuleIn"},"type":"array","maxItems":8,"minItems":1},{"type":"null"}],"title":"Modules"},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":40,"minItems":3},{"type":"null"}],"title":"Boundary"},"walls":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallIn"},"type":"array","maxItems":60},{"type":"null"}],"title":"Walls"},"roof_form":{"type":"string","pattern":"^(gable|hip|shed|flat)$","title":"Roof Form","default":"gable"},"window_count":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":0.0},{"type":"null"}],"title":"Window Count"},"window_top_m":{"type":"number","maximum":3.0,"minimum":1.5,"title":"Window Top M","default":2.1},"window_width_m":{"type":"number","maximum":3.0,"minimum":0.4,"title":"Window Width M","default":1.2},"window_height_m":{"type":"number","maximum":2.5,"minimum":0.4,"title":"Window Height M","default":1.2},"door_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Door Side","default":"south"},"gate_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Gate Side","default":"south"},"gate_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Type"},"gate_size_dm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Size Dm"},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/server__configurator_api__OpeningIn"},"type":"array","maxItems":40},{"type":"null"}],"title":"Openings"},"cladding_type":{"type":"string","title":"Cladding Type","default":"liggende"},"wall_cladding":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/WallCladIn"},"type":"object","maxProperties":40},{"type":"null"}],"title":"Wall Cladding"},"cladding_material":{"type":"string","title":"Cladding Material","default":"White"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"overhang_m":{"anyOf":[{"type":"number","maximum":1.5,"minimum":0.0},{"type":"null"}],"title":"Overhang M"},"corner_boards":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Corner Boards"},"cladding_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cladding On"},"style":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Style"},"outdoor":{"anyOf":[{"items":{"$ref":"#/components/schemas/OutdoorIn"},"type":"array","maxItems":4},{"type":"null"}],"title":"Outdoor"},"partitions":{"anyOf":[{"items":{"$ref":"#/components/schemas/PartitionIn"},"type":"array","maxItems":4},{"type":"null"}],"title":"Partitions"},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","title":"Interior Finish","default":"ingen"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Interior Color"},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","title":"Ceiling","default":"ingen"},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}],"title":"Foundation"},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Site Fall Pct"},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Window Color"},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Door Color"},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}],"title":"Roof Covering"},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Roof Color"},"roof_edges":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Roof Edges"},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Dormers","default":0},"dormer_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Dormer Side","default":"south"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Roof Windows","default":0},"roof_window_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Roof Window Side","default":"south"},"roof_window_size":{"type":"string","pattern":"^[A-Z]{2}[0-9]{2}$","title":"Roof Window Size","default":"MK06"},"matrikkel_alt":{"type":"boolean","title":"Matrikkel Alt","default":false},"basis":{"type":"string","pattern":"^(net|list|sales)$","title":"Basis","default":"net"},"mesh":{"type":"boolean","title":"Mesh","default":false},"mesh_format":{"type":"string","pattern":"^(json|b64)$","title":"Mesh Format","default":"json"},"markup_pct":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Markup Pct","default":0.0},"calibrate":{"type":"boolean","title":"Calibrate","default":false},"plan":{"type":"boolean","title":"Plan","default":false}},"additionalProperties":false,"type":"object","title":"QuoteIn"},"estimate_nok":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimate Nok"},"editor":{"anyOf":[{"properties":{"price_nok":{"anyOf":[{"type":"integer","maximum":100000000.0,"minimum":0.0},{"type":"null"}],"title":"Price Nok"},"area_m2":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Area M2"},"walls":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Walls"}},"additionalProperties":false,"type":"object","title":"EditorSummary"},{"type":"null"}]}},"required":["name","email","consent","config"]}},{"name":"sandbox_load_drawing","cat":"pris","no":"Tegn i en TOM sandkasseøkt fra en konfigurasjon: boundary (ring), walls, openings.","en":"Draw into an EMPTY sandbox session from a configuration: boundary (ring), walls, openings.","method":"POST","path":"/configurator/sandbox/session/{sid}/drawing","access":"public","effect":"write","mcp":"web","example":{"type":"garasje","boundary":[[0,0],[8,0],[8,6],[0,6]],"openings":[{"wall":"south","kind":"door","w_m":1.0,"h_m":2.1,"pos_m":2.0},{"wall":"east","kind":"window","w_m":1.2,"h_m":1.2}]},"status":"live","server":"web","description":"Draw into an EMPTY sandbox session from a configuration: boundary (ring), walls, openings. [open, no login] — NO: Tegn i en TOM sandkasseøkt fra en konfigurasjon: boundary (ring), walls, openings.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"type":{"type":"string","title":"Type","default":"garasje"},"width":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Width","default":6.0},"depth":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Depth","default":6.0},"height_m":{"type":"number","maximum":6.0,"exclusiveMinimum":1.8,"title":"Height M","default":2.5},"storey_heights_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":1},{"type":"null"}],"title":"Storey Heights M"},"loft":{"type":"boolean","title":"Loft","default":false},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Roof Pitch Deg","default":22.0},"add_windows":{"type":"boolean","title":"Add Windows","default":true},"add_door":{"type":"boolean","title":"Add Door","default":true},"form_type":{"type":"string","pattern":"^(rect|L|L_flip|T|T_up|H|H_rot|U_up|U_down|S_left|S_right|N_left|N_right|cross_off|plus|step)$","title":"Form Type","default":"rect"},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Width M"},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Depth M"},"modules":{"anyOf":[{"items":{"properties":{"x":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"X","default":0.0},"y":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"Y","default":0.0},"w":{"type":"number","maximum":20.0,"minimum":1.0,"title":"W"},"d":{"type":"number","maximum":20.0,"minimum":1.0,"title":"D"},"ridge":{"type":"string","pattern":"^(x|y)$","title":"Ridge","default":"x"}},"additionalProperties":false,"type":"object","required":["w","d"],"title":"ModuleIn","description":"One rectangular module of a free footprint (metres, plan coordinates)."},"type":"array","maxItems":8,"minItems":1},{"type":"null"}],"title":"Modules"},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":40,"minItems":3},{"type":"null"}],"title":"Boundary"},"walls":{"anyOf":[{"items":{"properties":{"a":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"A"},"b":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"B"},"storey":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Storey","default":0},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"},"align":{"type":"string","pattern":"^(left|center|right)$","title":"Align","default":"left"},"thickness_m":{"anyOf":[{"type":"number","maximum":0.6,"minimum":0.03},{"type":"null"}],"title":"Thickness M"}},"additionalProperties":false,"type":"object","required":["a","b"],"title":"FreeWallIn","description":"An inner wall drawn by the customer: from ``a`` to ``b`` (plan metres) on storey ``storey`` (0 = ground).\n\n``door`` puts one door in the middle (the old contract). ``openings`` (T6c), when set, replaces\nit: exactly those windows / doors, so a drawing with an opening-free wall round-trips."},"type":"array","maxItems":60},{"type":"null"}],"title":"Walls"},"roof_form":{"type":"string","pattern":"^(gable|hip|shed|flat)$","title":"Roof Form","default":"gable"},"window_count":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":0.0},{"type":"null"}],"title":"Window Count"},"window_top_m":{"type":"number","maximum":3.0,"minimum":1.5,"title":"Window Top M","default":2.1},"window_width_m":{"type":"number","maximum":3.0,"minimum":0.4,"title":"Window Width M","default":1.2},"window_height_m":{"type":"number","maximum":2.5,"minimum":0.4,"title":"Window Height M","default":1.2},"door_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Door Side","default":"south"},"gate_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Gate Side","default":"south"},"gate_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Type"},"gate_size_dm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Size Dm"},"openings":{"anyOf":[{"items":{"properties":{"id":{"type":"string","maxLength":24,"title":"Id","default":""},"wall":{"type":"string","pattern":"^(south|north|east|west)[2-9]?$","title":"Wall","default":"south"},"kind":{"type":"string","pattern":"^(window|door|gate)$","title":"Kind","default":"window"},"type":{"type":"string","maxLength":24,"title":"Type","default":""},"w_m":{"type":"number","maximum":6.0,"minimum":0.4,"title":"W M","default":1.2},"h_m":{"type":"number","maximum":3.5,"minimum":0.4,"title":"H M","default":1.2},"sill_m":{"anyOf":[{"type":"number","maximum":2.5,"minimum":0.0},{"type":"null"}],"title":"Sill M"},"pos_m":{"anyOf":[{"type":"number","maximum":40.0,"minimum":0.0},{"type":"null"}],"title":"Pos M"},"hinge":{"anyOf":[{"type":"string","pattern":"^(left|right)$"},{"type":"null"}],"title":"Hinge"},"swing":{"anyOf":[{"type":"string","pattern":"^(in|out)$"},{"type":"null"}],"title":"Swing"}},"additionalProperties":false,"type":"object","title":"OpeningIn","description":"One window, door or gate on a named wall (see ``configurator.validate.ring_walls``)."},"type":"array","maxItems":40},{"type":"null"}],"title":"Openings"},"cladding_type":{"type":"string","title":"Cladding Type","default":"liggende"},"wall_cladding":{"anyOf":[{"additionalProperties":{"properties":{"on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On"},"type":{"anyOf":[{"type":"string","pattern":"^(stående|liggende)$"},{"type":"null"}],"title":"Type"},"material":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Material"}},"additionalProperties":false,"type":"object","title":"WallCladIn","description":"Own cladding on one wall (key as in /validate walls); a missing field keeps the building's."},"type":"object","maxProperties":40},{"type":"null"}],"title":"Wall Cladding"},"cladding_material":{"type":"string","title":"Cladding Material","default":"White"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"overhang_m":{"anyOf":[{"type":"number","maximum":1.5,"minimum":0.0},{"type":"null"}],"title":"Overhang M"},"corner_boards":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Corner Boards"},"cladding_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cladding On"},"style":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Style"},"outdoor":{"anyOf":[{"items":{"properties":{"kind":{"type":"string","pattern":"^(veranda|balkong|takaltan|terrasse|pergola)$","title":"Kind","default":"terrasse"},"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"south"},"width_m":{"type":"number","maximum":12.0,"minimum":1.0,"title":"Width M","default":4.0},"depth_m":{"type":"number","maximum":6.0,"minimum":1.0,"title":"Depth M","default":2.5}},"additionalProperties":false,"type":"object","title":"OutdoorIn","description":"A veranda / balkong / takaltan / terrasse / pergola on one side of the building."},"type":"array","maxItems":4},{"type":"null"}],"title":"Outdoor"},"partitions":{"anyOf":[{"items":{"properties":{"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"north"},"at_m":{"type":"number","maximum":30.0,"minimum":1.0,"title":"At M","default":2.5},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"}},"additionalProperties":false,"type":"object","title":"PartitionIn","description":"An inner wall parallel to ``side``, ``at_m`` metres in from it, with an optional door."},"type":"array","maxItems":4},{"type":"null"}],"title":"Partitions"},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","title":"Interior Finish","default":"ingen"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Interior Color"},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","title":"Ceiling","default":"ingen"},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}],"title":"Foundation"},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Site Fall Pct"},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Window Color"},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Door Color"},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}],"title":"Roof Covering"},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Roof Color"},"roof_edges":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Roof Edges"},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Dormers","default":0},"dormer_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Dormer Side","default":"south"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Roof Windows","default":0},"roof_window_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Roof Window Side","default":"south"},"roof_window_size":{"type":"string","pattern":"^[A-Z]{2}[0-9]{2}$","title":"Roof Window Size","default":"MK06"},"matrikkel_alt":{"type":"boolean","title":"Matrikkel Alt","default":false},"basis":{"type":"string","pattern":"^(net|list|sales)$","title":"Basis","default":"net"},"mesh":{"type":"boolean","title":"Mesh","default":false},"mesh_format":{"type":"string","pattern":"^(json|b64)$","title":"Mesh Format","default":"json"},"markup_pct":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Markup Pct","default":0.0},"calibrate":{"type":"boolean","title":"Calibrate","default":false},"plan":{"type":"boolean","title":"Plan","default":false}}}},{"name":"sandbox_get_drawing","cat":"pris","no":"Sandkassetegningen som konfigurasjon (boundary, walls, openings).","en":"The sandbox drawing as a configuration (boundary, walls, openings).","method":"GET","path":"/configurator/sandbox/session/{sid}/drawing","access":"public","effect":"read","mcp":"web","status":"live","server":"web","description":"The sandbox drawing as a configuration (boundary, walls, openings). [open, no login] — NO: Sandkassetegningen som konfigurasjon (boundary, walls, openings).","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{}}},{"name":"sandbox_price","cat":"pris","no":"Pris på sandkassemodellen med valg (tak, veggtype, fundament …).","en":"Price of the sandbox model with choices (roof, wall type, foundation ...).","method":"POST","path":"/configurator/sandbox/session/{sid}/price","access":"public","effect":"read","mcp":"web","example":{"choices":{"roof_form":"gable"}},"status":"live","server":"web","description":"Price of the sandbox model with choices (roof, wall type, foundation ...). [open, no login] — NO: Pris på sandkassemodellen med valg (tak, veggtype, fundament …).","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"choices":{"properties":{"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}],"title":"Roof Covering"},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Roof Color"},"roof_form":{"anyOf":[{"type":"string","pattern":"^(gable|hip|shed|flat)$"},{"type":"null"}],"title":"Roof Form"},"roof_pitch_deg":{"anyOf":[{"type":"number","maximum":60.0,"minimum":0.0},{"type":"null"}],"title":"Roof Pitch Deg"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Roof Windows","default":0},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Dormers","default":0},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}],"title":"Foundation"},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Site Fall Pct"},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","title":"Interior Finish","default":"ingen"},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","title":"Ceiling","default":"ingen"},"outdoor":{"anyOf":[{"items":{"$ref":"#/components/schemas/OutdoorIn"},"type":"array","maxItems":4},{"type":"null"}],"title":"Outdoor"},"cladding_type":{"anyOf":[{"type":"string","pattern":"^(stående|liggende)$"},{"type":"null"}],"title":"Cladding Type"},"cladding_material":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Cladding Material"},"cladding_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cladding On"},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Window Color"},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Door Color"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Interior Color"},"freight_nok":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Freight Nok"},"freight_status":{"anyOf":[{"type":"string","pattern":"^(kjent|usikker)$"},{"type":"null"}],"title":"Freight Status"}},"additionalProperties":false,"type":"object","title":"ChoicesIn","description":"The shell's picks that change the price (T6c); same names and patterns as ``QuoteIn``.\nCladding type / colours are accepted (they are part of the lead) but do not price."},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}}}},{"name":"session_price","cat":"pris","no":"Pris på modellen i en editorøkt (eks. mva).","en":"Price of the model in an editor session (ex. VAT).","method":"GET","path":"/configurator/session/{sid}/price","access":"share","effect":"read","mcp":"web","status":"live","server":"web","level":"read","description":"Price of the model in an editor session (ex. VAT). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Pris på modellen i en editorøkt (eks. mva).","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"calibrate":{"type":"boolean","default":true,"title":"Calibrate"},"skip_drawers":{"type":"string","default":"","title":"Skip Drawers"}}}},{"name":"session_price_detail","cat":"pris","no":"Pris med artikkel- og NOBB-nummer per linje.","en":"Price with article and NOBB number per line.","method":"GET","path":"/configurator/session/{sid}/price/detail","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Price with article and NOBB number per line. [logged in] — NO: Pris med artikkel- og NOBB-nummer per linje.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"calibrate":{"type":"boolean","default":true,"title":"Calibrate"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"configurator_catalog","cat":"pris","no":"Full katalog (innlogget).","en":"Full catalog (logged in).","method":"GET","path":"/configurator/catalog","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Full catalog (logged in). [logged in] — NO: Full katalog (innlogget).","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"configurator_quote","cat":"pris","no":"Pris med linjer (innlogget).","en":"Price with lines (logged in).","method":"POST","path":"/configurator/quote","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Price with lines (logged in). [logged in] — NO: Pris med linjer (innlogget).","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"type":{"type":"string","title":"Type","default":"garasje"},"width":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Width","default":6.0},"depth":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Depth","default":6.0},"height_m":{"type":"number","maximum":6.0,"exclusiveMinimum":1.8,"title":"Height M","default":2.5},"storey_heights_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":1},{"type":"null"}],"title":"Storey Heights M"},"loft":{"type":"boolean","title":"Loft","default":false},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Roof Pitch Deg","default":22.0},"add_windows":{"type":"boolean","title":"Add Windows","default":true},"add_door":{"type":"boolean","title":"Add Door","default":true},"form_type":{"type":"string","pattern":"^(rect|L|L_flip|T|T_up|H|H_rot|U_up|U_down|S_left|S_right|N_left|N_right|cross_off|plus|step)$","title":"Form Type","default":"rect"},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Width M"},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Depth M"},"modules":{"anyOf":[{"items":{"properties":{"x":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"X","default":0.0},"y":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"Y","default":0.0},"w":{"type":"number","maximum":20.0,"minimum":1.0,"title":"W"},"d":{"type":"number","maximum":20.0,"minimum":1.0,"title":"D"},"ridge":{"type":"string","pattern":"^(x|y)$","title":"Ridge","default":"x"}},"additionalProperties":false,"type":"object","required":["w","d"],"title":"ModuleIn","description":"One rectangular module of a free footprint (metres, plan coordinates)."},"type":"array","maxItems":8,"minItems":1},{"type":"null"}],"title":"Modules"},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":40,"minItems":3},{"type":"null"}],"title":"Boundary"},"walls":{"anyOf":[{"items":{"properties":{"a":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"A"},"b":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"B"},"storey":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Storey","default":0},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"},"align":{"type":"string","pattern":"^(left|center|right)$","title":"Align","default":"left"},"thickness_m":{"anyOf":[{"type":"number","maximum":0.6,"minimum":0.03},{"type":"null"}],"title":"Thickness M"}},"additionalProperties":false,"type":"object","required":["a","b"],"title":"FreeWallIn","description":"An inner wall drawn by the customer: from ``a`` to ``b`` (plan metres) on storey ``storey`` (0 = ground).\n\n``door`` puts one door in the middle (the old contract). ``openings`` (T6c), when set, replaces\nit: exactly those windows / doors, so a drawing with an opening-free wall round-trips."},"type":"array","maxItems":60},{"type":"null"}],"title":"Walls"},"roof_form":{"type":"string","pattern":"^(gable|hip|shed|flat)$","title":"Roof Form","default":"gable"},"window_count":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":0.0},{"type":"null"}],"title":"Window Count"},"window_top_m":{"type":"number","maximum":3.0,"minimum":1.5,"title":"Window Top M","default":2.1},"window_width_m":{"type":"number","maximum":3.0,"minimum":0.4,"title":"Window Width M","default":1.2},"window_height_m":{"type":"number","maximum":2.5,"minimum":0.4,"title":"Window Height M","default":1.2},"door_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Door Side","default":"south"},"gate_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Gate Side","default":"south"},"gate_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Type"},"gate_size_dm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Size Dm"},"openings":{"anyOf":[{"items":{"properties":{"id":{"type":"string","maxLength":24,"title":"Id","default":""},"wall":{"type":"string","pattern":"^(south|north|east|west)[2-9]?$","title":"Wall","default":"south"},"kind":{"type":"string","pattern":"^(window|door|gate)$","title":"Kind","default":"window"},"type":{"type":"string","maxLength":24,"title":"Type","default":""},"w_m":{"type":"number","maximum":6.0,"minimum":0.4,"title":"W M","default":1.2},"h_m":{"type":"number","maximum":3.5,"minimum":0.4,"title":"H M","default":1.2},"sill_m":{"anyOf":[{"type":"number","maximum":2.5,"minimum":0.0},{"type":"null"}],"title":"Sill M"},"pos_m":{"anyOf":[{"type":"number","maximum":40.0,"minimum":0.0},{"type":"null"}],"title":"Pos M"},"hinge":{"anyOf":[{"type":"string","pattern":"^(left|right)$"},{"type":"null"}],"title":"Hinge"},"swing":{"anyOf":[{"type":"string","pattern":"^(in|out)$"},{"type":"null"}],"title":"Swing"}},"additionalProperties":false,"type":"object","title":"OpeningIn","description":"One window, door or gate on a named wall (see ``configurator.validate.ring_walls``)."},"type":"array","maxItems":40},{"type":"null"}],"title":"Openings"},"cladding_type":{"type":"string","title":"Cladding Type","default":"liggende"},"wall_cladding":{"anyOf":[{"additionalProperties":{"properties":{"on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On"},"type":{"anyOf":[{"type":"string","pattern":"^(stående|liggende)$"},{"type":"null"}],"title":"Type"},"material":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Material"}},"additionalProperties":false,"type":"object","title":"WallCladIn","description":"Own cladding on one wall (key as in /validate walls); a missing field keeps the building's."},"type":"object","maxProperties":40},{"type":"null"}],"title":"Wall Cladding"},"cladding_material":{"type":"string","title":"Cladding Material","default":"White"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"overhang_m":{"anyOf":[{"type":"number","maximum":1.5,"minimum":0.0},{"type":"null"}],"title":"Overhang M"},"corner_boards":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Corner Boards"},"cladding_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cladding On"},"style":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Style"},"outdoor":{"anyOf":[{"items":{"properties":{"kind":{"type":"string","pattern":"^(veranda|balkong|takaltan|terrasse|pergola)$","title":"Kind","default":"terrasse"},"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"south"},"width_m":{"type":"number","maximum":12.0,"minimum":1.0,"title":"Width M","default":4.0},"depth_m":{"type":"number","maximum":6.0,"minimum":1.0,"title":"Depth M","default":2.5}},"additionalProperties":false,"type":"object","title":"OutdoorIn","description":"A veranda / balkong / takaltan / terrasse / pergola on one side of the building."},"type":"array","maxItems":4},{"type":"null"}],"title":"Outdoor"},"partitions":{"anyOf":[{"items":{"properties":{"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"north"},"at_m":{"type":"number","maximum":30.0,"minimum":1.0,"title":"At M","default":2.5},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"}},"additionalProperties":false,"type":"object","title":"PartitionIn","description":"An inner wall parallel to ``side``, ``at_m`` metres in from it, with an optional door."},"type":"array","maxItems":4},{"type":"null"}],"title":"Partitions"},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","title":"Interior Finish","default":"ingen"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Interior Color"},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","title":"Ceiling","default":"ingen"},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}],"title":"Foundation"},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Site Fall Pct"},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Window Color"},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Door Color"},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}],"title":"Roof Covering"},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Roof Color"},"roof_edges":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Roof Edges"},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Dormers","default":0},"dormer_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Dormer Side","default":"south"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Roof Windows","default":0},"roof_window_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Roof Window Side","default":"south"},"roof_window_size":{"type":"string","pattern":"^[A-Z]{2}[0-9]{2}$","title":"Roof Window Size","default":"MK06"},"matrikkel_alt":{"type":"boolean","title":"Matrikkel Alt","default":false},"basis":{"type":"string","pattern":"^(net|list|sales)$","title":"Basis","default":"net"},"mesh":{"type":"boolean","title":"Mesh","default":false},"mesh_format":{"type":"string","pattern":"^(json|b64)$","title":"Mesh Format","default":"json"},"markup_pct":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Markup Pct","default":0.0},"calibrate":{"type":"boolean","title":"Calibrate","default":false},"plan":{"type":"boolean","title":"Plan","default":false}}}},{"name":"configurator_open","cat":"pris","no":"Åpne en konfigurasjon som editorøkt.","en":"Open a configuration as an editor session.","method":"POST","path":"/configurator/open","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Open a configuration as an editor session. [logged in] — NO: Åpne en konfigurasjon som editorøkt.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"type":{"type":"string","title":"Type","default":"garasje"},"width":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Width","default":6.0},"depth":{"type":"number","maximum":20.0,"exclusiveMinimum":1.0,"title":"Depth","default":6.0},"height_m":{"type":"number","maximum":6.0,"exclusiveMinimum":1.8,"title":"Height M","default":2.5},"storey_heights_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":1},{"type":"null"}],"title":"Storey Heights M"},"loft":{"type":"boolean","title":"Loft","default":false},"roof_pitch_deg":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Roof Pitch Deg","default":22.0},"add_windows":{"type":"boolean","title":"Add Windows","default":true},"add_door":{"type":"boolean","title":"Add Door","default":true},"form_type":{"type":"string","pattern":"^(rect|L|L_flip|T|T_up|H|H_rot|U_up|U_down|S_left|S_right|N_left|N_right|cross_off|plus|step)$","title":"Form Type","default":"rect"},"wing_width_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Width M"},"wing_depth_m":{"anyOf":[{"type":"number","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Wing Depth M"},"modules":{"anyOf":[{"items":{"properties":{"x":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"X","default":0.0},"y":{"type":"number","maximum":40.0,"minimum":-40.0,"title":"Y","default":0.0},"w":{"type":"number","maximum":20.0,"minimum":1.0,"title":"W"},"d":{"type":"number","maximum":20.0,"minimum":1.0,"title":"D"},"ridge":{"type":"string","pattern":"^(x|y)$","title":"Ridge","default":"x"}},"additionalProperties":false,"type":"object","required":["w","d"],"title":"ModuleIn","description":"One rectangular module of a free footprint (metres, plan coordinates)."},"type":"array","maxItems":8,"minItems":1},{"type":"null"}],"title":"Modules"},"boundary":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array","maxItems":40,"minItems":3},{"type":"null"}],"title":"Boundary"},"walls":{"anyOf":[{"items":{"properties":{"a":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"A"},"b":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"B"},"storey":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Storey","default":0},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"},"align":{"type":"string","pattern":"^(left|center|right)$","title":"Align","default":"left"},"thickness_m":{"anyOf":[{"type":"number","maximum":0.6,"minimum":0.03},{"type":"null"}],"title":"Thickness M"}},"additionalProperties":false,"type":"object","required":["a","b"],"title":"FreeWallIn","description":"An inner wall drawn by the customer: from ``a`` to ``b`` (plan metres) on storey ``storey`` (0 = ground).\n\n``door`` puts one door in the middle (the old contract). ``openings`` (T6c), when set, replaces\nit: exactly those windows / doors, so a drawing with an opening-free wall round-trips."},"type":"array","maxItems":60},{"type":"null"}],"title":"Walls"},"roof_form":{"type":"string","pattern":"^(gable|hip|shed|flat)$","title":"Roof Form","default":"gable"},"window_count":{"anyOf":[{"type":"integer","maximum":16.0,"minimum":0.0},{"type":"null"}],"title":"Window Count"},"window_top_m":{"type":"number","maximum":3.0,"minimum":1.5,"title":"Window Top M","default":2.1},"window_width_m":{"type":"number","maximum":3.0,"minimum":0.4,"title":"Window Width M","default":1.2},"window_height_m":{"type":"number","maximum":2.5,"minimum":0.4,"title":"Window Height M","default":1.2},"door_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Door Side","default":"south"},"gate_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Gate Side","default":"south"},"gate_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Type"},"gate_size_dm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gate Size Dm"},"openings":{"anyOf":[{"items":{"properties":{"id":{"type":"string","maxLength":24,"title":"Id","default":""},"wall":{"type":"string","pattern":"^(south|north|east|west)[2-9]?$","title":"Wall","default":"south"},"kind":{"type":"string","pattern":"^(window|door|gate)$","title":"Kind","default":"window"},"type":{"type":"string","maxLength":24,"title":"Type","default":""},"w_m":{"type":"number","maximum":6.0,"minimum":0.4,"title":"W M","default":1.2},"h_m":{"type":"number","maximum":3.5,"minimum":0.4,"title":"H M","default":1.2},"sill_m":{"anyOf":[{"type":"number","maximum":2.5,"minimum":0.0},{"type":"null"}],"title":"Sill M"},"pos_m":{"anyOf":[{"type":"number","maximum":40.0,"minimum":0.0},{"type":"null"}],"title":"Pos M"},"hinge":{"anyOf":[{"type":"string","pattern":"^(left|right)$"},{"type":"null"}],"title":"Hinge"},"swing":{"anyOf":[{"type":"string","pattern":"^(in|out)$"},{"type":"null"}],"title":"Swing"}},"additionalProperties":false,"type":"object","title":"OpeningIn","description":"One window, door or gate on a named wall (see ``configurator.validate.ring_walls``)."},"type":"array","maxItems":40},{"type":"null"}],"title":"Openings"},"cladding_type":{"type":"string","title":"Cladding Type","default":"liggende"},"wall_cladding":{"anyOf":[{"additionalProperties":{"properties":{"on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On"},"type":{"anyOf":[{"type":"string","pattern":"^(stående|liggende)$"},{"type":"null"}],"title":"Type"},"material":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Material"}},"additionalProperties":false,"type":"object","title":"WallCladIn","description":"Own cladding on one wall (key as in /validate walls); a missing field keeps the building's."},"type":"object","maxProperties":40},{"type":"null"}],"title":"Wall Cladding"},"cladding_material":{"type":"string","title":"Cladding Material","default":"White"},"wall_type":{"anyOf":[{"type":"string","pattern":"^[a-z0-9_]{1,40}$"},{"type":"null"}],"title":"Wall Type"},"overhang_m":{"anyOf":[{"type":"number","maximum":1.5,"minimum":0.0},{"type":"null"}],"title":"Overhang M"},"corner_boards":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Corner Boards"},"cladding_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cladding On"},"style":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Style"},"outdoor":{"anyOf":[{"items":{"properties":{"kind":{"type":"string","pattern":"^(veranda|balkong|takaltan|terrasse|pergola)$","title":"Kind","default":"terrasse"},"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"south"},"width_m":{"type":"number","maximum":12.0,"minimum":1.0,"title":"Width M","default":4.0},"depth_m":{"type":"number","maximum":6.0,"minimum":1.0,"title":"Depth M","default":2.5}},"additionalProperties":false,"type":"object","title":"OutdoorIn","description":"A veranda / balkong / takaltan / terrasse / pergola on one side of the building."},"type":"array","maxItems":4},{"type":"null"}],"title":"Outdoor"},"partitions":{"anyOf":[{"items":{"properties":{"side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Side","default":"north"},"at_m":{"type":"number","maximum":30.0,"minimum":1.0,"title":"At M","default":2.5},"door":{"type":"boolean","title":"Door","default":true},"openings":{"anyOf":[{"items":{"$ref":"#/components/schemas/FreeWallOpeningIn"},"type":"array","maxItems":8},{"type":"null"}],"title":"Openings"}},"additionalProperties":false,"type":"object","title":"PartitionIn","description":"An inner wall parallel to ``side``, ``at_m`` metres in from it, with an optional door."},"type":"array","maxItems":4},{"type":"null"}],"title":"Partitions"},"interior_finish":{"type":"string","pattern":"^(ingen|panel|gips)$","title":"Interior Finish","default":"ingen"},"interior_color":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9 _-]{1,40}$"},{"type":"null"}],"title":"Interior Color"},"ceiling":{"type":"string","pattern":"^(ingen|innertak|isolert)$","title":"Ceiling","default":"ingen"},"foundation":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,24}$"},{"type":"null"}],"title":"Foundation"},"site_fall_pct":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Site Fall Pct"},"window_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Window Color"},"door_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Door Color"},"roof_covering":{"anyOf":[{"type":"string","pattern":"^[a-z_]{1,30}$"},{"type":"null"}],"title":"Roof Covering"},"roof_color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Roof Color"},"roof_edges":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Roof Edges"},"dormers":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Dormers","default":0},"dormer_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Dormer Side","default":"south"},"roof_windows":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Roof Windows","default":0},"roof_window_side":{"type":"string","pattern":"^(south|north|east|west)$","title":"Roof Window Side","default":"south"},"roof_window_size":{"type":"string","pattern":"^[A-Z]{2}[0-9]{2}$","title":"Roof Window Size","default":"MK06"},"matrikkel_alt":{"type":"boolean","title":"Matrikkel Alt","default":false},"basis":{"type":"string","pattern":"^(net|list|sales)$","title":"Basis","default":"net"},"mesh":{"type":"boolean","title":"Mesh","default":false},"mesh_format":{"type":"string","pattern":"^(json|b64)$","title":"Mesh Format","default":"json"},"markup_pct":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Markup Pct","default":0.0},"calibrate":{"type":"boolean","title":"Calibrate","default":false},"plan":{"type":"boolean","title":"Plan","default":false}}}},{"name":"configurator_my","cat":"pris","no":"Mine konfigurasjoner.","en":"My configurations.","method":"GET","path":"/configurator/my","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"My configurations. [logged in] — NO: Mine konfigurasjoner.","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{}}},{"name":"configurator_leads","cat":"pris","no":"Innkomne forespørsler (leverandør).","en":"Incoming requests (supplier).","method":"GET","path":"/configurator/leads","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Incoming requests (supplier). [logged in] — NO: Innkomne forespørsler (leverandør).","category_label":"Pris og konfigurator","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"get_construction","cat":"konstruksjon","no":"Bindingsverk-innstillinger.","en":"Framing settings.","method":"GET","path":"/sessions/{sid}/construction","access":"login","effect":"read","py":"konstruksjon()","status":"live","server":"web","level":"read","description":"Framing settings. [logged in] — NO: Bindingsverk-innstillinger.","category_label":"Konstruksjon (bindingsverk)","input_schema":{"type":"object","properties":{}}},{"name":"set_construction","cat":"konstruksjon","no":"Endre bindingsverk-innstillinger.","en":"Change framing settings.","method":"PATCH","path":"/sessions/{sid}/construction","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Change framing settings. [logged in] — NO: Endre bindingsverk-innstillinger.","category_label":"Konstruksjon (bindingsverk)","input_schema":{"type":"object","properties":{"updates":{"additionalProperties":true,"type":"object","title":"Updates","default":{}}}}},{"name":"refresh_construction","cat":"konstruksjon","no":"Regn ut bindingsverket på nytt.","en":"Recompute the framing.","method":"POST","path":"/sessions/{sid}/construction/refresh","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Recompute the framing. [logged in] — NO: Regn ut bindingsverket på nytt.","category_label":"Konstruksjon (bindingsverk)","input_schema":{"type":"object","properties":{}}},{"name":"construction_drawings","cat":"konstruksjon","no":"Konstruksjonsark (K): hver tegning er én viewport som følger reisverket; flytt/skaler/slett den med edit_sheet_viewport. Ny kjøring beholder plassering og slettede tegninger; reset=true lager settet på nytt. Standard skriver prosjektfila med en gang (saved_to_project); persist_project=false = bare økta (prøve/kontroll).","en":"Construction sheets (K): each drawing is one viewport that follows the framing; move/scale/delete it with edit_sheet_viewport. A new run keeps the layout and deleted drawings; reset=true rebuilds the set. Default writes the project file immediately (saved_to_project); persist_project=false = session only (trial).","method":"POST","path":"/sessions/{sid}/construction/drawings","access":"login","effect":"write","params":{"type":"object","properties":{"reset":{"type":"boolean","description":"lag K-settet på nytt"},"persist_project":{"type":"boolean","description":"skriv prosjektfila nå (standard true; false = bare økt)"}}},"status":"live","server":"web","level":"propose","description":"Construction sheets (K): each drawing is one viewport that follows the framing; move/scale/delete it with edit_sheet_viewport. A new run keeps the layout and deleted drawings; reset=true rebuilds the set. Default writes the project file immediately (saved_to_project); persist_project=false = session only (trial). [logged in] — NO: Konstruksjonsark (K): hver tegning er én viewport som følger reisverket; flytt/skaler/slett den med edit_sheet_viewport. Ny kjøring beholder plassering og slettede tegninger; reset=true lager settet på nytt. Standard skriver prosjektfila med en gang (saved_to_project); persist_project=false = bare økta (prøve/kontroll).","category_label":"Konstruksjon (bindingsverk)","input_schema":{"type":"object","properties":{"reset":{"type":"boolean","description":"lag K-settet på nytt"},"persist_project":{"type":"boolean","description":"skriv prosjektfila nå (standard true; false = bare økt)"}}}},{"name":"cutlist","cat":"konstruksjon","no":"Kappliste (JSON).","en":"Cut list (JSON).","method":"GET","path":"/sessions/{sid}/construction/cutlist","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Cut list (JSON). [logged in] — NO: Kappliste (JSON).","category_label":"Konstruksjon (bindingsverk)","input_schema":{"type":"object","properties":{}}},{"name":"bearing_system","cat":"konstruksjon","no":"Bæresystem: mønebjelke, overliggere, mønestolper og søyler med foreslått tverrsnitt (minste standardprofil som holder), styrende kontroll, utnyttelse, nedbøyning, opplagerkrefter og beregningen steg for steg (EC5, snølast per kommune). CSV: …/construction/bearing.csv. Arket lages med add_sheet_set('konstruksjon').","en":"Bearing system: ridge beam, headers, ridge posts and columns with the proposed section (smallest standard section that passes), governing check, utilisation, deflection, support reactions and the step-by-step calculation (EC5, snow per municipality). CSV: …/construction/bearing.csv. The sheet is made by add_sheet_set('konstruksjon').","method":"GET","path":"/sessions/{sid}/construction/bearing","access":"login","effect":"read","py":"baeresystem()","status":"live","server":"web","level":"read","description":"Bearing system: ridge beam, headers, ridge posts and columns with the proposed section (smallest standard section that passes), governing check, utilisation, deflection, support reactions and the step-by-step calculation (EC5, snow per municipality). CSV: …/construction/bearing.csv. The sheet is made by add_sheet_set('konstruksjon'). [logged in] — NO: Bæresystem: mønebjelke, overliggere, mønestolper og søyler med foreslått tverrsnitt (minste standardprofil som holder), styrende kontroll, utnyttelse, nedbøyning, opplagerkrefter og beregningen steg for steg (EC5, snølast per kommune). CSV: …/construction/bearing.csv. Arket lages med add_sheet_set('konstruksjon').","category_label":"Konstruksjon (bindingsverk)","input_schema":{"type":"object","properties":{}}},{"name":"apply_bearing_system","cat":"konstruksjon","no":"Skriv de foreslåtte tverrsnittene inn i konstruksjonsmodellen (mønebjelke ridge_b/h + kvalitet, overligger og antall bærestendere per åpning), så bindingsverk og kappliste følger. only=[posisjoner] begrenser.","en":"Write the proposed sections into the construction model (ridge ridge_b/h + grade, header and jack count per opening) so framing and cut list follow. only=[positions] limits it.","method":"POST","path":"/sessions/{sid}/construction/bearing/apply","access":"login","effect":"write","params":{"type":"object","properties":{"only":{"type":"array","items":{"type":"string"},"description":"posisjoner, f.eks. ['MB1', 'OL1']"}}},"status":"live","server":"web","level":"propose","description":"Write the proposed sections into the construction model (ridge ridge_b/h + grade, header and jack count per opening) so framing and cut list follow. only=[positions] limits it. [logged in] — NO: Skriv de foreslåtte tverrsnittene inn i konstruksjonsmodellen (mønebjelke ridge_b/h + kvalitet, overligger og antall bærestendere per åpning), så bindingsverk og kappliste følger. only=[posisjoner] begrenser.","category_label":"Konstruksjon (bindingsverk)","input_schema":{"type":"object","properties":{"only":{"type":"array","items":{"type":"string"},"description":"posisjoner, f.eks. ['MB1', 'OL1']"}}}},{"name":"snow_check","cat":"konstruksjon","no":"Snølastkontroll for byggestedet: kommune (navnet i NS-EN 1991-1-3 NA-tabellen) og høyde over havet settes i konstruksjonsinnstillingene, svaret er snølast på mark og tak, om mønebjelke, mønestolper og overliggere holder (minste profil og utnyttelse) og mønebjelken i modellen. Ukjent kommune: ok=false med forslag. Skriv forslaget inn med apply_bearing_system.","en":"Snow load check for the site: municipality (NS-EN 1991-1-3 NA table) and height above sea are set in the construction settings; the answer is snow on ground and roof, whether ridge beam, ridge posts and headers hold (smallest section, utilisation) and the ridge beam in the model. Unknown municipality: ok=false with suggestions. Write the proposal with apply_bearing_system.","method":"POST","path":"/sessions/{sid}/construction/snow","access":"login","effect":"write","py":"snolast(kommune='Vinje', hoyde_moh=1000)","params":{"type":"object","properties":{"kommune":{"type":"string"},"height_asl":{"type":"number","description":"m o.h., 0 = ikke oppgitt (sk,maks)"}},"required":["kommune"]},"example":{"kommune":"Vinje","height_asl":1000},"status":"live","server":"web","returns":"{ok, kommune, snolast_mark_kn_m2, snolast_tak, alle_holder, elementer:[{pos, element, section, util_pct, ok}], monebjelke_i_modellen}","level":"propose","description":"Snow load check for the site: municipality (NS-EN 1991-1-3 NA table) and height above sea are set in the construction settings; the answer is snow on ground and roof, whether ridge beam, ridge posts and headers hold (smallest section, utilisation) and the ridge beam in the model. Unknown municipality: ok=false with suggestions. Write the proposal with apply_bearing_system. [logged in] — NO: Snølastkontroll for byggestedet: kommune (navnet i NS-EN 1991-1-3 NA-tabellen) og høyde over havet settes i konstruksjonsinnstillingene, svaret er snølast på mark og tak, om mønebjelke, mønestolper og overliggere holder (minste profil og utnyttelse) og mønebjelken i modellen. Ukjent kommune: ok=false med forslag. Skriv forslaget inn med apply_bearing_system.","category_label":"Konstruksjon (bindingsverk)","input_schema":{"type":"object","properties":{"kommune":{"type":"string"},"height_asl":{"type":"number","description":"m o.h., 0 = ikke oppgitt (sk,maks)"}},"required":["kommune"]}},{"name":"export_ifc","cat":"eksport","no":"IFC4-eksport (nedlastingslenke).","en":"IFC4 export (download link).","method":"GET","path":"/sessions/{sid}/export/ifc","access":"login","effect":"read","mcp":"web","status":"live","server":"web","level":"read","description":"IFC4 export (download link). [logged in] — NO: IFC4-eksport (nedlastingslenke).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{}}},{"name":"export_plan_pdf","cat":"eksport","no":"Plan som PDF (preset=…).","en":"Plan as PDF (preset=...).","method":"GET","path":"/sessions/{sid}/export/plan.pdf","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Plan as PDF (preset=...). [logged in] — NO: Plan som PDF (preset=…).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"},"view":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"View"},"scale":{"type":"number","default":100.0,"title":"Scale"},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset"}}}},{"name":"export_plan_dxf","cat":"eksport","no":"Plan som DXF.","en":"Plan as DXF.","method":"GET","path":"/sessions/{sid}/export/plan.dxf","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Plan as DXF. [logged in] — NO: Plan som DXF.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"},"view":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"View"},"scale":{"type":"number","default":100.0,"title":"Scale"}}}},{"name":"export_sheets_pdf","cat":"eksport","no":"Alle ark som PDF. ?sheet=<navn eller tegningsnr> gir bare det arket som egen PDF (én PDF per dokument, f.eks. til Smart Holte).","en":"All sheets as PDF. ?sheet=<name or drawing no.> returns just that sheet as its own PDF (one PDF per document, e.g. for Smart Holte).","method":"GET","path":"/sessions/{sid}/export/sheets.pdf","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"sheet":{"type":"string"},"out_path":{"type":"string","description":"MCP: local file to write (default: temp dir)"},"sid":{"type":"string"}}},"status":"live","server":"web","returns":"application/pdf (MCP: {ok, path, bytes, download_url})","level":"read","description":"All sheets as PDF. ?sheet=<name or drawing no.> returns just that sheet as its own PDF (one PDF per document, e.g. for Smart Holte). [logged in] — NO: Alle ark som PDF. ?sheet=<navn eller tegningsnr> gir bare det arket som egen PDF (én PDF per dokument, f.eks. til Smart Holte).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"sheet":{"type":"string"},"out_path":{"type":"string","description":"MCP: local file to write (default: temp dir)"},"sid":{"type":"string"}}}},{"name":"export_sheets_dxf","cat":"eksport","no":"Ark som DXF.","en":"Sheets as DXF.","method":"GET","path":"/sessions/{sid}/export/sheets.dxf","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Sheets as DXF. [logged in] — NO: Ark som DXF.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{}}},{"name":"export_sheets_dwg","cat":"eksport","no":"Ark som DWG.","en":"Sheets as DWG.","method":"GET","path":"/sessions/{sid}/export/sheets.dwg","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Sheets as DWG. [logged in] — NO: Ark som DWG.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{}}},{"name":"export_skp","cat":"eksport","no":"SketchUp-fil.","en":"SketchUp file.","method":"GET","path":"/sessions/{sid}/export/skp","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"SketchUp file. [logged in] — NO: SketchUp-fil.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{}}},{"name":"export_exchange","cat":"eksport","no":"dibrix-exchange.json: nøytralt utvekslingsformat (schema v1) med elementer (uid, IFC-klasse, etasje, fag, type, mesh i mm), materialer, lag, scener, snitt og georef. Leses av SketchUp-extensionen «Hent fra Dibrix»; Revit/Archicad senere. textures=false utelater bildene.","en":"dibrix-exchange.json: neutral exchange format (schema v1) with elements (uid, IFC class, storey, discipline, type, mesh in mm), materials, layers, scenes, sections and georef. Read by the SketchUp extension «Get from Dibrix»; Revit/Archicad later. textures=false leaves out the images.","method":"GET","path":"/sessions/{sid}/export/exchange.json","access":"login","effect":"read","params":{"type":"object","properties":{"textures":{"type":"boolean"},"download":{"type":"boolean"},"sid":{"type":"string"}}},"status":"live","server":"web","returns":"{format: 'dibrix-exchange', version, project, units, georef, presentation, storeys, disciplines, layers, materials, types, elements, section_planes, scenes, stats}","level":"read","description":"dibrix-exchange.json: neutral exchange format (schema v1) with elements (uid, IFC class, storey, discipline, type, mesh in mm), materials, layers, scenes, sections and georef. Read by the SketchUp extension «Get from Dibrix»; Revit/Archicad later. textures=false leaves out the images. [logged in] — NO: dibrix-exchange.json: nøytralt utvekslingsformat (schema v1) med elementer (uid, IFC-klasse, etasje, fag, type, mesh i mm), materialer, lag, scener, snitt og georef. Leses av SketchUp-extensionen «Hent fra Dibrix»; Revit/Archicad senere. textures=false utelater bildene.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"textures":{"type":"boolean"},"download":{"type":"boolean"},"sid":{"type":"string"}}}},{"name":"export_calc_elements","cat":"eksport","no":"Elementliste for kalkyle.","en":"Element list for costing.","method":"GET","path":"/sessions/{sid}/export/calc-elements","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"Element list for costing. [logged in] — NO: Elementliste for kalkyle.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"}}}},{"name":"export_glb","cat":"eksport","no":"3D-modell som GLB.","en":"3D model as GLB.","method":"GET","path":"/sessions/{sid}/glb","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"3D model as GLB. [logged in] — NO: 3D-modell som GLB.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{}}},{"name":"export_igz","cat":"eksport","no":"Dokumentet (.igz).","en":"The document (.igz).","method":"GET","path":"/sessions/{sid}/igz","access":"login","effect":"read","status":"live","server":"web","level":"read","description":"The document (.igz). [logged in] — NO: Dokumentet (.igz).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{}}},{"name":"export_capabilities","cat":"eksport","no":"Hvilke eksportformater serveren kan.","en":"Which export formats the server supports.","method":"GET","path":"/export/capabilities","access":"public","effect":"read","status":"live","server":"web","description":"Which export formats the server supports. [open, no login] — NO: Hvilke eksportformater serveren kan.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{}}},{"name":"import_igz","cat":"eksport","no":"Last inn .igz (multipart).","en":"Load an .igz (multipart).","method":"POST","path":"/sessions/{sid}/igz","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Load an .igz (multipart). [logged in] — NO: Last inn .igz (multipart).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"background":{"type":"boolean","default":false,"title":"Background"}}}},{"name":"import_ifc","cat":"eksport","no":"Importer IFC (multipart).","en":"Import IFC (multipart).","method":"POST","path":"/sessions/{sid}/import/ifc","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Import IFC (multipart). [logged in] — NO: Importer IFC (multipart).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{}}},{"name":"import_ifc_as_spec","cat":"eksport","no":"IFC (Revit/ArchiCAD-eksport) → hus-spec (multipart): vegger på aksen, åpninger på verten, etasjer, dekker, tak (form antatt), rom; meta.provenance per element. build=true bygger spec-en i økta (replace tømmer først). Rett det usikre og bygg med build_house_from_spec.","en":"IFC (Revit/ArchiCAD export) → house spec (multipart): walls on the axis, openings on the host, storeys, slabs, roofs (form assumed), rooms; meta.provenance per element. build=true builds the spec in the session (replace clears first). Fix the uncertain parts and build with build_house_from_spec.","method":"POST","path":"/sessions/{sid}/import/ifc/spec","access":"login","effect":"write","params":{"type":"object","properties":{"build":{"type":"boolean"},"replace":{"type":"boolean"},"sid":{"type":"string"}}},"status":"live","server":"web","returns":"{ok, spec, rapport{ifc_klasser, hoppet_over, counts}, build?}","level":"propose","description":"IFC (Revit/ArchiCAD export) → house spec (multipart): walls on the axis, openings on the host, storeys, slabs, roofs (form assumed), rooms; meta.provenance per element. build=true builds the spec in the session (replace clears first). Fix the uncertain parts and build with build_house_from_spec. [logged in] — NO: IFC (Revit/ArchiCAD-eksport) → hus-spec (multipart): vegger på aksen, åpninger på verten, etasjer, dekker, tak (form antatt), rom; meta.provenance per element. build=true bygger spec-en i økta (replace tømmer først). Rett det usikre og bygg med build_house_from_spec.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"build":{"type":"boolean"},"replace":{"type":"boolean"},"sid":{"type":"string"}}}},{"name":"import_skp","cat":"eksport","no":"Importer SketchUp (multipart).","en":"Import SketchUp (multipart).","method":"POST","path":"/sessions/{sid}/import/skp","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Import SketchUp (multipart). [logged in] — NO: Importer SketchUp (multipart).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"background":{"type":"boolean","default":false,"title":"Background"}}}},{"name":"import_xdi","cat":"eksport","no":"Importer XDI (multipart).","en":"Import XDI (multipart).","method":"POST","path":"/sessions/{sid}/import/xdi","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Import XDI (multipart). [logged in] — NO: Importer XDI (multipart).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"replace":{"type":"boolean","default":true,"title":"Replace"}}}},{"name":"import_underlay","cat":"eksport","no":"Underlag (bilde/PDF) i planen.","en":"Underlay (image/PDF) in the plan.","method":"POST","path":"/sessions/{sid}/import/underlay","access":"login","effect":"write","status":"live","server":"web","level":"propose","description":"Underlay (image/PDF) in the plan. [logged in] — NO: Underlag (bilde/PDF) i planen.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"width_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Width M"},"page":{"type":"integer","default":0,"title":"Page"},"z":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Z"},"view_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"View Key"}}}},{"name":"list_approved_drawings","cat":"eksport","no":"Sist godkjente tegninger i prosjektet: per side id, kind (plan|snitt|fasade|situasjon|perspektiv|annet), storey/view, scale_n (1:N) og scale_src (pdf_text|default|user|calibrated), rotation, page_mm, size_m, underlay {on, opacity, locked, center, angle_deg}, sheet {on, soknad}, sheet_name; pluss valglistene storeys, facades, sections, scales.","en":"Last approved drawings of the project: per page id, kind (plan|snitt|fasade|situasjon|perspektiv|annet), storey/view, scale_n (1:N) and scale_src (pdf_text|default|user|calibrated), rotation, page_mm, size_m, underlay {on, opacity, locked, center, angle_deg}, sheet {on, soknad}, sheet_name; plus the choice lists storeys, facades, sections, scales.","method":"GET","path":"/sessions/{sid}/agent/approved-drawings","access":"share","effect":"read","mcp":"web","py":"list_approved_drawings()","ops":["list_approved_drawings"],"status":"live","server":"web","returns":"{ok, pages:[…], kinds, storeys, facades, sections, scales}","level":"read","description":"Last approved drawings of the project: per page id, kind (plan|snitt|fasade|situasjon|perspektiv|annet), storey/view, scale_n (1:N) and scale_src (pdf_text|default|user|calibrated), rotation, page_mm, size_m, underlay {on, opacity, locked, center, angle_deg}, sheet {on, soknad}, sheet_name; plus the choice lists storeys, facades, sections, scales. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Sist godkjente tegninger i prosjektet: per side id, kind (plan|snitt|fasade|situasjon|perspektiv|annet), storey/view, scale_n (1:N) og scale_src (pdf_text|default|user|calibrated), rotation, page_mm, size_m, underlay {on, opacity, locked, center, angle_deg}, sheet {on, soknad}, sheet_name; pluss valglistene storeys, facades, sections, scales.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"list_sources","cat":"inspeksjon","no":"Alt Dibrix vet om huset som kilder, samlet: tegningsfiler (PDF/bilder fra Last opp, dra-og-slipp og BuildChat, med sider, om sidene og modellen er lagt inn og om et første utkast står), lasermål/ankere og brukerens beskrivelse i chatten. Tolkeren får lasermål og beskrivelsen sammen med sidene. Kilde og sikkerhet per element står i element_props (source_info, source_conf, source_how).","en":"Everything Dibrix knows about the house as sources, in one list: drawing files (PDF/pictures from Upload, drag-and-drop and BuildChat, with pages, whether the pages and the model are in and whether a first draft stands), laser measurements/anchors and the user's description in the chat. The reader gets the laser measurements and the description together with the pages. Source and confidence per element are in element_props (source_info, source_conf, source_how).","method":"GET","path":"/sessions/{sid}/agent/sources","access":"share","effect":"read","mcp":"web","status":"live","server":"web","returns":"{ok, files, anchors, chat, n}","level":"read","description":"Everything Dibrix knows about the house as sources, in one list: drawing files (PDF/pictures from Upload, drag-and-drop and BuildChat, with pages, whether the pages and the model are in and whether a first draft stands), laser measurements/anchors and the user's description in the chat. The reader gets the laser measurements and the description together with the pages. Source and confidence per element are in element_props (source_info, source_conf, source_how). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Alt Dibrix vet om huset som kilder, samlet: tegningsfiler (PDF/bilder fra Last opp, dra-og-slipp og BuildChat, med sider, om sidene og modellen er lagt inn og om et første utkast står), lasermål/ankere og brukerens beskrivelse i chatten. Tolkeren får lasermål og beskrivelsen sammen med sidene. Kilde og sikkerhet per element står i element_props (source_info, source_conf, source_how).","category_label":"Inspiser og velg","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"import_approved_drawings","cat":"eksport","no":"Importer sist godkjente tegninger (PDF med alle sider, eller bilde; multipart «file»): hver side blir underlag i riktig målestokk under plan/fasade/snitt OG en egen side «Sist godkjent – …» i Tegning, merket «Sist godkjent situasjon» og med i søknadssettet (også til nabovarsel). Type, etasje/visning og 1:N gjettes fra teksten på siden og filnavnet; tekstretning (PDF) eller lokal OCR snur sider. Felt: kind, storey, view, scale_n, rotation (0/90/180/270), approved_date, sheets, in_soknad, ocr. Ett angresteg. Filen sendes som data_b64 (JSON) eller path til en lokal fil (MCP-klienten leser den). Vanlig opplasting i nettleseren er ÉN dialog «Last opp tegninger / bilder…» (se import_drawings_job).","en":"Import the last approved drawings (PDF with all pages, or an image; multipart 'file'): each page becomes an underlay at true scale under the plan/facade/section AND its own page 'Sist godkjent – …' in Drawing, marked 'Last approved situation' and part of the application set (also for neighbour notification). Kind, storey/view and 1:N are guessed from the page text and file name; text direction (PDF) or local OCR turns pages. Fields: kind, storey, view, scale_n, rotation (0/90/180/270), approved_date, sheets, in_soknad, ocr. One undo step. The file goes as data_b64 (JSON) or path to a local file (the MCP client reads it). In the browser there is ONE dialog «Upload drawings / pictures…» (see import_drawings_job).","method":"POST","path":"/sessions/{sid}/agent/approved-drawings/import-json","access":"share","effect":"write","mcp":"web","py":"import_approved_drawings(path='/tmp/godkjent.pdf', approved_date='1996-05-12')","ops":["import_approved_drawings"],"example":{"name":"godkjent.pdf","data_b64":"<base64>","approved_date":"1996-05-12"},"status":"live","server":"web","returns":"{ok, added, pages:[…]}","level":"propose","description":"Import the last approved drawings (PDF with all pages, or an image; multipart 'file'): each page becomes an underlay at true scale under the plan/facade/section AND its own page 'Sist godkjent – …' in Drawing, marked 'Last approved situation' and part of the application set (also for neighbour notification). Kind, storey/view and 1:N are guessed from the page text and file name; text direction (PDF) or local OCR turns pages. Fields: kind, storey, view, scale_n, rotation (0/90/180/270), approved_date, sheets, in_soknad, ocr. One undo step. The file goes as data_b64 (JSON) or path to a local file (the MCP client reads it). In the browser there is ONE dialog «Upload drawings / pictures…» (see import_drawings_job). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Importer sist godkjente tegninger (PDF med alle sider, eller bilde; multipart «file»): hver side blir underlag i riktig målestokk under plan/fasade/snitt OG en egen side «Sist godkjent – …» i Tegning, merket «Sist godkjent situasjon» og med i søknadssettet (også til nabovarsel). Type, etasje/visning og 1:N gjettes fra teksten på siden og filnavnet; tekstretning (PDF) eller lokal OCR snur sider. Felt: kind, storey, view, scale_n, rotation (0/90/180/270), approved_date, sheets, in_soknad, ocr. Ett angresteg. Filen sendes som data_b64 (JSON) eller path til en lokal fil (MCP-klienten leser den). Vanlig opplasting i nettleseren er ÉN dialog «Last opp tegninger / bilder…» (se import_drawings_job).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"name":{"type":"string","maxLength":200,"title":"Name","default":"tegning.pdf"},"data_b64":{"type":"string","title":"Data B64","description":"PDF or image as base64 (a data: URL is fine)","default":""},"path":{"type":"string","maxLength":1000,"title":"Path","description":"Local file: read by the MCP client (the server never reads local paths)","default":""},"kind":{"anyOf":[{"type":"string","enum":["plan","snitt","fasade","situasjon","perspektiv","annet"]},{"type":"null"}],"title":"Kind"},"storey":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Storey"},"view":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"View"},"scale_n":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":1.0},{"type":"null"}],"title":"Scale N"},"rotation":{"anyOf":[{"type":"integer","enum":[0,90,180,270]},{"type":"null"}],"title":"Rotation"},"approved_date":{"type":"string","maxLength":40,"title":"Approved Date","default":""},"sheets":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sheets"},"in_soknad":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Soknad"},"ocr":{"type":"boolean","title":"Ocr","default":true}}}},{"name":"update_approved_drawing","cat":"eksport","no":"Endre én godkjent side (ett angresteg): kind, storey (plan), view (fasade-/snittscene), scale_n, rotation (bildet snus), approved_date, title, opacity 0-1, underlay av/på, locked, sheet av/på, soknad (med i søknadssettet), center [x,y(,z)] eller offset_m [dx,dy] (flytt underlaget, meter), angle_deg (drei).","en":"Change one approved page (one undo step): kind, storey (plan), view (facade/section scene), scale_n, rotation (the picture turns), approved_date, title, opacity 0-1, underlay on/off, locked, sheet on/off, soknad (in the application set), center [x,y(,z)] or offset_m [dx,dy] (move the underlay, metres), angle_deg, sheet_paper (A4..A0, empty = automatic) and sheet_scale (1:N, 0 = automatic) for the sheet of the page.","method":"POST","path":"/sessions/{sid}/agent/approved-drawings/{pid}","access":"share","effect":"write","mcp":"web","py":"update_approved_drawing('ab12cd34ef', scale_n=50, rotation=180)","ops":["update_approved_drawing"],"example":{"scale_n":100,"kind":"plan","storey":"1. etg"},"status":"live","server":"web","returns":"{ok, page}","level":"propose","description":"Change one approved page (one undo step): kind, storey (plan), view (facade/section scene), scale_n, rotation (the picture turns), approved_date, title, opacity 0-1, underlay on/off, locked, sheet on/off, soknad (in the application set), center [x,y(,z)] or offset_m [dx,dy] (move the underlay, metres), angle_deg, sheet_paper (A4..A0, empty = automatic) and sheet_scale (1:N, 0 = automatic) for the sheet of the page. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Endre én godkjent side (ett angresteg): kind, storey (plan), view (fasade-/snittscene), scale_n, rotation (bildet snus), approved_date, title, opacity 0-1, underlay av/på, locked, sheet av/på, soknad (med i søknadssettet), center [x,y(,z)] eller offset_m [dx,dy] (flytt underlaget, meter), angle_deg (drei).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"pid":{"type":"string","title":"Pid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"kind":{"anyOf":[{"type":"string","enum":["plan","snitt","fasade","situasjon","perspektiv","annet"]},{"type":"null"}],"title":"Kind"},"storey":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Storey"},"view":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"View"},"scale_n":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":1.0},{"type":"null"}],"title":"Scale N"},"rotation":{"anyOf":[{"type":"integer","enum":[0,90,180,270]},{"type":"null"}],"title":"Rotation"},"approved_date":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Approved Date"},"title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Title"},"opacity":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.05},{"type":"null"}],"title":"Opacity"},"underlay":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Underlay"},"locked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Locked"},"sheet":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sheet"},"soknad":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Soknad"},"center":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":2},{"type":"null"}],"title":"Center"},"offset_m":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":2},{"type":"null"}],"title":"Offset M"},"angle_deg":{"anyOf":[{"type":"number","maximum":360.0,"minimum":-360.0},{"type":"null"}],"title":"Angle Deg"},"sheet_paper":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Sheet Paper"},"sheet_scale":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Sheet Scale"},"title_pos":{"anyOf":[{"type":"string","maxLength":6},{"type":"null"}],"title":"Title Pos"}},"required":["pid"]}},{"name":"calibrate_approved_drawing","cat":"eksport","no":"Kalibrer målestokken på et godkjent underlag: to punkt på underlaget (verdenskoordinater i meter, slik de ble klikket) og den virkelige avstanden. p1 ligger fast.","en":"Calibrate the scale of an approved underlay: two points on the underlay (world metres, as clicked) and the true distance. p1 stays put.","method":"POST","path":"/sessions/{sid}/agent/approved-drawings/{pid}/calibrate","access":"share","effect":"write","mcp":"web","py":"calibrate_approved_drawing('ab12cd34ef', [0, 0, 0], [8.4, 0, 0], 8.0)","ops":["calibrate_approved_drawing"],"example":{"p1":[0,0,0],"p2":[8.4,0,0],"distance_m":8.0},"status":"live","server":"web","returns":"{ok, factor, page}","level":"propose","description":"Calibrate the scale of an approved underlay: two points on the underlay (world metres, as clicked) and the true distance. p1 stays put. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Kalibrer målestokken på et godkjent underlag: to punkt på underlaget (verdenskoordinater i meter, slik de ble klikket) og den virkelige avstanden. p1 ligger fast.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"pid":{"type":"string","title":"Pid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"p1":{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":2,"title":"P1"},"p2":{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":2,"title":"P2"},"distance_m":{"type":"number","maximum":100000.0,"exclusiveMinimum":0.0,"title":"Distance M"}},"required":["pid","p1","p2","distance_m"]}},{"name":"delete_approved_drawing","cat":"eksport","no":"Fjern én godkjent side med underlaget og siden i Tegning (ett angresteg).","en":"Remove one approved page with its underlay and its page in Drawing (one undo step).","method":"DELETE","path":"/sessions/{sid}/agent/approved-drawings/{pid}","access":"share","effect":"write","mcp":"web","py":"delete_approved_drawing('ab12cd34ef')","ops":["delete_approved_drawing"],"status":"live","server":"web","returns":"{ok, deleted, count}","level":"propose","description":"Remove one approved page with its underlay and its page in Drawing (one undo step). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Fjern én godkjent side med underlaget og siden i Tegning (ett angresteg).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"pid":{"type":"string","title":"Pid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["pid"]}},{"name":"import_drawings_job","cat":"eksport","no":"Start en importjobb for tegninger (PDF/bilder som base64 i JSON: files:[{name, data_b64}], mode build|approved|both, approved_date). Jobben klassifiserer sidene (plan/snitt/fasade/situasjon/annet, etasje, retning, målestokk, dreiing; kode først, Claude bare for usikre sider) og STOPPER i waiting_for_user. Se get_import_job, rett med edit_import_pages, bekreft med confirm_import_job. Én jobb per opplasting; ingenting slettes. Bare eier/redigerer (ikke visningslenke eller propose-kopi).","en":"Start an import job for drawings (PDF/images as base64 in JSON: files:[{name, data_b64}], mode build|approved|both, approved_date). The job classifies the pages (plan/section/elevation/site/other, storey, direction, scale, rotation; code first, Claude only for uncertain pages) and STOPS in waiting_for_user. See get_import_job, fix with edit_import_pages, confirm with confirm_import_job. One job per upload; nothing is deleted. Owner/editor only (not a view link or a propose copy).","method":"POST","path":"/sessions/{sid}/agent/import-drawings/json","access":"share","effect":"write","mcp":"web","example":{"files":[{"name":"tegninger.pdf","data_b64":"<base64>"}],"mode":"both"},"status":"live","server":"web","returns":"{ok, job:{id, state, pages…}}","level":"propose","description":"Start an import job for drawings (PDF/images as base64 in JSON: files:[{name, data_b64}], mode build|approved|both, approved_date). The job classifies the pages (plan/section/elevation/site/other, storey, direction, scale, rotation; code first, Claude only for uncertain pages) and STOPS in waiting_for_user. See get_import_job, fix with edit_import_pages, confirm with confirm_import_job. One job per upload; nothing is deleted. Owner/editor only (not a view link or a propose copy). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Start en importjobb for tegninger (PDF/bilder som base64 i JSON: files:[{name, data_b64}], mode build|approved|both, approved_date). Jobben klassifiserer sidene (plan/snitt/fasade/situasjon/annet, etasje, retning, målestokk, dreiing; kode først, Claude bare for usikre sider) og STOPPER i waiting_for_user. Se get_import_job, rett med edit_import_pages, bekreft med confirm_import_job. Én jobb per opplasting; ingenting slettes. Bare eier/redigerer (ikke visningslenke eller propose-kopi).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"files":{"items":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"data_b64":{"type":"string","minLength":4,"title":"Data B64"},"mime":{"type":"string","maxLength":100,"title":"Mime","default":""}},"type":"object","required":["name","data_b64"],"title":"FileIn"},"type":"array","maxItems":40,"minItems":1,"title":"Files"},"mode":{"type":"string","enum":["build","approved","both"],"title":"Mode","default":"both"},"approved_date":{"type":"string","maxLength":40,"title":"Approved Date","default":""},"project_name":{"type":"string","maxLength":200,"title":"Project Name","default":""}},"required":["files"]}},{"name":"import_drawings_upload","cat":"eksport","no":"Samme som import_drawings_job, men som skjema-opplasting (multipart: files, mode, approved_date). Web-menyen Fil > Importer > Tegninger (PDF / bilde) bruker denne. Agenter: curl -F files=@fil.pdf -H 'Authorization: Bearer dk_…' (ikke BuildChat-vedlegg — den krever ekte klikk).","en":"Same as import_drawings_job but as a form upload (multipart: files, mode, approved_date). The web menu File > Import > Drawings (PDF / image) uses this. Agents: curl -F files=@file.pdf -H 'Authorization: Bearer dk_…' (not BuildChat attach — needs a real click).","method":"POST","path":"/sessions/{sid}/agent/import-drawings","access":"share","effect":"write","mcp":"web","status":"live","server":"web","returns":"{ok, job}","level":"propose","description":"Same as import_drawings_job but as a form upload (multipart: files, mode, approved_date). The web menu File > Import > Drawings (PDF / image) uses this. Agents: curl -F files=@file.pdf -H 'Authorization: Bearer dk_…' (not BuildChat attach — needs a real click). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Samme som import_drawings_job, men som skjema-opplasting (multipart: files, mode, approved_date). Web-menyen Fil > Importer > Tegninger (PDF / bilde) bruker denne. Agenter: curl -F files=@fil.pdf -H 'Authorization: Bearer dk_…' (ikke BuildChat-vedlegg — den krever ekte klikk).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"import_drawings_vector","cat":"eksport","no":"Import av tegninger UTEN KI (gratis, ca. 10-60 s): last opp PDF/bilder (multipart: files, replace, name, declared_bra_m2, declared_storeys). Leser plantegninger (tittel, etasje, målestokk, veggstreker, åpninger, romtekst + areal), snitt (etasjehøyde, takvinkel), bygger hus-spec med kilde og sikkerhet per element (meta.provenance), legger modellen i økta, legger originalsidene inn som underlag per etasje i riktig målestokk, og lagrer kontrollark + jobbmappe. Skannede sider, fasader og trapper leses ikke (bruk import_drawings_job). Svaret har report (antatt, avvik, mål mot tegningen).","en":"Import drawings WITHOUT AI (free, ~10-60 s): upload PDF/images (multipart: files, replace, name, declared_bra_m2, declared_storeys). Reads plans (title, storey, scale, wall strokes, openings, room text + area), sections (storey height, roof angle), builds a hus-spec with source and confidence per element (meta.provenance), puts the model in the session, places the original pages as underlays per storey at true scale, and saves control sheets + a job folder. Scanned pages, elevations and stairs are not read (use import_drawings_job). The reply has report (assumed, deviations, measured vs drawing).","method":"POST","path":"/sessions/{sid}/agent/import-vector","access":"share","effect":"write","mcp":"web","status":"live","server":"web","returns":"{ok, id, report, counts, applied}","level":"propose","description":"Import drawings WITHOUT AI (free, ~10-60 s): upload PDF/images (multipart: files, replace, name, declared_bra_m2, declared_storeys). Reads plans (title, storey, scale, wall strokes, openings, room text + area), sections (storey height, roof angle), builds a hus-spec with source and confidence per element (meta.provenance), puts the model in the session, places the original pages as underlays per storey at true scale, and saves control sheets + a job folder. Scanned pages, elevations and stairs are not read (use import_drawings_job). The reply has report (assumed, deviations, measured vs drawing). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Import av tegninger UTEN KI (gratis, ca. 10-60 s): last opp PDF/bilder (multipart: files, replace, name, declared_bra_m2, declared_storeys). Leser plantegninger (tittel, etasje, målestokk, veggstreker, åpninger, romtekst + areal), snitt (etasjehøyde, takvinkel), bygger hus-spec med kilde og sikkerhet per element (meta.provenance), legger modellen i økta, legger originalsidene inn som underlag per etasje i riktig målestokk, og lagrer kontrollark + jobbmappe. Skannede sider, fasader og trapper leses ikke (bruk import_drawings_job). Svaret har report (antatt, avvik, mål mot tegningen).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"get_import_vector","cat":"eksport","no":"Et lagret importresultat uten KI: jobb + rapport (GET .../import-vector/{id}), spec (/spec) og kontrollark (/control/{etasje}.png).","en":"A saved no-AI import result: job + report (GET .../import-vector/{id}), spec (/spec) and control sheets (/control/{storey}.png).","method":"GET","path":"/sessions/{sid}/agent/import-vector/{rid}","access":"share","effect":"read","mcp":"web","status":"live","server":"web","returns":"{ok, job, report}","level":"read","description":"A saved no-AI import result: job + report (GET .../import-vector/{id}), spec (/spec) and control sheets (/control/{storey}.png). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Et lagret importresultat uten KI: jobb + rapport (GET .../import-vector/{id}), spec (/spec) og kontrollark (/control/{etasje}.png).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"rid":{"type":"string","title":"Rid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["rid"]}},{"name":"get_import_vector_spec","cat":"eksport","no":"hus-spec fra et lagret import uten KI (med meta.provenance per element).","en":"The hus-spec of a saved no-AI import (with meta.provenance per element).","method":"GET","path":"/sessions/{sid}/agent/import-vector/{rid}/spec","access":"share","effect":"read","mcp":"web","status":"live","server":"web","returns":"hus-spec","level":"read","description":"The hus-spec of a saved no-AI import (with meta.provenance per element). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: hus-spec fra et lagret import uten KI (med meta.provenance per element).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"rid":{"type":"string","title":"Rid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["rid"]}},{"name":"get_import_vector_control","cat":"eksport","no":"Kontrollark (PNG) fra import uten KI: originalsiden for etasjen med modellen tegnet oppå. {name} = etasje (kjeller, 1_etasje, loft …).","en":"Control sheet (PNG) from a no-AI import: the original page of the storey with the model drawn on top. {name} = storey (kjeller, 1_etasje, loft …).","method":"GET","path":"/sessions/{sid}/agent/import-vector/{rid}/control/{name}.png","access":"share","effect":"read","mcp":"web","status":"live","server":"web","returns":"image/png","level":"read","description":"Control sheet (PNG) from a no-AI import: the original page of the storey with the model drawn on top. {name} = storey (kjeller, 1_etasje, loft …). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Kontrollark (PNG) fra import uten KI: originalsiden for etasjen med modellen tegnet oppå. {name} = etasje (kjeller, 1_etasje, loft …).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"rid":{"type":"string","title":"Rid"},"name":{"type":"string","title":"Name"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["rid","name"]}},{"name":"list_import_jobs","cat":"eksport","no":"Importjobbene til økta og prosjektet (id, state, mode, kostnad), nyeste først. «Hva trenger deg»: needs_count, blocking_count, first_need (kode, side, handling) og waiting_on (aldri tom i waiting_for_user: blokkerende behov og første side).","en":"The import jobs of the session and the project (id, state, mode, cost), newest first. «What needs you»: needs_count, blocking_count, first_need (code, page, action) and waiting_on (never empty in waiting_for_user: the blocking needs and the first page).","method":"GET","path":"/sessions/{sid}/agent/import-drawings","access":"share","effect":"read","mcp":"web","status":"live","server":"web","returns":"{ok, jobs:[…]}","level":"read","description":"The import jobs of the session and the project (id, state, mode, cost), newest first. «What needs you»: needs_count, blocking_count, first_need (code, page, action) and waiting_on (never empty in waiting_for_user: the blocking needs and the first page). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Importjobbene til økta og prosjektet (id, state, mode, kostnad), nyeste først. «Hva trenger deg»: needs_count, blocking_count, first_need (kode, side, handling) og waiting_on (aldri tom i waiting_for_user: blokkerende behov og første side).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"get_import_job","cat":"eksport","no":"Én importjobb: state (uploaded, classifying, waiting_for_user, building, done, failed, cancelled), pages (kind, storey, view, scale_n, rotation, kind_conf, ask = hva koden er usikker på), estimate (tokens/kostnad før bygging, tak), usage (faktisk), pause (waiting_for_user etter klassifisering eller kostnadstak), result.report (rapporten: usikre punkter, mål mot tegningen, kostnad), pages[].needs (konkrete behov per side: scale_missing, kind_uncertain, storey_missing, view_missing, region_unconfirmed, no_measure …; blocking, action) og waiting_on.","en":"One import job: state, pages (kind, storey, view, scale_n, rotation, kind_conf, ask = what the code is unsure of), estimate (tokens/cost before building, ceiling), usage (actual), pause (waiting_for_user after classification or at the cost ceiling), result.report (the report: uncertain points, measurements against the drawing, cost), pages[].needs (concrete needs per page: scale_missing, kind_uncertain, storey_missing, view_missing, region_unconfirmed, no_measure …; blocking, action) and waiting_on.","method":"GET","path":"/sessions/{sid}/agent/import-drawings/{jid}","access":"share","effect":"read","mcp":"web","status":"live","server":"web","returns":"{ok, job, events}","level":"read","description":"One import job: state, pages (kind, storey, view, scale_n, rotation, kind_conf, ask = what the code is unsure of), estimate (tokens/cost before building, ceiling), usage (actual), pause (waiting_for_user after classification or at the cost ceiling), result.report (the report: uncertain points, measurements against the drawing, cost), pages[].needs (concrete needs per page: scale_missing, kind_uncertain, storey_missing, view_missing, region_unconfirmed, no_measure …; blocking, action) and waiting_on. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Én importjobb: state (uploaded, classifying, waiting_for_user, building, done, failed, cancelled), pages (kind, storey, view, scale_n, rotation, kind_conf, ask = hva koden er usikker på), estimate (tokens/kostnad før bygging, tak), usage (faktisk), pause (waiting_for_user etter klassifisering eller kostnadstak), result.report (rapporten: usikre punkter, mål mot tegningen, kostnad), pages[].needs (konkrete behov per side: scale_missing, kind_uncertain, storey_missing, view_missing, region_unconfirmed, no_measure …; blocking, action) og waiting_on.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["jid"]}},{"name":"tolk_status","cat":"eksport","no":"«Tolk»: status per side i en importjobb: rotasjon (deg 0/90/180/270 + skew_deg, forslaget og kilden), skala (scale_n, kilde, nærmeste vanlige og avvik i %), hjelpemål (antall linjer forslag/godkjent, tegningen godkjent) og missing (rotation/scale). ready = alt satt og jobben venter. Start flyten med import_drawings_upload, rett med edit_import_pages / tolk_scale_from_known, avslutt med confirm_import_job.","en":"«Interpret»: per-page status of an import job: rotation (deg 0/90/180/270 + skew_deg, the suggestion and its source), scale (scale_n, source, nearest standard and deviation in %), guides (lines suggested/approved, drawing approved) and missing (rotation/scale). ready = everything set and the job waits. Start the flow with import_drawings_upload, fix with edit_import_pages / tolk_scale_from_known, finish with confirm_import_job.","method":"GET","path":"/sessions/{sid}/agent/import-drawings/{jid}/tolk","access":"share","effect":"read","mcp":"web","status":"live","server":"web","returns":"{ok, job_id, state, ready, pages:[{idx, rotation, scale, guides, missing}]}","level":"read","description":"«Interpret»: per-page status of an import job: rotation (deg 0/90/180/270 + skew_deg, the suggestion and its source), scale (scale_n, source, nearest standard and deviation in %), guides (lines suggested/approved, drawing approved) and missing (rotation/scale). ready = everything set and the job waits. Start the flow with import_drawings_upload, fix with edit_import_pages / tolk_scale_from_known, finish with confirm_import_job. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: «Tolk»: status per side i en importjobb: rotasjon (deg 0/90/180/270 + skew_deg, forslaget og kilden), skala (scale_n, kilde, nærmeste vanlige og avvik i %), hjelpemål (antall linjer forslag/godkjent, tegningen godkjent) og missing (rotation/scale). ready = alt satt og jobben venter. Start flyten med import_drawings_upload, rett med edit_import_pages / tolk_scale_from_known, avslutt med confirm_import_job.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["jid"]}},{"name":"tolk_scale_from_known","cat":"eksport","no":"«Mål et kjent mål»: idx, to punkter p0/p1 på siden (andeler 0-1 i sidens egen, udreide ramme, som hjelpelinjene) og known_mm (den kjente lengden i mm) gir målestokken 1:N, nærmeste vanlige og avvik_pct. apply=true (standard) setter scale_n på siden som brukerens valg; apply=false regner bare ut.","en":"«Measure a known length»: idx, two points p0/p1 on the page (fractions 0-1 in the page's own unrotated frame, like the guides) and known_mm (the known length in mm) give the scale 1:N, the nearest standard and avvik_pct. apply=true (default) sets scale_n on the page as the user's choice; apply=false only computes.","method":"POST","path":"/sessions/{sid}/agent/import-drawings/{jid}/tolk/scale","access":"share","effect":"write","mcp":"web","example":{"idx":0,"p0":[0.1,0.5],"p1":[0.6,0.5],"known_mm":10000},"status":"live","server":"web","returns":"{ok, scale_n, standard, avvik_pct, paper_mm, applied, tolk}","level":"propose","description":"«Measure a known length»: idx, two points p0/p1 on the page (fractions 0-1 in the page's own unrotated frame, like the guides) and known_mm (the known length in mm) give the scale 1:N, the nearest standard and avvik_pct. apply=true (default) sets scale_n on the page as the user's choice; apply=false only computes. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: «Mål et kjent mål»: idx, to punkter p0/p1 på siden (andeler 0-1 i sidens egen, udreide ramme, som hjelpelinjene) og known_mm (den kjente lengden i mm) gir målestokken 1:N, nærmeste vanlige og avvik_pct. apply=true (standard) setter scale_n på siden som brukerens valg; apply=false regner bare ut.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"idx":{"type":"integer","minimum":0.0,"title":"Idx"},"p0":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"P0"},"p1":{"items":{"type":"number"},"type":"array","maxItems":2,"minItems":2,"title":"P1"},"known_mm":{"type":"number","maximum":1000000.0,"exclusiveMinimum":0.0,"title":"Known Mm"},"apply":{"type":"boolean","title":"Apply","default":true}},"required":["jid","idx","p0","p1","known_mm"]}},{"name":"import_drawings_capabilities","cat":"eksport","no":"Hva importen kan nå: er KI tilgjengelig (nøkkelen er prøvd mot leverandøren; ai.reason = key_rejected hvis den er avvist), OCR, kostnadstak, terskler og forslag til valgene (suggest.approved / suggest.ai) fra brukerens innstillinger.","en":"What the import can do now: is AI available (the key is tried against the provider; ai.reason = key_rejected when it is refused), OCR, cost ceiling, thresholds and the suggested choices (suggest.approved / suggest.ai) from the user's settings.","method":"GET","path":"/sessions/{sid}/agent/import-drawings/capabilities","access":"share","effect":"read","mcp":"web","status":"live","server":"web","returns":"{ok, ai, ocr, ceiling_usd, …}","level":"read","description":"What the import can do now: is AI available (the key is tried against the provider; ai.reason = key_rejected when it is refused), OCR, cost ceiling, thresholds and the suggested choices (suggest.approved / suggest.ai) from the user's settings. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Hva importen kan nå: er KI tilgjengelig (nøkkelen er prøvd mot leverandøren; ai.reason = key_rejected hvis den er avvist), OCR, kostnadstak, terskler og forslag til valgene (suggest.approved / suggest.ai) fra brukerens innstillinger.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"edit_import_pages","cat":"eksport","no":"Rett klassifiseringen mens jobben er waiting_for_user: edits:[{idx, kind, storey, view (Nord|Øst|Syd|Vest), scale_n, rotation (0/90/180/270 med klokka), skew_deg (fri dreiing -45..45 med klokka i tillegg; skjevt skann rettes opp før tolken leser), skip, title, building (''|garasje|annet bygg), region:{id, kind, storey, view, scale_n, building, role: drawing|titleblock, confirmed: true}}]. Dine valg vinner over alle gjetninger.","en":"Fix the classification while the job is waiting_for_user: edits:[{idx, kind, storey, view (Nord|Øst|Syd|Vest), scale_n, rotation (0/90/180/270 clockwise), skew_deg (free extra rotation -45..45 clockwise; a crooked scan is straightened before the interpreter reads it), skip, title, building (''|garasje|annet bygg), region:{id, kind, storey, view, scale_n, building, role: drawing|titleblock, confirmed: true}}]. Your choices win over every guess.","method":"POST","path":"/sessions/{sid}/agent/import-drawings/{jid}/pages","access":"share","effect":"write","mcp":"web","example":{"edits":[{"idx":0,"kind":"plan","storey":"1. etasje","scale_n":50}]},"status":"live","server":"web","returns":"{ok, job}","level":"propose","description":"Fix the classification while the job is waiting_for_user: edits:[{idx, kind, storey, view (Nord|Øst|Syd|Vest), scale_n, rotation (0/90/180/270 clockwise), skew_deg (free extra rotation -45..45 clockwise; a crooked scan is straightened before the interpreter reads it), skip, title, building (''|garasje|annet bygg), region:{id, kind, storey, view, scale_n, building, role: drawing|titleblock, confirmed: true}}]. Your choices win over every guess. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Rett klassifiseringen mens jobben er waiting_for_user: edits:[{idx, kind, storey, view (Nord|Øst|Syd|Vest), scale_n, rotation (0/90/180/270 med klokka), skew_deg (fri dreiing -45..45 med klokka i tillegg; skjevt skann rettes opp før tolken leser), skip, title, building (''|garasje|annet bygg), region:{id, kind, storey, view, scale_n, building, role: drawing|titleblock, confirmed: true}}]. Dine valg vinner over alle gjetninger.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"edits":{"items":{"properties":{"idx":{"type":"integer","minimum":0.0,"title":"Idx"},"kind":{"anyOf":[{"type":"string","enum":["plan","snitt","fasade","situasjon","perspektiv","annet"]},{"type":"null"}],"title":"Kind"},"storey":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Storey"},"view":{"anyOf":[{"type":"string","enum":["","Nord","Øst","Syd","Vest"]},{"type":"null"}],"title":"View"},"scale_n":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Scale N"},"rotation":{"anyOf":[{"type":"integer","enum":[0,90,180,270]},{"type":"null"}],"title":"Rotation"},"skew_deg":{"anyOf":[{"type":"number","maximum":45.0,"minimum":-45.0},{"type":"null"}],"title":"Skew Deg"},"skip":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Skip"},"title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Title"},"building":{"anyOf":[{"type":"string","enum":["","garasje","annet bygg"]},{"type":"null"}],"title":"Building"},"region":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Region"},"region_add":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Region Add"},"region_geom":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Region Geom"},"region_delete":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Region Delete"},"auto_regions":{"anyOf":[{"type":"string","const":"restore"},{"type":"null"}],"title":"Auto Regions"}},"type":"object","required":["idx"],"title":"PageEdit"},"type":"array","maxItems":120,"title":"Edits"}},"required":["jid","edits"]}},{"name":"confirm_import_job","cat":"eksport","no":"Bekreft listen og velg: approved=true (legg inn sidene som underlag og sist godkjente; lokalt, ingen KI) og/eller ai=true (la KI tolke og bygge modell); eller mode build|approved|both. Uten valg beholdes jobbens egen mode. Sidene legges alltid inn først og blir stående selv om KI-delen feiler (da blir jobben done med result.partial; prøv igjen med retry_import_ai). Valgfritt: ceiling_usd (kostnadstak), continue_over_ceiling (etter stopp på taket), replace_model (bytt ut en modell med innhold; en versjon lagres først), approved_date. Jobben går til building; følg med get_import_job.","en":"Confirm the list and choose: approved=true (put the pages in as underlay and last approved; local, no AI) and/or ai=true (let AI interpret and build the model); or mode build|approved|both. Without a choice the job keeps its own mode. The pages are always put in first and stay if the AI part fails (the job is then done with result.partial; retry with retry_import_ai). Optional: ceiling_usd, continue_over_ceiling (after a stop at the ceiling), replace_model (replace a model that has content; a version is saved first), approved_date. The job goes to building; follow with get_import_job.","method":"POST","path":"/sessions/{sid}/agent/import-drawings/{jid}/confirm","access":"share","effect":"write","mcp":"web","example":{"approved":true,"ai":false},"status":"live","server":"web","returns":"{ok, job}","level":"propose","description":"Confirm the list and choose: approved=true (put the pages in as underlay and last approved; local, no AI) and/or ai=true (let AI interpret and build the model); or mode build|approved|both. Without a choice the job keeps its own mode. The pages are always put in first and stay if the AI part fails (the job is then done with result.partial; retry with retry_import_ai). Optional: ceiling_usd, continue_over_ceiling (after a stop at the ceiling), replace_model (replace a model that has content; a version is saved first), approved_date. The job goes to building; follow with get_import_job. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Bekreft listen og velg: approved=true (legg inn sidene som underlag og sist godkjente; lokalt, ingen KI) og/eller ai=true (la KI tolke og bygge modell); eller mode build|approved|both. Uten valg beholdes jobbens egen mode. Sidene legges alltid inn først og blir stående selv om KI-delen feiler (da blir jobben done med result.partial; prøv igjen med retry_import_ai). Valgfritt: ceiling_usd (kostnadstak), continue_over_ceiling (etter stopp på taket), replace_model (bytt ut en modell med innhold; en versjon lagres først), approved_date. Jobben går til building; følg med get_import_job.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"mode":{"anyOf":[{"type":"string","enum":["build","approved","both"]},{"type":"null"}],"title":"Mode"},"approved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Approved"},"ai":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai"},"ceiling_usd":{"anyOf":[{"type":"number","maximum":500.0,"minimum":0.5},{"type":"null"}],"title":"Ceiling Usd"},"continue_over_ceiling":{"type":"boolean","title":"Continue Over Ceiling","default":false},"replace_model":{"type":"boolean","title":"Replace Model","default":false},"approved_date":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Approved Date"}},"required":["jid"]}},{"name":"retry_import_ai","cat":"eksport","no":"«Prøv KI-tolking på nytt» for en jobb der sidene er lagt inn, men modellen ikke ble bygget (result.partial, f.eks. KI utilgjengelig). Kjører bare KI-delen; sidene legges aldri inn to ganger.","en":"«Try the AI reading again» for a job whose pages are in but whose model was not built (result.partial, e.g. AI unavailable). Runs only the AI part; the pages are never imported twice.","method":"POST","path":"/sessions/{sid}/agent/import-drawings/{jid}/retry-ai","access":"share","effect":"write","mcp":"web","status":"live","server":"web","returns":"{ok, job}","level":"propose","description":"«Try the AI reading again» for a job whose pages are in but whose model was not built (result.partial, e.g. AI unavailable). Runs only the AI part; the pages are never imported twice. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: «Prøv KI-tolking på nytt» for en jobb der sidene er lagt inn, men modellen ikke ble bygget (result.partial, f.eks. KI utilgjengelig). Kjører bare KI-delen; sidene legges aldri inn to ganger.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["jid"]}},{"name":"apply_import_job","cat":"eksport","no":"Legg et ferdig bygd resultat inn i økta etterpå (når modellen hadde innhold og replace_model ikke var satt). En versjon lagres først.","en":"Put a finished result into the session afterwards (when the model had content and replace_model was not set). A version is saved first.","method":"POST","path":"/sessions/{sid}/agent/import-drawings/{jid}/apply","access":"share","effect":"write","mcp":"web","example":{"replace_model":true},"status":"live","server":"web","returns":"{ok, job}","level":"propose","description":"Put a finished result into the session afterwards (when the model had content and replace_model was not set). A version is saved first. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Legg et ferdig bygd resultat inn i økta etterpå (når modellen hadde innhold og replace_model ikke var satt). En versjon lagres først.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"replace_model":{"type":"boolean","title":"Replace Model","default":true}},"required":["jid"]}},{"name":"cancel_import_job","cat":"eksport","no":"Stopp en importjobb (ingenting slettes: kilder, klassifisering og delresultater blir liggende).","en":"Stop an import job (nothing is deleted: sources, classification and partial results stay).","method":"POST","path":"/sessions/{sid}/agent/import-drawings/{jid}/cancel","access":"share","effect":"write","mcp":"web","status":"live","server":"web","returns":"{ok, job}","level":"propose","description":"Stop an import job (nothing is deleted: sources, classification and partial results stay). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Stopp en importjobb (ingenting slettes: kilder, klassifisering og delresultater blir liggende).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["jid"]}},{"name":"retry_import_job","cat":"eksport","no":"Prøv en feilet importjobb igjen (til listen hvis sidene er klassifisert, ellers fra start).","en":"Try a failed import job again (back to the list if the pages are classified, else from the start).","method":"POST","path":"/sessions/{sid}/agent/import-drawings/{jid}/retry","access":"share","effect":"write","mcp":"web","status":"live","server":"web","returns":"{ok, job}","level":"propose","description":"Try a failed import job again (back to the list if the pages are classified, else from the start). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Prøv en feilet importjobb igjen (til listen hvis sidene er klassifisert, ellers fra start).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["jid"]}},{"name":"rerun_import_job","cat":"eksport","no":"Åpne en ferdig importjobb for en ny kjøring med andre valg (forrige kjøring beholdes).","en":"Open a finished import job for a new run with other choices (the previous run is kept).","method":"POST","path":"/sessions/{sid}/agent/import-drawings/{jid}/rerun","access":"share","effect":"write","mcp":"web","status":"live","server":"web","returns":"{ok, job}","level":"propose","description":"Open a finished import job for a new run with other choices (the previous run is kept). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Åpne en ferdig importjobb for en ny kjøring med andre valg (forrige kjøring beholdes).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["jid"]}},{"name":"add_import_files","cat":"eksport","no":"«Legg til fil»: flere PDF-er/bilder i en importjobb som venter på deg (waiting_for_user), f.eks. situasjonskartet i en egen fil. Sidene klassifiseres inn i SAMME jobb (én tolking; sidene teller én gang mot sidetelleren og dagsgrensen); sidene og valgene som alt er gjort blir stående. 409 not_waiting når jobben går eller er ferdig. Samme tilgang og grenser som import_drawings_job (base64 i JSON: files:[{name, data_b64}]).","en":"«Add file»: more PDFs/images to an import job that waits for you (waiting_for_user), e.g. the site plan in a separate file. The pages are classified into the SAME job (one interpretation; the pages count once against the page counter and the daily limit); the pages and choices already made stay. 409 not_waiting while the job runs or when it is done. Same access and limits as import_drawings_job (base64 in JSON: files:[{name, data_b64}]).","method":"POST","path":"/sessions/{sid}/agent/import-drawings/{jid}/files/json","access":"share","effect":"write","mcp":"web","example":{"files":[{"name":"situasjonskart.pdf","data_b64":"<base64>"}]},"status":"live","server":"web","returns":"{ok, job}","level":"propose","description":"«Add file»: more PDFs/images to an import job that waits for you (waiting_for_user), e.g. the site plan in a separate file. The pages are classified into the SAME job (one interpretation; the pages count once against the page counter and the daily limit); the pages and choices already made stay. 409 not_waiting while the job runs or when it is done. Same access and limits as import_drawings_job (base64 in JSON: files:[{name, data_b64}]). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: «Legg til fil»: flere PDF-er/bilder i en importjobb som venter på deg (waiting_for_user), f.eks. situasjonskartet i en egen fil. Sidene klassifiseres inn i SAMME jobb (én tolking; sidene teller én gang mot sidetelleren og dagsgrensen); sidene og valgene som alt er gjort blir stående. 409 not_waiting når jobben går eller er ferdig. Samme tilgang og grenser som import_drawings_job (base64 i JSON: files:[{name, data_b64}]).","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"files":{"items":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"data_b64":{"type":"string","minLength":4,"title":"Data B64"},"mime":{"type":"string","maxLength":100,"title":"Mime","default":""}},"type":"object","required":["name","data_b64"],"title":"FileIn"},"type":"array","maxItems":40,"minItems":1,"title":"Files"}},"required":["jid","files"]}},{"name":"add_import_files_upload","cat":"eksport","no":"Samme som add_import_files, men som skjema-opplasting (multipart: files). BuildChat og Konverteringer bruker denne.","en":"Same as add_import_files but as a form upload (multipart: files). BuildChat and Conversions use this.","method":"POST","path":"/sessions/{sid}/agent/import-drawings/{jid}/files","access":"share","effect":"write","mcp":"web","status":"live","server":"web","returns":"{ok, job}","level":"propose","description":"Same as add_import_files but as a form upload (multipart: files). BuildChat and Conversions use this. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Samme som add_import_files, men som skjema-opplasting (multipart: files). BuildChat og Konverteringer bruker denne.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["jid"]}},{"name":"rename_import_job","cat":"eksport","no":"Prosjektnavnet til en importjobb (project_name). Er økta ikke lagret som prosjekt, lagres den som prosjekt med dette navnet ved bekreft og når modellen er bygget (eier = brukeren eller økta sitt team). Bare før jobben er ferdig; tomt navn = forslaget fra tittelfeltet eller filnavnet.","en":"The project name of an import job (project_name). If the session is not saved as a project, it is saved as one with this name on confirm and when the model is built (owner = the user or the session's team). Only before the job is done; an empty name = the suggestion from the title block or the file name.","method":"POST","path":"/sessions/{sid}/agent/import-drawings/{jid}/name","access":"share","effect":"write","mcp":"web","example":{"project_name":"Garasje/carport"},"status":"live","server":"web","returns":"{ok, job}","level":"propose","description":"The project name of an import job (project_name). If the session is not saved as a project, it is saved as one with this name on confirm and when the model is built (owner = the user or the session's team). Only before the job is done; an empty name = the suggestion from the title block or the file name. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Prosjektnavnet til en importjobb (project_name). Er økta ikke lagret som prosjekt, lagres den som prosjekt med dette navnet ved bekreft og når modellen er bygget (eier = brukeren eller økta sitt team). Bare før jobben er ferdig; tomt navn = forslaget fra tittelfeltet eller filnavnet.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"jid":{"type":"string","title":"Jid"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"project_name":{"type":"string","maxLength":200,"title":"Project Name","default":""}},"required":["jid"]}},{"name":"import_storage","cat":"eksport","no":"Alt som er lagret for økta og prosjektet fra importer: kildefiler (innholdsadressert), jobber, kjøringer (spec, rapport, versjon), tokens og kostnad. Bare lesing; Dibrix sletter aldri noe her.","en":"Everything stored for the session and the project from imports: source files (content-addressed), jobs, runs (spec, report, version), tokens and cost. Read only; Dibrix never deletes anything here.","method":"GET","path":"/sessions/{sid}/agent/import-drawings/storage","access":"share","effect":"read","mcp":"web","status":"live","server":"web","returns":"{ok, sources, jobs, bytes_total}","level":"read","description":"Everything stored for the session and the project from imports: source files (content-addressed), jobs, runs (spec, report, version), tokens and cost. Read only; Dibrix never deletes anything here. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Alt som er lagret for økta og prosjektet fra importer: kildefiler (innholdsadressert), jobber, kjøringer (spec, rapport, versjon), tokens og kostnad. Bare lesing; Dibrix sletter aldri noe her.","category_label":"Eksport og import","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"project_storage","cat":"konto","no":"Lagrede importdata per prosjekt (som import_storage, men for et prosjekt-id; krever lese-rett).","en":"Stored import data per project (like import_storage but for a project id; needs read access).","method":"GET","path":"/projects/{project_id}/storage","access":"login","effect":"read","mcp":"web","status":"live","server":"web","returns":"{ok, sources, jobs, bytes_total}","level":"owner","description":"Stored import data per project (like import_storage but for a project id; needs read access). [logged in] — NO: Lagrede importdata per prosjekt (som import_storage, men for et prosjekt-id; krever lese-rett).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"project_id":{"type":"string","title":"Project Id"}},"required":["project_id"]}},{"name":"list_conversions","cat":"konto","no":"Status på konverteringene dine (tegninger/PDF, bilder, punktskyer) i alle prosjektene du kan se: én rad per opplasting med status (queued, interpreting, needs_decision, ready_to_accept, accepted, failed, cancelled, stored), forklaringskode, det tolkingen fant, needs (hva som trenger deg: needs_count, blocking_count, sidene, waiting_on med første side) og lovlige handlinger.","en":"The status of your conversions (drawings/PDF, pictures, point clouds) across every project you can see: one row per upload (also pictures and PDFs attached in BuildChat, source=chat) with status (queued, interpreting, needs_decision, ready_to_accept, accepted, failed, cancelled, stored), a reason code, what the reading found, needs (what needs you: needs_count, blocking_count, the pages, waiting_on with the first page) and the allowed actions.","method":"GET","path":"/conversions","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"archived":{"type":"string","enum":["exclude","include","only"]}}},"status":"live","server":"web","returns":"{ok, items:[…], pointcloud_upload, projects, archived_count}","level":"owner","description":"The status of your conversions (drawings/PDF, pictures, point clouds) across every project you can see: one row per upload (also pictures and PDFs attached in BuildChat, source=chat) with status (queued, interpreting, needs_decision, ready_to_accept, accepted, failed, cancelled, stored), a reason code, what the reading found, needs (what needs you: needs_count, blocking_count, the pages, waiting_on with the first page) and the allowed actions. [logged in] — NO: Status på konverteringene dine (tegninger/PDF, bilder, punktskyer) i alle prosjektene du kan se: én rad per opplasting med status (queued, interpreting, needs_decision, ready_to_accept, accepted, failed, cancelled, stored), forklaringskode, det tolkingen fant, needs (hva som trenger deg: needs_count, blocking_count, sidene, waiting_on med første side) og lovlige handlinger.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"archived":{"type":"string","enum":["exclude","include","only"]}}}},{"name":"project_conversions","cat":"konto","no":"Som list_conversions, men for ett prosjekt (krever lese-rett).","en":"Like list_conversions but for one project (needs read access).","method":"GET","path":"/projects/{project_id}/conversions","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"project_id":{"type":"string"}},"required":["project_id"]},"status":"live","server":"web","returns":"{ok, items:[…]}","level":"owner","description":"Like list_conversions but for one project (needs read access). [logged in] — NO: Som list_conversions, men for ett prosjekt (krever lese-rett).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"project_id":{"type":"string"}},"required":["project_id"]}},{"name":"conversion_action","cat":"konto","no":"Handling på en konvertering (krever redigeringsrett i prosjektet): accept (bekrefter listen og bygger modellen; ai_ack=true kreves når sidene tolkes av Claude; replace_model=true hvis modellen har innhold), rescan (reason: scale|storey_page|missing_walls|missing_openings|other; note kreves ved other; årsaken lagres som notat), ai_suggest (ai_ack=true: ETT KI-kall for hele dokumentet som foreslår svar på det uklare; du bekrefter), retolk (report_id = en rapport fra BuildChat i radens reports; teksten blir en brukerretting som går foran gjetninger, og jobben tolkes på nytt fra den lagrede originalen; ai_ack=true), feedback (reason: også rooms|roof|dimensions; note, page = sidens idx; lagres som notat; rerun=true tolker på nytt med teksten som retting, ai_ack=true), answer (point_id fra found.uncertain, answer: right|wrong|unsure, note = «Riktig er: …»), retolk_answers (alle svarene og egne mål som fasit til tolken; ai_ack=true), measure_add («Mål selv»: measure = {page, region?, kind: length|angle, a: [x, y], b: [x, y] i andeler 0-1 av siden i sidens egen ramme, value_mm (lengde) eller deg (vinkel; tom = regnet fra punktene og dreiingen), label: facade_length|wall|height|roof_pitch|ridge_height, rot}; går til tolken som FASIT FRA BRUKEREN; en lengde gir scale_hint = foreslått målestokk), measure_delete (measure_id), measure_label (measure_id + measure = {label}: bytt etiketten på et lagret mål), rename (project_name: prosjektnavnet økta lagres som prosjekt med; også på accept), cancel, delete (skjuler raden; modeller og versjoner slettes aldri).","en":"Act on a conversion (needs edit rights in the project): accept (confirms the list and builds the model; ai_ack=true is required when the pages are read by Claude; replace_model=true if the model has content), rescan (reason: scale|storey_page|missing_walls|missing_openings|other; note required for other; the reason is stored as a note), retolk (report_id = a BuildChat report in the row's reports; its text becomes a user correction that wins over guesses and the job is read again from the stored original; ai_ack=true), feedback (reason: also rooms|roof|dimensions; note, page = the page idx; stored as a note; rerun=true reads again with the text as a correction, ai_ack=true), answer (point_id from found.uncertain, answer: right|wrong|unsure, note = 'the right value is …'), retolk_answers (all answers and own measures as ground truth for the interpreter; ai_ack=true), measure_add ('measure yourself': measure = {page, region?, kind: length|angle, a: [x, y], b: [x, y] in fractions 0-1 of the page in its own frame, value_mm (length) or deg (angle; empty = computed from the points and rotation), label: facade_length|wall|height|roof_pitch|ridge_height, rot}; sent to the interpreter as the user's ground truth; a length gives scale_hint = suggested scale), measure_delete (measure_id), measure_label (measure_id + measure = {label}: change the label of a saved measure), rename (project_name: the name the session is saved as a project with; also on accept), cancel, delete (hides the row; models and versions are never deleted).","method":"POST","path":"/conversions/{jid}/action","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"jid":{"type":"string"},"action":{"type":"string"},"ai_ack":{"type":"boolean"},"replace_model":{"type":"boolean"},"reason":{"type":"string"},"note":{"type":"string"},"report_id":{"type":"string"},"page":{"type":"integer"},"rerun":{"type":"boolean"},"point_id":{"type":"string"},"answer":{"type":"string"},"measure":{"type":"object"},"measure_id":{"type":"string"},"project_name":{"type":"string"}},"required":["jid","action"]},"example":{"action":"accept","ai_ack":true},"status":"live","server":"web","returns":"{ok, item}","level":"owner","description":"Act on a conversion (needs edit rights in the project): accept (confirms the list and builds the model; ai_ack=true is required when the pages are read by Claude; replace_model=true if the model has content), rescan (reason: scale|storey_page|missing_walls|missing_openings|other; note required for other; the reason is stored as a note), retolk (report_id = a BuildChat report in the row's reports; its text becomes a user correction that wins over guesses and the job is read again from the stored original; ai_ack=true), feedback (reason: also rooms|roof|dimensions; note, page = the page idx; stored as a note; rerun=true reads again with the text as a correction, ai_ack=true), answer (point_id from found.uncertain, answer: right|wrong|unsure, note = 'the right value is …'), retolk_answers (all answers and own measures as ground truth for the interpreter; ai_ack=true), measure_add ('measure yourself': measure = {page, region?, kind: length|angle, a: [x, y], b: [x, y] in fractions 0-1 of the page in its own frame, value_mm (length) or deg (angle; empty = computed from the points and rotation), label: facade_length|wall|height|roof_pitch|ridge_height, rot}; sent to the interpreter as the user's ground truth; a length gives scale_hint = suggested scale), measure_delete (measure_id), measure_label (measure_id + measure = {label}: change the label of a saved measure), rename (project_name: the name the session is saved as a project with; also on accept), cancel, delete (hides the row; models and versions are never deleted). [logged in] — NO: Handling på en konvertering (krever redigeringsrett i prosjektet): accept (bekrefter listen og bygger modellen; ai_ack=true kreves når sidene tolkes av Claude; replace_model=true hvis modellen har innhold), rescan (reason: scale|storey_page|missing_walls|missing_openings|other; note kreves ved other; årsaken lagres som notat), ai_suggest (ai_ack=true: ETT KI-kall for hele dokumentet som foreslår svar på det uklare; du bekrefter), retolk (report_id = en rapport fra BuildChat i radens reports; teksten blir en brukerretting som går foran gjetninger, og jobben tolkes på nytt fra den lagrede originalen; ai_ack=true), feedback (reason: også rooms|roof|dimensions; note, page = sidens idx; lagres som notat; rerun=true tolker på nytt med teksten som retting, ai_ack=true), answer (point_id fra found.uncertain, answer: right|wrong|unsure, note = «Riktig er: …»), retolk_answers (alle svarene og egne mål som fasit til tolken; ai_ack=true), measure_add («Mål selv»: measure = {page, region?, kind: length|angle, a: [x, y], b: [x, y] i andeler 0-1 av siden i sidens egen ramme, value_mm (lengde) eller deg (vinkel; tom = regnet fra punktene og dreiingen), label: facade_length|wall|height|roof_pitch|ridge_height, rot}; går til tolken som FASIT FRA BRUKEREN; en lengde gir scale_hint = foreslått målestokk), measure_delete (measure_id), measure_label (measure_id + measure = {label}: bytt etiketten på et lagret mål), rename (project_name: prosjektnavnet økta lagres som prosjekt med; også på accept), cancel, delete (skjuler raden; modeller og versjoner slettes aldri).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"jid":{"type":"string"},"action":{"type":"string"},"ai_ack":{"type":"boolean"},"replace_model":{"type":"boolean"},"reason":{"type":"string"},"note":{"type":"string"},"report_id":{"type":"string"},"page":{"type":"integer"},"rerun":{"type":"boolean"},"point_id":{"type":"string"},"answer":{"type":"string"},"measure":{"type":"object"},"measure_id":{"type":"string"},"project_name":{"type":"string"}},"required":["jid","action"]}},{"name":"conversion_archive","cat":"konto","no":"«Fjern fra lista»: flytter en konvertering til Arkiv (archived: true; krever redigeringsrett; ikke mens den går). Bare raden skjules: modellen, prosjektet, versjonene og kildefilene røres aldri. list_conversions med archived=only viser arkivet.","en":"'Remove from the list': moves a conversion to the archive (archived: true; needs edit rights; not while it runs). Only the row is hidden: the model, project, versions and source files are never touched. list_conversions with archived=only shows the archive.","method":"POST","path":"/conversions/{jid}/archive","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"jid":{"type":"string"}},"required":["jid"]},"status":"live","server":"web","returns":"{ok, item}","level":"owner","description":"'Remove from the list': moves a conversion to the archive (archived: true; needs edit rights; not while it runs). Only the row is hidden: the model, project, versions and source files are never touched. list_conversions with archived=only shows the archive. [logged in] — NO: «Fjern fra lista»: flytter en konvertering til Arkiv (archived: true; krever redigeringsrett; ikke mens den går). Bare raden skjules: modellen, prosjektet, versjonene og kildefilene røres aldri. list_conversions med archived=only viser arkivet.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"jid":{"type":"string"}},"required":["jid"]}},{"name":"conversion_unarchive","cat":"konto","no":"Legg en arkivert konvertering tilbake i lista (archived: false).","en":"Put an archived conversion back in the list (archived: false).","method":"POST","path":"/conversions/{jid}/unarchive","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"jid":{"type":"string"}},"required":["jid"]},"status":"live","server":"web","returns":"{ok, item}","level":"owner","description":"Put an archived conversion back in the list (archived: false). [logged in] — NO: Legg en arkivert konvertering tilbake i lista (archived: false).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"jid":{"type":"string"}},"required":["jid"]}},{"name":"conversion_pages","cat":"konto","no":"Sidene i en konvertering som venter på deg: type, etasje, retning, målestokk, dreiing, regionene (tegningene på hver side, med boks 0-1 i miniatyrens ramme), hva som er uklart (ask) og hva som bare er et forslag (suggested). Les-rett holder.","en":"The pages of a conversion that waits for you: type, floor, direction, scale, rotation, the regions (the drawings on each page, box 0-1 in the thumbnail's frame), what is unclear (ask) and what is only a suggestion (suggested). Read access is enough.","method":"GET","path":"/conversions/{jid}/pages","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"jid":{"type":"string"}},"required":["jid"]},"status":"live","server":"web","returns":"{ok, id, state, editable, pages:[…], doc:{scale_n, storeys_named, year}, measures:[…], measures_editable}","level":"owner","description":"The pages of a conversion that waits for you: type, floor, direction, scale, rotation, the regions (the drawings on each page, box 0-1 in the thumbnail's frame), what is unclear (ask) and what is only a suggestion (suggested). Read access is enough. [logged in] — NO: Sidene i en konvertering som venter på deg: type, etasje, retning, målestokk, dreiing, regionene (tegningene på hver side, med boks 0-1 i miniatyrens ramme), hva som er uklart (ask) og hva som bare er et forslag (suggested). Les-rett holder.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"jid":{"type":"string"}},"required":["jid"]}},{"name":"conversion_edit_pages","cat":"konto","no":"Rett sidene og regionene rett fra Konverteringer-raden (krever redigeringsrett; bare mens jobben venter på deg): edits:[{idx, kind, storey, view, scale_n, rotation, skew_deg, skip, building, region:{id, kind, storey, view, scale_n, building, role: drawing|titleblock, confirmed: true}}]. Dine valg vinner over gjetninger; ingen ny import trengs.","en":"Fix the pages and regions straight from the Conversions row (needs edit rights; only while the job waits for you): edits:[{idx, kind, storey, view, scale_n, rotation, skew_deg, skip, building, region:{id, kind, storey, view, scale_n, building, role: drawing|titleblock, confirmed: true}}]. Your choices win over guesses; no new import is needed.","method":"POST","path":"/conversions/{jid}/pages","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"jid":{"type":"string"},"edits":{"type":"array","items":{"type":"object"}}},"required":["jid","edits"]},"example":{"edits":[{"idx":1,"region":{"id":"r3","kind":"plan","storey":"Kjeller"}},{"idx":3,"kind":"situasjon"}]},"status":"live","server":"web","returns":"{ok, id, pages:[…], doc}","level":"owner","description":"Fix the pages and regions straight from the Conversions row (needs edit rights; only while the job waits for you): edits:[{idx, kind, storey, view, scale_n, rotation, skew_deg, skip, building, region:{id, kind, storey, view, scale_n, building, role: drawing|titleblock, confirmed: true}}]. Your choices win over guesses; no new import is needed. [logged in] — NO: Rett sidene og regionene rett fra Konverteringer-raden (krever redigeringsrett; bare mens jobben venter på deg): edits:[{idx, kind, storey, view, scale_n, rotation, skew_deg, skip, building, region:{id, kind, storey, view, scale_n, building, role: drawing|titleblock, confirmed: true}}]. Dine valg vinner over gjetninger; ingen ny import trengs.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"jid":{"type":"string"},"edits":{"type":"array","items":{"type":"object"}}},"required":["jid","edits"]}},{"name":"conversion_page_view","cat":"konto","no":"En side i en konvertering i høy oppløsning (JPEG, 200 dpi, lengste side høyst px) til zoom; udreid som miniatyren.","en":"A page of a conversion in high resolution (JPEG, 200 dpi, longest side at most px) for zooming; unrotated like the thumbnail.","method":"GET","path":"/conversions/{jid}/pages/{idx}/view.jpg","access":"login","effect":"read","params":{"type":"object","properties":{"jid":{"type":"string"},"idx":{"type":"integer"},"px":{"type":"integer"}},"required":["jid","idx"]},"status":"live","server":"web","returns":"image/jpeg","level":"owner","description":"A page of a conversion in high resolution (JPEG, 200 dpi, longest side at most px) for zooming; unrotated like the thumbnail. [logged in] — NO: En side i en konvertering i høy oppløsning (JPEG, 200 dpi, lengste side høyst px) til zoom; udreid som miniatyren.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"jid":{"type":"string"},"idx":{"type":"integer"},"px":{"type":"integer"}},"required":["jid","idx"]}},{"name":"conversion_guides","cat":"konto","no":"«Avklar mål»: hjelpelinjene per tegning (type, p0/p1 i sidens ramme 0-1, verdi_mm eller verdi_grader, kilde ai|kode|bruker|anker, sikkerhet, status forslag|godkjent|avvist), objektene som er de samme i plan, fasade og snitt (vegg:<Nord|Ost|Syd|Vest>:<ute|inne>[@etasje], apning:<ref> …), målekjedene med måltype (yttermaal|innemaal|aksemaal|senter_vegg) og regnestykket til ytre mål, og todo = «Hva skal tolkes» (objekter uten godkjent tall). Dagens «Mål selv»-mål står i legacy. Les-rett holder.","en":"'Clarify measurements': the guide lines per drawing (type, p0/p1 in the page frame 0-1, verdi_mm or verdi_grader, kilde ai|kode|bruker|anker, sikkerhet, status forslag|godkjent|avvist), the named objects that are the same in plan, elevation and section (vegg:<Nord|Ost|Syd|Vest>:<ute|inne>[@storey], apning:<ref> …), the dimension chains with their measurement type (yttermaal = outside, innemaal = inside, aksemaal = wall centre, senter_vegg = mixed) and the sum to the outer size, and todo = objects still without an approved number. The older 'measure yourself' measures are listed in legacy. Read access is enough.","method":"GET","path":"/conversions/{jid}/guides","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"jid":{"type":"string"}},"required":["jid"]},"status":"live","server":"web","returns":"{ok, editable, can_build, pages, lines, legacy, objekter, kjeder, todo, godkjent, prefs}","level":"owner","description":"'Clarify measurements': the guide lines per drawing (type, p0/p1 in the page frame 0-1, verdi_mm or verdi_grader, kilde ai|kode|bruker|anker, sikkerhet, status forslag|godkjent|avvist), the named objects that are the same in plan, elevation and section (vegg:<Nord|Ost|Syd|Vest>:<ute|inne>[@storey], apning:<ref> …), the dimension chains with their measurement type (yttermaal = outside, innemaal = inside, aksemaal = wall centre, senter_vegg = mixed) and the sum to the outer size, and todo = objects still without an approved number. The older 'measure yourself' measures are listed in legacy. Read access is enough. [logged in] — NO: «Avklar mål»: hjelpelinjene per tegning (type, p0/p1 i sidens ramme 0-1, verdi_mm eller verdi_grader, kilde ai|kode|bruker|anker, sikkerhet, status forslag|godkjent|avvist), objektene som er de samme i plan, fasade og snitt (vegg:<Nord|Ost|Syd|Vest>:<ute|inne>[@etasje], apning:<ref> …), målekjedene med måltype (yttermaal|innemaal|aksemaal|senter_vegg) og regnestykket til ytre mål, og todo = «Hva skal tolkes» (objekter uten godkjent tall). Dagens «Mål selv»-mål står i legacy. Les-rett holder.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"jid":{"type":"string"}},"required":["jid"]}},{"name":"conversion_guide_action","cat":"konto","no":"Én handling i «Avklar mål» (krever redigeringsrett): guide_add (line = {bilde: {side, region?}, type: vegg_ute|vegg_inne|apning|uk_kledning|undertak_gesims|undertak_mone|takfot|mone|takvinkel|terreng|gulv|akse, objekt, p0, p1, verdi_mm | verdi_grader, lest_som paaskrevet|skalert, kilde ai|kode|bruker, sikkerhet}; ai/kode blir alltid forslag), guide_move (line_id, p0, p1, verdi_mm?), guide_set (line_id, verdi_mm | verdi_grader, approve?), guide_approve (line_id), guide_delete (line_id; et KI-forslag blir avvist og beholdes for læring), chain_add (chain = {bilde, retning x|y, sum_mm | deler_mm, maaltype?, fra?, til?, kilde}), chain_type (chain_id, maaltype: bekrefter med ett trykk), chain_set, chain_delete, object_set (objekt, verdi_mm …), drawing_approve (side, region?: alle forslag på tegningen godkjennes), guides_build (bygg modellen på nytt fra siste spec med de godkjente målene, uten KI-kall). Rettingene lagres som par KI sa / tegneren sa.","en":"One action in 'Clarify measurements' (needs edit rights): guide_add (line = {bilde: {side, region?}, type: vegg_ute|vegg_inne|apning|uk_kledning|undertak_gesims|undertak_mone|takfot|mone|takvinkel|terreng|gulv|akse, objekt, p0, p1, verdi_mm | verdi_grader, lest_som paaskrevet|skalert, kilde ai|kode|bruker, sikkerhet}; ai/kode always become suggestions), guide_move (line_id, p0, p1, verdi_mm?), guide_set (line_id, verdi_mm | verdi_grader, approve?), guide_approve (line_id), guide_delete (line_id; an AI suggestion is marked rejected and kept for learning), chain_add (chain = {bilde, retning x|y, sum_mm | deler_mm, maaltype?, fra?, til?, kilde}), chain_type (chain_id, maaltype: one tap confirms), chain_set, chain_delete, object_set (objekt, verdi_mm …), drawing_approve (side, region?: every suggestion on the drawing is approved), guides_build (rebuild the model from the last spec with the approved measures, no AI call). Corrections are stored as pairs 'the AI said / the drafter said'.","method":"POST","path":"/conversions/{jid}/guides","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"jid":{"type":"string"},"action":{"type":"string"},"line":{"type":"object"},"line_id":{"type":"string"},"chain":{"type":"object"},"chain_id":{"type":"string"},"maaltype":{"type":"string"},"p0":{"type":"array"},"p1":{"type":"array"},"verdi_mm":{"type":"number"},"verdi_grader":{"type":"number"},"objekt":{"type":"string"},"side":{"type":"integer"},"region":{"type":"string"},"approve":{"type":"boolean"},"replace_model":{"type":"boolean"}},"required":["jid","action"]},"example":{"action":"chain_type","chain_id":"k1a2b3c4d5","maaltype":"aksemaal"},"status":"live","server":"web","returns":"the same as conversion_guides + {done, id}","level":"owner","description":"One action in 'Clarify measurements' (needs edit rights): guide_add (line = {bilde: {side, region?}, type: vegg_ute|vegg_inne|apning|uk_kledning|undertak_gesims|undertak_mone|takfot|mone|takvinkel|terreng|gulv|akse, objekt, p0, p1, verdi_mm | verdi_grader, lest_som paaskrevet|skalert, kilde ai|kode|bruker, sikkerhet}; ai/kode always become suggestions), guide_move (line_id, p0, p1, verdi_mm?), guide_set (line_id, verdi_mm | verdi_grader, approve?), guide_approve (line_id), guide_delete (line_id; an AI suggestion is marked rejected and kept for learning), chain_add (chain = {bilde, retning x|y, sum_mm | deler_mm, maaltype?, fra?, til?, kilde}), chain_type (chain_id, maaltype: one tap confirms), chain_set, chain_delete, object_set (objekt, verdi_mm …), drawing_approve (side, region?: every suggestion on the drawing is approved), guides_build (rebuild the model from the last spec with the approved measures, no AI call). Corrections are stored as pairs 'the AI said / the drafter said'. [logged in] — NO: Én handling i «Avklar mål» (krever redigeringsrett): guide_add (line = {bilde: {side, region?}, type: vegg_ute|vegg_inne|apning|uk_kledning|undertak_gesims|undertak_mone|takfot|mone|takvinkel|terreng|gulv|akse, objekt, p0, p1, verdi_mm | verdi_grader, lest_som paaskrevet|skalert, kilde ai|kode|bruker, sikkerhet}; ai/kode blir alltid forslag), guide_move (line_id, p0, p1, verdi_mm?), guide_set (line_id, verdi_mm | verdi_grader, approve?), guide_approve (line_id), guide_delete (line_id; et KI-forslag blir avvist og beholdes for læring), chain_add (chain = {bilde, retning x|y, sum_mm | deler_mm, maaltype?, fra?, til?, kilde}), chain_type (chain_id, maaltype: bekrefter med ett trykk), chain_set, chain_delete, object_set (objekt, verdi_mm …), drawing_approve (side, region?: alle forslag på tegningen godkjennes), guides_build (bygg modellen på nytt fra siste spec med de godkjente målene, uten KI-kall). Rettingene lagres som par KI sa / tegneren sa.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"jid":{"type":"string"},"action":{"type":"string"},"line":{"type":"object"},"line_id":{"type":"string"},"chain":{"type":"object"},"chain_id":{"type":"string"},"maaltype":{"type":"string"},"p0":{"type":"array"},"p1":{"type":"array"},"verdi_mm":{"type":"number"},"verdi_grader":{"type":"number"},"objekt":{"type":"string"},"side":{"type":"integer"},"region":{"type":"string"},"approve":{"type":"boolean"},"replace_model":{"type":"boolean"}},"required":["jid","action"]}},{"name":"conversion_findings","cat":"konto","no":"Funnlisten i «Avklar mål»: hva tolkeren faktisk fant, lest fra det som er lagret (spec + provenance, hjelpelinjer, brukerens mål): items [{id, kind length|room|door|window|stair|wall|furniture, text, source vector|ai|tool|user, page, region, box (0-1 i sidens ramme, ellers null), conf, assumed, how, level, side, answer}], added (det brukeren sier mangler), facts (tall brukeren vet mot det tolkeren fant: {kind, count, level, side, found, ok}), counts, pages, gaps (hva som ikke er lagret). Skrivebeskyttet mot tolkingen. Les-rett holder.","en":"The findings list in 'Clarify measurements': what the interpreter actually found, read from what is stored (spec + provenance, guide lines, the user's measures): items [{id, kind length|room|door|window|stair|wall|furniture, text, source vector|ai|tool|user, page, region, box (0-1 in the page frame, else null), conf, assumed, how, level, side, answer}], added (what the user says is missing), facts (numbers the user knows against what the interpreter found: {kind, count, level, side, found, ok}), counts, pages, gaps (what is not stored). Read-only towards the interpretation. Read access is enough.","method":"GET","path":"/conversions/{jid}/findings","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"jid":{"type":"string"}},"required":["jid"]},"status":"live","server":"web","returns":"{ok, editable, kinds, items, added, facts, counts, pages, gaps, answered}","level":"owner","description":"The findings list in 'Clarify measurements': what the interpreter actually found, read from what is stored (spec + provenance, guide lines, the user's measures): items [{id, kind length|room|door|window|stair|wall|furniture, text, source vector|ai|tool|user, page, region, box (0-1 in the page frame, else null), conf, assumed, how, level, side, answer}], added (what the user says is missing), facts (numbers the user knows against what the interpreter found: {kind, count, level, side, found, ok}), counts, pages, gaps (what is not stored). Read-only towards the interpretation. Read access is enough. [logged in] — NO: Funnlisten i «Avklar mål»: hva tolkeren faktisk fant, lest fra det som er lagret (spec + provenance, hjelpelinjer, brukerens mål): items [{id, kind length|room|door|window|stair|wall|furniture, text, source vector|ai|tool|user, page, region, box (0-1 i sidens ramme, ellers null), conf, assumed, how, level, side, answer}], added (det brukeren sier mangler), facts (tall brukeren vet mot det tolkeren fant: {kind, count, level, side, found, ok}), counts, pages, gaps (hva som ikke er lagret). Skrivebeskyttet mot tolkingen. Les-rett holder.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"jid":{"type":"string"}},"required":["jid"]}},{"name":"conversion_finding_action","cat":"konto","no":"Én handling i funnlisten (krever redigeringsrett; konverteringen må ha bygget en modell): finding_answer (finding_id, answer right|wrong, note = «Riktig er …»), finding_add (finding = {kind, text, page?, region?, box?: [x0, y0, x1, y1] i sidens ramme}: det tolkeren ikke fant), finding_fact (fact = {kind, count, level?, side? Nord|Ost|Syd|Vest}: et tall du vet, f.eks. 6 vinduer på Syd i 1. etasje), finding_comment (finding_id, note: kommentar på en åpning/et funn), finding_delete (finding_id). Alt går til tolkeren som FASIT FRA BRUKEREN ved «Tolk på nytt» (retolk_answers).","en":"One action in the findings list (needs edit rights; the conversion must have built a model): finding_answer (finding_id, answer right|wrong, note = 'the right answer is …'), finding_add (finding = {kind, text, page?, region?, box?: [x0, y0, x1, y1] in the page frame}: something the interpreter missed), finding_fact (fact = {kind, count, level?, side? Nord|Ost|Syd|Vest}: a number you know, e.g. 6 windows on the south side of the 1st floor), finding_comment (finding_id, note: a comment on an opening/finding), finding_delete (finding_id). Everything goes to the interpreter as the user's facts on 'Interpret again' (retolk_answers).","method":"POST","path":"/conversions/{jid}/findings","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"jid":{"type":"string"},"action":{"type":"string"},"finding_id":{"type":"string"},"answer":{"type":"string"},"note":{"type":"string"},"finding":{"type":"object"},"fact":{"type":"object"}},"required":["jid","action"]},"example":{"action":"finding_fact","fact":{"kind":"window","count":6,"level":"1. etasje","side":"Syd"}},"status":"live","server":"web","returns":"the same as conversion_findings","level":"owner","description":"One action in the findings list (needs edit rights; the conversion must have built a model): finding_answer (finding_id, answer right|wrong, note = 'the right answer is …'), finding_add (finding = {kind, text, page?, region?, box?: [x0, y0, x1, y1] in the page frame}: something the interpreter missed), finding_fact (fact = {kind, count, level?, side? Nord|Ost|Syd|Vest}: a number you know, e.g. 6 windows on the south side of the 1st floor), finding_comment (finding_id, note: a comment on an opening/finding), finding_delete (finding_id). Everything goes to the interpreter as the user's facts on 'Interpret again' (retolk_answers). [logged in] — NO: Én handling i funnlisten (krever redigeringsrett; konverteringen må ha bygget en modell): finding_answer (finding_id, answer right|wrong, note = «Riktig er …»), finding_add (finding = {kind, text, page?, region?, box?: [x0, y0, x1, y1] i sidens ramme}: det tolkeren ikke fant), finding_fact (fact = {kind, count, level?, side? Nord|Ost|Syd|Vest}: et tall du vet, f.eks. 6 vinduer på Syd i 1. etasje), finding_comment (finding_id, note: kommentar på en åpning/et funn), finding_delete (finding_id). Alt går til tolkeren som FASIT FRA BRUKEREN ved «Tolk på nytt» (retolk_answers).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"jid":{"type":"string"},"action":{"type":"string"},"finding_id":{"type":"string"},"answer":{"type":"string"},"note":{"type":"string"},"finding":{"type":"object"},"fact":{"type":"object"}},"required":["jid","action"]}},{"name":"conversion_north","cat":"konto","no":"Retning (nord) som tolkningsdiskusjon (krever redigeringsrett): north_choose (deg = hvor nord peker på planen, grader med klokka fra opp på siden: 0 = opp, 90 = mot høyre), north_clear, north_address (address: slås opp hos Kartverket og et offentlig kart-API; krever innstillingen import.address_lookup, av som standard, ellers 409 lookup_off). Kildene (nordpil, fasadenavn, situasjonsplan, adresse), forslaget med sikkerhet og konflikt står i `north` i conversion_pages. Valget går til tolkeren som FASIT FRA BRUKEREN. Målestokk per tegning velges med conversion_pages (scale_n på regionen).","en":"The direction (north) as an interpretation discussion (needs edit rights): north_choose (deg = where north points on the plan, degrees clockwise from up on the page: 0 = up, 90 = right), north_clear, north_address (address: looked up at Kartverket and a public map API; needs the setting import.address_lookup, off by default, otherwise 409 lookup_off). The sources (north arrow, facade names, site plan, address), the recommendation with confidence and any conflict are in `north` in conversion_pages. The choice goes to the interpreter as the user's facts. The scale per drawing is chosen with conversion_pages (scale_n on the region).","method":"POST","path":"/conversions/{jid}/north","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"jid":{"type":"string"},"action":{"type":"string"},"deg":{"type":"number"},"address":{"type":"string"}},"required":["jid","action"]},"example":{"action":"north_choose","deg":90},"status":"live","server":"web","returns":"{ok, north: {sources, recommended, conflict, choice, choices, address}}","level":"owner","description":"The direction (north) as an interpretation discussion (needs edit rights): north_choose (deg = where north points on the plan, degrees clockwise from up on the page: 0 = up, 90 = right), north_clear, north_address (address: looked up at Kartverket and a public map API; needs the setting import.address_lookup, off by default, otherwise 409 lookup_off). The sources (north arrow, facade names, site plan, address), the recommendation with confidence and any conflict are in `north` in conversion_pages. The choice goes to the interpreter as the user's facts. The scale per drawing is chosen with conversion_pages (scale_n on the region). [logged in] — NO: Retning (nord) som tolkningsdiskusjon (krever redigeringsrett): north_choose (deg = hvor nord peker på planen, grader med klokka fra opp på siden: 0 = opp, 90 = mot høyre), north_clear, north_address (address: slås opp hos Kartverket og et offentlig kart-API; krever innstillingen import.address_lookup, av som standard, ellers 409 lookup_off). Kildene (nordpil, fasadenavn, situasjonsplan, adresse), forslaget med sikkerhet og konflikt står i `north` i conversion_pages. Valget går til tolkeren som FASIT FRA BRUKEREN. Målestokk per tegning velges med conversion_pages (scale_n på regionen).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"jid":{"type":"string"},"action":{"type":"string"},"deg":{"type":"number"},"address":{"type":"string"}},"required":["jid","action"]}},{"name":"conversion_thumb","cat":"konto","no":"Miniatyr (PNG) av en side i en konvertering.","en":"Thumbnail (PNG) of a page of a conversion.","method":"GET","path":"/conversions/{jid}/pages/{idx}/thumb.png","access":"login","effect":"read","params":{"type":"object","properties":{"jid":{"type":"string"},"idx":{"type":"integer"}},"required":["jid","idx"]},"status":"live","server":"web","returns":"image/png","level":"owner","description":"Thumbnail (PNG) of a page of a conversion. [logged in] — NO: Miniatyr (PNG) av en side i en konvertering.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"jid":{"type":"string"},"idx":{"type":"integer"}},"required":["jid","idx"]}},{"name":"undo","cat":"historikk","no":"Angre siste endring.","en":"Undo the last change.","method":"POST","path":"/sessions/{sid}/undo","access":"sandbox","effect":"write","mcp":"web","py":"app_undo()","status":"live","server":"web","level":"propose","description":"Undo the last change. [sandbox (anonymous) or logged in] — NO: Angre siste endring.","category_label":"Angre / gjør om","input_schema":{"type":"object","properties":{}}},{"name":"redo","cat":"historikk","no":"Gjør om.","en":"Redo.","method":"POST","path":"/sessions/{sid}/redo","access":"sandbox","effect":"write","mcp":"web","py":"app_redo()","status":"live","server":"web","level":"propose","description":"Redo. [sandbox (anonymous) or logged in] — NO: Gjør om.","category_label":"Angre / gjør om","input_schema":{"type":"object","properties":{}}},{"name":"login","cat":"konto","no":"Logg inn (e-post + passord fra brukeren; aldri i chat-logg).","en":"Log in (email + password from the user; never in a chat log).","method":"POST","path":"/auth/login","access":"public","effect":"account","mcp":"web","params":{"type":"object","properties":{"email":{"type":"string"},"password":{"type":"string"}}},"status":"live","server":"web","description":"Log in (email + password from the user; never in a chat log). [open, no login] — NO: Logg inn (e-post + passord fra brukeren; aldri i chat-logg).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"email":{"type":"string"},"password":{"type":"string"}}}},{"name":"logout","cat":"konto","no":"Logg ut.","en":"Log out.","method":"POST","path":"/auth/logout","access":"login","effect":"account","mcp":"web","status":"live","server":"web","level":"owner","description":"Log out. [logged in] — NO: Logg ut.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"whoami","cat":"konto","no":"Hvem er innlogget.","en":"Who is logged in.","method":"GET","path":"/auth/me","access":"public","effect":"read","mcp":"web","status":"live","server":"web","description":"Who is logged in. [open, no login] — NO: Hvem er innlogget.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"list_prefs","cat":"konto","no":"Alle brukerinnstillinger: grupper, typer, områder, standarder og norsk/engelsk tekst (åpen). Se dem før du tegner: veggtype, snap, mål-tetthet, scener, BuildChat.","en":"All user settings: groups, types, ranges, defaults and Norwegian/English text (open). Check them before you draw: wall type, snap, dimension density, scenes, BuildChat.","method":"GET","path":"/prefs/schema","access":"public","effect":"read","mcp":"web","py":"list_prefs()","status":"live","server":"web","returns":"{groups, prefs:[{key, kind, default, min, max, options, scope}]}","description":"All user settings: groups, types, ranges, defaults and Norwegian/English text (open). Check them before you draw: wall type, snap, dimension density, scenes, BuildChat. [open, no login] — NO: Alle brukerinnstillinger: grupper, typer, områder, standarder og norsk/engelsk tekst (åpen). Se dem før du tegner: veggtype, snap, mål-tetthet, scener, BuildChat.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"get_prefs","cat":"konto","no":"Brukerens gjeldende innstillinger (standard fylt inn) og det brukeren selv har endret. project_id gir prosjektets overstyringer.","en":"The user's effective settings (defaults filled in) and what the user changed. project_id adds the project's overrides.","method":"GET","path":"/prefs","access":"login","effect":"read","mcp":"web","py":"get_prefs()","status":"live","server":"web","returns":"{values, stored, project, defaults}","level":"owner","description":"The user's effective settings (defaults filled in) and what the user changed. project_id adds the project's overrides. [logged in] — NO: Brukerens gjeldende innstillinger (standard fylt inn) og det brukeren selv har endret. project_id gir prosjektets overstyringer.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"}}}},{"name":"set_prefs","cat":"konto","no":"Endre brukerinnstillinger (values: {nøkkel: verdi}, reset: [nøkler], reset_groups: [grupper], project_id for prosjekt-overstyring). Varig: spør brukeren «skal jeg lagre dette som din standard?» først. Ugyldige verdier avvises enkeltvis i errors.","en":"Change user settings (values: {key: value}, reset: [keys], reset_groups: [groups], project_id for a project override). Lasting: ask the user «shall I save this as your default?» first. Invalid values are rejected one by one in errors.","method":"PUT","path":"/prefs","access":"login","effect":"account","mcp":"web","py":"set_prefs({...})","example":{"values":{"wall.default_type":"ytter_300","plan.dim_density":"few"}},"status":"live","server":"web","level":"owner","description":"Change user settings (values: {key: value}, reset: [keys], reset_groups: [groups], project_id for a project override). Lasting: ask the user «shall I save this as your default?» first. Invalid values are rejected one by one in errors. [logged in] — NO: Endre brukerinnstillinger (values: {nøkkel: verdi}, reset: [nøkler], reset_groups: [grupper], project_id for prosjekt-overstyring). Varig: spør brukeren «skal jeg lagre dette som din standard?» først. Ugyldige verdier avvises enkeltvis i errors.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"values":{"additionalProperties":true,"type":"object","title":"Values"},"reset":{"items":{"type":"string"},"type":"array","title":"Reset"},"reset_groups":{"items":{"type":"string"},"type":"array","title":"Reset Groups"},"project_id":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Project Id"}}}},{"name":"key_info","cat":"konto","no":"Hvem er denne API-nøkkelen (DIBRIX_API_KEY): nivå (read/propose/write), omfang (én økt eller prosjekter), utløp, bruk og om eieren fortsatt har tilgang. Aldri selve nøkkelen. Nøkkelen kan ikke godkjenne versjoner, lage delelenker eller nøkler, eller røre konto.","en":"Who this API key (DIBRIX_API_KEY) is: level (read/propose/write), scope (one session or projects), expiry, use, and whether its owner still has access. Never the key itself. A key cannot approve versions, mint share links or keys, or touch the account.","method":"GET","path":"/key/self","access":"login","effect":"read","mcp":"web","status":"live","server":"web","returns":"{ok, key:{id, name, level, scope, expires_at, can}}","level":"owner","description":"Who this API key (DIBRIX_API_KEY) is: level (read/propose/write), scope (one session or projects), expiry, use, and whether its owner still has access. Never the key itself. A key cannot approve versions, mint share links or keys, or touch the account. [logged in] — NO: Hvem er denne API-nøkkelen (DIBRIX_API_KEY): nivå (read/propose/write), omfang (én økt eller prosjekter), utløp, bruk og om eieren fortsatt har tilgang. Aldri selve nøkkelen. Nøkkelen kan ikke godkjenne versjoner, lage delelenker eller nøkler, eller røre konto.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"key_open","cat":"okt","no":"Hent økta nøkkelen jobber i (bind_session gjør dette selv). read: privat skrivebeskyttet kopi. propose: privat ARBEIDSKOPI du kan endre fritt (lagre med save_version, blir NY utkastversjon merket med nøkkelen). write: den levende økta (mode=copy gir arbeidskopi likevel). Gi session=<økt-id> (økt-nøkkel) eller project=<prosjekt-id> (prosjekt-nøkkel; source=saved åpner lagret fil).","en":"Get the session the key works in (bind_session does this itself). read: a private read-only copy. propose: a private WORKING copy you may change freely (save with save_version: a NEW draft version tagged with the key). write: the live session (mode=copy still gives a working copy). Pass session=<session id> (session key) or project=<project id> (project key; source=saved opens the saved file).","method":"POST","path":"/key/open","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"session":{"type":"string"},"project":{"type":"string"},"source":{"type":"string","enum":["live","saved"]},"mode":{"type":"string","enum":["auto","copy"]}}},"example":{"session":"<32 hex>"},"status":"live","server":"web","returns":"{ok, session_id, live, read_only, level, via_key, version}","level":"propose","description":"Get the session the key works in (bind_session does this itself). read: a private read-only copy. propose: a private WORKING copy you may change freely (save with save_version: a NEW draft version tagged with the key). write: the live session (mode=copy still gives a working copy). Pass session=<session id> (session key) or project=<project id> (project key; source=saved opens the saved file). [logged in] — NO: Hent økta nøkkelen jobber i (bind_session gjør dette selv). read: privat skrivebeskyttet kopi. propose: privat ARBEIDSKOPI du kan endre fritt (lagre med save_version, blir NY utkastversjon merket med nøkkelen). write: den levende økta (mode=copy gir arbeidskopi likevel). Gi session=<økt-id> (økt-nøkkel) eller project=<prosjekt-id> (prosjekt-nøkkel; source=saved åpner lagret fil).","category_label":"Økt og delelenke","input_schema":{"type":"object","properties":{"session":{"type":"string"},"project":{"type":"string"},"source":{"type":"string","enum":["live","saved"]},"mode":{"type":"string","enum":["auto","copy"]}}}},{"name":"api_keys_list","cat":"konto","no":"List eierens API-nøkler (uten selve nøkkelen): navn, nivå, omfang, utløp, sist brukt, antall bruk, aktiv. Krever innlogging (e-post + passord), ikke en nøkkel. Nye nøkler lages bare av et menneske i Konto → API-nøkler.","en":"List the owner's API keys (never the key itself): name, level, scope, expiry, last used, use count, active. Needs a login (email + password), not a key. New keys are minted only by a person in Account → API keys.","method":"GET","path":"/api-keys","access":"login","effect":"account","mcp":"web","py":"list_api_keys()","status":"live","server":"web","returns":"{keys:[{id, name, level, scope, expires_at, active}]}","level":"owner","description":"List the owner's API keys (never the key itself): name, level, scope, expiry, last used, use count, active. Needs a login (email + password), not a key. New keys are minted only by a person in Account → API keys. [logged in] — NO: List eierens API-nøkler (uten selve nøkkelen): navn, nivå, omfang, utløp, sist brukt, antall bruk, aktiv. Krever innlogging (e-post + passord), ikke en nøkkel. Nye nøkler lages bare av et menneske i Konto → API-nøkler.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"api_key_revoke","cat":"konto","no":"Trekk en API-nøkkel tilbake med en gang (key_id fra api_keys_list). Krever innlogging, ikke en nøkkel.","en":"Revoke an API key at once (key_id from api_keys_list). Needs a login, not a key.","method":"DELETE","path":"/api-keys/{key_id}","access":"login","effect":"account","mcp":"web","py":"revoke_api_key(key_id)","params":{"type":"object","properties":{"key_id":{"type":"string"}},"required":["key_id"]},"status":"live","server":"web","level":"owner","description":"Revoke an API key at once (key_id from api_keys_list). Needs a login, not a key. [logged in] — NO: Trekk en API-nøkkel tilbake med en gang (key_id fra api_keys_list). Krever innlogging, ikke en nøkkel.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"key_id":{"type":"string"}},"required":["key_id"]}},{"name":"list_teams","cat":"konto","no":"Team for innlogget bruker (id, navn, slug, rolle). Bruk navnet i set_project_team.","en":"Teams of the logged-in user (id, name, slug, role). Use the name in set_project_team.","access":"login","effect":"read","mcp":"web","py":"list_teams()","status":"live","server":"web","level":"owner","description":"Teams of the logged-in user (id, name, slug, role). Use the name in set_project_team. [logged in] — NO: Team for innlogget bruker (id, navn, slug, rolle). Bruk navnet i set_project_team.","category_label":"Konto og prosjekt"},{"name":"set_project_team","cat":"konto","no":"Legg et prosjekt i et team («lagre prosjektet i team Tegnebua»): team = navn, slug eller id fra list_teams. MCP: project_id = prosjektet som flyttes (PATCH /projects/{id} med owner_type=team). BuildChat: project_id kan utelates, da gjelder øktas prosjekt; er økta ikke lagret ennå, lagres den som nytt team-prosjekt med name (adressen). Eieren må være medlem av teamet. Vises under teamet i Mine prosjekter.","en":"Put a project in a team («save the project in team Tegnebua»): team = name, slug or id from list_teams. MCP: project_id = the project to move (PATCH /projects/{id} with owner_type=team). BuildChat: project_id may be omitted (the session's project); an unsaved session is saved as a new team project with name. The owner must be a team member. Shown under the team in My projects.","access":"login","effect":"account","mcp":"web","py":"set_project_team('Tegnebua', name='Marikloppa 9')","params":{"type":"object","properties":{"team":{"type":"string"},"project_id":{"type":"string"},"name":{"type":"string"}},"required":["team"]},"example":{"project_id":"<project id>","team":"Tegnebua"},"status":"live","server":"web","returns":"{ok, moved|created, project:{id, name, owner_type, owner_id}, team}","level":"owner","description":"Put a project in a team («save the project in team Tegnebua»): team = name, slug or id from list_teams. MCP: project_id = the project to move (PATCH /projects/{id} with owner_type=team). BuildChat: project_id may be omitted (the session's project); an unsaved session is saved as a new team project with name. The owner must be a team member. Shown under the team in My projects. [logged in] — NO: Legg et prosjekt i et team («lagre prosjektet i team Tegnebua»): team = navn, slug eller id fra list_teams. MCP: project_id = prosjektet som flyttes (PATCH /projects/{id} med owner_type=team). BuildChat: project_id kan utelates, da gjelder øktas prosjekt; er økta ikke lagret ennå, lagres den som nytt team-prosjekt med name (adressen). Eieren må være medlem av teamet. Vises under teamet i Mine prosjekter.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"team":{"type":"string"},"project_id":{"type":"string"},"name":{"type":"string"}},"required":["team"]}},{"name":"list_projects","cat":"konto","no":"Prosjekter.","en":"Projects.","access":"login","effect":"read","mcp":"web","status":"live","server":"web","level":"owner","description":"Projects. [logged in] — NO: Prosjekter.","category_label":"Konto og prosjekt"},{"name":"create_project","cat":"konto","no":"Lag et nytt, tomt prosjekt (innlogget, ikke med API-nøkkel). owner_type=user (standard, eier = deg) eller team + owner_id (se list_teams); kind og template (fra GET /projects/templates) er valgfrie. Åpne det med bind_session(project=<id>).","en":"Create a new, empty project (logged in, never with an API key). owner_type=user (default, owner = you) or team + owner_id (see list_teams); kind and template (from GET /projects/templates) are optional. Open it with bind_session(project=<id>).","method":"POST","path":"/projects","access":"login","effect":"account","mcp":"web","params":{"type":"object","properties":{"name":{"type":"string"},"owner_type":{"type":"string","enum":["user","team"]},"owner_id":{"type":"string"},"kind":{"type":"string"},"folder":{"type":"string"},"template":{"type":"string"},"sheet_set":{"type":"string","enum":["presentasjon","soknad","konstruksjon"]}},"required":["name"]},"example":{"name":"Marikloppa 9","owner_type":"team","owner_id":"<team id>","kind":"document"},"status":"live","server":"web","returns":"{ok, project:{id, name, owner_type, owner_id, kind, template}}","level":"owner","description":"Create a new, empty project (logged in, never with an API key). owner_type=user (default, owner = you) or team + owner_id (see list_teams); kind and template (from GET /projects/templates) are optional. Open it with bind_session(project=<id>). [logged in] — NO: Lag et nytt, tomt prosjekt (innlogget, ikke med API-nøkkel). owner_type=user (standard, eier = deg) eller team + owner_id (se list_teams); kind og template (fra GET /projects/templates) er valgfrie. Åpne det med bind_session(project=<id>).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"name":{"type":"string"},"owner_type":{"type":"string","enum":["user","team"]},"owner_id":{"type":"string"},"kind":{"type":"string"},"folder":{"type":"string"},"template":{"type":"string"},"sheet_set":{"type":"string","enum":["presentasjon","soknad","konstruksjon"]}},"required":["name"]}},{"name":"save_project","cat":"konto","no":"Lagre økta som prosjekt (Lagre som).","en":"Save the session as a project (Save as).","access":"login","effect":"account","mcp":"web","params":{"type":"object","properties":{"name":{"type":"string"},"owner_type":{"type":"string"},"owner_id":{"type":"string"},"kind":{"type":"string"},"folder":{"type":"string"},"sid":{"type":"string"}},"required":["name"]},"status":"live","server":"web","level":"owner","description":"Save the session as a project (Save as). [logged in] — NO: Lagre økta som prosjekt (Lagre som).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"name":{"type":"string"},"owner_type":{"type":"string"},"owner_id":{"type":"string"},"kind":{"type":"string"},"folder":{"type":"string"},"sid":{"type":"string"}},"required":["name"]}},{"name":"save_into_project","cat":"konto","no":"Lagre den bundne økta INN i et eksisterende prosjekt (Ctrl+S / POST /projects/{id}/save/{sid}). Ikke «Lagre som» (det er save_project). project_id fra list_projects/bind_session; sid = økt (standard: bundet). Lager også en versjon (comment valgfri). 409 stale_session = prosjektet har nyere versjon: åpne den, eller save_version bevisst.","en":"Save the bound session INTO an existing project (Ctrl+S / POST /projects/{id}/save/{sid}). Not Save as (that is save_project). project_id from list_projects/bind_session; sid defaults to the bound session. Also makes a version (optional comment). 409 stale_session = the project has a newer version: open it, or save_version deliberately.","method":"POST","path":"/projects/{project_id}/save/{sid}","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"project_id":{"type":"string"},"sid":{"type":"string"},"comment":{"type":"string"},"auto":{"type":"boolean"}},"required":["project_id"]},"example":{"project_id":"<32 hex>","comment":"v6 terreng"},"status":"live","server":"web","returns":"{ok, storage_bytes, project, version?}","level":"owner","description":"Save the bound session INTO an existing project (Ctrl+S / POST /projects/{id}/save/{sid}). Not Save as (that is save_project). project_id from list_projects/bind_session; sid defaults to the bound session. Also makes a version (optional comment). 409 stale_session = the project has a newer version: open it, or save_version deliberately. [logged in] — NO: Lagre den bundne økta INN i et eksisterende prosjekt (Ctrl+S / POST /projects/{id}/save/{sid}). Ikke «Lagre som» (det er save_project). project_id fra list_projects/bind_session; sid = økt (standard: bundet). Lager også en versjon (comment valgfri). 409 stale_session = prosjektet har nyere versjon: åpne den, eller save_version bevisst.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"project_id":{"type":"string"},"sid":{"type":"string"},"comment":{"type":"string"},"auto":{"type":"boolean"}},"required":["project_id"]}},{"name":"set_project_folder","cat":"konto","no":"Flytt et prosjekt til en mappe inne i Dibrix (feltet folder; vises i Prosjekter). Mappenavn = adressen, f.eks. «Marikloppa 9». Tom streng legger prosjektet i roten. Krever innlogging og tilgang til prosjektet.","en":"Move a project into a folder inside Dibrix (the folder field; shown under Projects). Folder name = the address, e.g. «Marikloppa 9». An empty string puts the project in the root. Needs a login and access to the project.","access":"login","effect":"account","mcp":"web","params":{"type":"object","properties":{"project_id":{"type":"string"},"folder":{"type":"string"}},"required":["project_id","folder"]},"status":"live","server":"web","level":"owner","description":"Move a project into a folder inside Dibrix (the folder field; shown under Projects). Folder name = the address, e.g. «Marikloppa 9». An empty string puts the project in the root. Needs a login and access to the project. [logged in] — NO: Flytt et prosjekt til en mappe inne i Dibrix (feltet folder; vises i Prosjekter). Mappenavn = adressen, f.eks. «Marikloppa 9». Tom streng legger prosjektet i roten. Krever innlogging og tilgang til prosjektet.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"project_id":{"type":"string"},"folder":{"type":"string"}},"required":["project_id","folder"]}},{"name":"utkast_status","cat":"utkast","no":"Utkastet nå: «Dette har jeg antatt», høyst 3 spørsmål, varsler med rettingsknapp, felt for Enkel/Proff og kommunevalg.","en":"The draft now: the assumptions, at most 3 questions, warnings with a fix button, Enkel/Proff fields and the municipality choice.","method":"GET","path":"/sessions/{sid}/utkast","access":"share","effect":"read","mcp":"web","py":"draft_status()","status":"live","server":"web","returns":"{finnes, mode, antakelser, sporsmal, varsler, felt, kommuner}","level":"read","description":"The draft now: the assumptions, at most 3 questions, warnings with a fix button, Enkel/Proff fields and the municipality choice. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Utkastet nå: «Dette har jeg antatt», høyst 3 spørsmål, varsler med rettingsknapp, felt for Enkel/Proff og kommunevalg.","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"utkast_verktoy","cat":"utkast","no":"Kjør ett utkast-verktøy med enums og tall: set_dimensions | set_roof_style | set_cladding_style | set_colors | add_rooms | place_openings | add_overbygg | set_site | check_rules | set_draft_prefs | draft_from_description | draw_from_image. Lagrer en versjon, bygger hus-spec på nytt (ett angresteg).","en":"Run one draft tool with enums and numbers (see the Norwegian text for the list). Saves a version, rebuilds the house spec (one undo step).","method":"POST","path":"/sessions/{sid}/utkast/verktoy","access":"share","effect":"write","mcp":"web","params":{"type":"object","properties":{"tool":{"type":"string"},"args":{"type":"object"},"sid":{"type":"string"}},"required":["tool"]},"example":{"tool":"place_openings","args":{"kind":"window","count":2,"wall_side":"sor","distribution":"jevnt"}},"status":"live","server":"web","level":"propose","description":"Run one draft tool with enums and numbers (see the Norwegian text for the list). Saves a version, rebuilds the house spec (one undo step). [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Kjør ett utkast-verktøy med enums og tall: set_dimensions | set_roof_style | set_cladding_style | set_colors | add_rooms | place_openings | add_overbygg | set_site | check_rules | set_draft_prefs | draft_from_description | draw_from_image. Lagrer en versjon, bygger hus-spec på nytt (ett angresteg).","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)","input_schema":{"type":"object","properties":{"tool":{"type":"string"},"args":{"type":"object"},"sid":{"type":"string"}},"required":["tool"]}},{"name":"draft_from_description","cat":"utkast","no":"Hverdagsord -> utkast: tegner et første utkast (med antakelser) eller oppdaterer det («litt større», «to vinduer mot sør», «svalgang»).","en":"Everyday words -> draft: draws a first draft (with assumptions) or updates it.","access":"login","effect":"write","py":"draft_from_description(text)","status":"live","server":"web","level":"propose","description":"Everyday words -> draft: draws a first draft (with assumptions) or updates it. [logged in] — NO: Hverdagsord -> utkast: tegner et første utkast (med antakelser) eller oppdaterer det («litt større», «to vinduer mot sør», «svalgang»).","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)"},{"name":"draw_from_image","cat":"utkast","no":"Første utkast fra bildet brukeren la ved: form, takform, takbratthet, kledningsretning, farger, åpningsmønster, proporsjon (enums og tall).","en":"First draft from the attached picture: shape, roof form, pitch, cladding direction, colours, opening pattern, proportion (enums and numbers).","access":"login","effect":"write","py":"draw_from_image(form, roof_form, roof_slope, cladding, kledning_farge, tak_farge, openings, proportion)","status":"live","server":"web","level":"propose","description":"First draft from the attached picture: shape, roof form, pitch, cladding direction, colours, opening pattern, proportion (enums and numbers). [logged in] — NO: Første utkast fra bildet brukeren la ved: form, takform, takbratthet, kledningsretning, farger, åpningsmønster, proporsjon (enums og tall).","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)"},{"name":"set_dimensions","cat":"utkast","no":"Mål i meter (lengde, bredde, høyde) eller relativt (scale 1,15 = litt større).","en":"Dimensions in metres, or relative (scale 1.15 = a bit bigger).","access":"login","effect":"write","py":"set_dimensions(length_m, width_m, height_m)","status":"live","server":"web","level":"propose","description":"Dimensions in metres, or relative (scale 1.15 = a bit bigger). [logged in] — NO: Mål i meter (lengde, bredde, høyde) eller relativt (scale 1,15 = litt større).","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)"},{"name":"set_roof_style","cat":"utkast","no":"Takform (gable|hip|shed|flat), takvinkel i GRADER (slope_deg, anbefalt; slope_pct i % godtas fortsatt), utstikk, taktekke, møneretning.","en":"Roof form, pitch in DEGREES (slope_deg, recommended; slope_pct in % still accepted), overhang, roofing, ridge direction.","access":"login","effect":"write","py":"set_roof_style(form, slope_deg, overhang_m)","status":"live","server":"web","level":"propose","description":"Roof form, pitch in DEGREES (slope_deg, recommended; slope_pct in % still accepted), overhang, roofing, ridge direction. [logged in] — NO: Takform (gable|hip|shed|flat), takvinkel i GRADER (slope_deg, anbefalt; slope_pct i % godtas fortsatt), utstikk, taktekke, møneretning.","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)"},{"name":"set_cladding_style","cat":"utkast","no":"Kledning: stående | liggende | ingen.","en":"Cladding: vertical | horizontal | none.","access":"login","effect":"write","py":"set_cladding_style(direction)","status":"live","server":"web","level":"propose","description":"Cladding: vertical | horizontal | none. [logged in] — NO: Kledning: stående | liggende | ingen.","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)"},{"name":"set_colors","cat":"utkast","no":"Farger (nøkler som hvit, sort, gra, antrasitt, rod, tre) for kledning, tak og knuter.","en":"Colours (keys such as hvit, sort, gra) for cladding, roof and corner boards.","access":"login","effect":"write","py":"set_colors(kledning, tak, knuter)","status":"live","server":"web","level":"propose","description":"Colours (keys such as hvit, sort, gra) for cladding, roof and corner boards. [logged in] — NO: Farger (nøkler som hvit, sort, gra, antrasitt, rod, tre) for kledning, tak og knuter.","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)"},{"name":"add_rooms","cat":"utkast","no":"Antall rom (skillevegger med åpen dør), layout jevnt | langsgaende.","en":"Number of rooms (partition walls with an open door), layout jevnt | langsgaende.","access":"login","effect":"write","py":"add_rooms(count, layout)","status":"live","server":"web","level":"propose","description":"Number of rooms (partition walls with an open door), layout jevnt | langsgaende. [logged in] — NO: Antall rom (skillevegger med åpen dør), layout jevnt | langsgaende.","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)"},{"name":"place_openings","cat":"utkast","no":"Vinduer/dører etter ord: kind, count, wall_side (sor|nord|ost|vest|front|bak|venstre|hoyre|alle), distribution (senter|jevnt|hjorne_venstre|hjorne_hoyre). Regner ut posisjoner (dør 0,9 m, vinduer sentrert/jevnt).","en":"Windows/doors by words: kind, count, wall side, distribution. Computes the positions (door 0.9 m, windows centred/even).","access":"login","effect":"write","py":"place_openings(kind, count, wall_side, distribution)","status":"live","server":"web","level":"propose","description":"Windows/doors by words: kind, count, wall side, distribution. Computes the positions (door 0.9 m, windows centred/even). [logged in] — NO: Vinduer/dører etter ord: kind, count, wall_side (sor|nord|ost|vest|front|bak|venstre|hoyre|alle), distribution (senter|jevnt|hjorne_venstre|hjorne_hoyre). Regner ut posisjoner (dør 0,9 m, vinduer sentrert/jevnt).","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)"},{"name":"add_overbygg","cat":"utkast","no":"Svalgang eller takoverbygg på en vegg (utstikk + stolper).","en":"Covered walkway or roof canopy on a wall.","access":"login","effect":"write","py":"add_overbygg(kind, wall_side, depth_m)","status":"live","server":"web","level":"propose","description":"Covered walkway or roof canopy on a wall. [logged in] — NO: Svalgang eller takoverbygg på en vegg (utstikk + stolper).","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)"},{"name":"set_site","cat":"utkast","no":"Sted og tomtefakta: kommune (valg fra regelsettene eller «annen»), bruk, avstand til nabogrense osv.","en":"Place and plot facts: municipality (choice from the rule sets or 'annen'), use, distance to the boundary etc.","access":"login","effect":"write","py":"set_site(kommune, bruk, fakta)","status":"live","server":"web","level":"propose","description":"Place and plot facts: municipality (choice from the rule sets or 'annen'), use, distance to the boundary etc. [logged in] — NO: Sted og tomtefakta: kommune (valg fra regelsettene eller «annen»), bruk, avstand til nabogrense osv.","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)"},{"name":"check_rules","cat":"utkast","no":"Regelsjekk av utkastet mot nasjonale regler + kommunens regelsett: ok/brudd/ukjent med kilde, det regelsettene IKKE dekker, vennlige varsler med fiks og disclaimer.","en":"Rule check of the draft against national rules + the municipality's rule set: ok/breach/unknown with source, what the rule sets do NOT cover, friendly warnings with a fix and the disclaimer.","access":"login","effect":"read","py":"check_rules(kommune, site)","status":"live","server":"web","level":"read","description":"Rule check of the draft against national rules + the municipality's rule set: ok/breach/unknown with source, what the rule sets do NOT cover, friendly warnings with a fix and the disclaimer. [logged in] — NO: Regelsjekk av utkastet mot nasjonale regler + kommunens regelsett: ok/brudd/ukjent med kilde, det regelsettene IKKE dekker, vennlige varsler med fiks og disclaimer.","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)"},{"name":"set_draft_prefs","cat":"utkast","no":"Innstillinger for utkastet: mode = enkel|proff (ordvalg og felt), standardmål og grenser.","en":"Draft settings: mode = enkel|proff (wording and fields), default sizes and limits.","access":"login","effect":"write","py":"set_draft_prefs(mode)","status":"live","server":"web","level":"propose","description":"Draft settings: mode = enkel|proff (wording and fields), default sizes and limits. [logged in] — NO: Innstillinger for utkastet: mode = enkel|proff (ordvalg og felt), standardmål og grenser.","category_label":"Utkast: tegn først, spør etterpå (hverdagsspråk)"},{"name":"build_chat","cat":"buildchat","no":"Én BuildChat-tur (KI-en i appen kjører Python i økta).","en":"One BuildChat turn (the in-app AI runs Python in the session).","method":"POST","path":"/sessions/{sid}/build-chat","access":"login","effect":"write","status":"live","server":"web","level":"write","description":"One BuildChat turn (the in-app AI runs Python in the session). [logged in] — NO: Én BuildChat-tur (KI-en i appen kjører Python i økta).","category_label":"BuildChat (KI i appen)","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"message":{"type":"string","maxLength":8000,"title":"Message","default":""},"image_b64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image B64"},"image_mime":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Image Mime"},"api_key":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Api Key"},"provider":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Provider"},"model":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Model"},"reset":{"type":"boolean","title":"Reset","default":false},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"client":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Client"},"mode":{"anyOf":[{"type":"string","pattern":"^(enkel|proff)$"},{"type":"null"}],"title":"Mode"},"use_ai_images":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Ai Images"},"pdf_b64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf B64"},"file_name":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"File Name"},"project_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Project Name"},"page":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Page"},"page_sel":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Page Sel"},"files":{"anyOf":[{"items":{"properties":{"name":{"type":"string","maxLength":300,"title":"Name","default":"fil"},"mime":{"type":"string","maxLength":120,"title":"Mime","default":""},"data_b64":{"type":"string","title":"Data B64"}},"type":"object","required":["data_b64"],"title":"ChatFileIn","description":"One file attached in the chat: mail (.msg / .eml), PDF or picture (server/chat_files.py). Kept in memory for the turn, never stored."},"type":"array"},{"type":"null"}],"title":"Files"},"import_job":{"anyOf":[{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_-]+$"},{"type":"null"}],"title":"Import Job"},"from_inbox":{"type":"boolean","title":"From Inbox","default":false},"document":{"type":"boolean","title":"Document","default":false}}}},{"name":"build_chat_stream","cat":"buildchat","no":"Samme tur som build_chat, men som SSE med framdrift per runde (progress ... done).","en":"Same turn as build_chat, as server-sent events with progress per round (progress ... done).","method":"POST","path":"/sessions/{sid}/build-chat/stream","access":"login","effect":"write","status":"live","server":"web","level":"write","description":"Same turn as build_chat, as server-sent events with progress per round (progress ... done). [logged in] — NO: Samme tur som build_chat, men som SSE med framdrift per runde (progress ... done).","category_label":"BuildChat (KI i appen)","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"message":{"type":"string","maxLength":8000,"title":"Message","default":""},"image_b64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image B64"},"image_mime":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Image Mime"},"api_key":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Api Key"},"provider":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Provider"},"model":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Model"},"reset":{"type":"boolean","title":"Reset","default":false},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"client":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Client"},"mode":{"anyOf":[{"type":"string","pattern":"^(enkel|proff)$"},{"type":"null"}],"title":"Mode"},"use_ai_images":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Ai Images"},"pdf_b64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf B64"},"file_name":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"File Name"},"project_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Project Name"},"page":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Page"},"page_sel":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Page Sel"},"files":{"anyOf":[{"items":{"properties":{"name":{"type":"string","maxLength":300,"title":"Name","default":"fil"},"mime":{"type":"string","maxLength":120,"title":"Mime","default":""},"data_b64":{"type":"string","title":"Data B64"}},"type":"object","required":["data_b64"],"title":"ChatFileIn","description":"One file attached in the chat: mail (.msg / .eml), PDF or picture (server/chat_files.py). Kept in memory for the turn, never stored."},"type":"array"},{"type":"null"}],"title":"Files"},"import_job":{"anyOf":[{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_-]+$"},{"type":"null"}],"title":"Import Job"},"from_inbox":{"type":"boolean","title":"From Inbox","default":false},"document":{"type":"boolean","title":"Document","default":false}}}},{"name":"build_chat_smart","cat":"buildchat","no":"BuildChat-tur med modellbrief lagt til (bedre tolkning).","en":"BuildChat turn with a model brief injected (better interpretation).","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"message":{"type":"string"},"image_b64":{"type":"string"},"image_mime":{"type":"string"},"reset":{"type":"boolean"},"enrich":{"type":"boolean"},"sid":{"type":"string"}},"required":["message"]},"status":"live","server":"web","level":"write","description":"BuildChat turn with a model brief injected (better interpretation). [logged in] — NO: BuildChat-tur med modellbrief lagt til (bedre tolkning).","category_label":"BuildChat (KI i appen)","input_schema":{"type":"object","properties":{"message":{"type":"string"},"image_b64":{"type":"string"},"image_mime":{"type":"string"},"reset":{"type":"boolean"},"enrich":{"type":"boolean"},"sid":{"type":"string"}},"required":["message"]}},{"name":"build_chat_status","cat":"buildchat","no":"Er BuildChat konfigurert / opptatt?","en":"Is BuildChat configured / busy?","method":"GET","path":"/sessions/{sid}/build-chat/status","access":"login","effect":"read","mcp":"web","status":"live","server":"web","level":"write","description":"Is BuildChat configured / busy? [logged in] — NO: Er BuildChat konfigurert / opptatt?","category_label":"BuildChat (KI i appen)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"build_chat_stop","cat":"buildchat","no":"Stopp en pågående BuildChat-tur (clear_queue=true tømmer også køen; ellers kjøres beskjedene i kø etterpå).","en":"Stop a running BuildChat turn (clear_queue=true also empties the queue; otherwise the queued messages run next).","method":"POST","path":"/sessions/{sid}/build-chat/stop","access":"login","effect":"write","status":"live","server":"web","level":"write","description":"Stop a running BuildChat turn (clear_queue=true also empties the queue; otherwise the queued messages run next). [logged in] — NO: Stopp en pågående BuildChat-tur (clear_queue=true tømmer også køen; ellers kjøres beskjedene i kø etterpå).","category_label":"BuildChat (KI i appen)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"clear_queue":{"type":"boolean","default":false,"title":"Clear Queue"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"build_chat_inbox_add","cat":"buildchat","no":"Beskjed underveis: legg en melding i BuildChat-køen mens en tur kjører. Innstillingen «Nye beskjeder under kjøring» avgjør om den leses inn mellom stegene (styr) eller kjøres som neste tur (kø). running=false: ingen tur tar den, start med build_chat_stream {from_inbox: true}.","en":"Message during a run: put a message in the BuildChat queue while a turn runs. The setting «New messages during a run» decides whether it is read in between the steps (steer) or runs as the next turn (queue). running=false: no turn takes it, start one with build_chat_stream {from_inbox: true}.","method":"POST","path":"/sessions/{sid}/build-chat/inbox","access":"login","effect":"write","status":"live","server":"web","level":"write","description":"Message during a run: put a message in the BuildChat queue while a turn runs. The setting «New messages during a run» decides whether it is read in between the steps (steer) or runs as the next turn (queue). running=false: no turn takes it, start one with build_chat_stream {from_inbox: true}. [logged in] — NO: Beskjed underveis: legg en melding i BuildChat-køen mens en tur kjører. Innstillingen «Nye beskjeder under kjøring» avgjør om den leses inn mellom stegene (styr) eller kjøres som neste tur (kø). running=false: ingen tur tar den, start med build_chat_stream {from_inbox: true}.","category_label":"BuildChat (KI i appen)","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"text":{"type":"string","maxLength":8000,"title":"Text"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"}},"required":["text"]}},{"name":"build_chat_inbox_list","cat":"buildchat","no":"BuildChat-køen: meldinger i kø og lest (status queued|read), om en tur kjører.","en":"The BuildChat queue: queued and read messages (status queued|read), whether a turn runs.","method":"GET","path":"/sessions/{sid}/build-chat/inbox","access":"login","effect":"read","status":"live","server":"web","level":"write","description":"The BuildChat queue: queued and read messages (status queued|read), whether a turn runs. [logged in] — NO: BuildChat-køen: meldinger i kø og lest (status queued|read), om en tur kjører.","category_label":"BuildChat (KI i appen)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"build_chat_inbox_edit","cat":"buildchat","no":"Endre en melding som fortsatt ligger i BuildChat-køen (409 når den er lest).","en":"Edit a message still waiting in the BuildChat queue (409 once read).","method":"PUT","path":"/sessions/{sid}/build-chat/inbox/{item_id}","access":"login","effect":"write","status":"live","server":"web","level":"write","description":"Edit a message still waiting in the BuildChat queue (409 once read). [logged in] — NO: Endre en melding som fortsatt ligger i BuildChat-køen (409 når den er lest).","category_label":"BuildChat (KI i appen)","input_schema":{"type":"object","properties":{"item_id":{"type":"string","title":"Item Id"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"text":{"type":"string","maxLength":8000,"title":"Text"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"}},"required":["item_id","text"]}},{"name":"build_chat_inbox_delete","cat":"buildchat","no":"Fjern en melding som fortsatt ligger i BuildChat-køen (409 når den er lest).","en":"Remove a message still waiting in the BuildChat queue (409 once read).","method":"DELETE","path":"/sessions/{sid}/build-chat/inbox/{item_id}","access":"login","effect":"write","status":"live","server":"web","level":"write","description":"Remove a message still waiting in the BuildChat queue (409 once read). [logged in] — NO: Fjern en melding som fortsatt ligger i BuildChat-køen (409 når den er lest).","category_label":"BuildChat (KI i appen)","input_schema":{"type":"object","properties":{"item_id":{"type":"string","title":"Item Id"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},"required":["item_id"]}},{"name":"build_chat_clear","cat":"buildchat","no":"Tøm BuildChat-historikken.","en":"Clear BuildChat history.","method":"POST","path":"/sessions/{sid}/build-chat/clear","access":"login","effect":"write","mcp":"web","status":"live","server":"web","level":"write","description":"Clear BuildChat history. [logged in] — NO: Tøm BuildChat-historikken.","category_label":"BuildChat (KI i appen)","input_schema":{"type":"object","properties":{"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"be_om_retolking","cat":"buildchat","no":"Meld fra til tolken: bestill ny tolking når kunden sier at tolkingen av tegningen er feil. Kobles til konverteringen modellen kom fra (originalen ligger der), vises i Konverteringer med «Tolk på nytt med denne rettingen», og svaret har lenke og neste steg (BuildChat; «meld fra til tolken» går dit uten LLM-runde).","en":"Report to the interpreter: order a re-interpretation when the customer says the drawing was read wrong. Linked to the conversion the model came from (the original is stored there), shown in Conversions with «Interpret again with this correction»; the answer has a link and the next step (BuildChat).","access":"login","effect":"write","py":"be_om_retolking('Stua er 5,2 m, ikke 4,2 m; mangler vindu i soverommet', side=1)","status":"live","server":"buildchat","description":"Report to the interpreter: order a re-interpretation when the customer says the drawing was read wrong. Linked to the conversion the model came from (the original is stored there), shown in Conversions with «Interpret again with this correction»; the answer has a link and the next step (BuildChat). [logged in] — NO: Meld fra til tolken: bestill ny tolking når kunden sier at tolkingen av tegningen er feil. Kobles til konverteringen modellen kom fra (originalen ligger der), vises i Konverteringer med «Tolk på nytt med denne rettingen», og svaret har lenke og neste steg (BuildChat; «meld fra til tolken» går dit uten LLM-runde).","category_label":"BuildChat (KI i appen)"},{"name":"retolk_status","cat":"buildchat","no":"Status og svar på bestillinger om ny tolking fra denne økta (apen|under_arbeid|ferdig|avvist) (BuildChat).","en":"Status and answer of re-interpretation orders from this session (open|in progress|done|rejected) (BuildChat).","access":"login","effect":"read","py":"retolk_status()","status":"live","server":"buildchat","description":"Status and answer of re-interpretation orders from this session (open|in progress|done|rejected) (BuildChat). [logged in] — NO: Status og svar på bestillinger om ny tolking fra denne økta (apen|under_arbeid|ferdig|avvist) (BuildChat).","category_label":"BuildChat (KI i appen)"},{"name":"facade_photo_families","cat":"fasadefoto","no":"Taggfamiliene serveren kan lese (AprilTag 36h11/36h10/25h9/16h5, ArUco) og brukerens innstillinger: familie, taggstørrelse (svart kant, mm), mm per piksel, rutenett.","en":"The tag families this server can read (AprilTag 36h11/36h10/25h9/16h5, ArUco) and the user's settings: family, tag size (black edge, mm), mm per pixel, grid.","method":"GET","path":"/fasadefoto/families","access":"login","effect":"read","mcp":"web","status":"live","server":"web","returns":"{families, family, tag_size_mm, mm_per_px, grid_m}","level":"read","description":"The tag families this server can read (AprilTag 36h11/36h10/25h9/16h5, ArUco) and the user's settings: family, tag size (black edge, mm), mm per pixel, grid. [logged in] — NO: Taggfamiliene serveren kan lese (AprilTag 36h11/36h10/25h9/16h5, ArUco) og brukerens innstillinger: familie, taggstørrelse (svart kant, mm), mm per piksel, rutenett.","category_label":"Fasadefoto: tagger på veggen → mål → hus-spec","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}}},{"name":"facade_photo_rectify","cat":"fasadefoto","no":"Ett fasadebilde (base64) med utskrevne tagger på veggen → tagger med id, felles homografi G (plan u,z i meter → bildepiksler), kvalitet (restfeil mm, størrelsesavvik mellom taggene), avstander mellom taggene, og et rettet bilde i meter med rutenett (rect_jpeg_b64 + rect). family=auto prøver alle. Uten tagger: corners_px (4 klikk) + width_m + height_m. known_distances=[{a, b, m}] (laser) avslører feil taggstørrelse. Lagrer ingenting.","en":"One facade photo (base64) with printed tags on the wall → tags with ids, one homography G (plane u,z in metres → image pixels), quality (residual mm, size spread between tags), distances between tags, and a rectified image in metres with a grid (rect_jpeg_b64 + rect). family=auto tries all. Without tags: corners_px (4 clicks) + width_m + height_m. known_distances=[{a, b, m}] (laser) reveals a wrong tag size. Stores nothing.","method":"POST","path":"/fasadefoto/rectify","access":"login","effect":"read","mcp":"web","status":"live","server":"web","returns":"{ok, family, tags:[{id, center_m, tilt_deg, side_mm}], G, rect:{u0, z1, mm_per_px, w, h}, quality:{n_tags, rms_mm, side_dev_pct, grade}, pairs, checks, warnings, rect_jpeg_b64}","level":"read","description":"One facade photo (base64) with printed tags on the wall → tags with ids, one homography G (plane u,z in metres → image pixels), quality (residual mm, size spread between tags), distances between tags, and a rectified image in metres with a grid (rect_jpeg_b64 + rect). family=auto tries all. Without tags: corners_px (4 clicks) + width_m + height_m. known_distances=[{a, b, m}] (laser) reveals a wrong tag size. Stores nothing. [logged in] — NO: Ett fasadebilde (base64) med utskrevne tagger på veggen → tagger med id, felles homografi G (plan u,z i meter → bildepiksler), kvalitet (restfeil mm, størrelsesavvik mellom taggene), avstander mellom taggene, og et rettet bilde i meter med rutenett (rect_jpeg_b64 + rect). family=auto prøver alle. Uten tagger: corners_px (4 klikk) + width_m + height_m. known_distances=[{a, b, m}] (laser) avslører feil taggstørrelse. Lagrer ingenting.","category_label":"Fasadefoto: tagger på veggen → mål → hus-spec","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"image_b64":{"type":"string","title":"Image B64","description":"JPEG/PNG som base64 (data:-prefiks er lov)"},"family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Family","description":"auto | 36h11 | 36h10 | 25h9 | 16h5 | aruco_4x4 … (utelatt = foto.tag_family)"},"tag_size_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tag Size Mm","description":"svart kant i mm (utelatt = foto.tag_size_mm)"},"mm_per_px":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mm Per Px"},"grid_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Grid M"},"corners_px":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Corners Px","description":"uten tagger: 4 klikk nede v, nede h, oppe h, oppe v"},"width_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Width M"},"height_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Height M"},"known_distances":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Known Distances","description":"[{a: tag-id, b: tag-id, m: laseravstand}] som kontroll"},"extent":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Extent","description":"[u0, z0, u1, z1] utsnitt i meter"},"with_image":{"type":"boolean","title":"With Image","default":true}},"required":["image_b64"]}},{"name":"facade_photo_measure","cat":"fasadefoto","no":"Mål i det rettede fasadebildet: ground = to punkt på bakkelinjen (venstre og høyre hjørne), boxes [{x0, y0, x1, y1, kind}], points, lines (etasjeskille). Med rect er alt i piksler i det rettede bildet. Svar i meter: left_m fra venstre hjørne, width_m, bottom_m over bakken, height_m, length_m.","en":"Measure in the rectified facade image: ground = two points on the ground line (left and right corner), boxes [{x0, y0, x1, y1, kind}], points, lines (storey line). With rect everything is in rectified-image pixels. Answer in metres: left_m from the left corner, width_m, bottom_m above ground, height_m, length_m.","method":"POST","path":"/fasadefoto/measure","access":"login","effect":"read","mcp":"web","status":"live","server":"web","returns":"{length_m, boxes:[{kind, left_m, width_m, bottom_m, height_m}], points, lines}","level":"read","description":"Measure in the rectified facade image: ground = two points on the ground line (left and right corner), boxes [{x0, y0, x1, y1, kind}], points, lines (storey line). With rect everything is in rectified-image pixels. Answer in metres: left_m from the left corner, width_m, bottom_m above ground, height_m, length_m. [logged in] — NO: Mål i det rettede fasadebildet: ground = to punkt på bakkelinjen (venstre og høyre hjørne), boxes [{x0, y0, x1, y1, kind}], points, lines (etasjeskille). Med rect er alt i piksler i det rettede bildet. Svar i meter: left_m fra venstre hjørne, width_m, bottom_m over bakken, height_m, length_m.","category_label":"Fasadefoto: tagger på veggen → mål → hus-spec","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"ground":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","title":"Ground","description":"to punkt på bakkelinjen (venstre og høyre hjørne)"},"boxes":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Boxes","description":"[{x0, y0, x1, y1, kind?, id?}]"},"points":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Points"},"lines":{"anyOf":[{"items":{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Lines"},"rect":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rect","description":"rammen fra /rectify: da er alt i piksler i det rettede bildet, ellers meter (u, z)"}},"required":["ground"]}},{"name":"facade_photo_suggest","cat":"fasadefoto","no":"Forslag til vinduer og dører i et fasadebilde (konturer i det rettede bildet, lokalt, uten KI): bokser i rect-piksler; med ground blir høye bokser på bakken dører. Brukeren godkjenner antall og form. Innstillingen foto.suggest=off gir ingen forslag.","en":"Suggested windows and doors in a facade photo (contours in the rectified image, local, no AI): boxes in rect pixels; with ground, tall boxes on the ground become doors. The user agrees on number and shape. The setting foto.suggest=off gives no suggestion.","method":"POST","path":"/fasadefoto/suggest","access":"login","effect":"read","mcp":"web","status":"live","server":"web","returns":"{boxes:[{x0, y0, x1, y1, kind}], measured, source}","level":"read","description":"Suggested windows and doors in a facade photo (contours in the rectified image, local, no AI): boxes in rect pixels; with ground, tall boxes on the ground become doors. The user agrees on number and shape. The setting foto.suggest=off gives no suggestion. [logged in] — NO: Forslag til vinduer og dører i et fasadebilde (konturer i det rettede bildet, lokalt, uten KI): bokser i rect-piksler; med ground blir høye bokser på bakken dører. Brukeren godkjenner antall og form. Innstillingen foto.suggest=off gir ingen forslag.","category_label":"Fasadefoto: tagger på veggen → mål → hus-spec","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"image_b64":{"type":"string","title":"Image B64"},"G":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","title":"G","description":"homografien fra /rectify"},"rect":{"additionalProperties":true,"type":"object","title":"Rect"},"ground":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Ground"},"tags":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Tags"}},"required":["image_b64","G","rect"]}},{"name":"facade_photo_spec","cat":"fasadefoto","no":"Fasadene til en grov hus-spec: storeys [{name, kind kjeller|etasje, floor_m over bakken, material mur|tre}], lengths {sor|nord|ost|vest: {etasje: m}}, heights {ug_gesims_m, og_gesims_m, mone_m} (laser fra bakken), roof {form saltak|valm|pult|flatt, pitch_deg?, ridge ow|ns|auto, low_side, overhang_m}, openings [{facade, kind, left_m, width_m, bottom_m, height_m}]. Bygg svaret med build_house_from_spec. Samme tagg-id i to fasader gir notatet shared_tag.","en":"The facades to a rough house spec: storeys [{name, kind kjeller|etasje, floor_m above ground, material mur|tre}], lengths {sor|nord|ost|vest: {storey: m}}, heights {ug_gesims_m, og_gesims_m, mone_m} (laser from the ground), roof {form saltak|valm|pult|flatt, pitch_deg?, ridge ow|ns|auto, low_side, overhang_m}, openings [{facade, kind, left_m, width_m, bottom_m, height_m}]. Build the answer with build_house_from_spec. The same tag id in two facades gives the note shared_tag.","method":"POST","path":"/fasadefoto/spec","access":"login","effect":"read","mcp":"web","status":"live","server":"web","returns":"{ok, spec, notes, errors}","level":"read","description":"The facades to a rough house spec: storeys [{name, kind kjeller|etasje, floor_m above ground, material mur|tre}], lengths {sor|nord|ost|vest: {storey: m}}, heights {ug_gesims_m, og_gesims_m, mone_m} (laser from the ground), roof {form saltak|valm|pult|flatt, pitch_deg?, ridge ow|ns|auto, low_side, overhang_m}, openings [{facade, kind, left_m, width_m, bottom_m, height_m}]. Build the answer with build_house_from_spec. The same tag id in two facades gives the note shared_tag. [logged in] — NO: Fasadene til en grov hus-spec: storeys [{name, kind kjeller|etasje, floor_m over bakken, material mur|tre}], lengths {sor|nord|ost|vest: {etasje: m}}, heights {ug_gesims_m, og_gesims_m, mone_m} (laser fra bakken), roof {form saltak|valm|pult|flatt, pitch_deg?, ridge ow|ns|auto, low_side, overhang_m}, openings [{facade, kind, left_m, width_m, bottom_m, height_m}]. Bygg svaret med build_house_from_spec. Samme tagg-id i to fasader gir notatet shared_tag.","category_label":"Fasadefoto: tagger på veggen → mål → hus-spec","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"storeys":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Storeys"},"lengths":{"additionalProperties":true,"type":"object","title":"Lengths"},"heights":{"additionalProperties":true,"type":"object","title":"Heights"},"roof":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Roof"},"openings":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Openings"},"facades":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Facades","description":"{side: {tags: [{id, along_m, height_m}]}}: samme tagg-id i to fasader knytter dem"},"wall_thickness_m":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Wall Thickness M"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"required":["storeys","lengths","heights"]}},{"name":"report_to_developer","cat":"buildchat","no":"Meld til utviklerne (ikke tolken): kind = feil | ønske | tolkefeil | mangler, text = hva som mangler eller er feil, entity_ids valgfritt. Lagres med økt, bruker, app-rev, de siste BuildChat-rundene og et lite bilde. «si ifra til utvikler», «meld feil», «dere bør lage» går dit uten LLM-runde. Si aldri «meldt» uten svar ok. For strukturert verktøyhull: bruk request_capability (kind=mangler).","en":"Report to the developers (not the interpreter): kind = feil (bug) | ønske (wish) | tolkefeil (interpretation) | mangler (capability gap), text = what is missing or wrong, entity_ids optional. Stored with session, user, app rev, the last BuildChat turns and a small picture. Never claim it was sent without an ok answer. For a structured tool gap: use request_capability (kind=mangler).","access":"login","effect":"write","py":"report_to_developer('ønske', 'Kledningen kuttes ikke rundt et rundt vindu, og rund karm finnes ikke', ['w12'])","status":"live","server":"buildchat","description":"Report to the developers (not the interpreter): kind = feil (bug) | ønske (wish) | tolkefeil (interpretation) | mangler (capability gap), text = what is missing or wrong, entity_ids optional. Stored with session, user, app rev, the last BuildChat turns and a small picture. Never claim it was sent without an ok answer. For a structured tool gap: use request_capability (kind=mangler). [logged in] — NO: Meld til utviklerne (ikke tolken): kind = feil | ønske | tolkefeil | mangler, text = hva som mangler eller er feil, entity_ids valgfritt. Lagres med økt, bruker, app-rev, de siste BuildChat-rundene og et lite bilde. «si ifra til utvikler», «meld feil», «dere bør lage» går dit uten LLM-runde. Si aldri «meldt» uten svar ok. For strukturert verktøyhull: bruk request_capability (kind=mangler).","category_label":"BuildChat (KI i appen)"},{"name":"request_capability","cat":"buildchat","no":"Når BuildChat ikke kan utføre brukerens forespørsel (verktøy/parameter/tilstand mangler): lag strukturert utviklerforespørsel. user_asked (én setning), proposed_tool (foreslått navn), expected_params, nearest_tools, why_not, expected_result, example. Dedupes.","en":"When BuildChat cannot fulfil the user request (missing tool/parameter/state): file a structured developer request. user_asked (one sentence), proposed_tool (suggested name), expected_params, nearest_tools, why_not, expected_result, example. Deduped.","access":"login","effect":"write","py":"request_capability(user_asked='endre vindusbredde med skyveknapp', proposed_tool='set_opening_width', expected_params={'opening_id':'o1','width_m':1.2}, nearest_tools=['edit_opening','set_element_props'], why_not='edit_opening mangler bredde-håndtak i UI', expected_result='vindu får ny bredde', example='set_opening_width(o1, 1.2)')","status":"live","server":"buildchat","description":"When BuildChat cannot fulfil the user request (missing tool/parameter/state): file a structured developer request. user_asked (one sentence), proposed_tool (suggested name), expected_params, nearest_tools, why_not, expected_result, example. Deduped. [logged in] — NO: Når BuildChat ikke kan utføre brukerens forespørsel (verktøy/parameter/tilstand mangler): lag strukturert utviklerforespørsel. user_asked (én setning), proposed_tool (foreslått navn), expected_params, nearest_tools, why_not, expected_result, example. Dedupes.","category_label":"BuildChat (KI i appen)"},{"name":"ui_help_upload","cat":"buildchat","no":"Hvor brukeren laster opp PDF/bilder i BuildChat (📎 ved Send, hint på mobil) og alternativet Fil ▸ Last opp tegninger. Kall når brukeren spør «hvor laster jeg opp» / «finner ikke vedlegg» — ikke request_capability.","en":"Where the user attaches PDFs/photos in BuildChat (📎 next to Send, mobile hint) and File ▸ Upload drawings. Call when the user asks where to upload — not request_capability.","access":"login","effect":"read","py":"ui_help_upload()","status":"live","server":"buildchat","description":"Where the user attaches PDFs/photos in BuildChat (📎 next to Send, mobile hint) and File ▸ Upload drawings. Call when the user asks where to upload — not request_capability. [logged in] — NO: Hvor brukeren laster opp PDF/bilder i BuildChat (📎 ved Send, hint på mobil) og alternativet Fil ▸ Last opp tegninger. Kall når brukeren spør «hvor laster jeg opp» / «finner ikke vedlegg» — ikke request_capability.","category_label":"BuildChat (KI i appen)"},{"name":"report_to_developer","cat":"drift","no":"Meld til utviklerne fra en økt (samme som BuildChat-verktøyet): kind feil | ønske | tolkefeil | mangler (utelatt = gjettes), text, entity_ids, render=true legger ved et lite bilde. Endrer ikke modellen. Følger med: økt, bruker, app-rev, de siste BuildChat-rundene.","en":"Report to the developers from a session (same as the BuildChat tool): kind feil | ønske | tolkefeil | mangler (omitted = guessed), text, entity_ids, render=true attaches a small picture. Does not change the model. Carries session, user, app rev and the last BuildChat turns.","method":"POST","path":"/sessions/{sid}/dev-feedback","access":"login","effect":"write","mcp":"web","example":{"kind":"ønske","text":"Cladding is not cut around a round window","entity_ids":["w12"],"render":true},"status":"live","server":"web","returns":"{ok, id, type, bilde}","level":"propose","description":"Report to the developers from a session (same as the BuildChat tool): kind feil | ønske | tolkefeil | mangler (omitted = guessed), text, entity_ids, render=true attaches a small picture. Does not change the model. Carries session, user, app rev and the last BuildChat turns. [logged in] — NO: Meld til utviklerne fra en økt (samme som BuildChat-verktøyet): kind feil | ønske | tolkefeil | mangler (utelatt = gjettes), text, entity_ids, render=true legger ved et lite bilde. Endrer ikke modellen. Følger med: økt, bruker, app-rev, de siste BuildChat-rundene.","category_label":"Drift og feilsøking (bare systemadmin)","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"kind":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Kind"},"text":{"type":"string","maxLength":4000,"title":"Text"},"entity_ids":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Entity Ids"},"render":{"type":"boolean","title":"Render","default":false},"share":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Share"},"goal":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Goal"},"attempted_tool":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Attempted Tool"},"expected_params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Expected Params"},"error_response":{"anyOf":[{},{"type":"null"}],"title":"Error Response"},"registry_version":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Registry Version"},"workaround_tried":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Workaround Tried"},"client":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Client"}},"required":["text"]}},{"name":"request_capability","cat":"drift","no":"Be utviklerne om et manglende verktøy/parameter (kind=mangler): goal, attempted_tool, expected_params (JSON-skjema), error_response, registry_version, workaround_tried. Standard: innlogging (eier). Delenøkkel/sandkasse bare når DIBRIX_MANGLES_SHARE=1. Svar: id + poll GET /agent/requests/{id}?t=… (status, notat, midlertidig løsning; bare oppretteren). Dedupes på verktøy+mål+feilkode. Ukjent op / 404 / 422 får how_to_request automatisk.","en":"Ask the developers for a missing tool/parameter (kind=mangler): goal, attempted_tool, expected_params (JSON schema), error_response, registry_version, workaround_tried. Default: login (owner). Share key/sandbox only when DIBRIX_MANGLES_SHARE=1. Reply: id + poll GET /agent/requests/{id}?t=… (status, note, temporary workaround; creator only). Deduped on tool+goal+error code. Unknown op / 404 / 422 get how_to_request automatically.","method":"POST","path":"/sessions/{sid}/dev-feedback","access":"login","effect":"write","mcp":"web","example":{"kind":"mangler","text":"Need round window openings","goal":"place a round window","attempted_tool":"place_opening","expected_params":{"shape":"round","host_id":"w1"},"error_response":{"status":422,"code":"unsupported_shape"},"workaround_tried":"used rectangular"},"status":"live","server":"web","returns":"{ok, id, type, poll}","level":"propose","description":"Ask the developers for a missing tool/parameter (kind=mangler): goal, attempted_tool, expected_params (JSON schema), error_response, registry_version, workaround_tried. Default: login (owner). Share key/sandbox only when DIBRIX_MANGLES_SHARE=1. Reply: id + poll GET /agent/requests/{id}?t=… (status, note, temporary workaround; creator only). Deduped on tool+goal+error code. Unknown op / 404 / 422 get how_to_request automatically. [logged in] — NO: Be utviklerne om et manglende verktøy/parameter (kind=mangler): goal, attempted_tool, expected_params (JSON-skjema), error_response, registry_version, workaround_tried. Standard: innlogging (eier). Delenøkkel/sandkasse bare når DIBRIX_MANGLES_SHARE=1. Svar: id + poll GET /agent/requests/{id}?t=… (status, notat, midlertidig løsning; bare oppretteren). Dedupes på verktøy+mål+feilkode. Ukjent op / 404 / 422 får how_to_request automatisk.","category_label":"Drift og feilsøking (bare systemadmin)","input_schema":{"type":"object","properties":{"authorization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"},"kind":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Kind"},"text":{"type":"string","maxLength":4000,"title":"Text"},"entity_ids":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Entity Ids"},"render":{"type":"boolean","title":"Render","default":false},"share":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Share"},"goal":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Goal"},"attempted_tool":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Attempted Tool"},"expected_params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Expected Params"},"error_response":{"anyOf":[{},{"type":"null"}],"title":"Error Response"},"registry_version":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Registry Version"},"workaround_tried":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Workaround Tried"},"client":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Client"}},"required":["text"]}},{"name":"get_capability_request","cat":"drift","no":"Les status på din egen mangler-forespørsel (poll_token fra request_capability). Returnerer status, notat og midlertidig løsning.","en":"Read the status of your own mangler request (poll_token from request_capability). Returns status, note and temporary workaround.","method":"GET","path":"/agent/requests/{mid}","access":"public","effect":"read","mcp":"web","params":{"type":"object","properties":{"mid":{"type":"string"},"t":{"type":"string"}},"required":["mid","t"]},"example":{"mid":"U-20261030-120000-ab12","t":"<poll_token>"},"status":"live","server":"web","returns":"{ok, id, status, notat, workaround, type, goal, attempted_tool}","description":"Read the status of your own mangler request (poll_token from request_capability). Returns status, note and temporary workaround. [open, no login] — NO: Les status på din egen mangler-forespørsel (poll_token fra request_capability). Returnerer status, notat og midlertidig løsning.","category_label":"Drift og feilsøking (bare systemadmin)","input_schema":{"type":"object","properties":{"mid":{"type":"string"},"t":{"type":"string"}},"required":["mid","t"]}},{"name":"list_developer_messages","cat":"drift","no":"Meldinger til utviklerne fra BuildChat og API, nyeste først: id, type, tekst, økt, prosjekt, bruker, rev, element-id-er, samtale (siste runder), bilde_url, status. status = apen (standard) | under_arbeid | lukket | avvist | alle. Systemadmin, X-Ops-Token, feedback_reader eller feedback-nøkkel ser alle; team_admin ser meldinger fra teamets medlemmer og prosjekter.","en":"Messages to the developers from BuildChat and the API, newest first: id, type, text, session, project, user, rev, element ids, conversation (last turns), picture url, status. status = apen (default) | under_arbeid | lukket | avvist | alle. System admin, X-Ops-Token, feedback reader or a feedback key see all; a team admin sees messages from the team's members and projects.","method":"GET","path":"/dev-feedback","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"status":{"type":"string"},"limit":{"type":"integer"}}},"status":"live","server":"web","returns":"{ok, n, apne, tilgang, meldinger:[{id, t, type, tekst, session_id, project_id, bruker, rev, entity_ids, samtale, bilde_url, status, notat, lukket_av}]}","level":"owner","description":"Messages to the developers from BuildChat and the API, newest first: id, type, text, session, project, user, rev, element ids, conversation (last turns), picture url, status. status = apen (default) | under_arbeid | lukket | avvist | alle. System admin, X-Ops-Token, feedback reader or a feedback key see all; a team admin sees messages from the team's members and projects. [logged in] — NO: Meldinger til utviklerne fra BuildChat og API, nyeste først: id, type, tekst, økt, prosjekt, bruker, rev, element-id-er, samtale (siste runder), bilde_url, status. status = apen (standard) | under_arbeid | lukket | avvist | alle. Systemadmin, X-Ops-Token, feedback_reader eller feedback-nøkkel ser alle; team_admin ser meldinger fra teamets medlemmer og prosjekter.","category_label":"Drift og feilsøking (bare systemadmin)","input_schema":{"type":"object","properties":{"status":{"type":"string"},"limit":{"type":"integer"}}}},{"name":"close_developer_message","cat":"drift","no":"Sett status på en melding til utviklerne: lukket (standard; note = PR/rev som løste den), under_arbeid eller avvist (note = grunn). Logges med hvem og tid. Samme tilgang som list_developer_messages (team_admin bare for teamets meldinger).","en":"Set the status of a developer message: lukket (closed, default; note = the PR/rev that solved it), under_arbeid (in progress) or avvist (rejected, note = reason). Logged with who and when. Same access as list_developer_messages (a team admin only for the team's messages).","method":"POST","path":"/dev-feedback/{mid}/status","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"mid":{"type":"string"},"status":{"type":"string"},"note":{"type":"string"}},"required":["mid"]},"example":{"mid":"U-20261026-101500-ab12","status":"lukket","note":"PR #361"},"status":"live","server":"web","returns":"{ok, melding}","level":"owner","description":"Set the status of a developer message: lukket (closed, default; note = the PR/rev that solved it), under_arbeid (in progress) or avvist (rejected, note = reason). Logged with who and when. Same access as list_developer_messages (a team admin only for the team's messages). [logged in] — NO: Sett status på en melding til utviklerne: lukket (standard; note = PR/rev som løste den), under_arbeid eller avvist (note = grunn). Logges med hvem og tid. Samme tilgang som list_developer_messages (team_admin bare for teamets meldinger).","category_label":"Drift og feilsøking (bare systemadmin)","input_schema":{"type":"object","properties":{"mid":{"type":"string"},"status":{"type":"string"},"note":{"type":"string"}},"required":["mid"]}},{"name":"talk_message","cat":"konto","no":"Talebeskjed fra /talk (multipart, bare metadata): draft (lydbitene fra /talk/chunk og bildene fra /talk/photo), photos_expected (bilder siden tok), segments (JSON [{t, text}]), stt (browser|none), address, project_id, team_id, duration_s, position; team-lenke i X-Talk-Token eller feltet t. Eldre sider kan også sende audio og photos[] med photo_t/photo_geo: for store bilder gjøres mindre eller tas bort, men beskjeden avvises aldri for størrelsen. Teksten deles per bilde, og teamets admin(er) får e-post (bilder som ikke kom fram, står der). Er utkastet sendt, ettersendes nye bilder; ellers 409.","en":"Voice message from /talk (multipart, metadata only): draft (audio chunks from /talk/chunk and photos from /talk/photo), photos_expected (photos the page took), segments (JSON [{t, text}]), stt (browser|none), address, project_id, team_id, duration_s, position; team link in X-Talk-Token or field t. Older pages may also send audio and photos[] with photo_t/photo_geo: oversize photos are shrunk or dropped, but the message is never refused for its size. The text is split per photo and the team's admin(s) get an email (photos that did not arrive are listed). On a sent draft new photos are sent as a follow-up; else 409.","method":"POST","path":"/talk/message","access":"public","effect":"write","status":"live","server":"web","returns":"{ok, id, photos, photos_missing, texts:[…per bilde], rest, stt, duration_s, audio:[{start_s, length_s, bytes}], audio_s, mail:{sent, configured, error}} | {ok, late, added}","description":"Voice message from /talk (multipart, metadata only): draft (audio chunks from /talk/chunk and photos from /talk/photo), photos_expected (photos the page took), segments (JSON [{t, text}]), stt (browser|none), address, project_id, team_id, duration_s, position; team link in X-Talk-Token or field t. Older pages may also send audio and photos[] with photo_t/photo_geo: oversize photos are shrunk or dropped, but the message is never refused for its size. The text is split per photo and the team's admin(s) get an email (photos that did not arrive are listed). On a sent draft new photos are sent as a follow-up; else 409. [open, no login] — NO: Talebeskjed fra /talk (multipart, bare metadata): draft (lydbitene fra /talk/chunk og bildene fra /talk/photo), photos_expected (bilder siden tok), segments (JSON [{t, text}]), stt (browser|none), address, project_id, team_id, duration_s, position; team-lenke i X-Talk-Token eller feltet t. Eldre sider kan også sende audio og photos[] med photo_t/photo_geo: for store bilder gjøres mindre eller tas bort, men beskjeden avvises aldri for størrelsen. Teksten deles per bilde, og teamets admin(er) får e-post (bilder som ikke kom fram, står der). Er utkastet sendt, ettersendes nye bilder; ellers 409.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"talk_info","cat":"konto","no":"Det /talk-siden trenger: team, grenser (talk.max_minutes/max_photos/max_mb/remind_photo_s) og for innloggede teamene og teamets prosjekter.","en":"What the /talk page needs: team, limits and, when logged in, the teams and the team's projects.","method":"GET","path":"/talk/info","access":"public","effect":"read","params":{"type":"object","properties":{"team_id":{"type":"string"}}},"status":"live","server":"web","returns":"{ok, via, team, limits, teams, projects}","description":"What the /talk page needs: team, limits and, when logged in, the teams and the team's projects. [open, no login] — NO: Det /talk-siden trenger: team, grenser (talk.max_minutes/max_photos/max_mb/remind_photo_s) og for innloggede teamene og teamets prosjekter.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"team_id":{"type":"string"}}}},{"name":"talk_messages","cat":"konto","no":"Talebeskjeder til et team (medlem), nyeste først: adresse, avsender, transkripsjon, bilder med tekst og lenker til lyd/bilder.","en":"Voice messages to a team (member), newest first: address, sender, transcript, photos with text and links to audio/photos.","method":"GET","path":"/talk/messages","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"team_id":{"type":"string"},"limit":{"type":"integer"}},"required":["team_id"]},"status":"live","server":"web","returns":"{ok, messages:[{id, created_at, address, sender, transcript, stt, audio_url, photos:[{t, text, url}]}]}","level":"owner","description":"Voice messages to a team (member), newest first: address, sender, transcript, photos with text and links to audio/photos. [logged in] — NO: Talebeskjeder til et team (medlem), nyeste først: adresse, avsender, transkripsjon, bilder med tekst og lenker til lyd/bilder.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"team_id":{"type":"string"},"limit":{"type":"integer"}},"required":["team_id"]}},{"name":"talk_audio","cat":"konto","no":"Lyden til en talebeskjed (teammedlem).","en":"The audio of a voice message (team member).","method":"GET","path":"/talk/messages/{mid}/audio","access":"login","effect":"read","status":"live","server":"web","level":"owner","description":"The audio of a voice message (team member). [logged in] — NO: Lyden til en talebeskjed (teammedlem).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"mid":{"type":"string","title":"Mid"}},"required":["mid"]}},{"name":"talk_audio_part","cat":"konto","no":"Lyddel nr. part (0, 1, …) av en talebeskjed når lyden ble startet igjen underveis (teammedlem).","en":"Audio part no. part (0, 1, …) of a voice message when the audio was restarted during the recording (team member).","method":"GET","path":"/talk/messages/{mid}/audio/{part}","access":"login","effect":"read","status":"live","server":"web","level":"owner","description":"Audio part no. part (0, 1, …) of a voice message when the audio was restarted during the recording (team member). [logged in] — NO: Lyddel nr. part (0, 1, …) av en talebeskjed når lyden ble startet igjen underveis (teammedlem).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"mid":{"type":"string","title":"Mid"},"part":{"type":"integer","title":"Part"}},"required":["mid","part"]}},{"name":"talk_start","cat":"konto","no":"Et /talk-opptak begynner (lenke eller innlogget): gir draft-id for lydbitene som lastes opp underveis og for beskjeden til slutt.","en":"A /talk recording starts (link or logged in): returns the draft id for the audio chunks uploaded during the recording and for the final message.","method":"POST","path":"/talk/start","access":"public","effect":"write","status":"live","server":"web","returns":"{ok, draft, limits}","description":"A /talk recording starts (link or logged in): returns the draft id for the audio chunks uploaded during the recording and for the final message. [open, no login] — NO: Et /talk-opptak begynner (lenke eller innlogget): gir draft-id for lydbitene som lastes opp underveis og for beskjeden til slutt.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"talk_chunk","cat":"konto","no":"Én lydbit under /talk-opptaket (multipart: audio, draft, seg, seq, start_s, at). Sendes hvert ~5 s, så en stopp eller et krasj ikke mister lyden; omsending av samme bit gir 200.","en":"One audio chunk during a /talk recording (multipart: audio, draft, seg, seq, start_s, at). Sent every ~5 s so a stop or crash loses nothing; sending the same chunk again returns 200.","method":"POST","path":"/talk/chunk","access":"public","effect":"write","status":"live","server":"web","returns":"{ok, seg, seq, bytes}","description":"One audio chunk during a /talk recording (multipart: audio, draft, seg, seq, start_s, at). Sent every ~5 s so a stop or crash loses nothing; sending the same chunk again returns 200. [open, no login] — NO: Én lydbit under /talk-opptaket (multipart: audio, draft, seg, seq, start_s, at). Sendes hvert ~5 s, så en stopp eller et krasj ikke mister lyden; omsending av samme bit gir 200.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"talk_photo_upload","cat":"konto","no":"Ett bilde under /talk-opptaket, med en gang det er tatt (multipart: photo, draft, idx, at = tid i s, geo = JSON {lat, lon, acc}). Siden gjør bildet mindre først (talk.photo_max_px, talk.photo_quality); er det over talk.max_mb samlet, gjør serveren det mindre, ellers 413. Omsending av samme idx gir 200; etter at beskjeden er sendt lagres bildet for ettersending.","en":"One photo during a /talk recording, as soon as it is taken (multipart: photo, draft, idx, at = time in s, geo = JSON {lat, lon, acc}). The page shrinks it first (talk.photo_max_px, talk.photo_quality); over talk.max_mb in total the server shrinks it, else 413. Sending the same idx again returns 200; after the message is sent the photo is kept for a follow-up.","method":"POST","path":"/talk/photo","access":"public","effect":"write","status":"live","server":"web","returns":"{ok, idx, bytes, late}","description":"One photo during a /talk recording, as soon as it is taken (multipart: photo, draft, idx, at = time in s, geo = JSON {lat, lon, acc}). The page shrinks it first (talk.photo_max_px, talk.photo_quality); over talk.max_mb in total the server shrinks it, else 413. Sending the same idx again returns 200; after the message is sent the photo is kept for a follow-up. [open, no login] — NO: Ett bilde under /talk-opptaket, med en gang det er tatt (multipart: photo, draft, idx, at = tid i s, geo = JSON {lat, lon, acc}). Siden gjør bildet mindre først (talk.photo_max_px, talk.photo_quality); er det over talk.max_mb samlet, gjør serveren det mindre, ellers 413. Omsending av samme idx gir 200; etter at beskjeden er sendt lagres bildet for ettersending.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"talk_drafts","cat":"konto","no":"Opptak til teamet som ble startet, men aldri sendt (team_admin): avsender, antall lydbiter, lydens lengde, bilder, størrelse.","en":"Recordings to the team that were started but never sent (team admin): sender, number of audio chunks, audio length, photos, size.","method":"GET","path":"/talk/drafts","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"team_id":{"type":"string"},"include_done":{"type":"boolean"}},"required":["team_id"]},"status":"live","server":"web","returns":"{ok, drafts:[{id, created_at, done, bytes, sender, chunks, audio_s, photos}]}","level":"owner","description":"Recordings to the team that were started but never sent (team admin): sender, number of audio chunks, audio length, photos, size. [logged in] — NO: Opptak til teamet som ble startet, men aldri sendt (team_admin): avsender, antall lydbiter, lydens lengde, bilder, størrelse.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"team_id":{"type":"string"},"include_done":{"type":"boolean"}},"required":["team_id"]}},{"name":"talk_draft_finish","cat":"konto","no":"Fullfør et /talk-opptak som aldri ble sendt (team_admin): lyden settes sammen, bildene som kom fram tas med, og teamets admin(er) får e-posten som om avsenderen hadde trykket «Stopp og send». Et sendt utkast med nye bilder gir ettersending; ellers 409.","en":"Finish a /talk recording that was never sent (team admin): the audio is assembled, the photos that arrived are included and the team's admin(s) get the email as if the sender had tapped «Stop and send». A sent draft with new photos gives a follow-up; else 409.","method":"POST","path":"/talk/drafts/{did}/finish","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"did":{"type":"string"}},"required":["did"]},"status":"live","server":"web","returns":"{ok, id, photos, photos_missing, audio_s, mail}","level":"owner","description":"Finish a /talk recording that was never sent (team admin): the audio is assembled, the photos that arrived are included and the team's admin(s) get the email as if the sender had tapped «Stop and send». A sent draft with new photos gives a follow-up; else 409. [logged in] — NO: Fullfør et /talk-opptak som aldri ble sendt (team_admin): lyden settes sammen, bildene som kom fram tas med, og teamets admin(er) får e-posten som om avsenderen hadde trykket «Stopp og send». Et sendt utkast med nye bilder gir ettersending; ellers 409.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"did":{"type":"string"}},"required":["did"]}},{"name":"talk_photo","cat":"konto","no":"Bilde nr. i i en talebeskjed (teammedlem).","en":"Photo no. i of a voice message (team member).","method":"GET","path":"/talk/messages/{mid}/photos/{i}","access":"login","effect":"read","status":"live","server":"web","level":"owner","description":"Photo no. i of a voice message (team member). [logged in] — NO: Bilde nr. i i en talebeskjed (teammedlem).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"mid":{"type":"string","title":"Mid"},"i":{"type":"integer","title":"I"}},"required":["mid","i"]}},{"name":"talk_skann_upload","cat":"konto","no":"Last opp et skann per etasje (multipart: fil = Scaniverse .ply eller .glb, navn, project_id, team_id; team-lenke i X-Talk-Token eller feltet t). Serveren finner gulv og himling, retter mot veggaksene, måler hver vegg i 110-snittet, takkontrollen og loddrette snitt hver meter, og svarer planen: rom med hjørner, mål per vegg (median over snittene, spredning, antall snitt, status sjekk/skann/gronn/laser), takhøyde per rom, lukkefeil, vinkler og «x av y grønne». Tersklene: skann.plan.* (get_prefs).","en":"Upload one scan per storey (multipart: fil = Scaniverse .ply or .glb, navn, project_id, team_id; team link in X-Talk-Token or field t). The server finds floor and ceiling, aligns to the wall axes, measures each wall in the 110 cm section, the ceiling check and vertical sections every metre, and answers the plan: rooms with corners, a measure per wall (median over the sections, spread, number of sections, status sjekk/skann/gronn/laser), ceiling height per room, closure error, angles and «x of y green».","method":"POST","path":"/talk/skann/upload","access":"public","effect":"write","status":"live","server":"web","returns":"{ok, id, etasjer:[{gulv, himling, rom:[{id, hjorner, vegger:[{id, lengde_m, maal:{skann_m, spredning_cm, n}, status, grunn}], takhoyde, lukkefeil_mm, gronne, antall}], mest_usikre:[…]}], gronne, antall, farger}","description":"Upload one scan per storey (multipart: fil = Scaniverse .ply or .glb, navn, project_id, team_id; team link in X-Talk-Token or field t). The server finds floor and ceiling, aligns to the wall axes, measures each wall in the 110 cm section, the ceiling check and vertical sections every metre, and answers the plan: rooms with corners, a measure per wall (median over the sections, spread, number of sections, status sjekk/skann/gronn/laser), ceiling height per room, closure error, angles and «x of y green». [open, no login] — NO: Last opp et skann per etasje (multipart: fil = Scaniverse .ply eller .glb, navn, project_id, team_id; team-lenke i X-Talk-Token eller feltet t). Serveren finner gulv og himling, retter mot veggaksene, måler hver vegg i 110-snittet, takkontrollen og loddrette snitt hver meter, og svarer planen: rom med hjørner, mål per vegg (median over snittene, spredning, antall snitt, status sjekk/skann/gronn/laser), takhøyde per rom, lukkefeil, vinkler og «x av y grønne». Tersklene: skann.plan.* (get_prefs).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"talk_skann_del","cat":"konto","no":"«Del til Dibrix» fra en iOS-snarvei (Del-arket i Scaniverse): multipart med fila (fil eller file = .ply/.glb) og eventuelt navn, lang; team-lenke-tokenet BARE i headeren X-Talk-Token (token i adressen gir 400, uten token 401). Samme tilgang som /talk-lenken (bare innsending). Svarer kort tekst snarveien kan vise: «Mottatt …: planen er klar … Åpne planen: <lenke>».","en":"«Share to Dibrix» from an iOS shortcut (the Scaniverse share sheet): multipart with the file (fil or file = .ply/.glb) and optional navn, lang; the team link token ONLY in the X-Talk-Token header (a token in the address gives 400, no token 401). Same access as the /talk link (submit only). Answers short plain text the shortcut can show: «Received …: the plan is ready … Open the plan: <link>».","method":"POST","path":"/talk/skann/del","access":"public","effect":"write","status":"live","server":"web","returns":"text/plain","description":"«Share to Dibrix» from an iOS shortcut (the Scaniverse share sheet): multipart with the file (fil or file = .ply/.glb) and optional navn, lang; the team link token ONLY in the X-Talk-Token header (a token in the address gives 400, no token 401). Same access as the /talk link (submit only). Answers short plain text the shortcut can show: «Received …: the plan is ready … Open the plan: <link>». [open, no login] — NO: «Del til Dibrix» fra en iOS-snarvei (Del-arket i Scaniverse): multipart med fila (fil eller file = .ply/.glb) og eventuelt navn, lang; team-lenke-tokenet BARE i headeren X-Talk-Token (token i adressen gir 400, uten token 401). Samme tilgang som /talk-lenken (bare innsending). Svarer kort tekst snarveien kan vise: «Mottatt …: planen er klar … Åpne planen: <lenke>».","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"talk_skann_list","cat":"konto","no":"Teamets skann fra /talk/skann (teammedlem).","en":"The team's scans from /talk/skann (team member).","method":"GET","path":"/talk/skann/list","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"team_id":{"type":"string"},"limit":{"type":"integer"}},"required":["team_id"]},"status":"live","server":"web","returns":"{ok, skann:[{id, navn, created_at, etasjer, rom, rettinger, url}]}","level":"owner","description":"The team's scans from /talk/skann (team member). [logged in] — NO: Teamets skann fra /talk/skann (teammedlem).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"team_id":{"type":"string"},"limit":{"type":"integer"}},"required":["team_id"]}},{"name":"talk_skann_get","cat":"konto","no":"Planen fra ett skann med rettingene lagt inn og statusen regnet med dagens terskler (teammedlem, eller lenken som lastet det opp).","en":"The plan from one scan with the corrections applied and the status computed with today's thresholds (team member, or the link that uploaded it).","method":"GET","path":"/talk/skann/{skann_id}","access":"public","effect":"read","mcp":"web","params":{"type":"object","properties":{"skann_id":{"type":"string"},"t":{"type":"string"}},"required":["skann_id"]},"status":"live","server":"web","returns":"{ok, id, etasjer, gronne, antall, rettinger, farger}","description":"The plan from one scan with the corrections applied and the status computed with today's thresholds (team member, or the link that uploaded it). [open, no login] — NO: Planen fra ett skann med rettingene lagt inn og statusen regnet med dagens terskler (teammedlem, eller lenken som lastet det opp).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"skann_id":{"type":"string"},"t":{"type":"string"}},"required":["skann_id"]}},{"name":"talk_skann_veggbilde","cat":"konto","no":"Fargebilde rett inn mot én vegg fra skannet (ortofoto 1 cm/piksel, 8 cm bak til 0,9 m foran flaten, nærmeste punkt øverst): key = «<etasje>-<rom>-<vegg>», lenken står i vegg.bilde i planen. Samme tilgang som talk_skann_get.","en":"Colour image straight at one wall from the scan (orthophoto 1 cm/pixel, 8 cm behind to 0.9 m in front of the surface, nearest point on top): key = «<floor>-<room>-<wall>», the link is wall.bilde in the plan. Same access as talk_skann_get.","method":"GET","path":"/talk/skann/{skann_id}/vegg/{key}.png","access":"public","effect":"read","params":{"type":"object","properties":{"skann_id":{"type":"string"},"key":{"type":"string"},"t":{"type":"string"}},"required":["skann_id","key"]},"status":"live","server":"web","description":"Colour image straight at one wall from the scan (orthophoto 1 cm/pixel, 8 cm behind to 0.9 m in front of the surface, nearest point on top): key = «<floor>-<room>-<wall>», the link is wall.bilde in the plan. Same access as talk_skann_get. [open, no login] — NO: Fargebilde rett inn mot én vegg fra skannet (ortofoto 1 cm/piksel, 8 cm bak til 0,9 m foran flaten, nærmeste punkt øverst): key = «<etasje>-<rom>-<vegg>», lenken står i vegg.bilde i planen. Samme tilgang som talk_skann_get.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"skann_id":{"type":"string"},"key":{"type":"string"},"t":{"type":"string"}},"required":["skann_id","key"]}},{"name":"talk_skann_retting","cat":"konto","no":"Rett ett mål med laser: {etasje, rom, vegg, lengde_m} (naboveggene flyttes parallelt, de andre veggene minst mulig) eller {etasje, rom, takhoyde_m}, eller en åpning (vindu/dør): {etasje, rom, apning, bredde_m, hoyde_m, fra_hjorne_m, over_gulv_m} eller {…, apning, fjern: true} (ikke en åpning). Åpningen er grønn når bredde og høyde er målt. lengde_m = 0/null fjerner laser-målet. Lagres som logg (hvem, når, fra, til) så tolken kan lære.","en":"Correct one measure with a laser: {etasje, rom, vegg, lengde_m} (the neighbouring walls move parallel, the others as little as possible) or {etasje, rom, takhoyde_m}, or an opening (window/door): {etasje, rom, apning, bredde_m, hoyde_m, fra_hjorne_m, over_gulv_m} or {…, apning, fjern: true} (not an opening). An opening is green once width and height are measured. lengde_m = 0/null removes the laser value. Logged (who, when, from, to) so the interpreter can learn.","method":"POST","path":"/talk/skann/{skann_id}/retting","access":"public","effect":"write","mcp":"web","params":{"type":"object","properties":{"skann_id":{"type":"string"},"etasje":{"type":"integer"},"rom":{"type":"string"},"vegg":{"type":"string"},"lengde_m":{"type":"number"},"takhoyde_m":{"type":"number"},"apning":{"type":"string"},"bredde_m":{"type":"number"},"hoyde_m":{"type":"number"},"fra_hjorne_m":{"type":"number"},"over_gulv_m":{"type":"number"},"fjern":{"type":"boolean"}},"required":["skann_id","rom"]},"example":{"skann_id":"a1b2c3","etasje":0,"rom":"R1","vegg":"V2","lengde_m":3.27},"status":"live","server":"web","returns":"{ok, …plan}","description":"Correct one measure with a laser: {etasje, rom, vegg, lengde_m} (the neighbouring walls move parallel, the others as little as possible) or {etasje, rom, takhoyde_m}, or an opening (window/door): {etasje, rom, apning, bredde_m, hoyde_m, fra_hjorne_m, over_gulv_m} or {…, apning, fjern: true} (not an opening). An opening is green once width and height are measured. lengde_m = 0/null removes the laser value. Logged (who, when, from, to) so the interpreter can learn. [open, no login] — NO: Rett ett mål med laser: {etasje, rom, vegg, lengde_m} (naboveggene flyttes parallelt, de andre veggene minst mulig) eller {etasje, rom, takhoyde_m}, eller en åpning (vindu/dør): {etasje, rom, apning, bredde_m, hoyde_m, fra_hjorne_m, over_gulv_m} eller {…, apning, fjern: true} (ikke en åpning). Åpningen er grønn når bredde og høyde er målt. lengde_m = 0/null fjerner laser-målet. Lagres som logg (hvem, når, fra, til) så tolken kan lære.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"skann_id":{"type":"string"},"etasje":{"type":"integer"},"rom":{"type":"string"},"vegg":{"type":"string"},"lengde_m":{"type":"number"},"takhoyde_m":{"type":"number"},"apning":{"type":"string"},"bredde_m":{"type":"number"},"hoyde_m":{"type":"number"},"fra_hjorne_m":{"type":"number"},"over_gulv_m":{"type":"number"},"fjern":{"type":"boolean"}},"required":["skann_id","rom"]}},{"name":"talk_skann_modell","cat":"konto","no":"Lag modell fra skann: den godkjente skannplanen (med laser-rettingene) blir et NYTT Dibrix-prosjekt i teamet, lagret som en ny versjon (aldri overskriving). Innervegger fra to flater (tykkelse = avstanden, senterlinje midt mellom), yttervegger som lukket ring med antatt tykkelse (oransje til den er rettet), dekke per etasje, rom med navn og areal, vinduer og dører på riktig vegg (laser-mål = grønn, ellers standardmål og rød «bekreft mål»), trapp og sanitær fra skyen (infrastruktur=true). fra_sky (standard true, T-1699): bygg via spec_fra_sky fra råskann (vegger/etasjer/åpninger/rom); false = skannplan; kun_utside for fasade. Status rød/oransje/grønn står i Objektinfo; retter du målet i modellen, blir den grønn. Svarer prosjektet, økta, versjonen, BRA/BTA/BYA og antall per status. Innstillinger: skann.modell.* (get_prefs). Bare innlogget teammedlem.","en":"Make a model from a scan: the approved scan plan (with the laser corrections) becomes a NEW Dibrix project in the team, saved as a new version (never an overwrite). Interior walls from two faces (thickness = the distance, centre line between), exterior walls as a closed ring with an assumed thickness (orange until corrected), a slab per storey, named rooms with area, windows and doors on the right wall (laser measure = green, else standard size and red «confirm the measure»), stair and sanitary fixtures from the cloud (infrastruktur=true). fra_sky (default true, T-1699): build via spec_fra_sky from the raw scan (walls/storeys/openings/rooms); false = scan plan; kun_utside for façade. Status red/orange/green is in Entity Info; correcting the measure in the model turns it green. Answers the project, session, version, BRA/BTA/BYA and the count per status. Settings: skann.modell.* (get_prefs). Logged-in team member only.","method":"POST","path":"/talk/skann/{skann_id}/modell","access":"login","effect":"write","mcp":"web","params":{"type":"object","properties":{"skann_id":{"type":"string"},"navn":{"type":"string"},"infrastruktur":{"type":"boolean"},"folder":{"type":"string"},"fra_sky":{"type":"boolean"},"kun_utside":{"type":"boolean"}},"required":["skann_id"]},"example":{"skann_id":"a1b2c3","infrastruktur":true},"status":"live","server":"web","returns":"{ok, project_id, session_id, url, version, counts, status:{rod, oransje, gronn}, arealer:{bra, bta, bya, etasjer}, infrastruktur, sekunder}","level":"owner","description":"Make a model from a scan: the approved scan plan (with the laser corrections) becomes a NEW Dibrix project in the team, saved as a new version (never an overwrite). Interior walls from two faces (thickness = the distance, centre line between), exterior walls as a closed ring with an assumed thickness (orange until corrected), a slab per storey, named rooms with area, windows and doors on the right wall (laser measure = green, else standard size and red «confirm the measure»), stair and sanitary fixtures from the cloud (infrastruktur=true). fra_sky (default true, T-1699): build via spec_fra_sky from the raw scan (walls/storeys/openings/rooms); false = scan plan; kun_utside for façade. Status red/orange/green is in Entity Info; correcting the measure in the model turns it green. Answers the project, session, version, BRA/BTA/BYA and the count per status. Settings: skann.modell.* (get_prefs). Logged-in team member only. [logged in] — NO: Lag modell fra skann: den godkjente skannplanen (med laser-rettingene) blir et NYTT Dibrix-prosjekt i teamet, lagret som en ny versjon (aldri overskriving). Innervegger fra to flater (tykkelse = avstanden, senterlinje midt mellom), yttervegger som lukket ring med antatt tykkelse (oransje til den er rettet), dekke per etasje, rom med navn og areal, vinduer og dører på riktig vegg (laser-mål = grønn, ellers standardmål og rød «bekreft mål»), trapp og sanitær fra skyen (infrastruktur=true). fra_sky (standard true, T-1699): bygg via spec_fra_sky fra råskann (vegger/etasjer/åpninger/rom); false = skannplan; kun_utside for fasade. Status rød/oransje/grønn står i Objektinfo; retter du målet i modellen, blir den grønn. Svarer prosjektet, økta, versjonen, BRA/BTA/BYA og antall per status. Innstillinger: skann.modell.* (get_prefs). Bare innlogget teammedlem.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"skann_id":{"type":"string"},"navn":{"type":"string"},"infrastruktur":{"type":"boolean"},"folder":{"type":"string"},"fra_sky":{"type":"boolean"},"kun_utside":{"type":"boolean"}},"required":["skann_id"]}},{"name":"talk_link_create","cat":"konto","no":"Lag en hemmelig team-lenke til /talk (team_admin): team_id, label (hvem den er til), ttl_days (standard 90, høyst 365). Tokenet vises bare i svaret; serveren lagrer bare hashen. Lenken kan bare sende inn beskjeder.","en":"Make a secret team link to /talk (team admin): team_id, label (who it is for), ttl_days (default 90, at most 365). The token is only shown in the reply; the server stores only its hash. The link can only send messages.","method":"POST","path":"/talk/links","access":"login","effect":"account","mcp":"web","params":{"type":"object","properties":{"team_id":{"type":"string"},"label":{"type":"string"},"ttl_days":{"type":"integer"}},"required":["team_id"]},"example":{"team_id":"<team id>","label":"Plumber Hansen"},"status":"live","server":"web","returns":"{ok, link:{id, label, expires_at, active}, token, url}","level":"owner","description":"Make a secret team link to /talk (team admin): team_id, label (who it is for), ttl_days (default 90, at most 365). The token is only shown in the reply; the server stores only its hash. The link can only send messages. [logged in] — NO: Lag en hemmelig team-lenke til /talk (team_admin): team_id, label (hvem den er til), ttl_days (standard 90, høyst 365). Tokenet vises bare i svaret; serveren lagrer bare hashen. Lenken kan bare sende inn beskjeder.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"team_id":{"type":"string"},"label":{"type":"string"},"ttl_days":{"type":"integer"}},"required":["team_id"]}},{"name":"talk_link_list","cat":"konto","no":"Teamets /talk-lenker (team_admin), uten token.","en":"The team's /talk links (team admin), without tokens.","method":"GET","path":"/talk/links","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"team_id":{"type":"string"}},"required":["team_id"]},"status":"live","server":"web","returns":"{ok, links:[…]}","level":"owner","description":"The team's /talk links (team admin), without tokens. [logged in] — NO: Teamets /talk-lenker (team_admin), uten token.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"team_id":{"type":"string"}},"required":["team_id"]}},{"name":"talk_link_revoke","cat":"konto","no":"Trekk tilbake en /talk-lenke med en gang (team_admin).","en":"Revoke a /talk link at once (team admin).","method":"DELETE","path":"/talk/links/{lid}","access":"login","effect":"account","mcp":"web","params":{"type":"object","properties":{"lid":{"type":"string"}},"required":["lid"]},"status":"live","server":"web","returns":"{ok, link}","level":"owner","description":"Revoke a /talk link at once (team admin). [logged in] — NO: Trekk tilbake en /talk-lenke med en gang (team_admin).","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"lid":{"type":"string"}},"required":["lid"]}},{"name":"retolk_laering","cat":"konto","no":"Læringsdata for tolkebenken: rettingene brukerne har meldt til tolken (tekst uten navn og adresse, jobb-id, kategori: apninger, vegger, etasjer, terreng, tak, scener, annet) og antall per kategori. Bare systemadmin eller retolk-nøkkelen.","en":"Learning data for the interpretation bench: the corrections users reported to the interpreter (text without names or addresses, job id, category) and the count per category. System admin or the retolk key only.","method":"GET","path":"/retolk/laering","access":"login","effect":"read","params":{"type":"object","properties":{"limit":{"type":"integer"}}},"status":"live","server":"web","returns":"{ok, antall:{kategori: n}, kategorier, rader:[…]}","level":"owner","description":"Learning data for the interpretation bench: the corrections users reported to the interpreter (text without names or addresses, job id, category) and the count per category. System admin or the retolk key only. [logged in] — NO: Læringsdata for tolkebenken: rettingene brukerne har meldt til tolken (tekst uten navn og adresse, jobb-id, kategori: apninger, vegger, etasjer, terreng, tak, scener, annet) og antall per kategori. Bare systemadmin eller retolk-nøkkelen.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"limit":{"type":"integer"}}}},{"name":"intake_access","cat":"konto","no":"Min tilgang til KI-tolking av tegninger via Dibrix-maskinen (teamets Claude-abonnement): tillatt, grunn hvis ikke, dagsgrense og brukt siste døgn, testperiode, og hvilken leverandør «auto» gir meg.","en":"My access to AI drawing interpretation on the Dibrix machine (the team's Claude subscription): allowed, reason if not, daily limit and use in the last 24 h, test period, and the provider «auto» gives me.","method":"GET","path":"/intake/me/access","access":"login","effect":"read","status":"live","server":"web","returns":"{ok, access:{allowed, reason, daily_limit_pages, used_pages_24h, test_until}, auto_provider, payer}","level":"owner","description":"My access to AI drawing interpretation on the Dibrix machine (the team's Claude subscription): allowed, reason if not, daily limit and use in the last 24 h, test period, and the provider «auto» gives me. [logged in] — NO: Min tilgang til KI-tolking av tegninger via Dibrix-maskinen (teamets Claude-abonnement): tillatt, grunn hvis ikke, dagsgrense og brukt siste døgn, testperiode, og hvilken leverandør «auto» gir meg.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"intake_team_get","cat":"konto","no":"Teamets valg for KI-tolking via Dibrix-maskinen: hvem (intake.cli_members: owner|selected|all + selected_members), dagsgrense, tidsavbrudd, hvor lenge originalen ligger, testperiode (intake.test_until). Medlemmer kan lese.","en":"The team's choices for AI interpretation on the Dibrix machine: who (intake.cli_members: owner|selected|all + selected_members), daily limit, timeout, how long the original is kept, test period (intake.test_until). Members may read.","method":"GET","path":"/teams/{team_id}/intake","access":"login","effect":"read","params":{"type":"object","properties":{"team_id":{"type":"string"}},"required":["team_id"]},"status":"live","server":"web","returns":"{ok, settings, options, can_manage}","level":"owner","description":"The team's choices for AI interpretation on the Dibrix machine: who (intake.cli_members: owner|selected|all + selected_members), daily limit, timeout, how long the original is kept, test period (intake.test_until). Members may read. [logged in] — NO: Teamets valg for KI-tolking via Dibrix-maskinen: hvem (intake.cli_members: owner|selected|all + selected_members), dagsgrense, tidsavbrudd, hvor lenge originalen ligger, testperiode (intake.test_until). Medlemmer kan lese.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"team_id":{"type":"string"}},"required":["team_id"]}},{"name":"intake_team_set","cat":"konto","no":"Teameier/team_admin endrer valgene (bare valg fra listen i options). platform_enabled kan bare en systemadmin slå på. Krever innlogging, ikke en nøkkel.","en":"The team owner/admin changes the choices (only values from options). Only a system admin can turn platform_enabled on. Needs a login, not a key.","method":"PUT","path":"/teams/{team_id}/intake","access":"login","effect":"account","params":{"type":"object","properties":{"team_id":{"type":"string"}},"required":["team_id"]},"example":{"intake.cli_members":"selected","selected_members":["<user id>"],"intake.cli_daily_pages":60},"status":"live","server":"web","level":"owner","description":"The team owner/admin changes the choices (only values from options). Only a system admin can turn platform_enabled on. Needs a login, not a key. [logged in] — NO: Teameier/team_admin endrer valgene (bare valg fra listen i options). platform_enabled kan bare en systemadmin slå på. Krever innlogging, ikke en nøkkel.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"team_id":{"type":"string"}},"required":["team_id"]}},{"name":"intake_team_usage","cat":"konto","no":"Bruksoversikt for teameier siste 30 døgn: jobber, sider og siste tidspunkt per bruker. Bare tellere, ingen innhold.","en":"Usage overview for the team owner over the last 30 days: jobs, pages and last time per user. Counters only, no content.","method":"GET","path":"/teams/{team_id}/intake/usage","access":"login","effect":"read","params":{"type":"object","properties":{"team_id":{"type":"string"}},"required":["team_id"]},"status":"live","server":"web","returns":"{ok, users:[{user_id, name, jobs, pages, last_at}], total_jobs, total_pages}","level":"owner","description":"Usage overview for the team owner over the last 30 days: jobs, pages and last time per user. Counters only, no content. [logged in] — NO: Bruksoversikt for teameier siste 30 døgn: jobber, sider og siste tidspunkt per bruker. Bare tellere, ingen innhold.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"team_id":{"type":"string"}},"required":["team_id"]}},{"name":"intake_status","cat":"konto","no":"Synlig status for Dibrix-maskinen (Alt B): state (working|idle|offline|paused), sist sett, kø og anslått ventetid. Teameier/systemadmin får også arbeidere, siste jobber og et eierpanel per team (sider og kall per medlem mot dagsgrensen). Vanlige teammedlemmer får bare den korte statusen. Terskelen er innstillingen intake.offline_after_s.","en":"Visible status of the Dibrix machine (Alt B): state (working|idle|offline|paused), last seen, queue and estimated wait. Team owner / system admin also get workers, recent jobs and an owner panel per team (pages and calls per member against the daily limit). Ordinary team members get the short status only. The threshold is the setting intake.offline_after_s.","method":"GET","path":"/intake/status","access":"login","effect":"read","status":"live","server":"web","returns":"{ok, level, state, paused, active, last_seen, queue, in_progress, eta_s, workers?, recent?, teams?:[{team_id, name, usage}]}","level":"owner","description":"Visible status of the Dibrix machine (Alt B): state (working|idle|offline|paused), last seen, queue and estimated wait. Team owner / system admin also get workers, recent jobs and an owner panel per team (pages and calls per member against the daily limit). Ordinary team members get the short status only. The threshold is the setting intake.offline_after_s. [logged in] — NO: Synlig status for Dibrix-maskinen (Alt B): state (working|idle|offline|paused), sist sett, kø og anslått ventetid. Teameier/systemadmin får også arbeidere, siste jobber og et eierpanel per team (sider og kall per medlem mot dagsgrensen). Vanlige teammedlemmer får bare den korte statusen. Terskelen er innstillingen intake.offline_after_s.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{}}},{"name":"intake_agent_tool","cat":"konto","no":"Agent-tolk (innstillingen import.mode_agent): ett verktøykall fra Claude på Dibrix-maskinen mot en arbeidskopi av tolkingen (side/utsnitt, bygg, render, tellere, areal, leveringssjekk, maal, utkast, budsjett; «_list» gir listen). Bare med intake-nøkkel og bare for en agent-forespørsel som er utleid til arbeideren. Grenser: import.agent_max_tools, import.agent_max_heavy, import.agent_max_min; hvert kall logges på forespørselen.","en":"Agent interpreter (setting import.mode_agent): one tool call from Claude on the Dibrix machine against a working copy of the reading (page/cut-out, build, render, counters, area, delivery check, measures, draft, budget; «_list» gives the list). Intake key only, and only for an agent request leased to that worker. Limits: import.agent_max_tools, import.agent_max_heavy, import.agent_max_min; every call is logged on the request.","method":"POST","path":"/intake/{qid}/tool","access":"login","effect":"write","params":{"type":"object","properties":{"qid":{"type":"string"},"worker":{"type":"string"},"tool":{"type":"string"},"args":{"type":"object"}},"required":["qid","worker","tool"]},"status":"live","server":"web","returns":"{ok, text, image?, media_type?, code?, budsjett:{verktoykall, tunge_kall, minutter}}","level":"owner","description":"Agent interpreter (setting import.mode_agent): one tool call from Claude on the Dibrix machine against a working copy of the reading (page/cut-out, build, render, counters, area, delivery check, measures, draft, budget; «_list» gives the list). Intake key only, and only for an agent request leased to that worker. Limits: import.agent_max_tools, import.agent_max_heavy, import.agent_max_min; every call is logged on the request. [logged in] — NO: Agent-tolk (innstillingen import.mode_agent): ett verktøykall fra Claude på Dibrix-maskinen mot en arbeidskopi av tolkingen (side/utsnitt, bygg, render, tellere, areal, leveringssjekk, maal, utkast, budsjett; «_list» gir listen). Bare med intake-nøkkel og bare for en agent-forespørsel som er utleid til arbeideren. Grenser: import.agent_max_tools, import.agent_max_heavy, import.agent_max_min; hvert kall logges på forespørselen.","category_label":"Konto og prosjekt","input_schema":{"type":"object","properties":{"qid":{"type":"string"},"worker":{"type":"string"},"tool":{"type":"string"},"args":{"type":"object"}},"required":["qid","worker","tool"]}},{"name":"ops_errors","cat":"drift","no":"Feilgrupper fra nettleser, Skall og serverens egne 500-feil: fingeravtrykk, antall, første/siste gang, rev, rute, stakk, siste handlinger. Alt er renset (ingen e-post, nøkler, modellinnhold). Bare systemadmin (innlogget) eller X-Ops-Token; aldri med API-nøkkel.","en":"Error groups from browser, Shell and the server's own 500s: fingerprint, count, first/last seen, rev, route, stack, last actions. All scrubbed (no e-mail, keys, model content). System admin (logged in) or X-Ops-Token only; never with an API key.","method":"GET","path":"/ops/errors","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"limit":{"type":"integer"},"hours":{"type":"number"},"source":{"type":"string"},"rev":{"type":"string"}}},"status":"live","server":"web","returns":"{groups:[{fp, kind, source, message, stack, route, count, first, last, revs, bundles, anon, crumbs}], n, total_count}","level":"owner","description":"Error groups from browser, Shell and the server's own 500s: fingerprint, count, first/last seen, rev, route, stack, last actions. All scrubbed (no e-mail, keys, model content). System admin (logged in) or X-Ops-Token only; never with an API key. [logged in] — NO: Feilgrupper fra nettleser, Skall og serverens egne 500-feil: fingeravtrykk, antall, første/siste gang, rev, rute, stakk, siste handlinger. Alt er renset (ingen e-post, nøkler, modellinnhold). Bare systemadmin (innlogget) eller X-Ops-Token; aldri med API-nøkkel.","category_label":"Drift og feilsøking (bare systemadmin)","input_schema":{"type":"object","properties":{"limit":{"type":"integer"},"hours":{"type":"number"},"source":{"type":"string"},"rev":{"type":"string"}}}},{"name":"ops_input_log","cat":"drift","no":"Inndata-opptak fra nettlesere med opptak på (?debug=input eller innstillingen debug.input_log): per anonym fane trykk, pekertype, hjul, valg-treff, scenebytter med siste inndata før (årsaken), lag og visning. Renset, ingen tekst eller modellinnhold. Bare systemadmin eller X-Ops-Token.","en":"Input recordings from browsers with recording on (?debug=input or the setting debug.input_log): per anonymous tab the presses, pointer type, wheel, pick hits, scene switches with the last input before them (the cause), layers and view mode. Scrubbed, no text or model content. System admin or X-Ops-Token only.","method":"GET","path":"/ops/input-log","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"limit":{"type":"integer"},"events":{"type":"integer"},"sid":{"type":"string"}}},"status":"live","server":"web","returns":"{tabs:[{sid, ua, screen, rev, first, last, n_events, events:[[ms, text]]}]}","level":"read","description":"Input recordings from browsers with recording on (?debug=input or the setting debug.input_log): per anonymous tab the presses, pointer type, wheel, pick hits, scene switches with the last input before them (the cause), layers and view mode. Scrubbed, no text or model content. System admin or X-Ops-Token only. [logged in] — NO: Inndata-opptak fra nettlesere med opptak på (?debug=input eller innstillingen debug.input_log): per anonym fane trykk, pekertype, hjul, valg-treff, scenebytter med siste inndata før (årsaken), lag og visning. Renset, ingen tekst eller modellinnhold. Bare systemadmin eller X-Ops-Token.","category_label":"Drift og feilsøking (bare systemadmin)","input_schema":{"type":"object","properties":{"limit":{"type":"integer"},"events":{"type":"integer"},"sid":{"type":"string"}}}},{"name":"recording_timeline","cat":"drift","no":"Opptak for feilsøking per bruker i et tidsvindu: fanene (økt, nettleser, skjerm, modus) og én tidslinje der inndata (klikk, trykk, tekst i Dibrix-felt med etikett, pause/fortsetter), BuildChat-meldinger, øktenes operasjonsjournal, feilgrupper fra de samme fanene, importjobbenes hendelser og WARNING/ERROR fra dibrix-web.log er flettet. user = bruker-id eller e-post (tom = alle), since/until = ISO, epoch eller relativt (2h, 30m, 1d; standard siste døgn, maks 7 døgn), sources = kommaliste input,buildchat,oplog,error,job,log. Maskert (e-post, telefon, nøkler). Bare systemadmin eller X-Ops-Token.","en":"Troubleshooting recordings per user in a time window: the tabs (session, browser, screen, mode) and one timeline merging input (clicks, taps, text in Dibrix fields with label, pause/resume), BuildChat messages, the sessions' operation journal, error groups from the same tabs, import job events and WARNING/ERROR from dibrix-web.log. user = user id or e-mail (empty = all), since/until = ISO, epoch or relative (2h, 30m, 1d; default the last day, at most 7 days), sources = comma list input,buildchat,oplog,error,job,log. Masked (e-mail, phone, keys). System admin or X-Ops-Token only.","method":"GET","path":"/ops/recordings","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"user":{"type":"string"},"since":{"type":"string"},"until":{"type":"string"},"limit":{"type":"integer"},"sources":{"type":"string"}}},"status":"live","server":"web","returns":"{user, since, until, recordings:[{user, session, tab, ua, screen, mode, first, last, n_events, bytes}], sessions, n, total, truncated, timeline:[{t, at, source, text, session?, tab?}]}","level":"read","description":"Troubleshooting recordings per user in a time window: the tabs (session, browser, screen, mode) and one timeline merging input (clicks, taps, text in Dibrix fields with label, pause/resume), BuildChat messages, the sessions' operation journal, error groups from the same tabs, import job events and WARNING/ERROR from dibrix-web.log. user = user id or e-mail (empty = all), since/until = ISO, epoch or relative (2h, 30m, 1d; default the last day, at most 7 days), sources = comma list input,buildchat,oplog,error,job,log. Masked (e-mail, phone, keys). System admin or X-Ops-Token only. [logged in] — NO: Opptak for feilsøking per bruker i et tidsvindu: fanene (økt, nettleser, skjerm, modus) og én tidslinje der inndata (klikk, trykk, tekst i Dibrix-felt med etikett, pause/fortsetter), BuildChat-meldinger, øktenes operasjonsjournal, feilgrupper fra de samme fanene, importjobbenes hendelser og WARNING/ERROR fra dibrix-web.log er flettet. user = bruker-id eller e-post (tom = alle), since/until = ISO, epoch eller relativt (2h, 30m, 1d; standard siste døgn, maks 7 døgn), sources = kommaliste input,buildchat,oplog,error,job,log. Maskert (e-post, telefon, nøkler). Bare systemadmin eller X-Ops-Token.","category_label":"Drift og feilsøking (bare systemadmin)","input_schema":{"type":"object","properties":{"user":{"type":"string"},"since":{"type":"string"},"until":{"type":"string"},"limit":{"type":"integer"},"sources":{"type":"string"}}}},{"name":"client_input","cat":"drift","no":"Nettleseren sender en bunke opptakslinjer (bare når inndata-opptak er slått på). Åpen, begrenset og renset.","en":"The browser sends a batch of recording lines (only with input recording on). Open, rate-limited and scrubbed.","method":"POST","path":"/client-input","access":"public","effect":"write","params":{"type":"object","properties":{"sid":{"type":"string"},"ua":{"type":"string"},"bundle":{"type":"string"},"screen":{"type":"object"},"events":{"type":"array"}}},"status":"live","server":"web","returns":"{ok, n, total}","description":"The browser sends a batch of recording lines (only with input recording on). Open, rate-limited and scrubbed. [open, no login] — NO: Nettleseren sender en bunke opptakslinjer (bare når inndata-opptak er slått på). Åpen, begrenset og renset.","category_label":"Drift og feilsøking (bare systemadmin)","input_schema":{"type":"object","properties":{"sid":{"type":"string"},"ua":{"type":"string"},"bundle":{"type":"string"},"screen":{"type":"object"},"events":{"type":"array"}}}},{"name":"ops_logs","cat":"drift","no":"Siste linjer av dibrix-web.log, maskert (e-post, nøkler, lange id-er, IP, URL-spørring). lines (maks 1000), q = tekstsøk, level = WARNING|ERROR, file 0-3 = roterte filer. Bare systemadmin eller X-Ops-Token.","en":"Last lines of dibrix-web.log, masked (e-mail, keys, long ids, IP, URL query). lines (max 1000), q = text search, level = WARNING|ERROR, file 0-3 = rotated files. System admin or X-Ops-Token only.","method":"GET","path":"/ops/logs","access":"login","effect":"read","mcp":"web","params":{"type":"object","properties":{"lines":{"type":"integer"},"q":{"type":"string"},"level":{"type":"string"},"file":{"type":"integer"}}},"status":"live","server":"web","returns":"{file, exists, n, lines:[str]}","level":"owner","description":"Last lines of dibrix-web.log, masked (e-mail, keys, long ids, IP, URL query). lines (max 1000), q = text search, level = WARNING|ERROR, file 0-3 = rotated files. System admin or X-Ops-Token only. [logged in] — NO: Siste linjer av dibrix-web.log, maskert (e-post, nøkler, lange id-er, IP, URL-spørring). lines (maks 1000), q = tekstsøk, level = WARNING|ERROR, file 0-3 = roterte filer. Bare systemadmin eller X-Ops-Token.","category_label":"Drift og feilsøking (bare systemadmin)","input_schema":{"type":"object","properties":{"lines":{"type":"integer"},"q":{"type":"string"},"level":{"type":"string"},"file":{"type":"integer"}}}},{"name":"ops_status","cat":"drift","no":"Serverstatus nå: rev, oppetid, økter, minne, disk, alder på siste sikkerhetskopi, loggstørrelse, feil siste døgn. Bare systemadmin eller X-Ops-Token.","en":"Server status now: rev, uptime, sessions, memory, disk, age of the newest backup, log size, errors in the last 24 h. System admin or X-Ops-Token only.","method":"GET","path":"/ops/status","access":"login","effect":"read","mcp":"web","status":"live","server":"web","returns":"{rev, uptime_h, sessions, rss_mb, disk, backup:{found, newest, age_h}, log, errors_24h:{groups, reports, new}}","level":"owner","description":"Server status now: rev, uptime, sessions, memory, disk, age of the newest backup, log size, errors in the last 24 h. System admin or X-Ops-Token only. [logged in] — NO: Serverstatus nå: rev, oppetid, økter, minne, disk, alder på siste sikkerhetskopi, loggstørrelse, feil siste døgn. Bare systemadmin eller X-Ops-Token.","category_label":"Drift og feilsøking (bare systemadmin)","input_schema":{"type":"object","properties":{}}},{"name":"session_oplog","cat":"drift","no":"Journal over de siste skrivende operasjonene i økta (renset: ingen hemmeligheter, ingen lange tekster). Spill dem mot en ny økt med scripts/replay_oplog.py for å gjenskape en feil.","en":"Journal of the session's last writing operations (scrubbed: no secrets, no long texts). Replay them on a new session with scripts/replay_oplog.py to reproduce a fault.","method":"GET","path":"/sessions/{sid}/oplog","access":"share","effect":"read","mcp":"web","params":{"type":"object","properties":{"limit":{"type":"number"},"sid":{"type":"string"}}},"status":"live","server":"web","returns":"{ok, n, ops:[{seq, t, method, route, query, body, status, ms, error?}]}","level":"read","description":"Journal of the session's last writing operations (scrubbed: no secrets, no long texts). Replay them on a new session with scripts/replay_oplog.py to reproduce a fault. [logged in: owner, admin, project editor — or a wr_ key (?share=) ON TOP OF login/dk_] — NO: Journal over de siste skrivende operasjonene i økta (renset: ingen hemmeligheter, ingen lange tekster). Spill dem mot en ny økt med scripts/replay_oplog.py for å gjenskape en feil.","category_label":"Drift og feilsøking (bare systemadmin)","input_schema":{"type":"object","properties":{"limit":{"type":"number"},"sid":{"type":"string"}}}}],"mcp":{"web":{"name":"dibrix-web","package":"https://draw.dibrix.com/agent/dibrix-web-mcp.zip","install":"pip install https://draw.dibrix.com/agent/dibrix-web-mcp.zip","run_stdio":"python -m dibrix_web_mcp --transport stdio","https_url":null,"https_auth":"Authorization: Bearer <MCP_API_TOKEN> (set by the host)","stdio_auth":"none (do not attach OAuth for stdio)","env":{"DIBRIX_WEB_URL":"https://draw.dibrix.com","DIBRIX_API_KEY":"<dk_… from Account → API keys, optional>","DIBRIX_EMAIL":"<optional>","DIBRIX_PASSWORD":"<optional>","DIBRIX_SESSION_ID":"<optional>","DIBRIX_SHARE":"<optional>"},"tools":["list_recipes","get_recipe","bind_session","create_session","create_share_link","unshare_session","sandbox_session","get_spec_schema","build_house_from_spec","get_house_spec","list_anchors","add_anchor","edit_anchor","delete_anchor","check_anchors","list_photos","add_photo","set_photo_pose","link_photo","get_photo_image","list_tasks","get_task","create_task","add_task_part","add_clarification","log_correction","propose_rule","list_rules","get_georef","set_georef","fit_georef","check_plan_constraints","delivery_check","accept_delivery_finding","auto_fix_delivery_finding","configurator_link_to_spec","open_configurator_link","list_phases","create_phase","set_phase","delete_phase","add_phase_presets","assign_phase","set_phase_visibility","plan_summary","plan_tasks","set_task","delete_task","suggest_plan","set_plan_settings","plan_visible_at","plan_timeline","set_plan_date","plan_snapshot","cost_summary","compare_cost","mark_all_existing","show_phases_only","rehab_summary","rehab_report","set_work_item","delete_work_item","set_performer","set_goods_item","delete_goods_item","set_pricelist","list_punktsky","punktsky_stotte","delete_punktsky","list_baselines","set_municipal_baseline","baseline_changes","mark_phases_from_baseline","punktsky_infrastruktur","bekreft_skann_funn","find_component","insert_component","share_link","list_share_links","revoke_share","view_open","save_version","list_versions","open_info","get_version","version_spec","compare_versions","approve_version","mark_as_built","set_version_status","approved_overview","restore_version","sandbox_release","inspect","plan_build","list_entities","get_entity","select_entities","render","render_index","geometry_rules","geometry_rules_update","scene_summary","set_camera","compare","set_layers","list_tags","create_tag","session_status","draw_walls","draw_rectangle","heal_problems","rebuild_entity","list_rooms","edit_room","rebuild_rooms","set_terrace_shed","fit_slab_to_walls","delete_entities","clear_model","batch","place_opening","add_slab","slab_from_walls","slab_from_walls_status","heal_slab","add_roof","heal_roof","join_roofs_as_t","list_roof_finishes","set_roof_finish","set_storeys","tag_by_storey","stair_in_shape","detect_rooms","measure_areas","list_sections","create_section","edit_section","move_section","suggest_section_position","rename_scene","edit_opening","move_walls","edit_sheet_viewport","element_props","set_element_props","control_measure","get_terrain","set_terrain","fill_terrain_pit","move_dimension","set_dimension_extension","add_dimension","resuggest_dimensions","check_sheet_dimensions","fix_sheet_dimensions","regenerate_sheet_dimensions","add_sheet_text","list_scenes","list_sheets","list_layout_profiles","save_layout_profile","delete_layout_profile","extract_vector_logo","seed_layout_profile_from_pdf","apply_layout_profile","set_sheet_chrome","set_sheet_overlays","edit_north_arrow","set_sheet_page_layers","set_sheet_annotations","edit_sheet_shape","edit_viewport","list_drawings","add_scene","set_scene_camera","frame_scene","delete_scene","set_scene_discipline","delete_scenes","add_discipline","remove_discipline","add_sheet","delete_sheet","add_page","delete_page","add_sheet_set","rename_page","set_page_number","move_page","copy_page","set_page_paper","set_view_scene","set_scene_openings","set_scene_layers","configurator_link","get_plan","get_plan_svg","get_style","list_styles","set_style","get_style_mood","set_style_mood","adjust_style","reset_style_mood","style_from_image","list_style_rules","add_style_rule","remove_style_rule","add_style_legend","compliance","sandbox_compliance","public_compliance","energy_envelope","energy_report","export_energi_xlsx","public_catalog","public_quote","public_quote_get","public_compliance_get","public_validate","sandbox_load_drawing","sandbox_get_drawing","sandbox_price","session_price","export_ifc","export_sheets_pdf","list_approved_drawings","list_sources","import_approved_drawings","update_approved_drawing","calibrate_approved_drawing","delete_approved_drawing","import_drawings_job","import_drawings_upload","import_drawings_vector","get_import_vector","get_import_vector_spec","get_import_vector_control","list_import_jobs","get_import_job","tolk_status","tolk_scale_from_known","import_drawings_capabilities","edit_import_pages","confirm_import_job","retry_import_ai","apply_import_job","cancel_import_job","retry_import_job","rerun_import_job","add_import_files","add_import_files_upload","rename_import_job","import_storage","project_storage","list_conversions","project_conversions","conversion_action","conversion_archive","conversion_unarchive","conversion_pages","conversion_edit_pages","conversion_guides","conversion_guide_action","conversion_findings","conversion_finding_action","conversion_north","undo","redo","login","logout","whoami","list_prefs","get_prefs","set_prefs","key_info","key_open","api_keys_list","api_key_revoke","list_teams","set_project_team","list_projects","create_project","save_project","save_into_project","set_project_folder","utkast_status","utkast_verktoy","build_chat_smart","build_chat_status","build_chat_clear","facade_photo_families","facade_photo_rectify","facade_photo_measure","facade_photo_suggest","facade_photo_spec","report_to_developer","request_capability","get_capability_request","list_developer_messages","close_developer_message","talk_messages","talk_drafts","talk_draft_finish","talk_skann_list","talk_skann_get","talk_skann_retting","talk_skann_modell","talk_link_create","talk_link_list","talk_link_revoke","ops_errors","ops_input_log","recording_timeline","ops_logs","ops_status","session_oplog"],"mcp_json":{"web_stdio":{"mcpServers":{"dibrix-web":{"command":"python","args":["-m","dibrix_web_mcp","--transport","stdio"],"env":{"DIBRIX_WEB_URL":"https://draw.dibrix.com","MCP_ALLOW_INSECURE":"1"}}}}}}},"build_chat":{"prefix":"https://draw.dibrix.com/sessions/{sid}/build-chat","routes":["POST ''","GET /status","POST /stop","POST /clear"],"use_when":"Photos / vague furniture; finish geometry with the agent API."},"stance":["inspect","plan","act","verify"],"markdown_url":"https://draw.dibrix.com/agent"}