@dssp/dkpi 1.0.0-alpha.70 → 1.0.0-alpha.74

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/schema.graphql CHANGED
@@ -838,6 +838,7 @@ type Attachment {
838
838
  refType: String
839
839
  size: String!
840
840
  tags: Object
841
+ thumbnail: String
841
842
  updatedAt: DateTimeISO!
842
843
  updater: User
843
844
  }
@@ -1151,6 +1152,11 @@ type Board {
1151
1152
  """
1152
1153
  sortOrder: Float
1153
1154
 
1155
+ """
1156
+ Source ImportSession id (board-import) when this board was generated from a drawing/image import.
1157
+ """
1158
+ sourceImportSessionId: String
1159
+
1154
1160
  """The state of the board, can be 'draft' or 'released'."""
1155
1161
  state: String
1156
1162
 
@@ -1170,6 +1176,120 @@ type Board {
1170
1176
  version: Float
1171
1177
  }
1172
1178
 
1179
+ input BoardAIChatInput {
1180
+ """
1181
+ Component categories to surface (e.g. ["3D", "form"]). Subset filter for groupings exposed in component-schemas.
1182
+ """
1183
+ categories: [String!]
1184
+
1185
+ """
1186
+ Component schemas — array of { type, description?, group?, properties? } so the LLM knows valid props per type.
1187
+ """
1188
+ componentSchemas: JSON
1189
+
1190
+ """Current BoardModel JSON."""
1191
+ currentBoard: JSON
1192
+
1193
+ """
1194
+ Component types the LLM is allowed to emit (e.g. ["rect", "label"]). Constrains generation to the current solution.
1195
+ """
1196
+ knownTypes: [String!]
1197
+
1198
+ """
1199
+ Max output tokens override per LLM call. Falls back to assistant default when omitted.
1200
+ """
1201
+ maxTokens: Float
1202
+
1203
+ """
1204
+ 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.
1205
+ """
1206
+ mentions: [BoardAIMentionPickInput!]
1207
+
1208
+ """
1209
+ Conversation history (latest user message at the end). For persisted sessions, only the last user message is appended; older are loaded from DB.
1210
+ """
1211
+ messages: [BoardAILLMMessageInput!]!
1212
+
1213
+ """
1214
+ AI model identifier override (e.g. "claude-opus-4-7"). Falls back to the configured default when omitted.
1215
+ """
1216
+ model: String
1217
+
1218
+ """
1219
+ Capability scopes the AI is allowed to use (e.g. 'create', 'edit', 'style'). Filters which tools are exposed to the LLM.
1220
+ """
1221
+ scopes: [String!]
1222
+
1223
+ """
1224
+ 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.
1225
+ """
1226
+ selectedRefids: [Int!]
1227
+
1228
+ """
1229
+ ChatSession id. Omit for ad-hoc (no persistence). When given, messages/patches are persisted.
1230
+ """
1231
+ sessionId: String
1232
+
1233
+ """
1234
+ Sampling temperature override. Falls back to assistant default when omitted.
1235
+ """
1236
+ temperature: Float
1237
+ }
1238
+
1239
+ type BoardAIChatOutput {
1240
+ """
1241
+ 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.
1242
+ """
1243
+ actions: JSON
1244
+
1245
+ """Persisted ChatMessage id of the AI reply."""
1246
+ assistantMessageId: String
1247
+
1248
+ """AI client identifier (provider:model)."""
1249
+ clientId: String!
1250
+
1251
+ """Clarifying question when input is ambiguous."""
1252
+ followUp: String
1253
+
1254
+ """BoardEditPatch."""
1255
+ patch: JSON
1256
+
1257
+ """Persisted PatchEntry id (when patch was generated)."""
1258
+ patchId: String
1259
+
1260
+ """Conversational reply."""
1261
+ reply: String!
1262
+
1263
+ """Echo of session id (when persisted)."""
1264
+ sessionId: String
1265
+
1266
+ """
1267
+ Tool usages collected during agentic loop — sequence of {name, arguments, result, kind}. UI fold-able box for transparency / debug.
1268
+ """
1269
+ toolUsages: JSON
1270
+
1271
+ """Persisted ChatMessage id of the user input."""
1272
+ userMessageId: String
1273
+ }
1274
+
1275
+ input BoardAILLMMessageInput {
1276
+ """Message content"""
1277
+ content: String!
1278
+
1279
+ """Role: 'user' or 'assistant'"""
1280
+ role: String!
1281
+ }
1282
+
1283
+ input BoardAIMentionPickInput {
1284
+ """
1285
+ Refid explicitly picked from popup. Server uses this for deterministic resolution — bypasses fallback name/id/type matching for this token.
1286
+ """
1287
+ refid: Int!
1288
+
1289
+ """Token used by user (e.g. "경광등1" — the part after #)."""
1290
+ token: String!
1291
+ }
1292
+
1173
1293
  """Represents a board that a user has marked as a favorite."""
1174
1294
  type BoardFavorite {
1175
1295
  """The timestamp when the board was created."""
@@ -1210,6 +1330,11 @@ type BoardFavorite {
1210
1330
  """
1211
1331
  sortOrder: Float
1212
1332
 
1333
+ """
1334
+ Source ImportSession id (board-import) when this board was generated from a drawing/image import.
1335
+ """
1336
+ sourceImportSessionId: String
1337
+
1213
1338
  """The state of the board, can be 'draft' or 'released'."""
1214
1339
  state: String
1215
1340
 
@@ -1307,6 +1432,16 @@ type BoardList {
1307
1432
  total: Int!
1308
1433
  }
1309
1434
 
1435
+ type BoardMetaSuggestion {
1436
+ """
1437
+ Suggested detailed description — combines user prompt, AI importStrategy narrative, and category distribution stats.
1438
+ """
1439
+ description: String!
1440
+
1441
+ """Suggested short board name (collision-free with current domain)."""
1442
+ name: String!
1443
+ }
1444
+
1310
1445
  """Input for updating (patching) an existing board."""
1311
1446
  input BoardPatch {
1312
1447
  """The new description for the board."""
@@ -1701,6 +1836,113 @@ input BuildingPatch {
1701
1836
  name: String
1702
1837
  }
1703
1838
 
1839
+ """A single chat message in a ChatSession."""
1840
+ type ChatMessage {
1841
+ """Message content"""
1842
+ content: String!
1843
+
1844
+ """Creation timestamp."""
1845
+ createdAt: DateTimeISO
1846
+
1847
+ """User who triggered this message."""
1848
+ creator: User
1849
+
1850
+ """Soft delete timestamp."""
1851
+ deletedAt: DateTimeISO
1852
+ id: ID
1853
+
1854
+ """
1855
+ Id of the message this one is in-response-to / continues. Enables linear / branching / tree structures.
1856
+ """
1857
+ parentMessageId: String
1858
+
1859
+ """ImportSession.id this message triggered (if any)."""
1860
+ relatedImportSessionId: String
1861
+
1862
+ """PatchEntry.id this message triggered (if any)."""
1863
+ relatedPatchId: String
1864
+
1865
+ """'user' | 'assistant' | 'system'"""
1866
+ role: String!
1867
+
1868
+ """
1869
+ Tool usage trace — array of {name, arguments, result, kind}. Only on assistant messages.
1870
+ """
1871
+ toolUsagesJson: JSON
1872
+
1873
+ """Last update timestamp (relevant once message editing is supported)."""
1874
+ updatedAt: DateTimeISO
1875
+
1876
+ """Last user to update this message (for future edit support)."""
1877
+ updater: User
1878
+ }
1879
+
1880
+ """AI 협력 세션 — Board 와 결합. 한 보드에 여러 세션 가능 (thread / 사용자별 / 컨텍스트별 등 미래 확장)."""
1881
+ type ChatSession {
1882
+ aiClientId: String
1883
+
1884
+ """
1885
+ Connected Board id. Multiple sessions per board allowed (future: threads / per-user / contexts).
1886
+ """
1887
+ boardId: String
1888
+ createdAt: DateTimeISO
1889
+
1890
+ """User who created this session."""
1891
+ creator: User
1892
+ domain: Domain
1893
+ id: ID
1894
+
1895
+ """Compressed summary of older messages (for token saving)."""
1896
+ lastSummary: String
1897
+
1898
+ """User-given name of this session (tab label / identification)."""
1899
+ name: String
1900
+ updatedAt: DateTimeISO
1901
+
1902
+ """User who last updated this session."""
1903
+ updater: User
1904
+ }
1905
+
1906
+ """
1907
+ Participant of a ChatSession — links a User to a session with a role. Foundation for multi-user chat / per-user filtering / member display.
1908
+ """
1909
+ type ChatSessionParticipant {
1910
+ """Joined-at timestamp."""
1911
+ createdAt: DateTimeISO
1912
+
1913
+ """
1914
+ User who created this participant record (typically session owner who invited).
1915
+ """
1916
+ creator: User
1917
+
1918
+ """Soft delete (= left session) timestamp."""
1919
+ deletedAt: DateTimeISO
1920
+
1921
+ """Domain to which this participant belongs."""
1922
+ domain: Domain
1923
+
1924
+ """Unique participant id."""
1925
+ id: ID!
1926
+
1927
+ """Last seen / activity timestamp (presence indicator)."""
1928
+ lastSeenAt: DateTimeISO
1929
+
1930
+ """Role of this participant: owner | member | viewer."""
1931
+ role: String!
1932
+
1933
+ """The ChatSession this participation belongs to."""
1934
+ session: ChatSession
1935
+
1936
+ """Last update timestamp (role change / lastSeenAt bump)."""
1937
+ updatedAt: DateTimeISO
1938
+
1939
+ """Last user to update this participant record (e.g., role change)."""
1940
+ updater: User
1941
+
1942
+ """The user participating in the session."""
1943
+ user: User
1944
+ }
1945
+
1704
1946
  type Checklist {
1705
1947
  buildingInspection: BuildingInspection!
1706
1948
  checklistAttachments(description: String): [Attachment!]!
@@ -2203,6 +2445,65 @@ type ConnectorType {
2203
2445
  taskPrefixes: [String!]
2204
2446
  }
2205
2447
 
2448
+ type ConstructionChecklistTemplate {
2449
+ constructionChecklistTemplateItems: [ConstructionChecklistTemplateItem!]
2450
+ constructionDetailTypeId: String!
2451
+ constructionTypeId: String!
2452
+ createdAt: DateTimeISO
2453
+ creator: User
2454
+ deletedAt: DateTimeISO
2455
+ domain: Domain
2456
+ id: ID!
2457
+ updatedAt: DateTimeISO
2458
+ updater: User
2459
+ }
2460
+
2461
+ type ConstructionChecklistTemplateItem {
2462
+ constructionChecklistTemplate: ConstructionChecklistTemplate
2463
+ createdAt: DateTimeISO
2464
+ creator: User
2465
+ id: ID!
2466
+ mainType: String
2467
+ name: String!
2468
+ recommendation1: String
2469
+ recommendation2: String
2470
+ recommendation3: String
2471
+ recommendation4: String
2472
+ recommendation5: String
2473
+ sequence: Int
2474
+ updatedAt: DateTimeISO
2475
+ updater: User
2476
+ }
2477
+
2478
+ type ConstructionChecklistTemplateItemList {
2479
+ items: [ConstructionChecklistTemplateItem!]!
2480
+ total: Int!
2481
+ }
2482
+
2483
+ input ConstructionChecklistTemplateItemPatch {
2484
+ id: ID
2485
+ mainType: String
2486
+ name: String
2487
+ recommendation1: String
2488
+ recommendation2: String
2489
+ recommendation3: String
2490
+ recommendation4: String
2491
+ recommendation5: String
2492
+ sequence: Int
2493
+ }
2494
+
2495
+ type ConstructionChecklistTemplateList {
2496
+ items: [ConstructionChecklistTemplate!]!
2497
+ total: Int!
2498
+ }
2499
+
2500
+ input ConstructionChecklistTemplatePatch {
2501
+ constructionDetailTypeId: String
2502
+ constructionTypeId: String
2503
+ cuFlag: String
2504
+ id: ID
2505
+ }
2506
+
2206
2507
  """세부 공종 타입"""
2207
2508
  type ConstructionDetailType {
2208
2509
  constructionType: ConstructionType
@@ -3535,6 +3836,27 @@ type DomainList {
3535
3836
  total: Int
3536
3837
  }
3537
3838
 
3839
+ """An ownership record binding a User to a Domain (multi-owner support)."""
3840
+ type DomainOwner {
3841
+ """Domain that the user owns."""
3842
+ domain: Domain!
3843
+
3844
+ """When the ownership was granted."""
3845
+ grantedAt: DateTimeISO!
3846
+
3847
+ """User who granted this ownership (audit)."""
3848
+ grantedBy: User
3849
+
3850
+ """Unique identifier."""
3851
+ id: ID!
3852
+
3853
+ """Optional reason/memo for granting ownership."""
3854
+ reason: String
3855
+
3856
+ """User who owns the domain."""
3857
+ user: User!
3858
+ }
3859
+
3538
3860
  """Input type for updating an existing domain entity."""
3539
3861
  input DomainPatch {
3540
3862
  """Additional attributes for the domain in key-value pairs."""
@@ -4094,6 +4416,70 @@ input GroupPatch {
4094
4416
  name: String
4095
4417
  }
4096
4418
 
4419
+ input ImportBoardAsyncInput {
4420
+ """Apply Stage 4 (data binding)."""
4421
+ applyBinding: Boolean
4422
+
4423
+ """
4424
+ Attachment id of the source drawing file (uploaded via attachment-base).
4425
+ """
4426
+ attachmentId: String!
4427
+
4428
+ """ChatSession id when triggered from board-ai chat."""
4429
+ chatSessionId: String
4430
+
4431
+ """Flip Y axis (CAD Y-up → scene Y-down)."""
4432
+ flipY: Boolean
4433
+
4434
+ """Normalize coordinates so minX,minY=0"""
4435
+ normalizeOrigin: Boolean
4436
+
4437
+ """Adapter parse options (excludeLayers, maxEntities, ...)."""
4438
+ parseOptions: JSON
4439
+
4440
+ """Scale factor (e.g. 1 for mm:1unit)."""
4441
+ scale: Float
4442
+
4443
+ """Registry scopes to use (board-import)."""
4444
+ scopes: [String!]
4445
+
4446
+ """
4447
+ 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."
4448
+ """
4449
+ userPrompt: String
4450
+ }
4451
+
4452
+ """도면 → 보드 변환 작업의 영속 단위 (비동기 진행상태 추적)."""
4453
+ type ImportSession {
4454
+ """Attachment id (the source drawing file)"""
4455
+ attachmentId: String!
4456
+
4457
+ """ChatSession id when triggered from chat (board-ai)."""
4458
+ chatSessionId: String
4459
+ completedAt: DateTimeISO
4460
+ createdAt: DateTimeISO
4461
+ creator: User
4462
+ domain: Domain
4463
+ id: ID
4464
+ message: String
4465
+
4466
+ """Options used (parsed JSON)."""
4467
+ options: JSON
4468
+
4469
+ """Progress percentage 0..100"""
4470
+ progress: Float!
4471
+
4472
+ """Result (parsed JSON): { boardModel, stats, warnings }."""
4473
+ result: JSON
4474
+
4475
+ """queued | parsing | mapping | assembling | binding | completed | failed"""
4476
+ status: String!
4477
+
4478
+ """Total entities counted (when known)."""
4479
+ totalEntities: Int
4480
+ updatedAt: DateTimeISO
4481
+ }
4482
+
4097
4483
  """
4098
4484
  Enumeration for inherited value types: None, Only, or Include. Used to specify how values are inherited in queries or filters.
4099
4485
  """
@@ -4267,6 +4653,11 @@ enum IssueStatus {
4267
4653
  STATUS_B
4268
4654
  }
4269
4655
 
4656
+ """
4657
+ The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).
4658
+ """
4659
+ scalar JSON @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf")
4660
+
4270
4661
  """
4271
4662
  A field whose value is a JSON Web Token (JWT): https://jwt.io/introduction.
4272
4663
  """
@@ -4573,7 +4964,7 @@ input KpiMetricPatch {
4573
4964
  """데이터 수집 방식"""
4574
4965
  collectType: KpiMetricCollectType
4575
4966
  cuFlag: String
4576
- dataSetId: ID
4967
+ dataSet: ObjectRef
4577
4968
  description: String
4578
4969
  fieldName: String
4579
4970
  id: ID
@@ -4616,7 +5007,7 @@ type KpiMetricValue {
4616
5007
  """
4617
5008
  org: String
4618
5009
  periodType: KpiPeriodType!
4619
- project: Project!
5010
+ project: Project
4620
5011
  unit: String
4621
5012
  updatedAt: DateTimeISO
4622
5013
  updater: User
@@ -5407,6 +5798,33 @@ input ManagerPatch {
5407
5798
  userId: ID
5408
5799
  }
5409
5800
 
5801
+ input MaterializeImportSessionInput {
5802
+ """Optional Board description."""
5803
+ description: String
5804
+
5805
+ """Optional Group id to attach the Board to."""
5806
+ groupId: ID
5807
+
5808
+ """New Board name."""
5809
+ name: String!
5810
+
5811
+ """ImportSession id (must be in completed state)."""
5812
+ sessionId: ID!
5813
+
5814
+ """
5815
+ Base64 thumbnail. If omitted, board-service default empty thumbnail is used.
5816
+ """
5817
+ thumbnail: String
5818
+
5819
+ """Board type — 'main' | 'sub' | 'popup'. Default 'main'."""
5820
+ type: String
5821
+
5822
+ """
5823
+ ImportSession 의 결과 시안 중 하나의 id. 'as-is' / 'scene' / 'auto-fit'. 미지정 시 default variant (보통 'scene') 사용.
5824
+ """
5825
+ variantId: String
5826
+ }
5827
+
5410
5828
  """Entity for Menu"""
5411
5829
  type Menu {
5412
5830
  buttons: [MenuButton!]!
@@ -5785,6 +6203,9 @@ type Mutation {
5785
6203
  username: String!
5786
6204
  ): Boolean!
5787
6205
 
6206
+ """Add a user as owner of the current domain."""
6207
+ addDomainOwner(reason: String, username: String!): DomainOwner!
6208
+
5788
6209
  """To apply to all building inspection"""
5789
6210
  applyToAllBuildingInspection(buildingInspectionId: String!): Boolean!
5790
6211
 
@@ -5805,6 +6226,14 @@ type Mutation {
5805
6226
  """
5806
6227
  attachContact(contactId: String!, id: String!): Employee!
5807
6228
 
6229
+ """
6230
+ 썸네일이 없는 기존 첨부파일들에 대해 서버에서 썸네일을 일괄 생성한다. 한 호출당 limit 개까지만 처리하며, remaining > 0 이면 반복 호출 필요.
6231
+ """
6232
+ backfillAttachmentThumbnails(limit: Int = 20): ThumbnailBackfillResult!
6233
+
6234
+ """AI 주도 보드 모델링 — 자연어 채팅으로 보드 생성·구조편집·스타일링. sessionId 로 영속 컨텍스트."""
6235
+ boardAIChat(input: BoardAIChatInput!): BoardAIChatOutput!
6236
+
5808
6237
  """Bulk create or update KPI org-scope mappings."""
5809
6238
  bulkUpsertKpiOrgScopes(
5810
6239
  """Array of org-scope mapping data for bulk upsert."""
@@ -5893,6 +6322,16 @@ type Mutation {
5893
6322
  """Create Daily Worklog by projectId+date"""
5894
6323
  createBuildingInspectionDailyWorklog(patch: BuildingInspectionDailyWorklogNew!): BuildingInspectionDailyWorklog!
5895
6324
 
6325
+ """
6326
+ Always create a new AI chat session for a board (no idempotent reuse). For multi-session UX — 새 탭 열기.
6327
+ """
6328
+ createChatSession(
6329
+ boardId: String!
6330
+
6331
+ """Optional name (defaults to auto-generated `세션 N`)."""
6332
+ name: String
6333
+ ): ChatSession!
6334
+
5896
6335
  """To create new ChecklistItemComment"""
5897
6336
  createChecklistItemComment(checklistItemComment: NewChecklistItemComment!): ChecklistItemComment!
5898
6337
 
@@ -6240,6 +6679,12 @@ type Mutation {
6240
6679
  """Deletes multiple connections by their names."""
6241
6680
  deleteConnections(names: [String!]!): Boolean!
6242
6681
 
6682
+ """공종 체크리스트 템플릿 아이템 삭제"""
6683
+ deleteConstructionChecklistTemplateItems(ids: [String!]!): Boolean!
6684
+
6685
+ """공종 기반 체크리스트 템플릿 삭제"""
6686
+ deleteConstructionChecklistTemplates(ids: [String!]!): Boolean!
6687
+
6243
6688
  """To delete multiple ConstructionDetailTypes"""
6244
6689
  deleteConstructionDetailTypes(ids: [String!]!): Boolean!
6245
6690
 
@@ -6624,6 +7069,9 @@ type Mutation {
6624
7069
  """To delete multiple WorkerTypes"""
6625
7070
  deleteWorkerTypes(ids: [String!]!): Boolean!
6626
7071
 
7072
+ """프로젝트 테넌트 강등 (Domain soft-delete, Project.code 보존)"""
7073
+ demoteProjectTenant(projectId: String!): Boolean!
7074
+
6627
7075
  """
6628
7076
  Detaches an existing contact from an employee. The employee is identified by their ID.
6629
7077
  """
@@ -6700,6 +7148,9 @@ type Mutation {
6700
7148
  attributes: [AttributeSetPatch!]!
6701
7149
  ): Boolean!
6702
7150
 
7151
+ """도면 → 보드 변환을 비동기로 시작. 즉시 ImportSession 반환, 백그라운드에서 처리."""
7152
+ importBoardAsync(input: ImportBoardAsyncInput!): ImportSession!
7153
+
6703
7154
  """Imports multiple boards from JSON files."""
6704
7155
  importBoards(files: [Upload!]!, groupId: String!, overwrite: Boolean!): [Board!]!
6705
7156
 
@@ -6843,6 +7294,11 @@ type Mutation {
6843
7294
 
6844
7295
  """Removes one or more boards from a play group."""
6845
7296
  leavePlayGroup(boardIds: [String!]!, id: String!): PlayGroup!
7297
+
7298
+ """
7299
+ 완료된 ImportSession 의 결과 boardModel 을 새 Board entity 로 영속화한다. 검수 단계 (사용자/AI 가 import 결과를 확인 후 명시적으로 호출) 에서 사용. Board.state="draft" 로 생성되므로 release mutation 으로 별도 발행 필요.
7300
+ """
7301
+ materializeImportSession(input: MaterializeImportSessionInput!): Board!
6846
7302
  multipleUpload(files: [Upload!]!): [Attachment!]!
6847
7303
 
6848
7304
  """
@@ -6850,12 +7306,20 @@ type Mutation {
6850
7306
  """
6851
7307
  pickActivityInstance(id: String!): ActivityThread
6852
7308
 
7309
+ """프로젝트를 테넌트로 승격 (관리번호 발번 + project 카테고리 Domain 생성)"""
7310
+ promoteProjectToTenant(projectId: String!): Project!
7311
+
6853
7312
  """기존 KPI Value 인스턴스를 현재 formula/metric 값으로 재계산"""
6854
7313
  recalculateKpiValue(id: String!): KpiValue!
6855
7314
 
6856
7315
  """Recalculate scores for all KpiValues of a specific KPI"""
6857
7316
  recalculateScoresForKpi(kpiId: String!): Boolean!
6858
7317
 
7318
+ """
7319
+ Record a patch from user direct edit. Adds a system message so AI sees the change next turn.
7320
+ """
7321
+ recordDirectPatch(ops: JSON!, sessionId: String!, summary: String): PatchEntry!
7322
+
6859
7323
  """Record a metric value by metric name, value, meta, and org."""
6860
7324
  recordKpiMetricValue(
6861
7325
  """Extended or non-numeric information (JSON)."""
@@ -6907,10 +7371,16 @@ type Mutation {
6907
7371
 
6908
7372
  """Release a KPI and create a version history."""
6909
7373
  releaseKpi(id: String!): Kpi!
7374
+
7375
+ """Remove a user from the owners of the current domain."""
7376
+ removeDomainOwner(reason: String, username: String!): Boolean!
7377
+
7378
+ """Rename a ChatSession (tab label)."""
7379
+ renameChatSession(name: String!, sessionId: String!): Boolean!
6910
7380
  renewApplicationAccessToken(id: String!, scope: String!): AccessToken!
6911
7381
 
6912
- """Updates the sortOrder of a single board."""
6913
- reorderBoard(id: String!, sortOrder: Float!): Boolean!
7382
+ """Reorders a board between two adjacent boards by ID."""
7383
+ reorderBoard(id: String!, nextId: String, prevId: String): Boolean!
6914
7384
 
6915
7385
  """Sets the custom playback order for boards in a play group."""
6916
7386
  reorderPlayGroup(boardIds: [String!]!, id: String!): PlayGroup!
@@ -6932,6 +7402,9 @@ type Mutation {
6932
7402
  """Revert a KPI to a specific historical version."""
6933
7403
  revertKpiVersion(id: String!, version: Float!): Kpi!
6934
7404
 
7405
+ """Mark a patch as reverted (does not undo, only flags)."""
7406
+ revertPatch(patchId: String!): Boolean!
7407
+
6935
7408
  """
6936
7409
  Runs a new scenario instance once and returns the result after it finishes.
6937
7410
  """
@@ -6951,6 +7424,11 @@ type Mutation {
6951
7424
  """To start ActivityThread"""
6952
7425
  startActivityThread(id: String!, output: Object, reason: String): ActivityThread
6953
7426
 
7427
+ """
7428
+ Start (or get existing) AI chat session for a board. Idempotent — returns first existing or creates one.
7429
+ """
7430
+ startBoardAISession(boardId: String!): ChatSession!
7431
+
6954
7432
  """
6955
7433
  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.
6956
7434
  """
@@ -7224,6 +7702,12 @@ type Mutation {
7224
7702
  """Updates multiple connections at once."""
7225
7703
  updateMultipleConnection(patches: [ConnectionPatch!]!): [Connection!]!
7226
7704
 
7705
+ """공종 기반 체크리스트 템플릿 생성/수정"""
7706
+ updateMultipleConstructionChecklistTemplate(patches: [ConstructionChecklistTemplatePatch!]!): [ConstructionChecklistTemplate!]!
7707
+
7708
+ """공종 체크리스트 템플릿 아이템 일괄 저장"""
7709
+ updateMultipleConstructionChecklistTemplateItems(constructionChecklistTemplateId: String!, patches: [ConstructionChecklistTemplateItemPatch!]!): [ConstructionChecklistTemplateItem!]!
7710
+
7227
7711
  """To modify multiple ConstructionDetailTypes' information"""
7228
7712
  updateMultipleConstructionDetailType(constructionTypeId: String!, patches: [ConstructionDetailTypePatch!]!): [ConstructionDetailType!]!
7229
7713
 
@@ -7502,6 +7986,9 @@ type Mutation {
7502
7986
 
7503
7987
  """프로젝트 공정표 업로드"""
7504
7988
  uploadProjectScheduleTable(param: UploadProjectScheduleTable!): Boolean!
7989
+
7990
+ """공종+세부공종 조합으로 find-or-create"""
7991
+ upsertConstructionChecklistTemplate(constructionDetailTypeId: String!, constructionTypeId: String!): ConstructionChecklistTemplate!
7505
7992
  }
7506
7993
 
7507
7994
  input NewActionPlan {
@@ -8160,8 +8647,8 @@ input NewKpiMetric {
8160
8647
  """데이터 수집 방식"""
8161
8648
  collectType: KpiMetricCollectType
8162
8649
 
8163
- """ID of the source dataset for this metric."""
8164
- dataSetId: ID
8650
+ """Source dataset for this metric."""
8651
+ dataSet: ObjectRef
8165
8652
 
8166
8653
  """User-friendly name or description of the metric."""
8167
8654
  description: String
@@ -9310,6 +9797,26 @@ type PasswordRule {
9310
9797
  useTightPattern: Boolean
9311
9798
  }
9312
9799
 
9800
+ """One board edit operation history (cascade-deleted with ChatSession)."""
9801
+ type PatchEntry {
9802
+ """AI confidence 0..1 (null for user-direct)."""
9803
+ confidence: Float
9804
+ createdAt: DateTimeISO
9805
+ id: ID
9806
+
9807
+ """BoardEditOp[] (parsed JSON array)."""
9808
+ opsJson: JSON!
9809
+
9810
+ """Whether this patch was reverted."""
9811
+ reverted: Boolean!
9812
+
9813
+ """'ai' | 'user-direct' | 'import'"""
9814
+ source: String!
9815
+
9816
+ """Short human summary of this patch."""
9817
+ summary: String
9818
+ }
9819
+
9313
9820
  """Logs the request and response payloads for API interactions."""
9314
9821
  type PayloadLog {
9315
9822
  """The timestamp when the log entry was created."""
@@ -9575,6 +10082,7 @@ input ProfileInput {
9575
10082
  type Project {
9576
10083
  buildingComplex: BuildingComplex
9577
10084
  buildingUsage: String
10085
+ code: String
9578
10086
  completeReport: Attachment
9579
10087
  createdAt: DateTimeISO
9580
10088
  creator: User
@@ -9601,6 +10109,9 @@ type Project {
9601
10109
  state: String!
9602
10110
  structuralSafetyRate: Float
9603
10111
  tasks: [Task!]
10112
+
10113
+ """활성 테넌트 Domain (extType=project). 미승격 또는 강등 상태이면 null"""
10114
+ tenantDomain: Domain
9604
10115
  totalProgress: Float
9605
10116
  updatedAt: DateTimeISO
9606
10117
  updater: User
@@ -10246,6 +10757,28 @@ type Query {
10246
10757
  """To fetch a building level"""
10247
10758
  buildingLevel(id: String!): BuildingLevel
10248
10759
 
10760
+ """List chat messages of a session, oldest first."""
10761
+ chatMessages(limit: Int = 100, offset: Int = 0, sessionId: String!): [ChatMessage!]!
10762
+
10763
+ """List patch entries of a session, newest first."""
10764
+ chatPatches(limit: Int = 100, sessionId: String!): [PatchEntry!]!
10765
+
10766
+ """Get AI chat session by id."""
10767
+ chatSession(id: String!): ChatSession
10768
+
10769
+ """
10770
+ Get AI chat session by board id (returns first match — backward compat single-session lookup).
10771
+ """
10772
+ chatSessionByBoard(boardId: String!): ChatSession
10773
+
10774
+ """List participants of a ChatSession (members / owner)."""
10775
+ chatSessionParticipants(sessionId: String!): [ChatSessionParticipant!]!
10776
+
10777
+ """
10778
+ List all AI chat sessions for a board (oldest first). Multi-session support — UI 탭으로 표시.
10779
+ """
10780
+ chatSessionsByBoard(boardId: String!): [ChatSession!]!
10781
+
10249
10782
  """
10250
10783
  Checks if the system is configured to provide a default password for new users.
10251
10784
  """
@@ -10473,6 +11006,36 @@ type Query {
10473
11006
  """Fetches a list of all available connector types."""
10474
11007
  connectors: ConnectorList!
10475
11008
 
11009
+ """공종 체크리스트 템플릿 아이템 목록"""
11010
+ constructionChecklistTemplateItems(
11011
+ """An array of filter conditions to apply to the list query."""
11012
+ filters: [Filter!]
11013
+
11014
+ """Inherited value type for the list query."""
11015
+ inherited: InheritedValueType
11016
+
11017
+ """Pagination options for the list query."""
11018
+ pagination: Pagination
11019
+
11020
+ """Sorting options for the list query."""
11021
+ sortings: [Sorting!]
11022
+ ): ConstructionChecklistTemplateItemList!
11023
+
11024
+ """공종 기반 체크리스트 템플릿 목록"""
11025
+ constructionChecklistTemplates(
11026
+ """An array of filter conditions to apply to the list query."""
11027
+ filters: [Filter!]
11028
+
11029
+ """Inherited value type for the list query."""
11030
+ inherited: InheritedValueType
11031
+
11032
+ """Pagination options for the list query."""
11033
+ pagination: Pagination
11034
+
11035
+ """Sorting options for the list query."""
11036
+ sortings: [Sorting!]
11037
+ ): ConstructionChecklistTemplateList!
11038
+
10476
11039
  """To fetch multiple ConstructionDetailTypes"""
10477
11040
  constructionDetailTypes(
10478
11041
  """An array of filter conditions to apply to the list query."""
@@ -10524,6 +11087,9 @@ type Query {
10524
11087
  sortings: [Sorting!]
10525
11088
  ): ContactList!
10526
11089
 
11090
+ """현재 테넌트 컨텍스트(extType=project)의 프로젝트. subdomain(=Project.code) 으로 조회."""
11091
+ currentProject: Project
11092
+
10527
11093
  """프로젝트 타입 조회"""
10528
11094
  currentProjectType: String!
10529
11095
  customers: [Domain!]!
@@ -10941,11 +11507,24 @@ type Query {
10941
11507
  sortings: [Sorting!]
10942
11508
  ): DomainLinkList!
10943
11509
 
11510
+ """List owners of the current domain."""
11511
+ domainOwners: [DomainOwner!]!
11512
+
10944
11513
  """
10945
11514
  Fetches the list of available domain types from configuration. Only superusers are granted this privilege.
10946
11515
  """
10947
11516
  domainTypes: [String!]!
10948
11517
 
11518
+ """
11519
+ List users in the current domain for `@` mention popup. board-ai 권한이면 누구나 멘션용 검색 가능 (관리자 전용 users() 와 별도).
11520
+ """
11521
+ domainUsersForMention(
11522
+ limit: Int = 50
11523
+
11524
+ """Substring to match against name/email (case-insensitive). Empty → all."""
11525
+ query: String
11526
+ ): [User!]!
11527
+
10949
11528
  """
10950
11529
  Fetches all domain entities with pagination and filtering options. Only superusers are granted this privilege.
10951
11530
  """
@@ -11166,6 +11745,12 @@ type Query {
11166
11745
  """To query whether I have the given permission"""
11167
11746
  hasPrivilege(category: String!, privilege: String!): Boolean!
11168
11747
 
11748
+ """Get import session progress."""
11749
+ importSession(id: String!): ImportSession
11750
+
11751
+ """List recent import sessions for a chat session."""
11752
+ importSessionsByChatSession(chatSessionId: String!): [ImportSession!]!
11753
+
11169
11754
  """BuildingInspection By ChecklistItemId"""
11170
11755
  inspectionByChecklistItemId: BuildingInspection!
11171
11756
 
@@ -11228,6 +11813,9 @@ type Query {
11228
11813
  invitation(email: EmailAddress!, reference: String!, type: String!): Invitation!
11229
11814
  invitations(reference: String!, type: String!): InvitationList!
11230
11815
 
11816
+ """Check if a user is an owner of the current domain."""
11817
+ isDomainOwner(username: String!): Boolean!
11818
+
11231
11819
  """To fetch a Issue"""
11232
11820
  issue(id: String!): Issue
11233
11821
 
@@ -12114,6 +12702,14 @@ type Query {
12114
12702
  sortings: [Sorting!]
12115
12703
  ): StepList!
12116
12704
 
12705
+ """
12706
+ 도메인 안에서 충돌하지 않는 Board name + 상세 description 제안. name 은 짧고 심플 (30자 이내, 충돌 회피 (n) suffix), description 은 자세히 (사용자 prompt + AI importStrategy + 카테고리 분포 통계 합성).
12707
+ """
12708
+ suggestBoardMeta(input: SuggestBoardNameInput!): BoardMetaSuggestion!
12709
+
12710
+ """@deprecated suggestBoardMeta 사용 권장. 단순 string name 만 반환하는 구버전 query."""
12711
+ suggestBoardName(input: SuggestBoardNameInput!): String!
12712
+
12117
12713
  """To fetch the list of activities that I can report on"""
12118
12714
  supervisableActivities(
12119
12715
  """An array of filter conditions to apply to the list query."""
@@ -13060,6 +13656,16 @@ type Subscription {
13060
13656
  scenarioQueueState: ScenarioQueueState!
13061
13657
  }
13062
13658
 
13659
+ input SuggestBoardNameInput {
13660
+ """명시 hint. session 정보보다 우선. 사용자가 직접 적은 메모를 기반으로 추천받고 싶을 때."""
13661
+ hint: String
13662
+
13663
+ """
13664
+ ImportSession id — 있으면 거기서 userPrompt / VLM reasoning / attachment.name 추출.
13665
+ """
13666
+ sessionId: ID
13667
+ }
13668
+
13063
13669
  """Entity for Supervisor"""
13064
13670
  type Supervisor {
13065
13671
  active: Boolean
@@ -13361,6 +13967,21 @@ input ThemePatch {
13361
13967
  value: Object
13362
13968
  }
13363
13969
 
13970
+ """썸네일 백필 결과"""
13971
+ type ThumbnailBackfillResult {
13972
+ """이번 호출에서 처리 시도한 첨부 개수"""
13973
+ attempted: Int!
13974
+
13975
+ """실패(생성 실패/콘텐츠 없음 등) 개수"""
13976
+ failed: Int!
13977
+
13978
+ """이번 처리 후에도 남아있는 썸네일 미생성 후보 개수 (대략치). 0 이면 완료"""
13979
+ remaining: Int!
13980
+
13981
+ """썸네일 생성·저장 성공 개수"""
13982
+ succeeded: Int!
13983
+ }
13984
+
13364
13985
  input UpdateBuildingInspection {
13365
13986
  drawingMarker: String
13366
13987
  id: String!