@fmsim/fmsim 2.0.0-beta.10 → 2.0.0-beta.100

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fmsim/fmsim",
3
- "version": "2.0.0-beta.10",
3
+ "version": "2.0.0-beta.100",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "scripts": {
19
19
  "serve": "things-factory fmsim",
20
- "serve:dev": "npm run build:server && things-factory-dev fmsim --webpack @fmsim/builder/webpack.config.dev.js",
20
+ "serve:dev": "npm run build:server && concurrently -k -n api,board,machine,lv,webpack \"tsc -w --preserveWatchOutput -p ../api/tsconfig.json\" \"tsc -w --preserveWatchOutput -p ../board/tsconfig.json\" \"tsc -w --preserveWatchOutput -p ../machine/tsconfig.json\" \"tsc -w --preserveWatchOutput -p ../layout-view/client/tsconfig.json\" \"things-factory-dev fmsim --webpack @fmsim/builder/webpack.config.dev.js\"",
21
21
  "build": "npm run build:server && npm run build:client",
22
22
  "build:client": "npm run clean:client && npm run copy:files && (tsc --p ./client/tsconfig.json; exit 0)",
23
23
  "build:server": "npm run clean:server && (tsc --p ./server/tsconfig.json; exit 0)",
@@ -40,8 +40,8 @@
40
40
  "docker:push": "docker image push hatiolab/fmsim:latest && docker image push hatiolab/fmsim:$npm_package_version"
41
41
  },
42
42
  "dependencies": {
43
- "@fmsim/layout-view": "^2.0.0-beta.10",
44
- "@fmsim/machine": "^2.0.0-beta.10",
43
+ "@fmsim/layout-view": "^2.0.0-beta.99",
44
+ "@fmsim/machine": "^2.0.0-beta.100",
45
45
  "@operato/attachment": "^10.0.0-beta.1",
46
46
  "@operato/font": "^10.0.0-beta.1",
47
47
  "@operato/i18n": "^10.0.0-beta.1",
@@ -51,32 +51,32 @@
51
51
  "@operato/shell": "^10.0.0-beta.1",
52
52
  "@operato/styles": "^10.0.0-beta.1",
53
53
  "@operato/utils": "^10.0.0-beta.1",
54
- "@things-factory/apptool-ui": "^10.0.0-beta.1",
55
- "@things-factory/auth-base": "^10.0.0-beta.1",
56
- "@things-factory/auth-ui": "^10.0.0-beta.1",
57
- "@things-factory/board-service": "^10.0.0-beta.1",
58
- "@things-factory/context-ui": "^10.0.0-beta.1",
59
- "@things-factory/evaluation": "^10.0.0-beta.1",
60
- "@things-factory/fav-base": "^10.0.0-beta.1",
61
- "@things-factory/font-base": "^10.0.0-beta.1",
62
- "@things-factory/form-ui": "^10.0.0-beta.1",
63
- "@things-factory/i18n-base": "^10.0.0-beta.1",
64
- "@things-factory/integration-base": "^10.0.0-beta.1",
65
- "@things-factory/integration-ui": "^10.0.0-beta.1",
66
- "@things-factory/more-ui": "^10.0.0-beta.1",
67
- "@things-factory/notification": "^10.0.0-beta.1",
68
- "@things-factory/resource-ui": "^10.0.0-beta.1",
69
- "@things-factory/shell": "^10.0.0-beta.1",
70
- "@things-factory/system": "^10.0.0-beta.1",
54
+ "@things-factory/apptool-ui": "^10.0.0-zeta.1",
55
+ "@things-factory/auth-base": "^10.0.0-zeta.1",
56
+ "@things-factory/auth-ui": "^10.0.0-zeta.1",
57
+ "@things-factory/board-service": "^10.0.0-zeta.1",
58
+ "@things-factory/context-ui": "^10.0.0-zeta.1",
59
+ "@things-factory/evaluation": "^10.0.0-zeta.1",
60
+ "@things-factory/fav-base": "^10.0.0-zeta.1",
61
+ "@things-factory/font-base": "^10.0.0-zeta.1",
62
+ "@things-factory/form-ui": "^10.0.0-zeta.1",
63
+ "@things-factory/i18n-base": "^10.0.0-zeta.1",
64
+ "@things-factory/integration-base": "^10.0.0-zeta.1",
65
+ "@things-factory/integration-ui": "^10.0.0-zeta.1",
66
+ "@things-factory/more-ui": "^10.0.0-zeta.1",
67
+ "@things-factory/notification": "^10.0.0-zeta.1",
68
+ "@things-factory/resource-ui": "^10.0.0-zeta.1",
69
+ "@things-factory/shell": "^10.0.0-zeta.1",
70
+ "@things-factory/system": "^10.0.0-zeta.1",
71
71
  "pretendard": "^1.3.9"
72
72
  },
73
73
  "devDependencies": {
74
- "@fmsim/builder": "^2.0.0-beta.7",
74
+ "@fmsim/builder": "^2.0.0-beta.99",
75
75
  "copyfiles": "^2.4.1",
76
76
  "typescript": "^5.8.2"
77
77
  },
78
78
  "resolutions": {
79
79
  "lit": "^3.0.0"
80
80
  },
81
- "gitHead": "b7e9ac371e788cfb8787fa1180c6e0670e8ba531"
81
+ "gitHead": "332f5d01766a2621d1dc9ca745aa764acfd9c960"
82
82
  }
package/schema.graphql CHANGED
@@ -347,6 +347,7 @@ type Attachment {
347
347
  refType: String
348
348
  size: String!
349
349
  tags: Object
350
+ thumbnail: String
350
351
  updatedAt: DateTimeISO!
351
352
  updater: User
352
353
  }
@@ -655,12 +656,27 @@ type Board {
655
656
  """A list of play groups that this board is a part of."""
656
657
  playGroups: [PlayGroup!]
657
658
 
659
+ """
660
+ Sort order for display. Lower values appear first. Supports fractional values for insertion.
661
+ """
662
+ sortOrder: Float
663
+
664
+ """
665
+ Source ImportSession id (board-import) when this board was generated from a drawing/image import.
666
+ """
667
+ sourceImportSessionId: String
668
+
658
669
  """The state of the board, can be 'draft' or 'released'."""
659
670
  state: String
660
671
 
661
672
  """A base64 encoded thumbnail image of the board."""
662
673
  thumbnail: String
663
674
 
675
+ """
676
+ Timestamp of the last thumbnail generation. Separate lifecycle from updatedAt; only changes when the thumbnail image itself is regenerated.
677
+ """
678
+ thumbnailUpdatedAt: DateTimeISO
679
+
664
680
  """The type of the board, can be 'main', 'sub', or 'popup'."""
665
681
  type: String
666
682
 
@@ -706,12 +722,27 @@ type BoardFavorite {
706
722
  """A list of play groups that this board is a part of."""
707
723
  playGroups: [PlayGroup!]
708
724
 
725
+ """
726
+ Sort order for display. Lower values appear first. Supports fractional values for insertion.
727
+ """
728
+ sortOrder: Float
729
+
730
+ """
731
+ Source ImportSession id (board-import) when this board was generated from a drawing/image import.
732
+ """
733
+ sourceImportSessionId: String
734
+
709
735
  """The state of the board, can be 'draft' or 'released'."""
710
736
  state: String
711
737
 
712
738
  """A base64 encoded thumbnail image of the board."""
713
739
  thumbnail: String
714
740
 
741
+ """
742
+ Timestamp of the last thumbnail generation. Separate lifecycle from updatedAt; only changes when the thumbnail image itself is regenerated.
743
+ """
744
+ thumbnailUpdatedAt: DateTimeISO
745
+
715
746
  """The type of the board, can be 'main', 'sub', or 'popup'."""
716
747
  type: String
717
748
 
@@ -895,6 +926,17 @@ input BoardTemplatePatch {
895
926
  visibility: String
896
927
  }
897
928
 
929
+ type CarrierLocation {
930
+ machineName: String!
931
+ time: String!
932
+ unitName: String!
933
+ }
934
+
935
+ type CarrierLocationHistoryResponse {
936
+ carrierLocHistory: [CarrierLocation!]!
937
+ errorMessage: String
938
+ }
939
+
898
940
  """Entity for CommonCode"""
899
941
  type CommonCode {
900
942
  createdAt: DateTimeISO
@@ -977,6 +1019,11 @@ type Connection {
977
1019
  """Unique identifier for the connection."""
978
1020
  id: ID!
979
1021
 
1022
+ """
1023
+ Inheritance mode for child domains. ISOLATE = per-child instance with isolated session. SHARE = shared parent instance. null = use Connector default (falls back to ISOLATE).
1024
+ """
1025
+ inheritanceMode: ConnectionInheritanceMode
1026
+
980
1027
  """The name of the connection."""
981
1028
  name: String!
982
1029
 
@@ -1001,6 +1048,14 @@ type Connection {
1001
1048
  updater: User
1002
1049
  }
1003
1050
 
1051
+ """
1052
+ Child domain inheritance mode — ISOLATE: per-child instance with isolated session/credentials. SHARE: single parent instance reused by all children.
1053
+ """
1054
+ enum ConnectionInheritanceMode {
1055
+ ISOLATE
1056
+ SHARE
1057
+ }
1058
+
1004
1059
  """A paginated list of connections."""
1005
1060
  type ConnectionList {
1006
1061
  """The list of connection items."""
@@ -1032,6 +1087,11 @@ input ConnectionPatch {
1032
1087
  """The unique identifier of the connection to update."""
1033
1088
  id: ID
1034
1089
 
1090
+ """
1091
+ Inheritance mode for child domains. ISOLATE = per-child instance. SHARE = shared parent instance. null = use connector default.
1092
+ """
1093
+ inheritanceMode: ConnectionInheritanceMode
1094
+
1035
1095
  """The new name for the connection."""
1036
1096
  name: String
1037
1097
 
@@ -1061,6 +1121,11 @@ type ConnectionState {
1061
1121
  """The unique identifier of the connection."""
1062
1122
  id: String
1063
1123
 
1124
+ """
1125
+ Inheritance mode for child domains. ISOLATE = per-child instance. SHARE = shared parent instance. null = use connector default (falls back to ISOLATE).
1126
+ """
1127
+ inheritanceMode: ConnectionInheritanceMode
1128
+
1064
1129
  """The name of the connection."""
1065
1130
  name: String
1066
1131
 
@@ -1173,6 +1238,11 @@ type Data {
1173
1238
  The tag name attached to the data, used for filtering and identification.
1174
1239
  """
1175
1240
  tag: String!
1241
+
1242
+ """
1243
+ Server publish timestamp in epoch milliseconds, stamped at delivery. Used by clients to monitor data delivery lag.
1244
+ """
1245
+ ts: Float
1176
1246
  }
1177
1247
 
1178
1248
  """
@@ -1390,6 +1460,27 @@ type DomainList {
1390
1460
  total: Int
1391
1461
  }
1392
1462
 
1463
+ """An ownership record binding a User to a Domain (multi-owner support)."""
1464
+ type DomainOwner {
1465
+ """Domain that the user owns."""
1466
+ domain: Domain!
1467
+
1468
+ """When the ownership was granted."""
1469
+ grantedAt: DateTimeISO!
1470
+
1471
+ """User who granted this ownership (audit)."""
1472
+ grantedBy: User
1473
+
1474
+ """Unique identifier."""
1475
+ id: ID!
1476
+
1477
+ """Optional reason/memo for granting ownership."""
1478
+ reason: String
1479
+
1480
+ """User who owns the domain."""
1481
+ user: User!
1482
+ }
1483
+
1393
1484
  """Input type for updating an existing domain entity."""
1394
1485
  input DomainPatch {
1395
1486
  """Additional attributes for the domain in key-value pairs."""
@@ -1774,6 +1865,22 @@ input EnvVarPatch {
1774
1865
  value: String
1775
1866
  }
1776
1867
 
1868
+ """Resolved state of an EnvVar key with ancestor closest-wins lookup."""
1869
+ type EnvVarResolution {
1870
+ """EnvVar id (only when found in any domain)."""
1871
+ envVarId: String
1872
+ hasValue: Boolean!
1873
+ key: String!
1874
+ sourceDomainId: String
1875
+ sourceDomainName: String
1876
+ status: String!
1877
+
1878
+ """
1879
+ Resolved value when found. Client decides masking based on propertySpec type.
1880
+ """
1881
+ value: String
1882
+ }
1883
+
1777
1884
  """Entity for Favorite"""
1778
1885
  type Favorite {
1779
1886
  createdAt: DateTimeISO
@@ -2354,6 +2461,18 @@ input MenuPatch {
2354
2461
  totalProp: String
2355
2462
  }
2356
2463
 
2464
+ type MockEntities {
2465
+ ports: [String!]!
2466
+ stockers: [String!]!
2467
+ vehicles: MockVehicles!
2468
+ zones: [String!]!
2469
+ }
2470
+
2471
+ type MockVehicles {
2472
+ agvs: [String!]!
2473
+ ohts: [String!]!
2474
+ }
2475
+
2357
2476
  type Mutation {
2358
2477
  """
2359
2478
  Activates a user account in the current domain. Use this mutation to enable a user who was previously inactive.
@@ -2363,10 +2482,18 @@ type Mutation {
2363
2482
  username: String!
2364
2483
  ): Boolean!
2365
2484
 
2485
+ """Add a user as owner of the current domain."""
2486
+ addDomainOwner(reason: String, username: String!): DomainOwner!
2487
+
2366
2488
  """
2367
2489
  Attaches an existing contact to an employee. The contact is identified by its ID and the employee is identified by their ID.
2368
2490
  """
2369
2491
  attachContact(contactId: String!, id: String!): Employee!
2492
+
2493
+ """
2494
+ 썸네일이 없는 기존 첨부파일들에 대해 서버에서 썸네일을 일괄 생성한다. 한 호출당 limit 개까지만 처리하며, remaining > 0 이면 반복 호출 필요.
2495
+ """
2496
+ backfillAttachmentThumbnails(limit: Int = 20): ThumbnailBackfillResult!
2370
2497
  cancelInvitation(email: EmailAddress!, reference: String!, type: String!): Boolean!
2371
2498
 
2372
2499
  """To clear translations cache"""
@@ -2968,8 +3095,14 @@ type Mutation {
2968
3095
 
2969
3096
  """Releases a board, making it public and creating a version history."""
2970
3097
  releaseBoard(id: String!): Board!
3098
+
3099
+ """Remove a user from the owners of the current domain."""
3100
+ removeDomainOwner(reason: String, username: String!): Boolean!
2971
3101
  renewApplicationAccessToken(id: String!, scope: String!): AccessToken!
2972
3102
 
3103
+ """Reorders a board between two adjacent boards by ID."""
3104
+ reorderBoard(id: String!, nextId: String, prevId: String): Boolean!
3105
+
2973
3106
  """Sets the custom playback order for boards in a play group."""
2974
3107
  reorderPlayGroup(boardIds: [String!]!, id: String!): PlayGroup!
2975
3108
 
@@ -3465,6 +3598,11 @@ input NewConnection {
3465
3598
  """The endpoint URL or address for the new connection."""
3466
3599
  endpoint: String
3467
3600
 
3601
+ """
3602
+ Inheritance mode for child domains. ISOLATE = per-child instance. SHARE = shared parent instance. null = use connector default.
3603
+ """
3604
+ inheritanceMode: ConnectionInheritanceMode
3605
+
3468
3606
  """The name for the new connection."""
3469
3607
  name: String!
3470
3608
 
@@ -4535,6 +4673,27 @@ input PlayGroupPatch {
4535
4673
  name: String
4536
4674
  }
4537
4675
 
4676
+ type PlaybackRecord {
4677
+ data: String!
4678
+ time: String!
4679
+ type: String!
4680
+ }
4681
+
4682
+ type PlaybackResponse {
4683
+ errorMessage: String
4684
+ playback: PlaybackResult
4685
+ status: Boolean!
4686
+ }
4687
+
4688
+ type PlaybackResult {
4689
+ scenarios: [PlaybackScenarioType!]!
4690
+ }
4691
+
4692
+ type PlaybackScenarioType {
4693
+ scenarioName: String!
4694
+ snapshots: [PlaybackRecord!]!
4695
+ }
4696
+
4538
4697
  """
4539
4698
  A privilege that can be granted to roles to control access to resources.
4540
4699
  """
@@ -4798,8 +4957,14 @@ type Query {
4798
4957
  sortings: [Sorting!]
4799
4958
  ): AuthProviderList!
4800
4959
 
4801
- """Finds a single board by its ID."""
4802
- board(id: String!): Board!
4960
+ """
4961
+ Finds a single board by its ID. If cachedUpdatedAt matches, model is omitted.
4962
+ """
4963
+ board(
4964
+ """Client cache timestamp — if matches, model field is omitted"""
4965
+ cachedUpdatedAt: String
4966
+ id: String!
4967
+ ): Board!
4803
4968
 
4804
4969
  """Finds a single board by its name."""
4805
4970
  boardByName(name: String!): Board
@@ -4873,6 +5038,14 @@ type Query {
4873
5038
  sortings: [Sorting!]
4874
5039
  ): BoardList!
4875
5040
 
5041
+ """
5042
+ Retrieves boards that have been updated or soft-deleted since the given timestamp.
5043
+ """
5044
+ boardsUpdatedSince(since: DateTimeISO!): [Board!]!
5045
+
5046
+ """Carrier 위치 이력 조회 (목업). 영구추적 fallback 용."""
5047
+ carrierLocationHistory(carrierName: String!, endTime: String!, startTime: String!): CarrierLocationHistoryResponse!
5048
+
4876
5049
  """
4877
5050
  Checks if the system is configured to provide a default password for new users.
4878
5051
  """
@@ -5052,6 +5225,9 @@ type Query {
5052
5225
  sortings: [Sorting!]
5053
5226
  ): DomainLinkList!
5054
5227
 
5228
+ """List owners of the current domain."""
5229
+ domainOwners: [DomainOwner!]!
5230
+
5055
5231
  """
5056
5232
  Fetches the list of available domain types from configuration. Only superusers are granted this privilege.
5057
5233
  """
@@ -5153,6 +5329,11 @@ type Query {
5153
5329
  """To fetch a EntityMetadata"""
5154
5330
  entityMetadata(name: String!): EntityMetadata!
5155
5331
  envVar(id: String!): EnvVar
5332
+
5333
+ """
5334
+ Resolves a batch of EnvVar keys with ancestor closest-wins inheritance.
5335
+ """
5336
+ envVarResolutions(keys: [String!]!): [EnvVarResolution!]!
5156
5337
  envVars(
5157
5338
  """An array of filter conditions to apply to the list query."""
5158
5339
  filters: [Filter!]
@@ -5249,6 +5430,9 @@ type Query {
5249
5430
  invitation(email: EmailAddress!, reference: String!, type: String!): Invitation!
5250
5431
  invitations(reference: String!, type: String!): InvitationList!
5251
5432
 
5433
+ """Check if a user is an owner of the current domain."""
5434
+ isDomainOwner(username: String!): Boolean!
5435
+
5252
5436
  """To fetch multiple LoginHistories"""
5253
5437
  loginHistories(
5254
5438
  """An array of filter conditions to apply to the list query."""
@@ -5589,6 +5773,12 @@ type Query {
5589
5773
  sortings: [Sorting!]
5590
5774
  ): PlayGroupList!
5591
5775
 
5776
+ """Playback 데이터 조회 (목업)"""
5777
+ playback(count: Int, endTime: String, includeSnapshot: Boolean = true, startTime: String!): PlaybackResponse!
5778
+
5779
+ """목업 엔티티 목록 (보드 작화용)"""
5780
+ playbackEntities: MockEntities!
5781
+
5592
5782
  """To fetch a UserPreference"""
5593
5783
  preference(id: String!): UserPreference
5594
5784
 
@@ -6620,6 +6810,21 @@ input ThemePatch {
6620
6810
  value: Object
6621
6811
  }
6622
6812
 
6813
+ """썸네일 백필 결과"""
6814
+ type ThumbnailBackfillResult {
6815
+ """이번 호출에서 처리 시도한 첨부 개수"""
6816
+ attempted: Int!
6817
+
6818
+ """실패(생성 실패/콘텐츠 없음 등) 개수"""
6819
+ failed: Int!
6820
+
6821
+ """이번 처리 후에도 남아있는 썸네일 미생성 후보 개수 (대략치). 0 이면 완료"""
6822
+ remaining: Int!
6823
+
6824
+ """썸네일 생성·저장 성공 개수"""
6825
+ succeeded: Int!
6826
+ }
6827
+
6623
6828
  """The `Upload` scalar type represents a file upload."""
6624
6829
  scalar Upload
6625
6830