@senguoyun/dsh-arkme 0.1.13 → 0.1.15

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 (233) hide show
  1. package/docs/consumer-plugin-contract.md +3 -1
  2. package/docs/extension-market-controls.md +46 -7
  3. package/docs/gui-production-integration.md +10 -9
  4. package/lib/client.js +45125 -43501
  5. package/lib/client.js.map +1 -1
  6. package/lib/extension-profile-restart-helper.js +2 -2
  7. package/lib/index.js +1180 -442
  8. package/lib/{install-store-Sn3Ccxfu.js → install-store-Beau1y-o.js} +12 -6
  9. package/lib/persistent-extension.js +1 -1
  10. package/lib/{persistent-runtime-Cki0XC3L.js → persistent-runtime-D_hNgTX3.js} +1479 -249
  11. package/lib/{plugin-updater-helper-CiPlNqBc.js → plugin-updater-helper-BEYBTOld.js} +5 -5
  12. package/lib/plugin-updater-helper.js +1 -1
  13. package/lib/{profile-package-manager-DvzGgkqe.js → profile-package-manager-DwuQu8ZL.js} +91 -3
  14. package/lib/sdk.js +74 -17
  15. package/lib/types/arkme-service.d.ts +62 -9
  16. package/lib/types/arkme-service.d.ts.map +1 -1
  17. package/lib/types/bot-avatar-ref.d.ts +3 -0
  18. package/lib/types/bot-avatar-ref.d.ts.map +1 -0
  19. package/lib/types/client/ArkmeArkoSurface.d.ts.map +1 -1
  20. package/lib/types/client/ArkmeAvatar.d.ts.map +1 -1
  21. package/lib/types/client/ArkmeBotCreateDialog.d.ts +6 -0
  22. package/lib/types/client/ArkmeBotCreateDialog.d.ts.map +1 -0
  23. package/lib/types/client/ArkmeCalendarSurface.d.ts +4 -1
  24. package/lib/types/client/ArkmeCalendarSurface.d.ts.map +1 -1
  25. package/lib/types/client/ArkmeChatMemberActions.d.ts +48 -0
  26. package/lib/types/client/ArkmeChatMemberActions.d.ts.map +1 -0
  27. package/lib/types/client/ArkmeConversationSurface.d.ts +8 -18
  28. package/lib/types/client/ArkmeConversationSurface.d.ts.map +1 -1
  29. package/lib/types/client/ArkmeExtensionPublishDialog.d.ts.map +1 -1
  30. package/lib/types/client/ArkmeExtensionReviews.d.ts +4 -2
  31. package/lib/types/client/ArkmeExtensionReviews.d.ts.map +1 -1
  32. package/lib/types/client/ArkmeFooterDropdown.d.ts.map +1 -1
  33. package/lib/types/client/ArkmeGroupChatControls.d.ts +3 -1
  34. package/lib/types/client/ArkmeGroupChatControls.d.ts.map +1 -1
  35. package/lib/types/client/ArkmeLogin.d.ts.map +1 -1
  36. package/lib/types/client/ArkmeMarketplace.d.ts +31 -6
  37. package/lib/types/client/ArkmeMarketplace.d.ts.map +1 -1
  38. package/lib/types/client/ArkmeMentionTextarea.d.ts +13 -0
  39. package/lib/types/client/ArkmeMentionTextarea.d.ts.map +1 -0
  40. package/lib/types/client/ArkmePersistentShell.d.ts +20 -0
  41. package/lib/types/client/ArkmePersistentShell.d.ts.map +1 -0
  42. package/lib/types/client/ArkmeProductNavigation.d.ts +4 -3
  43. package/lib/types/client/ArkmeProductNavigation.d.ts.map +1 -1
  44. package/lib/types/client/ArkmeQuickAdd.d.ts.map +1 -1
  45. package/lib/types/client/ArkmeRecordingSurface.d.ts +3 -109
  46. package/lib/types/client/ArkmeRecordingSurface.d.ts.map +1 -1
  47. package/lib/types/client/ArkmeRichContent.d.ts +7 -1
  48. package/lib/types/client/ArkmeRichContent.d.ts.map +1 -1
  49. package/lib/types/client/ArkmeSettingsRow.d.ts +1 -1
  50. package/lib/types/client/ArkmeSettingsRow.d.ts.map +1 -1
  51. package/lib/types/client/ArkmeSettingsSurface.d.ts +4 -1
  52. package/lib/types/client/ArkmeSettingsSurface.d.ts.map +1 -1
  53. package/lib/types/client/ArkmeSidebar.d.ts +9 -1
  54. package/lib/types/client/ArkmeSidebar.d.ts.map +1 -1
  55. package/lib/types/client/ArkmeStartupAuthGate.d.ts +4 -2
  56. package/lib/types/client/ArkmeStartupAuthGate.d.ts.map +1 -1
  57. package/lib/types/client/ArkmeVirtualWorkspace.d.ts +9 -9
  58. package/lib/types/client/ArkmeVirtualWorkspace.d.ts.map +1 -1
  59. package/lib/types/client/ArkmeVoiceprintSurface.d.ts +61 -0
  60. package/lib/types/client/ArkmeVoiceprintSurface.d.ts.map +1 -0
  61. package/lib/types/client/ArkmeWorldSurface.d.ts +104 -4
  62. package/lib/types/client/ArkmeWorldSurface.d.ts.map +1 -1
  63. package/lib/types/client/DeepSeekHarnessSurface.d.ts +6 -0
  64. package/lib/types/client/DeepSeekHarnessSurface.d.ts.map +1 -0
  65. package/lib/types/client/api.d.ts +1 -1
  66. package/lib/types/client/api.d.ts.map +1 -1
  67. package/lib/types/client/arkme-emoji.d.ts +3 -0
  68. package/lib/types/client/arkme-emoji.d.ts.map +1 -0
  69. package/lib/types/client/composer-draft-store.d.ts +18 -0
  70. package/lib/types/client/composer-draft-store.d.ts.map +1 -1
  71. package/lib/types/client/composer-focus.d.ts +8 -0
  72. package/lib/types/client/composer-focus.d.ts.map +1 -0
  73. package/lib/types/client/conversation-composer-presentation.d.ts +47 -0
  74. package/lib/types/client/conversation-composer-presentation.d.ts.map +1 -0
  75. package/lib/types/client/conversation-memory-cache.d.ts +30 -1
  76. package/lib/types/client/conversation-memory-cache.d.ts.map +1 -1
  77. package/lib/types/client/index.d.ts +6 -4
  78. package/lib/types/client/index.d.ts.map +1 -1
  79. package/lib/types/client/interwoven-moments.d.ts +2 -1
  80. package/lib/types/client/interwoven-moments.d.ts.map +1 -1
  81. package/lib/types/client/marketplace-sort-preference.d.ts +5 -0
  82. package/lib/types/client/marketplace-sort-preference.d.ts.map +1 -0
  83. package/lib/types/client/navigation-cache.d.ts +4 -0
  84. package/lib/types/client/navigation-cache.d.ts.map +1 -1
  85. package/lib/types/client/provider-instance-runtime.d.ts +20 -0
  86. package/lib/types/client/provider-instance-runtime.d.ts.map +1 -0
  87. package/lib/types/client/redesign/ArkmeRootFrame.d.ts +19 -0
  88. package/lib/types/client/redesign/ArkmeRootFrame.d.ts.map +1 -0
  89. package/lib/types/client/redesign/ArkmeTaskSurface.d.ts +15 -0
  90. package/lib/types/client/redesign/ArkmeTaskSurface.d.ts.map +1 -0
  91. package/lib/types/client/redesign/ArkmeWorkspaceDialog.d.ts +9 -0
  92. package/lib/types/client/redesign/ArkmeWorkspaceDialog.d.ts.map +1 -0
  93. package/lib/types/client/redesign/layout-controller.d.ts +17 -0
  94. package/lib/types/client/redesign/layout-controller.d.ts.map +1 -0
  95. package/lib/types/client/redesign/styles.d.ts +3 -0
  96. package/lib/types/client/redesign/styles.d.ts.map +1 -0
  97. package/lib/types/client/redesign/task-session.d.ts +14 -0
  98. package/lib/types/client/redesign/task-session.d.ts.map +1 -0
  99. package/lib/types/client/redesign/theme-presenter.d.ts +10 -0
  100. package/lib/types/client/redesign/theme-presenter.d.ts.map +1 -0
  101. package/lib/types/client/related-recordings.d.ts +1 -0
  102. package/lib/types/client/related-recordings.d.ts.map +1 -1
  103. package/lib/types/client/slots-contract.d.ts +2 -2
  104. package/lib/types/client/slots-contract.d.ts.map +1 -1
  105. package/lib/types/client/source-list.d.ts +4 -0
  106. package/lib/types/client/source-list.d.ts.map +1 -1
  107. package/lib/types/client/ui-controller.d.ts +20 -9
  108. package/lib/types/client/ui-controller.d.ts.map +1 -1
  109. package/lib/types/client/voiceprint-enrollment-client.d.ts +12 -0
  110. package/lib/types/client/voiceprint-enrollment-client.d.ts.map +1 -0
  111. package/lib/types/client/voiceprint-recorder.d.ts +23 -0
  112. package/lib/types/client/voiceprint-recorder.d.ts.map +1 -0
  113. package/lib/types/client/world-voiceprint-expectation-copy.d.ts +7 -0
  114. package/lib/types/client/world-voiceprint-expectation-copy.d.ts.map +1 -0
  115. package/lib/types/client/world-voiceprint-playback.d.ts +41 -0
  116. package/lib/types/client/world-voiceprint-playback.d.ts.map +1 -0
  117. package/lib/types/extensions/install-store.d.ts +1 -0
  118. package/lib/types/extensions/install-store.d.ts.map +1 -1
  119. package/lib/types/extensions/manager.d.ts +5 -0
  120. package/lib/types/extensions/manager.d.ts.map +1 -1
  121. package/lib/types/extensions/owned-inventory.d.ts +30 -2
  122. package/lib/types/extensions/owned-inventory.d.ts.map +1 -1
  123. package/lib/types/extensions/owned-refs.d.ts +1 -0
  124. package/lib/types/extensions/owned-refs.d.ts.map +1 -1
  125. package/lib/types/extensions/owned-store.d.ts +9 -0
  126. package/lib/types/extensions/owned-store.d.ts.map +1 -1
  127. package/lib/types/extensions/profile-installer.d.ts.map +1 -1
  128. package/lib/types/extensions/publish-client.d.ts +2 -0
  129. package/lib/types/extensions/publish-client.d.ts.map +1 -1
  130. package/lib/types/extensions/publisher-role.d.ts +9 -0
  131. package/lib/types/extensions/publisher-role.d.ts.map +1 -0
  132. package/lib/types/extensions/types.d.ts +11 -0
  133. package/lib/types/extensions/types.d.ts.map +1 -1
  134. package/lib/types/host-api.d.ts +1 -1
  135. package/lib/types/host-api.d.ts.map +1 -1
  136. package/lib/types/index.d.ts +2 -2
  137. package/lib/types/index.d.ts.map +1 -1
  138. package/lib/types/local-database.d.ts +1 -0
  139. package/lib/types/local-database.d.ts.map +1 -1
  140. package/lib/types/openclaw/secret-provider.d.ts.map +1 -1
  141. package/lib/types/outgoing-call-assets.d.ts.map +1 -1
  142. package/lib/types/plugin-update-install-state.d.ts.map +1 -1
  143. package/lib/types/plugin-update-state.d.ts.map +1 -1
  144. package/lib/types/plugin-update.d.ts +6 -0
  145. package/lib/types/plugin-update.d.ts.map +1 -1
  146. package/lib/types/private-filesystem.d.ts +5 -0
  147. package/lib/types/private-filesystem.d.ts.map +1 -0
  148. package/lib/types/recording-presentation.d.ts +2 -2
  149. package/lib/types/recording-presentation.d.ts.map +1 -1
  150. package/lib/types/sdk/index.d.ts +31 -8
  151. package/lib/types/sdk/index.d.ts.map +1 -1
  152. package/lib/types/services/bot-service.d.ts.map +1 -1
  153. package/lib/types/services/chat-realtime-service.d.ts +1 -1
  154. package/lib/types/services/chat-realtime-service.d.ts.map +1 -1
  155. package/lib/types/services/chat-service.d.ts +21 -2
  156. package/lib/types/services/chat-service.d.ts.map +1 -1
  157. package/lib/types/services/contact-service.d.ts +2 -0
  158. package/lib/types/services/contact-service.d.ts.map +1 -1
  159. package/lib/types/services/group-service.d.ts.map +1 -1
  160. package/lib/types/services/record-service.d.ts +2 -1
  161. package/lib/types/services/record-service.d.ts.map +1 -1
  162. package/lib/types/services/recording-service.d.ts +2 -4
  163. package/lib/types/services/recording-service.d.ts.map +1 -1
  164. package/lib/types/services/service.d.ts +5 -2
  165. package/lib/types/services/service.d.ts.map +1 -1
  166. package/lib/types/services/source-service.d.ts.map +1 -1
  167. package/lib/types/services/voiceprint-service.d.ts +79 -0
  168. package/lib/types/services/voiceprint-service.d.ts.map +1 -0
  169. package/lib/types/services/world-service.d.ts +41 -6
  170. package/lib/types/services/world-service.d.ts.map +1 -1
  171. package/lib/types/state-store.d.ts.map +1 -1
  172. package/lib/types/tools/business/bots/create.d.ts.map +1 -1
  173. package/lib/types/tools/business/conversation/index.d.ts.map +1 -1
  174. package/lib/types/tools/business/conversation/member-records.d.ts +3 -0
  175. package/lib/types/tools/business/conversation/member-records.d.ts.map +1 -0
  176. package/lib/types/tools/business/index.d.ts.map +1 -1
  177. package/lib/types/tools/business/recordings/index.d.ts +1 -2
  178. package/lib/types/tools/business/recordings/index.d.ts.map +1 -1
  179. package/lib/types/tools/business/voiceprint/grants.d.ts +2 -0
  180. package/lib/types/tools/business/voiceprint/grants.d.ts.map +1 -0
  181. package/lib/types/tools/business/voiceprint/index.d.ts +3 -0
  182. package/lib/types/tools/business/voiceprint/index.d.ts.map +1 -0
  183. package/lib/types/tools/business/voiceprint/invite.d.ts +2 -0
  184. package/lib/types/tools/business/voiceprint/invite.d.ts.map +1 -0
  185. package/lib/types/tools/business/voiceprint/recognized-invite.d.ts +2 -0
  186. package/lib/types/tools/business/voiceprint/recognized-invite.d.ts.map +1 -0
  187. package/lib/types/tools/business/voiceprint/recognized-people.d.ts +2 -0
  188. package/lib/types/tools/business/voiceprint/recognized-people.d.ts.map +1 -0
  189. package/lib/types/tools/business/voiceprint/restore.d.ts +2 -0
  190. package/lib/types/tools/business/voiceprint/restore.d.ts.map +1 -0
  191. package/lib/types/tools/business/voiceprint/revoke.d.ts +2 -0
  192. package/lib/types/tools/business/voiceprint/revoke.d.ts.map +1 -0
  193. package/lib/types/tools/business/voiceprint/status.d.ts +2 -0
  194. package/lib/types/tools/business/voiceprint/status.d.ts.map +1 -0
  195. package/lib/types/tools/business/world/index.d.ts +2 -0
  196. package/lib/types/tools/business/world/index.d.ts.map +1 -1
  197. package/lib/types/tools/business/world/user.d.ts +2 -0
  198. package/lib/types/tools/business/world/user.d.ts.map +1 -0
  199. package/lib/types/tools/business/world/voiceprint-social-context.d.ts +2 -0
  200. package/lib/types/tools/business/world/voiceprint-social-context.d.ts.map +1 -0
  201. package/lib/types/tools/extensions/index.d.ts.map +1 -1
  202. package/lib/types/tools/ports/conversations.d.ts +10 -1
  203. package/lib/types/tools/ports/conversations.d.ts.map +1 -1
  204. package/lib/types/tools/ports/index.d.ts +3 -2
  205. package/lib/types/tools/ports/index.d.ts.map +1 -1
  206. package/lib/types/tools/ports/recordings.d.ts +2 -3
  207. package/lib/types/tools/ports/recordings.d.ts.map +1 -1
  208. package/lib/types/tools/ports/voiceprint.d.ts +37 -0
  209. package/lib/types/tools/ports/voiceprint.d.ts.map +1 -0
  210. package/lib/types/tools/ports/world.d.ts +10 -1
  211. package/lib/types/tools/ports/world.d.ts.map +1 -1
  212. package/lib/types/tools/prompts/business.d.ts.map +1 -1
  213. package/lib/types/tools/registry/registrar.d.ts.map +1 -1
  214. package/lib/types/types.d.ts +150 -16
  215. package/lib/types/types.d.ts.map +1 -1
  216. package/lib/types/voiceprint-routes.d.ts +11 -0
  217. package/lib/types/voiceprint-routes.d.ts.map +1 -0
  218. package/lib/types/voiceprint-wav.d.ts +6 -0
  219. package/lib/types/voiceprint-wav.d.ts.map +1 -0
  220. package/package.json +7 -4
  221. package/assets/desktop_call/avatar-lin-xiaoman.jpeg +0 -0
  222. package/assets/desktop_call/avatar-mother.jpg +0 -0
  223. package/assets/desktop_call/avatar-self.png +0 -0
  224. package/assets/desktop_call/call-add-linear.svg +0 -13
  225. package/assets/desktop_call/icon-scan-add-contact.svg +0 -4
  226. package/assets/desktop_call/profile-circle-linear.svg +0 -11
  227. package/assets/desktop_call/user-add-linear.svg +0 -15
  228. package/lib/types/client/ArkmeCallHistorySurface.d.ts +0 -57
  229. package/lib/types/client/ArkmeCallHistorySurface.d.ts.map +0 -1
  230. package/lib/types/client/demo-audio.d.ts +0 -2
  231. package/lib/types/client/demo-audio.d.ts.map +0 -1
  232. package/lib/types/client/personal-test-edition.d.ts +0 -17
  233. package/lib/types/client/personal-test-edition.d.ts.map +0 -1
@@ -77,12 +77,14 @@ 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
- `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 must display that route and pass `ownedRef` unchanged rather than choosing a mode themselves. A GitHub repository URL is provenance metadata, not a third upload route or a 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. Public publication still requires accurate GitHub provenance and redistribution rights. `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.
80
+ `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
81
 
82
82
  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.
83
83
 
84
84
  `capabilities().features.extensionManagement === true` advertises market queries, install preview, the installed-extension projection and desired enable-state contract. `searchExtensions()` and `extensionDetail()` return the same V1/V2/V3 version projection as the built-in UI and model Tool. `extensionInstallPreview()` is read-only and returns `artifact_contract_version`, `artifact_kind`, `execution_model`, `requires_native_confirmation` and server-derived `native_capabilities`; a Consumer must show those capabilities and obtain explicit human confirmation before starting installation through its product flow. `installedExtensions()` omits artifact paths, Profile package names and Dynamic Cordis IDs while retaining V3 contract/capability facts. `setExtensionEnabled()` retains the verified artifact and installed version; its result distinguishes desired `enabled`, observed Host `active`, and `restart_required`. Consumers must call it only from a current explicit human action, must display restart/error results, and must never turn an enable/disable control into uninstall. The Provider remains the only writer of the Profile manifest and install-state database.
85
85
 
86
+ `deleteExtension()` is the owner-only destructive lifecycle action and likewise requires a current explicit human action. The registry keeps soft-deleted rows and artifacts only for controlled recovery; successful user-visible deletion removes catalog and owned projections, current installation/runtime state, linked Profile/Cordis sources, lineage rows, and outstanding opaque source references. Consumers must remove all local projections immediately and display `restart_required` instead of presenting the retained registry data as an active or installed extension.
87
+
86
88
  `capabilities().features.extensionIcons === true` advertises the extension-owned icon contract. `setExtensionIcon()` accepts a user-selected PNG, JPEG or WebP `Blob` up to 2 MiB for an extension owned by the current account. `extensionIconUrl()` turns the catalog's opaque current `icon_ref` into a same-origin image URL. Consumers must refresh catalog state after replacement, render the generic extension mark when an icon is missing or unreadable, and must never persist an old ref or receive, reconstruct, or fetch an object-storage URL directly.
87
89
 
88
90
  `capabilities().features.extensionPreviews === true` advertises the extension-owned preview gallery MVP. `addExtensionPreview()` accepts a user-selected PNG, JPEG or WebP `Blob` up to 5 MiB. A gallery contains at most 20 ordered items; index zero is the cover. `deleteExtensionPreview()` and `reorderExtensionPreviews()` require the current `preview_revision`; a conflict means the Consumer must refresh and ask the user again instead of silently overwriting the newer gallery. Render refs only through `extensionPreviewUrl()`. The built-in marketplace detail renders the ordered gallery and its Edit dialog stages local multi-file add/delete/reorder before saving. Agent Tools can consume captured latest direct-user-message attachments, a compatible Arkme `image_ref`, or PNG/JPEG/WebP/restricted-SVG files inside the current Agent workspace. They accept only relative `workspace_paths`, reject path traversal and symlink escapes, and never accept arbitrary host paths or URLs. Icon and preview addition use Host-enforced conversational `prepare`/`confirm` state bound to a later direct-user reply and unchanged content fingerprints rather than a DSH ACK card.
@@ -6,6 +6,8 @@ The marketplace separates three different lifecycle operations:
6
6
  - enable/disable changes whether an installed extension should run;
7
7
  - uninstall removes the installed artifact and Profile dependency.
8
8
 
9
+ Author deletion is stronger than unpublishing. The registry uses a soft-delete internally so an operator can restore retained rows and artifacts, but the user-visible operation removes the extension from catalog/owned projections, uninstalls its current local copy, removes linked Cordis and Profile sources, deletes persisted lineage, and invalidates outstanding opaque source references. A required DSH restart is reported explicitly.
10
+
9
11
  `enabled` is the durable desired state. `active` is the current Host runtime
10
12
  observation. The UI must not infer one from the other, and must surface a
11
13
  restart requirement when the current DSH process cannot reach the desired
@@ -19,12 +21,49 @@ dependency merely because it remains installed.
19
21
 
20
22
  ## Capability matrix
21
23
 
22
- | Surface | Enable/disable | Version and button presentation | Extension icon management |
24
+ | Surface | Enable/disable | Complete author deletion | Extension icon management |
23
25
  | --- | --- | --- | --- |
24
- | DSH Tool | `arkme_extension_set_enabled` with explicit confirmation | N/A: no model-facing behavior is added | `arkme_extension_icon_set` uses `prepare → later direct human reply → confirm` for exactly one authorized Arkme `image_ref` or current-session-relative `workspace_path`; it does not use an ACK card |
25
- | Public SDK | typed installed-list and enable/disable methods | N/A: display-only formatting belongs to the built-in UI | `setExtensionIcon()` uploads a local `Blob`; `extensionIconUrl()` returns only a same-origin URL |
26
- | Built-in UI | switch in every installed projection, with busy/error/restart states | dark install/update buttons and explicit installed/latest versions | publish, replace, list and detail surfaces share the current `icon_ref` with a generic fallback |
27
- | Host owner | `ArkmeExtensionManager.setEnabled()` owns persistence, Cordis disposal/activation, Profile projection and errors | existing catalog/update projections | owns file/image-ref validation, workspace confinement and normalization, signed PUT/GET transport, digest verification and bounded cache invalidation |
26
+ | DSH Tool | `arkme_extension_set_enabled` with explicit confirmation | `arkme_extension_delete` confirms one exact owned identity and returns cleanup/restart facts | `arkme_extension_icon_set` uses `prepare → later direct human reply → confirm` for exactly one authorized Arkme `image_ref` or current-session-relative `workspace_path`; it does not use an ACK card |
27
+ | Public SDK | typed installed-list and enable/disable methods | `deleteExtension()` is restricted by contract to an explicit current human action | `setExtensionIcon()` uploads a local `Blob`; `extensionIconUrl()` returns only a same-origin URL |
28
+ | Built-in UI | switch in every installed projection, with busy/error/restart states | one confirmation removes the row from every tab and surfaces manual restart when required | publish, replace, list and detail surfaces share the current `icon_ref` with a generic fallback |
29
+ | Host owner | `ArkmeExtensionManager.setEnabled()` owns persistence, Cordis disposal/activation, Profile projection and errors | `ArkmeOwnedExtensionInventory.delete()` coordinates registry soft-delete, install/runtime/Profile cleanup, lineage deletion and opaque-ref invalidation | owns file/image-ref validation, workspace confinement and normalization, signed PUT/GET transport, digest verification and bounded cache invalidation |
30
+
31
+ ## Detail AI audit entry
32
+
33
+ The one-click audit entry is owned by the shared extension detail modal. The
34
+ legacy inline dialog detail path has been removed so all marketplace containers
35
+ show the same audit action and feedback rendering.
36
+
37
+ ```mermaid
38
+ flowchart TB
39
+ Modal[Extension detail modal] --> Lead[Identity, metrics, author]
40
+ Lead --> Actions[Primary action column]
41
+ Actions --> AuditButton[AI audit button]
42
+ Actions --> Install[Install, update, or toggle]
43
+ Lead --> Preview[Preview gallery]
44
+ Modal --> Feedback[Audit result or error panel]
45
+ Modal --> Facts[About and detail facts]
46
+ ```
47
+
48
+ ```mermaid
49
+ sequenceDiagram
50
+ participant User
51
+ participant UI as Marketplace detail UI
52
+ participant Host as Arkme Host API
53
+ participant Owner as Extension manager
54
+ User->>UI: Click AI audit
55
+ UI->>UI: Show busy state and clear stale result
56
+ UI->>Host: extensions.audit.check(extensionId)
57
+ Host->>Owner: auditExtension(trigger=market_detail)
58
+ alt audit succeeds
59
+ Owner-->>Host: verdict, risk, summary, reasons
60
+ Host-->>UI: structured audit result
61
+ UI-->>User: Show result panel
62
+ else audit fails
63
+ Host-->>UI: structured error
64
+ UI-->>User: Keep detail open and show retryable error
65
+ end
66
+ ```
28
67
 
29
68
  The extension registry owns one replaceable icon for each extension identity;
30
69
  changing it does not create an extension version. Public catalog, detail and
@@ -56,6 +95,6 @@ The gallery is extension-owned, independent from versions, limited to 20 PNG/JPE
56
95
  | DSH Tool | `arkme_extension_publish` accepts an optional repository-root URL and keeps the fixed `github_repository` type inside the Host | `arkme_extension_share` rotates an owned link only after the normal DSH write confirmation | Tool schema and manager tests |
57
96
  | Public SDK | `publishMyExtension()` accepts `githubRepositoryUrl` and normalizes it without exposing eligibility credentials | `rotateExtensionShare()` returns only `{ref,url}` | SDK consumer tests and emitted declarations |
58
97
  | Built-in UI | the publish dialog has one optional GitHub URL field and no type selector | published public/private items open a detail view with copy and owner-only rotation controls | server-render and full UI tests |
59
- | Host owner | `ArkmeExtensionManager` validates/normalizes input once, then delegates eligibility to the registry | the same manager validates the registry link before UI, Tool or SDK receives it | manager and authenticated Host-route tests |
98
+ | Host owner | `ArkmeExtensionManager` validates/normalizes optional provenance once; the registry derives author/importer and gates only its controlled importer context | the same manager validates the registry link before UI, Tool or SDK receives it | manager and authenticated Host-route tests |
60
99
 
61
- Source metadata is an extension-level listing fact and never enters Bundle/source bytes, digests or signatures. Share links display public or private metadata through the Web page only; they do not authorize install, comments, execution or writes. The browser and model never receive internal eligibility tokens, object keys or signed artifact transport.
100
+ Source metadata is an extension-level listing fact and never enters Bundle/source bytes, digests or signatures. Ordinary UI/Tool/SDK publication is always author-owned and never exposes the controlled importer mode. The registry returns `publisher_role`; Host applies the no-write legacy fallback (empty role plus GitHub means importer), enriches the current account nickname/avatar only for authors, and leaves GitHub as a separate source for explicit author rows. Share links display public or private metadata through the Web page only; they do not authorize install, comments, execution or writes. The browser and model never receive internal eligibility tokens, object keys or signed artifact transport.
@@ -4,25 +4,26 @@ This branch implements the selected Arkme desktop visual direction in the produc
4
4
 
5
5
  ## Modification boundary
6
6
 
7
- - The entry remains the official DSH `sidebar.footer.action` slot registered by the Arkme client bundle.
8
- - The complete transparent Arkme wordmark occupies the top-left `sidebar.brand.mark` slot and the adjacent `sidebar.brand.name` slot intentionally renders nothing. The square `conversation.hero.brand.mark` slot keeps the compact Arkme mark because DSH owns the adjacent `探索未至之境` headline and exposes no title slot.
7
+ - Arkme is the permanent product shell while the plugin is enabled. It registers the public DSH `sidebar`, `conversation`, and `details` slots during client initialization; registration does not depend on an open/closed UI state.
8
+ - The official DSH `ui-layout` plugin remains the `root` owner. Arkme shadows only its visible child seats: the sidebar becomes the compact Arkme feature rail, conversation becomes the Arkme directory plus content surface, and details is claimed empty and kept closed.
9
+ - Login, loading, error, existing-account, and first-user states render inside the same permanent Arkme shell. Escape, Session navigation, refresh, and notification activation never reveal the official DSH sidebar or conversation.
9
10
  - The product navigation and all new visual styles render below nodes marked with `data-arkme-owned`.
10
- - No global stylesheet, DSH package import, DSH source patch, or write to a DSH repository is used.
11
- - The existing floating surface still measures the host conversation region at runtime. That compatibility adapter is pre-existing plugin code; this branch does not patch the measured DSH element.
12
- - DSH top chrome, native sidebar dimensions, native session list, and native conversation components remain owned by DSH and are intentionally unchanged.
11
+ - No global stylesheet, DSH private-source import, DSH source patch, or write to a DSH repository is used.
12
+ - Arkme no longer queries the host DOM, measures the host conversation region, or portals a floating card over DSH. The permanent conversation owner renders inline at full width and height.
13
+ - DSH continues to own root geometry, theme presentation, Sessions, Workspaces, Agents, Tools, and Host transports. Those runtime capabilities remain mounted but their official sidebar/conversation presentation is not visible.
13
14
 
14
15
  ## Supported visual routes
15
16
 
16
17
  | Route | Layout inside the Arkme surface | Production owner | Status |
17
18
  | --- | --- | --- | --- |
18
- | Conversations | Feature rail + conversation directory + content | Existing Arkme source directory and timeline | Implemented |
19
+ | Conversations | Permanent feature rail + conversation directory + content | Existing Arkme source directory and timeline | Implemented |
19
20
  | Recordings | Feature rail + full-width recording page | Existing recording calendar/day API | Implemented with the updated Demo's date browser, selected-day list, day timeline, and content tabs |
20
21
  | Search | Feature rail + full-width search page | Existing record search and AI video API | Implemented with the existing search actions and history |
21
22
  | Calendar | Feature rail + floating month calendar + day-content panel | Baseline calendar bucket/day APIs | Implemented with real counts, date switching, paging, loading, empty, and error states |
22
23
  | Marketplace | Feature rail + full-width marketplace page | Existing Arkme marketplace | Implemented as the real search/install/uninstall marketplace |
23
24
  | Tasks | Not rendered | No stable task-list/session contract in the plugin | Deferred; no mock implementation |
24
25
 
25
- The conversation directory is mounted only in conversation mode. It is unmounted for recordings, search, calendar, and plugins so its asynchronous source restoration cannot force a utility page back to the conversation layout.
26
+ The feature rail remains mounted for every route. The conversation directory is mounted only in conversation mode and is unmounted for recordings, search, calendar, and plugins so its asynchronous source restoration cannot force a utility page back to the conversation layout.
26
27
 
27
28
  The conversation route keeps the existing production composer for this iteration. Its add-content `+` is moved to the far-left edge of the toolbar, while the remaining redesign is limited to the surrounding three-column shell, directory density, header alignment, message typography and bubbles, member drawer alignment, and list metadata placement.
28
29
 
@@ -41,6 +42,6 @@ The plugin page keeps the production extension operations. The embedded discover
41
42
 
42
43
  The final acceptance artifact must be an immutable `.tgz` built from this worktree and installed into a fresh profile of an unmodified supported DSH runtime. A standalone Vite preview is not acceptance evidence.
43
44
 
44
- Final acceptance used the rebased `@senguoyun/dsh-arkme@0.1.11` package as an immutable `.tgz` installed through the official DSH plugin command into a fresh isolated DSH home. The runtime was a clean `@deepseek-ai/dsh@0.1.0-rc.8` install with no runtime-level Arkme dependency; no DSH checkout was created or modified.
45
+ Final acceptance used the unchanged-version `@senguoyun/dsh-arkme@0.1.11` package as an immutable `.tgz` installed through the official DSH plugin command into a fresh isolated DSH home. The runtime was a clean `@deepseek-ai/dsh@0.1.1-rc.1` install; no DSH checkout was created or modified.
45
46
 
46
- Typecheck, production build, and the complete test suite passed. The suite result is 152 test files passed and 3 skipped, with 837 tests passed and 3 skipped. Saved Demo/production comparisons remain in `qa/`; final host-integration checks were performed at `http://127.0.0.1:5193/`.
47
+ Typecheck, production build, and the complete test suite passed. The suite result is 157 test files passed and 3 skipped, with 861 tests passed and 3 skipped. Browser acceptance verified cold load, authenticated conversation rendering, route switching, and refresh: the permanent Arkme sidebar/workspace remained the visible winners, the sidebar settled at the official 56px compact width, and neither `DSH Local Build` nor `探索未至之境` appeared.