pi-revit 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +167 -0
- package/CHANGELOG.md +44 -0
- package/README.md +644 -553
- package/bin/pi-revit.js +9 -9
- package/docs/architecture.md +271 -0
- package/docs/evaluation.md +434 -0
- package/docs/invariants.json +147 -0
- package/extensions/pi-revit/completion-monitor.ts +55 -0
- package/extensions/pi-revit/contracts.ts +146 -0
- package/extensions/pi-revit/discovery.ts +93 -0
- package/extensions/pi-revit/index.ts +342 -255
- package/extensions/pi-revit/instance-router.ts +86 -86
- package/extensions/pi-revit/platform-prompt.ts +40 -0
- package/extensions/pi-revit/scope-monitor.ts +114 -0
- package/extensions/pi-revit/script-library.ts +144 -144
- package/extensions/pi-revit/tool-catalog.ts +113 -14
- package/extensions/pi-revit/tool-documentation.ts +72 -0
- package/extensions/pi-revit/tool-schema.ts +8 -0
- package/package.json +8 -2
- package/scripts/build.ps1 +9 -9
- package/scripts/check-sdk.ps1 +66 -66
- package/scripts/check-tool-documentation.mjs +287 -0
- package/scripts/deploy.ps1 +16 -16
- package/scripts/generate-contracts.mjs +80 -0
- package/scripts/lib/platform.mjs +226 -0
- package/scripts/test-extension.mjs +15 -0
- package/skills/pi-revit/SKILL.md +30 -218
- package/skills/pi-revit/contracts.generated.json +3524 -0
- package/skills/pi-revit/references/execution-rules.md +41 -0
- package/skills/pi-revit/references/model-audit-export.md +38 -27
- package/skills/pi-revit/references/operation-recovery.md +33 -0
- package/skills/pi-revit/references/room-documentation.md +37 -26
- package/skills/pi-revit/references/tool-index.md +89 -0
- package/skills/pi-revit/references/tools/capture_view.md +62 -0
- package/skills/pi-revit/references/tools/change_element_types.md +65 -0
- package/skills/pi-revit/references/tools/create_tags.md +85 -0
- package/skills/pi-revit/references/tools/delete_elements.md +66 -0
- package/skills/pi-revit/references/tools/execute_csharp.md +81 -0
- package/skills/pi-revit/references/tools/export_documents.md +75 -0
- package/skills/pi-revit/references/tools/find_revit_tools.md +96 -0
- package/skills/pi-revit/references/tools/get_element_details.md +66 -0
- package/skills/pi-revit/references/tools/get_element_relationships.md +61 -0
- package/skills/pi-revit/references/tools/get_element_types.md +67 -0
- package/skills/pi-revit/references/tools/get_elements.md +87 -0
- package/skills/pi-revit/references/tools/get_linked_elements.md +79 -0
- package/skills/pi-revit/references/tools/get_linked_models.md +57 -0
- package/skills/pi-revit/references/tools/get_model_coordinates.md +64 -0
- package/skills/pi-revit/references/tools/get_model_health.md +53 -0
- package/skills/pi-revit/references/tools/get_model_overview.md +57 -0
- package/skills/pi-revit/references/tools/get_revit_operation.md +54 -0
- package/skills/pi-revit/references/tools/get_schedule_fields.md +62 -0
- package/skills/pi-revit/references/tools/get_schedules.md +71 -0
- package/skills/pi-revit/references/tools/manage_element_sets.md +92 -0
- package/skills/pi-revit/references/tools/manage_revit_instances.md +63 -0
- package/skills/pi-revit/references/tools/manage_revit_scripts.md +109 -0
- package/skills/pi-revit/references/tools/manage_schedules.md +90 -0
- package/skills/pi-revit/references/tools/manage_selection.md +66 -0
- package/skills/pi-revit/references/tools/manage_sheet_placements.md +82 -0
- package/skills/pi-revit/references/tools/manage_sheets.md +71 -0
- package/skills/pi-revit/references/tools/manage_views.md +95 -0
- package/skills/pi-revit/references/tools/measure_geometry.md +71 -0
- package/skills/pi-revit/references/tools/open_view.md +59 -0
- package/skills/pi-revit/references/tools/ping.md +41 -0
- package/skills/pi-revit/references/tools/query_spatial_elements.md +74 -0
- package/skills/pi-revit/references/tools/read_revit_result.md +53 -0
- package/skills/pi-revit/references/tools/search_api_docs.md +65 -0
- package/skills/pi-revit/references/tools/set_parameters.md +75 -0
- package/skills/pi-revit/references/tools/summarize_elements.md +64 -0
- package/skills/pi-revit/references/tools/transform_elements.md +79 -0
- package/skills/pi-revit/references/visual-verification.md +36 -0
- package/skills/pi-revit/tool-manifest.json +338 -0
- package/src/Revit/BridgeServer.cs +93 -87
- package/src/Revit/OperationStore.cs +178 -178
- package/src/Revit/ToolRegistry.cs +88 -57
- package/src/Revit/Tools/CaptureView.cs +10 -2
- package/src/Revit/Tools/ChangeElementTypes.cs +74 -60
- package/src/Revit/Tools/ChangeSet.cs +39 -0
- package/src/Revit/Tools/CreateTags.cs +107 -95
- package/src/Revit/Tools/DeleteElements.cs +53 -44
- package/src/Revit/Tools/DocumentGuard.cs +74 -64
- package/src/Revit/Tools/ElementNames.cs +103 -0
- package/src/Revit/Tools/ElementQueryScope.cs +27 -27
- package/src/Revit/Tools/ElementTraits.cs +53 -0
- package/src/Revit/Tools/ExecuteCsharp.cs +54 -45
- package/src/Revit/Tools/ExportDocuments.cs +129 -121
- package/src/Revit/Tools/GetElementDetails.cs +37 -41
- package/src/Revit/Tools/GetElementRelationships.cs +82 -76
- package/src/Revit/Tools/GetElementTypes.cs +8 -0
- package/src/Revit/Tools/GetElements.cs +75 -86
- package/src/Revit/Tools/GetLinkedElements.cs +89 -82
- package/src/Revit/Tools/GetLinkedModels.cs +73 -66
- package/src/Revit/Tools/GetModelCoordinates.cs +56 -49
- package/src/Revit/Tools/GetModelHealth.cs +7 -0
- package/src/Revit/Tools/GetModelOverview.cs +185 -158
- package/src/Revit/Tools/GetScheduleFields.cs +44 -37
- package/src/Revit/Tools/GetSchedules.cs +96 -89
- package/src/Revit/Tools/InheritedState.Summary.cs +57 -0
- package/src/Revit/Tools/InheritedState.cs +144 -0
- package/src/Revit/Tools/ManageElementSets.cs +114 -106
- package/src/Revit/Tools/ManageSchedules.cs +174 -164
- package/src/Revit/Tools/ManageSelection.cs +45 -37
- package/src/Revit/Tools/ManageSheetPlacements.cs +113 -97
- package/src/Revit/Tools/ManageSheets.cs +72 -63
- package/src/Revit/Tools/ManageViews.cs +115 -100
- package/src/Revit/Tools/MeasureGeometry.cs +60 -54
- package/src/Revit/Tools/ModelChanges.cs +154 -0
- package/src/Revit/Tools/ModelEditBatch.cs +105 -102
- package/src/Revit/Tools/ModelEditInputs.cs +49 -49
- package/src/Revit/Tools/OpenView.cs +9 -2
- package/src/Revit/Tools/ParameterResolver.cs +94 -0
- package/src/Revit/Tools/QuerySpatialElements.cs +70 -63
- package/src/Revit/Tools/SearchApiDocs.cs +72 -4
- package/src/Revit/Tools/SetParameters.cs +60 -79
- package/src/Revit/Tools/SpatialBounds.cs +30 -30
- package/src/Revit/Tools/SummarizeElements.cs +94 -87
- package/src/Revit/Tools/ToolContract.cs +48 -0
- package/src/Revit/Tools/ToolSupport.cs +5 -1
- package/src/Revit/Tools/TransformElements.cs +72 -57
- package/workspace/AGENTS.md +26 -20
|
@@ -1,106 +1,114 @@
|
|
|
1
|
-
using System.Text.Json;
|
|
2
|
-
using System.Text.Json.Nodes;
|
|
3
|
-
using Autodesk.Revit.DB;
|
|
4
|
-
|
|
5
|
-
namespace RevitBridge.Tools;
|
|
6
|
-
|
|
7
|
-
internal sealed class ManageElementSets : ITool
|
|
8
|
-
{
|
|
9
|
-
private sealed record Member(long Id, string UniqueId);
|
|
10
|
-
private sealed record Snapshot(string Id, string DocumentId, string Label, DateTimeOffset Expires, IReadOnlyList<Member> Members);
|
|
11
|
-
private static readonly Dictionary<string, Snapshot> Sets = new(StringComparer.Ordinal);
|
|
12
|
-
private const int MaxElements = 10000;
|
|
13
|
-
private const int MaxSets = 32;
|
|
14
|
-
|
|
15
|
-
public string Name => "manage_element_sets";
|
|
16
|
-
public string
|
|
17
|
-
public string
|
|
18
|
-
public IReadOnlyList<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if (
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
1
|
+
using System.Text.Json;
|
|
2
|
+
using System.Text.Json.Nodes;
|
|
3
|
+
using Autodesk.Revit.DB;
|
|
4
|
+
|
|
5
|
+
namespace RevitBridge.Tools;
|
|
6
|
+
|
|
7
|
+
internal sealed class ManageElementSets : ITool
|
|
8
|
+
{
|
|
9
|
+
private sealed record Member(long Id, string UniqueId);
|
|
10
|
+
private sealed record Snapshot(string Id, string DocumentId, string Label, DateTimeOffset Expires, IReadOnlyList<Member> Members);
|
|
11
|
+
private static readonly Dictionary<string, Snapshot> Sets = new(StringComparer.Ordinal);
|
|
12
|
+
private const int MaxElements = 10000;
|
|
13
|
+
private const int MaxSets = 32;
|
|
14
|
+
|
|
15
|
+
public string Name => "manage_element_sets";
|
|
16
|
+
public IReadOnlyList<string> DocumentKinds => DocumentKind.Both;
|
|
17
|
+
public IReadOnlyList<string> Keywords => new[] { "set", "collection", "remember elements", "saved query", "reread members", "snapshot" };
|
|
18
|
+
public IReadOnlyList<ToolLimit> Limits => new[]
|
|
19
|
+
{
|
|
20
|
+
new ToolLimit("Saved Revit selection sets", "api", "SelectionFilterElement.Create"),
|
|
21
|
+
new ToolLimit("Live query subscriptions", "tool", "get_elements (run the query again)"),
|
|
22
|
+
};
|
|
23
|
+
public string? Verification => "none";
|
|
24
|
+
public string Label => "Manage Element Sets";
|
|
25
|
+
public string Tier => "advanced";
|
|
26
|
+
public IReadOnlyList<string> Effects => new[] { "session" };
|
|
27
|
+
public string Description => "Create, list, read or forget reusable element sets without changing the model or selection. A set captures matching host-element identities (up to 10,000), expires after 30 minutes, and is valid only for the exact open document and bridge session. Read pages report live values, deleted members and identity mismatches; membership is a snapshot and filters are not re-evaluated. At most 32 sets are retained. Use read IDs with ordinary tools after checking missing members.";
|
|
28
|
+
public object ParametersSchema => new
|
|
29
|
+
{
|
|
30
|
+
type = "object",
|
|
31
|
+
properties = new
|
|
32
|
+
{
|
|
33
|
+
action = new { type = "string", @enum = new[] { "create", "list", "read", "forget" } },
|
|
34
|
+
query = ElementQueryScope.Schema(),
|
|
35
|
+
label = new { type = "string", maxLength = 160 },
|
|
36
|
+
set_id = new { type = "string" },
|
|
37
|
+
offset = new { type = "integer", minimum = 0 },
|
|
38
|
+
limit = new { type = "integer", minimum = 1, maximum = 1000 },
|
|
39
|
+
parameter_names = new { type = "array", maxItems = 20, items = new { type = "string" } },
|
|
40
|
+
include_type_parameters = new { type = "boolean" },
|
|
41
|
+
},
|
|
42
|
+
required = new[] { "action" },
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
public object Execute(JsonElement args, ToolContext context)
|
|
46
|
+
{
|
|
47
|
+
var doc = context.Document ?? throw new NoActiveDocumentException();
|
|
48
|
+
string documentId = DocumentGuard.GetIdentity(doc);
|
|
49
|
+
var now = DateTimeOffset.UtcNow;
|
|
50
|
+
foreach (var expired in Sets.Where(pair => pair.Value.Expires <= now).Select(pair => pair.Key).ToArray()) Sets.Remove(expired);
|
|
51
|
+
string action = JsonArgs.GetString(args, "action") ?? "";
|
|
52
|
+
if (action == "list") return new
|
|
53
|
+
{
|
|
54
|
+
sets = Sets.Values.Where(set => set.DocumentId == documentId).OrderBy(set => set.Expires)
|
|
55
|
+
.Select(set => new { set_id = set.Id, label = set.Label, total_count = set.Members.Count, expires_at = set.Expires }).ToArray(),
|
|
56
|
+
};
|
|
57
|
+
if (action == "create")
|
|
58
|
+
{
|
|
59
|
+
if (Sets.Count >= MaxSets) throw new ArgumentException("Element-set capacity reached. Forget an existing set or wait for expiry.");
|
|
60
|
+
string label = JsonArgs.GetString(args, "label") ?? "Element set";
|
|
61
|
+
if (label.Length > 160) throw new ArgumentException("label must be at most 160 characters.");
|
|
62
|
+
var query = ElementQueryScope.Parse(args);
|
|
63
|
+
query["fields"] = new JsonArray("id"); query["count_only"] = true;
|
|
64
|
+
JsonElement Query() => JsonSerializer.SerializeToElement(((ToolOutput)new GetElements().Execute(JsonSerializer.SerializeToElement(query), context)!).Payload);
|
|
65
|
+
var count = Query();
|
|
66
|
+
int total = count.GetProperty("total_count").GetInt32();
|
|
67
|
+
if (total > MaxElements) throw new ArgumentException($"Query matches {total} elements; narrow the scope to at most {MaxElements}.");
|
|
68
|
+
query["count_only"] = false; query["limit"] = 1000;
|
|
69
|
+
var members = new List<Member>(total);
|
|
70
|
+
for (int offset = 0; offset < total; offset += 1000)
|
|
71
|
+
{
|
|
72
|
+
query["offset"] = offset;
|
|
73
|
+
foreach (var row in Query().GetProperty("elements").EnumerateArray())
|
|
74
|
+
{
|
|
75
|
+
var element = doc.GetElement(new ElementId(row.GetProperty("id").GetInt64()));
|
|
76
|
+
members.Add(new Member(element.Id.Value, element.UniqueId));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
var snapshot = new Snapshot(Guid.NewGuid().ToString("N"), documentId, label, now.AddMinutes(30), members);
|
|
80
|
+
Sets.Add(snapshot.Id, snapshot);
|
|
81
|
+
return new { set_id = snapshot.Id, document_id = documentId, label, total_count = total, expires_at = snapshot.Expires,
|
|
82
|
+
warnings = count.TryGetProperty("warnings", out var warnings) ? (object)warnings.Clone() : null };
|
|
83
|
+
}
|
|
84
|
+
if (action is not ("read" or "forget")) throw new ArgumentException("Unknown action; use create, list, read or forget.");
|
|
85
|
+
string setId = JsonArgs.GetString(args, "set_id") ?? "";
|
|
86
|
+
if (!Sets.TryGetValue(setId, out var saved)) throw new ArgumentException("Unknown or expired set_id. Create a fresh set; IDs do not survive a bridge restart.");
|
|
87
|
+
if (saved.DocumentId != documentId) throw new ArgumentException("This element set belongs to a different open document. Activate its original document or create a fresh set.");
|
|
88
|
+
if (action == "forget") { Sets.Remove(setId); return new { set_id = setId, forgotten = true }; }
|
|
89
|
+
int start = Math.Max(0, JsonArgs.GetInt(args, "offset", 0));
|
|
90
|
+
int limit = Math.Clamp(JsonArgs.GetInt(args, "limit", 100), 1, 1000);
|
|
91
|
+
var names = JsonArgs.GetStringArray(args, "parameter_names");
|
|
92
|
+
if (names?.Count > 20) throw new ArgumentException("parameter_names allows at most 20 identities.");
|
|
93
|
+
bool includeType = JsonArgs.GetBool(args, "include_type_parameters", false);
|
|
94
|
+
var page = saved.Members.Skip(start).Take(limit).ToArray();
|
|
95
|
+
var rows = new List<object>();
|
|
96
|
+
var missing = new List<object>();
|
|
97
|
+
foreach (var member in page)
|
|
98
|
+
{
|
|
99
|
+
var element = doc.GetElement(new ElementId(member.Id));
|
|
100
|
+
if (element == null || element.UniqueId != member.UniqueId)
|
|
101
|
+
{
|
|
102
|
+
missing.Add(new { id = member.Id, unique_id = member.UniqueId, reason = element == null ? "deleted" : "identity_changed" });
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
var row = ElementIdentity.Build(doc, element, ElementIdentity.Fields);
|
|
106
|
+
row["unique_id"] = member.UniqueId;
|
|
107
|
+
if (names is { Count: > 0 }) row["parameters"] = GetElementDetails.ProjectParameters(doc, element, names, includeType);
|
|
108
|
+
rows.Add(row);
|
|
109
|
+
}
|
|
110
|
+
return new { set_id = setId, document_id = documentId, snapshot_count = saved.Members.Count, expires_at = saved.Expires,
|
|
111
|
+
offset = start, visited_count = page.Length, returned_count = rows.Count,
|
|
112
|
+
next_offset = start + page.Length < saved.Members.Count ? (int?)(start + page.Length) : null, elements = rows, missing };
|
|
113
|
+
}
|
|
114
|
+
}
|