@fmsim/fmsim 2.0.0-beta.9 → 2.0.0-beta.91

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.9",
3
+ "version": "2.0.0-beta.91",
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.9",
44
- "@fmsim/machine": "^2.0.0-beta.7",
43
+ "@fmsim/layout-view": "^2.0.0-beta.91",
44
+ "@fmsim/machine": "^2.0.0-beta.90",
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.84",
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": "bb2e6564cce7b5fd4e2b938e5e84b37c942d642f"
81
+ "gitHead": "b971e5ac239ee4f6b59f5011c70afc3f000da841"
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
 
@@ -1390,6 +1455,27 @@ type DomainList {
1390
1455
  total: Int
1391
1456
  }
1392
1457
 
1458
+ """An ownership record binding a User to a Domain (multi-owner support)."""
1459
+ type DomainOwner {
1460
+ """Domain that the user owns."""
1461
+ domain: Domain!
1462
+
1463
+ """When the ownership was granted."""
1464
+ grantedAt: DateTimeISO!
1465
+
1466
+ """User who granted this ownership (audit)."""
1467
+ grantedBy: User
1468
+
1469
+ """Unique identifier."""
1470
+ id: ID!
1471
+
1472
+ """Optional reason/memo for granting ownership."""
1473
+ reason: String
1474
+
1475
+ """User who owns the domain."""
1476
+ user: User!
1477
+ }
1478
+
1393
1479
  """Input type for updating an existing domain entity."""
1394
1480
  input DomainPatch {
1395
1481
  """Additional attributes for the domain in key-value pairs."""
@@ -1774,6 +1860,22 @@ input EnvVarPatch {
1774
1860
  value: String
1775
1861
  }
1776
1862
 
1863
+ """Resolved state of an EnvVar key with ancestor closest-wins lookup."""
1864
+ type EnvVarResolution {
1865
+ """EnvVar id (only when found in any domain)."""
1866
+ envVarId: String
1867
+ hasValue: Boolean!
1868
+ key: String!
1869
+ sourceDomainId: String
1870
+ sourceDomainName: String
1871
+ status: String!
1872
+
1873
+ """
1874
+ Resolved value when found. Client decides masking based on propertySpec type.
1875
+ """
1876
+ value: String
1877
+ }
1878
+
1777
1879
  """Entity for Favorite"""
1778
1880
  type Favorite {
1779
1881
  createdAt: DateTimeISO
@@ -2354,6 +2456,18 @@ input MenuPatch {
2354
2456
  totalProp: String
2355
2457
  }
2356
2458
 
2459
+ type MockEntities {
2460
+ ports: [String!]!
2461
+ stockers: [String!]!
2462
+ vehicles: MockVehicles!
2463
+ zones: [String!]!
2464
+ }
2465
+
2466
+ type MockVehicles {
2467
+ agvs: [String!]!
2468
+ ohts: [String!]!
2469
+ }
2470
+
2357
2471
  type Mutation {
2358
2472
  """
2359
2473
  Activates a user account in the current domain. Use this mutation to enable a user who was previously inactive.
@@ -2363,10 +2477,18 @@ type Mutation {
2363
2477
  username: String!
2364
2478
  ): Boolean!
2365
2479
 
2480
+ """Add a user as owner of the current domain."""
2481
+ addDomainOwner(reason: String, username: String!): DomainOwner!
2482
+
2366
2483
  """
2367
2484
  Attaches an existing contact to an employee. The contact is identified by its ID and the employee is identified by their ID.
2368
2485
  """
2369
2486
  attachContact(contactId: String!, id: String!): Employee!
2487
+
2488
+ """
2489
+ 썸네일이 없는 기존 첨부파일들에 대해 서버에서 썸네일을 일괄 생성한다. 한 호출당 limit 개까지만 처리하며, remaining > 0 이면 반복 호출 필요.
2490
+ """
2491
+ backfillAttachmentThumbnails(limit: Int = 20): ThumbnailBackfillResult!
2370
2492
  cancelInvitation(email: EmailAddress!, reference: String!, type: String!): Boolean!
2371
2493
 
2372
2494
  """To clear translations cache"""
@@ -2968,8 +3090,14 @@ type Mutation {
2968
3090
 
2969
3091
  """Releases a board, making it public and creating a version history."""
2970
3092
  releaseBoard(id: String!): Board!
3093
+
3094
+ """Remove a user from the owners of the current domain."""
3095
+ removeDomainOwner(reason: String, username: String!): Boolean!
2971
3096
  renewApplicationAccessToken(id: String!, scope: String!): AccessToken!
2972
3097
 
3098
+ """Reorders a board between two adjacent boards by ID."""
3099
+ reorderBoard(id: String!, nextId: String, prevId: String): Boolean!
3100
+
2973
3101
  """Sets the custom playback order for boards in a play group."""
2974
3102
  reorderPlayGroup(boardIds: [String!]!, id: String!): PlayGroup!
2975
3103
 
@@ -3465,6 +3593,11 @@ input NewConnection {
3465
3593
  """The endpoint URL or address for the new connection."""
3466
3594
  endpoint: String
3467
3595
 
3596
+ """
3597
+ Inheritance mode for child domains. ISOLATE = per-child instance. SHARE = shared parent instance. null = use connector default.
3598
+ """
3599
+ inheritanceMode: ConnectionInheritanceMode
3600
+
3468
3601
  """The name for the new connection."""
3469
3602
  name: String!
3470
3603
 
@@ -4535,6 +4668,27 @@ input PlayGroupPatch {
4535
4668
  name: String
4536
4669
  }
4537
4670
 
4671
+ type PlaybackRecord {
4672
+ data: String!
4673
+ time: String!
4674
+ type: String!
4675
+ }
4676
+
4677
+ type PlaybackResponse {
4678
+ errorMessage: String
4679
+ playback: PlaybackResult
4680
+ status: Boolean!
4681
+ }
4682
+
4683
+ type PlaybackResult {
4684
+ scenarios: [PlaybackScenarioType!]!
4685
+ }
4686
+
4687
+ type PlaybackScenarioType {
4688
+ scenarioName: String!
4689
+ snapshots: [PlaybackRecord!]!
4690
+ }
4691
+
4538
4692
  """
4539
4693
  A privilege that can be granted to roles to control access to resources.
4540
4694
  """
@@ -4798,8 +4952,14 @@ type Query {
4798
4952
  sortings: [Sorting!]
4799
4953
  ): AuthProviderList!
4800
4954
 
4801
- """Finds a single board by its ID."""
4802
- board(id: String!): Board!
4955
+ """
4956
+ Finds a single board by its ID. If cachedUpdatedAt matches, model is omitted.
4957
+ """
4958
+ board(
4959
+ """Client cache timestamp — if matches, model field is omitted"""
4960
+ cachedUpdatedAt: String
4961
+ id: String!
4962
+ ): Board!
4803
4963
 
4804
4964
  """Finds a single board by its name."""
4805
4965
  boardByName(name: String!): Board
@@ -4873,6 +5033,14 @@ type Query {
4873
5033
  sortings: [Sorting!]
4874
5034
  ): BoardList!
4875
5035
 
5036
+ """
5037
+ Retrieves boards that have been updated or soft-deleted since the given timestamp.
5038
+ """
5039
+ boardsUpdatedSince(since: DateTimeISO!): [Board!]!
5040
+
5041
+ """Carrier 위치 이력 조회 (목업). 영구추적 fallback 용."""
5042
+ carrierLocationHistory(carrierName: String!, endTime: String!, startTime: String!): CarrierLocationHistoryResponse!
5043
+
4876
5044
  """
4877
5045
  Checks if the system is configured to provide a default password for new users.
4878
5046
  """
@@ -5052,6 +5220,9 @@ type Query {
5052
5220
  sortings: [Sorting!]
5053
5221
  ): DomainLinkList!
5054
5222
 
5223
+ """List owners of the current domain."""
5224
+ domainOwners: [DomainOwner!]!
5225
+
5055
5226
  """
5056
5227
  Fetches the list of available domain types from configuration. Only superusers are granted this privilege.
5057
5228
  """
@@ -5153,6 +5324,11 @@ type Query {
5153
5324
  """To fetch a EntityMetadata"""
5154
5325
  entityMetadata(name: String!): EntityMetadata!
5155
5326
  envVar(id: String!): EnvVar
5327
+
5328
+ """
5329
+ Resolves a batch of EnvVar keys with ancestor closest-wins inheritance.
5330
+ """
5331
+ envVarResolutions(keys: [String!]!): [EnvVarResolution!]!
5156
5332
  envVars(
5157
5333
  """An array of filter conditions to apply to the list query."""
5158
5334
  filters: [Filter!]
@@ -5249,6 +5425,9 @@ type Query {
5249
5425
  invitation(email: EmailAddress!, reference: String!, type: String!): Invitation!
5250
5426
  invitations(reference: String!, type: String!): InvitationList!
5251
5427
 
5428
+ """Check if a user is an owner of the current domain."""
5429
+ isDomainOwner(username: String!): Boolean!
5430
+
5252
5431
  """To fetch multiple LoginHistories"""
5253
5432
  loginHistories(
5254
5433
  """An array of filter conditions to apply to the list query."""
@@ -5589,6 +5768,12 @@ type Query {
5589
5768
  sortings: [Sorting!]
5590
5769
  ): PlayGroupList!
5591
5770
 
5771
+ """Playback 데이터 조회 (목업)"""
5772
+ playback(count: Int, endTime: String, includeSnapshot: Boolean = true, startTime: String!): PlaybackResponse!
5773
+
5774
+ """목업 엔티티 목록 (보드 작화용)"""
5775
+ playbackEntities: MockEntities!
5776
+
5592
5777
  """To fetch a UserPreference"""
5593
5778
  preference(id: String!): UserPreference
5594
5779
 
@@ -6620,6 +6805,21 @@ input ThemePatch {
6620
6805
  value: Object
6621
6806
  }
6622
6807
 
6808
+ """썸네일 백필 결과"""
6809
+ type ThumbnailBackfillResult {
6810
+ """이번 호출에서 처리 시도한 첨부 개수"""
6811
+ attempted: Int!
6812
+
6813
+ """실패(생성 실패/콘텐츠 없음 등) 개수"""
6814
+ failed: Int!
6815
+
6816
+ """이번 처리 후에도 남아있는 썸네일 미생성 후보 개수 (대략치). 0 이면 완료"""
6817
+ remaining: Int!
6818
+
6819
+ """썸네일 생성·저장 성공 개수"""
6820
+ succeeded: Int!
6821
+ }
6822
+
6623
6823
  """The `Upload` scalar type represents a file upload."""
6624
6824
  scalar Upload
6625
6825
 
@@ -27,7 +27,6 @@
27
27
 
28
28
  <script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js"></script>
29
29
 
30
- <script src="/fmsim/node_modules/@hatiolab/things-scene/things-scene-min.js"></script>
31
30
  <script src="/fmsim/scene-viewer.js"></script>
32
31
  </head>
33
32
  <body>
@@ -48,7 +48,6 @@
48
48
  })
49
49
  }
50
50
  </script>
51
- <script src="/fmsim/node_modules/@hatiolab/things-scene/things-scene-min.js"></script>
52
51
  <script src="/fmsim/headless-scene-components.js"></script>
53
52
 
54
53
  <script>
@@ -45,7 +45,6 @@
45
45
  })
46
46
  }
47
47
  </script>
48
- <script src="/fmsim/node_modules/@hatiolab/things-scene/things-scene-min.js"></script>
49
48
  <script src="/fmsim/headless-scene-components.js"></script>
50
49
 
51
50
  <script>