@senguoyun/dsh-arkme 0.1.42 → 0.1.43

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 (130) hide show
  1. package/docs/avatar-diagnostics.md +36 -0
  2. package/docs/consumer-plugin-contract.md +18 -1
  3. package/docs/resizable-composer-verification.md +45 -0
  4. package/docs/resizable-note-detail-verification.md +41 -0
  5. package/lib/client.js +63014 -58738
  6. package/lib/client.js.map +1 -1
  7. package/lib/index.js +974 -41
  8. package/lib/persistent-extension.js +1 -1
  9. package/lib/{persistent-runtime-LJ4nj7os.js → persistent-runtime-DYBmIlId.js} +2881 -1945
  10. package/lib/sdk.js +27 -0
  11. package/lib/types/arkme-service.d.ts +26 -1
  12. package/lib/types/arkme-service.d.ts.map +1 -1
  13. package/lib/types/avatar-diagnostics.d.ts +20 -0
  14. package/lib/types/avatar-diagnostics.d.ts.map +1 -0
  15. package/lib/types/client/ArkmeAppUpdateDialog.d.ts.map +1 -1
  16. package/lib/types/client/ArkmeNoteDetails.d.ts.map +1 -1
  17. package/lib/types/client/ArkmeRecordingSurface.d.ts +7 -3
  18. package/lib/types/client/ArkmeRecordingSurface.d.ts.map +1 -1
  19. package/lib/types/client/ArkmeSettingsSurface.d.ts +3 -3
  20. package/lib/types/client/ArkmeSettingsSurface.d.ts.map +1 -1
  21. package/lib/types/client/ArkmeSidebar.d.ts +1 -0
  22. package/lib/types/client/ArkmeSidebar.d.ts.map +1 -1
  23. package/lib/types/client/ArkmeUpdateSurfaces.d.ts +2 -1
  24. package/lib/types/client/ArkmeUpdateSurfaces.d.ts.map +1 -1
  25. package/lib/types/client/api.d.ts +10 -2
  26. package/lib/types/client/api.d.ts.map +1 -1
  27. package/lib/types/client/app-update-store.d.ts +8 -1
  28. package/lib/types/client/app-update-store.d.ts.map +1 -1
  29. package/lib/types/client/arkme-theme.d.ts +1 -0
  30. package/lib/types/client/arkme-theme.d.ts.map +1 -1
  31. package/lib/types/client/avatar-image-runtime.d.ts.map +1 -1
  32. package/lib/types/client/avatar-image-store.d.ts +8 -0
  33. package/lib/types/client/avatar-image-store.d.ts.map +1 -1
  34. package/lib/types/client/conversation-resize-anchor.d.ts +12 -0
  35. package/lib/types/client/conversation-resize-anchor.d.ts.map +1 -0
  36. package/lib/types/client/interwoven-moments.d.ts.map +1 -1
  37. package/lib/types/client/recordings/ArkmeRecordingImportDialog.d.ts.map +1 -1
  38. package/lib/types/client/recordings/RecordingDesktopIcon.d.ts +19 -0
  39. package/lib/types/client/recordings/RecordingDesktopIcon.d.ts.map +1 -0
  40. package/lib/types/client/recordings/RecordingTranscriptButton.d.ts +3 -0
  41. package/lib/types/client/recordings/RecordingTranscriptButton.d.ts.map +1 -0
  42. package/lib/types/client/recordings/RecordingTranscriptComparison.d.ts +8 -0
  43. package/lib/types/client/recordings/RecordingTranscriptComparison.d.ts.map +1 -0
  44. package/lib/types/client/recordings/RecordingTranscriptForward.d.ts +8 -0
  45. package/lib/types/client/recordings/RecordingTranscriptForward.d.ts.map +1 -0
  46. package/lib/types/client/recordings/RecordingTranscriptSearch.d.ts +10 -0
  47. package/lib/types/client/recordings/RecordingTranscriptSearch.d.ts.map +1 -0
  48. package/lib/types/client/recordings/RecordingTranscriptText.d.ts +9 -0
  49. package/lib/types/client/recordings/RecordingTranscriptText.d.ts.map +1 -0
  50. package/lib/types/client/recordings/prepare-recording-transcript-comparison.d.ts +9 -0
  51. package/lib/types/client/recordings/prepare-recording-transcript-comparison.d.ts.map +1 -0
  52. package/lib/types/client/recordings/recording-forward-attempt.d.ts +18 -0
  53. package/lib/types/client/recordings/recording-forward-attempt.d.ts.map +1 -0
  54. package/lib/types/client/recordings/recording-forward-client.d.ts +5 -0
  55. package/lib/types/client/recordings/recording-forward-client.d.ts.map +1 -0
  56. package/lib/types/client/recordings/recording-transcript-comparison.d.ts +3 -0
  57. package/lib/types/client/recordings/recording-transcript-comparison.d.ts.map +1 -0
  58. package/lib/types/client/recordings/recording-transcript-search.d.ts +11 -0
  59. package/lib/types/client/recordings/recording-transcript-search.d.ts.map +1 -0
  60. package/lib/types/client/redesign/contacts/AlphabeticalContactList.d.ts.map +1 -1
  61. package/lib/types/client/redesign/contacts/ContactDirectorySurface.d.ts.map +1 -1
  62. package/lib/types/client/redesign/contacts/DirectoryDetailPane.d.ts.map +1 -1
  63. package/lib/types/client/redesign/contacts/TeamDetailPane.d.ts +5 -0
  64. package/lib/types/client/redesign/contacts/TeamDetailPane.d.ts.map +1 -0
  65. package/lib/types/client/redesign/contacts/contact-directory-state.d.ts +3 -0
  66. package/lib/types/client/redesign/contacts/contact-directory-state.d.ts.map +1 -1
  67. package/lib/types/client/redesign/contacts/contacts-tab-store.d.ts.map +1 -1
  68. package/lib/types/client/use-resizable-composer.d.ts +18 -0
  69. package/lib/types/client/use-resizable-composer.d.ts.map +1 -0
  70. package/lib/types/client/use-resizable-note-detail.d.ts +17 -0
  71. package/lib/types/client/use-resizable-note-detail.d.ts.map +1 -0
  72. package/lib/types/host-api.d.ts +3 -1
  73. package/lib/types/host-api.d.ts.map +1 -1
  74. package/lib/types/index.d.ts.map +1 -1
  75. package/lib/types/local-database.d.ts +4 -1
  76. package/lib/types/local-database.d.ts.map +1 -1
  77. package/lib/types/openapi-capability-gateway.d.ts +78 -0
  78. package/lib/types/openapi-capability-gateway.d.ts.map +1 -0
  79. package/lib/types/openapi-mcp/controller.d.ts +14 -7
  80. package/lib/types/openapi-mcp/controller.d.ts.map +1 -1
  81. package/lib/types/openapi-mcp/execution-fence.d.ts.map +1 -1
  82. package/lib/types/openapi-mcp/types.d.ts +20 -0
  83. package/lib/types/openapi-mcp/types.d.ts.map +1 -1
  84. package/lib/types/record-reedit-contract.d.ts +64 -0
  85. package/lib/types/record-reedit-contract.d.ts.map +1 -0
  86. package/lib/types/recording-forward-contract.d.ts +30 -0
  87. package/lib/types/recording-forward-contract.d.ts.map +1 -0
  88. package/lib/types/recording-forward-presentation.d.ts +6 -0
  89. package/lib/types/recording-forward-presentation.d.ts.map +1 -0
  90. package/lib/types/recording-import-contract.d.ts +3 -4
  91. package/lib/types/recording-import-contract.d.ts.map +1 -1
  92. package/lib/types/recording-import-shared.d.ts +19 -13
  93. package/lib/types/recording-import-shared.d.ts.map +1 -1
  94. package/lib/types/recording-presentation.d.ts +21 -5
  95. package/lib/types/recording-presentation.d.ts.map +1 -1
  96. package/lib/types/sdk/index.d.ts +20 -2
  97. package/lib/types/sdk/index.d.ts.map +1 -1
  98. package/lib/types/services/chat-service.d.ts.map +1 -1
  99. package/lib/types/services/contact-directory-service.d.ts +0 -2
  100. package/lib/types/services/contact-directory-service.d.ts.map +1 -1
  101. package/lib/types/services/media-service.d.ts.map +1 -1
  102. package/lib/types/services/profile-service.d.ts +5 -0
  103. package/lib/types/services/profile-service.d.ts.map +1 -1
  104. package/lib/types/services/record-service.d.ts +15 -0
  105. package/lib/types/services/record-service.d.ts.map +1 -1
  106. package/lib/types/services/recording-forward-gateway.d.ts +19 -0
  107. package/lib/types/services/recording-forward-gateway.d.ts.map +1 -0
  108. package/lib/types/services/recording-import-gateway.d.ts.map +1 -1
  109. package/lib/types/services/recording-service.d.ts +18 -1
  110. package/lib/types/services/recording-service.d.ts.map +1 -1
  111. package/lib/types/services/service.d.ts +6 -3
  112. package/lib/types/services/service.d.ts.map +1 -1
  113. package/lib/types/services/source-service.d.ts.map +1 -1
  114. package/lib/types/services/team-service.d.ts +55 -0
  115. package/lib/types/services/team-service.d.ts.map +1 -0
  116. package/lib/types/state-store.d.ts +4 -1
  117. package/lib/types/state-store.d.ts.map +1 -1
  118. package/lib/types/tools/business/index.d.ts.map +1 -1
  119. package/lib/types/tools/business/records/index.d.ts.map +1 -1
  120. package/lib/types/tools/business/records/reedit.d.ts +2 -0
  121. package/lib/types/tools/business/records/reedit.d.ts.map +1 -0
  122. package/lib/types/tools/ports/records.d.ts +5 -0
  123. package/lib/types/tools/ports/records.d.ts.map +1 -1
  124. package/lib/types/tools/prompts/business.d.ts.map +1 -1
  125. package/lib/types/tools/registry/registrar.d.ts.map +1 -1
  126. package/lib/types/tools/shared/conversational-confirmation.d.ts +2 -1
  127. package/lib/types/tools/shared/conversational-confirmation.d.ts.map +1 -1
  128. package/lib/types/types.d.ts +136 -7
  129. package/lib/types/types.d.ts.map +1 -1
  130. package/package.json +5 -5
@@ -0,0 +1,36 @@
1
+ # 头像失败诊断日志
2
+
3
+ 诊断标记:`[ArkmeAvatarDiag]`。仅追加失败日志,不修改头像展示、缓存、并发限制或重试策略。
4
+ 需要发布包含本改动的插件后才生效;不自动修改本机已安装包。
5
+
6
+ ## 下次复现时
7
+
8
+ 先保留日志、记录发生时间和目标用户,再重启客户端,避免丢失故障现场。
9
+ macOS 生产版日志位于 `~/Library/Application Support/Arkme Harness/`:
10
+
11
+ - `logs/desktop-startup.log`:Browser 头像加载失败,由桌面壳捕获 renderer console。
12
+ - `logs/harness.log`:Host 资料请求、头像引用和图片读取失败。
13
+ - 账号隔离实例的 Host 日志可能位于 `dsh-containers/<scope>/logs/harness.log`,具体以启动日志中的实例路径为准。
14
+
15
+ 先筛选 `[ArkmeAvatarDiag]`,再按发生时间、`viewerUserId` 和 `targetUserId` / `referenceTargetUserId` 对账。
16
+ 例如 1D3E 的目标用户 ID 是 `21698`。批量资料失败的目标位于 `targetUserIds`。
17
+
18
+ | event | 含义 |
19
+ | --- | --- |
20
+ | `profile_fetch_failed` | 批量资料请求失败,尚未生成头像引用 |
21
+ | `profile_missing` | 成功响应漏掉了请求的用户资料 |
22
+ | `profile_avatar_rejected` | 非空头像值被地址安全校验拒绝 |
23
+ | `private_avatar_seal_failed` | 私聊头像引用生成失败 |
24
+ | `image_read_failed` | Host 最终无法读取用户头像 |
25
+ | `image_load_failed` | Browser 头像共享缓存收到加载失败 |
26
+
27
+ `trigger=load` 表示普通加载,`revalidate` 表示重验证;不代表新增重试。
28
+ `hasCachedImage=false` 表示这次失败没有旧图片可保留,可能显示默认头像。
29
+ `durationMillis` 包含排队时间。`httpStatus` 是 Host 错误状态,`upstreamStatus`(存在时)是底层服务或图片下载的 HTTP 状态。
30
+ 引用中的 `referenceViewerUserId` / `referenceTargetUserId` 只是解析出的诊断提示,不参与授权校验。
31
+
32
+ 日志以单行 JSON 输出,避免桌面桥接把字段变成 `[object Object]`。不记录原始头像引用、签名 URL、图片内容、昵称、token、错误全文或堆栈。
33
+ 正常图片加载、未设置头像及合法 phone_avatar 默认头像不记录错误;共享并发读取只记一次,旧账号请求在切换后的预期取消不记 Browser 错误。
34
+
35
+ 已确认的恢复慢机制仍保持原样:首次加载失败后,相同引用的普通渲染不触发重试;周期维护约 10–12 分钟。
36
+ 本次日志用于确认真实复现的首次失败阶段,不预先认定为超时或鉴权问题。
@@ -77,6 +77,23 @@ if ((await arkme.capabilities()).features.extensionPreviews === true && userConf
77
77
 
78
78
  The SDK communicates only with the same-origin Provider route. Consumers must not read OS credential-store entries, SQLite files, state files, or tokens directly.
79
79
 
80
+ ## Team capability
81
+
82
+ `capabilities().features.teamDirectory`, `teamMembers`, and `teamGovernance` advertise the complete Team contract. Consumers call `listTeams()` or `resolveTeams()` to obtain an opaque, account-scoped `teamRef`, then pass that reference unchanged to `listTeamMembers()`. A display name or public Jotmo ID must never be substituted for `teamRef`; member `userRef` and Team `teamRef` are distinct reference types and are not interchangeable.
83
+
84
+ `createTeams()` requires one stable idempotency key per item. `joinTeamsByJotmoID()` accepts only the exact public Team Jotmo ID and reports whether the current account is the owner, was already a member, or joined now. Both mutations must originate from a current same-origin human UI action. Consumers must not receive, persist, or reconstruct the managed OpenAPI credential, backend numeric IDs, owner request IDs, or internal cursors.
85
+
86
+ Member identity is an enrichment owned outside Team membership. `identityState=unavailable` or `incomplete` keeps the authoritative membership row visible while telling the Consumer not to invent a display identity. A member may include a Host-resolved `avatarRef` or `avatarFallback`; avatar enrichment failure never removes the authoritative membership row. Consumers discard Team pages and cursors on account change, propagate `AbortSignal`, and retry from a fresh list after an authorization or lifecycle error.
87
+
88
+ | Capability | Built-in UI | Browser SDK | DSH model Tool | Shared owner |
89
+ | --- | --- | --- | --- | --- |
90
+ | List/resolve my Teams | Contacts → Team directory | `listTeams()`, `resolveTeams()` | `list_my_teams`, `resolve_my_teams` | OpenAPI Team capability registry → Team query owner |
91
+ | List Team members | Team detail with loading, partial identity, pagination and retry states | `listTeamMembers()` | `list_team_members` | OpenAPI Team capability registry → Team membership owner + public identity batch reader |
92
+ | Create Team | No built-in entry | `createTeams()` from a confirmed same-origin UI | `create_teams` after explicit user intent | OpenAPI Team capability registry → existing Team create command |
93
+ | Join by public ID | No built-in entry | `joinTeamsByJotmoID()` from a confirmed same-origin UI | `join_teams_by_jotmo_id` after explicit user intent | OpenAPI Team capability registry → existing Team join command |
94
+
95
+ The built-in UI and Browser SDK enter through the same injected `TeamServicePort`; model Tools use the OpenAPI MCP projection of the same capability definitions. REST and MCP therefore share one authorization, validation, idempotency, cursor, error, and result contract without routing model traffic through the browser Host.
96
+
80
97
  `capabilities().features.myExtensions` advertises the current-account extension inventory. `myExtensions()` merges only Host-approved live Cordis, Profile-resolved and cloud-owned facts; consumers must use its states and `publish` result without rescanning Profile files or inferring ownership from names. Every publishable item carries one Host-derived route: `dynamic-cordis-v2` means `artifactContractVersion=2` and `artifactKind=dsh-bundle-tgz` for a live current-session Dynamic Cordis Package; `profile-native-v3` means `artifactContractVersion=3` and `artifactKind=dsh-native-package-tgz` for an installed or Profile-local DSH Bundle. Callers pass `ownedRef` unchanged and never choose a mode themselves. A GitHub repository URL is optional provenance metadata, not a third upload route, publication credential or cloud clone/build request. A third-party registry/Git dependency appears only when its actually resolved package declares `dsh.bundle.patch`; it is a V3 publication candidate rather than an assertion that the current account authored the upstream code. `publisher_role` is server-owned: explicit values win, while historical rows without a role resolve to importer only when they have GitHub provenance. Consumers never submit this role. `ownedRef` is short-lived and account-bound. `publishMyExtension()` requires a current explicit human request and can publish only the exact Cordis Package, resolved Bundle directory or local Bundle tgz behind that ref; consumers must refresh the list after expiry or account switch. Profile paths, Agent IDs, source archives, artifact upload requests and signing material never enter this contract.
81
98
 
82
99
  Plugin update discovery and acknowledgement are lifecycle concerns owned by the bundled Arkme UI. They are intentionally absent from the public Browser SDK, Host `arkmeData` service and model tool catalog. Consumers must not invoke raw `plugin.update.*` operations or attempt to mutate a DSH profile.
@@ -129,7 +146,7 @@ Interaction flow:
129
146
  点击微信 -> 显示 Flutter AppBridge OAuth 缺失说明,不发起伪请求
130
147
  ```
131
148
 
132
- `readImage(avatarRef)` resolves an opaque image reference returned by `profile()` or `listSources()`. Private chats expose one optional `avatarRef`. Groups expose the preferred additive `groupAvatar` presentation plus legacy `avatarRefs`: `groupAvatar.slots` preserves the server-selected order for up to five members, including safe phone-default or generic fallbacks when a real image is absent, while legacy `avatarRefs` contains only resolvable real images. `memberCount`, `strategy`, and `computedAtMillis` describe the snapshot without exposing member or session identities. The Provider refreshes an authorized public profile image before downloading it and returns bounded PNG/JPEG/WebP/GIF base64 bytes; signed URLs, STS credentials and bearer tokens never enter the browser contract. Consumers must use `imageDataUrl()` (or decode the payload themselves) instead of concatenating OSS URLs or fetching an avatar reference directly.
149
+ `readImage(avatarRef)` resolves an opaque image reference returned by `profile()`, `listSources()` or `listTeamMembers()`. Private chats and Team members expose one optional `avatarRef`. Groups expose the preferred additive `groupAvatar` presentation plus legacy `avatarRefs`: `groupAvatar.slots` preserves the server-selected order for up to five members, including safe phone-default or generic fallbacks when a real image is absent, while legacy `avatarRefs` contains only resolvable real images. `memberCount`, `strategy`, and `computedAtMillis` describe the snapshot without exposing member or session identities. The Provider refreshes an authorized public profile image before downloading it and returns bounded PNG/JPEG/WebP/GIF base64 bytes; signed URLs, STS credentials and bearer tokens never enter the browser contract. Consumers must use `imageDataUrl()` (or decode the payload themselves) instead of concatenating OSS URLs or fetching an avatar reference directly.
133
150
 
134
151
  `capabilities().features.worldFeed === true` advertises the additive World read contract. `worldFeed()` returns account-bound opaque `recordRef`, `avatarRef`, and `imageRefs` values; it never exposes stable record IDs, bearer tokens, `file_asset://` references, or signed OSS URLs. File-asset avatars are batch-resolved by the Provider. Resolution failure is best-effort and must keep the feed readable with its declared fallback avatar.
135
152
 
@@ -0,0 +1,45 @@
1
+ # Resizable chat composer verification
2
+
3
+ - Base: official `origin/dev`, `4b8b40346be695774900997da4d6ce2f5a05e970`.
4
+ - Branch: `codex/c20260904-resizable-composer`.
5
+ - Scope: shared Arkme chat composer, client presentation only. No changes to DSH, plugin version, authentication or message sending.
6
+ - Behavior: 6px top drag target, vertical resize cursor, 1px green border while hovered/dragged/focused, local browser height preference, double-click/Enter reset, arrow/Home/End keyboard controls, viewport height limit, pointer capture and cursor cleanup.
7
+
8
+ ## Capability coverage
9
+
10
+ | Surface | Result |
11
+ | --- | --- |
12
+ | UI | Implemented and exercised in the installed plugin on Windows. |
13
+ | Tools | N/A: visual browser layout preference; no new business operation. |
14
+ | SDK | N/A: no Host API or shared business capability introduced. |
15
+ | Host | N/A: no Host storage or routes; localStorage contains only an editor height. |
16
+
17
+ ## Verification
18
+
19
+ - Relevant pre-change composer tests: 8 passed.
20
+ - Composer presentation/draft tests after integration: 18 passed.
21
+ - Resize, auth ownership and retained-surface tests after SSR fix: 15 passed.
22
+ - TypeScript check and diff whitespace check passed.
23
+ - Full suite: 3106 passed, 26 failed, 4 skipped; 16 failed suites and one additional suite-load failure within those suites. Not an all-green result. Remaining failures include Windows ACL command/module errors, fixture/source newline checksums, packaging/workflow expectations and timeouts. They have not all been independently reproduced on a clean baseline.
24
+ - Standard build passed after temporarily normalizing the credential helper's six checksum inputs to LF. Original checkout line endings were restored afterward; no helper source changes are part of this patch.
25
+ - Generated npm tarball, verified its client bundle hash matches the build, and installed it through official DSH `0.1.1-rc.1` into a fresh isolated profile. No link-based installation or DSH source edits.
26
+ - Actual browser: upward drag changed editor height from 38px to 191px; green rounded border visible; reload and reopening conversation restored 191px; double-click reset to 38px. No test message sent.
27
+ - Windows verified. macOS/Linux not exercised; this change adds no native/platform-specific code.
28
+
29
+ The earlier sidebar-width PR is separate and is not included in this branch's dev baseline. No production deployment or replacement of the user's running instance is included.
30
+
31
+ ## Follow-up: message viewport anchoring
32
+
33
+ - Confirmed missing behavior: a shrinking message viewport did not preserve its previous bottom distance, leaving latest messages below the visible region.
34
+ - Added a viewport ResizeObserver: when previously within 80px of the bottom, keep the latest message visible; while reading history, preserve scrollTop. Handles resize-generated scroll events arriving before the observer, reset/expansion, short lists and observer disposal.
35
+ - Composer bounds now use the actual chat area's available height; observers reconnect when the composer appears or the conversation changes. Switching conversation clears active drag/hover/focus state. Keyboard focus and pointer hover are tracked independently.
36
+ - Relevant resize/auth/retained-surface tests: 18 passed. Typecheck and standard build passed (same temporary LF build normalization described above).
37
+ - Full follow-up suite: 3108 passed, 27 failed, 4 skipped. Includes a recording-service timeout under the full parallel run; not an all-green result.
38
+ - Installed a new immutable tarball into a separate official DSH profile; preserved the previous preview instance.
39
+ - Browser verified: composer grew from 96px to 284px and the latest message moved upward by the same 188px, keeping the gap above the input. While reading older messages, increasing input height by 200px retained the same messages at the same top positions instead of jumping to the latest message.
40
+
41
+ ## Pre-PR review
42
+
43
+ - Reviewed the complete integration, pointer lifecycle, optional storage, observer cleanup, history anchoring, scope changes and height bounds. No new blocking finding identified.
44
+ - Re-fetched official dev; base remains unchanged with no integration conflict.
45
+ - Re-ran seven targeted suites: 36 tests passed. The separate recording-service rerun from the follow-up passed; full-suite failures above remain disclosed rather than presumed resolved.
@@ -0,0 +1,41 @@
1
+ # Resizable note detail
2
+
3
+ - Base: official dev `4b8b40346be695774900997da4d6ce2f5a05e970`.
4
+ - Branch: `codex/c20260904-resizable-detail`.
5
+ - Scope: shared right-edge overlay for normal/forwarded quick notes and interwoven details. Does not change message sending, underlying conversation layout, versions, root README or DSH sources.
6
+ - Left-edge 10px pointer target, 3px green highlight, ew-resize cursor; pointer capture, cancellation/unmount cleanup, keyboard support, double-click reset and optional localStorage width memory.
7
+ - Requested parity: default/minimum width 405px, maximum max(405px, 60% of available width). Containers narrower than 405px cap both bounds to the available width to prevent overflow. Previously saved preferences are clamped to the new bounds.
8
+
9
+ ## Coverage
10
+
11
+ | Surface | Evidence |
12
+ | --- | --- |
13
+ | UI | Shared resize hook integrated into both detail owners; unit and drawer tests. |
14
+ | Tools | N/A: no business capability, browser layout preference only. |
15
+ | SDK | N/A: no public service/API changes. |
16
+ | Host | N/A: no Host routes or persistence changes. |
17
+
18
+ - Before change: 17 drawer tests passed. Final targeted coverage: 22 tests passed across identity, resize and drawer suites.
19
+ - Typecheck passed. Standard build passed after temporary LF normalization of the existing credential-helper checksum inputs; original line endings restored, no helper source diff.
20
+ - Latest full-suite run: 3102 passed, 30 failed, 4 skipped. One documentation identity failure was subsequently corrected and the identity suite passed in the targeted rerun. Remaining failures include Windows ACL/module issues, fixture checksums and other areas; not all were independently reproduced on an untouched baseline. Full-suite status is not green.
21
+ - Packaged tarball installed via official DSH 0.1.1-rc.1 into a new isolated profile; existing preview instances preserved. No link installation or production deployment.
22
+ - Windows is the exercised platform; macOS/Linux not verified.
23
+ - Installed-package browser verification: final bounds verified at 405px minimum/default and approximately 554px maximum for a 924px container (60%). Green full-height divider confirmed. Earlier persistence verification confirmed the dragged width survived closing/reopening the detail. No messages sent or note data changed.
24
+ - Scope review: no blocking issue identified in the resize change. Emoji rendering is untouched; the preview base does not include the separate sidebar emoji asset fix. This PR intentionally does not merge that work.
25
+
26
+ ## Updated dev integration (2026-09-04)
27
+
28
+ - The earlier preview above is superseded. Merged official dev `4f093d0cff3ae98588ee8d9fc85c7bcf5d247696` without conflicts. The remote fetch configuration tracked only master, so fetching dev alone had left the old origin/dev reference unchanged; this run explicitly refreshed that reference.
29
+ - Sidebar preview rendering now inherits dev's `ArkmeRichText` with 20px application emoji assets and matches master `8fea757ff81170311393036240a0c292afd3737a` in the emoji implementation. No separate emoji feature patch or version bump was authored; package metadata is inherited from dev.
30
+ - Reviewed the complete five-file diff against updated dev, including the automatically merged detail shell. The resize scope remains client-only; Tools/SDK/Host remain N/A.
31
+ - Targeted resize/drawer/sidebar/identity suites: 28 tests passed. Typecheck and build passed. The existing credential-helper source files were temporarily normalized to LF for build verification and restored byte-for-byte afterward.
32
+ - Full suite: 3549 passed, 55 failed, 4 skipped (22 failed suites). This is not an all-green result and the failures are not all proven pre-existing. No unrelated test fixes are included.
33
+ - A fresh isolated official DSH 0.1.1-rc.1 profile installed the immutable tarball. Installed client SHA256 matches the build. Windows browser verified detail width 405px -> 495px by pointer drag and back to 405px on Enter; targeted 28 tests passed again after review. Sidebar renderer and emoji assets are unchanged from current master. No messages sent or note content changed.
34
+
35
+ ## Review follow-up: regression coverage and baseline comparison
36
+
37
+ - Added five tests covering parent resize/recovery and observer cleanup, pointer cancellation, lost pointer capture, unavailable storage, all resize keys and the window-resize fallback without ResizeObserver.
38
+ - Compared full suites against an untouched worktree at dev `4f093d0cff3ae98588ee8d9fc85c7bcf5d247696`. This identified two PR-specific outdated assertions still requiring 372px in interwoven and forwarded details. Updated both to the intended 405px default, container cap and accessible resize separator; retained their other content and authorization assertions.
39
+ - Expanded relevant suites: 88 passed. Typecheck and diff check passed. Review found no remaining confirmed resize implementation defect. No runtime code, emoji assets, metadata or version changes in this follow-up; the existing installed client remains byte-identical to the build.
40
+ - Clean dev full run: 3546 passed, 56 failed, 4 skipped. Final PR full run: 3552 passed, 57 failed, 4 skipped. All 56 baseline failing test identities also fail in the PR. The one additional recording-service timeout passes when rerun alone, and its implementation/test files are identical to dev. The suite-load failure is `spawnSync pnpm ENOENT` on both revisions. This comparison does not claim the whole repository is green or repair unrelated baseline issues.
41
+ - Remaining platform evidence limitation: macOS/Linux were not exercised. Windows pointer interaction evidence from the unchanged runtime above remains applicable.