@yadsh/dsh-qa-surface 0.10.0 → 0.11.0
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/README.md +251 -12
- package/lib/access/service.js +49 -10
- package/lib/access/service.js.map +1 -1
- package/lib/account-remotes.js +41 -0
- package/lib/account-remotes.js.map +1 -1
- package/lib/accounts/database.js +140 -0
- package/lib/accounts/database.js.map +1 -1
- package/lib/accounts/errors.js.map +1 -1
- package/lib/accounts/service-token.js +103 -0
- package/lib/accounts/service-token.js.map +1 -0
- package/lib/accounts/store.js +291 -5
- package/lib/accounts/store.js.map +1 -1
- package/lib/admin/conversation-log.js +14 -8
- package/lib/admin/conversation-log.js.map +1 -1
- package/lib/admin/permissions.js +5 -0
- package/lib/admin/permissions.js.map +1 -1
- package/lib/admin/quality-store.js +4 -0
- package/lib/admin/quality-store.js.map +1 -1
- package/lib/admin/service.js +173 -0
- package/lib/admin/service.js.map +1 -1
- package/lib/admin/session-log.js +39 -8
- package/lib/admin/session-log.js.map +1 -1
- package/lib/attachment-rules.js +39 -6
- package/lib/attachment-rules.js.map +1 -1
- package/lib/cli.js +83 -1
- package/lib/cli.js.map +1 -1
- package/lib/client/QaAccountsController.js +213 -4
- package/lib/client/QaAccountsController.js.map +1 -1
- package/lib/client/QaSessionController.js +37 -21
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +28 -4
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/admin/QaAdmin.js +9 -1
- package/lib/client/admin/QaAdmin.js.map +1 -1
- package/lib/client/admin/pages/SkillFiles.js +78 -0
- package/lib/client/admin/pages/SkillFiles.js.map +1 -0
- package/lib/client/admin/pages/Users.js +65 -1
- package/lib/client/admin/pages/Users.js.map +1 -1
- package/lib/client/admin/routes.js +8 -1
- package/lib/client/admin/routes.js.map +1 -1
- package/lib/client/admin/styles.js +2 -0
- package/lib/client/admin/styles.js.map +1 -1
- package/lib/client/attachments.js +41 -11
- package/lib/client/attachments.js.map +1 -1
- package/lib/client/components/QaAuthGate.js +19 -10
- package/lib/client/components/QaAuthGate.js.map +1 -1
- package/lib/client/components/QaChangelog.js +27 -0
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/index.js +13 -0
- package/lib/client/index.js.map +1 -1
- package/lib/client/lineage.js +64 -0
- package/lib/client/lineage.js.map +1 -1
- package/lib/client/settings/sections/attachments.js +6 -5
- package/lib/client/settings/sections/attachments.js.map +1 -1
- package/lib/client/settings/sections/notes.js +22 -4
- package/lib/client/settings/sections/notes.js.map +1 -1
- package/lib/client/styles.js +9 -0
- package/lib/client/styles.js.map +1 -1
- package/lib/client/types.js.map +1 -1
- package/lib/client/user-settings/IntegrationTokensPage.js +150 -0
- package/lib/client/user-settings/IntegrationTokensPage.js.map +1 -0
- package/lib/client/user-settings/PasswordSettingsPage.js +48 -0
- package/lib/client/user-settings/PasswordSettingsPage.js.map +1 -0
- package/lib/client/user-settings/SkillCatalog.js +2 -2
- package/lib/client/user-settings/SkillCatalog.js.map +1 -1
- package/lib/client/user-settings/UserSettingsDialog.js +17 -2
- package/lib/client/user-settings/UserSettingsDialog.js.map +1 -1
- package/lib/client/user-settings/copy.js +20 -0
- package/lib/client/user-settings/copy.js.map +1 -1
- package/lib/client.js +2466 -137
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/attachments.js +6 -5
- package/lib/config-resolvers/attachments.js.map +1 -1
- package/lib/config-resolvers/defaults.js +23 -2
- package/lib/config-resolvers/defaults.js.map +1 -1
- package/lib/config-resolvers/integration.js +94 -0
- package/lib/config-resolvers/integration.js.map +1 -0
- package/lib/config-resolvers/notes.js +2 -0
- package/lib/config-resolvers/notes.js.map +1 -1
- package/lib/config.js +72 -0
- package/lib/config.js.map +1 -1
- package/lib/index.js +197 -2
- package/lib/index.js.map +1 -1
- package/lib/integration/answer.js +100 -0
- package/lib/integration/answer.js.map +1 -0
- package/lib/integration/attachments.js +231 -0
- package/lib/integration/attachments.js.map +1 -0
- package/lib/integration/contract.js +53 -0
- package/lib/integration/contract.js.map +1 -0
- package/lib/integration/host-runner.js +243 -0
- package/lib/integration/host-runner.js.map +1 -0
- package/lib/integration/http.js +538 -0
- package/lib/integration/http.js.map +1 -0
- package/lib/integration/service.js +331 -0
- package/lib/integration/service.js.map +1 -0
- package/lib/integration/transcript-reader.js +202 -0
- package/lib/integration/transcript-reader.js.map +1 -0
- package/lib/integration/transcript.js +148 -0
- package/lib/integration/transcript.js.map +1 -0
- package/lib/personal-skills/index.js +2 -2
- package/lib/personal-skills/index.js.map +1 -1
- package/lib/personal-skills/paths.js +14 -8
- package/lib/personal-skills/paths.js.map +1 -1
- package/lib/personal-skills/provider.js +16 -4
- package/lib/personal-skills/provider.js.map +1 -1
- package/lib/personal-skills/service.js +240 -30
- package/lib/personal-skills/service.js.map +1 -1
- package/lib/prompt-notes.js +58 -0
- package/lib/prompt-notes.js.map +1 -1
- package/lib/provenance/document-preview.js +10 -1
- package/lib/provenance/document-preview.js.map +1 -1
- package/lib/qa-tools/catalog.js +12 -1
- package/lib/qa-tools/catalog.js.map +1 -1
- package/lib/qa-tools/docs-tools.js +563 -0
- package/lib/qa-tools/docs-tools.js.map +1 -0
- package/lib/resolve-config.js +4 -0
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +83 -3
- package/lib/secure-session.js.map +1 -1
- package/lib/shared/integration-tokens.js +23 -0
- package/lib/shared/integration-tokens.js.map +1 -0
- package/lib/typert.host.js +1176 -213
- package/lib/typert.remote-client.d.ts +27 -1
- package/lib/typert.remote-client.js +911 -69
- package/lib/types/access/service.d.ts +33 -2
- package/lib/types/account-remotes.d.ts +30 -1
- package/lib/types/accounts/database.d.ts +53 -0
- package/lib/types/accounts/errors.d.ts +5 -1
- package/lib/types/accounts/service-token.d.ts +70 -0
- package/lib/types/accounts/store.d.ts +131 -1
- package/lib/types/admin/conversation-log.d.ts +12 -0
- package/lib/types/admin/service.d.ts +56 -1
- package/lib/types/admin/session-log.d.ts +21 -0
- package/lib/types/attachment-rules.d.ts +26 -3
- package/lib/types/client/QaAccountsController.d.ts +64 -5
- package/lib/types/client/QaSessionController.d.ts +24 -2
- package/lib/types/client/admin/pages/SkillFiles.d.ts +17 -0
- package/lib/types/client/admin/routes.d.ts +2 -0
- package/lib/types/client/attachments.d.ts +21 -4
- package/lib/types/client/lineage.d.ts +42 -0
- package/lib/types/client/settings/sections/notes.d.ts +5 -3
- package/lib/types/client/types.d.ts +71 -1
- package/lib/types/client/user-settings/IntegrationTokensPage.d.ts +21 -0
- package/lib/types/client/user-settings/PasswordSettingsPage.d.ts +19 -0
- package/lib/types/client/user-settings/UserSettingsDialog.d.ts +11 -2
- package/lib/types/client/user-settings/copy.d.ts +10 -1
- package/lib/types/config-resolvers/integration.d.ts +47 -0
- package/lib/types/config.d.ts +10 -0
- package/lib/types/index.d.ts +73 -1
- package/lib/types/integration/answer.d.ts +65 -0
- package/lib/types/integration/attachments.d.ts +85 -0
- package/lib/types/integration/contract.d.ts +196 -0
- package/lib/types/integration/host-runner.d.ts +44 -0
- package/lib/types/integration/http.d.ts +79 -0
- package/lib/types/integration/service.d.ts +120 -0
- package/lib/types/integration/transcript-reader.d.ts +100 -0
- package/lib/types/integration/transcript.d.ts +59 -0
- package/lib/types/personal-skills/index.d.ts +2 -2
- package/lib/types/personal-skills/paths.d.ts +15 -3
- package/lib/types/personal-skills/provider.d.ts +14 -2
- package/lib/types/personal-skills/service.d.ts +89 -14
- package/lib/types/prompt-notes.d.ts +28 -0
- package/lib/types/provenance/document-preview.d.ts +4 -0
- package/lib/types/qa-tools/catalog.d.ts +1 -1
- package/lib/types/qa-tools/docs-tools.d.ts +160 -0
- package/lib/types/secure-session.d.ts +52 -1
- package/lib/types/shared/integration-tokens.d.ts +24 -0
- package/lib/types/types.d.ts +170 -2
- package/package.json +4 -4
|
@@ -3,7 +3,7 @@ import type {
|
|
|
3
3
|
RemoteResult,
|
|
4
4
|
TypertRemoteContribution,
|
|
5
5
|
} from '@deepseek-ai/dsh-typert-protocol'
|
|
6
|
-
import type { QaAccessAdminSnapshot, QaAccountProfileInput, QaAccountSession, QaAccountStartersInput, QaAccountUserPublic, QaAdminAuditEvent, QaAdminOverview, QaAdminPage, QaAdminUserDetail, QaAdminUserRow, QaAdminUserUpdate, QaApprovalDecision, QaAuditQuery, QaCapabilitySelection, QaClaimResult, QaConversationDeletion, QaConversationDetail, QaConversationQuery, QaConversationReview, QaConversationReviewInput, QaConversationSummary, QaCurrentAccess, QaDocumentPreview, QaFeedbackQuery, QaFeedbackRow, QaLockdownProof, QaMessageFeedback, QaMessageFeedbackInput, QaOwnershipEntry, QaPendingApproval, QaPendingQuestion, QaQualityMetrics, QaQuestionAnswerItem, QaReviewQueueItem, QaReviewQueueRow, QaSessionAccess, QaSkillActivationRecord, QaSkillAssignmentOverride, QaSkillDocument, QaSkillDraftInput, QaSkillRemoval, QaSkillSummary, QaSkillToolDescriptor, QaSkillValidation, QaSlashCatalog, QaSlashExecution, QaSlashSubmitAttachment, QaSourceFilePreview, QaSubrole, QaTurnSources, QaUserAccess, QaUserQuery, QaWhoamiResult, QaWorkspaceFile, QaWorkspaceListing, ResolvedQaSurfaceConfig } from '@yadsh/dsh-qa-surface/types'
|
|
6
|
+
import type { QaAccessAdminSnapshot, QaAccountProfileInput, QaAccountSession, QaAccountStartersInput, QaAccountUserPublic, QaAdminAuditEvent, QaAdminOverview, QaAdminPage, QaAdminSkillScope, QaAdminSkillsView, QaAdminUserDetail, QaAdminUserRow, QaAdminUserUpdate, QaApprovalDecision, QaAuditQuery, QaCapabilitySelection, QaClaimResult, QaConversationDeletion, QaConversationDetail, QaConversationQuery, QaConversationReview, QaConversationReviewInput, QaConversationSummary, QaCurrentAccess, QaDocumentPreview, QaFeedbackQuery, QaFeedbackRow, QaIssuedServiceToken, QaLockdownProof, QaMessageFeedback, QaMessageFeedbackInput, QaOwnershipEntry, QaPasswordResetRequest, QaPendingApproval, QaPendingQuestion, QaQualityMetrics, QaQuestionAnswerItem, QaReviewQueueItem, QaReviewQueueRow, QaServiceTokenCreateInput, QaServiceTokenSummary, QaSessionAccess, QaSkillActivationRecord, QaSkillAssignmentOverride, QaSkillDocument, QaSkillDraftInput, QaSkillRemoval, QaSkillSummary, QaSkillToolDescriptor, QaSkillValidation, QaSlashCatalog, QaSlashExecution, QaSlashSubmitAttachment, QaSourceFilePreview, QaSubrole, QaTurnSources, QaUserAccess, QaUserQuery, QaWhoamiResult, QaWorkspaceFile, QaWorkspaceListing, ResolvedQaSurfaceConfig } from '@yadsh/dsh-qa-surface/types'
|
|
7
7
|
|
|
8
8
|
declare module '@deepseek-ai/dsh-typert-protocol' {
|
|
9
9
|
interface TypertRemoteNamespace$716153757266616365 {
|
|
@@ -17,11 +17,16 @@ declare module '@deepseek-ai/dsh-typert-protocol' {
|
|
|
17
17
|
accessUpdateCommon: (token: string, input: QaCapabilitySelection) => Promise<RemoteResult<QaCapabilitySelection>>
|
|
18
18
|
accessUpdateSkillOverride: (token: string, input: QaSkillAssignmentOverride) => Promise<RemoteResult<readonly QaSkillAssignmentOverride[]>>
|
|
19
19
|
accessUpdateSubrole: (token: string, id: string, input: QaSubrole) => Promise<RemoteResult<QaSubrole>>
|
|
20
|
+
accountsChangePassword: (token: string, currentPassword: string, nextPassword: string) => Promise<RemoteResult<QaAccountSession>>
|
|
20
21
|
accountsClaimSessions: (token: string, sessionIds: readonly string[]) => Promise<RemoteResult<QaClaimResult>>
|
|
22
|
+
accountsCreateServiceToken: (token: string, input: QaServiceTokenCreateInput) => Promise<RemoteResult<QaIssuedServiceToken>>
|
|
21
23
|
accountsListOwnership: (token: string) => Promise<RemoteResult<{ readonly entries: readonly QaOwnershipEntry[]; }>>
|
|
24
|
+
accountsListServiceTokens: (token: string) => Promise<RemoteResult<{ readonly tokens: readonly QaServiceTokenSummary[]; }>>
|
|
22
25
|
accountsLogin: (email: string, password: string) => Promise<RemoteResult<QaAccountSession>>
|
|
23
26
|
accountsOwnedSessions: (token: string) => Promise<RemoteResult<{ readonly ids: readonly string[]; }>>
|
|
24
27
|
accountsRegister: (email: string, password: string) => Promise<RemoteResult<QaAccountSession>>
|
|
28
|
+
accountsRequestPasswordReset: (email: string) => Promise<RemoteResult<{ readonly accepted: true; }>>
|
|
29
|
+
accountsRevokeServiceToken: (token: string, tokenId: string) => Promise<RemoteResult<{ readonly revoked: boolean; }>>
|
|
25
30
|
accountsUpdateProfile: (token: string, input: QaAccountProfileInput) => Promise<RemoteResult<QaAccountUserPublic>>
|
|
26
31
|
accountsUpdateStarters: (token: string, input: QaAccountStartersInput) => Promise<RemoteResult<QaAccountUserPublic>>
|
|
27
32
|
accountsWhoami: (token: string) => Promise<RemoteResult<QaWhoamiResult>>
|
|
@@ -32,10 +37,18 @@ declare module '@deepseek-ai/dsh-typert-protocol' {
|
|
|
32
37
|
adminFeedback: (token: string, query: QaFeedbackQuery, cursor: string | null, limit: number | null) => Promise<RemoteResult<QaAdminPage<QaFeedbackRow>>>
|
|
33
38
|
adminMetrics: (token: string) => Promise<RemoteResult<QaQualityMetrics>>
|
|
34
39
|
adminOverview: (token: string) => Promise<RemoteResult<QaAdminOverview>>
|
|
40
|
+
adminPasswordResetRequests: (token: string) => Promise<RemoteResult<readonly QaPasswordResetRequest[]>>
|
|
35
41
|
adminQueueConversation: (token: string, conversationId: string, messageId: string | null) => Promise<RemoteResult<QaReviewQueueItem>>
|
|
36
42
|
adminRateMessage: (token: string, conversationId: string, messageId: string, input: QaMessageFeedbackInput) => Promise<RemoteResult<QaMessageFeedback>>
|
|
43
|
+
adminResetPassword: (token: string, userId: string, password: string) => Promise<RemoteResult<QaAdminUserDetail>>
|
|
37
44
|
adminReviewQueue: (token: string, cursor: string | null, limit: number | null) => Promise<RemoteResult<QaAdminPage<QaReviewQueueRow>>>
|
|
38
45
|
adminSaveReview: (token: string, input: QaConversationReviewInput) => Promise<RemoteResult<QaConversationReview>>
|
|
46
|
+
adminSkill: (token: string, scope: QaAdminSkillScope, name: string) => Promise<RemoteResult<QaSkillDocument>>
|
|
47
|
+
adminSkillDelete: (token: string, scope: QaAdminSkillScope, name: string, expectedRevision: string | null) => Promise<RemoteResult<QaSkillRemoval>>
|
|
48
|
+
adminSkills: (token: string, scope: QaAdminSkillScope) => Promise<RemoteResult<QaAdminSkillsView>>
|
|
49
|
+
adminSkillSave: (token: string, scope: QaAdminSkillScope, name: string | null, input: QaSkillDraftInput) => Promise<RemoteResult<QaSkillDocument>>
|
|
50
|
+
adminSkillTools: (token: string, scope: QaAdminSkillScope) => Promise<RemoteResult<{ readonly tools: readonly QaSkillToolDescriptor[]; }>>
|
|
51
|
+
adminSkillValidate: (token: string, scope: QaAdminSkillScope, name: string | null, input: QaSkillDraftInput) => Promise<RemoteResult<QaSkillValidation>>
|
|
39
52
|
adminUpdateUser: (token: string, userId: string, update: QaAdminUserUpdate) => Promise<RemoteResult<QaAdminUserDetail>>
|
|
40
53
|
adminUser: (token: string, userId: string) => Promise<RemoteResult<QaAdminUserDetail>>
|
|
41
54
|
adminUsers: (token: string, query: QaUserQuery, cursor: string | null, limit: number | null) => Promise<RemoteResult<QaAdminPage<QaAdminUserRow>>>
|
|
@@ -73,11 +86,16 @@ declare module '@deepseek-ai/dsh-typert-protocol' {
|
|
|
73
86
|
'qaSurface/accessUpdateCommon': (token: string, input: QaCapabilitySelection) => Promise<RemoteResult<QaCapabilitySelection>>
|
|
74
87
|
'qaSurface/accessUpdateSkillOverride': (token: string, input: QaSkillAssignmentOverride) => Promise<RemoteResult<readonly QaSkillAssignmentOverride[]>>
|
|
75
88
|
'qaSurface/accessUpdateSubrole': (token: string, id: string, input: QaSubrole) => Promise<RemoteResult<QaSubrole>>
|
|
89
|
+
'qaSurface/accountsChangePassword': (token: string, currentPassword: string, nextPassword: string) => Promise<RemoteResult<QaAccountSession>>
|
|
76
90
|
'qaSurface/accountsClaimSessions': (token: string, sessionIds: readonly string[]) => Promise<RemoteResult<QaClaimResult>>
|
|
91
|
+
'qaSurface/accountsCreateServiceToken': (token: string, input: QaServiceTokenCreateInput) => Promise<RemoteResult<QaIssuedServiceToken>>
|
|
77
92
|
'qaSurface/accountsListOwnership': (token: string) => Promise<RemoteResult<{ readonly entries: readonly QaOwnershipEntry[]; }>>
|
|
93
|
+
'qaSurface/accountsListServiceTokens': (token: string) => Promise<RemoteResult<{ readonly tokens: readonly QaServiceTokenSummary[]; }>>
|
|
78
94
|
'qaSurface/accountsLogin': (email: string, password: string) => Promise<RemoteResult<QaAccountSession>>
|
|
79
95
|
'qaSurface/accountsOwnedSessions': (token: string) => Promise<RemoteResult<{ readonly ids: readonly string[]; }>>
|
|
80
96
|
'qaSurface/accountsRegister': (email: string, password: string) => Promise<RemoteResult<QaAccountSession>>
|
|
97
|
+
'qaSurface/accountsRequestPasswordReset': (email: string) => Promise<RemoteResult<{ readonly accepted: true; }>>
|
|
98
|
+
'qaSurface/accountsRevokeServiceToken': (token: string, tokenId: string) => Promise<RemoteResult<{ readonly revoked: boolean; }>>
|
|
81
99
|
'qaSurface/accountsUpdateProfile': (token: string, input: QaAccountProfileInput) => Promise<RemoteResult<QaAccountUserPublic>>
|
|
82
100
|
'qaSurface/accountsUpdateStarters': (token: string, input: QaAccountStartersInput) => Promise<RemoteResult<QaAccountUserPublic>>
|
|
83
101
|
'qaSurface/accountsWhoami': (token: string) => Promise<RemoteResult<QaWhoamiResult>>
|
|
@@ -88,10 +106,18 @@ declare module '@deepseek-ai/dsh-typert-protocol' {
|
|
|
88
106
|
'qaSurface/adminFeedback': (token: string, query: QaFeedbackQuery, cursor: string | null, limit: number | null) => Promise<RemoteResult<QaAdminPage<QaFeedbackRow>>>
|
|
89
107
|
'qaSurface/adminMetrics': (token: string) => Promise<RemoteResult<QaQualityMetrics>>
|
|
90
108
|
'qaSurface/adminOverview': (token: string) => Promise<RemoteResult<QaAdminOverview>>
|
|
109
|
+
'qaSurface/adminPasswordResetRequests': (token: string) => Promise<RemoteResult<readonly QaPasswordResetRequest[]>>
|
|
91
110
|
'qaSurface/adminQueueConversation': (token: string, conversationId: string, messageId: string | null) => Promise<RemoteResult<QaReviewQueueItem>>
|
|
92
111
|
'qaSurface/adminRateMessage': (token: string, conversationId: string, messageId: string, input: QaMessageFeedbackInput) => Promise<RemoteResult<QaMessageFeedback>>
|
|
112
|
+
'qaSurface/adminResetPassword': (token: string, userId: string, password: string) => Promise<RemoteResult<QaAdminUserDetail>>
|
|
93
113
|
'qaSurface/adminReviewQueue': (token: string, cursor: string | null, limit: number | null) => Promise<RemoteResult<QaAdminPage<QaReviewQueueRow>>>
|
|
94
114
|
'qaSurface/adminSaveReview': (token: string, input: QaConversationReviewInput) => Promise<RemoteResult<QaConversationReview>>
|
|
115
|
+
'qaSurface/adminSkill': (token: string, scope: QaAdminSkillScope, name: string) => Promise<RemoteResult<QaSkillDocument>>
|
|
116
|
+
'qaSurface/adminSkillDelete': (token: string, scope: QaAdminSkillScope, name: string, expectedRevision: string | null) => Promise<RemoteResult<QaSkillRemoval>>
|
|
117
|
+
'qaSurface/adminSkills': (token: string, scope: QaAdminSkillScope) => Promise<RemoteResult<QaAdminSkillsView>>
|
|
118
|
+
'qaSurface/adminSkillSave': (token: string, scope: QaAdminSkillScope, name: string | null, input: QaSkillDraftInput) => Promise<RemoteResult<QaSkillDocument>>
|
|
119
|
+
'qaSurface/adminSkillTools': (token: string, scope: QaAdminSkillScope) => Promise<RemoteResult<{ readonly tools: readonly QaSkillToolDescriptor[]; }>>
|
|
120
|
+
'qaSurface/adminSkillValidate': (token: string, scope: QaAdminSkillScope, name: string | null, input: QaSkillDraftInput) => Promise<RemoteResult<QaSkillValidation>>
|
|
95
121
|
'qaSurface/adminUpdateUser': (token: string, userId: string, update: QaAdminUserUpdate) => Promise<RemoteResult<QaAdminUserDetail>>
|
|
96
122
|
'qaSurface/adminUser': (token: string, userId: string) => Promise<RemoteResult<QaAdminUserDetail>>
|
|
97
123
|
'qaSurface/adminUsers': (token: string, query: QaUserQuery, cursor: string | null, limit: number | null) => Promise<RemoteResult<QaAdminPage<QaAdminUserRow>>>
|