@amityco/social-plus-vise 0.14.17 → 0.14.19

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/CHANGELOG.md CHANGED
@@ -4,6 +4,26 @@ All notable changes to `@amityco/social-plus-vise` are documented in this file.
4
4
 
5
5
  The format is loosely based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## 0.14.19 — 2026-06-05
8
+
9
+ ### Changed
10
+ - **Deeper product-first chat/comments surface:** comment target resolution, chat channel source, chat observer cleanup, chat send failure handling, chat channel shape, and TypeScript/React Native chat message ordering now surface through shared product expectation IDs while preserving exact platform `contractRuleId`/`validator.sensorId` evidence.
11
+ - **Capability feed-forward expansion:** chat plans now preflight the new product expectations against bundled SDK surface facts before implementation, so agents see product-level expectations such as `chat.channel-target-resolved`, `chat.message-observer-cleanup`, and `chat.send-error-handling`.
12
+ - **Validation checklist clarity:** add-comments and add-chat validation lists no longer expose platform-specific primary IDs for the promoted target/lifecycle/send/channel-shape checks.
13
+
14
+ ### Verified
15
+ - Focused capability, product-flow, native-idiom, CLI, MCP, compliance, and rule-coverage suites passed. Product-flow now verifies plan and check output for the new shared chat/comment IDs with Android/TypeScript contract evidence.
16
+
17
+ ## 0.14.18 — 2026-06-05
18
+
19
+ ### Changed
20
+ - **Broader product-first rule surface:** feed target resolution, feed UI states, feed pagination, UGC moderation affordances, post status filtering, opaque pagination cursors, and server-synced unread counts now surface through shared product expectation IDs while preserving the exact platform `contractRuleId`/`validator.sensorId` evidence.
21
+ - **Capability feed-forward expansion:** the promoted feed/data expectations now participate in platform capability preflight where the bundled SDK surface proves support, so plans can show product-level expectations before implementation rather than only after `vise check`.
22
+ - **Validation checklist clarity:** add-feed, add-comments, and add-chat plans now use product-level expectation IDs for the promoted shared behaviors instead of exposing platform-specific validator names as the primary checklist items.
23
+
24
+ ### Verified
25
+ - Focused CLI, fixture, MCP, product-flow, agent-flow, capability, native-idiom, and rule-coverage suites passed. A local iOS `whoops` plan smoke confirmed the broader product ids with iOS sensor evidence.
26
+
7
27
  ## 0.14.17 — 2026-06-05
8
28
 
9
29
  ### Changed
package/README.md CHANGED
@@ -161,16 +161,16 @@ Aggregate: **98/99 expected feed capabilities** and **27/27 selected optional ca
161
161
 
162
162
  ### Current Release Validation
163
163
 
164
- Version 0.14.12 adds current release proof around the full feed-forward and validation flow:
164
+ Version 0.14.19 carries current release proof around the full feed-forward, product-expectation, and validation flow:
165
165
 
166
166
  | Surface | What was validated |
167
167
  |---|---|
168
168
  | **Product flow** | Local end-to-end smoke covers design extraction, plan feed-forward, blocking intake, answered init, capability check, design conformance, and sensor discovery. |
169
169
  | **Plan questions** | Plans surface blocking questions such as `feature_surface` and `design_contract_confirmation`, plus optional choices such as `feed_optional_capabilities`. |
170
170
  | **Capability-to-sensor flow** | Vise checks platform support, matches the prompt to available capabilities, offers supported features as questions, records answers, and turns selected answers into sensors in `vise check`. |
171
- | **Shared product expectations** | Public IDs such as `comments.thread-read-write` stay platform-agnostic while check results retain concrete `contractRuleId` and `validator.sensorId` evidence. |
172
- | **Rule detection** | TP-track dashboard detects **311/311 seeded rule gaps (100.0%)** in the static corpus. |
173
- | **Packed-package smoke** | A real Antigravity agent smoke tested the 0.14.12 tarball, opted into surfaced plan questions, repaired selected optional poll capability sensors, and verified ambiguous shared comment attestations require exact contract rule IDs. |
171
+ | **Shared product expectations** | Public IDs such as `feed.target-resolved`, `comments.target-resolved`, `comments.thread-read-write`, `chat.channel-target-resolved`, `chat.send-error-handling`, and `chat.unread-visible` stay platform-agnostic while check results retain concrete `contractRuleId` and `validator.sensorId` evidence. |
172
+ | **Rule detection** | TP-track dashboard detects **321/321 seeded rule gaps (100.0%)** in the static corpus. |
173
+ | **Packed-package smoke** | Packed-package and host-agent smokes exercise the release tarball path, surfaced plan questions, selected optional capability sensors, rejected design confirmation handling, and exact contract-rule evidence for shared product expectations. |
174
174
 
175
175
  ### Supporting Proof
176
176
 
@@ -427,6 +427,104 @@ export const OPTIONAL_CAPABILITIES = [
427
427
  },
428
428
  ];
429
429
  export const SHARED_PRODUCT_EXPECTATIONS = [
430
+ {
431
+ id: "feed.target-resolved",
432
+ label: "Resolved feed target",
433
+ outcomes: ["add-feed"],
434
+ kind: "shared-expectation",
435
+ availability: [
436
+ {
437
+ label: "SDK feed target/query APIs",
438
+ symbols: [/\btargetId\b/i, /\btargetType\b/i, /\bgetUserFeed\b/i, /\bgetCommunityFeed\b/i, /\bgetGlobalFeed\b/i, /\bgetPosts\b/i, /\bqueryPosts\b/i],
439
+ },
440
+ ],
441
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
442
+ hint: "bind targetType and targetId to route params, auth context, or customer-owned selection state; do not invent literals",
443
+ },
444
+ {
445
+ id: "feed.ui-states-present",
446
+ label: "Feed loading/empty/error states",
447
+ outcomes: ["add-feed"],
448
+ kind: "shared-expectation",
449
+ availability: [
450
+ {
451
+ label: "SDK feed collection/query APIs",
452
+ symbols: [/\bgetUserFeed\b/i, /\bgetCommunityFeed\b/i, /\bgetGlobalFeed\b/i, /\bgetPosts\b/i, /\bqueryPosts\b/i],
453
+ },
454
+ ],
455
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
456
+ hint: "render loading, empty, error, and data states around the feed collection instead of only the success path",
457
+ },
458
+ {
459
+ id: "feed.pagination-wired",
460
+ label: "Feed pagination",
461
+ outcomes: ["add-feed"],
462
+ kind: "shared-expectation",
463
+ availability: [
464
+ {
465
+ label: "SDK pagination APIs",
466
+ symbols: [/\bnextPage\b/i, /\bnextPageToken\b/i, /\bloadMore\b/i, /\bonNextPage\b/i, /\bhasNext\b/i],
467
+ },
468
+ ],
469
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
470
+ hint: "wire load-more or automatic paging to the SDK collection; a fixed first page is incomplete",
471
+ },
472
+ {
473
+ id: "moderation.affordance-present",
474
+ label: "UGC moderation affordance",
475
+ outcomes: ["add-feed", "add-comments", "add-chat"],
476
+ kind: "shared-expectation",
477
+ availability: [
478
+ {
479
+ label: "SDK moderation/reporting APIs",
480
+ symbols: [/\bflagPost\b/i, /\bflagComment\b/i, /\bflagMessage\b/i, /\breport\b/i, /\bmoderation\b/i, /\bblockUser\b/i],
481
+ },
482
+ ],
483
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
484
+ hint: "show report/flag/block/hide affordances on user-generated content, scoped to the surface being built",
485
+ },
486
+ {
487
+ id: "posts.status-filtered",
488
+ label: "Post status filtering",
489
+ outcomes: ["add-feed"],
490
+ kind: "shared-expectation",
491
+ availability: [
492
+ {
493
+ label: "SDK post status/filter APIs",
494
+ symbols: [/\bstatus\b/i, /\bstatuses\b/i, /\bfeedType\b/i, /\bpublished\b/i, /\bincludeDeleted\b/i],
495
+ },
496
+ ],
497
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
498
+ hint: "filter post queries to published/non-deleted content so moderated or deleted posts do not leak into normal feeds",
499
+ },
500
+ {
501
+ id: "pagination.cursor-opaque",
502
+ label: "Opaque pagination cursors",
503
+ outcomes: ["add-feed", "add-comments", "add-chat"],
504
+ kind: "shared-expectation",
505
+ availability: [
506
+ {
507
+ label: "SDK cursor pagination APIs",
508
+ symbols: [/\bnextPage\b/i, /\bnextPageToken\b/i, /\bloadMore\b/i, /\bonNextPage\b/i, /\bhasNext\b/i],
509
+ },
510
+ ],
511
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
512
+ hint: "pass SDK-provided cursor tokens or call SDK next-page helpers; never compute numeric page offsets",
513
+ },
514
+ {
515
+ id: "unread.server-synced",
516
+ label: "Server-synced unread counts",
517
+ outcomes: ["add-feed", "add-chat"],
518
+ kind: "shared-expectation",
519
+ availability: [
520
+ {
521
+ label: "SDK unread state",
522
+ symbols: [/\bunreadCount\b/i, /\bChannelUnread\b/i, /\bobserveUserUnread\b/i, /\bgetUnread\w*\b/i, /\bgetTotalChannelUnread\b/i],
523
+ },
524
+ ],
525
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
526
+ hint: "source unread badges from the SDK stream instead of counting stale local arrays",
527
+ },
430
528
  {
431
529
  id: "feed.rich-post-rendering",
432
530
  label: "Rich post rendering",
@@ -471,6 +569,20 @@ export const SHARED_PRODUCT_EXPECTATIONS = [
471
569
  deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
472
570
  hint: "implement the selected rich composer paths or record an explicit text-only/rich-post scope decision",
473
571
  },
572
+ {
573
+ id: "comments.target-resolved",
574
+ label: "Resolved comment target",
575
+ outcomes: ["add-comments"],
576
+ kind: "shared-expectation",
577
+ availability: [
578
+ {
579
+ label: "SDK comment target/query APIs",
580
+ symbols: [/\bgetComments\b/i, /\bqueryComments\b/i, /\bcreateComment\b/i, /\breferenceId\b/i, /\breferenceType\b/i],
581
+ },
582
+ ],
583
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
584
+ hint: "pass the parent post/story/custom entity id from navigation, props, or app state; do not invent postId/commentId literals",
585
+ },
474
586
  {
475
587
  id: "comments.thread-read-write",
476
588
  label: "Comment thread read/write",
@@ -483,6 +595,62 @@ export const SHARED_PRODUCT_EXPECTATIONS = [
483
595
  deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
484
596
  hint: "if comments are shown, pair the list with a composer and loading/error/empty states unless the surface is explicitly read-only",
485
597
  },
598
+ {
599
+ id: "chat.channel-target-resolved",
600
+ label: "Resolved chat channel",
601
+ outcomes: ["add-chat"],
602
+ kind: "shared-expectation",
603
+ availability: [
604
+ {
605
+ label: "SDK channel query/create APIs",
606
+ symbols: [/\bChannelRepository\b/i, /\bgetChannels\b/i, /\bqueryChannels\b/i, /\bcreateChannel\b/i, /\bchannelId\b/i, /\bconversationId\b/i],
607
+ },
608
+ ],
609
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
610
+ hint: "resolve channelId/conversationId from SDK queries, user selection, routing, or app-owned creation flow; do not hardcode it",
611
+ },
612
+ {
613
+ id: "chat.message-observer-cleanup",
614
+ label: "Chat message observer cleanup",
615
+ outcomes: ["add-chat"],
616
+ kind: "shared-expectation",
617
+ availability: [
618
+ {
619
+ label: "SDK message live query APIs",
620
+ symbols: [/\bMessageRepository\b/i, /\bgetMessages\b/i, /\bqueryMessages\b/i, /\bLiveCollection\b/i, /\bobserve\b/i, /\bsubscribe\b/i, /\bdispose\b/i, /\bunobserve\b/i],
621
+ },
622
+ ],
623
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
624
+ hint: "clean up message live collections/subscriptions on component unmount, view dismissal, or lifecycle disposal",
625
+ },
626
+ {
627
+ id: "chat.send-error-handling",
628
+ label: "Chat send failure handling",
629
+ outcomes: ["add-chat"],
630
+ kind: "shared-expectation",
631
+ availability: [
632
+ {
633
+ label: "SDK message send/failure state APIs",
634
+ symbols: [/\bMessageRepository\b/i, /\bcreate\w*Message\b/i, /\bsendMessage\b/i, /\bsyncState\b/i, /\bdeleteFailedMessages\b/i],
635
+ },
636
+ ],
637
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
638
+ hint: "surface failed sends with error state, retry/delete affordances, or SDK failure cleanup instead of assuming optimistic success",
639
+ },
640
+ {
641
+ id: "chat.channel-shape-matched",
642
+ label: "Chat channel shape",
643
+ outcomes: ["add-chat"],
644
+ kind: "shared-expectation",
645
+ availability: [
646
+ {
647
+ label: "SDK channel type APIs",
648
+ symbols: [/\bchannelType\b/i, /\bChannelType\b/i, /\bAmityChannelType\b/i, /\bconversation\b/i, /\bcommunity\b/i, /\bbroadcast\b/i],
649
+ },
650
+ ],
651
+ deterministicPlatforms: ["android", "flutter", "ios", "typescript"],
652
+ hint: "match the SDK channel type to the selected chat shape: conversation for direct messages, community/group for shared channels, broadcast where applicable",
653
+ },
486
654
  {
487
655
  id: "chat.unread-visible",
488
656
  label: "Chat unread counts",
package/dist/outcomes.js CHANGED
@@ -653,7 +653,13 @@ const addFeed = {
653
653
  validation: (platform) => [
654
654
  "feed target identified",
655
655
  "no invented communityId/targetId/feedId",
656
- `${platform}.feed.target.literal`,
656
+ "feed.target-resolved",
657
+ "feed.ui-states-present",
658
+ "feed.pagination-wired",
659
+ "moderation.affordance-present",
660
+ "posts.status-filtered",
661
+ "pagination.cursor-opaque",
662
+ "unread.server-synced",
657
663
  "feed.rich-post-rendering",
658
664
  "feed.rich-post-composer-scope",
659
665
  "comments.thread-read-write",
@@ -787,9 +793,10 @@ const addComments = {
787
793
  validation: (platform) => [
788
794
  "comment target resolved",
789
795
  "no invented postId/commentId",
790
- `${platform}.comments.target-resolved`,
796
+ "comments.target-resolved",
791
797
  "comments.thread-read-write",
792
- `${platform}.comments.moderation-affordance-present`,
798
+ "moderation.affordance-present",
799
+ "pagination.cursor-opaque",
793
800
  ],
794
801
  stopConditions: (ctx) => filterStops(ctx.answers, [
795
802
  { id: "comment_target", text: "The comment target entity is unknown; do not invent postId, commentId, or parent entity references." },
@@ -1018,10 +1025,13 @@ const addChat = {
1018
1025
  ];
1019
1026
  },
1020
1027
  validation: (platform) => [
1021
- `${platform}.chat.channel-target-resolved`,
1022
- `${platform}.chat.message-observer-cleanup`,
1023
- `${platform}.chat.send-error-handling`,
1024
- `${platform}.chat.moderation-affordance-present`,
1028
+ "chat.channel-target-resolved",
1029
+ "chat.message-observer-cleanup",
1030
+ "chat.send-error-handling",
1031
+ "chat.channel-shape-matched",
1032
+ "moderation.affordance-present",
1033
+ "unread.server-synced",
1034
+ "pagination.cursor-opaque",
1025
1035
  "chat.unread-visible",
1026
1036
  ...(platform === "android" || platform === "flutter" || platform === "ios" ? ["chat.message-order-explicit"] : []),
1027
1037
  ],
@@ -1,12 +1,98 @@
1
1
  export const PRODUCT_EXPECTATION_TITLES = {
2
+ "feed.target-resolved": "Feed target comes from app state",
3
+ "feed.ui-states-present": "Feed renders loading, empty, and error states",
4
+ "feed.pagination-wired": "Feed pagination is wired",
5
+ "moderation.affordance-present": "UGC moderation affordance is present",
6
+ "posts.status-filtered": "Post queries filter unsafe statuses",
7
+ "pagination.cursor-opaque": "Pagination cursors stay opaque",
8
+ "unread.server-synced": "Unread counts use the server-synced stream",
2
9
  "feed.rich-post-rendering": "Feed renders rich post types",
3
10
  "feed.rich-post-composer-scope": "Feed composer surfaces rich post scope",
11
+ "comments.target-resolved": "Comment target comes from the parent entity",
4
12
  "comments.thread-read-write": "Comment threads support reading and creation",
13
+ "chat.channel-target-resolved": "Chat channel comes from app state",
14
+ "chat.message-observer-cleanup": "Chat message observers clean up on lifecycle end",
15
+ "chat.send-error-handling": "Chat send failures are handled",
16
+ "chat.channel-shape-matched": "Chat channel type matches the requested shape",
5
17
  "chat.unread-visible": "Chat unread counts are visible",
6
18
  "chat.message-order-explicit": "Chat message order is explicit",
7
19
  "profile.social-counts": "Profile social counts come from the SDK",
8
20
  };
21
+ const platformBindings = (expectationId, sensorsByPlatform) => Object.entries(sensorsByPlatform).flatMap(([platform, sensors]) => (Array.isArray(sensors) ? sensors : [sensors]).map((sensorId) => ({
22
+ expectationId,
23
+ sensorId,
24
+ platform,
25
+ })));
9
26
  export const PRODUCT_EXPECTATION_BINDINGS = [
27
+ ...platformBindings("feed.target-resolved", {
28
+ typescript: ["typescript.feed.target.literal", "typescript.feed.target-type-explicit"],
29
+ "react-native": ["react-native.feed.target.literal", "react-native.feed.target-type-explicit"],
30
+ android: ["android.feed.target.literal", "android.feed.target-type-explicit"],
31
+ flutter: ["flutter.feed.target.literal", "flutter.feed.target-type-explicit"],
32
+ ios: ["ios.feed.target.literal", "ios.feed.target-type-explicit"],
33
+ }),
34
+ ...platformBindings("feed.ui-states-present", {
35
+ typescript: "typescript.feed.ui-states-present",
36
+ "react-native": "react-native.feed.ui-states-present",
37
+ android: "android.feed.ui-states-present",
38
+ flutter: "flutter.feed.ui-states-present",
39
+ ios: "ios.feed.ui-states-present",
40
+ }),
41
+ ...platformBindings("feed.pagination-wired", {
42
+ typescript: "typescript.feed.pagination-wired",
43
+ "react-native": "react-native.feed.pagination-wired",
44
+ android: "android.feed.pagination-wired",
45
+ flutter: "flutter.feed.pagination-wired",
46
+ ios: "ios.feed.pagination-wired",
47
+ }),
48
+ ...platformBindings("moderation.affordance-present", {
49
+ typescript: [
50
+ "typescript.feed.moderation-affordance-present",
51
+ "typescript.comments.moderation-affordance-present",
52
+ "typescript.chat.moderation-affordance-present",
53
+ ],
54
+ "react-native": [
55
+ "react-native.feed.moderation-affordance-present",
56
+ "react-native.comments.moderation-affordance-present",
57
+ "react-native.chat.moderation-affordance-present",
58
+ ],
59
+ android: [
60
+ "android.feed.moderation-affordance-present",
61
+ "android.comments.moderation-affordance-present",
62
+ "android.chat.moderation-affordance-present",
63
+ ],
64
+ flutter: [
65
+ "flutter.feed.moderation-affordance-present",
66
+ "flutter.comments.moderation-affordance-present",
67
+ "flutter.chat.moderation-affordance-present",
68
+ ],
69
+ ios: [
70
+ "ios.feed.moderation-affordance-present",
71
+ "ios.comments.moderation-affordance-present",
72
+ "ios.chat.moderation-affordance-present",
73
+ ],
74
+ }),
75
+ ...platformBindings("posts.status-filtered", {
76
+ typescript: "typescript.posts.status-filter-applied",
77
+ "react-native": "react-native.posts.status-filter-applied",
78
+ android: "android.posts.status-filter-applied",
79
+ flutter: "flutter.posts.status-filter-applied",
80
+ ios: "ios.posts.status-filter-applied",
81
+ }),
82
+ ...platformBindings("pagination.cursor-opaque", {
83
+ typescript: "typescript.pagination.cursor-opaque",
84
+ "react-native": "react-native.pagination.cursor-opaque",
85
+ android: "android.pagination.cursor-opaque",
86
+ flutter: "flutter.pagination.cursor-opaque",
87
+ ios: "ios.pagination.cursor-opaque",
88
+ }),
89
+ ...platformBindings("unread.server-synced", {
90
+ typescript: "typescript.unread.subscribed-not-counted",
91
+ "react-native": "react-native.unread.subscribed-not-counted",
92
+ android: "android.unread.subscribed-not-counted",
93
+ flutter: "flutter.unread.subscribed-not-counted",
94
+ ios: "ios.unread.subscribed-not-counted",
95
+ }),
10
96
  {
11
97
  expectationId: "feed.rich-post-rendering",
12
98
  sensorId: "typescript.feed.post-datatype-handled",
@@ -82,6 +168,13 @@ export const PRODUCT_EXPECTATION_BINDINGS = [
82
168
  sensorId: "ios.feed.rich-post-composer-surfaced",
83
169
  platform: "ios",
84
170
  },
171
+ ...platformBindings("comments.target-resolved", {
172
+ typescript: "typescript.comments.target-resolved",
173
+ "react-native": "react-native.comments.target-resolved",
174
+ android: "android.comments.target-resolved",
175
+ flutter: "flutter.comments.target-resolved",
176
+ ios: "ios.comments.target-resolved",
177
+ }),
85
178
  {
86
179
  expectationId: "comments.thread-read-write",
87
180
  sensorId: "typescript.comments.query-has-limit",
@@ -187,6 +280,34 @@ export const PRODUCT_EXPECTATION_BINDINGS = [
187
280
  sensorId: "ios.comments.ui-states-present",
188
281
  platform: "ios",
189
282
  },
283
+ ...platformBindings("chat.channel-target-resolved", {
284
+ typescript: "typescript.chat.channel-target-resolved",
285
+ "react-native": "react-native.chat.channel-target-resolved",
286
+ android: "android.chat.channel-target-resolved",
287
+ flutter: "flutter.chat.channel-target-resolved",
288
+ ios: "ios.chat.channel-target-resolved",
289
+ }),
290
+ ...platformBindings("chat.message-observer-cleanup", {
291
+ typescript: "typescript.chat.message-observer-cleanup",
292
+ "react-native": "react-native.chat.message-observer-cleanup",
293
+ android: "android.chat.message-observer-cleanup",
294
+ flutter: "flutter.chat.message-observer-cleanup",
295
+ ios: "ios.chat.message-observer-cleanup",
296
+ }),
297
+ ...platformBindings("chat.send-error-handling", {
298
+ typescript: "typescript.chat.send-error-handling",
299
+ "react-native": "react-native.chat.send-error-handling",
300
+ android: "android.chat.send-error-handling",
301
+ flutter: "flutter.chat.send-error-handling",
302
+ ios: "ios.chat.send-error-handling",
303
+ }),
304
+ ...platformBindings("chat.channel-shape-matched", {
305
+ typescript: ["typescript.channel.type-matches-shape", "typescript.chat.channel-type-dm"],
306
+ "react-native": ["react-native.channel.type-matches-shape", "react-native.chat.channel-type-dm"],
307
+ android: "android.channel.type-matches-shape",
308
+ flutter: "flutter.channel.type-matches-shape",
309
+ ios: "ios.channel.type-matches-shape",
310
+ }),
190
311
  {
191
312
  expectationId: "chat.unread-visible",
192
313
  sensorId: "typescript.chat.unread-visible",
@@ -212,6 +333,16 @@ export const PRODUCT_EXPECTATION_BINDINGS = [
212
333
  sensorId: "ios.chat.unread-visible",
213
334
  platform: "ios",
214
335
  },
336
+ {
337
+ expectationId: "chat.message-order-explicit",
338
+ sensorId: "typescript.chat.sort-explicit",
339
+ platform: "typescript",
340
+ },
341
+ {
342
+ expectationId: "chat.message-order-explicit",
343
+ sensorId: "react-native.chat.sort-explicit",
344
+ platform: "react-native",
345
+ },
215
346
  {
216
347
  expectationId: "chat.message-order-explicit",
217
348
  sensorId: "android.chat.sort-explicit",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amityco/social-plus-vise",
3
- "version": "0.14.17",
3
+ "version": "0.14.19",
4
4
  "description": "Skill-guided deterministic CLI for social.plus SDK integration assistance.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",