@snaptrude/plugin-core 0.9.16 → 0.9.18-edgesetbacks-20261021.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 +231 -231
- package/CHANGELOG.md +408 -402
- package/CLAUDE.md +11 -11
- package/api-manifest.json +1510 -701
- package/dist/api/analysis/daylight.d.ts +5 -5
- package/dist/api/analysis/solar.d.ts +2 -2
- package/dist/api/core/camera/index.d.ts +29 -0
- package/dist/api/core/camera/index.d.ts.map +1 -1
- package/dist/api/core/geom/create/index.d.ts +7 -1
- package/dist/api/core/geom/create/index.d.ts.map +1 -1
- package/dist/api/core/geom/update/contour.d.ts +8 -2
- package/dist/api/core/geom/update/contour.d.ts.map +1 -1
- package/dist/api/core/storeys/index.d.ts +5 -2
- package/dist/api/core/storeys/index.d.ts.map +1 -1
- package/dist/api/core/zoom/index.d.ts +13 -0
- package/dist/api/core/zoom/index.d.ts.map +1 -1
- package/dist/api/design/bim.d.ts +299 -0
- package/dist/api/design/bim.d.ts.map +1 -0
- package/dist/api/design/boolean/index.d.ts +2 -0
- package/dist/api/design/boolean/index.d.ts.map +1 -1
- package/dist/api/design/catalog.d.ts +320 -0
- package/dist/api/design/catalog.d.ts.map +1 -0
- package/dist/api/design/create/bulk-items.d.ts +65 -25
- package/dist/api/design/create/bulk-items.d.ts.map +1 -1
- package/dist/api/design/create/index.d.ts +299 -100
- package/dist/api/design/create/index.d.ts.map +1 -1
- package/dist/api/design/create/opening-fields.d.ts +13 -12
- package/dist/api/design/create/opening-fields.d.ts.map +1 -1
- package/dist/api/design/delete/index.d.ts +1 -0
- package/dist/api/design/delete/index.d.ts.map +1 -1
- package/dist/api/design/doors/index.d.ts +18 -24
- package/dist/api/design/doors/index.d.ts.map +1 -1
- package/dist/api/design/family.d.ts +813 -35
- package/dist/api/design/family.d.ts.map +1 -1
- package/dist/api/design/index.d.ts +16 -0
- package/dist/api/design/index.d.ts.map +1 -1
- package/dist/api/design/networks.d.ts +1703 -0
- package/dist/api/design/networks.d.ts.map +1 -0
- package/dist/api/design/query/grids.d.ts +2 -2
- package/dist/api/design/query/index.d.ts +42 -32
- package/dist/api/design/query/index.d.ts.map +1 -1
- package/dist/api/design/selection/index.d.ts +10 -10
- package/dist/api/design/types/index.d.ts +40 -24
- package/dist/api/design/types/index.d.ts.map +1 -1
- package/dist/api/design/update/index.d.ts +111 -6
- package/dist/api/design/update/index.d.ts.map +1 -1
- package/dist/api/design/windows/index.d.ts +8 -8
- package/dist/api/design/windows/index.d.ts.map +1 -1
- package/dist/api/entity/buildableEnvelope.d.ts +84 -2
- package/dist/api/entity/buildableEnvelope.d.ts.map +1 -1
- package/dist/api/presentation/aiInspiration.d.ts +10 -10
- package/dist/api/presentation/annotate.d.ts +38 -22
- package/dist/api/presentation/annotate.d.ts.map +1 -1
- package/dist/api/presentation/drawingContract.d.ts +32 -0
- package/dist/api/presentation/drawingContract.d.ts.map +1 -0
- package/dist/api/presentation/drawings.d.ts +3523 -0
- package/dist/api/presentation/drawings.d.ts.map +1 -0
- package/dist/api/presentation/export.d.ts +23 -5
- package/dist/api/presentation/export.d.ts.map +1 -1
- package/dist/api/presentation/index.d.ts +41 -12
- package/dist/api/presentation/index.d.ts.map +1 -1
- package/dist/api/presentation/placedViews.d.ts +106 -6
- package/dist/api/presentation/placedViews.d.ts.map +1 -1
- package/dist/api/presentation/sections.d.ts +461 -0
- package/dist/api/presentation/sections.d.ts.map +1 -0
- package/dist/api/presentation/shapes.d.ts +2 -2
- package/dist/api/presentation/sheets.d.ts +175 -19
- package/dist/api/presentation/sheets.d.ts.map +1 -1
- package/dist/api/presentation/viewPresets.d.ts +222 -0
- package/dist/api/presentation/viewPresets.d.ts.map +1 -0
- package/dist/api/presentation/views.d.ts +141 -8
- package/dist/api/presentation/views.d.ts.map +1 -1
- package/dist/api/presentation/walkthroughs.d.ts +6 -6
- package/dist/errors/codes.d.ts +3 -1
- package/dist/errors/codes.d.ts.map +1 -1
- package/dist/index.cjs +3883 -2385
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3744 -2385
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/scripts/check-dist-fresh.mjs +22 -22
- package/scripts/generate-manifest.mjs +243 -238
- package/scripts/generate-manifest.test.mjs +303 -303
- package/src/api/analysis/daylight.ts +470 -470
- package/src/api/analysis/heatmaps.ts +683 -683
- package/src/api/analysis/illuminance.ts +155 -155
- package/src/api/analysis/index.ts +61 -61
- package/src/api/analysis/shadows.ts +183 -183
- package/src/api/analysis/solar.ts +237 -237
- package/src/api/analysis/sunlightHours.ts +211 -211
- package/src/api/analysis/sunpath.ts +83 -83
- package/src/api/analysis/weather.ts +179 -179
- package/src/api/core/buildings.ts +485 -485
- package/src/api/core/camera/index.ts +696 -667
- package/src/api/core/comment/index.ts +376 -376
- package/src/api/core/geom/create/index.ts +2139 -2133
- package/src/api/core/geom/delete/index.ts +84 -84
- package/src/api/core/geom/index.ts +35 -35
- package/src/api/core/geom/query/arc.ts +169 -169
- package/src/api/core/geom/query/brep.ts +621 -621
- package/src/api/core/geom/query/circle.ts +404 -404
- package/src/api/core/geom/query/contour.ts +540 -540
- package/src/api/core/geom/query/curve.ts +1102 -1102
- package/src/api/core/geom/query/edge.ts +130 -130
- package/src/api/core/geom/query/face.ts +508 -508
- package/src/api/core/geom/query/halfedge.ts +210 -210
- package/src/api/core/geom/query/index.ts +63 -63
- package/src/api/core/geom/query/profile.ts +473 -473
- package/src/api/core/geom/query/vertex.ts +205 -205
- package/src/api/core/geom/update/contour.ts +323 -317
- package/src/api/core/geom/update/curve.ts +209 -209
- package/src/api/core/geom/update/index.ts +29 -29
- package/src/api/core/geom/update/profile.ts +379 -379
- package/src/api/core/groups.ts +521 -521
- package/src/api/core/handles/index.ts +234 -234
- package/src/api/core/history/index.ts +84 -84
- package/src/api/core/index.ts +99 -99
- package/src/api/core/io/export/index.ts +126 -126
- package/src/api/core/io/import/index.ts +504 -504
- package/src/api/core/io/index.ts +42 -42
- package/src/api/core/io/job/index.ts +140 -140
- package/src/api/core/io/query/index.ts +71 -71
- package/src/api/core/io/terrain/index.ts +360 -360
- package/src/api/core/io/underlay/index.ts +705 -705
- package/src/api/core/layers.ts +540 -540
- package/src/api/core/math/index.ts +20 -20
- package/src/api/core/math/quat.ts +172 -172
- package/src/api/core/math/vec3.ts +179 -179
- package/src/api/core/mode/index.ts +108 -108
- package/src/api/core/project/index.ts +479 -479
- package/src/api/core/proposals/index.ts +570 -570
- package/src/api/core/storeys/index.ts +311 -308
- package/src/api/core/storeys/layers.ts +339 -339
- package/src/api/core/tags.ts +911 -911
- package/src/api/core/units/index.ts +164 -164
- package/src/api/core/user.ts +46 -46
- package/src/api/core/zoom/index.ts +64 -51
- package/src/api/design/bim.ts +210 -0
- package/src/api/design/boolean/index.ts +181 -179
- package/src/api/design/catalog.ts +203 -0
- package/src/api/design/create/bulk-items.ts +294 -254
- package/src/api/design/create/grids.ts +137 -137
- package/src/api/design/create/index.ts +2178 -1980
- package/src/api/design/create/opening-fields.ts +40 -37
- package/src/api/design/delete/index.ts +75 -74
- package/src/api/design/dimensions.ts +453 -453
- package/src/api/design/doors/index.ts +516 -500
- package/src/api/design/edit/index.ts +54 -54
- package/src/api/design/erase/index.ts +151 -151
- package/src/api/design/family.ts +1342 -704
- package/src/api/design/furniture/index.ts +319 -319
- package/src/api/design/grids.ts +237 -237
- package/src/api/design/index.ts +304 -274
- package/src/api/design/lock.ts +69 -69
- package/src/api/design/materials/index.ts +608 -608
- package/src/api/design/networks.ts +607 -0
- package/src/api/design/query/geometry/index.ts +319 -319
- package/src/api/design/query/grids.ts +197 -197
- package/src/api/design/query/index.ts +1236 -1226
- package/src/api/design/query/referenceLines.ts +52 -52
- package/src/api/design/query/spaces.ts +275 -275
- package/src/api/design/selection/index.ts +273 -273
- package/src/api/design/shared.ts +40 -40
- package/src/api/design/transform/index.ts +254 -254
- package/src/api/design/types/index.ts +163 -156
- package/src/api/design/update/index.ts +1096 -983
- package/src/api/design/visibility.ts +143 -143
- package/src/api/design/windows/index.ts +351 -333
- package/src/api/entity/buildableEnvelope.ts +397 -322
- package/src/api/entity/index.ts +30 -30
- package/src/api/entity/referenceLine.ts +235 -235
- package/src/api/entity/space.ts +612 -612
- package/src/api/entity/story.ts +517 -517
- package/src/api/index.ts +47 -47
- package/src/api/presentation/aiInspiration.ts +1116 -1116
- package/src/api/presentation/annotate.ts +417 -385
- package/src/api/presentation/camera.ts +289 -289
- package/src/api/presentation/diagrams.ts +194 -194
- package/src/api/presentation/drawingContract.ts +70 -0
- package/src/api/presentation/drawings.ts +1179 -0
- package/src/api/presentation/export.ts +134 -108
- package/src/api/presentation/import.ts +159 -159
- package/src/api/presentation/index.ts +160 -126
- package/src/api/presentation/placedViews.ts +1211 -1120
- package/src/api/presentation/sections.ts +420 -0
- package/src/api/presentation/shapes.ts +274 -274
- package/src/api/presentation/sheets.ts +746 -585
- package/src/api/presentation/slideshow.ts +134 -134
- package/src/api/presentation/tables.ts +84 -84
- package/src/api/presentation/viewPresets.ts +241 -0
- package/src/api/presentation/views.ts +742 -673
- package/src/api/presentation/walkthroughs.ts +1201 -1201
- package/src/api/program/adjacency.ts +164 -164
- package/src/api/program/areas.ts +408 -408
- package/src/api/program/classification.ts +138 -138
- package/src/api/program/cores.ts +83 -83
- package/src/api/program/departments.ts +517 -517
- package/src/api/program/index.ts +73 -73
- package/src/api/program/labels.ts +332 -332
- package/src/api/program/layout.ts +422 -422
- package/src/api/program/metadata.ts +364 -364
- package/src/api/program/metrics.ts +120 -120
- package/src/api/program/site.ts +748 -748
- package/src/api/program/spreadsheet.ts +2698 -2698
- package/src/api/workspace/index.ts +612 -612
- package/src/errors/codes.ts +143 -136
- package/src/errors/envelope.ts +75 -75
- package/src/errors/index.ts +21 -21
- package/src/errors/plugin-error.ts +134 -134
- package/src/handles.ts +297 -297
- package/src/host-utils.ts +67 -67
- package/src/index.ts +7 -7
- package/src/massParameters.ops.ts +246 -246
- package/src/massParameters.ts +427 -427
- package/src/types.ts +16 -16
- package/test/drawingContract.test.mjs +288 -0
- package/test/errors.test.mjs +185 -184
- package/test/massParameters.test.mjs +952 -952
- package/test/presentationViewSettings.test.mjs +85 -0
- package/tsconfig.json +22 -22
- package/tsup.config.ts +12 -12
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
import * as z from "zod"
|
|
2
|
-
import { PluginApiReturn } from "../../types"
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Program adjacency — the proximity relationships between departments or
|
|
6
|
-
* spaces.
|
|
7
|
-
*
|
|
8
|
-
* Adjacency is stage one of the product's space-planning workflow (compute →
|
|
9
|
-
* arrange → pack): the AI service scores which program elements need to be
|
|
10
|
-
* near each other, and the geometry contributes physical contact. Cell values:
|
|
11
|
-
*
|
|
12
|
-
* | Value | Meaning |
|
|
13
|
-
* |---|---|
|
|
14
|
-
* | `2` | Direct — adjacency required |
|
|
15
|
-
* | `1` | Indirect — nearby preferred, or physical contact |
|
|
16
|
-
* | `-1` | Restricted — must NOT be adjacent |
|
|
17
|
-
* | `0` | No relationship — or adjacency was never computed |
|
|
18
|
-
*
|
|
19
|
-
* Zeros are ambiguous **by design** (the engine cannot distinguish "no
|
|
20
|
-
* relationship" from "never computed"): call
|
|
21
|
-
* {@linkcode PluginProgramAdjacencyApi.compute} first when you need fresh
|
|
22
|
-
* data. Persisted matrices auto-hydrate on scene load, so warm reads are the
|
|
23
|
-
* common case. The arrange/pack stages of the workflow live in
|
|
24
|
-
* {@linkcode PluginProgramLayoutApi} (`program.layout`).
|
|
25
|
-
*
|
|
26
|
-
* Accessed via `snaptrude.program.adjacency`.
|
|
27
|
-
*/
|
|
28
|
-
export abstract class PluginProgramAdjacencyApi {
|
|
29
|
-
constructor() {}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Read the adjacency matrix at the department or space level.
|
|
33
|
-
*
|
|
34
|
-
* Returns a square `matrix` whose rows/columns are aligned to `ids`
|
|
35
|
-
* (component ids). Pass `ids` to read a sub-matrix in that order; omit it to
|
|
36
|
-
* get every eligible element at that level. Cell values:
|
|
37
|
-
*
|
|
38
|
-
* | Value | Meaning |
|
|
39
|
-
* |---|---|
|
|
40
|
-
* | `2` | Direct — adjacency required |
|
|
41
|
-
* | `1` | Indirect — nearby preferred, or physical contact |
|
|
42
|
-
* | `-1` | Restricted — must NOT be adjacent |
|
|
43
|
-
* | `0` | No relationship — or adjacency was never computed |
|
|
44
|
-
*
|
|
45
|
-
* Zeros are ambiguous by design — call
|
|
46
|
-
* {@linkcode PluginProgramAdjacencyApi.compute} first for fresh data
|
|
47
|
-
* (persisted matrices auto-hydrate on scene load, so warm reads are the
|
|
48
|
-
* common case). Space-level relationships are computed within a storey:
|
|
49
|
-
* cross-storey pairs always read `0`. At the `department` level the result
|
|
50
|
-
* also carries `departmentIds`, a parallel array joining each row to the
|
|
51
|
-
* department entity ids returned by `program.departments.list` (the row
|
|
52
|
-
* `ids` are department-mass component ids, not department entity ids).
|
|
53
|
-
*
|
|
54
|
-
* @param level - Read the `"department"` or `"space"` matrix.
|
|
55
|
-
* @param ids - Component ids to read a sub-matrix for, in this order
|
|
56
|
-
* (defaults to every eligible element at the level).
|
|
57
|
-
* @returns A {@linkcode PluginProgramAdjacencyGetMatrixResult} with `ids`,
|
|
58
|
-
* the square `matrix`, and (at department level) `departmentIds`.
|
|
59
|
-
* @throws If an id is unknown or does not match the requested level.
|
|
60
|
-
*
|
|
61
|
-
* @examplePrompt Get the space adjacency matrix
|
|
62
|
-
* @examplePrompt Which departments must be adjacent?
|
|
63
|
-
* @examplePrompt Show the adjacency relationships between departments
|
|
64
|
-
* @examplePrompt Read the adjacency matrix for these spaces
|
|
65
|
-
* @examplePrompt Which rooms are restricted from being next to each other?
|
|
66
|
-
*
|
|
67
|
-
* # Example
|
|
68
|
-
* ```ts
|
|
69
|
-
* const { ids, matrix } = await snaptrude.program.adjacency.getMatrix("department")
|
|
70
|
-
* ```
|
|
71
|
-
*/
|
|
72
|
-
public abstract getMatrix(
|
|
73
|
-
level: PluginAdjacencyLevel,
|
|
74
|
-
ids?: string[],
|
|
75
|
-
): PluginApiReturn<PluginProgramAdjacencyGetMatrixResult>
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Compute (or refresh) the adjacency data for the project.
|
|
79
|
-
*
|
|
80
|
-
* Runs the AI adjacency precompute and persists the result; a no-op when
|
|
81
|
-
* the stored data is already fresh. A real run takes **~2s at minimum**
|
|
82
|
-
* (engine pacing) plus the AI service round-trip. This is a write (it
|
|
83
|
-
* mutates and persists project analysis data), so it is blocked when plugin
|
|
84
|
-
* writes are disabled.
|
|
85
|
-
*
|
|
86
|
-
* @returns A {@linkcode PluginProgramAdjacencyComputeResult} —
|
|
87
|
-
* `{ success: true }` when the data is fresh or the run completed;
|
|
88
|
-
* `{ success: false, error }` when the AI service could not be reached.
|
|
89
|
-
*
|
|
90
|
-
* @examplePrompt Refresh adjacency analysis
|
|
91
|
-
* @examplePrompt Compute the adjacency matrix for this project
|
|
92
|
-
* @examplePrompt Recalculate which departments should be adjacent
|
|
93
|
-
*
|
|
94
|
-
* # Example
|
|
95
|
-
* ```ts
|
|
96
|
-
* const { success } = await snaptrude.program.adjacency.compute()
|
|
97
|
-
* if (success) {
|
|
98
|
-
* const data = await snaptrude.program.adjacency.getMatrix("space")
|
|
99
|
-
* }
|
|
100
|
-
* ```
|
|
101
|
-
*/
|
|
102
|
-
public abstract compute(): PluginApiReturn<PluginProgramAdjacencyComputeResult>
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* The level an adjacency matrix is read at.
|
|
107
|
-
*
|
|
108
|
-
* | Value | Description |
|
|
109
|
-
* |---|---|
|
|
110
|
-
* | `"department"` | One row/column per department mass |
|
|
111
|
-
* | `"space"` | One row/column per space (within a storey) |
|
|
112
|
-
*/
|
|
113
|
-
export const PluginAdjacencyLevel = z.enum(["department", "space"])
|
|
114
|
-
export type PluginAdjacencyLevel = z.infer<typeof PluginAdjacencyLevel>
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Arguments for {@linkcode PluginProgramAdjacencyApi.getMatrix}.
|
|
118
|
-
*
|
|
119
|
-
* | Property | Type | Description |
|
|
120
|
-
* |---|---|---|
|
|
121
|
-
* | `level` | {@linkcode PluginAdjacencyLevel} | Read the `"department"` or `"space"` matrix |
|
|
122
|
-
* | `ids` | `string[] \| undefined` | Component ids to read a sub-matrix for, in this order (defaults to every eligible element at the level) |
|
|
123
|
-
*/
|
|
124
|
-
export const PluginProgramAdjacencyGetMatrixArgs = z.object({
|
|
125
|
-
level: PluginAdjacencyLevel,
|
|
126
|
-
ids: z.array(z.string()).optional(),
|
|
127
|
-
})
|
|
128
|
-
export type PluginProgramAdjacencyGetMatrixArgs = z.infer<
|
|
129
|
-
typeof PluginProgramAdjacencyGetMatrixArgs
|
|
130
|
-
>
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Result of {@linkcode PluginProgramAdjacencyApi.getMatrix}.
|
|
134
|
-
*
|
|
135
|
-
* | Property | Type | Description |
|
|
136
|
-
* |---|---|---|
|
|
137
|
-
* | `ids` | `string[]` | Component ids, in matrix row/column order |
|
|
138
|
-
* | `departmentIds` | `(string \| null)[] \| undefined` | Department level only: parallel to `ids`, the department entity id each row belongs to (joinable against `program.departments.list`), `null` when unassigned |
|
|
139
|
-
* | `matrix` | `number[][]` | Square matrix aligned to `ids`; values in `{-1, 0, 1, 2}` |
|
|
140
|
-
*/
|
|
141
|
-
export const PluginProgramAdjacencyGetMatrixResult = z.object({
|
|
142
|
-
ids: z.array(z.string()),
|
|
143
|
-
departmentIds: z.array(z.string().nullable()).optional(),
|
|
144
|
-
matrix: z.array(z.array(z.number())),
|
|
145
|
-
})
|
|
146
|
-
export type PluginProgramAdjacencyGetMatrixResult = z.infer<
|
|
147
|
-
typeof PluginProgramAdjacencyGetMatrixResult
|
|
148
|
-
>
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Result of {@linkcode PluginProgramAdjacencyApi.compute}.
|
|
152
|
-
*
|
|
153
|
-
* | Property | Type | Description |
|
|
154
|
-
* |---|---|---|
|
|
155
|
-
* | `success` | `boolean` | `true` when the data is fresh or the run completed |
|
|
156
|
-
* | `error` | `string \| undefined` | Failure reason when `success` is `false` |
|
|
157
|
-
*/
|
|
158
|
-
export const PluginProgramAdjacencyComputeResult = z.object({
|
|
159
|
-
success: z.boolean(),
|
|
160
|
-
error: z.string().optional(),
|
|
161
|
-
})
|
|
162
|
-
export type PluginProgramAdjacencyComputeResult = z.infer<
|
|
163
|
-
typeof PluginProgramAdjacencyComputeResult
|
|
164
|
-
>
|
|
1
|
+
import * as z from "zod"
|
|
2
|
+
import { PluginApiReturn } from "../../types"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Program adjacency — the proximity relationships between departments or
|
|
6
|
+
* spaces.
|
|
7
|
+
*
|
|
8
|
+
* Adjacency is stage one of the product's space-planning workflow (compute →
|
|
9
|
+
* arrange → pack): the AI service scores which program elements need to be
|
|
10
|
+
* near each other, and the geometry contributes physical contact. Cell values:
|
|
11
|
+
*
|
|
12
|
+
* | Value | Meaning |
|
|
13
|
+
* |---|---|
|
|
14
|
+
* | `2` | Direct — adjacency required |
|
|
15
|
+
* | `1` | Indirect — nearby preferred, or physical contact |
|
|
16
|
+
* | `-1` | Restricted — must NOT be adjacent |
|
|
17
|
+
* | `0` | No relationship — or adjacency was never computed |
|
|
18
|
+
*
|
|
19
|
+
* Zeros are ambiguous **by design** (the engine cannot distinguish "no
|
|
20
|
+
* relationship" from "never computed"): call
|
|
21
|
+
* {@linkcode PluginProgramAdjacencyApi.compute} first when you need fresh
|
|
22
|
+
* data. Persisted matrices auto-hydrate on scene load, so warm reads are the
|
|
23
|
+
* common case. The arrange/pack stages of the workflow live in
|
|
24
|
+
* {@linkcode PluginProgramLayoutApi} (`program.layout`).
|
|
25
|
+
*
|
|
26
|
+
* Accessed via `snaptrude.program.adjacency`.
|
|
27
|
+
*/
|
|
28
|
+
export abstract class PluginProgramAdjacencyApi {
|
|
29
|
+
constructor() {}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Read the adjacency matrix at the department or space level.
|
|
33
|
+
*
|
|
34
|
+
* Returns a square `matrix` whose rows/columns are aligned to `ids`
|
|
35
|
+
* (component ids). Pass `ids` to read a sub-matrix in that order; omit it to
|
|
36
|
+
* get every eligible element at that level. Cell values:
|
|
37
|
+
*
|
|
38
|
+
* | Value | Meaning |
|
|
39
|
+
* |---|---|
|
|
40
|
+
* | `2` | Direct — adjacency required |
|
|
41
|
+
* | `1` | Indirect — nearby preferred, or physical contact |
|
|
42
|
+
* | `-1` | Restricted — must NOT be adjacent |
|
|
43
|
+
* | `0` | No relationship — or adjacency was never computed |
|
|
44
|
+
*
|
|
45
|
+
* Zeros are ambiguous by design — call
|
|
46
|
+
* {@linkcode PluginProgramAdjacencyApi.compute} first for fresh data
|
|
47
|
+
* (persisted matrices auto-hydrate on scene load, so warm reads are the
|
|
48
|
+
* common case). Space-level relationships are computed within a storey:
|
|
49
|
+
* cross-storey pairs always read `0`. At the `department` level the result
|
|
50
|
+
* also carries `departmentIds`, a parallel array joining each row to the
|
|
51
|
+
* department entity ids returned by `program.departments.list` (the row
|
|
52
|
+
* `ids` are department-mass component ids, not department entity ids).
|
|
53
|
+
*
|
|
54
|
+
* @param level - Read the `"department"` or `"space"` matrix.
|
|
55
|
+
* @param ids - Component ids to read a sub-matrix for, in this order
|
|
56
|
+
* (defaults to every eligible element at the level).
|
|
57
|
+
* @returns A {@linkcode PluginProgramAdjacencyGetMatrixResult} with `ids`,
|
|
58
|
+
* the square `matrix`, and (at department level) `departmentIds`.
|
|
59
|
+
* @throws If an id is unknown or does not match the requested level.
|
|
60
|
+
*
|
|
61
|
+
* @examplePrompt Get the space adjacency matrix
|
|
62
|
+
* @examplePrompt Which departments must be adjacent?
|
|
63
|
+
* @examplePrompt Show the adjacency relationships between departments
|
|
64
|
+
* @examplePrompt Read the adjacency matrix for these spaces
|
|
65
|
+
* @examplePrompt Which rooms are restricted from being next to each other?
|
|
66
|
+
*
|
|
67
|
+
* # Example
|
|
68
|
+
* ```ts
|
|
69
|
+
* const { ids, matrix } = await snaptrude.program.adjacency.getMatrix("department")
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
public abstract getMatrix(
|
|
73
|
+
level: PluginAdjacencyLevel,
|
|
74
|
+
ids?: string[],
|
|
75
|
+
): PluginApiReturn<PluginProgramAdjacencyGetMatrixResult>
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Compute (or refresh) the adjacency data for the project.
|
|
79
|
+
*
|
|
80
|
+
* Runs the AI adjacency precompute and persists the result; a no-op when
|
|
81
|
+
* the stored data is already fresh. A real run takes **~2s at minimum**
|
|
82
|
+
* (engine pacing) plus the AI service round-trip. This is a write (it
|
|
83
|
+
* mutates and persists project analysis data), so it is blocked when plugin
|
|
84
|
+
* writes are disabled.
|
|
85
|
+
*
|
|
86
|
+
* @returns A {@linkcode PluginProgramAdjacencyComputeResult} —
|
|
87
|
+
* `{ success: true }` when the data is fresh or the run completed;
|
|
88
|
+
* `{ success: false, error }` when the AI service could not be reached.
|
|
89
|
+
*
|
|
90
|
+
* @examplePrompt Refresh adjacency analysis
|
|
91
|
+
* @examplePrompt Compute the adjacency matrix for this project
|
|
92
|
+
* @examplePrompt Recalculate which departments should be adjacent
|
|
93
|
+
*
|
|
94
|
+
* # Example
|
|
95
|
+
* ```ts
|
|
96
|
+
* const { success } = await snaptrude.program.adjacency.compute()
|
|
97
|
+
* if (success) {
|
|
98
|
+
* const data = await snaptrude.program.adjacency.getMatrix("space")
|
|
99
|
+
* }
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
public abstract compute(): PluginApiReturn<PluginProgramAdjacencyComputeResult>
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* The level an adjacency matrix is read at.
|
|
107
|
+
*
|
|
108
|
+
* | Value | Description |
|
|
109
|
+
* |---|---|
|
|
110
|
+
* | `"department"` | One row/column per department mass |
|
|
111
|
+
* | `"space"` | One row/column per space (within a storey) |
|
|
112
|
+
*/
|
|
113
|
+
export const PluginAdjacencyLevel = z.enum(["department", "space"])
|
|
114
|
+
export type PluginAdjacencyLevel = z.infer<typeof PluginAdjacencyLevel>
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Arguments for {@linkcode PluginProgramAdjacencyApi.getMatrix}.
|
|
118
|
+
*
|
|
119
|
+
* | Property | Type | Description |
|
|
120
|
+
* |---|---|---|
|
|
121
|
+
* | `level` | {@linkcode PluginAdjacencyLevel} | Read the `"department"` or `"space"` matrix |
|
|
122
|
+
* | `ids` | `string[] \| undefined` | Component ids to read a sub-matrix for, in this order (defaults to every eligible element at the level) |
|
|
123
|
+
*/
|
|
124
|
+
export const PluginProgramAdjacencyGetMatrixArgs = z.object({
|
|
125
|
+
level: PluginAdjacencyLevel,
|
|
126
|
+
ids: z.array(z.string()).optional(),
|
|
127
|
+
})
|
|
128
|
+
export type PluginProgramAdjacencyGetMatrixArgs = z.infer<
|
|
129
|
+
typeof PluginProgramAdjacencyGetMatrixArgs
|
|
130
|
+
>
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Result of {@linkcode PluginProgramAdjacencyApi.getMatrix}.
|
|
134
|
+
*
|
|
135
|
+
* | Property | Type | Description |
|
|
136
|
+
* |---|---|---|
|
|
137
|
+
* | `ids` | `string[]` | Component ids, in matrix row/column order |
|
|
138
|
+
* | `departmentIds` | `(string \| null)[] \| undefined` | Department level only: parallel to `ids`, the department entity id each row belongs to (joinable against `program.departments.list`), `null` when unassigned |
|
|
139
|
+
* | `matrix` | `number[][]` | Square matrix aligned to `ids`; values in `{-1, 0, 1, 2}` |
|
|
140
|
+
*/
|
|
141
|
+
export const PluginProgramAdjacencyGetMatrixResult = z.object({
|
|
142
|
+
ids: z.array(z.string()),
|
|
143
|
+
departmentIds: z.array(z.string().nullable()).optional(),
|
|
144
|
+
matrix: z.array(z.array(z.number())),
|
|
145
|
+
})
|
|
146
|
+
export type PluginProgramAdjacencyGetMatrixResult = z.infer<
|
|
147
|
+
typeof PluginProgramAdjacencyGetMatrixResult
|
|
148
|
+
>
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Result of {@linkcode PluginProgramAdjacencyApi.compute}.
|
|
152
|
+
*
|
|
153
|
+
* | Property | Type | Description |
|
|
154
|
+
* |---|---|---|
|
|
155
|
+
* | `success` | `boolean` | `true` when the data is fresh or the run completed |
|
|
156
|
+
* | `error` | `string \| undefined` | Failure reason when `success` is `false` |
|
|
157
|
+
*/
|
|
158
|
+
export const PluginProgramAdjacencyComputeResult = z.object({
|
|
159
|
+
success: z.boolean(),
|
|
160
|
+
error: z.string().optional(),
|
|
161
|
+
})
|
|
162
|
+
export type PluginProgramAdjacencyComputeResult = z.infer<
|
|
163
|
+
typeof PluginProgramAdjacencyComputeResult
|
|
164
|
+
>
|