@dssp/dcsp 1.0.0-y.0 → 1.0.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 (43) hide show
  1. package/_index.html +0 -5
  2. package/config/config.development.js +2 -1
  3. package/config/config.production.js +2 -1
  4. package/package.json +56 -54
  5. package/schema.graphql +1054 -57
  6. package/translations/en.json +5 -1
  7. package/translations/ko.json +5 -1
  8. package/views/auth-page.html +0 -1
  9. package/views/public/home.html +0 -1
  10. package/dist-client/bootstrap.d.ts +0 -9
  11. package/dist-client/bootstrap.js +0 -255
  12. package/dist-client/bootstrap.js.map +0 -1
  13. package/dist-client/entries/public/home.d.ts +0 -8
  14. package/dist-client/entries/public/home.js +0 -97
  15. package/dist-client/entries/public/home.js.map +0 -1
  16. package/dist-client/icons/menu-icons.d.ts +0 -5
  17. package/dist-client/icons/menu-icons.js +0 -84
  18. package/dist-client/icons/menu-icons.js.map +0 -1
  19. package/dist-client/index.d.ts +0 -0
  20. package/dist-client/index.js +0 -2
  21. package/dist-client/index.js.map +0 -1
  22. package/dist-client/menu.d.ts +0 -1
  23. package/dist-client/menu.js +0 -4
  24. package/dist-client/menu.js.map +0 -1
  25. package/dist-client/pages/sv-user-management.d.ts +0 -5
  26. package/dist-client/pages/sv-user-management.js +0 -219
  27. package/dist-client/pages/sv-user-management.js.map +0 -1
  28. package/dist-client/route.d.ts +0 -1
  29. package/dist-client/route.js +0 -10
  30. package/dist-client/route.js.map +0 -1
  31. package/dist-client/themes/dark.css +0 -51
  32. package/dist-client/themes/light.css +0 -51
  33. package/dist-client/tsconfig.tsbuildinfo +0 -1
  34. package/dist-client/viewparts/menu-tools.d.ts +0 -17
  35. package/dist-client/viewparts/menu-tools.js +0 -172
  36. package/dist-client/viewparts/menu-tools.js.map +0 -1
  37. package/dist-client/viewparts/user-circle.d.ts +0 -5
  38. package/dist-client/viewparts/user-circle.js +0 -26
  39. package/dist-client/viewparts/user-circle.js.map +0 -1
  40. package/dist-server/index.d.ts +0 -0
  41. package/dist-server/index.js +0 -1
  42. package/dist-server/index.js.map +0 -1
  43. package/dist-server/tsconfig.tsbuildinfo +0 -1
package/schema.graphql CHANGED
@@ -3,15 +3,6 @@
3
3
  # !!! DO NOT MODIFY THIS FILE BY YOURSELF !!!
4
4
  # -----------------------------------------------
5
5
 
6
- input APIDocCompletionInput {
7
- code: String!
8
- language: String
9
- }
10
-
11
- type APIDocCompletionOutput {
12
- message: String
13
- }
14
-
15
6
  """Represents a pair of access and refresh tokens."""
16
7
  type AccessToken {
17
8
  """The access token for API authentication."""
@@ -847,6 +838,7 @@ type Attachment {
847
838
  refType: String
848
839
  size: String!
849
840
  tags: Object
841
+ thumbnail: String
850
842
  updatedAt: DateTimeISO!
851
843
  updater: User
852
844
  }
@@ -1155,12 +1147,27 @@ type Board {
1155
1147
  """A list of play groups that this board is a part of."""
1156
1148
  playGroups: [PlayGroup!]
1157
1149
 
1150
+ """
1151
+ Sort order for display. Lower values appear first. Supports fractional values for insertion.
1152
+ """
1153
+ sortOrder: Float
1154
+
1155
+ """
1156
+ Source ImportSession id (board-import) when this board was generated from a drawing/image import.
1157
+ """
1158
+ sourceImportSessionId: String
1159
+
1158
1160
  """The state of the board, can be 'draft' or 'released'."""
1159
1161
  state: String
1160
1162
 
1161
1163
  """A base64 encoded thumbnail image of the board."""
1162
1164
  thumbnail: String
1163
1165
 
1166
+ """
1167
+ Timestamp of the last thumbnail generation. Separate lifecycle from updatedAt; only changes when the thumbnail image itself is regenerated.
1168
+ """
1169
+ thumbnailUpdatedAt: DateTimeISO
1170
+
1164
1171
  """The type of the board, can be 'main', 'sub', or 'popup'."""
1165
1172
  type: String
1166
1173
 
@@ -1174,6 +1181,120 @@ type Board {
1174
1181
  version: Float
1175
1182
  }
1176
1183
 
1184
+ input BoardAIChatInput {
1185
+ """
1186
+ Component categories to surface (e.g. ["3D", "form"]). Subset filter for groupings exposed in component-schemas.
1187
+ """
1188
+ categories: [String!]
1189
+
1190
+ """
1191
+ Component schemas — array of { type, description?, group?, properties? } so the LLM knows valid props per type.
1192
+ """
1193
+ componentSchemas: JSON
1194
+
1195
+ """Current BoardModel JSON."""
1196
+ currentBoard: JSON
1197
+
1198
+ """
1199
+ Component types the LLM is allowed to emit (e.g. ["rect", "label"]). Constrains generation to the current solution.
1200
+ """
1201
+ knownTypes: [String!]
1202
+
1203
+ """
1204
+ Max output tokens override per LLM call. Falls back to assistant default when omitted.
1205
+ """
1206
+ maxTokens: Float
1207
+
1208
+ """
1209
+ Explicit #mention picks from popup — {token, refid}. User text stays clean (#token only); these picks let server resolve deterministically without exposing refid in the user-visible message. Tokens not in this list fall back to free name/id/type matching.
1210
+ """
1211
+ mentions: [BoardAIMentionPickInput!]
1212
+
1213
+ """
1214
+ Conversation history (latest user message at the end). For persisted sessions, only the last user message is appended; older are loaded from DB.
1215
+ """
1216
+ messages: [BoardAILLMMessageInput!]!
1217
+
1218
+ """
1219
+ AI model identifier override (e.g. "claude-opus-4-7"). Falls back to the configured default when omitted.
1220
+ """
1221
+ model: String
1222
+
1223
+ """
1224
+ Capability scopes the AI is allowed to use (e.g. 'create', 'edit', 'style'). Filters which tools are exposed to the LLM.
1225
+ """
1226
+ scopes: [String!]
1227
+
1228
+ """
1229
+ Refids of components currently selected in the modeller (universal numeric handle, things-scene auto-assigned). For "selected" / "선택한" intent. Note: distinct from `id` which is a data-binding name.
1230
+ """
1231
+ selectedRefids: [Int!]
1232
+
1233
+ """
1234
+ ChatSession id. Omit for ad-hoc (no persistence). When given, messages/patches are persisted.
1235
+ """
1236
+ sessionId: String
1237
+
1238
+ """
1239
+ Sampling temperature override. Falls back to assistant default when omitted.
1240
+ """
1241
+ temperature: Float
1242
+ }
1243
+
1244
+ type BoardAIChatOutput {
1245
+ """
1246
+ Ephemeral scene actions (selection/view/mode) — sequence of BoardActionOp. Applied via board-action-execute event on the host. Distinct from `patch` which carries persistent model changes.
1247
+ """
1248
+ actions: JSON
1249
+
1250
+ """Persisted ChatMessage id of the AI reply."""
1251
+ assistantMessageId: String
1252
+
1253
+ """AI client identifier (provider:model)."""
1254
+ clientId: String!
1255
+
1256
+ """Clarifying question when input is ambiguous."""
1257
+ followUp: String
1258
+
1259
+ """BoardEditPatch."""
1260
+ patch: JSON
1261
+
1262
+ """Persisted PatchEntry id (when patch was generated)."""
1263
+ patchId: String
1264
+
1265
+ """Conversational reply."""
1266
+ reply: String!
1267
+
1268
+ """Echo of session id (when persisted)."""
1269
+ sessionId: String
1270
+
1271
+ """
1272
+ Tool usages collected during agentic loop — sequence of {name, arguments, result, kind}. UI fold-able box for transparency / debug.
1273
+ """
1274
+ toolUsages: JSON
1275
+
1276
+ """Persisted ChatMessage id of the user input."""
1277
+ userMessageId: String
1278
+ }
1279
+
1280
+ input BoardAILLMMessageInput {
1281
+ """Message content"""
1282
+ content: String!
1283
+
1284
+ """Role: 'user' or 'assistant'"""
1285
+ role: String!
1286
+ }
1287
+
1288
+ input BoardAIMentionPickInput {
1289
+ """
1290
+ Refid explicitly picked from popup. Server uses this for deterministic resolution — bypasses fallback name/id/type matching for this token.
1291
+ """
1292
+ refid: Int!
1293
+
1294
+ """Token used by user (e.g. "경광등1" — the part after #)."""
1295
+ token: String!
1296
+ }
1297
+
1177
1298
  """Represents a board that a user has marked as a favorite."""
1178
1299
  type BoardFavorite {
1179
1300
  """The timestamp when the board was created."""
@@ -1209,12 +1330,27 @@ type BoardFavorite {
1209
1330
  """A list of play groups that this board is a part of."""
1210
1331
  playGroups: [PlayGroup!]
1211
1332
 
1333
+ """
1334
+ Sort order for display. Lower values appear first. Supports fractional values for insertion.
1335
+ """
1336
+ sortOrder: Float
1337
+
1338
+ """
1339
+ Source ImportSession id (board-import) when this board was generated from a drawing/image import.
1340
+ """
1341
+ sourceImportSessionId: String
1342
+
1212
1343
  """The state of the board, can be 'draft' or 'released'."""
1213
1344
  state: String
1214
1345
 
1215
1346
  """A base64 encoded thumbnail image of the board."""
1216
1347
  thumbnail: String
1217
1348
 
1349
+ """
1350
+ Timestamp of the last thumbnail generation. Separate lifecycle from updatedAt; only changes when the thumbnail image itself is regenerated.
1351
+ """
1352
+ thumbnailUpdatedAt: DateTimeISO
1353
+
1218
1354
  """The type of the board, can be 'main', 'sub', or 'popup'."""
1219
1355
  type: String
1220
1356
 
@@ -1306,6 +1442,16 @@ type BoardList {
1306
1442
  total: Int!
1307
1443
  }
1308
1444
 
1445
+ type BoardMetaSuggestion {
1446
+ """
1447
+ Suggested detailed description — combines user prompt, AI importStrategy narrative, and category distribution stats.
1448
+ """
1449
+ description: String!
1450
+
1451
+ """Suggested short board name (collision-free with current domain)."""
1452
+ name: String!
1453
+ }
1454
+
1309
1455
  """Input for updating (patching) an existing board."""
1310
1456
  input BoardPatch {
1311
1457
  """The new description for the board."""
@@ -1514,6 +1660,7 @@ type BuildingInspection {
1514
1660
  creator: User
1515
1661
  deletedAt: DateTimeISO
1516
1662
  drawingMarker: String
1663
+ failCount: Float
1517
1664
  id: ID!
1518
1665
  manager: ProjectManagerOutput
1519
1666
  memo: String
@@ -1582,6 +1729,7 @@ type BuildingInspectionHistory {
1582
1729
  createdAt: DateTimeISO
1583
1730
  creator: User
1584
1731
  drawingMarker: String
1732
+ failCount: Float
1585
1733
  id: ID!
1586
1734
  loggedAt: DateTimeISO
1587
1735
  manager: ProjectManagerOutput
@@ -1611,6 +1759,9 @@ type BuildingInspectionSummary {
1611
1759
  """검측 통과 수"""
1612
1760
  pass: Int!
1613
1761
 
1762
+ """재검측 대기 수 (failCount > 0 인 WAIT/OVERALL_WAIT)"""
1763
+ reWait: Int
1764
+
1614
1765
  """검측 요청 수"""
1615
1766
  request: Int!
1616
1767
 
@@ -1635,6 +1786,11 @@ type BuildingInspectionSummaryOfLevel {
1635
1786
  wait: Int!
1636
1787
  }
1637
1788
 
1789
+ input BuildingInspectionsOfBuilding {
1790
+ buildingId: String!
1791
+ limit: Float
1792
+ }
1793
+
1638
1794
  input BuildingInspectionsOfBuildingLevel {
1639
1795
  buildingLevelId: String!
1640
1796
  endDate: String
@@ -1645,6 +1801,9 @@ input BuildingInspectionsOfBuildingLevel {
1645
1801
  input BuildingInspectionsOfProject {
1646
1802
  limit: Float
1647
1803
  projectId: String!
1804
+
1805
+ """상태 필터 (WAIT, REQUEST, FAIL, RE_WAIT, PASS)"""
1806
+ statusFilter: String
1648
1807
  }
1649
1808
 
1650
1809
  """층 정보"""
@@ -1692,12 +1851,111 @@ input BuildingPatch {
1692
1851
  name: String
1693
1852
  }
1694
1853
 
1695
- input ChatCompletionInput {
1854
+ """A single chat message in a ChatSession."""
1855
+ type ChatMessage {
1856
+ """Message content"""
1696
1857
  content: String!
1858
+
1859
+ """Creation timestamp."""
1860
+ createdAt: DateTimeISO
1861
+
1862
+ """User who triggered this message."""
1863
+ creator: User
1864
+
1865
+ """Soft delete timestamp."""
1866
+ deletedAt: DateTimeISO
1867
+ id: ID
1868
+
1869
+ """
1870
+ Id of the message this one is in-response-to / continues. Enables linear / branching / tree structures.
1871
+ """
1872
+ parentMessageId: String
1873
+
1874
+ """ImportSession.id this message triggered (if any)."""
1875
+ relatedImportSessionId: String
1876
+
1877
+ """PatchEntry.id this message triggered (if any)."""
1878
+ relatedPatchId: String
1879
+
1880
+ """'user' | 'assistant' | 'system'"""
1881
+ role: String!
1882
+
1883
+ """
1884
+ Tool usage trace — array of {name, arguments, result, kind}. Only on assistant messages.
1885
+ """
1886
+ toolUsagesJson: JSON
1887
+
1888
+ """Last update timestamp (relevant once message editing is supported)."""
1889
+ updatedAt: DateTimeISO
1890
+
1891
+ """Last user to update this message (for future edit support)."""
1892
+ updater: User
1697
1893
  }
1698
1894
 
1699
- type ChatCompletionOutput {
1700
- message: String
1895
+ """AI 협력 세션 — Board 와 결합. 한 보드에 여러 세션 가능 (thread / 사용자별 / 컨텍스트별 등 미래 확장)."""
1896
+ type ChatSession {
1897
+ aiClientId: String
1898
+
1899
+ """
1900
+ Connected Board id. Multiple sessions per board allowed (future: threads / per-user / contexts).
1901
+ """
1902
+ boardId: String
1903
+ createdAt: DateTimeISO
1904
+
1905
+ """User who created this session."""
1906
+ creator: User
1907
+ domain: Domain
1908
+ id: ID
1909
+
1910
+ """Compressed summary of older messages (for token saving)."""
1911
+ lastSummary: String
1912
+
1913
+ """User-given name of this session (tab label / identification)."""
1914
+ name: String
1915
+ updatedAt: DateTimeISO
1916
+
1917
+ """User who last updated this session."""
1918
+ updater: User
1919
+ }
1920
+
1921
+ """
1922
+ Participant of a ChatSession — links a User to a session with a role. Foundation for multi-user chat / per-user filtering / member display.
1923
+ """
1924
+ type ChatSessionParticipant {
1925
+ """Joined-at timestamp."""
1926
+ createdAt: DateTimeISO
1927
+
1928
+ """
1929
+ User who created this participant record (typically session owner who invited).
1930
+ """
1931
+ creator: User
1932
+
1933
+ """Soft delete (= left session) timestamp."""
1934
+ deletedAt: DateTimeISO
1935
+
1936
+ """Domain to which this participant belongs."""
1937
+ domain: Domain
1938
+
1939
+ """Unique participant id."""
1940
+ id: ID!
1941
+
1942
+ """Last seen / activity timestamp (presence indicator)."""
1943
+ lastSeenAt: DateTimeISO
1944
+
1945
+ """Role of this participant: owner | member | viewer."""
1946
+ role: String!
1947
+
1948
+ """The ChatSession this participation belongs to."""
1949
+ session: ChatSession
1950
+
1951
+ """Last update timestamp (role change / lastSeenAt bump)."""
1952
+ updatedAt: DateTimeISO
1953
+
1954
+ """Last user to update this participant record (e.g., role change)."""
1955
+ updater: User
1956
+
1957
+ """The user participating in the session."""
1958
+ user: User
1701
1959
  }
1702
1960
 
1703
1961
  type Checklist {
@@ -1822,14 +2080,23 @@ type ChecklistItem {
1822
2080
  detailType: String!
1823
2081
  id: ID!
1824
2082
  inspctionCriteria: String
2083
+ kcsCriteria: String
1825
2084
  mainType: String!
1826
2085
  name: String
1827
2086
  sequence: Int
2087
+ siteSpecCriteria: String
1828
2088
  supervisoryConfirmStatus: String
1829
2089
  updatedAt: DateTimeISO
1830
2090
  updater: User
1831
2091
  }
1832
2092
 
2093
+ input ChecklistItemAiJudgment {
2094
+ id: ID!
2095
+
2096
+ """AI 판정 결과 (T: 적합, F: 부적합, null: 미판정)"""
2097
+ supervisoryConfirmStatus: ChecklistItemConfirmStatus
2098
+ }
2099
+
1833
2100
  """Entity for ChecklistItemComment"""
1834
2101
  type ChecklistItemComment {
1835
2102
  checklistItem: ChecklistItem
@@ -1846,6 +2113,12 @@ input ChecklistItemCommentPatch {
1846
2113
  id: ID
1847
2114
  }
1848
2115
 
2116
+ """적합 상태"""
2117
+ enum ChecklistItemConfirmStatus {
2118
+ F
2119
+ T
2120
+ }
2121
+
1849
2122
  """History Entity of ChecklistItem"""
1850
2123
  type ChecklistItemHistory {
1851
2124
  checklistHistory: ChecklistHistory
@@ -1860,10 +2133,12 @@ type ChecklistItemHistory {
1860
2133
  detailType: String!
1861
2134
  id: ID!
1862
2135
  inspctionCriteria: String
2136
+ kcsCriteria: String
1863
2137
  loggedAt: DateTimeISO
1864
2138
  mainType: String!
1865
2139
  name: String
1866
2140
  sequence: Float
2141
+ siteSpecCriteria: String
1867
2142
  supervisoryConfirmStatus: String
1868
2143
  updater: User
1869
2144
  }
@@ -1876,8 +2151,10 @@ type ChecklistItemHistoryList {
1876
2151
  input ChecklistItemInputType {
1877
2152
  detailType: String!
1878
2153
  inspctionCriteria: String
2154
+ kcsCriteria: String
1879
2155
  mainType: String!
1880
2156
  name: String!
2157
+ siteSpecCriteria: String
1881
2158
  }
1882
2159
 
1883
2160
  type ChecklistItemList {
@@ -1929,6 +2206,7 @@ type ChecklistTemplateItem {
1929
2206
  detailTypeName: String!
1930
2207
  id: ID!
1931
2208
  inspctionCriteria: String
2209
+ inspctionCriteriaText: String
1932
2210
  mainType: String!
1933
2211
  name: String!
1934
2212
  sequence: Int
@@ -1948,6 +2226,7 @@ input ChecklistTemplateItemPatch {
1948
2226
  detailType: String
1949
2227
  id: ID
1950
2228
  inspctionCriteria: String
2229
+ inspctionCriteriaText: String
1951
2230
  mainType: String
1952
2231
  name: String
1953
2232
  sequence: Int
@@ -1987,16 +2266,6 @@ input ChecklistTypePatch {
1987
2266
  mainType: String
1988
2267
  }
1989
2268
 
1990
- input CodeDecipherInput {
1991
- code: String!
1992
- language: String
1993
- system: String
1994
- }
1995
-
1996
- type CodeDecipherOutput {
1997
- message: String
1998
- }
1999
-
2000
2269
  """Entity for CommonCode"""
2001
2270
  type CommonCode {
2002
2271
  createdAt: DateTimeISO
@@ -2079,6 +2348,11 @@ type Connection {
2079
2348
  """Unique identifier for the connection."""
2080
2349
  id: ID!
2081
2350
 
2351
+ """
2352
+ Inheritance mode for child domains. ISOLATE = per-child instance with isolated session. SHARE = shared parent instance. null = use Connector default (falls back to ISOLATE).
2353
+ """
2354
+ inheritanceMode: ConnectionInheritanceMode
2355
+
2082
2356
  """The name of the connection."""
2083
2357
  name: String!
2084
2358
 
@@ -2103,6 +2377,14 @@ type Connection {
2103
2377
  updater: User
2104
2378
  }
2105
2379
 
2380
+ """
2381
+ Child domain inheritance mode — ISOLATE: per-child instance with isolated session/credentials. SHARE: single parent instance reused by all children.
2382
+ """
2383
+ enum ConnectionInheritanceMode {
2384
+ ISOLATE
2385
+ SHARE
2386
+ }
2387
+
2106
2388
  """A paginated list of connections."""
2107
2389
  type ConnectionList {
2108
2390
  """The list of connection items."""
@@ -2134,6 +2416,11 @@ input ConnectionPatch {
2134
2416
  """The unique identifier of the connection to update."""
2135
2417
  id: ID
2136
2418
 
2419
+ """
2420
+ Inheritance mode for child domains. ISOLATE = per-child instance. SHARE = shared parent instance. null = use connector default.
2421
+ """
2422
+ inheritanceMode: ConnectionInheritanceMode
2423
+
2137
2424
  """The new name for the connection."""
2138
2425
  name: String
2139
2426
 
@@ -2163,6 +2450,11 @@ type ConnectionState {
2163
2450
  """The unique identifier of the connection."""
2164
2451
  id: String
2165
2452
 
2453
+ """
2454
+ Inheritance mode for child domains. ISOLATE = per-child instance. SHARE = shared parent instance. null = use connector default (falls back to ISOLATE).
2455
+ """
2456
+ inheritanceMode: ConnectionInheritanceMode
2457
+
2166
2458
  """The name of the connection."""
2167
2459
  name: String
2168
2460
 
@@ -2210,6 +2502,68 @@ type ConnectorType {
2210
2502
  taskPrefixes: [String!]
2211
2503
  }
2212
2504
 
2505
+ type ConstructionChecklistTemplate {
2506
+ constructionChecklistTemplateItems: [ConstructionChecklistTemplateItem!]
2507
+ constructionDetailTypeId: String!
2508
+ constructionTypeId: String!
2509
+ createdAt: DateTimeISO
2510
+ creator: User
2511
+ deletedAt: DateTimeISO
2512
+ domain: Domain
2513
+ id: ID!
2514
+ updatedAt: DateTimeISO
2515
+ updater: User
2516
+ }
2517
+
2518
+ type ConstructionChecklistTemplateItem {
2519
+ constructionChecklistTemplate: ConstructionChecklistTemplate
2520
+ createdAt: DateTimeISO
2521
+ creator: User
2522
+ criteriaRequestStatus: CriteriaRequestStatus
2523
+ id: ID!
2524
+ inspctionCriteria: String
2525
+ mainType: String
2526
+ name: String!
2527
+ recommendation1: String
2528
+ recommendation2: String
2529
+ recommendation3: String
2530
+ recommendation4: String
2531
+ recommendation5: String
2532
+ sequence: Int
2533
+ updatedAt: DateTimeISO
2534
+ updater: User
2535
+ }
2536
+
2537
+ type ConstructionChecklistTemplateItemList {
2538
+ items: [ConstructionChecklistTemplateItem!]!
2539
+ total: Int!
2540
+ }
2541
+
2542
+ input ConstructionChecklistTemplateItemPatch {
2543
+ id: ID
2544
+ inspctionCriteria: String
2545
+ mainType: String
2546
+ name: String
2547
+ recommendation1: String
2548
+ recommendation2: String
2549
+ recommendation3: String
2550
+ recommendation4: String
2551
+ recommendation5: String
2552
+ sequence: Int
2553
+ }
2554
+
2555
+ type ConstructionChecklistTemplateList {
2556
+ items: [ConstructionChecklistTemplate!]!
2557
+ total: Int!
2558
+ }
2559
+
2560
+ input ConstructionChecklistTemplatePatch {
2561
+ constructionDetailTypeId: String
2562
+ constructionTypeId: String
2563
+ cuFlag: String
2564
+ id: ID
2565
+ }
2566
+
2213
2567
  """세부 공종 타입"""
2214
2568
  type ConstructionDetailType {
2215
2569
  constructionType: ConstructionType
@@ -2244,6 +2598,7 @@ type ConstructionType {
2244
2598
  domain: Domain
2245
2599
  id: ID!
2246
2600
  name: String
2601
+ projectType: String
2247
2602
  updatedAt: DateTimeISO
2248
2603
  updater: User
2249
2604
  }
@@ -2258,6 +2613,7 @@ input ConstructionTypePatch {
2258
2613
  description: String
2259
2614
  id: ID
2260
2615
  name: String
2616
+ projectType: String
2261
2617
  }
2262
2618
 
2263
2619
  """Entity for Contact"""
@@ -2332,6 +2688,11 @@ type Data {
2332
2688
  The tag name attached to the data, used for filtering and identification.
2333
2689
  """
2334
2690
  tag: String!
2691
+
2692
+ """
2693
+ Server publish timestamp in epoch milliseconds, stamped at delivery. Used by clients to monitor data delivery lag.
2694
+ """
2695
+ ts: Float
2335
2696
  }
2336
2697
 
2337
2698
  """
@@ -2500,15 +2861,18 @@ input DataItemPatch {
2500
2861
 
2501
2862
  """type enumeration of a data-item"""
2502
2863
  enum DataItemType {
2864
+ audio
2503
2865
  boolean
2504
2866
  date
2505
2867
  datetime
2506
2868
  file
2869
+ image
2507
2870
  number
2508
2871
  radio
2509
2872
  select
2510
2873
  signature
2511
2874
  text
2875
+ video
2512
2876
  }
2513
2877
 
2514
2878
  """
@@ -3539,6 +3903,27 @@ type DomainList {
3539
3903
  total: Int
3540
3904
  }
3541
3905
 
3906
+ """An ownership record binding a User to a Domain (multi-owner support)."""
3907
+ type DomainOwner {
3908
+ """Domain that the user owns."""
3909
+ domain: Domain!
3910
+
3911
+ """When the ownership was granted."""
3912
+ grantedAt: DateTimeISO!
3913
+
3914
+ """User who granted this ownership (audit)."""
3915
+ grantedBy: User
3916
+
3917
+ """Unique identifier."""
3918
+ id: ID!
3919
+
3920
+ """Optional reason/memo for granting ownership."""
3921
+ reason: String
3922
+
3923
+ """User who owns the domain."""
3924
+ user: User!
3925
+ }
3926
+
3542
3927
  """Input type for updating an existing domain entity."""
3543
3928
  input DomainPatch {
3544
3929
  """Additional attributes for the domain in key-value pairs."""
@@ -3976,6 +4361,22 @@ input EnvVarPatch {
3976
4361
  value: String
3977
4362
  }
3978
4363
 
4364
+ """Resolved state of an EnvVar key with ancestor closest-wins lookup."""
4365
+ type EnvVarResolution {
4366
+ """EnvVar id (only when found in any domain)."""
4367
+ envVarId: String
4368
+ hasValue: Boolean!
4369
+ key: String!
4370
+ sourceDomainId: String
4371
+ sourceDomainName: String
4372
+ status: String!
4373
+
4374
+ """
4375
+ Resolved value when found. Client decides masking based on propertySpec type.
4376
+ """
4377
+ value: String
4378
+ }
4379
+
3979
4380
  """Entity for Favorite"""
3980
4381
  type Favorite {
3981
4382
  createdAt: DateTimeISO
@@ -3993,6 +4394,48 @@ type FavoriteList {
3993
4394
  total: Int!
3994
4395
  }
3995
4396
 
4397
+ """Entity for FieldDocument"""
4398
+ type FieldDocument {
4399
+ aiSummary: String
4400
+ aiSummaryStatus: FieldDocumentSummaryStatus
4401
+ code: String!
4402
+ createdAt: DateTimeISO
4403
+ creator: User
4404
+ deletedAt: DateTimeISO
4405
+ domain: Domain
4406
+
4407
+ """파일 크기"""
4408
+ fileSize: String
4409
+
4410
+ """첨부파일 fullpath"""
4411
+ fullpath: String
4412
+ id: ID
4413
+ isFavorite: Boolean
4414
+ name: String!
4415
+ projectId: String!
4416
+ sourceRefId: String
4417
+ sourceType: String
4418
+ updatedAt: DateTimeISO
4419
+ updater: User
4420
+ }
4421
+
4422
+ type FieldDocumentCodeCount {
4423
+ code: String!
4424
+ count: Int!
4425
+ }
4426
+
4427
+ type FieldDocumentList {
4428
+ items: [FieldDocument!]!
4429
+ total: Int!
4430
+ }
4431
+
4432
+ """AI 문서 요약 요청 상태"""
4433
+ enum FieldDocumentSummaryStatus {
4434
+ FAIL
4435
+ REQUEST
4436
+ SUCCESS
4437
+ }
4438
+
3996
4439
  """Input type for specifying a filter condition in a list query."""
3997
4440
  input Filter {
3998
4441
  """The field name to apply the filter on."""
@@ -4098,14 +4541,68 @@ input GroupPatch {
4098
4541
  name: String
4099
4542
  }
4100
4543
 
4101
- input ImageCompletionInput {
4102
- count: Float!
4103
- description: String!
4104
- size: String!
4544
+ input ImportBoardAsyncInput {
4545
+ """Apply Stage 4 (data binding)."""
4546
+ applyBinding: Boolean
4547
+
4548
+ """
4549
+ Attachment id of the source drawing file (uploaded via attachment-base).
4550
+ """
4551
+ attachmentId: String!
4552
+
4553
+ """ChatSession id when triggered from board-ai chat."""
4554
+ chatSessionId: String
4555
+
4556
+ """Flip Y axis (CAD Y-up → scene Y-down)."""
4557
+ flipY: Boolean
4558
+
4559
+ """Normalize coordinates so minX,minY=0"""
4560
+ normalizeOrigin: Boolean
4561
+
4562
+ """Adapter parse options (excludeLayers, maxEntities, ...)."""
4563
+ parseOptions: JSON
4564
+
4565
+ """Scale factor (e.g. 1 for mm:1unit)."""
4566
+ scale: Float
4567
+
4568
+ """Registry scopes to use (board-import)."""
4569
+ scopes: [String!]
4570
+
4571
+ """
4572
+ User-provided context / hints about the drawing — passed to VLM as additional guidance. e.g. "fab lithography zone, central rectangles are stockers, thin lines are OHT rails."
4573
+ """
4574
+ userPrompt: String
4105
4575
  }
4106
4576
 
4107
- type ImageCompletionOutput {
4108
- images: String
4577
+ """도면 보드 변환 작업의 영속 단위 (비동기 진행상태 추적)."""
4578
+ type ImportSession {
4579
+ """Attachment id (the source drawing file)"""
4580
+ attachmentId: String!
4581
+
4582
+ """ChatSession id when triggered from chat (board-ai)."""
4583
+ chatSessionId: String
4584
+ completedAt: DateTimeISO
4585
+ createdAt: DateTimeISO
4586
+ creator: User
4587
+ domain: Domain
4588
+ id: ID
4589
+ message: String
4590
+
4591
+ """Options used (parsed JSON)."""
4592
+ options: JSON
4593
+
4594
+ """Progress percentage 0..100"""
4595
+ progress: Float!
4596
+
4597
+ """Result (parsed JSON): { boardModel, stats, warnings }."""
4598
+ result: JSON
4599
+
4600
+ """queued | parsing | mapping | assembling | binding | completed | failed"""
4601
+ status: String!
4602
+
4603
+ """Total entities counted (when known)."""
4604
+ totalEntities: Int
4605
+ updatedAt: DateTimeISO
4109
4606
  }
4110
4607
 
4111
4608
  """
@@ -4281,6 +4778,11 @@ enum IssueStatus {
4281
4778
  STATUS_B
4282
4779
  }
4283
4780
 
4781
+ """
4782
+ The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).
4783
+ """
4784
+ scalar JSON @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf")
4785
+
4284
4786
  """
4285
4787
  A field whose value is a JSON Web Token (JWT): https://jwt.io/introduction.
4286
4788
  """
@@ -4361,6 +4863,11 @@ type Kpi {
4361
4863
  """
4362
4864
  scoreFormula: String
4363
4865
 
4866
+ """
4867
+ value → score 변환 방식. NONE: 미설정, DIRECT: value=score(변환 없음), FORMULA: scoreFormula 수식, LOOKUP: grade table(1D), CUSTOM: 2D 룩업 등 특수 변환.
4868
+ """
4869
+ scoreType: KpiScoreType
4870
+
4364
4871
  """Current state of the KPI (DRAFT, RELEASED, ARCHIVED)."""
4365
4872
  state: String
4366
4873
  targetValue: Float
@@ -4385,6 +4892,11 @@ type Kpi {
4385
4892
  orgScope: String
4386
4893
  ): KpiValue
4387
4894
 
4895
+ """
4896
+ value 획득 방식. MEASURED: 외부 시스템 수집 측정값, ASSESSED: 감리자 직접 평가(1~5), CALCULATED: formula 자동 계산, COMPOSITE: 다차원 룩업 결과.
4897
+ """
4898
+ valueType: KpiValueType
4899
+
4388
4900
  """
4389
4901
  Version number of the KPI. Increments on each modification. When the KPI is released, a snapshot is saved in kpi-history and the status becomes RELEASED. Editing after release increases the version and sets status to DRAFT.
4390
4902
  """
@@ -4504,6 +5016,9 @@ type KpiMetric {
4504
5016
  """Aggregation period type for this metric."""
4505
5017
  periodType: KpiPeriodType!
4506
5018
 
5019
+ """목록 표시 순서(오름차순). 미지정(null)은 뒤로 정렬."""
5020
+ rank: Int
5021
+
4507
5022
  """
4508
5023
  Cron schedule string for periodic KPI value aggregation (e.g., "0 0 * * *" for daily).
4509
5024
  """
@@ -4553,7 +5068,7 @@ input KpiMetricPatch {
4553
5068
  """데이터 수집 방식"""
4554
5069
  collectType: KpiMetricCollectType
4555
5070
  cuFlag: String
4556
- dataSetId: ID
5071
+ dataSet: ObjectRef
4557
5072
  description: String
4558
5073
  fieldName: String
4559
5074
  id: ID
@@ -4562,6 +5077,9 @@ input KpiMetricPatch {
4562
5077
  """Aggregation period type for this metric."""
4563
5078
  periodType: KpiPeriodType
4564
5079
 
5080
+ """목록 표시 순서(오름차순). 미지정(null)은 뒤로 정렬."""
5081
+ rank: Int
5082
+
4565
5083
  """
4566
5084
  Cron schedule string for periodic KPI value aggregation (e.g., "0 0 * * *" for daily).
4567
5085
  """
@@ -4796,6 +5314,9 @@ input KpiPatch {
4796
5314
  """
4797
5315
  scoreFormula: String
4798
5316
 
5317
+ """value → score 변환 방식."""
5318
+ scoreType: KpiScoreType
5319
+
4799
5320
  """Current state of the KPI (DRAFT, RELEASED, ARCHIVED)."""
4800
5321
  state: KpiStatus
4801
5322
 
@@ -4805,6 +5326,9 @@ input KpiPatch {
4805
5326
  """Timezone for the KPI schedule."""
4806
5327
  timezone: String
4807
5328
 
5329
+ """value 획득 방식."""
5330
+ valueType: KpiValueType
5331
+
4808
5332
  """
4809
5333
  Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, etc.
4810
5334
  """
@@ -4928,6 +5452,16 @@ input KpiScopePatch {
4928
5452
  validationPattern: String
4929
5453
  }
4930
5454
 
5455
+ """
5456
+ value → score 변환 방식. DIRECT: value=score(변환 없음), FORMULA: scoreFormula 수식 적용, LOOKUP: grade table(1D) 매핑, CUSTOM: 2D 룩업 등 특수 변환.
5457
+ """
5458
+ enum KpiScoreType {
5459
+ CUSTOM
5460
+ DIRECT
5461
+ FORMULA
5462
+ LOOKUP
5463
+ }
5464
+
4931
5465
  """
4932
5466
  KPI Statistics Entity - Stores comprehensive statistical information for KPIs and Categories including central tendency measures (mean, median), dispersion metrics (standard deviation, variance), range indicators (min, max), and percentile distributions (25th, 75th percentiles, IQR). Supports both KPI and Category targets with flexible period-based aggregation (daily, weekly, monthly, yearly). Includes extensible JSON fields for additional metrics and metadata for calculation tracking.
4933
5467
  """
@@ -5107,7 +5641,7 @@ type KpiValue {
5107
5641
  periodType: KpiPeriodType!
5108
5642
 
5109
5643
  """
5110
- Performance score calculated from KPI value using scoreFormula or grades lookup table. Range: 0-1.
5644
+ Performance score calculated from KPI value using scoreFormula or grades lookup table.
5111
5645
  """
5112
5646
  score: Float
5113
5647
 
@@ -5198,6 +5732,21 @@ input KpiValuePatch {
5198
5732
  version: Int
5199
5733
  }
5200
5734
 
5735
+ """
5736
+ value 획득 방식. MEASURED: 외부 시스템 수집 측정값, ASSESSED: 감리자 직접 평가(1~5), CALCULATED: formula 자동 계산, COMPOSITE: 다차원 복합 입력 결과.
5737
+ """
5738
+ enum KpiValueType {
5739
+ ASSESSED
5740
+ CALCULATED
5741
+ COMPOSITE
5742
+ MEASURED
5743
+ }
5744
+
5745
+ type KpiValuesObject {
5746
+ kpiName: String!
5747
+ value: Float!
5748
+ }
5749
+
5201
5750
  """Visualization type for KPI display (CARD, GAUGE, PROGRESS, etc.)"""
5202
5751
  enum KpiVizType {
5203
5752
  BADGE
@@ -5326,12 +5875,39 @@ type ManagerOutput {
5326
5875
  userId: ID!
5327
5876
  }
5328
5877
 
5329
- input ManagerPatch {
5330
- id: ID
5331
- name: String
5332
- phone: String
5333
- position: String
5334
- userId: ID
5878
+ input ManagerPatch {
5879
+ id: ID
5880
+ name: String
5881
+ phone: String
5882
+ position: String
5883
+ userId: ID
5884
+ }
5885
+
5886
+ input MaterializeImportSessionInput {
5887
+ """Optional Board description."""
5888
+ description: String
5889
+
5890
+ """Optional Group id to attach the Board to."""
5891
+ groupId: ID
5892
+
5893
+ """New Board name."""
5894
+ name: String!
5895
+
5896
+ """ImportSession id (must be in completed state)."""
5897
+ sessionId: ID!
5898
+
5899
+ """
5900
+ Base64 thumbnail. If omitted, board-service default empty thumbnail is used.
5901
+ """
5902
+ thumbnail: String
5903
+
5904
+ """Board type — 'main' | 'sub' | 'popup'. Default 'main'."""
5905
+ type: String
5906
+
5907
+ """
5908
+ ImportSession 의 결과 시안 중 하나의 id. 'as-is' / 'scene' / 'auto-fit'. 미지정 시 default variant (보통 'scene') 사용.
5909
+ """
5910
+ variantId: String
5335
5911
  }
5336
5912
 
5337
5913
  """Entity for Menu"""
@@ -5712,6 +6288,9 @@ type Mutation {
5712
6288
  username: String!
5713
6289
  ): Boolean!
5714
6290
 
6291
+ """Add a user as owner of the current domain."""
6292
+ addDomainOwner(reason: String, username: String!): DomainOwner!
6293
+
5715
6294
  """To apply to all building inspection"""
5716
6295
  applyToAllBuildingInspection(buildingInspectionId: String!): Boolean!
5717
6296
 
@@ -5732,6 +6311,14 @@ type Mutation {
5732
6311
  """
5733
6312
  attachContact(contactId: String!, id: String!): Employee!
5734
6313
 
6314
+ """
6315
+ 썸네일이 없는 기존 첨부파일들에 대해 서버에서 썸네일을 일괄 생성한다. 한 호출당 limit 개까지만 처리하며, remaining > 0 이면 반복 호출 필요.
6316
+ """
6317
+ backfillAttachmentThumbnails(limit: Int = 20): ThumbnailBackfillResult!
6318
+
6319
+ """AI 주도 보드 모델링 — 자연어 채팅으로 보드 생성·구조편집·스타일링. sessionId 로 영속 컨텍스트."""
6320
+ boardAIChat(input: BoardAIChatInput!): BoardAIChatOutput!
6321
+
5735
6322
  """Bulk create or update KPI org-scope mappings."""
5736
6323
  bulkUpsertKpiOrgScopes(
5737
6324
  """Array of org-scope mapping data for bulk upsert."""
@@ -5820,6 +6407,16 @@ type Mutation {
5820
6407
  """Create Daily Worklog by projectId+date"""
5821
6408
  createBuildingInspectionDailyWorklog(patch: BuildingInspectionDailyWorklogNew!): BuildingInspectionDailyWorklog!
5822
6409
 
6410
+ """
6411
+ Always create a new AI chat session for a board (no idempotent reuse). For multi-session UX — 새 탭 열기.
6412
+ """
6413
+ createChatSession(
6414
+ boardId: String!
6415
+
6416
+ """Optional name (defaults to auto-generated `세션 N`)."""
6417
+ name: String
6418
+ ): ChatSession!
6419
+
5823
6420
  """To create new ChecklistItemComment"""
5824
6421
  createChecklistItemComment(checklistItemComment: NewChecklistItemComment!): ChecklistItemComment!
5825
6422
 
@@ -5896,6 +6493,12 @@ type Mutation {
5896
6493
  """To create new Favorite"""
5897
6494
  createFavorite(favorite: NewFavorite!): Favorite!
5898
6495
 
6496
+ """현장 문서 생성"""
6497
+ createFieldDocument(patch: NewFieldDocument!): FieldDocument!
6498
+
6499
+ """현장 문서 다건 생성"""
6500
+ createFieldDocuments(patches: [NewFieldDocument!]!): [FieldDocument!]!
6501
+
5899
6502
  """To create new Font"""
5900
6503
  createFont(font: NewFont!): Font!
5901
6504
 
@@ -6001,6 +6604,9 @@ type Mutation {
6001
6604
  """프로젝트 생성"""
6002
6605
  createProject(project: NewProject!): Project!
6003
6606
 
6607
+ """프로젝트 체크리스트 생성"""
6608
+ createProjectChecklist(constructionDetailTypeId: String!, constructionTypeId: String!, items: [ProjectChecklistItemInput!]!, name: String!, projectId: String!, siteSpecPdfUrl: String): ProjectChecklist!
6609
+
6004
6610
  """To create new ProjectReport"""
6005
6611
  createProjectReport(projectReport: NewProjectReport!): ProjectReport!
6006
6612
 
@@ -6167,6 +6773,12 @@ type Mutation {
6167
6773
  """Deletes multiple connections by their names."""
6168
6774
  deleteConnections(names: [String!]!): Boolean!
6169
6775
 
6776
+ """공종 체크리스트 템플릿 아이템 삭제"""
6777
+ deleteConstructionChecklistTemplateItems(ids: [String!]!): Boolean!
6778
+
6779
+ """공종 기반 체크리스트 템플릿 삭제"""
6780
+ deleteConstructionChecklistTemplates(ids: [String!]!): Boolean!
6781
+
6170
6782
  """To delete multiple ConstructionDetailTypes"""
6171
6783
  deleteConstructionDetailTypes(ids: [String!]!): Boolean!
6172
6784
 
@@ -6292,6 +6904,9 @@ type Mutation {
6292
6904
  """To delete Favorite"""
6293
6905
  deleteFavorite(routing: String!): Boolean!
6294
6906
 
6907
+ """현장 문서 삭제"""
6908
+ deleteFieldDocuments(ids: [String!]!): Boolean!
6909
+
6295
6910
  """To delete Font"""
6296
6911
  deleteFont(id: String!): Boolean!
6297
6912
 
@@ -6454,6 +7069,9 @@ type Mutation {
6454
7069
  """To delete Project"""
6455
7070
  deleteProject(id: String!): Boolean!
6456
7071
 
7072
+ """프로젝트 체크리스트 삭제"""
7073
+ deleteProjectChecklists(ids: [String!]!): Boolean!
7074
+
6457
7075
  """To delete ProjectReport"""
6458
7076
  deleteProjectReport(id: String!): Boolean!
6459
7077
 
@@ -6551,6 +7169,9 @@ type Mutation {
6551
7169
  """To delete multiple WorkerTypes"""
6552
7170
  deleteWorkerTypes(ids: [String!]!): Boolean!
6553
7171
 
7172
+ """프로젝트 테넌트 강등 (Domain soft-delete, Project.code 보존)"""
7173
+ demoteProjectTenant(projectId: String!): Boolean!
7174
+
6554
7175
  """
6555
7176
  Detaches an existing contact from an employee. The employee is identified by their ID.
6556
7177
  """
@@ -6624,6 +7245,9 @@ type Mutation {
6624
7245
  attributes: [AttributeSetPatch!]!
6625
7246
  ): Boolean!
6626
7247
 
7248
+ """도면 → 보드 변환을 비동기로 시작. 즉시 ImportSession 반환, 백그라운드에서 처리."""
7249
+ importBoardAsync(input: ImportBoardAsyncInput!): ImportSession!
7250
+
6627
7251
  """Imports multiple boards from JSON files."""
6628
7252
  importBoards(files: [Upload!]!, groupId: String!, overwrite: Boolean!): [Board!]!
6629
7253
 
@@ -6767,6 +7391,14 @@ type Mutation {
6767
7391
 
6768
7392
  """Removes one or more boards from a play group."""
6769
7393
  leavePlayGroup(boardIds: [String!]!, id: String!): PlayGroup!
7394
+
7395
+ """
7396
+ 완료된 ImportSession 의 결과 boardModel 을 새 Board entity 로 영속화한다. 검수 단계 (사용자/AI 가 import 결과를 확인 후 명시적으로 호출) 에서 사용. Board.state="draft" 로 생성되므로 release mutation 으로 별도 발행 필요.
7397
+ """
7398
+ materializeImportSession(input: MaterializeImportSessionInput!): Board!
7399
+
7400
+ """문서 폴더 이동"""
7401
+ moveFieldDocuments(ids: [String!]!, targetCode: String!): Boolean!
6770
7402
  multipleUpload(files: [Upload!]!): [Attachment!]!
6771
7403
 
6772
7404
  """
@@ -6774,12 +7406,20 @@ type Mutation {
6774
7406
  """
6775
7407
  pickActivityInstance(id: String!): ActivityThread
6776
7408
 
7409
+ """프로젝트를 테넌트로 승격 (관리번호 발번 + project 카테고리 Domain 생성)"""
7410
+ promoteProjectToTenant(projectId: String!): Project!
7411
+
6777
7412
  """기존 KPI Value 인스턴스를 현재 formula/metric 값으로 재계산"""
6778
7413
  recalculateKpiValue(id: String!): KpiValue!
6779
7414
 
6780
7415
  """Recalculate scores for all KpiValues of a specific KPI"""
6781
7416
  recalculateScoresForKpi(kpiId: String!): Boolean!
6782
7417
 
7418
+ """
7419
+ Record a patch from user direct edit. Adds a system message so AI sees the change next turn.
7420
+ """
7421
+ recordDirectPatch(ops: JSON!, sessionId: String!, summary: String): PatchEntry!
7422
+
6783
7423
  """Record a metric value by metric name, value, meta, and org."""
6784
7424
  recordKpiMetricValue(
6785
7425
  """Extended or non-numeric information (JSON)."""
@@ -6831,8 +7471,17 @@ type Mutation {
6831
7471
 
6832
7472
  """Release a KPI and create a version history."""
6833
7473
  releaseKpi(id: String!): Kpi!
7474
+
7475
+ """Remove a user from the owners of the current domain."""
7476
+ removeDomainOwner(reason: String, username: String!): Boolean!
7477
+
7478
+ """Rename a ChatSession (tab label)."""
7479
+ renameChatSession(name: String!, sessionId: String!): Boolean!
6834
7480
  renewApplicationAccessToken(id: String!, scope: String!): AccessToken!
6835
7481
 
7482
+ """Reorders a board between two adjacent boards by ID."""
7483
+ reorderBoard(id: String!, nextId: String, prevId: String): Boolean!
7484
+
6836
7485
  """Sets the custom playback order for boards in a play group."""
6837
7486
  reorderPlayGroup(boardIds: [String!]!, id: String!): PlayGroup!
6838
7487
 
@@ -6853,6 +7502,9 @@ type Mutation {
6853
7502
  """Revert a KPI to a specific historical version."""
6854
7503
  revertKpiVersion(id: String!, version: Float!): Kpi!
6855
7504
 
7505
+ """Mark a patch as reverted (does not undo, only flags)."""
7506
+ revertPatch(patchId: String!): Boolean!
7507
+
6856
7508
  """
6857
7509
  Runs a new scenario instance once and returns the result after it finishes.
6858
7510
  """
@@ -6872,6 +7524,11 @@ type Mutation {
6872
7524
  """To start ActivityThread"""
6873
7525
  startActivityThread(id: String!, output: Object, reason: String): ActivityThread
6874
7526
 
7527
+ """
7528
+ Start (or get existing) AI chat session for a board. Idempotent — returns first existing or creates one.
7529
+ """
7530
+ startBoardAISession(boardId: String!): ChatSession!
7531
+
6875
7532
  """
6876
7533
  Starts automated data collection scheduling for the specified dataset. This mutation registers a cron-based schedule that automatically triggers data collection tasks according to the dataset configuration.
6877
7534
  """
@@ -6917,6 +7574,14 @@ type Mutation {
6917
7574
  synchronizePrivilegeMaster(privilege: NewPrivilege!): Boolean!
6918
7575
  terminateContract(partnerName: String!): Boolean!
6919
7576
 
7577
+ """즐겨찾기 토글"""
7578
+ toggleFieldDocumentFavorite(id: String!): FieldDocument!
7579
+
7580
+ """
7581
+ Presence heartbeat — bump current user's lastSeenAt in the session (online indicator).
7582
+ """
7583
+ touchPresence(sessionId: String!): Boolean!
7584
+
6920
7585
  """
6921
7586
  Transfers domain ownership to another user. Use this mutation to assign the owner role to a different user within the domain.
6922
7587
  """
@@ -6983,6 +7648,9 @@ type Mutation {
6983
7648
  """To modify ChecklistItemComment information"""
6984
7649
  updateChecklistItemComment(id: String!, patch: ChecklistItemCommentPatch!): ChecklistItemComment!
6985
7650
 
7651
+ """To update checklist items with AI inspection judgments"""
7652
+ updateChecklistItemsAiJudgment(items: [ChecklistItemAiJudgment!]!): Boolean!
7653
+
6986
7654
  """To modify CommonCode information"""
6987
7655
  updateCommonCode(name: String!, patch: CommonCodePatch!): CommonCode!
6988
7656
 
@@ -7136,6 +7804,12 @@ type Mutation {
7136
7804
  """Updates multiple connections at once."""
7137
7805
  updateMultipleConnection(patches: [ConnectionPatch!]!): [Connection!]!
7138
7806
 
7807
+ """공종 기반 체크리스트 템플릿 생성/수정"""
7808
+ updateMultipleConstructionChecklistTemplate(patches: [ConstructionChecklistTemplatePatch!]!): [ConstructionChecklistTemplate!]!
7809
+
7810
+ """공종 체크리스트 템플릿 아이템 일괄 저장"""
7811
+ updateMultipleConstructionChecklistTemplateItems(constructionChecklistTemplateId: String!, patches: [ConstructionChecklistTemplateItemPatch!]!): [ConstructionChecklistTemplateItem!]!
7812
+
7139
7813
  """To modify multiple ConstructionDetailTypes' information"""
7140
7814
  updateMultipleConstructionDetailType(constructionTypeId: String!, patches: [ConstructionDetailTypePatch!]!): [ConstructionDetailType!]!
7141
7815
 
@@ -7331,6 +8005,9 @@ type Mutation {
7331
8005
  """프로젝트 업데이트 (중복 사용 금지)"""
7332
8006
  updateProject(project: ProjectPatch!): Project!
7333
8007
 
8008
+ """프로젝트 체크리스트 수정"""
8009
+ updateProjectChecklist(id: String!, items: [ProjectChecklistItemInput!]!, name: String!, siteSpecPdfUrl: String): ProjectChecklist!
8010
+
7334
8011
  """프로젝트 도면 업데이트"""
7335
8012
  updateProjectPlan(project: ProjectPatch!): Project!
7336
8013
 
@@ -7414,6 +8091,9 @@ type Mutation {
7414
8091
 
7415
8092
  """프로젝트 공정표 업로드"""
7416
8093
  uploadProjectScheduleTable(param: UploadProjectScheduleTable!): Boolean!
8094
+
8095
+ """공종+세부공종 조합으로 find-or-create"""
8096
+ upsertConstructionChecklistTemplate(constructionDetailTypeId: String!, constructionTypeId: String!): ConstructionChecklistTemplate!
7417
8097
  }
7418
8098
 
7419
8099
  input NewActionPlan {
@@ -7659,6 +8339,11 @@ input NewConnection {
7659
8339
  """The endpoint URL or address for the new connection."""
7660
8340
  endpoint: String
7661
8341
 
8342
+ """
8343
+ Inheritance mode for child domains. ISOLATE = per-child instance. SHARE = shared parent instance. null = use connector default.
8344
+ """
8345
+ inheritanceMode: ConnectionInheritanceMode
8346
+
7662
8347
  """The name for the new connection."""
7663
8348
  name: String!
7664
8349
 
@@ -7969,6 +8654,17 @@ input NewFavorite {
7969
8654
  routing: String!
7970
8655
  }
7971
8656
 
8657
+ input NewFieldDocument {
8658
+ """AI 브리핑 힌트용 분류 문자열 (대 · 중 · 소분류)"""
8659
+ category: String
8660
+ code: String!
8661
+ file: Upload
8662
+ name: String!
8663
+ projectId: String!
8664
+ sourceRefId: String
8665
+ sourceType: String
8666
+ }
8667
+
7972
8668
  input NewFont {
7973
8669
  active: Boolean
7974
8670
  files: [Upload!]
@@ -8033,6 +8729,9 @@ input NewKpi {
8033
8729
  """
8034
8730
  scoreFormula: String
8035
8731
 
8732
+ """value → score 변환 방식."""
8733
+ scoreType: KpiScoreType
8734
+
8036
8735
  """Current state of the KPI (DRAFT, RELEASED, ARCHIVED)."""
8037
8736
  state: KpiStatus
8038
8737
 
@@ -8042,6 +8741,9 @@ input NewKpi {
8042
8741
  """Timezone for the KPI schedule."""
8043
8742
  timezone: String
8044
8743
 
8744
+ """value 획득 방식."""
8745
+ valueType: KpiValueType
8746
+
8045
8747
  """
8046
8748
  Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, etc.
8047
8749
  """
@@ -8066,8 +8768,8 @@ input NewKpiMetric {
8066
8768
  """데이터 수집 방식"""
8067
8769
  collectType: KpiMetricCollectType
8068
8770
 
8069
- """ID of the source dataset for this metric."""
8070
- dataSetId: ID
8771
+ """Source dataset for this metric."""
8772
+ dataSet: ObjectRef
8071
8773
 
8072
8774
  """User-friendly name or description of the metric."""
8073
8775
  description: String
@@ -8081,6 +8783,9 @@ input NewKpiMetric {
8081
8783
  """Aggregation period type for this metric."""
8082
8784
  periodType: KpiPeriodType
8083
8785
 
8786
+ """목록 표시 순서(오름차순). 미지정(null)은 뒤로 정렬."""
8787
+ rank: Int
8788
+
8084
8789
  """
8085
8790
  Cron schedule string for periodic KPI value aggregation (e.g., "0 0 * * *" for daily).
8086
8791
  """
@@ -9216,6 +9921,26 @@ type PasswordRule {
9216
9921
  useTightPattern: Boolean
9217
9922
  }
9218
9923
 
9924
+ """One board edit operation history (cascade-deleted with ChatSession)."""
9925
+ type PatchEntry {
9926
+ """AI confidence 0..1 (null for user-direct)."""
9927
+ confidence: Float
9928
+ createdAt: DateTimeISO
9929
+ id: ID
9930
+
9931
+ """BoardEditOp[] (parsed JSON array)."""
9932
+ opsJson: JSON!
9933
+
9934
+ """Whether this patch was reverted."""
9935
+ reverted: Boolean!
9936
+
9937
+ """'ai' | 'user-direct' | 'import'"""
9938
+ source: String!
9939
+
9940
+ """Short human summary of this patch."""
9941
+ summary: String
9942
+ }
9943
+
9219
9944
  """Logs the request and response payloads for API interactions."""
9220
9945
  type PayloadLog {
9221
9946
  """The timestamp when the log entry was created."""
@@ -9480,7 +10205,9 @@ input ProfileInput {
9480
10205
  """프로젝트"""
9481
10206
  type Project {
9482
10207
  buildingComplex: BuildingComplex
9483
- completeReports: [Attachment!]!
10208
+ buildingUsage: String
10209
+ code: String
10210
+ completeReport: Attachment
9484
10211
  createdAt: DateTimeISO
9485
10212
  creator: User
9486
10213
  deletedAt: DateTimeISO
@@ -9492,6 +10219,7 @@ type Project {
9492
10219
  inputType: String
9493
10220
  inspPassRate: Float
9494
10221
  kpi: Float
10222
+ kpiValues: [KpiValuesObject!]!
9495
10223
  mainPhoto: Attachment
9496
10224
  name: String!
9497
10225
  postalCode: String
@@ -9500,16 +10228,68 @@ type Project {
9500
10228
  robotProgressRate: Float
9501
10229
  rootTasks: [Task!]
9502
10230
  scheduleTable: Attachment
10231
+ sectorType: String
10232
+ siteSpecPdfUrl: String
9503
10233
  startDate: String
9504
10234
  state: String!
9505
10235
  structuralSafetyRate: Float
9506
10236
  tasks: [Task!]
10237
+
10238
+ """활성 테넌트 Domain (extType=project). 미승격 또는 강등 상태이면 null"""
10239
+ tenantDomain: Domain
9507
10240
  totalProgress: Float
9508
10241
  updatedAt: DateTimeISO
9509
10242
  updater: User
9510
10243
  weeklyProgress: Float
9511
10244
  }
9512
10245
 
10246
+ type ProjectChecklist {
10247
+ constructionDetailTypeId: String!
10248
+ constructionTypeId: String!
10249
+ createdAt: DateTimeISO
10250
+ creator: User
10251
+ deletedAt: DateTimeISO
10252
+ domain: Domain
10253
+ id: ID!
10254
+ name: String!
10255
+ projectChecklistItems: [ProjectChecklistItem!]
10256
+ projectId: String!
10257
+ updatedAt: DateTimeISO
10258
+ updater: User
10259
+ }
10260
+
10261
+ type ProjectChecklistItem {
10262
+ createdAt: DateTimeISO
10263
+ creator: User
10264
+ id: ID!
10265
+ inspctionCriteria: String
10266
+ kcsCriteria: String
10267
+ mainType: String
10268
+ name: String!
10269
+ projectChecklist: ProjectChecklist
10270
+ sequence: Int
10271
+ siteSpecCriteria: String
10272
+ updatedAt: DateTimeISO
10273
+ updater: User
10274
+ }
10275
+
10276
+ input ProjectChecklistItemInput {
10277
+ inspctionCriteria: String
10278
+ mainType: String
10279
+ name: String!
10280
+ sequence: Int
10281
+ }
10282
+
10283
+ type ProjectChecklistItemList {
10284
+ items: [ProjectChecklistItem!]!
10285
+ total: Int!
10286
+ }
10287
+
10288
+ type ProjectChecklistList {
10289
+ items: [ProjectChecklist!]!
10290
+ total: Int!
10291
+ }
10292
+
9513
10293
  type ProjectList {
9514
10294
  """프로젝트 리스트 항목들"""
9515
10295
  items: [Project!]!
@@ -9531,12 +10311,18 @@ input ProjectPatch {
9531
10311
  """연관된 건물 복합체 정보 (선택 사항)"""
9532
10312
  buildingComplex: BuildingComplexPatch
9533
10313
 
10314
+ """건물 용도 (RESIDENTIAL: 주거, NON_RESIDENTIAL: 비주거)"""
10315
+ buildingUsage: String
10316
+
9534
10317
  """프로젝트 문서 네이밍"""
9535
10318
  documentNaming: String
9536
10319
 
9537
10320
  """프로젝트 준공일정"""
9538
10321
  endDate: String
9539
10322
 
10323
+ """지역 구분 코드 (시군구 식별, 통계 그룹핑용)"""
10324
+ geoGroup: String
10325
+
9540
10326
  """수정할 프로젝트의 ID"""
9541
10327
  id: String!
9542
10328
 
@@ -9550,7 +10336,10 @@ input ProjectPatch {
9550
10336
  mainPhotoUpload: Upload
9551
10337
 
9552
10338
  """프로젝트 이름"""
9553
- name: String!
10339
+ name: String
10340
+
10341
+ """우편 코드 (5자리)"""
10342
+ postalCode: String
9554
10343
 
9555
10344
  """로봇 작업 대수"""
9556
10345
  robotCount: Int
@@ -9558,9 +10347,18 @@ input ProjectPatch {
9558
10347
  """로봇 작업 진행율 (%)"""
9559
10348
  robotProgressRate: Float
9560
10349
 
10350
+ """발주 유형 (PUBLIC: 공공, PRIVATE: 민간)"""
10351
+ sectorType: String
10352
+
10353
+ """현장 시방서 PDF URL (https 전체 URL)"""
10354
+ siteSpecPdfUrl: String
10355
+
9561
10356
  """프로젝트 착공일정"""
9562
10357
  startDate: String
9563
10358
 
10359
+ """프로젝트 상태 (ONGOING/COMPLETED)"""
10360
+ state: ProjectState
10361
+
9564
10362
  """구조 안전도 (%)"""
9565
10363
  structuralSafetyRate: Float
9566
10364
 
@@ -9612,6 +10410,12 @@ enum ProjectReportStatus {
9612
10410
  STATUS_B
9613
10411
  }
9614
10412
 
10413
+ """프로젝트 상태 (ONGOING=10 진행중, COMPLETED=20 완료)"""
10414
+ enum ProjectState {
10415
+ COMPLETED
10416
+ ONGOING
10417
+ }
10418
+
9615
10419
  """
9616
10420
  Describes a single property for a component or a step, used for UI rendering and configuration.
9617
10421
  """
@@ -9645,8 +10449,6 @@ type PropertySpec {
9645
10449
  }
9646
10450
 
9647
10451
  type Query {
9648
- APIDocCompletion(input: APIDocCompletionInput!): APIDocCompletionOutput!
9649
-
9650
10452
  """To fetch a ActionPlan"""
9651
10453
  actionPlan(id: String!): ActionPlan
9652
10454
 
@@ -9995,8 +10797,14 @@ type Query {
9995
10797
  sortings: [Sorting!]
9996
10798
  ): AuthProviderList!
9997
10799
 
9998
- """Finds a single board by its ID."""
9999
- board(id: String!): Board!
10800
+ """
10801
+ Finds a single board by its ID. If cachedUpdatedAt matches, model is omitted.
10802
+ """
10803
+ board(
10804
+ """Client cache timestamp — if matches, model field is omitted"""
10805
+ cachedUpdatedAt: String
10806
+ id: String!
10807
+ ): Board!
10000
10808
 
10001
10809
  """Finds a single board by its name."""
10002
10810
  boardByName(name: String!): Board
@@ -10073,6 +10881,11 @@ type Query {
10073
10881
  sortings: [Sorting!]
10074
10882
  ): BoardList!
10075
10883
 
10884
+ """
10885
+ Retrieves boards that have been updated or soft-deleted since the given timestamp.
10886
+ """
10887
+ boardsUpdatedSince(since: DateTimeISO!): [Board!]!
10888
+
10076
10889
  """To fetch a building"""
10077
10890
  building(id: String!): Building
10078
10891
 
@@ -10083,9 +10896,15 @@ type Query {
10083
10896
  buildingInspection(id: String!): BuildingInspection
10084
10897
  buildingInspectionDailyWorklogByProjectIdAndDate(date: String!, projectId: String!): BuildingInspectionDailyWorklog
10085
10898
 
10899
+ """To fetch BuildingInspection Date Summary of Building"""
10900
+ buildingInspectionDateSummaryOfBuilding(buildingId: String!, endDate: String!, startDate: String!): [BuildingInspectionSummary!]
10901
+
10086
10902
  """To fetch a BuildingInspection Summary"""
10087
10903
  buildingInspectionDateSummaryOfLevelAndPeriod(buildingLevelId: String!, endDate: String!, startDate: String!): [BuildingInspectionSummary!]
10088
10904
 
10905
+ """To fetch BuildingInspection Date Summary of Project"""
10906
+ buildingInspectionDateSummaryOfProject(endDate: String!, projectId: String!, startDate: String!): [BuildingInspectionSummary!]
10907
+
10089
10908
  """To fetch multiple BuildingInspections"""
10090
10909
  buildingInspectionHistories(
10091
10910
  """An array of filter conditions to apply to the list query."""
@@ -10104,6 +10923,9 @@ type Query {
10104
10923
  """To fetch a BuildingInspectionHistory"""
10105
10924
  buildingInspectionHistory(id: String!): BuildingInspectionHistory
10106
10925
 
10926
+ """To fetch BuildingInspection Summary of Building"""
10927
+ buildingInspectionSummaryOfBuilding(buildingId: String!): BuildingInspectionSummary
10928
+
10107
10929
  """To fetch a BuildingInspection Summary"""
10108
10930
  buildingInspectionSummaryOfBuildingLevel(buildingLevelId: String!): BuildingInspectionSummary
10109
10931
 
@@ -10125,6 +10947,9 @@ type Query {
10125
10947
  sortings: [Sorting!]
10126
10948
  ): BuildingInspectionList!
10127
10949
 
10950
+ """To fetch BuildingInspections of Building"""
10951
+ buildingInspectionsOfBuilding(params: BuildingInspectionsOfBuilding!): BuildingInspectionList!
10952
+
10128
10953
  """To fetch multiple BuildingInspections"""
10129
10954
  buildingInspectionsOfBuildingLevel(params: BuildingInspectionsOfBuildingLevel!): BuildingInspectionList!
10130
10955
 
@@ -10133,7 +10958,28 @@ type Query {
10133
10958
 
10134
10959
  """To fetch a building level"""
10135
10960
  buildingLevel(id: String!): BuildingLevel
10136
- chatCompletion(input: ChatCompletionInput!): ChatCompletionOutput!
10961
+
10962
+ """List chat messages of a session, oldest first."""
10963
+ chatMessages(limit: Int = 100, offset: Int = 0, sessionId: String!): [ChatMessage!]!
10964
+
10965
+ """List patch entries of a session, newest first."""
10966
+ chatPatches(limit: Int = 100, sessionId: String!): [PatchEntry!]!
10967
+
10968
+ """Get AI chat session by id."""
10969
+ chatSession(id: String!): ChatSession
10970
+
10971
+ """
10972
+ Get AI chat session by board id (returns first match — backward compat single-session lookup).
10973
+ """
10974
+ chatSessionByBoard(boardId: String!): ChatSession
10975
+
10976
+ """List participants of a ChatSession (members / owner)."""
10977
+ chatSessionParticipants(sessionId: String!): [ChatSessionParticipant!]!
10978
+
10979
+ """
10980
+ List all AI chat sessions for a board (oldest first). Multi-session support — UI 탭으로 표시.
10981
+ """
10982
+ chatSessionsByBoard(boardId: String!): [ChatSession!]!
10137
10983
 
10138
10984
  """
10139
10985
  Checks if the system is configured to provide a default password for new users.
@@ -10362,6 +11208,36 @@ type Query {
10362
11208
  """Fetches a list of all available connector types."""
10363
11209
  connectors: ConnectorList!
10364
11210
 
11211
+ """공종 체크리스트 템플릿 아이템 목록"""
11212
+ constructionChecklistTemplateItems(
11213
+ """An array of filter conditions to apply to the list query."""
11214
+ filters: [Filter!]
11215
+
11216
+ """Inherited value type for the list query."""
11217
+ inherited: InheritedValueType
11218
+
11219
+ """Pagination options for the list query."""
11220
+ pagination: Pagination
11221
+
11222
+ """Sorting options for the list query."""
11223
+ sortings: [Sorting!]
11224
+ ): ConstructionChecklistTemplateItemList!
11225
+
11226
+ """공종 기반 체크리스트 템플릿 목록"""
11227
+ constructionChecklistTemplates(
11228
+ """An array of filter conditions to apply to the list query."""
11229
+ filters: [Filter!]
11230
+
11231
+ """Inherited value type for the list query."""
11232
+ inherited: InheritedValueType
11233
+
11234
+ """Pagination options for the list query."""
11235
+ pagination: Pagination
11236
+
11237
+ """Sorting options for the list query."""
11238
+ sortings: [Sorting!]
11239
+ ): ConstructionChecklistTemplateList!
11240
+
10365
11241
  """To fetch multiple ConstructionDetailTypes"""
10366
11242
  constructionDetailTypes(
10367
11243
  """An array of filter conditions to apply to the list query."""
@@ -10412,6 +11288,12 @@ type Query {
10412
11288
  """Sorting options for the list query."""
10413
11289
  sortings: [Sorting!]
10414
11290
  ): ContactList!
11291
+
11292
+ """현재 테넌트 컨텍스트(extType=project)의 프로젝트. subdomain(=Project.code) 으로 조회."""
11293
+ currentProject: Project
11294
+
11295
+ """프로젝트 타입 조회"""
11296
+ currentProjectType: String!
10415
11297
  customers: [Domain!]!
10416
11298
  dailyWorklogDatesOfProject(endDate: String!, projectId: String!, startDate: String!): [BuildingInspectionDailyWorklog!]!
10417
11299
 
@@ -10770,8 +11652,6 @@ type Query {
10770
11652
  """Sorting options for the list query."""
10771
11653
  sortings: [Sorting!]
10772
11654
  ): [DynamicDataSummary!]!
10773
- decipherCode(input: CodeDecipherInput!): CodeDecipherOutput!
10774
- decipherErrorCode(input: CodeDecipherInput!): CodeDecipherOutput!
10775
11655
 
10776
11656
  """To fetch a Department"""
10777
11657
  department(id: String!): Department
@@ -10829,11 +11709,24 @@ type Query {
10829
11709
  sortings: [Sorting!]
10830
11710
  ): DomainLinkList!
10831
11711
 
11712
+ """List owners of the current domain."""
11713
+ domainOwners: [DomainOwner!]!
11714
+
10832
11715
  """
10833
11716
  Fetches the list of available domain types from configuration. Only superusers are granted this privilege.
10834
11717
  """
10835
11718
  domainTypes: [String!]!
10836
11719
 
11720
+ """
11721
+ List users in the current domain for `@` mention popup. board-ai 권한이면 누구나 멘션용 검색 가능 (관리자 전용 users() 와 별도).
11722
+ """
11723
+ domainUsersForMention(
11724
+ limit: Int = 50
11725
+
11726
+ """Substring to match against name/email (case-insensitive). Empty → all."""
11727
+ query: String
11728
+ ): [User!]!
11729
+
10837
11730
  """
10838
11731
  Fetches all domain entities with pagination and filtering options. Only superusers are granted this privilege.
10839
11732
  """
@@ -10960,6 +11853,11 @@ type Query {
10960
11853
  """To fetch a EntityMetadata"""
10961
11854
  entityMetadata(name: String!): EntityMetadata!
10962
11855
  envVar(id: String!): EnvVar
11856
+
11857
+ """
11858
+ Resolves a batch of EnvVar keys with ancestor closest-wins inheritance.
11859
+ """
11860
+ envVarResolutions(keys: [String!]!): [EnvVarResolution!]!
10963
11861
  envVars(
10964
11862
  """An array of filter conditions to apply to the list query."""
10965
11863
  filters: [Filter!]
@@ -11010,6 +11908,15 @@ type Query {
11010
11908
  """Fetches the current state of a single connection by its name."""
11011
11909
  fetchConnectionState(name: String!): ConnectionState!
11012
11910
 
11911
+ """단건 문서 상세 조회"""
11912
+ fieldDocument(id: String!): FieldDocument
11913
+
11914
+ """프로젝트별 분류 코드당 문서 수"""
11915
+ fieldDocumentCountsByProject(projectId: String!): [FieldDocumentCodeCount!]!
11916
+
11917
+ """소분류 코드별 문서 목록 조회"""
11918
+ fieldDocumentsByCode(code: String!, projectId: String!): FieldDocumentList!
11919
+
11013
11920
  """To fetch a Font"""
11014
11921
  font(id: String!): Font!
11015
11922
 
@@ -11053,8 +11960,12 @@ type Query {
11053
11960
 
11054
11961
  """To query whether I have the given permission"""
11055
11962
  hasPrivilege(category: String!, privilege: String!): Boolean!
11056
- i18nCompletion(input: i18nCompletionInput!): i18nCompletionOutput!
11057
- imageCompletion(input: ImageCompletionInput!): ImageCompletionOutput!
11963
+
11964
+ """Get import session progress."""
11965
+ importSession(id: String!): ImportSession
11966
+
11967
+ """List recent import sessions for a chat session."""
11968
+ importSessionsByChatSession(chatSessionId: String!): [ImportSession!]!
11058
11969
 
11059
11970
  """BuildingInspection By ChecklistItemId"""
11060
11971
  inspectionByChecklistItemId: BuildingInspection!
@@ -11118,6 +12029,9 @@ type Query {
11118
12029
  invitation(email: EmailAddress!, reference: String!, type: String!): Invitation!
11119
12030
  invitations(reference: String!, type: String!): InvitationList!
11120
12031
 
12032
+ """Check if a user is an owner of the current domain."""
12033
+ isDomainOwner(username: String!): Boolean!
12034
+
11121
12035
  """To fetch a Issue"""
11122
12036
  issue(id: String!): Issue
11123
12037
 
@@ -11323,6 +12237,23 @@ type Query {
11323
12237
  rootId: String
11324
12238
  ): [Kpi!]!
11325
12239
 
12240
+ """
12241
+ Fetch latest-version KpiValues only — one row per (domain, kpi, valueDate, kpiOrgScope).
12242
+ """
12243
+ latestKpiValues(
12244
+ """An array of filter conditions to apply to the list query."""
12245
+ filters: [Filter!]
12246
+
12247
+ """Inherited value type for the list query."""
12248
+ inherited: InheritedValueType
12249
+
12250
+ """Pagination options for the list query."""
12251
+ pagination: Pagination
12252
+
12253
+ """Sorting options for the list query."""
12254
+ sortings: [Sorting!]
12255
+ ): KpiValueList!
12256
+
11326
12257
  """To fetch a LiteMenu"""
11327
12258
  liteMenu(id: String!): LiteMenu!
11328
12259
 
@@ -11771,6 +12702,36 @@ type Query {
11771
12702
  """To fetch Project"""
11772
12703
  projectByBuildingLevelId(buildingLevelId: String!): Project!
11773
12704
 
12705
+ """프로젝트 체크리스트 아이템 목록"""
12706
+ projectChecklistItems(
12707
+ """An array of filter conditions to apply to the list query."""
12708
+ filters: [Filter!]
12709
+
12710
+ """Inherited value type for the list query."""
12711
+ inherited: InheritedValueType
12712
+
12713
+ """Pagination options for the list query."""
12714
+ pagination: Pagination
12715
+
12716
+ """Sorting options for the list query."""
12717
+ sortings: [Sorting!]
12718
+ ): ProjectChecklistItemList!
12719
+
12720
+ """프로젝트 체크리스트 목록"""
12721
+ projectChecklists(
12722
+ """An array of filter conditions to apply to the list query."""
12723
+ filters: [Filter!]
12724
+
12725
+ """Inherited value type for the list query."""
12726
+ inherited: InheritedValueType
12727
+
12728
+ """Pagination options for the list query."""
12729
+ pagination: Pagination
12730
+
12731
+ """Sorting options for the list query."""
12732
+ sortings: [Sorting!]
12733
+ ): ProjectChecklistList!
12734
+
11774
12735
  """To fetch a ProjectReport"""
11775
12736
  projectReport(id: String!): ProjectReport
11776
12737
 
@@ -11978,6 +12939,14 @@ type Query {
11978
12939
  sortings: [Sorting!]
11979
12940
  ): StepList!
11980
12941
 
12942
+ """
12943
+ 도메인 안에서 충돌하지 않는 Board name + 상세 description 제안. name 은 짧고 심플 (30자 이내, 충돌 회피 (n) suffix), description 은 자세히 (사용자 prompt + AI importStrategy + 카테고리 분포 통계 합성).
12944
+ """
12945
+ suggestBoardMeta(input: SuggestBoardNameInput!): BoardMetaSuggestion!
12946
+
12947
+ """@deprecated suggestBoardMeta 사용 권장. 단순 string name 만 반환하는 구버전 query."""
12948
+ suggestBoardName(input: SuggestBoardNameInput!): String!
12949
+
11981
12950
  """To fetch the list of activities that I can report on"""
11982
12951
  supervisableActivities(
11983
12952
  """An array of filter conditions to apply to the list query."""
@@ -12892,6 +13861,16 @@ type Subscription {
12892
13861
  """Subscribes to real-time updates for a specific board."""
12893
13862
  board(id: String!): Board!
12894
13863
 
13864
+ """
13865
+ Subscribes to board edit patches (AI or user-direct) for real-time collaboration on a board.
13866
+ """
13867
+ boardPatchActivity(boardId: String!): PatchEntry!
13868
+
13869
+ """
13870
+ Subscribes to chat messages (user / assistant / system) of a session for real-time group chat.
13871
+ """
13872
+ chatMessageActivity(sessionId: String!): ChatMessage!
13873
+
12895
13874
  """Subscribes to log messages from connections."""
12896
13875
  connectionLog(level: String): Log!
12897
13876
 
@@ -12918,6 +13897,16 @@ type Subscription {
12918
13897
  scenarioQueueState: ScenarioQueueState!
12919
13898
  }
12920
13899
 
13900
+ input SuggestBoardNameInput {
13901
+ """명시 hint. session 정보보다 우선. 사용자가 직접 적은 메모를 기반으로 추천받고 싶을 때."""
13902
+ hint: String
13903
+
13904
+ """
13905
+ ImportSession id — 있으면 거기서 userPrompt / VLM reasoning / attachment.name 추출.
13906
+ """
13907
+ sessionId: ID
13908
+ }
13909
+
12921
13910
  """Entity for Supervisor"""
12922
13911
  type Supervisor {
12923
13912
  active: Boolean
@@ -13219,6 +14208,21 @@ input ThemePatch {
13219
14208
  value: Object
13220
14209
  }
13221
14210
 
14211
+ """썸네일 백필 결과"""
14212
+ type ThumbnailBackfillResult {
14213
+ """이번 호출에서 처리 시도한 첨부 개수"""
14214
+ attempted: Int!
14215
+
14216
+ """실패(생성 실패/콘텐츠 없음 등) 개수"""
14217
+ failed: Int!
14218
+
14219
+ """이번 처리 후에도 남아있는 썸네일 미생성 후보 개수 (대략치). 0 이면 완료"""
14220
+ remaining: Int!
14221
+
14222
+ """썸네일 생성·저장 성공 개수"""
14223
+ succeeded: Int!
14224
+ }
14225
+
13222
14226
  input UpdateBuildingInspection {
13223
14227
  drawingMarker: String
13224
14228
  id: String!
@@ -13230,6 +14234,7 @@ input UpdateBuildingInspectionSubmitType {
13230
14234
  checklistItem: [ChecklistItemSubmitInputType!]!
13231
14235
  id: String!
13232
14236
  memo: String
14237
+ requestDate: String
13233
14238
  }
13234
14239
 
13235
14240
  input UpdateTaskChecklistSubmitType {
@@ -13486,12 +14491,4 @@ input WorkerTypePatch {
13486
14491
  description: String
13487
14492
  id: ID
13488
14493
  name: String
13489
- }
13490
-
13491
- input i18nCompletionInput {
13492
- json: String!
13493
- }
13494
-
13495
- type i18nCompletionOutput {
13496
- message: String
13497
14494
  }