pi-revit 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +394 -351
  2. package/README.md +438 -25
  3. package/bin/pi-revit.js +3 -5
  4. package/extensions/pi-revit/index.ts +151 -92
  5. package/extensions/pi-revit/instance-router.ts +86 -0
  6. package/extensions/pi-revit/script-library.ts +146 -0
  7. package/extensions/pi-revit/tool-catalog.ts +67 -0
  8. package/package.json +58 -57
  9. package/scripts/build.ps1 +9 -3
  10. package/scripts/check-sdk.ps1 +66 -0
  11. package/scripts/deploy.ps1 +16 -4
  12. package/skills/pi-revit/SKILL.md +181 -17
  13. package/skills/pi-revit/references/model-audit-export.md +29 -0
  14. package/skills/pi-revit/references/room-documentation.md +28 -0
  15. package/src/Revit/BridgeServer.cs +79 -29
  16. package/src/Revit/OperationStore.cs +178 -0
  17. package/src/Revit/ToolRegistry.cs +26 -4
  18. package/src/Revit/Tools/CaptureView.cs +2 -1
  19. package/src/Revit/Tools/ChangeElementTypes.cs +60 -0
  20. package/src/Revit/Tools/CreateTags.cs +95 -0
  21. package/src/Revit/Tools/DeleteElements.cs +44 -0
  22. package/src/Revit/Tools/DocumentGuard.cs +2 -2
  23. package/src/Revit/Tools/ElementQueryScope.cs +27 -0
  24. package/src/Revit/Tools/ExecuteCsharp.cs +23 -13
  25. package/src/Revit/Tools/ExportDocuments.cs +2 -1
  26. package/src/Revit/Tools/GetElementDetails.cs +32 -2
  27. package/src/Revit/Tools/GetElementRelationships.cs +76 -0
  28. package/src/Revit/Tools/GetElements.cs +21 -7
  29. package/src/Revit/Tools/GetLinkedElements.cs +82 -0
  30. package/src/Revit/Tools/GetLinkedModels.cs +66 -0
  31. package/src/Revit/Tools/GetModelCoordinates.cs +49 -0
  32. package/src/Revit/Tools/GetScheduleFields.cs +37 -0
  33. package/src/Revit/Tools/GetSchedules.cs +89 -0
  34. package/src/Revit/Tools/ManageElementSets.cs +106 -0
  35. package/src/Revit/Tools/ManageSchedules.cs +164 -0
  36. package/src/Revit/Tools/ManageSelection.cs +2 -1
  37. package/src/Revit/Tools/ManageSheetPlacements.cs +97 -0
  38. package/src/Revit/Tools/ManageSheets.cs +63 -0
  39. package/src/Revit/Tools/ManageViews.cs +100 -0
  40. package/src/Revit/Tools/MeasureGeometry.cs +54 -0
  41. package/src/Revit/Tools/ModelEditBatch.cs +102 -0
  42. package/src/Revit/Tools/ModelEditInputs.cs +49 -0
  43. package/src/Revit/Tools/OpenView.cs +2 -1
  44. package/src/Revit/Tools/QuerySpatialElements.cs +63 -0
  45. package/src/Revit/Tools/SetParameters.cs +43 -93
  46. package/src/Revit/Tools/SpatialBounds.cs +30 -0
  47. package/src/Revit/Tools/SummarizeElements.cs +87 -0
  48. package/src/Revit/Tools/TransformElements.cs +58 -0
package/CHANGELOG.md CHANGED
@@ -1,12 +1,55 @@
1
- # Changelog
2
-
3
- All notable changes to pi-revit are documented here.
4
- Format follows [Keep a Changelog](https://keepachangelog.com/); version headers use
5
- `## [x.y.z] - YYYY-MM-DD` so tooling (and Pi's changelog parser format) can read them.
6
-
7
- Every published version gets an entry with **Added** / **Changed** / **Fixed** sections
1
+ # Changelog
2
+
3
+ All notable changes to pi-revit are documented here.
4
+ Format follows [Keep a Changelog](https://keepachangelog.com/); version headers use
5
+ `## [x.y.z] - YYYY-MM-DD` so tooling (and Pi's changelog parser format) can read them.
6
+
7
+ Every published version gets an entry with **Added** / **Changed** / **Fixed** sections
8
8
  describing what the user will notice — not internal refactors.
9
9
 
10
+ ## [0.4.0] - 2026-09-22
11
+
12
+ ### Added
13
+
14
+ - Linked-model discovery and filtered linked-element queries with exact linked document identities and host-coordinate bounds.
15
+ - Schedule inspection with independent row and column pagination, and element relationship inspection.
16
+ - `find_revit_tools` searches and activates specialist tools within the current Pi session while preserving other extensions' active tools.
17
+ - `get_elements` can include up to 20 requested parameter identities per element, with optional type parameters and explicit missing or ambiguous matches. Raw values and formatted display values are returned separately.
18
+ - `summarize_elements` counts the whole query scope by category, type, level, or exact raw parameter value, with independently paginated groups and a 10,000-element limit.
19
+ - `manage_element_sets` retains query membership for repeat reads of current values and reports missing members. Sets are limited to 10,000 members and 32 retained sets, expire after 30 minutes, and belong to the exact open document and bridge session.
20
+ - `get_revit_operation` reads operation receipts without waiting for Revit's model thread. Supporting bridges automatically track native tool calls; retrying with the same `_operation_id` and identical arguments does not repeat the action. Full results are bounded to 128 completed receipts / 32 MiB, while up to 10,000 receipt records keep IDs reserved for that bridge session. Restarting the bridge clears receipts; an unknown outcome must be checked against the original model.
21
+ - `transform_elements` moves, copies, or rotates up to 200 selected elements together, with explicit input units, document-internal coordinates, and preview rollback. IDs created during previews are temporary.
22
+ - `delete_elements` previews or performs a whole-selection deletion and returns Revit's deletion set, including dependents. An optional `expected_deleted_ids` check rejects changed deletion membership; cascades above 10,000 IDs roll back.
23
+ - `change_element_types` validates up to 200 target/type pairs with per-target outcomes, optional atomic rollback, and previews. Results identify replacement elements; replacement IDs from rolled-back operations must not be reused.
24
+ - `manage_revit_instances` lists reachable local bridge sessions and selects a target for the current Pi session. Each current bridge has its own discovery file; legacy discovery and opaque selectors remain supported. The first sole instance binds automatically, while multiple instances require explicit selection. Selection refreshes the tool catalogue; read a fresh model overview afterward.
25
+ - `manage_views` creates plans, isometric 3D views, and sections, or duplicates and updates views, with compatible templates, scale checks, and previews. Sections use explicit units and document-internal coordinates.
26
+ - `manage_sheets` creates, renames, or renumbers sheets, with an optional loaded titleblock at creation and preview rollback.
27
+ - `manage_sheet_placements` lists, places, and moves viewports or schedule instances using paper-space coordinates. Viewport positions exclude labels; schedule positions are insertion points. Edits support previews with temporary created IDs, and every action, including listing, requires an exact document identity.
28
+ - `get_schedule_fields` discovers eligible parameter/type pairs for regular schedules. `manage_schedules` creates or configures schedules with field headings, visibility, widths, itemization, sorting, and typed filters, including explicit units for measured numeric filters and preview rollback.
29
+ - `create_tags` creates host element, room, space, or area tags with explicit tag-head positions, loaded tag types, partial or atomic batches, and preview rollback. Proposed tag IDs are temporary.
30
+ - `query_spatial_elements` finds host elements by axis-aligned bounding-box intersection or containment in an explicitly sized region, with whole-scope candidate limits, paging, and missing-box counts.
31
+ - `measure_geometry` measures exact distance between supplied points or approximate separation between host-element bounding boxes, with explicit units and an optional box-proximity threshold. Box overlap and threshold hits are not confirmed clashes or clearance failures.
32
+ - Pi skill references provide room-documentation and model-audit/export workflows using native tools, previews, exact identities, and recorded output paths.
33
+ - `manage_revit_scripts` saves immutable local script definitions without executing them, reads source, and runs an exact content-hash version with required named inputs. Local history records the version, document, input hash, and operation receipt without retaining raw inputs or results. Runs use the existing unrestricted script execution contract; no automatic runs or model saving are added.
34
+ - `get_model_coordinates` reads project/survey base points, site/project locations, and the active shared-coordinate mapping for explicit internal points. Length units are required; no GIS reference system is inferred or coordinates changed.
35
+
36
+ ### Changed
37
+
38
+ - `set_parameters` supports `preview` and `atomic` batches, with a subtransaction for each update and observed per-step before/after values. Committed updates appear in `succeeded`; accepted steps that were rolled back appear in `proposed`. Preview attempts commit validation before rolling back its transaction group when the batch is eligible; `commit_validation_performed` reports whether those checks ran. Default batches still commit partial successes.
39
+ - A bound Revit session is no longer replaced implicitly after closing or restarting: list and select its new identity before further model calls. Operation receipt reads and identical retries continue to target their original bridge even when another instance is selected; unavailable originals are never redirected.
40
+ - `get_schedules` now includes field specifications, grid/sheet widths in feet, filtering capabilities, and current sort/filter rules. Numeric filter values are reported in Revit internal units.
41
+ - `execute_csharp` accepts structured JSON `inputs` as a separate `JsonElement` global, keeping input values separate from source code.
42
+
43
+ ### Fixed
44
+
45
+ - `manage_schedules` accepts the Count parameter/type pair returned by `get_schedule_fields`, while preserving Count creation without a parameter ID. Discovery and editing descriptions now document both supported forms.
46
+
47
+ ## [0.3.1] - 2026-09-16
48
+
49
+ ### Fixed
50
+
51
+ - The installer checks the selected .NET SDK before installing packages or building the add-in. Missing or older SDKs now produce a clear explanation, the matching Windows x64 SDK download link, and retry instructions. Interactive installs offer to open the download page. Manual builds and deployments also check the SDK before compiling.
52
+
10
53
  ## [0.3.0] - 2026-09-09
11
54
 
12
55
  ### Added
@@ -41,347 +84,347 @@ and start a fresh Pi session. Live verification covered bounded workflows on
41
84
  Revit 2025.4.3; Revit 2026/2027 were not tested for this release.
42
85
 
43
86
  ## [0.2.18] - 2026-08-21
44
-
45
- ### Fixed
46
- - When pi starts before Revit and the background rediscovery timer (rather than a `ping`
47
- call) registers the bridge tools, the session is now told — the same announcement the
48
- ping path has always given. Previously the tools appeared silently in the next system
49
- prompt while nothing contradicted the session's earlier "Revit is not running", so the
50
- agent could stay needlessly pessimistic. The note is queued for the next user prompt
51
- and never interrupts. Extension-only change; the Revit add-in is unchanged (the
52
- standard installer keeps both versions aligned).
53
-
54
- ## [0.2.17] - 2026-08-21
55
-
56
- ### Fixed
57
- - The bridge's no-document check no longer counts linked documents. With only links
58
- loaded, Revit does not pump the bridge's work queue, so a call could wait out its full
59
- timeout instead of failing immediately with the clean "no active document" answer.
60
-
61
- ### Changed
62
- - Docs and tool descriptions describe localized parameter names generically instead of
63
- quoting specific languages.
64
- - The full search_api_docs benchmark (641 live queries against RevitAPI.xml ground truth)
65
- was re-run on Revit 2025 at 0.2.16: 100% recall, 98.75% top-1 on exact names, 100%
66
- spacing-variant agreement, 0 false positives across 99 adversarial mutations, 50/50
67
- parameter docs, p50 10 ms -- no regression across the 0.2.13-0.2.16 search changes.
68
-
69
- Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
70
- restart Revit).
71
-
72
- ## [0.2.16] - 2026-08-21
73
-
74
- ### Fixed
75
- - `search_api_docs`: an accessor-spelling query combined with `kind: "method"` — e.g.
76
- `Element.get_Parameter(BuiltInParameter)` filtered to methods — returned "no matches",
77
- because the accessor rewrite found the documented member but the kind filter rejected it:
78
- a C# `get_X`/`set_X` accessor is a method to the caller, while the XML documents the
79
- underlying member as a property or indexer. For accessor-rewritten candidates the
80
- `method` filter now also admits properties, and the result note says so. Found by an
81
- agent under a stress test that filtered its doc query to methods. Two benchmark probes
82
- added (the widening plus a real-method control).
83
-
84
- Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
85
- restart Revit).
86
-
87
- ## [0.2.15] - 2026-08-21
88
-
89
- ### Fixed
90
- - `set_parameters`: the "parameter not found" error now mentions that display names are
91
- localized and points to the language-independent BuiltInParameter enum name — the same
92
- guidance `get_element_details` and `get_elements` already give. Previously it only
93
- suggested the type-parameter cause, which sent the caller down the wrong path in
94
- non-English UIs.
95
- - `get_elements`: the "filter parameter not found on any probed element" warning now
96
- appears only when the query returned zero matches — that is where it distinguishes
97
- "unknown parameter name" from "no matching elements". Next to real matches it was noise
98
- (an unscoped query's probe window can simply miss the elements that carry the parameter).
99
-
100
- Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
101
- restart Revit).
102
-
103
- ## [0.2.14] - 2026-08-21
104
-
105
- ### Fixed
106
- - `get_elements`: text filter rules now compare case-insensitively on the post-scan path,
107
- matching Revit's own collector rules (which ignore case -- verified empirically). The
108
- same string rule previously matched case-insensitively when it ran inside the collector
109
- but case-sensitively when it fell back to the per-element scan, so merely scoping a
110
- query could change its results.
111
- - `search_api_docs`: queries in C# accessor spelling -- `Element.get_Parameter(BuiltInParameter)`,
112
- `get_BoundingBox(View` -- now resolve to the documented property or indexer
113
- (`Element.Parameter`, `Element.BoundingBox`), with a note explaining the rewrite. Members
114
- documented with a literal `get_`/`set_` prefix still match directly; the rewrite is only
115
- a fallback. Three benchmark probes added.
116
-
117
- Also investigated and cleared, no change needed: `Element.BoundingBox` and
118
- `LocationCurve.Curve` document null returns -- not exceptions -- for elements without
119
- geometry, so the suspected one-bad-element batch failure in `get_element_details` does
120
- not exist per the API contract.
121
-
122
- Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
123
- restart Revit).
124
-
125
- ## [0.2.13] - 2026-08-21
126
-
127
- ### Fixed
128
- - `get_elements`: a display-name filter rule that matches no parameter on any probed
129
- in-scope element now carries an explicit WARNING in the result (content text and a
130
- `warnings` payload field) instead of silently reporting 0 matches. The typical trap:
131
- querying an English display name against a non-English UI, where the same parameter
132
- carries a translated name -- the query looked valid and the honest answer was "unknown
133
- parameter", not "0 matches". The warning points to the language-independent
134
- BuiltInParameter enum name as the fix.
135
- - `get_elements`: a filter value that does not fit the parameter's storage type now fails
136
- the same way regardless of scoping. Previously the identical query reported a clear error
137
- when `category`/`of_class` was set (the rule ran inside Revit's collector) but silently
138
- returned zero matches when it was not (the rule fell back to the per-element scan).
139
- - `execute_csharp`: a script that ran successfully but returned a value the result
140
- serializer could not walk — a lazy sequence over a deleted element, a property that
141
- throws — was rolled back and reported as "C# script threw". The script's changes now
142
- commit, `returnValue` explains what happened, and `returnValueError` carries the detail.
143
- - `capture_view`: every snapshot stayed on disk forever (measured on one machine: 138
144
- files, 28 MB, going back 15 months). Captures now go to `%LOCALAPPDATA%\pi-revit\captures`
145
- and each capture sweeps the ones older than 24 hours. The folder had to become a fixed
146
- one: `Path.GetTempPath()` can return a fresh per-session directory, so files left by
147
- earlier sessions were unreachable from the current one. The file just produced is
148
- untouched, so the read tool still finds it.
149
- - `export_documents`: the produced-file list compared pre-existing files against a wall
150
- clock window, so an untouched file that merely happened to be recent was reported as
151
- exported. Each file is now compared against its own pre-export timestamp.
152
- - The bridge reclaims `bridge.json` when its owner goes away. With two Revits open the
153
- newer one still owns the file, but closing it no longer leaves the older, still-running
154
- bridge undiscoverable — and a stale entry left by a crashed Revit is replaced within 30s
155
- instead of failing every call with "could not reach the Revit bridge".
156
-
157
- ### Changed
158
- - `scripts/deploy.ps1` replaces the add-in folder instead of copying over it, so files from
159
- a previous release cannot linger next to the new ones. It reports clearly if Revit is
160
- still running and holding the folder.
161
- - Docs: `open_view` was missing from the README tool table; the 0.2.10-0.2.12 changelog
162
- entries were dated a day after their actual release.
163
-
164
- Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
165
- restart Revit).
166
-
167
- ## [0.2.12] - 2026-07-21
168
-
169
- ### Added
170
- - New tool `open_view`: activates a view or sheet in the Revit UI — the equivalent of
171
- double-clicking it in the Project Browser. Identify the target by `view_id` or by
172
- `name` (view name, sheet number like "A-101", or "number - name"). Uses Revit's
173
- queued `RequestViewChange`, which is explicitly legal from the bridge's ExternalEvent
174
- context; the activation completes the instant the call returns. Ends the
175
- "please double-click the sheet yourself" gap after sheet/view creation.
176
-
177
- Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
178
- restart Revit).
179
-
180
- ## [0.2.11] - 2026-07-21
181
-
182
- ### Fixed
183
- - `search_api_docs`: signature queries now accept .NET type names and qualified names —
184
- `Wall.Create(Document, Curve, ElementId, Boolean` and `...(System.String` match the
185
- rendered `bool` / `string`, and `(Autodesk.Revit.DB.Document` matches `Document`.
186
- Parameter types in the query are reduced exactly the way the index renders them
187
- (namespace stripped, CLR name → C# keyword, case-insensitive).
188
- - `search_api_docs`: Creation-factory calls resolve — `Document.Create.NewRoom(Level, UV`
189
- finds `Document.NewRoom`, and `Document.Create.NewFamilyInstance` finds the
190
- `ItemFactoryBase` overloads (factory members documented on a base class). A note in the
191
- result explains the rewrite. Applies only to the literal `Document.Create.` /
192
- `Application.Create.` prefixes; ordinary members like `Wall.Create` are untouched, and
193
- nonsense like `Document.Create.Banana` still honestly returns nothing.
194
-
195
- Both were observed live: pi stumbled on these five times across two modeling sessions.
196
- The benchmark gained six regression probes for them.
197
-
198
- Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
199
- restart Revit).
200
-
201
- ## [0.2.10] - 2026-07-21
202
-
203
- ### Fixed
204
- - `search_api_docs`: constructor overloads can now be targeted with the natural C#
205
- spelling — `FilteredElementCollector(Document` matches even though constructors are
206
- rendered as `new FilteredElementCollector(Document)`. Previously only the `new `-prefixed
207
- form matched (the same typography-cliff family as the 0.2.8 comma-spacing fix).
208
-
209
- ### Added
210
- - `scripts/benchmark-search-docs.py`: a reproducible ~630-query benchmark of
211
- `search_api_docs` scored against Autodesk's own RevitAPI.xml — exact-name recall,
212
- signature/spacing variants, hard syntax, namespace ambiguity, adversarial honesty
213
- controls, documentation fidelity, and latency percentiles. Run it against any Revit
214
- version with the bridge loaded. Measured on Revit 2025 at 0.2.9: 100% recall / 98.8%
215
- top-1 on exact names, 100% spacing-variant agreement, 0 false positives across 99
216
- adversarial mutations, 50/50 correct parameter docs, p50 8 ms.
217
-
218
- Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
219
- restart Revit).
220
-
221
- ## [0.2.9] - 2026-07-21
222
-
223
- ### Added
224
- - Self-healing tool discovery: when pi starts before Revit, the extension now keeps
225
- retrying tool discovery in the background (every 15s) and also re-discovers on a
226
- successful `ping` — no more sessions stuck with only `ping` registered until a fresh
227
- pi start. When tools arrive mid-session, `ping`'s result says so.
228
- - `set_parameters` and `execute_csharp` accept an optional `expected_document` (the model
229
- title): if the active document differs — e.g. the user switched models mid-session —
230
- the write fails cleanly instead of landing in the wrong model.
231
- - `get_element_details.parameter_names` now also matches language-independent
232
- BuiltInParameter enum names (e.g. `ALL_MODEL_MARK`), so filtering works in non-English
233
- Revit UIs where display names are localized.
234
-
235
- ### Fixed
236
- - `get_element_details` no longer reports a misleading "0 params" when a
237
- `parameter_names` filter simply matched nothing — it now reports "N of M params
238
- matched parameter_names" so localization misses are visible. (This explains the
239
- earlier "0 params vs 38 params" reports: different filter arguments, not flaky reads.)
240
- - `get_elements`: a display-name filter rule in an **unscoped** query (no category /
241
- of_class) is no longer promoted to a pinned collector filter based on a 50-element
242
- probe — it stays on the per-element post-scan path, so categories beyond the probe
243
- window can't be silently dropped when the same parameter name maps to different ids.
244
-
245
- ### Changed
246
- - SKILL.md: guidance on localized parameter names (prefer BuiltInParameter enum names)
247
- and on using `expected_document` for long sessions / multiple open models.
248
- - README: new "Safety model" section stating explicitly what the add-in enforces and
249
- that write-confirmation UX is a client-side decision.
250
-
251
- Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
252
- restart Revit).
253
-
254
- ## [0.2.8] - 2026-07-21
255
-
256
- ### Fixed
257
- - `search_api_docs`: overload-targeted queries no longer fail on comma spacing.
258
- `Wall.Create(Document,Curve` (no space) and `Wall.Create( Document, Curve` now match the
259
- same overloads as `Wall.Create(Document, Curve` — the query's spacing around commas and
260
- parentheses is normalized to the rendered signature style before matching.
261
-
262
- Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then restart
263
- Revit).
264
-
265
- ## [0.2.7] - 2026-07-21
266
-
267
- ### Added
268
- - Update announcements: after a pi-revit update, the next pi session shows a one-time
269
- "What's new in pi-revit" note listing the changelog entries for every version since the
270
- last one announced — the same mechanism pi uses for its own updates. The last-announced
271
- version is remembered in `%APPDATA%\pi-revit\state.json` (kept outside the package
272
- folder so npm updates can't erase it). Fresh installs stay silent.
273
-
274
- Extension-only change: no Revit add-in redeploy or Revit restart needed.
275
-
276
- ## [0.2.6] - 2026-07-20
277
-
278
- ### Fixed
279
- - Write transactions (`set_parameters`, `execute_csharp`, and the temporary-isolate
280
- branch of `manage_selection`) now register a failures preprocessor. Previously Revit
281
- handled commit failures interactively: warnings popped the transient toast and spammed
282
- the journal, and an error-severity failure showed the modal resolution dialog, blocking
283
- the bridge until a human clicked. Now warnings are auto-dismissed and reported back
284
- (`commitWarnings` in the result, e.g. duplicate Mark values), and errors roll the
285
- transaction back with the actual Revit failure text in the error message.
286
-
287
- ### Changed
288
- - `set_parameters` tool description tells the model to relay `commitWarnings` to the user.
289
-
290
- Requires redeploying the Revit add-in (`scripts\deploy.ps1` + Revit restart).
291
-
292
- ## [0.2.5] - 2026-07-20
293
-
294
- ### Fixed
295
- - `execute_csharp` dialog guard no longer answers every Revit popup with OK. On some
296
- dialogs OK is the destructive choice (e.g. "Delete Element(s)"), so a script could
297
- silently delete dimensions or constraints and still report success. Unrecognized
298
- dialogs are now answered dismissively (Cancel, then Close, then No; OK only as the
299
- last resort so Revit can never hang behind a popup), a small allowlist keeps OK for
300
- dialogs that are safe to confirm, and `suppressedDialogs` now reports which answer
301
- was given (e.g. `TaskDialog_… (answered Cancel)`).
302
-
303
- ### Changed
304
- - The `execute_csharp` tool description tells the model that confirmation prompts may be
305
- cancelled and to check `suppressedDialogs` when a result looks incomplete.
306
-
307
- Requires redeploying the Revit add-in (`scripts\deploy.ps1` + Revit restart) — `ping`
308
- warns on a version mismatch until then.
309
-
310
- ## [0.2.4] - 2026-07-20
311
-
312
- ### Added
313
- - This changelog. It ships inside the npm package and gets a `## [x.y.z]` entry with
314
- **Added / Changed / Fixed** sections for every release, so updates report what actually
315
- changed instead of just a version number.
316
-
317
- ## [0.2.3] - 2026-07-20
318
-
319
- ### Changed
320
- - `search_api_docs`: results with the same short name in different namespaces are now
321
- disambiguated with their full namespace, so `Category` vs internal schedule types
322
- can't be confused.
323
-
324
- ### Fixed
325
- - Removed a hardcoded example from the overload note that could mislead the model into
326
- copying a signature that didn't apply.
327
-
328
- ## [0.2.2] - 2026-07-20
329
-
330
- ### Added
331
- - `search_api_docs`: exception documentation ("Throws:") is now shown for matched members.
332
- - Overload-targeted queries: a query containing `(` matches against rendered signatures.
333
-
334
- ### Changed
335
- - Overloads now rank simplest-first (fewest parameters), so the common form appears on top.
336
-
337
- ## [0.2.1] - 2026-07-16
338
-
339
- ### Added
340
- - Extension/add-in version handshake: `ping` reports both versions and warns when the
341
- npm extension and the installed Revit add-in are out of sync (partial-update detection).
342
-
343
- ## [0.2.0] - 2026-07-15
344
-
345
- ### Changed
346
- - SKILL.md: documents the top-match inline docs behaviour and the automatic
347
- `Models\<title>\exports` output location so the agent uses them without prompting.
348
-
349
- ## [0.1.9] - 2026-07-15
350
-
351
- ### Added
352
- - `search_api_docs` indexes every Revit API enum and surfaces `<remarks>` documentation.
353
-
354
- ### Changed
355
- - The top match's full documentation is placed directly in the tool's text output
356
- (where model attention is strongest) instead of only in the structured payload.
357
-
358
- ## [0.1.8] - 2026-07-13
359
-
360
- ### Added
361
- - Automatic per-model output sorting: exports, captures, and scripts land under
362
- `Models\<model title>\` in the workspace, keyed to the source document.
363
-
364
- ## [0.1.7] - 2026-07-13
365
-
366
- ### Fixed
367
- - npm-install uninstall flow no longer blocks itself on its own installation folder.
368
-
369
- ## [0.1.6] - 2026-07-13
370
-
371
- ### Changed
372
- - The global launcher installs next to the user's permanent pi under npx.
373
-
374
- ## [0.1.5] - 2026-07-13
375
-
376
- ### Fixed
377
- - Uninstall of the npm-installed Pi package.
378
- - Workspace paths containing non-ASCII characters.
379
-
380
- First version published to npm.
381
-
382
- ## [0.1.0] - 2026-06-17
383
-
384
- Initial public release: Revit bridge add-in (Revit 2025/2026/2027) plus Pi extension with
385
- `ping`, `get_model_overview`, `get_elements`, `get_element_details`, `set_parameters`,
386
- `manage_selection`, `capture_view`, `export_documents`, `execute_csharp`, and
387
- `search_api_docs`.
87
+
88
+ ### Fixed
89
+ - When pi starts before Revit and the background rediscovery timer (rather than a `ping`
90
+ call) registers the bridge tools, the session is now told — the same announcement the
91
+ ping path has always given. Previously the tools appeared silently in the next system
92
+ prompt while nothing contradicted the session's earlier "Revit is not running", so the
93
+ agent could stay needlessly pessimistic. The note is queued for the next user prompt
94
+ and never interrupts. Extension-only change; the Revit add-in is unchanged (the
95
+ standard installer keeps both versions aligned).
96
+
97
+ ## [0.2.17] - 2026-08-21
98
+
99
+ ### Fixed
100
+ - The bridge's no-document check no longer counts linked documents. With only links
101
+ loaded, Revit does not pump the bridge's work queue, so a call could wait out its full
102
+ timeout instead of failing immediately with the clean "no active document" answer.
103
+
104
+ ### Changed
105
+ - Docs and tool descriptions describe localized parameter names generically instead of
106
+ quoting specific languages.
107
+ - The full search_api_docs benchmark (641 live queries against RevitAPI.xml ground truth)
108
+ was re-run on Revit 2025 at 0.2.16: 100% recall, 98.75% top-1 on exact names, 100%
109
+ spacing-variant agreement, 0 false positives across 99 adversarial mutations, 50/50
110
+ parameter docs, p50 10 ms -- no regression across the 0.2.13-0.2.16 search changes.
111
+
112
+ Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
113
+ restart Revit).
114
+
115
+ ## [0.2.16] - 2026-08-21
116
+
117
+ ### Fixed
118
+ - `search_api_docs`: an accessor-spelling query combined with `kind: "method"` — e.g.
119
+ `Element.get_Parameter(BuiltInParameter)` filtered to methods — returned "no matches",
120
+ because the accessor rewrite found the documented member but the kind filter rejected it:
121
+ a C# `get_X`/`set_X` accessor is a method to the caller, while the XML documents the
122
+ underlying member as a property or indexer. For accessor-rewritten candidates the
123
+ `method` filter now also admits properties, and the result note says so. Found by an
124
+ agent under a stress test that filtered its doc query to methods. Two benchmark probes
125
+ added (the widening plus a real-method control).
126
+
127
+ Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
128
+ restart Revit).
129
+
130
+ ## [0.2.15] - 2026-08-21
131
+
132
+ ### Fixed
133
+ - `set_parameters`: the "parameter not found" error now mentions that display names are
134
+ localized and points to the language-independent BuiltInParameter enum name — the same
135
+ guidance `get_element_details` and `get_elements` already give. Previously it only
136
+ suggested the type-parameter cause, which sent the caller down the wrong path in
137
+ non-English UIs.
138
+ - `get_elements`: the "filter parameter not found on any probed element" warning now
139
+ appears only when the query returned zero matches — that is where it distinguishes
140
+ "unknown parameter name" from "no matching elements". Next to real matches it was noise
141
+ (an unscoped query's probe window can simply miss the elements that carry the parameter).
142
+
143
+ Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
144
+ restart Revit).
145
+
146
+ ## [0.2.14] - 2026-08-21
147
+
148
+ ### Fixed
149
+ - `get_elements`: text filter rules now compare case-insensitively on the post-scan path,
150
+ matching Revit's own collector rules (which ignore case -- verified empirically). The
151
+ same string rule previously matched case-insensitively when it ran inside the collector
152
+ but case-sensitively when it fell back to the per-element scan, so merely scoping a
153
+ query could change its results.
154
+ - `search_api_docs`: queries in C# accessor spelling -- `Element.get_Parameter(BuiltInParameter)`,
155
+ `get_BoundingBox(View` -- now resolve to the documented property or indexer
156
+ (`Element.Parameter`, `Element.BoundingBox`), with a note explaining the rewrite. Members
157
+ documented with a literal `get_`/`set_` prefix still match directly; the rewrite is only
158
+ a fallback. Three benchmark probes added.
159
+
160
+ Also investigated and cleared, no change needed: `Element.BoundingBox` and
161
+ `LocationCurve.Curve` document null returns -- not exceptions -- for elements without
162
+ geometry, so the suspected one-bad-element batch failure in `get_element_details` does
163
+ not exist per the API contract.
164
+
165
+ Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
166
+ restart Revit).
167
+
168
+ ## [0.2.13] - 2026-08-21
169
+
170
+ ### Fixed
171
+ - `get_elements`: a display-name filter rule that matches no parameter on any probed
172
+ in-scope element now carries an explicit WARNING in the result (content text and a
173
+ `warnings` payload field) instead of silently reporting 0 matches. The typical trap:
174
+ querying an English display name against a non-English UI, where the same parameter
175
+ carries a translated name -- the query looked valid and the honest answer was "unknown
176
+ parameter", not "0 matches". The warning points to the language-independent
177
+ BuiltInParameter enum name as the fix.
178
+ - `get_elements`: a filter value that does not fit the parameter's storage type now fails
179
+ the same way regardless of scoping. Previously the identical query reported a clear error
180
+ when `category`/`of_class` was set (the rule ran inside Revit's collector) but silently
181
+ returned zero matches when it was not (the rule fell back to the per-element scan).
182
+ - `execute_csharp`: a script that ran successfully but returned a value the result
183
+ serializer could not walk — a lazy sequence over a deleted element, a property that
184
+ throws — was rolled back and reported as "C# script threw". The script's changes now
185
+ commit, `returnValue` explains what happened, and `returnValueError` carries the detail.
186
+ - `capture_view`: every snapshot stayed on disk forever (measured on one machine: 138
187
+ files, 28 MB, going back 15 months). Captures now go to `%LOCALAPPDATA%\pi-revit\captures`
188
+ and each capture sweeps the ones older than 24 hours. The folder had to become a fixed
189
+ one: `Path.GetTempPath()` can return a fresh per-session directory, so files left by
190
+ earlier sessions were unreachable from the current one. The file just produced is
191
+ untouched, so the read tool still finds it.
192
+ - `export_documents`: the produced-file list compared pre-existing files against a wall
193
+ clock window, so an untouched file that merely happened to be recent was reported as
194
+ exported. Each file is now compared against its own pre-export timestamp.
195
+ - The bridge reclaims `bridge.json` when its owner goes away. With two Revits open the
196
+ newer one still owns the file, but closing it no longer leaves the older, still-running
197
+ bridge undiscoverable — and a stale entry left by a crashed Revit is replaced within 30s
198
+ instead of failing every call with "could not reach the Revit bridge".
199
+
200
+ ### Changed
201
+ - `scripts/deploy.ps1` replaces the add-in folder instead of copying over it, so files from
202
+ a previous release cannot linger next to the new ones. It reports clearly if Revit is
203
+ still running and holding the folder.
204
+ - Docs: `open_view` was missing from the README tool table; the 0.2.10-0.2.12 changelog
205
+ entries were dated a day after their actual release.
206
+
207
+ Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
208
+ restart Revit).
209
+
210
+ ## [0.2.12] - 2026-07-21
211
+
212
+ ### Added
213
+ - New tool `open_view`: activates a view or sheet in the Revit UI — the equivalent of
214
+ double-clicking it in the Project Browser. Identify the target by `view_id` or by
215
+ `name` (view name, sheet number like "A-101", or "number - name"). Uses Revit's
216
+ queued `RequestViewChange`, which is explicitly legal from the bridge's ExternalEvent
217
+ context; the activation completes the instant the call returns. Ends the
218
+ "please double-click the sheet yourself" gap after sheet/view creation.
219
+
220
+ Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
221
+ restart Revit).
222
+
223
+ ## [0.2.11] - 2026-07-21
224
+
225
+ ### Fixed
226
+ - `search_api_docs`: signature queries now accept .NET type names and qualified names —
227
+ `Wall.Create(Document, Curve, ElementId, Boolean` and `...(System.String` match the
228
+ rendered `bool` / `string`, and `(Autodesk.Revit.DB.Document` matches `Document`.
229
+ Parameter types in the query are reduced exactly the way the index renders them
230
+ (namespace stripped, CLR name → C# keyword, case-insensitive).
231
+ - `search_api_docs`: Creation-factory calls resolve — `Document.Create.NewRoom(Level, UV`
232
+ finds `Document.NewRoom`, and `Document.Create.NewFamilyInstance` finds the
233
+ `ItemFactoryBase` overloads (factory members documented on a base class). A note in the
234
+ result explains the rewrite. Applies only to the literal `Document.Create.` /
235
+ `Application.Create.` prefixes; ordinary members like `Wall.Create` are untouched, and
236
+ nonsense like `Document.Create.Banana` still honestly returns nothing.
237
+
238
+ Both were observed live: pi stumbled on these five times across two modeling sessions.
239
+ The benchmark gained six regression probes for them.
240
+
241
+ Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
242
+ restart Revit).
243
+
244
+ ## [0.2.10] - 2026-07-21
245
+
246
+ ### Fixed
247
+ - `search_api_docs`: constructor overloads can now be targeted with the natural C#
248
+ spelling — `FilteredElementCollector(Document` matches even though constructors are
249
+ rendered as `new FilteredElementCollector(Document)`. Previously only the `new `-prefixed
250
+ form matched (the same typography-cliff family as the 0.2.8 comma-spacing fix).
251
+
252
+ ### Added
253
+ - `scripts/benchmark-search-docs.py`: a reproducible ~630-query benchmark of
254
+ `search_api_docs` scored against Autodesk's own RevitAPI.xml — exact-name recall,
255
+ signature/spacing variants, hard syntax, namespace ambiguity, adversarial honesty
256
+ controls, documentation fidelity, and latency percentiles. Run it against any Revit
257
+ version with the bridge loaded. Measured on Revit 2025 at 0.2.9: 100% recall / 98.8%
258
+ top-1 on exact names, 100% spacing-variant agreement, 0 false positives across 99
259
+ adversarial mutations, 50/50 correct parameter docs, p50 8 ms.
260
+
261
+ Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
262
+ restart Revit).
263
+
264
+ ## [0.2.9] - 2026-07-21
265
+
266
+ ### Added
267
+ - Self-healing tool discovery: when pi starts before Revit, the extension now keeps
268
+ retrying tool discovery in the background (every 15s) and also re-discovers on a
269
+ successful `ping` — no more sessions stuck with only `ping` registered until a fresh
270
+ pi start. When tools arrive mid-session, `ping`'s result says so.
271
+ - `set_parameters` and `execute_csharp` accept an optional `expected_document` (the model
272
+ title): if the active document differs — e.g. the user switched models mid-session —
273
+ the write fails cleanly instead of landing in the wrong model.
274
+ - `get_element_details.parameter_names` now also matches language-independent
275
+ BuiltInParameter enum names (e.g. `ALL_MODEL_MARK`), so filtering works in non-English
276
+ Revit UIs where display names are localized.
277
+
278
+ ### Fixed
279
+ - `get_element_details` no longer reports a misleading "0 params" when a
280
+ `parameter_names` filter simply matched nothing — it now reports "N of M params
281
+ matched parameter_names" so localization misses are visible. (This explains the
282
+ earlier "0 params vs 38 params" reports: different filter arguments, not flaky reads.)
283
+ - `get_elements`: a display-name filter rule in an **unscoped** query (no category /
284
+ of_class) is no longer promoted to a pinned collector filter based on a 50-element
285
+ probe — it stays on the per-element post-scan path, so categories beyond the probe
286
+ window can't be silently dropped when the same parameter name maps to different ids.
287
+
288
+ ### Changed
289
+ - SKILL.md: guidance on localized parameter names (prefer BuiltInParameter enum names)
290
+ and on using `expected_document` for long sessions / multiple open models.
291
+ - README: new "Safety model" section stating explicitly what the add-in enforces and
292
+ that write-confirmation UX is a client-side decision.
293
+
294
+ Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then
295
+ restart Revit).
296
+
297
+ ## [0.2.8] - 2026-07-21
298
+
299
+ ### Fixed
300
+ - `search_api_docs`: overload-targeted queries no longer fail on comma spacing.
301
+ `Wall.Create(Document,Curve` (no space) and `Wall.Create( Document, Curve` now match the
302
+ same overloads as `Wall.Create(Document, Curve` — the query's spacing around commas and
303
+ parentheses is normalized to the rendered signature style before matching.
304
+
305
+ Requires redeploying the Revit add-in (`scripts\deploy.ps1` with Revit closed, then restart
306
+ Revit).
307
+
308
+ ## [0.2.7] - 2026-07-21
309
+
310
+ ### Added
311
+ - Update announcements: after a pi-revit update, the next pi session shows a one-time
312
+ "What's new in pi-revit" note listing the changelog entries for every version since the
313
+ last one announced — the same mechanism pi uses for its own updates. The last-announced
314
+ version is remembered in `%APPDATA%\pi-revit\state.json` (kept outside the package
315
+ folder so npm updates can't erase it). Fresh installs stay silent.
316
+
317
+ Extension-only change: no Revit add-in redeploy or Revit restart needed.
318
+
319
+ ## [0.2.6] - 2026-07-20
320
+
321
+ ### Fixed
322
+ - Write transactions (`set_parameters`, `execute_csharp`, and the temporary-isolate
323
+ branch of `manage_selection`) now register a failures preprocessor. Previously Revit
324
+ handled commit failures interactively: warnings popped the transient toast and spammed
325
+ the journal, and an error-severity failure showed the modal resolution dialog, blocking
326
+ the bridge until a human clicked. Now warnings are auto-dismissed and reported back
327
+ (`commitWarnings` in the result, e.g. duplicate Mark values), and errors roll the
328
+ transaction back with the actual Revit failure text in the error message.
329
+
330
+ ### Changed
331
+ - `set_parameters` tool description tells the model to relay `commitWarnings` to the user.
332
+
333
+ Requires redeploying the Revit add-in (`scripts\deploy.ps1` + Revit restart).
334
+
335
+ ## [0.2.5] - 2026-07-20
336
+
337
+ ### Fixed
338
+ - `execute_csharp` dialog guard no longer answers every Revit popup with OK. On some
339
+ dialogs OK is the destructive choice (e.g. "Delete Element(s)"), so a script could
340
+ silently delete dimensions or constraints and still report success. Unrecognized
341
+ dialogs are now answered dismissively (Cancel, then Close, then No; OK only as the
342
+ last resort so Revit can never hang behind a popup), a small allowlist keeps OK for
343
+ dialogs that are safe to confirm, and `suppressedDialogs` now reports which answer
344
+ was given (e.g. `TaskDialog_… (answered Cancel)`).
345
+
346
+ ### Changed
347
+ - The `execute_csharp` tool description tells the model that confirmation prompts may be
348
+ cancelled and to check `suppressedDialogs` when a result looks incomplete.
349
+
350
+ Requires redeploying the Revit add-in (`scripts\deploy.ps1` + Revit restart) — `ping`
351
+ warns on a version mismatch until then.
352
+
353
+ ## [0.2.4] - 2026-07-20
354
+
355
+ ### Added
356
+ - This changelog. It ships inside the npm package and gets a `## [x.y.z]` entry with
357
+ **Added / Changed / Fixed** sections for every release, so updates report what actually
358
+ changed instead of just a version number.
359
+
360
+ ## [0.2.3] - 2026-07-20
361
+
362
+ ### Changed
363
+ - `search_api_docs`: results with the same short name in different namespaces are now
364
+ disambiguated with their full namespace, so `Category` vs internal schedule types
365
+ can't be confused.
366
+
367
+ ### Fixed
368
+ - Removed a hardcoded example from the overload note that could mislead the model into
369
+ copying a signature that didn't apply.
370
+
371
+ ## [0.2.2] - 2026-07-20
372
+
373
+ ### Added
374
+ - `search_api_docs`: exception documentation ("Throws:") is now shown for matched members.
375
+ - Overload-targeted queries: a query containing `(` matches against rendered signatures.
376
+
377
+ ### Changed
378
+ - Overloads now rank simplest-first (fewest parameters), so the common form appears on top.
379
+
380
+ ## [0.2.1] - 2026-07-16
381
+
382
+ ### Added
383
+ - Extension/add-in version handshake: `ping` reports both versions and warns when the
384
+ npm extension and the installed Revit add-in are out of sync (partial-update detection).
385
+
386
+ ## [0.2.0] - 2026-07-15
387
+
388
+ ### Changed
389
+ - SKILL.md: documents the top-match inline docs behaviour and the automatic
390
+ `Models\<title>\exports` output location so the agent uses them without prompting.
391
+
392
+ ## [0.1.9] - 2026-07-15
393
+
394
+ ### Added
395
+ - `search_api_docs` indexes every Revit API enum and surfaces `<remarks>` documentation.
396
+
397
+ ### Changed
398
+ - The top match's full documentation is placed directly in the tool's text output
399
+ (where model attention is strongest) instead of only in the structured payload.
400
+
401
+ ## [0.1.8] - 2026-07-13
402
+
403
+ ### Added
404
+ - Automatic per-model output sorting: exports, captures, and scripts land under
405
+ `Models\<model title>\` in the workspace, keyed to the source document.
406
+
407
+ ## [0.1.7] - 2026-07-13
408
+
409
+ ### Fixed
410
+ - npm-install uninstall flow no longer blocks itself on its own installation folder.
411
+
412
+ ## [0.1.6] - 2026-07-13
413
+
414
+ ### Changed
415
+ - The global launcher installs next to the user's permanent pi under npx.
416
+
417
+ ## [0.1.5] - 2026-07-13
418
+
419
+ ### Fixed
420
+ - Uninstall of the npm-installed Pi package.
421
+ - Workspace paths containing non-ASCII characters.
422
+
423
+ First version published to npm.
424
+
425
+ ## [0.1.0] - 2026-06-17
426
+
427
+ Initial public release: Revit bridge add-in (Revit 2025/2026/2027) plus Pi extension with
428
+ `ping`, `get_model_overview`, `get_elements`, `get_element_details`, `set_parameters`,
429
+ `manage_selection`, `capture_view`, `export_documents`, `execute_csharp`, and
430
+ `search_api_docs`.