@dssp/dkpi 1.0.0-y.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/KPI-STATISTICS-SERVICE.md +233 -0
  2. package/_index.html +4 -9
  3. package/assets/helps/index.md +1 -1
  4. package/assets/images/project-image.png +0 -0
  5. package/assets/manifest.json +2 -2
  6. package/config/config.development.js +2 -1
  7. package/config/config.production.js +2 -1
  8. package/dist-client/bootstrap.d.ts +1 -0
  9. package/dist-client/bootstrap.js +15 -0
  10. package/dist-client/bootstrap.js.map +1 -1
  11. package/dist-client/components/kpi-2d-lookup-chart.d.ts +50 -0
  12. package/dist-client/components/kpi-2d-lookup-chart.js +263 -0
  13. package/dist-client/components/kpi-2d-lookup-chart.js.map +1 -0
  14. package/dist-client/components/kpi-boxplot-chart.d.ts +31 -0
  15. package/dist-client/components/kpi-boxplot-chart.js +306 -0
  16. package/dist-client/components/kpi-boxplot-chart.js.map +1 -0
  17. package/dist-client/components/kpi-lookup-chart.d.ts +58 -0
  18. package/dist-client/components/kpi-lookup-chart.js +464 -0
  19. package/dist-client/components/kpi-lookup-chart.js.map +1 -0
  20. package/dist-client/components/kpi-mini-trend-chart.d.ts +14 -0
  21. package/dist-client/components/kpi-mini-trend-chart.js +180 -0
  22. package/dist-client/components/kpi-mini-trend-chart.js.map +1 -0
  23. package/dist-client/components/kpi-radar-chart.d.ts +17 -0
  24. package/dist-client/components/kpi-radar-chart.js +259 -0
  25. package/dist-client/components/kpi-radar-chart.js.map +1 -0
  26. package/dist-client/components/kpi-single-boxplot-chart.d.ts +14 -2
  27. package/dist-client/components/kpi-single-boxplot-chart.js +237 -137
  28. package/dist-client/components/kpi-single-boxplot-chart.js.map +1 -1
  29. package/dist-client/components/kpi-step-lookup-chart.d.ts +33 -0
  30. package/dist-client/components/kpi-step-lookup-chart.js +181 -0
  31. package/dist-client/components/kpi-step-lookup-chart.js.map +1 -0
  32. package/dist-client/components/kpi-trend-chart.d.ts +25 -0
  33. package/dist-client/components/kpi-trend-chart.js +241 -0
  34. package/dist-client/components/kpi-trend-chart.js.map +1 -0
  35. package/dist-client/entries/auth/checkin.d.ts +38 -0
  36. package/dist-client/entries/auth/checkin.js +551 -0
  37. package/dist-client/entries/auth/checkin.js.map +1 -0
  38. package/dist-client/google-map/common-google-map.d.ts +35 -0
  39. package/dist-client/google-map/common-google-map.js +349 -0
  40. package/dist-client/google-map/common-google-map.js.map +1 -0
  41. package/dist-client/google-map/google-map-loader.d.ts +6 -0
  42. package/dist-client/google-map/google-map-loader.js +23 -0
  43. package/dist-client/google-map/google-map-loader.js.map +1 -0
  44. package/dist-client/pages/component/project-update-header.d.ts +1 -0
  45. package/dist-client/pages/component/project-update-header.js +127 -0
  46. package/dist-client/pages/component/project-update-header.js.map +1 -0
  47. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.d.ts +22 -0
  48. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.js +57 -0
  49. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.js.map +1 -0
  50. package/dist-client/pages/kpi-admin/dssp-kpi-overview.d.ts +47 -0
  51. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js +393 -0
  52. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js.map +1 -0
  53. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.d.ts +20 -0
  54. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.js +445 -0
  55. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.js.map +1 -0
  56. package/dist-client/pages/kpi-admin/kpi-system-guide.d.ts +18 -0
  57. package/dist-client/pages/kpi-admin/kpi-system-guide.js +696 -0
  58. package/dist-client/pages/kpi-admin/kpi-system-guide.js.map +1 -0
  59. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.d.ts +18 -0
  60. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +259 -0
  61. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +1 -0
  62. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.d.ts +22 -0
  63. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +346 -0
  64. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +1 -0
  65. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.d.ts +26 -0
  66. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +433 -0
  67. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +1 -0
  68. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.d.ts +8 -0
  69. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js +78 -0
  70. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js.map +1 -0
  71. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +46 -0
  72. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +945 -0
  73. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -0
  74. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +34 -0
  75. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +238 -0
  76. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -0
  77. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +37 -0
  78. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +689 -0
  79. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -0
  80. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +18 -0
  81. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +131 -0
  82. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +1 -0
  83. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +57 -0
  84. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +866 -0
  85. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -0
  86. package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +63 -0
  87. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +1097 -0
  88. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -0
  89. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +12 -0
  90. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +82 -0
  91. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +1 -0
  92. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +11 -0
  93. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +65 -0
  94. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +1 -0
  95. package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +13 -0
  96. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +115 -0
  97. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +1 -0
  98. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +15 -0
  99. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +147 -0
  100. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +1 -0
  101. package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +7 -0
  102. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +86 -0
  103. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +1 -0
  104. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +1 -2
  105. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +1 -13
  106. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -1
  107. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +1 -2
  108. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +20 -11
  109. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -1
  110. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +1 -2
  111. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +1 -2
  112. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -1
  113. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +1 -2
  114. package/dist-client/pages/kpi-value/kpi-value-list-page.js +22 -33
  115. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
  116. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.d.ts +56 -0
  117. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js +609 -67
  118. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js.map +1 -1
  119. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.d.ts +15 -3
  120. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js +180 -65
  121. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js.map +1 -1
  122. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.d.ts +13 -4
  123. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js +213 -91
  124. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js.map +1 -1
  125. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.d.ts +51 -0
  126. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js +693 -0
  127. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js.map +1 -0
  128. package/dist-client/pages/sv-project-complete.d.ts +12 -3
  129. package/dist-client/pages/sv-project-complete.js +175 -29
  130. package/dist-client/pages/sv-project-complete.js.map +1 -1
  131. package/dist-client/pages/sv-project-completed-list.d.ts +3 -0
  132. package/dist-client/pages/sv-project-completed-list.js +81 -22
  133. package/dist-client/pages/sv-project-completed-list.js.map +1 -1
  134. package/dist-client/pages/sv-project-detail.d.ts +60 -0
  135. package/dist-client/pages/sv-project-detail.js +1092 -85
  136. package/dist-client/pages/sv-project-detail.js.map +1 -1
  137. package/dist-client/pages/sv-project-list.d.ts +20 -2
  138. package/dist-client/pages/sv-project-list.js +180 -30
  139. package/dist-client/pages/sv-project-list.js.map +1 -1
  140. package/dist-client/pages/sv-project-update.d.ts +91 -0
  141. package/dist-client/pages/sv-project-update.js +1150 -0
  142. package/dist-client/pages/sv-project-update.js.map +1 -0
  143. package/dist-client/pages/sv-user-management.d.ts +1 -0
  144. package/dist-client/pages/sv-user-management.js +5 -0
  145. package/dist-client/pages/sv-user-management.js.map +1 -1
  146. package/dist-client/route.d.ts +1 -1
  147. package/dist-client/route.js +29 -2
  148. package/dist-client/route.js.map +1 -1
  149. package/dist-client/shared/complete-api.d.ts +45 -5
  150. package/dist-client/shared/complete-api.js +177 -28
  151. package/dist-client/shared/complete-api.js.map +1 -1
  152. package/dist-client/shared/func.d.ts +1 -1
  153. package/dist-client/shared/func.js.map +1 -1
  154. package/dist-client/shared/geo-group-mapping.d.ts +25 -0
  155. package/dist-client/shared/geo-group-mapping.js +189 -0
  156. package/dist-client/shared/geo-group-mapping.js.map +1 -0
  157. package/dist-client/shared/integration-fetch.d.ts +35 -0
  158. package/dist-client/shared/integration-fetch.js +53 -0
  159. package/dist-client/shared/integration-fetch.js.map +1 -0
  160. package/dist-client/shared/kpi-project-sync.d.ts +16 -0
  161. package/dist-client/shared/kpi-project-sync.js +129 -0
  162. package/dist-client/shared/kpi-project-sync.js.map +1 -0
  163. package/dist-client/tsconfig.tsbuildinfo +1 -1
  164. package/dist-client/viewparts/menu-tools.d.ts +11 -3
  165. package/dist-client/viewparts/menu-tools.js +126 -75
  166. package/dist-client/viewparts/menu-tools.js.map +1 -1
  167. package/dist-server/scripts/calculate-kpi-scores.js +65 -3
  168. package/dist-server/scripts/calculate-kpi-scores.js.map +1 -1
  169. package/dist-server/scripts/load-grade-data-migration.d.ts +4 -0
  170. package/dist-server/scripts/load-grade-data-migration.js +95 -10
  171. package/dist-server/scripts/load-grade-data-migration.js.map +1 -1
  172. package/dist-server/scripts/propagate-parent-kpi-values.d.ts +4 -0
  173. package/dist-server/scripts/propagate-parent-kpi-values.js +423 -77
  174. package/dist-server/scripts/propagate-parent-kpi-values.js.map +1 -1
  175. package/dist-server/scripts/recalculate-by-project-name.d.ts +2 -0
  176. package/dist-server/scripts/recalculate-by-project-name.js +72 -0
  177. package/dist-server/scripts/recalculate-by-project-name.js.map +1 -0
  178. package/dist-server/service/index.d.ts +1 -3
  179. package/dist-server/service/index.js +3 -4
  180. package/dist-server/service/index.js.map +1 -1
  181. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +192 -1
  182. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +993 -38
  183. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
  184. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +9 -1
  185. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +33 -8
  186. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +1 -1
  187. package/dist-server/service/kpi-stat/index.d.ts +4 -0
  188. package/dist-server/service/kpi-stat/index.js +8 -0
  189. package/dist-server/service/kpi-stat/index.js.map +1 -0
  190. package/dist-server/service/kpi-stat/kpi-stat-query.d.ts +13 -0
  191. package/dist-server/service/kpi-stat/kpi-stat-query.js +751 -0
  192. package/dist-server/service/kpi-stat/kpi-stat-query.js.map +1 -0
  193. package/dist-server/service/kpi-stat/kpi-stat-types.d.ts +32 -0
  194. package/dist-server/service/kpi-stat/kpi-stat-types.js +180 -0
  195. package/dist-server/service/kpi-stat/kpi-stat-types.js.map +1 -0
  196. package/dist-server/service/kpi-value/kpi-value-query.d.ts +2 -1
  197. package/dist-server/service/kpi-value/kpi-value-query.js +49 -6
  198. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
  199. package/dist-server/tsconfig.tsbuildinfo +1 -1
  200. package/kpi-module-service-tests.md +1286 -0
  201. package/kpi-module-test-report.md +676 -0
  202. package/kpi-module-unit-test-detailed-report.md +925 -0
  203. package/kpi-module-unit-tests-detailed.md +1452 -0
  204. package/openapi/unstable.yaml +2 -2
  205. package/package.json +58 -54
  206. package/recalculate-batch.sh +64 -0
  207. package/recalculate-projects-range.sh +98 -0
  208. package/schema.graphql +1159 -55
  209. package/things-factory.config.js +6 -1
  210. package/translations/en.json +5 -1
  211. package/translations/ko.json +5 -1
  212. package/views/auth-page.html +4 -5
  213. package/views/public/home.html +5 -6
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,9 +2080,11 @@ 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
@@ -1860,10 +2120,12 @@ type ChecklistItemHistory {
1860
2120
  detailType: String!
1861
2121
  id: ID!
1862
2122
  inspctionCriteria: String
2123
+ kcsCriteria: String
1863
2124
  loggedAt: DateTimeISO
1864
2125
  mainType: String!
1865
2126
  name: String
1866
2127
  sequence: Float
2128
+ siteSpecCriteria: String
1867
2129
  supervisoryConfirmStatus: String
1868
2130
  updater: User
1869
2131
  }
@@ -1876,8 +2138,10 @@ type ChecklistItemHistoryList {
1876
2138
  input ChecklistItemInputType {
1877
2139
  detailType: String!
1878
2140
  inspctionCriteria: String
2141
+ kcsCriteria: String
1879
2142
  mainType: String!
1880
2143
  name: String!
2144
+ siteSpecCriteria: String
1881
2145
  }
1882
2146
 
1883
2147
  type ChecklistItemList {
@@ -1929,6 +2193,7 @@ type ChecklistTemplateItem {
1929
2193
  detailTypeName: String!
1930
2194
  id: ID!
1931
2195
  inspctionCriteria: String
2196
+ inspctionCriteriaText: String
1932
2197
  mainType: String!
1933
2198
  name: String!
1934
2199
  sequence: Int
@@ -1948,6 +2213,7 @@ input ChecklistTemplateItemPatch {
1948
2213
  detailType: String
1949
2214
  id: ID
1950
2215
  inspctionCriteria: String
2216
+ inspctionCriteriaText: String
1951
2217
  mainType: String
1952
2218
  name: String
1953
2219
  sequence: Int
@@ -1987,16 +2253,6 @@ input ChecklistTypePatch {
1987
2253
  mainType: String
1988
2254
  }
1989
2255
 
1990
- input CodeDecipherInput {
1991
- code: String!
1992
- language: String
1993
- system: String
1994
- }
1995
-
1996
- type CodeDecipherOutput {
1997
- message: String
1998
- }
1999
-
2000
2256
  """Entity for CommonCode"""
2001
2257
  type CommonCode {
2002
2258
  createdAt: DateTimeISO
@@ -2079,6 +2335,11 @@ type Connection {
2079
2335
  """Unique identifier for the connection."""
2080
2336
  id: ID!
2081
2337
 
2338
+ """
2339
+ Inheritance mode for child domains. ISOLATE = per-child instance with isolated session. SHARE = shared parent instance. null = use Connector default (falls back to ISOLATE).
2340
+ """
2341
+ inheritanceMode: ConnectionInheritanceMode
2342
+
2082
2343
  """The name of the connection."""
2083
2344
  name: String!
2084
2345
 
@@ -2103,6 +2364,14 @@ type Connection {
2103
2364
  updater: User
2104
2365
  }
2105
2366
 
2367
+ """
2368
+ Child domain inheritance mode — ISOLATE: per-child instance with isolated session/credentials. SHARE: single parent instance reused by all children.
2369
+ """
2370
+ enum ConnectionInheritanceMode {
2371
+ ISOLATE
2372
+ SHARE
2373
+ }
2374
+
2106
2375
  """A paginated list of connections."""
2107
2376
  type ConnectionList {
2108
2377
  """The list of connection items."""
@@ -2134,6 +2403,11 @@ input ConnectionPatch {
2134
2403
  """The unique identifier of the connection to update."""
2135
2404
  id: ID
2136
2405
 
2406
+ """
2407
+ Inheritance mode for child domains. ISOLATE = per-child instance. SHARE = shared parent instance. null = use connector default.
2408
+ """
2409
+ inheritanceMode: ConnectionInheritanceMode
2410
+
2137
2411
  """The new name for the connection."""
2138
2412
  name: String
2139
2413
 
@@ -2163,6 +2437,11 @@ type ConnectionState {
2163
2437
  """The unique identifier of the connection."""
2164
2438
  id: String
2165
2439
 
2440
+ """
2441
+ Inheritance mode for child domains. ISOLATE = per-child instance. SHARE = shared parent instance. null = use connector default (falls back to ISOLATE).
2442
+ """
2443
+ inheritanceMode: ConnectionInheritanceMode
2444
+
2166
2445
  """The name of the connection."""
2167
2446
  name: String
2168
2447
 
@@ -2210,6 +2489,68 @@ type ConnectorType {
2210
2489
  taskPrefixes: [String!]
2211
2490
  }
2212
2491
 
2492
+ type ConstructionChecklistTemplate {
2493
+ constructionChecklistTemplateItems: [ConstructionChecklistTemplateItem!]
2494
+ constructionDetailTypeId: String!
2495
+ constructionTypeId: String!
2496
+ createdAt: DateTimeISO
2497
+ creator: User
2498
+ deletedAt: DateTimeISO
2499
+ domain: Domain
2500
+ id: ID!
2501
+ updatedAt: DateTimeISO
2502
+ updater: User
2503
+ }
2504
+
2505
+ type ConstructionChecklistTemplateItem {
2506
+ constructionChecklistTemplate: ConstructionChecklistTemplate
2507
+ createdAt: DateTimeISO
2508
+ creator: User
2509
+ criteriaRequestStatus: CriteriaRequestStatus
2510
+ id: ID!
2511
+ inspctionCriteria: String
2512
+ mainType: String
2513
+ name: String!
2514
+ recommendation1: String
2515
+ recommendation2: String
2516
+ recommendation3: String
2517
+ recommendation4: String
2518
+ recommendation5: String
2519
+ sequence: Int
2520
+ updatedAt: DateTimeISO
2521
+ updater: User
2522
+ }
2523
+
2524
+ type ConstructionChecklistTemplateItemList {
2525
+ items: [ConstructionChecklistTemplateItem!]!
2526
+ total: Int!
2527
+ }
2528
+
2529
+ input ConstructionChecklistTemplateItemPatch {
2530
+ id: ID
2531
+ inspctionCriteria: String
2532
+ mainType: String
2533
+ name: String
2534
+ recommendation1: String
2535
+ recommendation2: String
2536
+ recommendation3: String
2537
+ recommendation4: String
2538
+ recommendation5: String
2539
+ sequence: Int
2540
+ }
2541
+
2542
+ type ConstructionChecklistTemplateList {
2543
+ items: [ConstructionChecklistTemplate!]!
2544
+ total: Int!
2545
+ }
2546
+
2547
+ input ConstructionChecklistTemplatePatch {
2548
+ constructionDetailTypeId: String
2549
+ constructionTypeId: String
2550
+ cuFlag: String
2551
+ id: ID
2552
+ }
2553
+
2213
2554
  """세부 공종 타입"""
2214
2555
  type ConstructionDetailType {
2215
2556
  constructionType: ConstructionType
@@ -2244,6 +2585,7 @@ type ConstructionType {
2244
2585
  domain: Domain
2245
2586
  id: ID!
2246
2587
  name: String
2588
+ projectType: String
2247
2589
  updatedAt: DateTimeISO
2248
2590
  updater: User
2249
2591
  }
@@ -2258,6 +2600,7 @@ input ConstructionTypePatch {
2258
2600
  description: String
2259
2601
  id: ID
2260
2602
  name: String
2603
+ projectType: String
2261
2604
  }
2262
2605
 
2263
2606
  """Entity for Contact"""
@@ -2332,6 +2675,11 @@ type Data {
2332
2675
  The tag name attached to the data, used for filtering and identification.
2333
2676
  """
2334
2677
  tag: String!
2678
+
2679
+ """
2680
+ Server publish timestamp in epoch milliseconds, stamped at delivery. Used by clients to monitor data delivery lag.
2681
+ """
2682
+ ts: Float
2335
2683
  }
2336
2684
 
2337
2685
  """
@@ -2500,15 +2848,18 @@ input DataItemPatch {
2500
2848
 
2501
2849
  """type enumeration of a data-item"""
2502
2850
  enum DataItemType {
2851
+ audio
2503
2852
  boolean
2504
2853
  date
2505
2854
  datetime
2506
2855
  file
2856
+ image
2507
2857
  number
2508
2858
  radio
2509
2859
  select
2510
2860
  signature
2511
2861
  text
2862
+ video
2512
2863
  }
2513
2864
 
2514
2865
  """
@@ -3539,6 +3890,27 @@ type DomainList {
3539
3890
  total: Int
3540
3891
  }
3541
3892
 
3893
+ """An ownership record binding a User to a Domain (multi-owner support)."""
3894
+ type DomainOwner {
3895
+ """Domain that the user owns."""
3896
+ domain: Domain!
3897
+
3898
+ """When the ownership was granted."""
3899
+ grantedAt: DateTimeISO!
3900
+
3901
+ """User who granted this ownership (audit)."""
3902
+ grantedBy: User
3903
+
3904
+ """Unique identifier."""
3905
+ id: ID!
3906
+
3907
+ """Optional reason/memo for granting ownership."""
3908
+ reason: String
3909
+
3910
+ """User who owns the domain."""
3911
+ user: User!
3912
+ }
3913
+
3542
3914
  """Input type for updating an existing domain entity."""
3543
3915
  input DomainPatch {
3544
3916
  """Additional attributes for the domain in key-value pairs."""
@@ -3976,6 +4348,42 @@ input EnvVarPatch {
3976
4348
  value: String
3977
4349
  }
3978
4350
 
4351
+ """Resolved state of an EnvVar key with ancestor closest-wins lookup."""
4352
+ type EnvVarResolution {
4353
+ """EnvVar id (only when found in any domain)."""
4354
+ envVarId: String
4355
+ hasValue: Boolean!
4356
+ key: String!
4357
+ sourceDomainId: String
4358
+ sourceDomainName: String
4359
+ status: String!
4360
+
4361
+ """
4362
+ Resolved value when found. Client decides masking based on propertySpec type.
4363
+ """
4364
+ value: String
4365
+ }
4366
+
4367
+ """외부 시스템(세움터/올바로/키스콘) 데이터 수집 시나리오 호출 결과"""
4368
+ type ExternalDataCollectionResult {
4369
+ """
4370
+ 시나리오 result 객체 — projectKey: value 맵. 세움터={area, floorAreaRatio, upperFloorCount, lowerFloorCount, structureType, siteType}, 올바로={totalConstructionWasteAmount}, 키스콘={constructionPeriod, constructionCost}. siteType (건축물 용도, 예 APARTMENT_COMPLEX) / structureType (구조형태) 는 BuildingComplex 의 시설유형/구조유형 속성 후보. KISCON 의 "공사유형(신설/증축)" 은 DSSP SiteType (용도분류) 와 다른 도메인이라 매핑 대상 아님.
4371
+ """
4372
+ data: Object
4373
+
4374
+ """표시 라벨 (세움터/올바로/키스콘)"""
4375
+ label: String!
4376
+
4377
+ """성공 시 "완료", 실패 시 에러 메시지"""
4378
+ message: String!
4379
+
4380
+ """시나리오 실행 성공 여부"""
4381
+ ok: Boolean!
4382
+
4383
+ """소스 키: saeumteo | allbaro | kiscon"""
4384
+ source: String!
4385
+ }
4386
+
3979
4387
  """Entity for Favorite"""
3980
4388
  type Favorite {
3981
4389
  createdAt: DateTimeISO
@@ -3993,6 +4401,48 @@ type FavoriteList {
3993
4401
  total: Int!
3994
4402
  }
3995
4403
 
4404
+ """Entity for FieldDocument"""
4405
+ type FieldDocument {
4406
+ aiSummary: String
4407
+ aiSummaryStatus: FieldDocumentSummaryStatus
4408
+ code: String!
4409
+ createdAt: DateTimeISO
4410
+ creator: User
4411
+ deletedAt: DateTimeISO
4412
+ domain: Domain
4413
+
4414
+ """파일 크기"""
4415
+ fileSize: String
4416
+
4417
+ """첨부파일 fullpath"""
4418
+ fullpath: String
4419
+ id: ID
4420
+ isFavorite: Boolean
4421
+ name: String!
4422
+ projectId: String!
4423
+ sourceRefId: String
4424
+ sourceType: String
4425
+ updatedAt: DateTimeISO
4426
+ updater: User
4427
+ }
4428
+
4429
+ type FieldDocumentCodeCount {
4430
+ code: String!
4431
+ count: Int!
4432
+ }
4433
+
4434
+ type FieldDocumentList {
4435
+ items: [FieldDocument!]!
4436
+ total: Int!
4437
+ }
4438
+
4439
+ """AI 문서 요약 요청 상태"""
4440
+ enum FieldDocumentSummaryStatus {
4441
+ FAIL
4442
+ REQUEST
4443
+ SUCCESS
4444
+ }
4445
+
3996
4446
  """Input type for specifying a filter condition in a list query."""
3997
4447
  input Filter {
3998
4448
  """The field name to apply the filter on."""
@@ -4098,14 +4548,68 @@ input GroupPatch {
4098
4548
  name: String
4099
4549
  }
4100
4550
 
4101
- input ImageCompletionInput {
4102
- count: Float!
4103
- description: String!
4104
- size: String!
4551
+ input ImportBoardAsyncInput {
4552
+ """Apply Stage 4 (data binding)."""
4553
+ applyBinding: Boolean
4554
+
4555
+ """
4556
+ Attachment id of the source drawing file (uploaded via attachment-base).
4557
+ """
4558
+ attachmentId: String!
4559
+
4560
+ """ChatSession id when triggered from board-ai chat."""
4561
+ chatSessionId: String
4562
+
4563
+ """Flip Y axis (CAD Y-up → scene Y-down)."""
4564
+ flipY: Boolean
4565
+
4566
+ """Normalize coordinates so minX,minY=0"""
4567
+ normalizeOrigin: Boolean
4568
+
4569
+ """Adapter parse options (excludeLayers, maxEntities, ...)."""
4570
+ parseOptions: JSON
4571
+
4572
+ """Scale factor (e.g. 1 for mm:1unit)."""
4573
+ scale: Float
4574
+
4575
+ """Registry scopes to use (board-import)."""
4576
+ scopes: [String!]
4577
+
4578
+ """
4579
+ 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."
4580
+ """
4581
+ userPrompt: String
4105
4582
  }
4106
4583
 
4107
- type ImageCompletionOutput {
4108
- images: String
4584
+ """도면 보드 변환 작업의 영속 단위 (비동기 진행상태 추적)."""
4585
+ type ImportSession {
4586
+ """Attachment id (the source drawing file)"""
4587
+ attachmentId: String!
4588
+
4589
+ """ChatSession id when triggered from chat (board-ai)."""
4590
+ chatSessionId: String
4591
+ completedAt: DateTimeISO
4592
+ createdAt: DateTimeISO
4593
+ creator: User
4594
+ domain: Domain
4595
+ id: ID
4596
+ message: String
4597
+
4598
+ """Options used (parsed JSON)."""
4599
+ options: JSON
4600
+
4601
+ """Progress percentage 0..100"""
4602
+ progress: Float!
4603
+
4604
+ """Result (parsed JSON): { boardModel, stats, warnings }."""
4605
+ result: JSON
4606
+
4607
+ """queued | parsing | mapping | assembling | binding | completed | failed"""
4608
+ status: String!
4609
+
4610
+ """Total entities counted (when known)."""
4611
+ totalEntities: Int
4612
+ updatedAt: DateTimeISO
4109
4613
  }
4110
4614
 
4111
4615
  """
@@ -4281,6 +4785,11 @@ enum IssueStatus {
4281
4785
  STATUS_B
4282
4786
  }
4283
4787
 
4788
+ """
4789
+ The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).
4790
+ """
4791
+ scalar JSON @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf")
4792
+
4284
4793
  """
4285
4794
  A field whose value is a JSON Web Token (JWT): https://jwt.io/introduction.
4286
4795
  """
@@ -4361,6 +4870,11 @@ type Kpi {
4361
4870
  """
4362
4871
  scoreFormula: String
4363
4872
 
4873
+ """
4874
+ value → score 변환 방식. NONE: 미설정, DIRECT: value=score(변환 없음), FORMULA: scoreFormula 수식, LOOKUP: grade table(1D), CUSTOM: 2D 룩업 등 특수 변환.
4875
+ """
4876
+ scoreType: KpiScoreType
4877
+
4364
4878
  """Current state of the KPI (DRAFT, RELEASED, ARCHIVED)."""
4365
4879
  state: String
4366
4880
  targetValue: Float
@@ -4385,6 +4899,11 @@ type Kpi {
4385
4899
  orgScope: String
4386
4900
  ): KpiValue
4387
4901
 
4902
+ """
4903
+ value 획득 방식. MEASURED: 외부 시스템 수집 측정값, ASSESSED: 감리자 직접 평가(1~5), CALCULATED: formula 자동 계산, COMPOSITE: 다차원 룩업 결과.
4904
+ """
4905
+ valueType: KpiValueType
4906
+
4388
4907
  """
4389
4908
  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
4909
  """
@@ -4420,6 +4939,30 @@ type KpiAlert {
4420
4939
  message: String!
4421
4940
  }
4422
4941
 
4942
+ type KpiComprehensiveStats {
4943
+ avgVal: Float!
4944
+ kpiName: String
4945
+ maxVal: Float!
4946
+ medVal: Float!
4947
+ minVal: Float!
4948
+ projectCount: Int!
4949
+ q1Val: Float!
4950
+ q3Val: Float!
4951
+ }
4952
+
4953
+ type KpiComprehensiveStatsByGeoGroup {
4954
+ address: String
4955
+ avgVal: Float!
4956
+ geoGroup: String
4957
+ kpiName: String
4958
+ maxVal: Float!
4959
+ medVal: Float!
4960
+ minVal: Float!
4961
+ projectCount: Int!
4962
+ q1Val: Float!
4963
+ q3Val: Float!
4964
+ }
4965
+
4423
4966
  """History Entity of Kpi"""
4424
4967
  type KpiHistory {
4425
4968
  """Whether this KPI is active (usable) or not."""
@@ -4498,12 +5041,18 @@ type KpiMetric {
4498
5041
  """Unique identifier for this KPI metric."""
4499
5042
  id: ID!
4500
5043
 
5044
+ """metric 확장 설정(input/kind/source 등). 입력 UI·소스 바인딩 등을 담는 네임스페이스."""
5045
+ meta: Object
5046
+
4501
5047
  """Metric code, unique within the domain, used in KPI formulas."""
4502
5048
  name: String!
4503
5049
 
4504
5050
  """Aggregation period type for this metric."""
4505
5051
  periodType: KpiPeriodType!
4506
5052
 
5053
+ """목록 표시 순서(오름차순). 미지정(null)은 뒤로 정렬."""
5054
+ rank: Int
5055
+
4507
5056
  """
4508
5057
  Cron schedule string for periodic KPI value aggregation (e.g., "0 0 * * *" for daily).
4509
5058
  """
@@ -4553,15 +5102,21 @@ input KpiMetricPatch {
4553
5102
  """데이터 수집 방식"""
4554
5103
  collectType: KpiMetricCollectType
4555
5104
  cuFlag: String
4556
- dataSetId: ID
5105
+ dataSet: ObjectRef
4557
5106
  description: String
4558
5107
  fieldName: String
4559
5108
  id: ID
5109
+
5110
+ """확장 메타(JSON). 입력 위젯 힌트(meta.input) 등. 스키마 변경 없이 확장."""
5111
+ meta: Object
4560
5112
  name: String
4561
5113
 
4562
5114
  """Aggregation period type for this metric."""
4563
5115
  periodType: KpiPeriodType
4564
5116
 
5117
+ """목록 표시 순서(오름차순). 미지정(null)은 뒤로 정렬."""
5118
+ rank: Int
5119
+
4565
5120
  """
4566
5121
  Cron schedule string for periodic KPI value aggregation (e.g., "0 0 * * *" for daily).
4567
5122
  """
@@ -4596,7 +5151,7 @@ type KpiMetricValue {
4596
5151
  """
4597
5152
  org: String
4598
5153
  periodType: KpiPeriodType!
4599
- project: Project!
5154
+ project: Project
4600
5155
  unit: String
4601
5156
  updatedAt: DateTimeISO
4602
5157
  updater: User
@@ -4652,6 +5207,13 @@ input KpiMetricValuePatch {
4652
5207
  valueDate: String
4653
5208
  }
4654
5209
 
5210
+ type KpiMonthlyTrend {
5211
+ avgVal: Float!
5212
+ geoGroup: String
5213
+ projectCount: Int!
5214
+ yearMonth: String!
5215
+ }
5216
+
4655
5217
  """
4656
5218
  KPI organization scope mapping entity. Maps business entities to various scope dimensions for KPI analysis using generic reference pattern.
4657
5219
  """
@@ -4797,6 +5359,9 @@ input KpiPatch {
4797
5359
  """
4798
5360
  scoreFormula: String
4799
5361
 
5362
+ """value → score 변환 방식."""
5363
+ scoreType: KpiScoreType
5364
+
4800
5365
  """Current state of the KPI (DRAFT, RELEASED, ARCHIVED)."""
4801
5366
  state: KpiStatus
4802
5367
 
@@ -4806,6 +5371,9 @@ input KpiPatch {
4806
5371
  """Timezone for the KPI schedule."""
4807
5372
  timezone: String
4808
5373
 
5374
+ """value 획득 방식."""
5375
+ valueType: KpiValueType
5376
+
4809
5377
  """
4810
5378
  Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, etc.
4811
5379
  """
@@ -4833,6 +5401,19 @@ enum KpiPeriodType {
4833
5401
  YEAR
4834
5402
  }
4835
5403
 
5404
+ type KpiProjectStat {
5405
+ avgVal: Float!
5406
+ categoryName: String
5407
+ kpiName: String!
5408
+ maxVal: Float!
5409
+ medVal: Float!
5410
+ minVal: Float!
5411
+ projectCount: Int!
5412
+ q1Val: Float!
5413
+ q3Val: Float!
5414
+ stddevVal: Float!
5415
+ }
5416
+
4836
5417
  """
4837
5418
  Defines the meaning and metadata for each scope level (scope01~05) in KpiOrgScope
4838
5419
  """
@@ -4929,6 +5510,16 @@ input KpiScopePatch {
4929
5510
  validationPattern: String
4930
5511
  }
4931
5512
 
5513
+ """
5514
+ value → score 변환 방식. DIRECT: value=score(변환 없음), FORMULA: scoreFormula 수식 적용, LOOKUP: grade table(1D) 매핑, CUSTOM: 2D 룩업 등 특수 변환.
5515
+ """
5516
+ enum KpiScoreType {
5517
+ CUSTOM
5518
+ DIRECT
5519
+ FORMULA
5520
+ LOOKUP
5521
+ }
5522
+
4932
5523
  """
4933
5524
  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.
4934
5525
  """
@@ -5109,7 +5700,7 @@ type KpiValue {
5109
5700
  project: Project!
5110
5701
 
5111
5702
  """
5112
- Performance score calculated from KPI value using scoreFormula or grades lookup table. Range: 0-1.
5703
+ Performance score calculated from KPI value using scoreFormula or grades lookup table.
5113
5704
  """
5114
5705
  score: Float
5115
5706
 
@@ -5200,6 +5791,21 @@ input KpiValuePatch {
5200
5791
  version: Int
5201
5792
  }
5202
5793
 
5794
+ """
5795
+ value 획득 방식. MEASURED: 외부 시스템 수집 측정값, ASSESSED: 감리자 직접 평가(1~5), CALCULATED: formula 자동 계산, COMPOSITE: 다차원 복합 입력 결과.
5796
+ """
5797
+ enum KpiValueType {
5798
+ ASSESSED
5799
+ CALCULATED
5800
+ COMPOSITE
5801
+ MEASURED
5802
+ }
5803
+
5804
+ type KpiValuesObject {
5805
+ kpiName: String!
5806
+ value: Float!
5807
+ }
5808
+
5203
5809
  """Visualization type for KPI display (CARD, GAUGE, PROGRESS, etc.)"""
5204
5810
  enum KpiVizType {
5205
5811
  BADGE
@@ -5336,6 +5942,33 @@ input ManagerPatch {
5336
5942
  userId: ID
5337
5943
  }
5338
5944
 
5945
+ input MaterializeImportSessionInput {
5946
+ """Optional Board description."""
5947
+ description: String
5948
+
5949
+ """Optional Group id to attach the Board to."""
5950
+ groupId: ID
5951
+
5952
+ """New Board name."""
5953
+ name: String!
5954
+
5955
+ """ImportSession id (must be in completed state)."""
5956
+ sessionId: ID!
5957
+
5958
+ """
5959
+ Base64 thumbnail. If omitted, board-service default empty thumbnail is used.
5960
+ """
5961
+ thumbnail: String
5962
+
5963
+ """Board type — 'main' | 'sub' | 'popup'. Default 'main'."""
5964
+ type: String
5965
+
5966
+ """
5967
+ ImportSession 의 결과 시안 중 하나의 id. 'as-is' / 'scene' / 'auto-fit'. 미지정 시 default variant (보통 'scene') 사용.
5968
+ """
5969
+ variantId: String
5970
+ }
5971
+
5339
5972
  """Entity for Menu"""
5340
5973
  type Menu {
5341
5974
  buttons: [MenuButton!]!
@@ -5714,6 +6347,9 @@ type Mutation {
5714
6347
  username: String!
5715
6348
  ): Boolean!
5716
6349
 
6350
+ """Add a user as owner of the current domain."""
6351
+ addDomainOwner(reason: String, username: String!): DomainOwner!
6352
+
5717
6353
  """To apply to all building inspection"""
5718
6354
  applyToAllBuildingInspection(buildingInspectionId: String!): Boolean!
5719
6355
 
@@ -5734,6 +6370,14 @@ type Mutation {
5734
6370
  """
5735
6371
  attachContact(contactId: String!, id: String!): Employee!
5736
6372
 
6373
+ """
6374
+ 썸네일이 없는 기존 첨부파일들에 대해 서버에서 썸네일을 일괄 생성한다. 한 호출당 limit 개까지만 처리하며, remaining > 0 이면 반복 호출 필요.
6375
+ """
6376
+ backfillAttachmentThumbnails(limit: Int = 20): ThumbnailBackfillResult!
6377
+
6378
+ """AI 주도 보드 모델링 — 자연어 채팅으로 보드 생성·구조편집·스타일링. sessionId 로 영속 컨텍스트."""
6379
+ boardAIChat(input: BoardAIChatInput!): BoardAIChatOutput!
6380
+
5737
6381
  """Bulk create or update KPI org-scope mappings."""
5738
6382
  bulkUpsertKpiOrgScopes(
5739
6383
  """Array of org-scope mapping data for bulk upsert."""
@@ -5763,7 +6407,15 @@ type Mutation {
5763
6407
  """
5764
6408
  Clones a board from an existing one, potentially into a different domain.
5765
6409
  """
5766
- cloneBoard(id: String!, patch: BoardPatch!, targetGroupId: String, targetSubdomain: String!): Board!
6410
+ cloneBoard(id: String!, patch: BoardPatch!, targetGroupId: String, targetSubdomain: String!): Board!
6411
+
6412
+ """Run only 건축물관리대장조회 scenario for project basic info collection."""
6413
+ collectProjectBasicInfo(address: String, projectId: String!): ExternalDataCollectionResult!
6414
+
6415
+ """
6416
+ Run external data collection scenarios per system, returning per-system result.
6417
+ """
6418
+ collectProjectExternalData(projectId: String!): [ExternalDataCollectionResult!]!
5767
6419
 
5768
6420
  """Establishes a live connection to a configured endpoint."""
5769
6421
  connectConnection(name: String!): Connection!
@@ -5822,6 +6474,16 @@ type Mutation {
5822
6474
  """Create Daily Worklog by projectId+date"""
5823
6475
  createBuildingInspectionDailyWorklog(patch: BuildingInspectionDailyWorklogNew!): BuildingInspectionDailyWorklog!
5824
6476
 
6477
+ """
6478
+ Always create a new AI chat session for a board (no idempotent reuse). For multi-session UX — 새 탭 열기.
6479
+ """
6480
+ createChatSession(
6481
+ boardId: String!
6482
+
6483
+ """Optional name (defaults to auto-generated `세션 N`)."""
6484
+ name: String
6485
+ ): ChatSession!
6486
+
5825
6487
  """To create new ChecklistItemComment"""
5826
6488
  createChecklistItemComment(checklistItemComment: NewChecklistItemComment!): ChecklistItemComment!
5827
6489
 
@@ -5898,6 +6560,12 @@ type Mutation {
5898
6560
  """To create new Favorite"""
5899
6561
  createFavorite(favorite: NewFavorite!): Favorite!
5900
6562
 
6563
+ """현장 문서 생성"""
6564
+ createFieldDocument(patch: NewFieldDocument!): FieldDocument!
6565
+
6566
+ """현장 문서 다건 생성"""
6567
+ createFieldDocuments(patches: [NewFieldDocument!]!): [FieldDocument!]!
6568
+
5901
6569
  """To create new Font"""
5902
6570
  createFont(font: NewFont!): Font!
5903
6571
 
@@ -6003,6 +6671,9 @@ type Mutation {
6003
6671
  """프로젝트 생성"""
6004
6672
  createProject(project: NewProject!): Project!
6005
6673
 
6674
+ """프로젝트 체크리스트 생성"""
6675
+ createProjectChecklist(constructionDetailTypeId: String!, constructionTypeId: String!, items: [ProjectChecklistItemInput!]!, name: String!, projectId: String!, siteSpecPdfUrl: String): ProjectChecklist!
6676
+
6006
6677
  """To create new ProjectReport"""
6007
6678
  createProjectReport(projectReport: NewProjectReport!): ProjectReport!
6008
6679
 
@@ -6169,6 +6840,12 @@ type Mutation {
6169
6840
  """Deletes multiple connections by their names."""
6170
6841
  deleteConnections(names: [String!]!): Boolean!
6171
6842
 
6843
+ """공종 체크리스트 템플릿 아이템 삭제"""
6844
+ deleteConstructionChecklistTemplateItems(ids: [String!]!): Boolean!
6845
+
6846
+ """공종 기반 체크리스트 템플릿 삭제"""
6847
+ deleteConstructionChecklistTemplates(ids: [String!]!): Boolean!
6848
+
6172
6849
  """To delete multiple ConstructionDetailTypes"""
6173
6850
  deleteConstructionDetailTypes(ids: [String!]!): Boolean!
6174
6851
 
@@ -6294,6 +6971,9 @@ type Mutation {
6294
6971
  """To delete Favorite"""
6295
6972
  deleteFavorite(routing: String!): Boolean!
6296
6973
 
6974
+ """현장 문서 삭제"""
6975
+ deleteFieldDocuments(ids: [String!]!): Boolean!
6976
+
6297
6977
  """To delete Font"""
6298
6978
  deleteFont(id: String!): Boolean!
6299
6979
 
@@ -6456,6 +7136,9 @@ type Mutation {
6456
7136
  """To delete Project"""
6457
7137
  deleteProject(id: String!): Boolean!
6458
7138
 
7139
+ """프로젝트 체크리스트 삭제"""
7140
+ deleteProjectChecklists(ids: [String!]!): Boolean!
7141
+
6459
7142
  """To delete ProjectReport"""
6460
7143
  deleteProjectReport(id: String!): Boolean!
6461
7144
 
@@ -6553,6 +7236,9 @@ type Mutation {
6553
7236
  """To delete multiple WorkerTypes"""
6554
7237
  deleteWorkerTypes(ids: [String!]!): Boolean!
6555
7238
 
7239
+ """프로젝트 테넌트 강등 (Domain soft-delete, Project.code 보존)"""
7240
+ demoteProjectTenant(projectId: String!): Boolean!
7241
+
6556
7242
  """
6557
7243
  Detaches an existing contact from an employee. The employee is identified by their ID.
6558
7244
  """
@@ -6629,6 +7315,9 @@ type Mutation {
6629
7315
  attributes: [AttributeSetPatch!]!
6630
7316
  ): Boolean!
6631
7317
 
7318
+ """도면 → 보드 변환을 비동기로 시작. 즉시 ImportSession 반환, 백그라운드에서 처리."""
7319
+ importBoardAsync(input: ImportBoardAsyncInput!): ImportSession!
7320
+
6632
7321
  """Imports multiple boards from JSON files."""
6633
7322
  importBoards(files: [Upload!]!, groupId: String!, overwrite: Boolean!): [Board!]!
6634
7323
 
@@ -6772,6 +7461,14 @@ type Mutation {
6772
7461
 
6773
7462
  """Removes one or more boards from a play group."""
6774
7463
  leavePlayGroup(boardIds: [String!]!, id: String!): PlayGroup!
7464
+
7465
+ """
7466
+ 완료된 ImportSession 의 결과 boardModel 을 새 Board entity 로 영속화한다. 검수 단계 (사용자/AI 가 import 결과를 확인 후 명시적으로 호출) 에서 사용. Board.state="draft" 로 생성되므로 release mutation 으로 별도 발행 필요.
7467
+ """
7468
+ materializeImportSession(input: MaterializeImportSessionInput!): Board!
7469
+
7470
+ """문서 폴더 이동"""
7471
+ moveFieldDocuments(ids: [String!]!, targetCode: String!): Boolean!
6775
7472
  multipleUpload(files: [Upload!]!): [Attachment!]!
6776
7473
 
6777
7474
  """
@@ -6779,12 +7476,23 @@ type Mutation {
6779
7476
  """
6780
7477
  pickActivityInstance(id: String!): ActivityThread
6781
7478
 
7479
+ """프로젝트를 테넌트로 승격 (관리번호 발번 + project 카테고리 Domain 생성)"""
7480
+ promoteProjectToTenant(projectId: String!): Project!
7481
+
6782
7482
  """기존 KPI Value 인스턴스를 현재 formula/metric 값으로 재계산"""
6783
7483
  recalculateKpiValue(id: String!): KpiValue!
6784
7484
 
7485
+ """Recalculate project KPI without finalizing (interim)."""
7486
+ recalculateProjectKpi(projectId: String!): Boolean!
7487
+
6785
7488
  """Recalculate scores for all KpiValues of a specific KPI"""
6786
7489
  recalculateScoresForKpi(kpiId: String!): Boolean!
6787
7490
 
7491
+ """
7492
+ Record a patch from user direct edit. Adds a system message so AI sees the change next turn.
7493
+ """
7494
+ recordDirectPatch(ops: JSON!, sessionId: String!, summary: String): PatchEntry!
7495
+
6788
7496
  """Record a metric value by metric name, value, meta, and org."""
6789
7497
  recordKpiMetricValue(
6790
7498
  """Extended or non-numeric information (JSON)."""
@@ -6836,8 +7544,17 @@ type Mutation {
6836
7544
 
6837
7545
  """Release a KPI and create a version history."""
6838
7546
  releaseKpi(id: String!): Kpi!
7547
+
7548
+ """Remove a user from the owners of the current domain."""
7549
+ removeDomainOwner(reason: String, username: String!): Boolean!
7550
+
7551
+ """Rename a ChatSession (tab label)."""
7552
+ renameChatSession(name: String!, sessionId: String!): Boolean!
6839
7553
  renewApplicationAccessToken(id: String!, scope: String!): AccessToken!
6840
7554
 
7555
+ """Reorders a board between two adjacent boards by ID."""
7556
+ reorderBoard(id: String!, nextId: String, prevId: String): Boolean!
7557
+
6841
7558
  """Sets the custom playback order for boards in a play group."""
6842
7559
  reorderPlayGroup(boardIds: [String!]!, id: String!): PlayGroup!
6843
7560
 
@@ -6858,6 +7575,9 @@ type Mutation {
6858
7575
  """Revert a KPI to a specific historical version."""
6859
7576
  revertKpiVersion(id: String!, version: Float!): Kpi!
6860
7577
 
7578
+ """Mark a patch as reverted (does not undo, only flags)."""
7579
+ revertPatch(patchId: String!): Boolean!
7580
+
6861
7581
  """
6862
7582
  Runs a new scenario instance once and returns the result after it finishes.
6863
7583
  """
@@ -6877,6 +7597,11 @@ type Mutation {
6877
7597
  """To start ActivityThread"""
6878
7598
  startActivityThread(id: String!, output: Object, reason: String): ActivityThread
6879
7599
 
7600
+ """
7601
+ Start (or get existing) AI chat session for a board. Idempotent — returns first existing or creates one.
7602
+ """
7603
+ startBoardAISession(boardId: String!): ChatSession!
7604
+
6880
7605
  """
6881
7606
  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.
6882
7607
  """
@@ -6922,6 +7647,14 @@ type Mutation {
6922
7647
  synchronizePrivilegeMaster(privilege: NewPrivilege!): Boolean!
6923
7648
  terminateContract(partnerName: String!): Boolean!
6924
7649
 
7650
+ """즐겨찾기 토글"""
7651
+ toggleFieldDocumentFavorite(id: String!): FieldDocument!
7652
+
7653
+ """
7654
+ Presence heartbeat — bump current user's lastSeenAt in the session (online indicator).
7655
+ """
7656
+ touchPresence(sessionId: String!): Boolean!
7657
+
6925
7658
  """
6926
7659
  Transfers domain ownership to another user. Use this mutation to assign the owner role to a different user within the domain.
6927
7660
  """
@@ -7076,7 +7809,7 @@ type Mutation {
7076
7809
  updateKpiMetricValuesCumulative(patches: [KpiMetricValuePatch!]!): [KpiMetricValue!]!
7077
7810
 
7078
7811
  """To modify multiple sentiment KpiMetricValues' value"""
7079
- updateKpiMetricValuesSentiment(patches: [KpiMetricValuePatch!]!): [KpiMetricValue!]!
7812
+ updateKpiMetricValuesSentiment(attachment: NewAttachment!): Attachment
7080
7813
 
7081
7814
  """Update a scope dimension definition"""
7082
7815
  updateKpiScope(id: String!, patch: KpiScopePatch!): KpiScope!
@@ -7150,6 +7883,12 @@ type Mutation {
7150
7883
  """Updates multiple connections at once."""
7151
7884
  updateMultipleConnection(patches: [ConnectionPatch!]!): [Connection!]!
7152
7885
 
7886
+ """공종 기반 체크리스트 템플릿 생성/수정"""
7887
+ updateMultipleConstructionChecklistTemplate(patches: [ConstructionChecklistTemplatePatch!]!): [ConstructionChecklistTemplate!]!
7888
+
7889
+ """공종 체크리스트 템플릿 아이템 일괄 저장"""
7890
+ updateMultipleConstructionChecklistTemplateItems(constructionChecklistTemplateId: String!, patches: [ConstructionChecklistTemplateItemPatch!]!): [ConstructionChecklistTemplateItem!]!
7891
+
7153
7892
  """To modify multiple ConstructionDetailTypes' information"""
7154
7893
  updateMultipleConstructionDetailType(constructionTypeId: String!, patches: [ConstructionDetailTypePatch!]!): [ConstructionDetailType!]!
7155
7894
 
@@ -7345,6 +8084,9 @@ type Mutation {
7345
8084
  """프로젝트 업데이트 (중복 사용 금지)"""
7346
8085
  updateProject(project: ProjectPatch!): Project!
7347
8086
 
8087
+ """프로젝트 체크리스트 수정"""
8088
+ updateProjectChecklist(id: String!, items: [ProjectChecklistItemInput!]!, name: String!, siteSpecPdfUrl: String): ProjectChecklist!
8089
+
7348
8090
  """프로젝트 도면 업데이트"""
7349
8091
  updateProjectPlan(project: ProjectPatch!): Project!
7350
8092
 
@@ -7428,6 +8170,9 @@ type Mutation {
7428
8170
 
7429
8171
  """프로젝트 공정표 업로드"""
7430
8172
  uploadProjectScheduleTable(param: UploadProjectScheduleTable!): Boolean!
8173
+
8174
+ """공종+세부공종 조합으로 find-or-create"""
8175
+ upsertConstructionChecklistTemplate(constructionDetailTypeId: String!, constructionTypeId: String!): ConstructionChecklistTemplate!
7431
8176
  }
7432
8177
 
7433
8178
  input NewActionPlan {
@@ -7673,6 +8418,11 @@ input NewConnection {
7673
8418
  """The endpoint URL or address for the new connection."""
7674
8419
  endpoint: String
7675
8420
 
8421
+ """
8422
+ Inheritance mode for child domains. ISOLATE = per-child instance. SHARE = shared parent instance. null = use connector default.
8423
+ """
8424
+ inheritanceMode: ConnectionInheritanceMode
8425
+
7676
8426
  """The name for the new connection."""
7677
8427
  name: String!
7678
8428
 
@@ -7983,6 +8733,17 @@ input NewFavorite {
7983
8733
  routing: String!
7984
8734
  }
7985
8735
 
8736
+ input NewFieldDocument {
8737
+ """AI 브리핑 힌트용 분류 문자열 (대 · 중 · 소분류)"""
8738
+ category: String
8739
+ code: String!
8740
+ file: Upload
8741
+ name: String!
8742
+ projectId: String!
8743
+ sourceRefId: String
8744
+ sourceType: String
8745
+ }
8746
+
7986
8747
  input NewFont {
7987
8748
  active: Boolean
7988
8749
  files: [Upload!]
@@ -8047,6 +8808,9 @@ input NewKpi {
8047
8808
  """
8048
8809
  scoreFormula: String
8049
8810
 
8811
+ """value → score 변환 방식."""
8812
+ scoreType: KpiScoreType
8813
+
8050
8814
  """Current state of the KPI (DRAFT, RELEASED, ARCHIVED)."""
8051
8815
  state: KpiStatus
8052
8816
 
@@ -8056,6 +8820,9 @@ input NewKpi {
8056
8820
  """Timezone for the KPI schedule."""
8057
8821
  timezone: String
8058
8822
 
8823
+ """value 획득 방식."""
8824
+ valueType: KpiValueType
8825
+
8059
8826
  """
8060
8827
  Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, etc.
8061
8828
  """
@@ -8080,8 +8847,8 @@ input NewKpiMetric {
8080
8847
  """데이터 수집 방식"""
8081
8848
  collectType: KpiMetricCollectType
8082
8849
 
8083
- """ID of the source dataset for this metric."""
8084
- dataSetId: ID
8850
+ """Source dataset for this metric."""
8851
+ dataSet: ObjectRef
8085
8852
 
8086
8853
  """User-friendly name or description of the metric."""
8087
8854
  description: String
@@ -8089,12 +8856,18 @@ input NewKpiMetric {
8089
8856
  """Name of the field in the dataset this metric maps to."""
8090
8857
  fieldName: String
8091
8858
 
8859
+ """확장 메타(JSON). 입력 위젯 힌트(meta.input) 등. 스키마 변경 없이 확장."""
8860
+ meta: Object
8861
+
8092
8862
  """Metric code, unique within the domain, used in KPI formulas."""
8093
8863
  name: String!
8094
8864
 
8095
8865
  """Aggregation period type for this metric."""
8096
8866
  periodType: KpiPeriodType
8097
8867
 
8868
+ """목록 표시 순서(오름차순). 미지정(null)은 뒤로 정렬."""
8869
+ rank: Int
8870
+
8098
8871
  """
8099
8872
  Cron schedule string for periodic KPI value aggregation (e.g., "0 0 * * *" for daily).
8100
8873
  """
@@ -9230,6 +10003,26 @@ type PasswordRule {
9230
10003
  useTightPattern: Boolean
9231
10004
  }
9232
10005
 
10006
+ """One board edit operation history (cascade-deleted with ChatSession)."""
10007
+ type PatchEntry {
10008
+ """AI confidence 0..1 (null for user-direct)."""
10009
+ confidence: Float
10010
+ createdAt: DateTimeISO
10011
+ id: ID
10012
+
10013
+ """BoardEditOp[] (parsed JSON array)."""
10014
+ opsJson: JSON!
10015
+
10016
+ """Whether this patch was reverted."""
10017
+ reverted: Boolean!
10018
+
10019
+ """'ai' | 'user-direct' | 'import'"""
10020
+ source: String!
10021
+
10022
+ """Short human summary of this patch."""
10023
+ summary: String
10024
+ }
10025
+
9233
10026
  """Logs the request and response payloads for API interactions."""
9234
10027
  type PayloadLog {
9235
10028
  """The timestamp when the log entry was created."""
@@ -9494,7 +10287,9 @@ input ProfileInput {
9494
10287
  """프로젝트"""
9495
10288
  type Project {
9496
10289
  buildingComplex: BuildingComplex
9497
- completeReports: [Attachment!]!
10290
+ buildingUsage: String
10291
+ code: String
10292
+ completeReport: Attachment
9498
10293
  createdAt: DateTimeISO
9499
10294
  creator: User
9500
10295
  deletedAt: DateTimeISO
@@ -9506,6 +10301,7 @@ type Project {
9506
10301
  inputType: String
9507
10302
  inspPassRate: Float
9508
10303
  kpi: Float
10304
+ kpiValues: [KpiValuesObject!]!
9509
10305
  mainPhoto: Attachment
9510
10306
  name: String!
9511
10307
  postalCode: String
@@ -9514,16 +10310,68 @@ type Project {
9514
10310
  robotProgressRate: Float
9515
10311
  rootTasks: [Task!]
9516
10312
  scheduleTable: Attachment
10313
+ sectorType: String
10314
+ siteSpecPdfUrl: String
9517
10315
  startDate: String
9518
10316
  state: String!
9519
10317
  structuralSafetyRate: Float
9520
10318
  tasks: [Task!]
10319
+
10320
+ """활성 테넌트 Domain (extType=project). 미승격 또는 강등 상태이면 null"""
10321
+ tenantDomain: Domain
9521
10322
  totalProgress: Float
9522
10323
  updatedAt: DateTimeISO
9523
10324
  updater: User
9524
10325
  weeklyProgress: Float
9525
10326
  }
9526
10327
 
10328
+ type ProjectChecklist {
10329
+ constructionDetailTypeId: String!
10330
+ constructionTypeId: String!
10331
+ createdAt: DateTimeISO
10332
+ creator: User
10333
+ deletedAt: DateTimeISO
10334
+ domain: Domain
10335
+ id: ID!
10336
+ name: String!
10337
+ projectChecklistItems: [ProjectChecklistItem!]
10338
+ projectId: String!
10339
+ updatedAt: DateTimeISO
10340
+ updater: User
10341
+ }
10342
+
10343
+ type ProjectChecklistItem {
10344
+ createdAt: DateTimeISO
10345
+ creator: User
10346
+ id: ID!
10347
+ inspctionCriteria: String
10348
+ kcsCriteria: String
10349
+ mainType: String
10350
+ name: String!
10351
+ projectChecklist: ProjectChecklist
10352
+ sequence: Int
10353
+ siteSpecCriteria: String
10354
+ updatedAt: DateTimeISO
10355
+ updater: User
10356
+ }
10357
+
10358
+ input ProjectChecklistItemInput {
10359
+ inspctionCriteria: String
10360
+ mainType: String
10361
+ name: String!
10362
+ sequence: Int
10363
+ }
10364
+
10365
+ type ProjectChecklistItemList {
10366
+ items: [ProjectChecklistItem!]!
10367
+ total: Int!
10368
+ }
10369
+
10370
+ type ProjectChecklistList {
10371
+ items: [ProjectChecklist!]!
10372
+ total: Int!
10373
+ }
10374
+
9527
10375
  type ProjectList {
9528
10376
  """프로젝트 리스트 항목들"""
9529
10377
  items: [Project!]!
@@ -9545,12 +10393,18 @@ input ProjectPatch {
9545
10393
  """연관된 건물 복합체 정보 (선택 사항)"""
9546
10394
  buildingComplex: BuildingComplexPatch
9547
10395
 
10396
+ """건물 용도 (RESIDENTIAL: 주거, NON_RESIDENTIAL: 비주거)"""
10397
+ buildingUsage: String
10398
+
9548
10399
  """프로젝트 문서 네이밍"""
9549
10400
  documentNaming: String
9550
10401
 
9551
10402
  """프로젝트 준공일정"""
9552
10403
  endDate: String
9553
10404
 
10405
+ """지역 구분 코드 (시군구 식별, 통계 그룹핑용)"""
10406
+ geoGroup: String
10407
+
9554
10408
  """수정할 프로젝트의 ID"""
9555
10409
  id: String!
9556
10410
 
@@ -9564,7 +10418,10 @@ input ProjectPatch {
9564
10418
  mainPhotoUpload: Upload
9565
10419
 
9566
10420
  """프로젝트 이름"""
9567
- name: String!
10421
+ name: String
10422
+
10423
+ """우편 코드 (5자리)"""
10424
+ postalCode: String
9568
10425
 
9569
10426
  """로봇 작업 대수"""
9570
10427
  robotCount: Int
@@ -9572,9 +10429,18 @@ input ProjectPatch {
9572
10429
  """로봇 작업 진행율 (%)"""
9573
10430
  robotProgressRate: Float
9574
10431
 
10432
+ """발주 유형 (PUBLIC: 공공, PRIVATE: 민간)"""
10433
+ sectorType: String
10434
+
10435
+ """현장 시방서 PDF URL (https 전체 URL)"""
10436
+ siteSpecPdfUrl: String
10437
+
9575
10438
  """프로젝트 착공일정"""
9576
10439
  startDate: String
9577
10440
 
10441
+ """프로젝트 상태 (ONGOING/COMPLETED)"""
10442
+ state: ProjectState
10443
+
9578
10444
  """구조 안전도 (%)"""
9579
10445
  structuralSafetyRate: Float
9580
10446
 
@@ -9626,6 +10492,12 @@ enum ProjectReportStatus {
9626
10492
  STATUS_B
9627
10493
  }
9628
10494
 
10495
+ """프로젝트 상태 (ONGOING=10 진행중, COMPLETED=20 완료)"""
10496
+ enum ProjectState {
10497
+ COMPLETED
10498
+ ONGOING
10499
+ }
10500
+
9629
10501
  """
9630
10502
  Describes a single property for a component or a step, used for UI rendering and configuration.
9631
10503
  """
@@ -9659,8 +10531,6 @@ type PropertySpec {
9659
10531
  }
9660
10532
 
9661
10533
  type Query {
9662
- APIDocCompletion(input: APIDocCompletionInput!): APIDocCompletionOutput!
9663
-
9664
10534
  """To fetch a ActionPlan"""
9665
10535
  actionPlan(id: String!): ActionPlan
9666
10536
 
@@ -10009,8 +10879,14 @@ type Query {
10009
10879
  sortings: [Sorting!]
10010
10880
  ): AuthProviderList!
10011
10881
 
10012
- """Finds a single board by its ID."""
10013
- board(id: String!): Board!
10882
+ """
10883
+ Finds a single board by its ID. If cachedUpdatedAt matches, model is omitted.
10884
+ """
10885
+ board(
10886
+ """Client cache timestamp — if matches, model field is omitted"""
10887
+ cachedUpdatedAt: String
10888
+ id: String!
10889
+ ): Board!
10014
10890
 
10015
10891
  """Finds a single board by its name."""
10016
10892
  boardByName(name: String!): Board
@@ -10087,6 +10963,11 @@ type Query {
10087
10963
  sortings: [Sorting!]
10088
10964
  ): BoardList!
10089
10965
 
10966
+ """
10967
+ Retrieves boards that have been updated or soft-deleted since the given timestamp.
10968
+ """
10969
+ boardsUpdatedSince(since: DateTimeISO!): [Board!]!
10970
+
10090
10971
  """To fetch a building"""
10091
10972
  building(id: String!): Building
10092
10973
 
@@ -10097,9 +10978,15 @@ type Query {
10097
10978
  buildingInspection(id: String!): BuildingInspection
10098
10979
  buildingInspectionDailyWorklogByProjectIdAndDate(date: String!, projectId: String!): BuildingInspectionDailyWorklog
10099
10980
 
10981
+ """To fetch BuildingInspection Date Summary of Building"""
10982
+ buildingInspectionDateSummaryOfBuilding(buildingId: String!, endDate: String!, startDate: String!): [BuildingInspectionSummary!]
10983
+
10100
10984
  """To fetch a BuildingInspection Summary"""
10101
10985
  buildingInspectionDateSummaryOfLevelAndPeriod(buildingLevelId: String!, endDate: String!, startDate: String!): [BuildingInspectionSummary!]
10102
10986
 
10987
+ """To fetch BuildingInspection Date Summary of Project"""
10988
+ buildingInspectionDateSummaryOfProject(endDate: String!, projectId: String!, startDate: String!): [BuildingInspectionSummary!]
10989
+
10103
10990
  """To fetch multiple BuildingInspections"""
10104
10991
  buildingInspectionHistories(
10105
10992
  """An array of filter conditions to apply to the list query."""
@@ -10118,6 +11005,9 @@ type Query {
10118
11005
  """To fetch a BuildingInspectionHistory"""
10119
11006
  buildingInspectionHistory(id: String!): BuildingInspectionHistory
10120
11007
 
11008
+ """To fetch BuildingInspection Summary of Building"""
11009
+ buildingInspectionSummaryOfBuilding(buildingId: String!): BuildingInspectionSummary
11010
+
10121
11011
  """To fetch a BuildingInspection Summary"""
10122
11012
  buildingInspectionSummaryOfBuildingLevel(buildingLevelId: String!): BuildingInspectionSummary
10123
11013
 
@@ -10139,6 +11029,9 @@ type Query {
10139
11029
  sortings: [Sorting!]
10140
11030
  ): BuildingInspectionList!
10141
11031
 
11032
+ """To fetch BuildingInspections of Building"""
11033
+ buildingInspectionsOfBuilding(params: BuildingInspectionsOfBuilding!): BuildingInspectionList!
11034
+
10142
11035
  """To fetch multiple BuildingInspections"""
10143
11036
  buildingInspectionsOfBuildingLevel(params: BuildingInspectionsOfBuildingLevel!): BuildingInspectionList!
10144
11037
 
@@ -10147,7 +11040,28 @@ type Query {
10147
11040
 
10148
11041
  """To fetch a building level"""
10149
11042
  buildingLevel(id: String!): BuildingLevel
10150
- chatCompletion(input: ChatCompletionInput!): ChatCompletionOutput!
11043
+
11044
+ """List chat messages of a session, oldest first."""
11045
+ chatMessages(limit: Int = 100, offset: Int = 0, sessionId: String!): [ChatMessage!]!
11046
+
11047
+ """List patch entries of a session, newest first."""
11048
+ chatPatches(limit: Int = 100, sessionId: String!): [PatchEntry!]!
11049
+
11050
+ """Get AI chat session by id."""
11051
+ chatSession(id: String!): ChatSession
11052
+
11053
+ """
11054
+ Get AI chat session by board id (returns first match — backward compat single-session lookup).
11055
+ """
11056
+ chatSessionByBoard(boardId: String!): ChatSession
11057
+
11058
+ """List participants of a ChatSession (members / owner)."""
11059
+ chatSessionParticipants(sessionId: String!): [ChatSessionParticipant!]!
11060
+
11061
+ """
11062
+ List all AI chat sessions for a board (oldest first). Multi-session support — UI 탭으로 표시.
11063
+ """
11064
+ chatSessionsByBoard(boardId: String!): [ChatSession!]!
10151
11065
 
10152
11066
  """
10153
11067
  Checks if the system is configured to provide a default password for new users.
@@ -10376,6 +11290,36 @@ type Query {
10376
11290
  """Fetches a list of all available connector types."""
10377
11291
  connectors: ConnectorList!
10378
11292
 
11293
+ """공종 체크리스트 템플릿 아이템 목록"""
11294
+ constructionChecklistTemplateItems(
11295
+ """An array of filter conditions to apply to the list query."""
11296
+ filters: [Filter!]
11297
+
11298
+ """Inherited value type for the list query."""
11299
+ inherited: InheritedValueType
11300
+
11301
+ """Pagination options for the list query."""
11302
+ pagination: Pagination
11303
+
11304
+ """Sorting options for the list query."""
11305
+ sortings: [Sorting!]
11306
+ ): ConstructionChecklistTemplateItemList!
11307
+
11308
+ """공종 기반 체크리스트 템플릿 목록"""
11309
+ constructionChecklistTemplates(
11310
+ """An array of filter conditions to apply to the list query."""
11311
+ filters: [Filter!]
11312
+
11313
+ """Inherited value type for the list query."""
11314
+ inherited: InheritedValueType
11315
+
11316
+ """Pagination options for the list query."""
11317
+ pagination: Pagination
11318
+
11319
+ """Sorting options for the list query."""
11320
+ sortings: [Sorting!]
11321
+ ): ConstructionChecklistTemplateList!
11322
+
10379
11323
  """To fetch multiple ConstructionDetailTypes"""
10380
11324
  constructionDetailTypes(
10381
11325
  """An array of filter conditions to apply to the list query."""
@@ -10426,6 +11370,12 @@ type Query {
10426
11370
  """Sorting options for the list query."""
10427
11371
  sortings: [Sorting!]
10428
11372
  ): ContactList!
11373
+
11374
+ """현재 테넌트 컨텍스트(extType=project)의 프로젝트. subdomain(=Project.code) 으로 조회."""
11375
+ currentProject: Project
11376
+
11377
+ """프로젝트 타입 조회"""
11378
+ currentProjectType: String!
10429
11379
  customers: [Domain!]!
10430
11380
  dailyWorklogDatesOfProject(endDate: String!, projectId: String!, startDate: String!): [BuildingInspectionDailyWorklog!]!
10431
11381
 
@@ -10784,8 +11734,6 @@ type Query {
10784
11734
  """Sorting options for the list query."""
10785
11735
  sortings: [Sorting!]
10786
11736
  ): [DynamicDataSummary!]!
10787
- decipherCode(input: CodeDecipherInput!): CodeDecipherOutput!
10788
- decipherErrorCode(input: CodeDecipherInput!): CodeDecipherOutput!
10789
11737
 
10790
11738
  """To fetch a Department"""
10791
11739
  department(id: String!): Department
@@ -10843,11 +11791,24 @@ type Query {
10843
11791
  sortings: [Sorting!]
10844
11792
  ): DomainLinkList!
10845
11793
 
11794
+ """List owners of the current domain."""
11795
+ domainOwners: [DomainOwner!]!
11796
+
10846
11797
  """
10847
11798
  Fetches the list of available domain types from configuration. Only superusers are granted this privilege.
10848
11799
  """
10849
11800
  domainTypes: [String!]!
10850
11801
 
11802
+ """
11803
+ List users in the current domain for `@` mention popup. board-ai 권한이면 누구나 멘션용 검색 가능 (관리자 전용 users() 와 별도).
11804
+ """
11805
+ domainUsersForMention(
11806
+ limit: Int = 50
11807
+
11808
+ """Substring to match against name/email (case-insensitive). Empty → all."""
11809
+ query: String
11810
+ ): [User!]!
11811
+
10851
11812
  """
10852
11813
  Fetches all domain entities with pagination and filtering options. Only superusers are granted this privilege.
10853
11814
  """
@@ -10974,6 +11935,11 @@ type Query {
10974
11935
  """To fetch a EntityMetadata"""
10975
11936
  entityMetadata(name: String!): EntityMetadata!
10976
11937
  envVar(id: String!): EnvVar
11938
+
11939
+ """
11940
+ Resolves a batch of EnvVar keys with ancestor closest-wins inheritance.
11941
+ """
11942
+ envVarResolutions(keys: [String!]!): [EnvVarResolution!]!
10977
11943
  envVars(
10978
11944
  """An array of filter conditions to apply to the list query."""
10979
11945
  filters: [Filter!]
@@ -11024,6 +11990,15 @@ type Query {
11024
11990
  """Fetches the current state of a single connection by its name."""
11025
11991
  fetchConnectionState(name: String!): ConnectionState!
11026
11992
 
11993
+ """단건 문서 상세 조회"""
11994
+ fieldDocument(id: String!): FieldDocument
11995
+
11996
+ """프로젝트별 분류 코드당 문서 수"""
11997
+ fieldDocumentCountsByProject(projectId: String!): [FieldDocumentCodeCount!]!
11998
+
11999
+ """소분류 코드별 문서 목록 조회"""
12000
+ fieldDocumentsByCode(code: String!, projectId: String!): FieldDocumentList!
12001
+
11027
12002
  """To fetch a Font"""
11028
12003
  font(id: String!): Font!
11029
12004
 
@@ -11067,8 +12042,12 @@ type Query {
11067
12042
 
11068
12043
  """To query whether I have the given permission"""
11069
12044
  hasPrivilege(category: String!, privilege: String!): Boolean!
11070
- i18nCompletion(input: i18nCompletionInput!): i18nCompletionOutput!
11071
- imageCompletion(input: ImageCompletionInput!): ImageCompletionOutput!
12045
+
12046
+ """Get import session progress."""
12047
+ importSession(id: String!): ImportSession
12048
+
12049
+ """List recent import sessions for a chat session."""
12050
+ importSessionsByChatSession(chatSessionId: String!): [ImportSession!]!
11072
12051
 
11073
12052
  """BuildingInspection By ChecklistItemId"""
11074
12053
  inspectionByChecklistItemId: BuildingInspection!
@@ -11132,6 +12111,9 @@ type Query {
11132
12111
  invitation(email: EmailAddress!, reference: String!, type: String!): Invitation!
11133
12112
  invitations(reference: String!, type: String!): InvitationList!
11134
12113
 
12114
+ """Check if a user is an owner of the current domain."""
12115
+ isDomainOwner(username: String!): Boolean!
12116
+
11135
12117
  """To fetch a Issue"""
11136
12118
  issue(id: String!): Issue
11137
12119
 
@@ -11177,7 +12159,7 @@ type Query {
11177
12159
  id: String!
11178
12160
  ): KpiMetricValue
11179
12161
 
11180
- """To fetch multiple KpiMetricValues"""
12162
+ """To fetch multiple KpiMetricValues (cross-domain admin view)"""
11181
12163
  kpiMetricValues(
11182
12164
  """An array of filter conditions to apply to the list query."""
11183
12165
  filters: [Filter!]
@@ -11249,6 +12231,11 @@ type Query {
11249
12231
  searchTerm: String
11250
12232
  ): [String!]!
11251
12233
 
12234
+ """
12235
+ Get KPI stats aggregated from project data with optional sectorType/buildingUsage filters
12236
+ """
12237
+ kpiProjectStats(buildingUsage: String, endYearMonth: String, kpiNamePattern: String, sectorType: String, startYearMonth: String): [KpiProjectStat!]!
12238
+
11252
12239
  """Fetch a scope dimension definition by ID"""
11253
12240
  kpiScope(id: String!): KpiScope
11254
12241
 
@@ -11309,6 +12296,29 @@ type Query {
11309
12296
  sortings: [Sorting!]
11310
12297
  ): KpiValueList!
11311
12298
 
12299
+ """Get KPI box plot statistics for Y-category KPIs by geo group"""
12300
+ kpiYValueComprehensiveStatsByGeoGroup(geoGroup: String): [KpiComprehensiveStatsByGeoGroup!]!
12301
+
12302
+ """Get Y-level KPI statistics by geo_group code (sigungu)"""
12303
+ kpiYValueStatsByGeoGroup(buildingUsage: String, endYearMonth: String, geoGroup: String!, sectorType: String, startYearMonth: String): [KpiComprehensiveStats!]!
12304
+
12305
+ """Get KPI statistics for Y-category KPIs by specific metro area"""
12306
+ kpiYValueStatsByMetroArea(buildingUsage: String, endYearMonth: String, metroArea: String!, sectorType: String, startYearMonth: String): [KpiComprehensiveStats!]!
12307
+
12308
+ """Get KPI box plot statistics for Z-category KPIs by metro area"""
12309
+ kpiZValueComprehensiveStatsByGeoGroup(buildingUsage: String, endYearMonth: String, geoGroup: String, kpiName: String, sectorType: String, startYearMonth: String): [KpiComprehensiveStatsByGeoGroup!]!
12310
+
12311
+ """Get monthly KPI trend for Z-category KPIs by metro area"""
12312
+ kpiZValueMonthlyTrendByGeoGroup(buildingUsage: String, endYearMonth: String, kpiName: String, sectorType: String, startYearMonth: String): [KpiMonthlyTrend!]!
12313
+
12314
+ """
12315
+ Get monthly KPI trend for Z-category KPIs for a specific sigungu (geo_group code)
12316
+ """
12317
+ kpiZValueMonthlyTrendBySigungu(buildingUsage: String, endYearMonth: String, geoGroup: String!, kpiName: String, sectorType: String, startYearMonth: String): [KpiMonthlyTrend!]!
12318
+
12319
+ """Get KPI statistics by sigungu (geo_group code) level"""
12320
+ kpiZValueStatsBySigungu(buildingUsage: String, endYearMonth: String, kpiName: String, sectorType: String, startYearMonth: String): [KpiComprehensiveStatsByGeoGroup!]!
12321
+
11312
12322
  """To fetch multiple Kpis"""
11313
12323
  kpis(
11314
12324
  """An array of filter conditions to apply to the list query."""
@@ -11337,6 +12347,23 @@ type Query {
11337
12347
  rootId: String
11338
12348
  ): [Kpi!]!
11339
12349
 
12350
+ """
12351
+ Fetch latest-version KpiValues only — one row per (domain, kpi, valueDate, kpiOrgScope).
12352
+ """
12353
+ latestKpiValues(
12354
+ """An array of filter conditions to apply to the list query."""
12355
+ filters: [Filter!]
12356
+
12357
+ """Inherited value type for the list query."""
12358
+ inherited: InheritedValueType
12359
+
12360
+ """Pagination options for the list query."""
12361
+ pagination: Pagination
12362
+
12363
+ """Sorting options for the list query."""
12364
+ sortings: [Sorting!]
12365
+ ): KpiValueList!
12366
+
11340
12367
  """To fetch a LiteMenu"""
11341
12368
  liteMenu(id: String!): LiteMenu!
11342
12369
 
@@ -11785,6 +12812,36 @@ type Query {
11785
12812
  """To fetch Project"""
11786
12813
  projectByBuildingLevelId(buildingLevelId: String!): Project!
11787
12814
 
12815
+ """프로젝트 체크리스트 아이템 목록"""
12816
+ projectChecklistItems(
12817
+ """An array of filter conditions to apply to the list query."""
12818
+ filters: [Filter!]
12819
+
12820
+ """Inherited value type for the list query."""
12821
+ inherited: InheritedValueType
12822
+
12823
+ """Pagination options for the list query."""
12824
+ pagination: Pagination
12825
+
12826
+ """Sorting options for the list query."""
12827
+ sortings: [Sorting!]
12828
+ ): ProjectChecklistItemList!
12829
+
12830
+ """프로젝트 체크리스트 목록"""
12831
+ projectChecklists(
12832
+ """An array of filter conditions to apply to the list query."""
12833
+ filters: [Filter!]
12834
+
12835
+ """Inherited value type for the list query."""
12836
+ inherited: InheritedValueType
12837
+
12838
+ """Pagination options for the list query."""
12839
+ pagination: Pagination
12840
+
12841
+ """Sorting options for the list query."""
12842
+ sortings: [Sorting!]
12843
+ ): ProjectChecklistList!
12844
+
11788
12845
  """To fetch a ProjectReport"""
11789
12846
  projectReport(id: String!): ProjectReport
11790
12847
 
@@ -11803,6 +12860,11 @@ type Query {
11803
12860
  sortings: [Sorting!]
11804
12861
  ): ProjectReportList!
11805
12862
 
12863
+ """
12864
+ To fetch KpiValues by project group with X prefix kpi names (latest valueDate only)
12865
+ """
12866
+ projectXKpiValues(projectId: String!): [KpiValue!]!
12867
+
11806
12868
  """프로젝트 리스트"""
11807
12869
  projects(
11808
12870
  """An array of filter conditions to apply to the list query."""
@@ -11992,6 +13054,14 @@ type Query {
11992
13054
  sortings: [Sorting!]
11993
13055
  ): StepList!
11994
13056
 
13057
+ """
13058
+ 도메인 안에서 충돌하지 않는 Board name + 상세 description 제안. name 은 짧고 심플 (30자 이내, 충돌 회피 (n) suffix), description 은 자세히 (사용자 prompt + AI importStrategy + 카테고리 분포 통계 합성).
13059
+ """
13060
+ suggestBoardMeta(input: SuggestBoardNameInput!): BoardMetaSuggestion!
13061
+
13062
+ """@deprecated suggestBoardMeta 사용 권장. 단순 string name 만 반환하는 구버전 query."""
13063
+ suggestBoardName(input: SuggestBoardNameInput!): String!
13064
+
11995
13065
  """To fetch the list of activities that I can report on"""
11996
13066
  supervisableActivities(
11997
13067
  """An array of filter conditions to apply to the list query."""
@@ -12126,6 +13196,12 @@ type Query {
12126
13196
  sortings: [Sorting!]
12127
13197
  ): ActivityThreadList!
12128
13198
 
13199
+ """Get KPI box plot statistics for Y-category KPIs for all projects"""
13200
+ totalKpiYValueComprehensiveStats(buildingUsage: String, endYearMonth: String, sectorType: String, startYearMonth: String): [KpiComprehensiveStats!]!
13201
+
13202
+ """Get KPI box plot statistics for Z-category KPIs for all projects"""
13203
+ totalKpiZValueComprehensiveStats(buildingUsage: String, endYearMonth: String, sectorType: String, startYearMonth: String): [KpiComprehensiveStats!]!
13204
+
12129
13205
  """Fetches a user by their email address within the current domain."""
12130
13206
  user(
12131
13207
  """The email address of the user to fetch."""
@@ -12906,6 +13982,16 @@ type Subscription {
12906
13982
  """Subscribes to real-time updates for a specific board."""
12907
13983
  board(id: String!): Board!
12908
13984
 
13985
+ """
13986
+ Subscribes to board edit patches (AI or user-direct) for real-time collaboration on a board.
13987
+ """
13988
+ boardPatchActivity(boardId: String!): PatchEntry!
13989
+
13990
+ """
13991
+ Subscribes to chat messages (user / assistant / system) of a session for real-time group chat.
13992
+ """
13993
+ chatMessageActivity(sessionId: String!): ChatMessage!
13994
+
12909
13995
  """Subscribes to log messages from connections."""
12910
13996
  connectionLog(level: String): Log!
12911
13997
 
@@ -12932,6 +14018,16 @@ type Subscription {
12932
14018
  scenarioQueueState: ScenarioQueueState!
12933
14019
  }
12934
14020
 
14021
+ input SuggestBoardNameInput {
14022
+ """명시 hint. session 정보보다 우선. 사용자가 직접 적은 메모를 기반으로 추천받고 싶을 때."""
14023
+ hint: String
14024
+
14025
+ """
14026
+ ImportSession id — 있으면 거기서 userPrompt / VLM reasoning / attachment.name 추출.
14027
+ """
14028
+ sessionId: ID
14029
+ }
14030
+
12935
14031
  """Entity for Supervisor"""
12936
14032
  type Supervisor {
12937
14033
  active: Boolean
@@ -13233,6 +14329,21 @@ input ThemePatch {
13233
14329
  value: Object
13234
14330
  }
13235
14331
 
14332
+ """썸네일 백필 결과"""
14333
+ type ThumbnailBackfillResult {
14334
+ """이번 호출에서 처리 시도한 첨부 개수"""
14335
+ attempted: Int!
14336
+
14337
+ """실패(생성 실패/콘텐츠 없음 등) 개수"""
14338
+ failed: Int!
14339
+
14340
+ """이번 처리 후에도 남아있는 썸네일 미생성 후보 개수 (대략치). 0 이면 완료"""
14341
+ remaining: Int!
14342
+
14343
+ """썸네일 생성·저장 성공 개수"""
14344
+ succeeded: Int!
14345
+ }
14346
+
13236
14347
  input UpdateBuildingInspection {
13237
14348
  drawingMarker: String
13238
14349
  id: String!
@@ -13244,6 +14355,7 @@ input UpdateBuildingInspectionSubmitType {
13244
14355
  checklistItem: [ChecklistItemSubmitInputType!]!
13245
14356
  id: String!
13246
14357
  memo: String
14358
+ requestDate: String
13247
14359
  }
13248
14360
 
13249
14361
  input UpdateTaskChecklistSubmitType {
@@ -13500,12 +14612,4 @@ input WorkerTypePatch {
13500
14612
  description: String
13501
14613
  id: ID
13502
14614
  name: String
13503
- }
13504
-
13505
- input i18nCompletionInput {
13506
- json: String!
13507
- }
13508
-
13509
- type i18nCompletionOutput {
13510
- message: String
13511
14615
  }