@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
package/lib/client.js
CHANGED
|
@@ -5232,6 +5232,24 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5232
5232
|
array(lazy(() => QaSkillJsonValueRemoteCodec$schema3)),
|
|
5233
5233
|
record$2(string(), lazy(() => QaSkillJsonValueRemoteCodec$schema3)).readonly()
|
|
5234
5234
|
]);
|
|
5235
|
+
const QaSkillJsonValueRemoteCodec$schema4 = union([
|
|
5236
|
+
literal(null),
|
|
5237
|
+
string(),
|
|
5238
|
+
number(),
|
|
5239
|
+
literal(false),
|
|
5240
|
+
literal(true),
|
|
5241
|
+
array(lazy(() => QaSkillJsonValueRemoteCodec$schema4)),
|
|
5242
|
+
record$2(string(), lazy(() => QaSkillJsonValueRemoteCodec$schema4)).readonly()
|
|
5243
|
+
]);
|
|
5244
|
+
const QaSkillJsonValueRemoteCodec$schema5 = union([
|
|
5245
|
+
literal(null),
|
|
5246
|
+
string(),
|
|
5247
|
+
number(),
|
|
5248
|
+
literal(false),
|
|
5249
|
+
literal(true),
|
|
5250
|
+
array(lazy(() => QaSkillJsonValueRemoteCodec$schema5)),
|
|
5251
|
+
record$2(string(), lazy(() => QaSkillJsonValueRemoteCodec$schema5)).readonly()
|
|
5252
|
+
]);
|
|
5235
5253
|
const _yadsh_dsh_qa_surface_qaSurface_accessAdminSnapshot_parameter_0$schema = string();
|
|
5236
5254
|
const _yadsh_dsh_qa_surface_qaSurface_accessAdminSnapshot_result$schema = object({
|
|
5237
5255
|
"config": object({
|
|
@@ -5606,12 +5624,61 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5606
5624
|
"accent": string().readonly().optional()
|
|
5607
5625
|
}).readonly().optional()
|
|
5608
5626
|
});
|
|
5627
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsChangePassword_parameter_0$schema = string();
|
|
5628
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsChangePassword_parameter_1$schema = string();
|
|
5629
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsChangePassword_parameter_2$schema = string();
|
|
5630
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsChangePassword_result$schema = object({
|
|
5631
|
+
"token": string().readonly(),
|
|
5632
|
+
"user": object({
|
|
5633
|
+
"id": string().readonly(),
|
|
5634
|
+
"email": string().readonly(),
|
|
5635
|
+
"displayName": string().readonly(),
|
|
5636
|
+
"role": union([
|
|
5637
|
+
literal("user"),
|
|
5638
|
+
literal("reviewer"),
|
|
5639
|
+
literal("admin")
|
|
5640
|
+
]).readonly(),
|
|
5641
|
+
"createdAt": string().readonly(),
|
|
5642
|
+
"lastLoginAt": union([literal(null), string()]).readonly(),
|
|
5643
|
+
"disabled": boolean().readonly(),
|
|
5644
|
+
"profile": object({
|
|
5645
|
+
"fullName": string().readonly(),
|
|
5646
|
+
"identities": record$2(string(), string()).readonly().readonly(),
|
|
5647
|
+
"instructions": string().readonly(),
|
|
5648
|
+
"updatedAt": union([literal(null), string()]).readonly()
|
|
5649
|
+
}).readonly(),
|
|
5650
|
+
"starters": object({
|
|
5651
|
+
"items": array(object({
|
|
5652
|
+
"label": string().readonly(),
|
|
5653
|
+
"prompt": string().readonly()
|
|
5654
|
+
})).readonly(),
|
|
5655
|
+
"hideDefaults": boolean().readonly()
|
|
5656
|
+
}).readonly()
|
|
5657
|
+
}).readonly()
|
|
5658
|
+
});
|
|
5609
5659
|
const _yadsh_dsh_qa_surface_qaSurface_accountsClaimSessions_parameter_0$schema = string();
|
|
5610
5660
|
const _yadsh_dsh_qa_surface_qaSurface_accountsClaimSessions_parameter_1$schema = array(string());
|
|
5611
5661
|
const _yadsh_dsh_qa_surface_qaSurface_accountsClaimSessions_result$schema = object({
|
|
5612
5662
|
"claimed": number().readonly(),
|
|
5613
5663
|
"conflicts": array(string()).readonly()
|
|
5614
5664
|
});
|
|
5665
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsCreateServiceToken_parameter_0$schema = string();
|
|
5666
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsCreateServiceToken_parameter_1$schema = object({
|
|
5667
|
+
"label": string().readonly().optional(),
|
|
5668
|
+
"scopes": array(string()).readonly().optional(),
|
|
5669
|
+
"ttlDays": number().readonly().optional()
|
|
5670
|
+
});
|
|
5671
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsCreateServiceToken_result$schema = object({
|
|
5672
|
+
"token": string().readonly(),
|
|
5673
|
+
"id": string().readonly(),
|
|
5674
|
+
"label": string().readonly(),
|
|
5675
|
+
"scopes": array(union([literal("ask"), literal("sessions:read")])).readonly(),
|
|
5676
|
+
"createdAt": string().readonly(),
|
|
5677
|
+
"expiresAt": string().readonly(),
|
|
5678
|
+
"lastUsedAt": union([literal(null), string()]).readonly(),
|
|
5679
|
+
"revokedAt": union([literal(null), string()]).readonly(),
|
|
5680
|
+
"useCount": number().readonly()
|
|
5681
|
+
});
|
|
5615
5682
|
const _yadsh_dsh_qa_surface_qaSurface_accountsListOwnership_parameter_0$schema = string();
|
|
5616
5683
|
const _yadsh_dsh_qa_surface_qaSurface_accountsListOwnership_result$schema = object({ "entries": array(object({
|
|
5617
5684
|
"sessionId": string().readonly(),
|
|
@@ -5619,6 +5686,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5619
5686
|
"displayName": string().readonly(),
|
|
5620
5687
|
"claimedAt": string().readonly()
|
|
5621
5688
|
})).readonly() });
|
|
5689
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsListServiceTokens_parameter_0$schema = string();
|
|
5690
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsListServiceTokens_result$schema = object({ "tokens": array(object({
|
|
5691
|
+
"id": string().readonly(),
|
|
5692
|
+
"label": string().readonly(),
|
|
5693
|
+
"scopes": array(union([literal("ask"), literal("sessions:read")])).readonly(),
|
|
5694
|
+
"createdAt": string().readonly(),
|
|
5695
|
+
"expiresAt": string().readonly(),
|
|
5696
|
+
"lastUsedAt": union([literal(null), string()]).readonly(),
|
|
5697
|
+
"revokedAt": union([literal(null), string()]).readonly(),
|
|
5698
|
+
"useCount": number().readonly()
|
|
5699
|
+
})).readonly() });
|
|
5622
5700
|
const _yadsh_dsh_qa_surface_qaSurface_accountsLogin_parameter_0$schema = string();
|
|
5623
5701
|
const _yadsh_dsh_qa_surface_qaSurface_accountsLogin_parameter_1$schema = string();
|
|
5624
5702
|
const _yadsh_dsh_qa_surface_qaSurface_accountsLogin_result$schema = object({
|
|
@@ -5683,6 +5761,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5683
5761
|
}).readonly()
|
|
5684
5762
|
}).readonly()
|
|
5685
5763
|
});
|
|
5764
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsRequestPasswordReset_parameter_0$schema = string();
|
|
5765
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsRequestPasswordReset_result$schema = object({ "accepted": literal(true).readonly() });
|
|
5766
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsRevokeServiceToken_parameter_0$schema = string();
|
|
5767
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsRevokeServiceToken_parameter_1$schema = string();
|
|
5768
|
+
const _yadsh_dsh_qa_surface_qaSurface_accountsRevokeServiceToken_result$schema = object({ "revoked": boolean().readonly() });
|
|
5686
5769
|
const _yadsh_dsh_qa_surface_qaSurface_accountsUpdateProfile_parameter_0$schema = string();
|
|
5687
5770
|
const _yadsh_dsh_qa_surface_qaSurface_accountsUpdateProfile_parameter_1$schema = object({
|
|
5688
5771
|
"fullName": string().readonly(),
|
|
@@ -5791,6 +5874,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5791
5874
|
literal("user.updated"),
|
|
5792
5875
|
literal("user.enabled"),
|
|
5793
5876
|
literal("user.disabled"),
|
|
5877
|
+
literal("user.password-reset"),
|
|
5794
5878
|
literal("authorization.changed"),
|
|
5795
5879
|
literal("subrole.assignment.changed"),
|
|
5796
5880
|
literal("common_capabilities.updated"),
|
|
@@ -5798,7 +5882,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5798
5882
|
literal("conversation.deleted"),
|
|
5799
5883
|
literal("review.updated"),
|
|
5800
5884
|
literal("review.queued"),
|
|
5801
|
-
literal("admin.settings.updated")
|
|
5885
|
+
literal("admin.settings.updated"),
|
|
5886
|
+
literal("skill.created"),
|
|
5887
|
+
literal("skill.updated"),
|
|
5888
|
+
literal("skill.deleted")
|
|
5802
5889
|
]).readonly().optional(),
|
|
5803
5890
|
"from": union([literal(null), string()]).readonly().optional(),
|
|
5804
5891
|
"to": union([literal(null), string()]).readonly().optional()
|
|
@@ -5818,6 +5905,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5818
5905
|
literal("user.updated"),
|
|
5819
5906
|
literal("user.enabled"),
|
|
5820
5907
|
literal("user.disabled"),
|
|
5908
|
+
literal("user.password-reset"),
|
|
5821
5909
|
literal("authorization.changed"),
|
|
5822
5910
|
literal("subrole.assignment.changed"),
|
|
5823
5911
|
literal("common_capabilities.updated"),
|
|
@@ -5825,7 +5913,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5825
5913
|
literal("conversation.deleted"),
|
|
5826
5914
|
literal("review.updated"),
|
|
5827
5915
|
literal("review.queued"),
|
|
5828
|
-
literal("admin.settings.updated")
|
|
5916
|
+
literal("admin.settings.updated"),
|
|
5917
|
+
literal("skill.created"),
|
|
5918
|
+
literal("skill.updated"),
|
|
5919
|
+
literal("skill.deleted")
|
|
5829
5920
|
]).readonly(),
|
|
5830
5921
|
"targetType": string().readonly().optional(),
|
|
5831
5922
|
"targetId": string().readonly().optional(),
|
|
@@ -6272,8 +6363,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6272
6363
|
}).readonly(),
|
|
6273
6364
|
"alerts": array(object({
|
|
6274
6365
|
"level": union([
|
|
6275
|
-
literal("critical"),
|
|
6276
6366
|
literal("warning"),
|
|
6367
|
+
literal("critical"),
|
|
6277
6368
|
literal("info")
|
|
6278
6369
|
]).readonly(),
|
|
6279
6370
|
"code": union([
|
|
@@ -6373,6 +6464,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6373
6464
|
"feedbackId": string().readonly().optional()
|
|
6374
6465
|
})).readonly()
|
|
6375
6466
|
});
|
|
6467
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminPasswordResetRequests_parameter_0$schema = string();
|
|
6468
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminPasswordResetRequests_result$schema = array(object({
|
|
6469
|
+
"userId": string().readonly(),
|
|
6470
|
+
"email": string().readonly(),
|
|
6471
|
+
"displayName": string().readonly(),
|
|
6472
|
+
"requestedAt": string().readonly(),
|
|
6473
|
+
"lastRequestedAt": string().readonly(),
|
|
6474
|
+
"requestCount": number().readonly(),
|
|
6475
|
+
"disabled": boolean().readonly()
|
|
6476
|
+
}));
|
|
6376
6477
|
const _yadsh_dsh_qa_surface_qaSurface_adminQueueConversation_parameter_0$schema = string();
|
|
6377
6478
|
const _yadsh_dsh_qa_surface_qaSurface_adminQueueConversation_parameter_1$schema = string();
|
|
6378
6479
|
const _yadsh_dsh_qa_surface_qaSurface_adminQueueConversation_parameter_2$schema = union([literal(null), string()]);
|
|
@@ -6439,6 +6540,45 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6439
6540
|
"createdAt": string().readonly(),
|
|
6440
6541
|
"updatedAt": string().readonly().optional()
|
|
6441
6542
|
});
|
|
6543
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminResetPassword_parameter_0$schema = string();
|
|
6544
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminResetPassword_parameter_1$schema = string();
|
|
6545
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminResetPassword_parameter_2$schema = string();
|
|
6546
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminResetPassword_result$schema = object({
|
|
6547
|
+
"user": object({
|
|
6548
|
+
"conversations": number().readonly(),
|
|
6549
|
+
"feedbackGiven": number().readonly(),
|
|
6550
|
+
"id": string().readonly(),
|
|
6551
|
+
"email": string().readonly(),
|
|
6552
|
+
"displayName": string().readonly(),
|
|
6553
|
+
"fullName": string().readonly(),
|
|
6554
|
+
"role": union([
|
|
6555
|
+
literal("user"),
|
|
6556
|
+
literal("reviewer"),
|
|
6557
|
+
literal("admin")
|
|
6558
|
+
]).readonly(),
|
|
6559
|
+
"disabled": boolean().readonly(),
|
|
6560
|
+
"createdAt": string().readonly(),
|
|
6561
|
+
"lastLoginAt": union([literal(null), string()]).readonly(),
|
|
6562
|
+
"access": object({
|
|
6563
|
+
"allowedSubroles": array(string()).readonly(),
|
|
6564
|
+
"defaultSubrole": string().readonly()
|
|
6565
|
+
}).readonly()
|
|
6566
|
+
}).readonly(),
|
|
6567
|
+
"effective": array(object({
|
|
6568
|
+
"subroleId": string().readonly(),
|
|
6569
|
+
"name": string().readonly(),
|
|
6570
|
+
"tools": number().readonly(),
|
|
6571
|
+
"grantableTools": number().readonly(),
|
|
6572
|
+
"deniedTools": number().readonly(),
|
|
6573
|
+
"skills": number().readonly()
|
|
6574
|
+
})).readonly(),
|
|
6575
|
+
"activity": object({
|
|
6576
|
+
"conversations": number().readonly(),
|
|
6577
|
+
"messages": union([literal(null), number()]).readonly(),
|
|
6578
|
+
"positiveRatings": number().readonly(),
|
|
6579
|
+
"negativeRatings": number().readonly()
|
|
6580
|
+
}).readonly()
|
|
6581
|
+
});
|
|
6442
6582
|
const _yadsh_dsh_qa_surface_qaSurface_adminReviewQueue_parameter_0$schema = string();
|
|
6443
6583
|
const _yadsh_dsh_qa_surface_qaSurface_adminReviewQueue_parameter_1$schema = union([literal(null), string()]);
|
|
6444
6584
|
const _yadsh_dsh_qa_surface_qaSurface_adminReviewQueue_parameter_2$schema = union([literal(null), number()]);
|
|
@@ -6601,6 +6741,268 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6601
6741
|
"createdAt": string().readonly(),
|
|
6602
6742
|
"updatedAt": string().readonly().optional()
|
|
6603
6743
|
});
|
|
6744
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkill_parameter_0$schema = string();
|
|
6745
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkill_parameter_1$schema = union([object({ "kind": literal("shared").readonly() }), object({
|
|
6746
|
+
"kind": literal("user").readonly(),
|
|
6747
|
+
"userId": string().readonly()
|
|
6748
|
+
})]);
|
|
6749
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkill_parameter_2$schema = string();
|
|
6750
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkill_result$schema = object({
|
|
6751
|
+
"body": string().readonly(),
|
|
6752
|
+
"extraFrontmatter": record$2(string(), union([
|
|
6753
|
+
literal(null),
|
|
6754
|
+
string(),
|
|
6755
|
+
number(),
|
|
6756
|
+
literal(false),
|
|
6757
|
+
literal(true),
|
|
6758
|
+
array(lazy(() => QaSkillJsonValueRemoteCodec$schema)),
|
|
6759
|
+
record$2(string(), lazy(() => QaSkillJsonValueRemoteCodec$schema)).readonly()
|
|
6760
|
+
])).readonly().readonly(),
|
|
6761
|
+
"sourcePath": string().readonly(),
|
|
6762
|
+
"preview": string().readonly(),
|
|
6763
|
+
"name": string().readonly(),
|
|
6764
|
+
"description": string().readonly(),
|
|
6765
|
+
"whenToUse": union([literal(null), string()]).readonly(),
|
|
6766
|
+
"modelInvocable": boolean().readonly(),
|
|
6767
|
+
"userInvocable": boolean().readonly(),
|
|
6768
|
+
"allowedTools": array(string()).readonly(),
|
|
6769
|
+
"unavailableTools": array(string()).readonly(),
|
|
6770
|
+
"resourceCount": number().readonly(),
|
|
6771
|
+
"valid": boolean().readonly(),
|
|
6772
|
+
"diagnostics": array(object({
|
|
6773
|
+
"code": union([
|
|
6774
|
+
literal("name-required"),
|
|
6775
|
+
literal("name-invalid"),
|
|
6776
|
+
literal("name-mismatch"),
|
|
6777
|
+
literal("description-required"),
|
|
6778
|
+
literal("description-too-long"),
|
|
6779
|
+
literal("when-to-use-too-long"),
|
|
6780
|
+
literal("field-type-invalid"),
|
|
6781
|
+
literal("invocation-never"),
|
|
6782
|
+
literal("invocation-invalid"),
|
|
6783
|
+
literal("invocation-legacy-key"),
|
|
6784
|
+
literal("allowed-tools-invalid"),
|
|
6785
|
+
literal("tool-name-invalid"),
|
|
6786
|
+
literal("tool-unavailable"),
|
|
6787
|
+
literal("tools-too-many"),
|
|
6788
|
+
literal("file-too-large"),
|
|
6789
|
+
literal("frontmatter-missing"),
|
|
6790
|
+
literal("skill-file-missing"),
|
|
6791
|
+
literal("frontmatter-invalid"),
|
|
6792
|
+
literal("unknown-field"),
|
|
6793
|
+
literal("resource-unsupported")
|
|
6794
|
+
]).readonly(),
|
|
6795
|
+
"severity": union([literal("error"), literal("warning")]).readonly(),
|
|
6796
|
+
"field": union([literal(null), string()]).readonly(),
|
|
6797
|
+
"detail": union([literal(null), string()]).readonly()
|
|
6798
|
+
})).readonly(),
|
|
6799
|
+
"updatedAt": union([literal(null), string()]).readonly(),
|
|
6800
|
+
"revision": string().readonly(),
|
|
6801
|
+
"adminEdit": union([literal(null), object({
|
|
6802
|
+
"actorId": string().readonly(),
|
|
6803
|
+
"at": string().readonly()
|
|
6804
|
+
})]).readonly()
|
|
6805
|
+
});
|
|
6806
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillDelete_parameter_0$schema = string();
|
|
6807
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillDelete_parameter_1$schema = union([object({ "kind": literal("shared").readonly() }), object({
|
|
6808
|
+
"kind": literal("user").readonly(),
|
|
6809
|
+
"userId": string().readonly()
|
|
6810
|
+
})]);
|
|
6811
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillDelete_parameter_2$schema = string();
|
|
6812
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillDelete_parameter_3$schema = union([literal(null), string()]);
|
|
6813
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillDelete_result$schema = object({
|
|
6814
|
+
"name": string().readonly(),
|
|
6815
|
+
"trashed": boolean().readonly()
|
|
6816
|
+
});
|
|
6817
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkills_parameter_0$schema = string();
|
|
6818
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkills_parameter_1$schema = union([object({ "kind": literal("shared").readonly() }), object({
|
|
6819
|
+
"kind": literal("user").readonly(),
|
|
6820
|
+
"userId": string().readonly()
|
|
6821
|
+
})]);
|
|
6822
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkills_result$schema = object({
|
|
6823
|
+
"scope": union([object({ "kind": literal("shared").readonly() }), object({
|
|
6824
|
+
"kind": literal("user").readonly(),
|
|
6825
|
+
"userId": string().readonly()
|
|
6826
|
+
})]).readonly(),
|
|
6827
|
+
"owner": union([literal(null), object({
|
|
6828
|
+
"userId": string().readonly(),
|
|
6829
|
+
"email": string().readonly(),
|
|
6830
|
+
"displayName": string().readonly()
|
|
6831
|
+
})]).readonly(),
|
|
6832
|
+
"skills": array(object({
|
|
6833
|
+
"name": string().readonly(),
|
|
6834
|
+
"description": string().readonly(),
|
|
6835
|
+
"whenToUse": union([literal(null), string()]).readonly(),
|
|
6836
|
+
"modelInvocable": boolean().readonly(),
|
|
6837
|
+
"userInvocable": boolean().readonly(),
|
|
6838
|
+
"allowedTools": array(string()).readonly(),
|
|
6839
|
+
"unavailableTools": array(string()).readonly(),
|
|
6840
|
+
"resourceCount": number().readonly(),
|
|
6841
|
+
"valid": boolean().readonly(),
|
|
6842
|
+
"diagnostics": array(object({
|
|
6843
|
+
"code": union([
|
|
6844
|
+
literal("name-required"),
|
|
6845
|
+
literal("name-invalid"),
|
|
6846
|
+
literal("name-mismatch"),
|
|
6847
|
+
literal("description-required"),
|
|
6848
|
+
literal("description-too-long"),
|
|
6849
|
+
literal("when-to-use-too-long"),
|
|
6850
|
+
literal("field-type-invalid"),
|
|
6851
|
+
literal("invocation-never"),
|
|
6852
|
+
literal("invocation-invalid"),
|
|
6853
|
+
literal("invocation-legacy-key"),
|
|
6854
|
+
literal("allowed-tools-invalid"),
|
|
6855
|
+
literal("tool-name-invalid"),
|
|
6856
|
+
literal("tool-unavailable"),
|
|
6857
|
+
literal("tools-too-many"),
|
|
6858
|
+
literal("file-too-large"),
|
|
6859
|
+
literal("frontmatter-missing"),
|
|
6860
|
+
literal("skill-file-missing"),
|
|
6861
|
+
literal("frontmatter-invalid"),
|
|
6862
|
+
literal("unknown-field"),
|
|
6863
|
+
literal("resource-unsupported")
|
|
6864
|
+
]).readonly(),
|
|
6865
|
+
"severity": union([literal("error"), literal("warning")]).readonly(),
|
|
6866
|
+
"field": union([literal(null), string()]).readonly(),
|
|
6867
|
+
"detail": union([literal(null), string()]).readonly()
|
|
6868
|
+
})).readonly(),
|
|
6869
|
+
"updatedAt": union([literal(null), string()]).readonly(),
|
|
6870
|
+
"revision": string().readonly(),
|
|
6871
|
+
"adminEdit": union([literal(null), object({
|
|
6872
|
+
"actorId": string().readonly(),
|
|
6873
|
+
"at": string().readonly()
|
|
6874
|
+
})]).readonly()
|
|
6875
|
+
})).readonly(),
|
|
6876
|
+
"rootPath": string().readonly()
|
|
6877
|
+
});
|
|
6878
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillSave_parameter_0$schema = string();
|
|
6879
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillSave_parameter_1$schema = union([object({ "kind": literal("shared").readonly() }), object({
|
|
6880
|
+
"kind": literal("user").readonly(),
|
|
6881
|
+
"userId": string().readonly()
|
|
6882
|
+
})]);
|
|
6883
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillSave_parameter_2$schema = union([literal(null), string()]);
|
|
6884
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillSave_parameter_3$schema = object({
|
|
6885
|
+
"name": string().readonly(),
|
|
6886
|
+
"description": string().readonly(),
|
|
6887
|
+
"whenToUse": union([literal(null), string()]).readonly(),
|
|
6888
|
+
"modelInvocable": boolean().readonly(),
|
|
6889
|
+
"userInvocable": boolean().readonly(),
|
|
6890
|
+
"allowedTools": array(string()).readonly(),
|
|
6891
|
+
"body": string().readonly(),
|
|
6892
|
+
"expectedRevision": union([literal(null), string()]).readonly()
|
|
6893
|
+
});
|
|
6894
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillSave_result$schema = object({
|
|
6895
|
+
"body": string().readonly(),
|
|
6896
|
+
"extraFrontmatter": record$2(string(), union([
|
|
6897
|
+
literal(null),
|
|
6898
|
+
string(),
|
|
6899
|
+
number(),
|
|
6900
|
+
literal(false),
|
|
6901
|
+
literal(true),
|
|
6902
|
+
array(lazy(() => QaSkillJsonValueRemoteCodec$schema2)),
|
|
6903
|
+
record$2(string(), lazy(() => QaSkillJsonValueRemoteCodec$schema2)).readonly()
|
|
6904
|
+
])).readonly().readonly(),
|
|
6905
|
+
"sourcePath": string().readonly(),
|
|
6906
|
+
"preview": string().readonly(),
|
|
6907
|
+
"name": string().readonly(),
|
|
6908
|
+
"description": string().readonly(),
|
|
6909
|
+
"whenToUse": union([literal(null), string()]).readonly(),
|
|
6910
|
+
"modelInvocable": boolean().readonly(),
|
|
6911
|
+
"userInvocable": boolean().readonly(),
|
|
6912
|
+
"allowedTools": array(string()).readonly(),
|
|
6913
|
+
"unavailableTools": array(string()).readonly(),
|
|
6914
|
+
"resourceCount": number().readonly(),
|
|
6915
|
+
"valid": boolean().readonly(),
|
|
6916
|
+
"diagnostics": array(object({
|
|
6917
|
+
"code": union([
|
|
6918
|
+
literal("name-required"),
|
|
6919
|
+
literal("name-invalid"),
|
|
6920
|
+
literal("name-mismatch"),
|
|
6921
|
+
literal("description-required"),
|
|
6922
|
+
literal("description-too-long"),
|
|
6923
|
+
literal("when-to-use-too-long"),
|
|
6924
|
+
literal("field-type-invalid"),
|
|
6925
|
+
literal("invocation-never"),
|
|
6926
|
+
literal("invocation-invalid"),
|
|
6927
|
+
literal("invocation-legacy-key"),
|
|
6928
|
+
literal("allowed-tools-invalid"),
|
|
6929
|
+
literal("tool-name-invalid"),
|
|
6930
|
+
literal("tool-unavailable"),
|
|
6931
|
+
literal("tools-too-many"),
|
|
6932
|
+
literal("file-too-large"),
|
|
6933
|
+
literal("frontmatter-missing"),
|
|
6934
|
+
literal("skill-file-missing"),
|
|
6935
|
+
literal("frontmatter-invalid"),
|
|
6936
|
+
literal("unknown-field"),
|
|
6937
|
+
literal("resource-unsupported")
|
|
6938
|
+
]).readonly(),
|
|
6939
|
+
"severity": union([literal("error"), literal("warning")]).readonly(),
|
|
6940
|
+
"field": union([literal(null), string()]).readonly(),
|
|
6941
|
+
"detail": union([literal(null), string()]).readonly()
|
|
6942
|
+
})).readonly(),
|
|
6943
|
+
"updatedAt": union([literal(null), string()]).readonly(),
|
|
6944
|
+
"revision": string().readonly(),
|
|
6945
|
+
"adminEdit": union([literal(null), object({
|
|
6946
|
+
"actorId": string().readonly(),
|
|
6947
|
+
"at": string().readonly()
|
|
6948
|
+
})]).readonly()
|
|
6949
|
+
});
|
|
6950
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillTools_parameter_0$schema = string();
|
|
6951
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillTools_parameter_1$schema = union([object({ "kind": literal("shared").readonly() }), object({
|
|
6952
|
+
"kind": literal("user").readonly(),
|
|
6953
|
+
"userId": string().readonly()
|
|
6954
|
+
})]);
|
|
6955
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillTools_result$schema = object({ "tools": array(object({
|
|
6956
|
+
"name": string().readonly(),
|
|
6957
|
+
"description": string().readonly(),
|
|
6958
|
+
"available": boolean().readonly()
|
|
6959
|
+
})).readonly() });
|
|
6960
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillValidate_parameter_0$schema = string();
|
|
6961
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillValidate_parameter_1$schema = union([object({ "kind": literal("shared").readonly() }), object({
|
|
6962
|
+
"kind": literal("user").readonly(),
|
|
6963
|
+
"userId": string().readonly()
|
|
6964
|
+
})]);
|
|
6965
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillValidate_parameter_2$schema = union([literal(null), string()]);
|
|
6966
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillValidate_parameter_3$schema = object({
|
|
6967
|
+
"name": string().readonly(),
|
|
6968
|
+
"description": string().readonly(),
|
|
6969
|
+
"whenToUse": union([literal(null), string()]).readonly(),
|
|
6970
|
+
"modelInvocable": boolean().readonly(),
|
|
6971
|
+
"userInvocable": boolean().readonly(),
|
|
6972
|
+
"allowedTools": array(string()).readonly(),
|
|
6973
|
+
"body": string().readonly(),
|
|
6974
|
+
"expectedRevision": union([literal(null), string()]).readonly()
|
|
6975
|
+
});
|
|
6976
|
+
const _yadsh_dsh_qa_surface_qaSurface_adminSkillValidate_result$schema = object({
|
|
6977
|
+
"preview": string().readonly(),
|
|
6978
|
+
"diagnostics": array(object({
|
|
6979
|
+
"code": union([
|
|
6980
|
+
literal("name-required"),
|
|
6981
|
+
literal("name-invalid"),
|
|
6982
|
+
literal("name-mismatch"),
|
|
6983
|
+
literal("description-required"),
|
|
6984
|
+
literal("description-too-long"),
|
|
6985
|
+
literal("when-to-use-too-long"),
|
|
6986
|
+
literal("field-type-invalid"),
|
|
6987
|
+
literal("invocation-never"),
|
|
6988
|
+
literal("invocation-invalid"),
|
|
6989
|
+
literal("invocation-legacy-key"),
|
|
6990
|
+
literal("allowed-tools-invalid"),
|
|
6991
|
+
literal("tool-name-invalid"),
|
|
6992
|
+
literal("tool-unavailable"),
|
|
6993
|
+
literal("tools-too-many"),
|
|
6994
|
+
literal("file-too-large"),
|
|
6995
|
+
literal("frontmatter-missing"),
|
|
6996
|
+
literal("skill-file-missing"),
|
|
6997
|
+
literal("frontmatter-invalid"),
|
|
6998
|
+
literal("unknown-field"),
|
|
6999
|
+
literal("resource-unsupported")
|
|
7000
|
+
]).readonly(),
|
|
7001
|
+
"severity": union([literal("error"), literal("warning")]).readonly(),
|
|
7002
|
+
"field": union([literal(null), string()]).readonly(),
|
|
7003
|
+
"detail": union([literal(null), string()]).readonly()
|
|
7004
|
+
})).readonly()
|
|
7005
|
+
});
|
|
6604
7006
|
const _yadsh_dsh_qa_surface_qaSurface_adminUpdateUser_parameter_0$schema = string();
|
|
6605
7007
|
const _yadsh_dsh_qa_surface_qaSurface_adminUpdateUser_parameter_1$schema = string();
|
|
6606
7008
|
const _yadsh_dsh_qa_surface_qaSurface_adminUpdateUser_parameter_2$schema = object({
|
|
@@ -6960,7 +7362,26 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6960
7362
|
"delegation": object({
|
|
6961
7363
|
"enabled": boolean().readonly(),
|
|
6962
7364
|
"template": string().readonly()
|
|
7365
|
+
}).readonly(),
|
|
7366
|
+
"documents": object({
|
|
7367
|
+
"enabled": boolean().readonly(),
|
|
7368
|
+
"template": string().readonly()
|
|
7369
|
+
}).readonly(),
|
|
7370
|
+
"sourcePriority": object({
|
|
7371
|
+
"enabled": boolean().readonly(),
|
|
7372
|
+
"template": string().readonly()
|
|
6963
7373
|
}).readonly()
|
|
7374
|
+
}).readonly(),
|
|
7375
|
+
"integration": object({
|
|
7376
|
+
"enabled": boolean().readonly(),
|
|
7377
|
+
"basePath": string().readonly(),
|
|
7378
|
+
"tokenTtlDays": number().readonly(),
|
|
7379
|
+
"requestTimeoutMs": number().readonly(),
|
|
7380
|
+
"maxConcurrent": number().readonly(),
|
|
7381
|
+
"requestsPerMinute": number().readonly(),
|
|
7382
|
+
"maxRequestBytes": number().readonly(),
|
|
7383
|
+
"maxAttachmentBytes": number().readonly(),
|
|
7384
|
+
"maxAnswerCharacters": number().readonly()
|
|
6964
7385
|
}).readonly()
|
|
6965
7386
|
});
|
|
6966
7387
|
const _yadsh_dsh_qa_surface_qaSurface_listWorkspaceFiles_parameter_0$schema = string();
|
|
@@ -7070,8 +7491,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7070
7491
|
number(),
|
|
7071
7492
|
literal(false),
|
|
7072
7493
|
literal(true),
|
|
7073
|
-
array(lazy(() => QaSkillJsonValueRemoteCodec$
|
|
7074
|
-
record$2(string(), lazy(() => QaSkillJsonValueRemoteCodec$
|
|
7494
|
+
array(lazy(() => QaSkillJsonValueRemoteCodec$schema4)),
|
|
7495
|
+
record$2(string(), lazy(() => QaSkillJsonValueRemoteCodec$schema4)).readonly()
|
|
7075
7496
|
])).readonly().readonly(),
|
|
7076
7497
|
"sourcePath": string().readonly(),
|
|
7077
7498
|
"preview": string().readonly(),
|
|
@@ -7107,12 +7528,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7107
7528
|
literal("unknown-field"),
|
|
7108
7529
|
literal("resource-unsupported")
|
|
7109
7530
|
]).readonly(),
|
|
7110
|
-
"severity": union([literal("
|
|
7531
|
+
"severity": union([literal("error"), literal("warning")]).readonly(),
|
|
7111
7532
|
"field": union([literal(null), string()]).readonly(),
|
|
7112
7533
|
"detail": union([literal(null), string()]).readonly()
|
|
7113
7534
|
})).readonly(),
|
|
7114
7535
|
"updatedAt": union([literal(null), string()]).readonly(),
|
|
7115
|
-
"revision": string().readonly()
|
|
7536
|
+
"revision": string().readonly(),
|
|
7537
|
+
"adminEdit": union([literal(null), object({
|
|
7538
|
+
"actorId": string().readonly(),
|
|
7539
|
+
"at": string().readonly()
|
|
7540
|
+
})]).readonly()
|
|
7116
7541
|
});
|
|
7117
7542
|
const _yadsh_dsh_qa_surface_qaSurface_skillsGet_parameter_0$schema = string();
|
|
7118
7543
|
const _yadsh_dsh_qa_surface_qaSurface_skillsGet_parameter_1$schema = string();
|
|
@@ -7124,8 +7549,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7124
7549
|
number(),
|
|
7125
7550
|
literal(false),
|
|
7126
7551
|
literal(true),
|
|
7127
|
-
array(lazy(() => QaSkillJsonValueRemoteCodec$
|
|
7128
|
-
record$2(string(), lazy(() => QaSkillJsonValueRemoteCodec$
|
|
7552
|
+
array(lazy(() => QaSkillJsonValueRemoteCodec$schema3)),
|
|
7553
|
+
record$2(string(), lazy(() => QaSkillJsonValueRemoteCodec$schema3)).readonly()
|
|
7129
7554
|
])).readonly().readonly(),
|
|
7130
7555
|
"sourcePath": string().readonly(),
|
|
7131
7556
|
"preview": string().readonly(),
|
|
@@ -7161,12 +7586,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7161
7586
|
literal("unknown-field"),
|
|
7162
7587
|
literal("resource-unsupported")
|
|
7163
7588
|
]).readonly(),
|
|
7164
|
-
"severity": union([literal("
|
|
7589
|
+
"severity": union([literal("error"), literal("warning")]).readonly(),
|
|
7165
7590
|
"field": union([literal(null), string()]).readonly(),
|
|
7166
7591
|
"detail": union([literal(null), string()]).readonly()
|
|
7167
7592
|
})).readonly(),
|
|
7168
7593
|
"updatedAt": union([literal(null), string()]).readonly(),
|
|
7169
|
-
"revision": string().readonly()
|
|
7594
|
+
"revision": string().readonly(),
|
|
7595
|
+
"adminEdit": union([literal(null), object({
|
|
7596
|
+
"actorId": string().readonly(),
|
|
7597
|
+
"at": string().readonly()
|
|
7598
|
+
})]).readonly()
|
|
7170
7599
|
});
|
|
7171
7600
|
const _yadsh_dsh_qa_surface_qaSurface_skillsList_parameter_0$schema = string();
|
|
7172
7601
|
const _yadsh_dsh_qa_surface_qaSurface_skillsList_result$schema = object({ "skills": array(object({
|
|
@@ -7202,12 +7631,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7202
7631
|
literal("unknown-field"),
|
|
7203
7632
|
literal("resource-unsupported")
|
|
7204
7633
|
]).readonly(),
|
|
7205
|
-
"severity": union([literal("
|
|
7634
|
+
"severity": union([literal("error"), literal("warning")]).readonly(),
|
|
7206
7635
|
"field": union([literal(null), string()]).readonly(),
|
|
7207
7636
|
"detail": union([literal(null), string()]).readonly()
|
|
7208
7637
|
})).readonly(),
|
|
7209
7638
|
"updatedAt": union([literal(null), string()]).readonly(),
|
|
7210
|
-
"revision": string().readonly()
|
|
7639
|
+
"revision": string().readonly(),
|
|
7640
|
+
"adminEdit": union([literal(null), object({
|
|
7641
|
+
"actorId": string().readonly(),
|
|
7642
|
+
"at": string().readonly()
|
|
7643
|
+
})]).readonly()
|
|
7211
7644
|
})).readonly() });
|
|
7212
7645
|
const _yadsh_dsh_qa_surface_qaSurface_skillsRemove_parameter_0$schema = string();
|
|
7213
7646
|
const _yadsh_dsh_qa_surface_qaSurface_skillsRemove_parameter_1$schema = string();
|
|
@@ -7242,8 +7675,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7242
7675
|
number(),
|
|
7243
7676
|
literal(false),
|
|
7244
7677
|
literal(true),
|
|
7245
|
-
array(lazy(() => QaSkillJsonValueRemoteCodec$
|
|
7246
|
-
record$2(string(), lazy(() => QaSkillJsonValueRemoteCodec$
|
|
7678
|
+
array(lazy(() => QaSkillJsonValueRemoteCodec$schema5)),
|
|
7679
|
+
record$2(string(), lazy(() => QaSkillJsonValueRemoteCodec$schema5)).readonly()
|
|
7247
7680
|
])).readonly().readonly(),
|
|
7248
7681
|
"sourcePath": string().readonly(),
|
|
7249
7682
|
"preview": string().readonly(),
|
|
@@ -7279,12 +7712,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7279
7712
|
literal("unknown-field"),
|
|
7280
7713
|
literal("resource-unsupported")
|
|
7281
7714
|
]).readonly(),
|
|
7282
|
-
"severity": union([literal("
|
|
7715
|
+
"severity": union([literal("error"), literal("warning")]).readonly(),
|
|
7283
7716
|
"field": union([literal(null), string()]).readonly(),
|
|
7284
7717
|
"detail": union([literal(null), string()]).readonly()
|
|
7285
7718
|
})).readonly(),
|
|
7286
7719
|
"updatedAt": union([literal(null), string()]).readonly(),
|
|
7287
|
-
"revision": string().readonly()
|
|
7720
|
+
"revision": string().readonly(),
|
|
7721
|
+
"adminEdit": union([literal(null), object({
|
|
7722
|
+
"actorId": string().readonly(),
|
|
7723
|
+
"at": string().readonly()
|
|
7724
|
+
})]).readonly()
|
|
7288
7725
|
});
|
|
7289
7726
|
const _yadsh_dsh_qa_surface_qaSurface_skillsValidate_parameter_0$schema = string();
|
|
7290
7727
|
const _yadsh_dsh_qa_surface_qaSurface_skillsValidate_parameter_1$schema = union([literal(null), string()]);
|
|
@@ -7323,7 +7760,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7323
7760
|
literal("unknown-field"),
|
|
7324
7761
|
literal("resource-unsupported")
|
|
7325
7762
|
]).readonly(),
|
|
7326
|
-
"severity": union([literal("
|
|
7763
|
+
"severity": union([literal("error"), literal("warning")]).readonly(),
|
|
7327
7764
|
"field": union([literal(null), string()]).readonly(),
|
|
7328
7765
|
"detail": union([literal(null), string()]).readonly()
|
|
7329
7766
|
})).readonly()
|
|
@@ -7533,7 +7970,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7533
7970
|
},
|
|
7534
7971
|
sourceLocation: {
|
|
7535
7972
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7536
|
-
"line":
|
|
7973
|
+
"line": 907,
|
|
7537
7974
|
"column": 9
|
|
7538
7975
|
}
|
|
7539
7976
|
},
|
|
@@ -7569,7 +8006,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7569
8006
|
},
|
|
7570
8007
|
sourceLocation: {
|
|
7571
8008
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7572
|
-
"line":
|
|
8009
|
+
"line": 918,
|
|
7573
8010
|
"column": 3
|
|
7574
8011
|
}
|
|
7575
8012
|
},
|
|
@@ -7596,7 +8033,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7596
8033
|
},
|
|
7597
8034
|
sourceLocation: {
|
|
7598
8035
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7599
|
-
"line":
|
|
8036
|
+
"line": 892,
|
|
7600
8037
|
"column": 3
|
|
7601
8038
|
}
|
|
7602
8039
|
},
|
|
@@ -7645,7 +8082,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7645
8082
|
},
|
|
7646
8083
|
sourceLocation: {
|
|
7647
8084
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7648
|
-
"line":
|
|
8085
|
+
"line": 932,
|
|
7649
8086
|
"column": 3
|
|
7650
8087
|
}
|
|
7651
8088
|
},
|
|
@@ -7681,7 +8118,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7681
8118
|
},
|
|
7682
8119
|
sourceLocation: {
|
|
7683
8120
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7684
|
-
"line":
|
|
8121
|
+
"line": 898,
|
|
7685
8122
|
"column": 3
|
|
7686
8123
|
}
|
|
7687
8124
|
},
|
|
@@ -7717,7 +8154,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7717
8154
|
},
|
|
7718
8155
|
sourceLocation: {
|
|
7719
8156
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7720
|
-
"line":
|
|
8157
|
+
"line": 977,
|
|
7721
8158
|
"column": 3
|
|
7722
8159
|
}
|
|
7723
8160
|
},
|
|
@@ -7766,7 +8203,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7766
8203
|
},
|
|
7767
8204
|
sourceLocation: {
|
|
7768
8205
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7769
|
-
"line":
|
|
8206
|
+
"line": 954,
|
|
7770
8207
|
"column": 3
|
|
7771
8208
|
}
|
|
7772
8209
|
},
|
|
@@ -7802,7 +8239,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7802
8239
|
},
|
|
7803
8240
|
sourceLocation: {
|
|
7804
8241
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7805
|
-
"line":
|
|
8242
|
+
"line": 944,
|
|
7806
8243
|
"column": 3
|
|
7807
8244
|
}
|
|
7808
8245
|
},
|
|
@@ -7838,7 +8275,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7838
8275
|
},
|
|
7839
8276
|
sourceLocation: {
|
|
7840
8277
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7841
|
-
"line":
|
|
8278
|
+
"line": 966,
|
|
7842
8279
|
"column": 3
|
|
7843
8280
|
}
|
|
7844
8281
|
},
|
|
@@ -7887,7 +8324,56 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7887
8324
|
},
|
|
7888
8325
|
sourceLocation: {
|
|
7889
8326
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7890
|
-
"line":
|
|
8327
|
+
"line": 925,
|
|
8328
|
+
"column": 3
|
|
8329
|
+
}
|
|
8330
|
+
},
|
|
8331
|
+
{
|
|
8332
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/accountsChangePassword",
|
|
8333
|
+
service: "qaSurface",
|
|
8334
|
+
namespace: "qaSurface",
|
|
8335
|
+
method: "accountsChangePassword",
|
|
8336
|
+
invocation: { kind: "direct" },
|
|
8337
|
+
parameters: [
|
|
8338
|
+
{
|
|
8339
|
+
name: "token",
|
|
8340
|
+
wire: "token",
|
|
8341
|
+
source: "json",
|
|
8342
|
+
codec: {
|
|
8343
|
+
mode: "strict",
|
|
8344
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/accountsChangePassword:token",
|
|
8345
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsChangePassword_parameter_0$schema
|
|
8346
|
+
}
|
|
8347
|
+
},
|
|
8348
|
+
{
|
|
8349
|
+
name: "currentPassword",
|
|
8350
|
+
wire: "currentPassword",
|
|
8351
|
+
source: "json",
|
|
8352
|
+
codec: {
|
|
8353
|
+
mode: "strict",
|
|
8354
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/accountsChangePassword:currentPassword",
|
|
8355
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsChangePassword_parameter_1$schema
|
|
8356
|
+
}
|
|
8357
|
+
},
|
|
8358
|
+
{
|
|
8359
|
+
name: "nextPassword",
|
|
8360
|
+
wire: "nextPassword",
|
|
8361
|
+
source: "json",
|
|
8362
|
+
codec: {
|
|
8363
|
+
mode: "strict",
|
|
8364
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/accountsChangePassword:nextPassword",
|
|
8365
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsChangePassword_parameter_2$schema
|
|
8366
|
+
}
|
|
8367
|
+
}
|
|
8368
|
+
],
|
|
8369
|
+
result: {
|
|
8370
|
+
mode: "strict",
|
|
8371
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaAccountSession",
|
|
8372
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsChangePassword_result$schema
|
|
8373
|
+
},
|
|
8374
|
+
sourceLocation: {
|
|
8375
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8376
|
+
"line": 648,
|
|
7891
8377
|
"column": 3
|
|
7892
8378
|
}
|
|
7893
8379
|
},
|
|
@@ -7923,7 +8409,43 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7923
8409
|
},
|
|
7924
8410
|
sourceLocation: {
|
|
7925
8411
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7926
|
-
"line":
|
|
8412
|
+
"line": 682,
|
|
8413
|
+
"column": 3
|
|
8414
|
+
}
|
|
8415
|
+
},
|
|
8416
|
+
{
|
|
8417
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/accountsCreateServiceToken",
|
|
8418
|
+
service: "qaSurface",
|
|
8419
|
+
namespace: "qaSurface",
|
|
8420
|
+
method: "accountsCreateServiceToken",
|
|
8421
|
+
invocation: { kind: "direct" },
|
|
8422
|
+
parameters: [{
|
|
8423
|
+
name: "token",
|
|
8424
|
+
wire: "token",
|
|
8425
|
+
source: "json",
|
|
8426
|
+
codec: {
|
|
8427
|
+
mode: "strict",
|
|
8428
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/accountsCreateServiceToken:token",
|
|
8429
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsCreateServiceToken_parameter_0$schema
|
|
8430
|
+
}
|
|
8431
|
+
}, {
|
|
8432
|
+
name: "input",
|
|
8433
|
+
wire: "input",
|
|
8434
|
+
source: "json",
|
|
8435
|
+
codec: {
|
|
8436
|
+
mode: "strict",
|
|
8437
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaServiceTokenCreateInput",
|
|
8438
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsCreateServiceToken_parameter_1$schema
|
|
8439
|
+
}
|
|
8440
|
+
}],
|
|
8441
|
+
result: {
|
|
8442
|
+
mode: "strict",
|
|
8443
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaIssuedServiceToken",
|
|
8444
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsCreateServiceToken_result$schema
|
|
8445
|
+
},
|
|
8446
|
+
sourceLocation: {
|
|
8447
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8448
|
+
"line": 755,
|
|
7927
8449
|
"column": 3
|
|
7928
8450
|
}
|
|
7929
8451
|
},
|
|
@@ -7950,7 +8472,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7950
8472
|
},
|
|
7951
8473
|
sourceLocation: {
|
|
7952
8474
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7953
|
-
"line":
|
|
8475
|
+
"line": 703,
|
|
8476
|
+
"column": 3
|
|
8477
|
+
}
|
|
8478
|
+
},
|
|
8479
|
+
{
|
|
8480
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/accountsListServiceTokens",
|
|
8481
|
+
service: "qaSurface",
|
|
8482
|
+
namespace: "qaSurface",
|
|
8483
|
+
method: "accountsListServiceTokens",
|
|
8484
|
+
invocation: { kind: "direct" },
|
|
8485
|
+
parameters: [{
|
|
8486
|
+
name: "token",
|
|
8487
|
+
wire: "token",
|
|
8488
|
+
source: "json",
|
|
8489
|
+
codec: {
|
|
8490
|
+
mode: "strict",
|
|
8491
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/accountsListServiceTokens:token",
|
|
8492
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsListServiceTokens_parameter_0$schema
|
|
8493
|
+
}
|
|
8494
|
+
}],
|
|
8495
|
+
result: {
|
|
8496
|
+
mode: "strict",
|
|
8497
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/accountsListServiceTokens:result",
|
|
8498
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsListServiceTokens_result$schema
|
|
8499
|
+
},
|
|
8500
|
+
sourceLocation: {
|
|
8501
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8502
|
+
"line": 742,
|
|
7954
8503
|
"column": 3
|
|
7955
8504
|
}
|
|
7956
8505
|
},
|
|
@@ -7986,7 +8535,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7986
8535
|
},
|
|
7987
8536
|
sourceLocation: {
|
|
7988
8537
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
7989
|
-
"line":
|
|
8538
|
+
"line": 642,
|
|
7990
8539
|
"column": 3
|
|
7991
8540
|
}
|
|
7992
8541
|
},
|
|
@@ -8013,7 +8562,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8013
8562
|
},
|
|
8014
8563
|
sourceLocation: {
|
|
8015
8564
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8016
|
-
"line":
|
|
8565
|
+
"line": 693,
|
|
8017
8566
|
"column": 3
|
|
8018
8567
|
}
|
|
8019
8568
|
},
|
|
@@ -8049,7 +8598,70 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8049
8598
|
},
|
|
8050
8599
|
sourceLocation: {
|
|
8051
8600
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8052
|
-
"line":
|
|
8601
|
+
"line": 637,
|
|
8602
|
+
"column": 3
|
|
8603
|
+
}
|
|
8604
|
+
},
|
|
8605
|
+
{
|
|
8606
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/accountsRequestPasswordReset",
|
|
8607
|
+
service: "qaSurface",
|
|
8608
|
+
namespace: "qaSurface",
|
|
8609
|
+
method: "accountsRequestPasswordReset",
|
|
8610
|
+
invocation: { kind: "direct" },
|
|
8611
|
+
parameters: [{
|
|
8612
|
+
name: "email",
|
|
8613
|
+
wire: "email",
|
|
8614
|
+
source: "json",
|
|
8615
|
+
codec: {
|
|
8616
|
+
mode: "strict",
|
|
8617
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/accountsRequestPasswordReset:email",
|
|
8618
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsRequestPasswordReset_parameter_0$schema
|
|
8619
|
+
}
|
|
8620
|
+
}],
|
|
8621
|
+
result: {
|
|
8622
|
+
mode: "strict",
|
|
8623
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/accountsRequestPasswordReset:result",
|
|
8624
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsRequestPasswordReset_result$schema
|
|
8625
|
+
},
|
|
8626
|
+
sourceLocation: {
|
|
8627
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8628
|
+
"line": 666,
|
|
8629
|
+
"column": 3
|
|
8630
|
+
}
|
|
8631
|
+
},
|
|
8632
|
+
{
|
|
8633
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/accountsRevokeServiceToken",
|
|
8634
|
+
service: "qaSurface",
|
|
8635
|
+
namespace: "qaSurface",
|
|
8636
|
+
method: "accountsRevokeServiceToken",
|
|
8637
|
+
invocation: { kind: "direct" },
|
|
8638
|
+
parameters: [{
|
|
8639
|
+
name: "token",
|
|
8640
|
+
wire: "token",
|
|
8641
|
+
source: "json",
|
|
8642
|
+
codec: {
|
|
8643
|
+
mode: "strict",
|
|
8644
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/accountsRevokeServiceToken:token",
|
|
8645
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsRevokeServiceToken_parameter_0$schema
|
|
8646
|
+
}
|
|
8647
|
+
}, {
|
|
8648
|
+
name: "tokenId",
|
|
8649
|
+
wire: "tokenId",
|
|
8650
|
+
source: "json",
|
|
8651
|
+
codec: {
|
|
8652
|
+
mode: "strict",
|
|
8653
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/accountsRevokeServiceToken:tokenId",
|
|
8654
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsRevokeServiceToken_parameter_1$schema
|
|
8655
|
+
}
|
|
8656
|
+
}],
|
|
8657
|
+
result: {
|
|
8658
|
+
mode: "strict",
|
|
8659
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/accountsRevokeServiceToken:result",
|
|
8660
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_accountsRevokeServiceToken_result$schema
|
|
8661
|
+
},
|
|
8662
|
+
sourceLocation: {
|
|
8663
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8664
|
+
"line": 768,
|
|
8053
8665
|
"column": 3
|
|
8054
8666
|
}
|
|
8055
8667
|
},
|
|
@@ -8085,7 +8697,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8085
8697
|
},
|
|
8086
8698
|
sourceLocation: {
|
|
8087
8699
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8088
|
-
"line":
|
|
8700
|
+
"line": 716,
|
|
8089
8701
|
"column": 3
|
|
8090
8702
|
}
|
|
8091
8703
|
},
|
|
@@ -8121,7 +8733,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8121
8733
|
},
|
|
8122
8734
|
sourceLocation: {
|
|
8123
8735
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8124
|
-
"line":
|
|
8736
|
+
"line": 729,
|
|
8125
8737
|
"column": 3
|
|
8126
8738
|
}
|
|
8127
8739
|
},
|
|
@@ -8148,7 +8760,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8148
8760
|
},
|
|
8149
8761
|
sourceLocation: {
|
|
8150
8762
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8151
|
-
"line":
|
|
8763
|
+
"line": 672,
|
|
8152
8764
|
"column": 3
|
|
8153
8765
|
}
|
|
8154
8766
|
},
|
|
@@ -8207,7 +8819,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8207
8819
|
},
|
|
8208
8820
|
sourceLocation: {
|
|
8209
8821
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8210
|
-
"line":
|
|
8822
|
+
"line": 1243,
|
|
8211
8823
|
"column": 3
|
|
8212
8824
|
}
|
|
8213
8825
|
},
|
|
@@ -8243,7 +8855,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8243
8855
|
},
|
|
8244
8856
|
sourceLocation: {
|
|
8245
8857
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8246
|
-
"line":
|
|
8858
|
+
"line": 1145,
|
|
8247
8859
|
"column": 3
|
|
8248
8860
|
}
|
|
8249
8861
|
},
|
|
@@ -8302,7 +8914,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8302
8914
|
},
|
|
8303
8915
|
sourceLocation: {
|
|
8304
8916
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8305
|
-
"line":
|
|
8917
|
+
"line": 1127,
|
|
8306
8918
|
"column": 3
|
|
8307
8919
|
}
|
|
8308
8920
|
},
|
|
@@ -8338,7 +8950,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8338
8950
|
},
|
|
8339
8951
|
sourceLocation: {
|
|
8340
8952
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8341
|
-
"line":
|
|
8953
|
+
"line": 1160,
|
|
8342
8954
|
"column": 3
|
|
8343
8955
|
}
|
|
8344
8956
|
},
|
|
@@ -8397,7 +9009,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8397
9009
|
},
|
|
8398
9010
|
sourceLocation: {
|
|
8399
9011
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8400
|
-
"line":
|
|
9012
|
+
"line": 1170,
|
|
8401
9013
|
"column": 3
|
|
8402
9014
|
}
|
|
8403
9015
|
},
|
|
@@ -8424,7 +9036,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8424
9036
|
},
|
|
8425
9037
|
sourceLocation: {
|
|
8426
9038
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8427
|
-
"line":
|
|
9039
|
+
"line": 1238,
|
|
8428
9040
|
"column": 3
|
|
8429
9041
|
}
|
|
8430
9042
|
},
|
|
@@ -8451,7 +9063,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8451
9063
|
},
|
|
8452
9064
|
sourceLocation: {
|
|
8453
9065
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8454
|
-
"line":
|
|
9066
|
+
"line": 1073,
|
|
9067
|
+
"column": 3
|
|
9068
|
+
}
|
|
9069
|
+
},
|
|
9070
|
+
{
|
|
9071
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/adminPasswordResetRequests",
|
|
9072
|
+
service: "qaSurface",
|
|
9073
|
+
namespace: "qaSurface",
|
|
9074
|
+
method: "adminPasswordResetRequests",
|
|
9075
|
+
invocation: { kind: "direct" },
|
|
9076
|
+
parameters: [{
|
|
9077
|
+
name: "token",
|
|
9078
|
+
wire: "token",
|
|
9079
|
+
source: "json",
|
|
9080
|
+
codec: {
|
|
9081
|
+
mode: "strict",
|
|
9082
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminPasswordResetRequests:token",
|
|
9083
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminPasswordResetRequests_parameter_0$schema
|
|
9084
|
+
}
|
|
9085
|
+
}],
|
|
9086
|
+
result: {
|
|
9087
|
+
mode: "strict",
|
|
9088
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminPasswordResetRequests:result",
|
|
9089
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminPasswordResetRequests_result$schema
|
|
9090
|
+
},
|
|
9091
|
+
sourceLocation: {
|
|
9092
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9093
|
+
"line": 1107,
|
|
8455
9094
|
"column": 3
|
|
8456
9095
|
}
|
|
8457
9096
|
},
|
|
@@ -8500,7 +9139,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8500
9139
|
},
|
|
8501
9140
|
sourceLocation: {
|
|
8502
9141
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8503
|
-
"line":
|
|
9142
|
+
"line": 1215,
|
|
8504
9143
|
"column": 3
|
|
8505
9144
|
}
|
|
8506
9145
|
},
|
|
@@ -8559,7 +9198,56 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8559
9198
|
},
|
|
8560
9199
|
sourceLocation: {
|
|
8561
9200
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8562
|
-
"line":
|
|
9201
|
+
"line": 1191,
|
|
9202
|
+
"column": 3
|
|
9203
|
+
}
|
|
9204
|
+
},
|
|
9205
|
+
{
|
|
9206
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/adminResetPassword",
|
|
9207
|
+
service: "qaSurface",
|
|
9208
|
+
namespace: "qaSurface",
|
|
9209
|
+
method: "adminResetPassword",
|
|
9210
|
+
invocation: { kind: "direct" },
|
|
9211
|
+
parameters: [
|
|
9212
|
+
{
|
|
9213
|
+
name: "token",
|
|
9214
|
+
wire: "token",
|
|
9215
|
+
source: "json",
|
|
9216
|
+
codec: {
|
|
9217
|
+
mode: "strict",
|
|
9218
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminResetPassword:token",
|
|
9219
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminResetPassword_parameter_0$schema
|
|
9220
|
+
}
|
|
9221
|
+
},
|
|
9222
|
+
{
|
|
9223
|
+
name: "userId",
|
|
9224
|
+
wire: "userId",
|
|
9225
|
+
source: "json",
|
|
9226
|
+
codec: {
|
|
9227
|
+
mode: "strict",
|
|
9228
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminResetPassword:userId",
|
|
9229
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminResetPassword_parameter_1$schema
|
|
9230
|
+
}
|
|
9231
|
+
},
|
|
9232
|
+
{
|
|
9233
|
+
name: "password",
|
|
9234
|
+
wire: "password",
|
|
9235
|
+
source: "json",
|
|
9236
|
+
codec: {
|
|
9237
|
+
mode: "strict",
|
|
9238
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminResetPassword:password",
|
|
9239
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminResetPassword_parameter_2$schema
|
|
9240
|
+
}
|
|
9241
|
+
}
|
|
9242
|
+
],
|
|
9243
|
+
result: {
|
|
9244
|
+
mode: "strict",
|
|
9245
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaAdminUserDetail",
|
|
9246
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminResetPassword_result$schema
|
|
9247
|
+
},
|
|
9248
|
+
sourceLocation: {
|
|
9249
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9250
|
+
"line": 1116,
|
|
8563
9251
|
"column": 3
|
|
8564
9252
|
}
|
|
8565
9253
|
},
|
|
@@ -8608,7 +9296,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8608
9296
|
},
|
|
8609
9297
|
sourceLocation: {
|
|
8610
9298
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8611
|
-
"line":
|
|
9299
|
+
"line": 1203,
|
|
8612
9300
|
"column": 3
|
|
8613
9301
|
}
|
|
8614
9302
|
},
|
|
@@ -8644,7 +9332,305 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8644
9332
|
},
|
|
8645
9333
|
sourceLocation: {
|
|
8646
9334
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8647
|
-
"line":
|
|
9335
|
+
"line": 1230,
|
|
9336
|
+
"column": 3
|
|
9337
|
+
}
|
|
9338
|
+
},
|
|
9339
|
+
{
|
|
9340
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/adminSkill",
|
|
9341
|
+
service: "qaSurface",
|
|
9342
|
+
namespace: "qaSurface",
|
|
9343
|
+
method: "adminSkill",
|
|
9344
|
+
invocation: { kind: "direct" },
|
|
9345
|
+
parameters: [
|
|
9346
|
+
{
|
|
9347
|
+
name: "token",
|
|
9348
|
+
wire: "token",
|
|
9349
|
+
source: "json",
|
|
9350
|
+
codec: {
|
|
9351
|
+
mode: "strict",
|
|
9352
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminSkill:token",
|
|
9353
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkill_parameter_0$schema
|
|
9354
|
+
}
|
|
9355
|
+
},
|
|
9356
|
+
{
|
|
9357
|
+
name: "scope",
|
|
9358
|
+
wire: "scope",
|
|
9359
|
+
source: "json",
|
|
9360
|
+
codec: {
|
|
9361
|
+
mode: "strict",
|
|
9362
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaAdminSkillScope",
|
|
9363
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkill_parameter_1$schema
|
|
9364
|
+
}
|
|
9365
|
+
},
|
|
9366
|
+
{
|
|
9367
|
+
name: "name",
|
|
9368
|
+
wire: "name",
|
|
9369
|
+
source: "json",
|
|
9370
|
+
codec: {
|
|
9371
|
+
mode: "strict",
|
|
9372
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminSkill:name",
|
|
9373
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkill_parameter_2$schema
|
|
9374
|
+
}
|
|
9375
|
+
}
|
|
9376
|
+
],
|
|
9377
|
+
result: {
|
|
9378
|
+
mode: "strict",
|
|
9379
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaSkillDocument",
|
|
9380
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkill_result$schema
|
|
9381
|
+
},
|
|
9382
|
+
sourceLocation: {
|
|
9383
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9384
|
+
"line": 1007,
|
|
9385
|
+
"column": 3
|
|
9386
|
+
}
|
|
9387
|
+
},
|
|
9388
|
+
{
|
|
9389
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/adminSkillDelete",
|
|
9390
|
+
service: "qaSurface",
|
|
9391
|
+
namespace: "qaSurface",
|
|
9392
|
+
method: "adminSkillDelete",
|
|
9393
|
+
invocation: { kind: "direct" },
|
|
9394
|
+
parameters: [
|
|
9395
|
+
{
|
|
9396
|
+
name: "token",
|
|
9397
|
+
wire: "token",
|
|
9398
|
+
source: "json",
|
|
9399
|
+
codec: {
|
|
9400
|
+
mode: "strict",
|
|
9401
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminSkillDelete:token",
|
|
9402
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillDelete_parameter_0$schema
|
|
9403
|
+
}
|
|
9404
|
+
},
|
|
9405
|
+
{
|
|
9406
|
+
name: "scope",
|
|
9407
|
+
wire: "scope",
|
|
9408
|
+
source: "json",
|
|
9409
|
+
codec: {
|
|
9410
|
+
mode: "strict",
|
|
9411
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaAdminSkillScope",
|
|
9412
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillDelete_parameter_1$schema
|
|
9413
|
+
}
|
|
9414
|
+
},
|
|
9415
|
+
{
|
|
9416
|
+
name: "name",
|
|
9417
|
+
wire: "name",
|
|
9418
|
+
source: "json",
|
|
9419
|
+
codec: {
|
|
9420
|
+
mode: "strict",
|
|
9421
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminSkillDelete:name",
|
|
9422
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillDelete_parameter_2$schema
|
|
9423
|
+
}
|
|
9424
|
+
},
|
|
9425
|
+
{
|
|
9426
|
+
name: "expectedRevision",
|
|
9427
|
+
wire: "expectedRevision",
|
|
9428
|
+
source: "json",
|
|
9429
|
+
codec: {
|
|
9430
|
+
mode: "strict",
|
|
9431
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminSkillDelete:expectedRevision",
|
|
9432
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillDelete_parameter_3$schema
|
|
9433
|
+
}
|
|
9434
|
+
}
|
|
9435
|
+
],
|
|
9436
|
+
result: {
|
|
9437
|
+
mode: "strict",
|
|
9438
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaSkillRemoval",
|
|
9439
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillDelete_result$schema
|
|
9440
|
+
},
|
|
9441
|
+
sourceLocation: {
|
|
9442
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9443
|
+
"line": 1035,
|
|
9444
|
+
"column": 3
|
|
9445
|
+
}
|
|
9446
|
+
},
|
|
9447
|
+
{
|
|
9448
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/adminSkills",
|
|
9449
|
+
service: "qaSurface",
|
|
9450
|
+
namespace: "qaSurface",
|
|
9451
|
+
method: "adminSkills",
|
|
9452
|
+
invocation: { kind: "direct" },
|
|
9453
|
+
parameters: [{
|
|
9454
|
+
name: "token",
|
|
9455
|
+
wire: "token",
|
|
9456
|
+
source: "json",
|
|
9457
|
+
codec: {
|
|
9458
|
+
mode: "strict",
|
|
9459
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminSkills:token",
|
|
9460
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkills_parameter_0$schema
|
|
9461
|
+
}
|
|
9462
|
+
}, {
|
|
9463
|
+
name: "scope",
|
|
9464
|
+
wire: "scope",
|
|
9465
|
+
source: "json",
|
|
9466
|
+
codec: {
|
|
9467
|
+
mode: "strict",
|
|
9468
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaAdminSkillScope",
|
|
9469
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkills_parameter_1$schema
|
|
9470
|
+
}
|
|
9471
|
+
}],
|
|
9472
|
+
result: {
|
|
9473
|
+
mode: "strict",
|
|
9474
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaAdminSkillsView",
|
|
9475
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkills_result$schema
|
|
9476
|
+
},
|
|
9477
|
+
sourceLocation: {
|
|
9478
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9479
|
+
"line": 998,
|
|
9480
|
+
"column": 3
|
|
9481
|
+
}
|
|
9482
|
+
},
|
|
9483
|
+
{
|
|
9484
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/adminSkillSave",
|
|
9485
|
+
service: "qaSurface",
|
|
9486
|
+
namespace: "qaSurface",
|
|
9487
|
+
method: "adminSkillSave",
|
|
9488
|
+
invocation: { kind: "direct" },
|
|
9489
|
+
parameters: [
|
|
9490
|
+
{
|
|
9491
|
+
name: "token",
|
|
9492
|
+
wire: "token",
|
|
9493
|
+
source: "json",
|
|
9494
|
+
codec: {
|
|
9495
|
+
mode: "strict",
|
|
9496
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminSkillSave:token",
|
|
9497
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillSave_parameter_0$schema
|
|
9498
|
+
}
|
|
9499
|
+
},
|
|
9500
|
+
{
|
|
9501
|
+
name: "scope",
|
|
9502
|
+
wire: "scope",
|
|
9503
|
+
source: "json",
|
|
9504
|
+
codec: {
|
|
9505
|
+
mode: "strict",
|
|
9506
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaAdminSkillScope",
|
|
9507
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillSave_parameter_1$schema
|
|
9508
|
+
}
|
|
9509
|
+
},
|
|
9510
|
+
{
|
|
9511
|
+
name: "name",
|
|
9512
|
+
wire: "name",
|
|
9513
|
+
source: "json",
|
|
9514
|
+
codec: {
|
|
9515
|
+
mode: "strict",
|
|
9516
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminSkillSave:name",
|
|
9517
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillSave_parameter_2$schema
|
|
9518
|
+
}
|
|
9519
|
+
},
|
|
9520
|
+
{
|
|
9521
|
+
name: "input",
|
|
9522
|
+
wire: "input",
|
|
9523
|
+
source: "json",
|
|
9524
|
+
codec: {
|
|
9525
|
+
mode: "strict",
|
|
9526
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaSkillDraftInput",
|
|
9527
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillSave_parameter_3$schema
|
|
9528
|
+
}
|
|
9529
|
+
}
|
|
9530
|
+
],
|
|
9531
|
+
result: {
|
|
9532
|
+
mode: "strict",
|
|
9533
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaSkillDocument",
|
|
9534
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillSave_result$schema
|
|
9535
|
+
},
|
|
9536
|
+
sourceLocation: {
|
|
9537
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9538
|
+
"line": 1022,
|
|
9539
|
+
"column": 3
|
|
9540
|
+
}
|
|
9541
|
+
},
|
|
9542
|
+
{
|
|
9543
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/adminSkillTools",
|
|
9544
|
+
service: "qaSurface",
|
|
9545
|
+
namespace: "qaSurface",
|
|
9546
|
+
method: "adminSkillTools",
|
|
9547
|
+
invocation: { kind: "direct" },
|
|
9548
|
+
parameters: [{
|
|
9549
|
+
name: "token",
|
|
9550
|
+
wire: "token",
|
|
9551
|
+
source: "json",
|
|
9552
|
+
codec: {
|
|
9553
|
+
mode: "strict",
|
|
9554
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminSkillTools:token",
|
|
9555
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillTools_parameter_0$schema
|
|
9556
|
+
}
|
|
9557
|
+
}, {
|
|
9558
|
+
name: "scope",
|
|
9559
|
+
wire: "scope",
|
|
9560
|
+
source: "json",
|
|
9561
|
+
codec: {
|
|
9562
|
+
mode: "strict",
|
|
9563
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaAdminSkillScope",
|
|
9564
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillTools_parameter_1$schema
|
|
9565
|
+
}
|
|
9566
|
+
}],
|
|
9567
|
+
result: {
|
|
9568
|
+
mode: "strict",
|
|
9569
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminSkillTools:result",
|
|
9570
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillTools_result$schema
|
|
9571
|
+
},
|
|
9572
|
+
sourceLocation: {
|
|
9573
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9574
|
+
"line": 1061,
|
|
9575
|
+
"column": 9
|
|
9576
|
+
}
|
|
9577
|
+
},
|
|
9578
|
+
{
|
|
9579
|
+
id: "@yadsh/dsh-qa-surface#qaSurface/adminSkillValidate",
|
|
9580
|
+
service: "qaSurface",
|
|
9581
|
+
namespace: "qaSurface",
|
|
9582
|
+
method: "adminSkillValidate",
|
|
9583
|
+
invocation: { kind: "direct" },
|
|
9584
|
+
parameters: [
|
|
9585
|
+
{
|
|
9586
|
+
name: "token",
|
|
9587
|
+
wire: "token",
|
|
9588
|
+
source: "json",
|
|
9589
|
+
codec: {
|
|
9590
|
+
mode: "strict",
|
|
9591
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminSkillValidate:token",
|
|
9592
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillValidate_parameter_0$schema
|
|
9593
|
+
}
|
|
9594
|
+
},
|
|
9595
|
+
{
|
|
9596
|
+
name: "scope",
|
|
9597
|
+
wire: "scope",
|
|
9598
|
+
source: "json",
|
|
9599
|
+
codec: {
|
|
9600
|
+
mode: "strict",
|
|
9601
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaAdminSkillScope",
|
|
9602
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillValidate_parameter_1$schema
|
|
9603
|
+
}
|
|
9604
|
+
},
|
|
9605
|
+
{
|
|
9606
|
+
name: "name",
|
|
9607
|
+
wire: "name",
|
|
9608
|
+
source: "json",
|
|
9609
|
+
codec: {
|
|
9610
|
+
mode: "strict",
|
|
9611
|
+
typeSymbol: "@yadsh/dsh-qa-surface#qaSurface/adminSkillValidate:name",
|
|
9612
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillValidate_parameter_2$schema
|
|
9613
|
+
}
|
|
9614
|
+
},
|
|
9615
|
+
{
|
|
9616
|
+
name: "input",
|
|
9617
|
+
wire: "input",
|
|
9618
|
+
source: "json",
|
|
9619
|
+
codec: {
|
|
9620
|
+
mode: "strict",
|
|
9621
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaSkillDraftInput",
|
|
9622
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillValidate_parameter_3$schema
|
|
9623
|
+
}
|
|
9624
|
+
}
|
|
9625
|
+
],
|
|
9626
|
+
result: {
|
|
9627
|
+
mode: "strict",
|
|
9628
|
+
typeSymbol: "@yadsh/dsh-qa-surface/types#QaSkillValidation",
|
|
9629
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_adminSkillValidate_result$schema
|
|
9630
|
+
},
|
|
9631
|
+
sourceLocation: {
|
|
9632
|
+
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9633
|
+
"line": 1048,
|
|
8648
9634
|
"column": 3
|
|
8649
9635
|
}
|
|
8650
9636
|
},
|
|
@@ -8693,7 +9679,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8693
9679
|
},
|
|
8694
9680
|
sourceLocation: {
|
|
8695
9681
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8696
|
-
"line":
|
|
9682
|
+
"line": 1096,
|
|
8697
9683
|
"column": 3
|
|
8698
9684
|
}
|
|
8699
9685
|
},
|
|
@@ -8729,7 +9715,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8729
9715
|
},
|
|
8730
9716
|
sourceLocation: {
|
|
8731
9717
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8732
|
-
"line":
|
|
9718
|
+
"line": 1090,
|
|
8733
9719
|
"column": 3
|
|
8734
9720
|
}
|
|
8735
9721
|
},
|
|
@@ -8788,7 +9774,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8788
9774
|
},
|
|
8789
9775
|
sourceLocation: {
|
|
8790
9776
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8791
|
-
"line":
|
|
9777
|
+
"line": 1078,
|
|
8792
9778
|
"column": 3
|
|
8793
9779
|
}
|
|
8794
9780
|
},
|
|
@@ -8847,7 +9833,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8847
9833
|
},
|
|
8848
9834
|
sourceLocation: {
|
|
8849
9835
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8850
|
-
"line":
|
|
9836
|
+
"line": 1319,
|
|
8851
9837
|
"column": 9
|
|
8852
9838
|
}
|
|
8853
9839
|
},
|
|
@@ -8906,7 +9892,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8906
9892
|
},
|
|
8907
9893
|
sourceLocation: {
|
|
8908
9894
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8909
|
-
"line":
|
|
9895
|
+
"line": 1348,
|
|
8910
9896
|
"column": 9
|
|
8911
9897
|
}
|
|
8912
9898
|
},
|
|
@@ -8955,7 +9941,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8955
9941
|
},
|
|
8956
9942
|
sourceLocation: {
|
|
8957
9943
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
8958
|
-
"line":
|
|
9944
|
+
"line": 1360,
|
|
8959
9945
|
"column": 9
|
|
8960
9946
|
}
|
|
8961
9947
|
},
|
|
@@ -9004,7 +9990,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9004
9990
|
},
|
|
9005
9991
|
sourceLocation: {
|
|
9006
9992
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9007
|
-
"line":
|
|
9993
|
+
"line": 793,
|
|
9008
9994
|
"column": 9
|
|
9009
9995
|
}
|
|
9010
9996
|
},
|
|
@@ -9022,7 +10008,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9022
10008
|
},
|
|
9023
10009
|
sourceLocation: {
|
|
9024
10010
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9025
|
-
"line":
|
|
10011
|
+
"line": 783,
|
|
9026
10012
|
"column": 3
|
|
9027
10013
|
}
|
|
9028
10014
|
},
|
|
@@ -9071,7 +10057,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9071
10057
|
},
|
|
9072
10058
|
sourceLocation: {
|
|
9073
10059
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9074
|
-
"line":
|
|
10060
|
+
"line": 1428,
|
|
9075
10061
|
"column": 9
|
|
9076
10062
|
}
|
|
9077
10063
|
},
|
|
@@ -9107,7 +10093,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9107
10093
|
},
|
|
9108
10094
|
sourceLocation: {
|
|
9109
10095
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9110
|
-
"line":
|
|
10096
|
+
"line": 1305,
|
|
9111
10097
|
"column": 9
|
|
9112
10098
|
}
|
|
9113
10099
|
},
|
|
@@ -9143,7 +10129,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9143
10129
|
},
|
|
9144
10130
|
sourceLocation: {
|
|
9145
10131
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9146
|
-
"line":
|
|
10132
|
+
"line": 1334,
|
|
9147
10133
|
"column": 9
|
|
9148
10134
|
}
|
|
9149
10135
|
},
|
|
@@ -9192,7 +10178,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9192
10178
|
},
|
|
9193
10179
|
sourceLocation: {
|
|
9194
10180
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9195
|
-
"line":
|
|
10181
|
+
"line": 1489,
|
|
9196
10182
|
"column": 9
|
|
9197
10183
|
}
|
|
9198
10184
|
},
|
|
@@ -9241,7 +10227,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9241
10227
|
},
|
|
9242
10228
|
sourceLocation: {
|
|
9243
10229
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9244
|
-
"line":
|
|
10230
|
+
"line": 1379,
|
|
9245
10231
|
"column": 9
|
|
9246
10232
|
}
|
|
9247
10233
|
},
|
|
@@ -9290,7 +10276,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9290
10276
|
},
|
|
9291
10277
|
sourceLocation: {
|
|
9292
10278
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9293
|
-
"line":
|
|
10279
|
+
"line": 1455,
|
|
9294
10280
|
"column": 9
|
|
9295
10281
|
}
|
|
9296
10282
|
},
|
|
@@ -9326,7 +10312,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9326
10312
|
},
|
|
9327
10313
|
sourceLocation: {
|
|
9328
10314
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9329
|
-
"line":
|
|
10315
|
+
"line": 1256,
|
|
9330
10316
|
"column": 9
|
|
9331
10317
|
}
|
|
9332
10318
|
},
|
|
@@ -9362,7 +10348,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9362
10348
|
},
|
|
9363
10349
|
sourceLocation: {
|
|
9364
10350
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9365
|
-
"line":
|
|
10351
|
+
"line": 1559,
|
|
9366
10352
|
"column": 3
|
|
9367
10353
|
}
|
|
9368
10354
|
},
|
|
@@ -9398,7 +10384,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9398
10384
|
},
|
|
9399
10385
|
sourceLocation: {
|
|
9400
10386
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9401
|
-
"line":
|
|
10387
|
+
"line": 1553,
|
|
9402
10388
|
"column": 3
|
|
9403
10389
|
}
|
|
9404
10390
|
},
|
|
@@ -9425,7 +10411,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9425
10411
|
},
|
|
9426
10412
|
sourceLocation: {
|
|
9427
10413
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9428
|
-
"line":
|
|
10414
|
+
"line": 1547,
|
|
9429
10415
|
"column": 3
|
|
9430
10416
|
}
|
|
9431
10417
|
},
|
|
@@ -9474,7 +10460,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9474
10460
|
},
|
|
9475
10461
|
sourceLocation: {
|
|
9476
10462
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9477
|
-
"line":
|
|
10463
|
+
"line": 1578,
|
|
9478
10464
|
"column": 3
|
|
9479
10465
|
}
|
|
9480
10466
|
},
|
|
@@ -9501,7 +10487,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9501
10487
|
},
|
|
9502
10488
|
sourceLocation: {
|
|
9503
10489
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9504
|
-
"line":
|
|
10490
|
+
"line": 1604,
|
|
9505
10491
|
"column": 3
|
|
9506
10492
|
}
|
|
9507
10493
|
},
|
|
@@ -9550,7 +10536,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9550
10536
|
},
|
|
9551
10537
|
sourceLocation: {
|
|
9552
10538
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9553
|
-
"line":
|
|
10539
|
+
"line": 1568,
|
|
9554
10540
|
"column": 3
|
|
9555
10541
|
}
|
|
9556
10542
|
},
|
|
@@ -9599,7 +10585,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9599
10585
|
},
|
|
9600
10586
|
sourceLocation: {
|
|
9601
10587
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9602
|
-
"line":
|
|
10588
|
+
"line": 1591,
|
|
9603
10589
|
"column": 3
|
|
9604
10590
|
}
|
|
9605
10591
|
},
|
|
@@ -9635,7 +10621,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9635
10621
|
},
|
|
9636
10622
|
sourceLocation: {
|
|
9637
10623
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9638
|
-
"line":
|
|
10624
|
+
"line": 1621,
|
|
9639
10625
|
"column": 3
|
|
9640
10626
|
}
|
|
9641
10627
|
},
|
|
@@ -9694,7 +10680,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9694
10680
|
},
|
|
9695
10681
|
sourceLocation: {
|
|
9696
10682
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9697
|
-
"line":
|
|
10683
|
+
"line": 1636,
|
|
9698
10684
|
"column": 3
|
|
9699
10685
|
}
|
|
9700
10686
|
},
|
|
@@ -9730,7 +10716,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9730
10716
|
},
|
|
9731
10717
|
sourceLocation: {
|
|
9732
10718
|
"file": "packages/dsh-qa-surface/src/index.ts",
|
|
9733
|
-
"line":
|
|
10719
|
+
"line": 1292,
|
|
9734
10720
|
"column": 9
|
|
9735
10721
|
}
|
|
9736
10722
|
}
|
|
@@ -10159,6 +11145,21 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
10159
11145
|
"patch",
|
|
10160
11146
|
"diff"
|
|
10161
11147
|
]);
|
|
11148
|
+
/**
|
|
11149
|
+
* Document extensions the stand's document pipeline can read, accepted on top
|
|
11150
|
+
* of the text files. A visitor who has the spec in Word should be able to hand
|
|
11151
|
+
* it over instead of retyping it, and a deployment that renders and converts
|
|
11152
|
+
* those formats is the one that can answer for them: this list is what stops
|
|
11153
|
+
* `attachments.extensions` from being text-only by construction.
|
|
11154
|
+
*/
|
|
11155
|
+
const DEFAULT_QA_DOCUMENT_EXTENSIONS = Object.freeze(["docx", "pdf"]);
|
|
11156
|
+
/**
|
|
11157
|
+
* What a visitor may attach to one message out of the box: the text files plus
|
|
11158
|
+
* the documents the pipeline reads. An operator names whatever their stand can
|
|
11159
|
+
* actually work with — the list is a ceiling, not a guarantee that the model
|
|
11160
|
+
* has a tool for every entry.
|
|
11161
|
+
*/
|
|
11162
|
+
const DEFAULT_QA_ATTACHMENT_EXTENSIONS = Object.freeze([...DEFAULT_QA_TEXT_EXTENSIONS, ...DEFAULT_QA_DOCUMENT_EXTENSIONS]);
|
|
10162
11163
|
const QA_PASTED_TEXT_LINES_MAX = 1e4;
|
|
10163
11164
|
const QA_MAX_FILE_BYTES_MIN = 1024;
|
|
10164
11165
|
const QA_MAX_FILE_BYTES_MAX = 52428800;
|
|
@@ -10172,7 +11173,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
10172
11173
|
* @param values - raw extension tokens from configuration.
|
|
10173
11174
|
* @returns the normalized token list.
|
|
10174
11175
|
*/
|
|
10175
|
-
function
|
|
11176
|
+
function normalizeAcceptedExtensions(values) {
|
|
10176
11177
|
const seen = /* @__PURE__ */ new Set();
|
|
10177
11178
|
const normalized = [];
|
|
10178
11179
|
for (const value of values) {
|
|
@@ -10184,19 +11185,29 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
10184
11185
|
return normalized;
|
|
10185
11186
|
}
|
|
10186
11187
|
/**
|
|
10187
|
-
*
|
|
11188
|
+
* The extension one file name carries, lowercase and without the dot. A name
|
|
11189
|
+
* without a dot, or with a hidden-file dot only (`.gitignore`), reports the
|
|
11190
|
+
* whole leaf, which no configured extension can match.
|
|
11191
|
+
* @param name - display file name.
|
|
11192
|
+
* @returns the extension token, or the leaf when there is none.
|
|
11193
|
+
*/
|
|
11194
|
+
function fileExtensionOf(name) {
|
|
11195
|
+
const leaf = name.trim().toLowerCase();
|
|
11196
|
+
if (leaf === "") return "";
|
|
11197
|
+
const dot = leaf.lastIndexOf(".");
|
|
11198
|
+
return dot <= 0 ? leaf : leaf.slice(dot + 1);
|
|
11199
|
+
}
|
|
11200
|
+
/**
|
|
11201
|
+
* Whether one file name carries an accepted extension. The comparison is
|
|
10188
11202
|
* case-insensitive; a name without a dot, or with a hidden-file dot only
|
|
10189
11203
|
* (`.gitignore`), is matched against the whole leaf.
|
|
10190
11204
|
* @param name - display file name.
|
|
10191
11205
|
* @param extensions - normalized accepted extensions.
|
|
10192
11206
|
* @returns whether the name matches one accepted extension.
|
|
10193
11207
|
*/
|
|
10194
|
-
function
|
|
10195
|
-
|
|
10196
|
-
|
|
10197
|
-
const dot = leaf.lastIndexOf(".");
|
|
10198
|
-
const suffix = dot <= 0 ? leaf : leaf.slice(dot + 1);
|
|
10199
|
-
return extensions.includes(suffix);
|
|
11208
|
+
function hasAcceptedExtension(name, extensions) {
|
|
11209
|
+
if (name.trim().toLowerCase() === "") return false;
|
|
11210
|
+
return extensions.includes(fileExtensionOf(name));
|
|
10200
11211
|
}
|
|
10201
11212
|
/**
|
|
10202
11213
|
* Count the lines of a pasted blob the way a reader counts them: a single
|
|
@@ -10481,7 +11492,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
10481
11492
|
pastedTextLines: 200,
|
|
10482
11493
|
maxFileBytes: 10485760,
|
|
10483
11494
|
maxPending: 8,
|
|
10484
|
-
extensions:
|
|
11495
|
+
extensions: DEFAULT_QA_ATTACHMENT_EXTENSIONS
|
|
11496
|
+
}),
|
|
11497
|
+
integration: Object.freeze({
|
|
11498
|
+
enabled: false,
|
|
11499
|
+
basePath: "/qa/api",
|
|
11500
|
+
tokenTtlDays: 90,
|
|
11501
|
+
requestTimeoutMs: 9e4,
|
|
11502
|
+
maxConcurrent: 4,
|
|
11503
|
+
requestsPerMinute: 60,
|
|
11504
|
+
maxRequestBytes: 33554432,
|
|
11505
|
+
maxAttachmentBytes: 10485760,
|
|
11506
|
+
maxAnswerCharacters: 4096
|
|
10485
11507
|
}),
|
|
10486
11508
|
notes: Object.freeze({
|
|
10487
11509
|
identity: Object.freeze({
|
|
@@ -10496,6 +11518,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
10496
11518
|
delegation: Object.freeze({
|
|
10497
11519
|
enabled: true,
|
|
10498
11520
|
template: ""
|
|
11521
|
+
}),
|
|
11522
|
+
documents: Object.freeze({
|
|
11523
|
+
enabled: true,
|
|
11524
|
+
template: ""
|
|
11525
|
+
}),
|
|
11526
|
+
sourcePriority: Object.freeze({
|
|
11527
|
+
enabled: true,
|
|
11528
|
+
template: ""
|
|
10499
11529
|
})
|
|
10500
11530
|
})
|
|
10501
11531
|
});
|
|
@@ -10615,7 +11645,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
10615
11645
|
pastedTextLines,
|
|
10616
11646
|
maxFileBytes,
|
|
10617
11647
|
maxPending,
|
|
10618
|
-
extensions:
|
|
11648
|
+
extensions: normalizeAcceptedExtensions(input.attachments?.extensions ?? DEFAULT_QA_SURFACE_CONFIG.attachments.extensions)
|
|
10619
11649
|
});
|
|
10620
11650
|
}
|
|
10621
11651
|
//#endregion
|
|
@@ -10665,6 +11695,80 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
10665
11695
|
})
|
|
10666
11696
|
};
|
|
10667
11697
|
}
|
|
11698
|
+
const QA_INTEGRATION_TTL_DAYS_MAX = 3650;
|
|
11699
|
+
const QA_INTEGRATION_TIMEOUT_MS_MIN = 5e3;
|
|
11700
|
+
const QA_INTEGRATION_TIMEOUT_MS_MAX = 6e5;
|
|
11701
|
+
const QA_INTEGRATION_BODY_BYTES_MIN = 1048576;
|
|
11702
|
+
const QA_INTEGRATION_BODY_BYTES_MAX = 67108864;
|
|
11703
|
+
const QA_INTEGRATION_ATTACHMENT_BYTES_MIN = 1024;
|
|
11704
|
+
const QA_INTEGRATION_ANSWER_CHARS_MAX = 65536;
|
|
11705
|
+
/**
|
|
11706
|
+
* Normalize the integration API's base path.
|
|
11707
|
+
*
|
|
11708
|
+
* It is a route namespace rather than a page: it may live under `/qa` (the
|
|
11709
|
+
* default does), because the web server tries its exact table before the QA
|
|
11710
|
+
* navigation's prefix, so `/qa/api/ask` never falls into the page route. What
|
|
11711
|
+
* it may not do is claim the operator root, the first-party `/api` namespace
|
|
11712
|
+
* or the plugin asset namespace.
|
|
11713
|
+
* @param value - the configured path.
|
|
11714
|
+
* @returns the path without a trailing slash.
|
|
11715
|
+
*/
|
|
11716
|
+
function normalizeIntegrationBasePath(value) {
|
|
11717
|
+
const trimmed = value.trim();
|
|
11718
|
+
if (trimmed === "" || !trimmed.startsWith("/")) throw new TypeError("dsh-qa-surface: integration.basePath must start with /");
|
|
11719
|
+
const path = trimmed.replace(/\/+$/u, "");
|
|
11720
|
+
if (path === "" || path === "/") throw new TypeError("dsh-qa-surface: integration.basePath cannot claim the operator root");
|
|
11721
|
+
if (path === "/api" || path.startsWith("/api/")) throw new TypeError("dsh-qa-surface: integration.basePath cannot claim /api");
|
|
11722
|
+
if (path === "/plugins" || path.startsWith("/plugins/")) throw new TypeError("dsh-qa-surface: integration.basePath cannot claim /plugins");
|
|
11723
|
+
return path;
|
|
11724
|
+
}
|
|
11725
|
+
/**
|
|
11726
|
+
* The integration API's slice of the resolved configuration.
|
|
11727
|
+
*
|
|
11728
|
+
* The endpoint is off unless a deployment asks for it: it is a network
|
|
11729
|
+
* surface reachable by anything that holds a token, and a QA stand that never
|
|
11730
|
+
* integrates anything must not grow one by accident.
|
|
11731
|
+
*
|
|
11732
|
+
* It also needs accounts. Integration tokens are issued to an account and
|
|
11733
|
+
* verified against it, so a deployment with `accounts.enabled: false` has
|
|
11734
|
+
* nothing to authenticate a caller with; switching the API on there is a
|
|
11735
|
+
* configuration mistake, and it is refused rather than served open.
|
|
11736
|
+
*
|
|
11737
|
+
* @param input - raw integration config.
|
|
11738
|
+
* @param accounts - the resolved accounts domain, for the cross-check.
|
|
11739
|
+
* @returns the frozen resolved slice.
|
|
11740
|
+
*/
|
|
11741
|
+
function resolveIntegration(input, accounts) {
|
|
11742
|
+
const fallback = DEFAULT_QA_SURFACE_CONFIG.integration;
|
|
11743
|
+
const enabled = input?.enabled ?? fallback.enabled;
|
|
11744
|
+
const basePath = normalizeIntegrationBasePath(input?.basePath ?? fallback.basePath);
|
|
11745
|
+
const tokenTtlDays = input?.tokenTtlDays ?? fallback.tokenTtlDays;
|
|
11746
|
+
const requestTimeoutMs = input?.requestTimeoutMs ?? fallback.requestTimeoutMs;
|
|
11747
|
+
const maxConcurrent = input?.maxConcurrent ?? fallback.maxConcurrent;
|
|
11748
|
+
const requestsPerMinute = input?.requestsPerMinute ?? fallback.requestsPerMinute;
|
|
11749
|
+
const maxRequestBytes = input?.maxRequestBytes ?? fallback.maxRequestBytes;
|
|
11750
|
+
const maxAttachmentBytes = input?.maxAttachmentBytes ?? fallback.maxAttachmentBytes;
|
|
11751
|
+
const maxAnswerCharacters = input?.maxAnswerCharacters ?? fallback.maxAnswerCharacters;
|
|
11752
|
+
assertIntInRange("integration.tokenTtlDays", tokenTtlDays, 1, QA_INTEGRATION_TTL_DAYS_MAX);
|
|
11753
|
+
assertIntInRange("integration.requestTimeoutMs", requestTimeoutMs, QA_INTEGRATION_TIMEOUT_MS_MIN, QA_INTEGRATION_TIMEOUT_MS_MAX);
|
|
11754
|
+
assertIntInRange("integration.maxConcurrent", maxConcurrent, 1, 16);
|
|
11755
|
+
assertIntInRange("integration.requestsPerMinute", requestsPerMinute, 1, 600);
|
|
11756
|
+
assertIntInRange("integration.maxRequestBytes", maxRequestBytes, QA_INTEGRATION_BODY_BYTES_MIN, QA_INTEGRATION_BODY_BYTES_MAX);
|
|
11757
|
+
assertIntInRange("integration.maxAttachmentBytes", maxAttachmentBytes, QA_INTEGRATION_ATTACHMENT_BYTES_MIN, maxRequestBytes);
|
|
11758
|
+
assertIntInRange("integration.maxAnswerCharacters", maxAnswerCharacters, 256, QA_INTEGRATION_ANSWER_CHARS_MAX);
|
|
11759
|
+
if (enabled && !accounts.enabled) throw new TypeError("dsh-qa-surface: integration.enabled requires accounts.enabled: the API authenticates with an account's integration token");
|
|
11760
|
+
return Object.freeze({
|
|
11761
|
+
enabled,
|
|
11762
|
+
basePath,
|
|
11763
|
+
tokenTtlDays,
|
|
11764
|
+
requestTimeoutMs,
|
|
11765
|
+
maxConcurrent,
|
|
11766
|
+
requestsPerMinute,
|
|
11767
|
+
maxRequestBytes,
|
|
11768
|
+
maxAttachmentBytes,
|
|
11769
|
+
maxAnswerCharacters
|
|
11770
|
+
});
|
|
11771
|
+
}
|
|
10668
11772
|
//#endregion
|
|
10669
11773
|
//#region src/config-resolvers/lockdown.ts
|
|
10670
11774
|
/** Tool allow-list names are capped so they stay legible in host echoes. */
|
|
@@ -10749,7 +11853,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
10749
11853
|
template: text$4(raw.sources?.template),
|
|
10750
11854
|
fallbackTemplate: text$4(raw.sources?.fallbackTemplate)
|
|
10751
11855
|
},
|
|
10752
|
-
delegation: one(raw.delegation ?? {})
|
|
11856
|
+
delegation: one(raw.delegation ?? {}),
|
|
11857
|
+
documents: one(raw.documents ?? {}),
|
|
11858
|
+
sourcePriority: one(raw.sourcePriority ?? {})
|
|
10753
11859
|
};
|
|
10754
11860
|
}
|
|
10755
11861
|
//#endregion
|
|
@@ -11001,7 +12107,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
11001
12107
|
sources,
|
|
11002
12108
|
attachments,
|
|
11003
12109
|
tools,
|
|
11004
|
-
notes: resolveNotes(input.notes)
|
|
12110
|
+
notes: resolveNotes(input.notes),
|
|
12111
|
+
integration: resolveIntegration(input.integration, accounts)
|
|
11005
12112
|
});
|
|
11006
12113
|
}
|
|
11007
12114
|
//#endregion
|
|
@@ -11261,6 +12368,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
11261
12368
|
//#region src/client/QaAccountsController.ts
|
|
11262
12369
|
/** The `(reason: <code>)` marker the Host folds into account wire failures. */
|
|
11263
12370
|
const ACCOUNTS_REASON_MARKER = /\(reason: ([a-z-]+)\)/u;
|
|
12371
|
+
/**
|
|
12372
|
+
* What the sign-in card says after a forgotten-password request. It names the
|
|
12373
|
+
* request, never the account: a real address and an unknown one get the same
|
|
12374
|
+
* sentence, which is the whole point of the endpoint.
|
|
12375
|
+
*/
|
|
12376
|
+
const QA_RESET_FILED_NOTICE = "Заявка отправлена оператору. Если такой аккаунт есть, пароль сбросят — затем войдите с новым паролем.";
|
|
11264
12377
|
/** Union of the own chat ids and every mapped one, own ids first. */
|
|
11265
12378
|
function mergeOwnershipIds(ownedIds, ownership) {
|
|
11266
12379
|
if (ownership.length === 0) return ownedIds;
|
|
@@ -11273,6 +12386,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
11273
12386
|
function accountsErrorMessage(code) {
|
|
11274
12387
|
switch (code) {
|
|
11275
12388
|
case "invalid-credentials": return "Неверный email или пароль.";
|
|
12389
|
+
case "invalid-current-password": return "Текущий пароль неверен.";
|
|
11276
12390
|
case "admin-required": return "Недостаточно прав: действие доступно администратору.";
|
|
11277
12391
|
case "account-disabled": return "Аккаунт отключён администратором.";
|
|
11278
12392
|
case "email-taken": return "Этот email уже зарегистрирован.";
|
|
@@ -11283,6 +12397,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
11283
12397
|
case "profile-disabled": return "Профиль отключён на этом сервере.";
|
|
11284
12398
|
case "invalid-starters": return "Проверьте подсказки: заполните название и промпт, текст не слишком длинный.";
|
|
11285
12399
|
case "starters-disabled": return "Свои подсказки отключены на этом сервере.";
|
|
12400
|
+
case "integration-disabled": return "Интеграционный API выключен на этом стенде: такому токену некуда обращаться. Включите его в настройках стенда.";
|
|
12401
|
+
case "auth-required": return "Сессия истекла. Войдите заново.";
|
|
12402
|
+
case "forbidden": return "Этот токен принадлежит другой учётной записи или уже удалён.";
|
|
11286
12403
|
case "registration-disabled": return "Регистрация на этом сервере отключена.";
|
|
11287
12404
|
case "rate-limited": return "Слишком много попыток. Подождите минуту.";
|
|
11288
12405
|
default: return "Не удалось войти. Попробуйте ещё раз.";
|
|
@@ -11374,8 +12491,81 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
11374
12491
|
this.publish({
|
|
11375
12492
|
...this.snapshot,
|
|
11376
12493
|
mode,
|
|
11377
|
-
error: null
|
|
12494
|
+
error: null,
|
|
12495
|
+
notice: null
|
|
12496
|
+
});
|
|
12497
|
+
}
|
|
12498
|
+
/**
|
|
12499
|
+
* File a forgotten-password request for the operator queue. The card says
|
|
12500
|
+
* the same thing whether or not the address exists — the Host refuses to
|
|
12501
|
+
* tell, and so does this controller.
|
|
12502
|
+
*/
|
|
12503
|
+
async requestPasswordReset(email) {
|
|
12504
|
+
if (this.snapshot.stage !== "gate" || this.snapshot.busy || this.disposed) return;
|
|
12505
|
+
const mode = this.snapshot.mode;
|
|
12506
|
+
this.publish({
|
|
12507
|
+
stage: "gate",
|
|
12508
|
+
mode,
|
|
12509
|
+
busy: true,
|
|
12510
|
+
error: null,
|
|
12511
|
+
notice: null
|
|
11378
12512
|
});
|
|
12513
|
+
try {
|
|
12514
|
+
const result = await this.options.remote.accountsRequestPasswordReset(email);
|
|
12515
|
+
if (this.disposed) return;
|
|
12516
|
+
if (!result.ok) {
|
|
12517
|
+
this.publish({
|
|
12518
|
+
stage: "gate",
|
|
12519
|
+
mode,
|
|
12520
|
+
busy: false,
|
|
12521
|
+
error: accountsErrorMessage(accountsReasonOf(result.error)),
|
|
12522
|
+
notice: null
|
|
12523
|
+
});
|
|
12524
|
+
return;
|
|
12525
|
+
}
|
|
12526
|
+
this.publish({
|
|
12527
|
+
stage: "gate",
|
|
12528
|
+
mode,
|
|
12529
|
+
busy: false,
|
|
12530
|
+
error: null,
|
|
12531
|
+
notice: QA_RESET_FILED_NOTICE
|
|
12532
|
+
});
|
|
12533
|
+
} catch (error) {
|
|
12534
|
+
if (this.disposed) return;
|
|
12535
|
+
console.warn("dsh-qa-surface: password reset request failed", error);
|
|
12536
|
+
this.publish({
|
|
12537
|
+
stage: "gate",
|
|
12538
|
+
mode,
|
|
12539
|
+
busy: false,
|
|
12540
|
+
error: accountsErrorMessage(null),
|
|
12541
|
+
notice: null
|
|
12542
|
+
});
|
|
12543
|
+
}
|
|
12544
|
+
}
|
|
12545
|
+
/**
|
|
12546
|
+
* Change the signed-in user's own password. The Host answers with a fresh
|
|
12547
|
+
* token, because the write bumps the account's token version — this browser
|
|
12548
|
+
* keeps its session only by storing that token. Resolves to audience-safe
|
|
12549
|
+
* refusal copy, or to null once the snapshot carries the new account.
|
|
12550
|
+
*/
|
|
12551
|
+
async changePassword(currentPassword, nextPassword) {
|
|
12552
|
+
const token = this.tokenValue;
|
|
12553
|
+
if (this.disposed || token === null || this.snapshot.stage !== "authed") return accountsErrorMessage(null);
|
|
12554
|
+
try {
|
|
12555
|
+
const result = await this.options.remote.accountsChangePassword(token, currentPassword, nextPassword);
|
|
12556
|
+
if (this.disposed || this.snapshot.stage !== "authed") return null;
|
|
12557
|
+
if (!result.ok) return accountsErrorMessage(accountsReasonOf(result.error));
|
|
12558
|
+
this.tokenValue = result.value.token;
|
|
12559
|
+
this.saveStoredToken(result.value.token);
|
|
12560
|
+
this.publish({
|
|
12561
|
+
...this.snapshot,
|
|
12562
|
+
user: result.value.user
|
|
12563
|
+
});
|
|
12564
|
+
return null;
|
|
12565
|
+
} catch (error) {
|
|
12566
|
+
console.warn("dsh-qa-surface: password change failed", error);
|
|
12567
|
+
return accountsErrorMessage(null);
|
|
12568
|
+
}
|
|
11379
12569
|
}
|
|
11380
12570
|
/** Drop the token and return to the gate (logout or expired identity). */
|
|
11381
12571
|
signOut() {
|
|
@@ -11388,14 +12578,48 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
11388
12578
|
error: null
|
|
11389
12579
|
});
|
|
11390
12580
|
}
|
|
11391
|
-
/**
|
|
12581
|
+
/**
|
|
12582
|
+
* Claim one freshly created chat so the ownership map stays current, and
|
|
12583
|
+
* remember it in the owned list the sidebar shows.
|
|
12584
|
+
*
|
|
12585
|
+
* The claim runs on every bind — a chat created now and one reopened later
|
|
12586
|
+
* both take this path. A chat the Host reports as taken by another account
|
|
12587
|
+
* stays out of the list: the page then holds a binding whose ownership
|
|
12588
|
+
* belongs to someone else, and showing it is exactly what the list must not
|
|
12589
|
+
* do. A claim that never reached the Host still records the id, because the
|
|
12590
|
+
* page opened this chat through the attendance boundary, which claims an
|
|
12591
|
+
* unowned chat for whoever asks first and refuses another account's — so the
|
|
12592
|
+
* binding is this account's either way, and hiding a chat the visitor is
|
|
12593
|
+
* looking at would be the greater lie.
|
|
12594
|
+
*/
|
|
11392
12595
|
async claimNewSession(sessionId) {
|
|
11393
|
-
|
|
12596
|
+
const token = this.tokenValue;
|
|
12597
|
+
if (token === null || this.disposed || this.snapshot.stage !== "authed") return;
|
|
12598
|
+
let conflict = false;
|
|
11394
12599
|
try {
|
|
11395
|
-
await this.options.remote.accountsClaimSessions(
|
|
12600
|
+
const claimed = await this.options.remote.accountsClaimSessions(token, [sessionId]);
|
|
12601
|
+
conflict = claimed.ok && claimed.value.conflicts.includes(sessionId);
|
|
11396
12602
|
} catch (error) {
|
|
11397
12603
|
console.warn("dsh-qa-surface: session claim failed", error);
|
|
11398
12604
|
}
|
|
12605
|
+
if (this.disposed || conflict) return;
|
|
12606
|
+
this.noteOwnedSession(sessionId);
|
|
12607
|
+
}
|
|
12608
|
+
/**
|
|
12609
|
+
* Add one chat this page holds to the owned list. The list is what the
|
|
12610
|
+
* sidebar shows and what every cross-chat projection is scoped by, so a chat
|
|
12611
|
+
* created or opened after login enters it here — the next login is not a
|
|
12612
|
+
* reasonable price for a chat the visitor is looking at. Ids already known,
|
|
12613
|
+
* and the ones an admin's cross-user view contributed, are left as they are.
|
|
12614
|
+
*/
|
|
12615
|
+
noteOwnedSession(sessionId) {
|
|
12616
|
+
const snapshot = this.snapshot;
|
|
12617
|
+
if (snapshot.stage !== "authed" || snapshot.ownedIds.includes(sessionId)) return;
|
|
12618
|
+
this.publish({
|
|
12619
|
+
...snapshot,
|
|
12620
|
+
ownedIds: [...snapshot.ownedIds, sessionId],
|
|
12621
|
+
ownedRevision: snapshot.ownedRevision + 1
|
|
12622
|
+
});
|
|
11399
12623
|
}
|
|
11400
12624
|
/**
|
|
11401
12625
|
* Replace the signed-in user's own profile. Resolves to audience-safe
|
|
@@ -11442,6 +12666,92 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
11442
12666
|
return accountsErrorMessage(null);
|
|
11443
12667
|
}
|
|
11444
12668
|
}
|
|
12669
|
+
/**
|
|
12670
|
+
* The signed-in user's integration tokens. Resolves to the list, or to the
|
|
12671
|
+
* copy the page renders when the Host refused the read; the tokens are not
|
|
12672
|
+
* part of the account snapshot, because they are not part of the account.
|
|
12673
|
+
*/
|
|
12674
|
+
async serviceTokens() {
|
|
12675
|
+
const token = this.tokenValue;
|
|
12676
|
+
if (this.disposed || token === null || this.snapshot.stage !== "authed") return {
|
|
12677
|
+
ok: false,
|
|
12678
|
+
error: accountsErrorMessage(null)
|
|
12679
|
+
};
|
|
12680
|
+
try {
|
|
12681
|
+
const result = await this.options.remote.accountsListServiceTokens(token);
|
|
12682
|
+
if (!result.ok) return {
|
|
12683
|
+
ok: false,
|
|
12684
|
+
error: accountsErrorMessage(accountsReasonOf(result.error))
|
|
12685
|
+
};
|
|
12686
|
+
return {
|
|
12687
|
+
ok: true,
|
|
12688
|
+
value: result.value.tokens
|
|
12689
|
+
};
|
|
12690
|
+
} catch (error) {
|
|
12691
|
+
console.warn("dsh-qa-surface: integration token list failed", error);
|
|
12692
|
+
return {
|
|
12693
|
+
ok: false,
|
|
12694
|
+
error: accountsErrorMessage(null)
|
|
12695
|
+
};
|
|
12696
|
+
}
|
|
12697
|
+
}
|
|
12698
|
+
/**
|
|
12699
|
+
* Mint one integration token for the signed-in user. The plaintext is in the
|
|
12700
|
+
* answer and nowhere else — the caller has to hand it over now, because
|
|
12701
|
+
* nothing can show it again.
|
|
12702
|
+
*/
|
|
12703
|
+
async createServiceToken(input) {
|
|
12704
|
+
const token = this.tokenValue;
|
|
12705
|
+
if (this.disposed || token === null || this.snapshot.stage !== "authed") return {
|
|
12706
|
+
ok: false,
|
|
12707
|
+
error: accountsErrorMessage(null)
|
|
12708
|
+
};
|
|
12709
|
+
try {
|
|
12710
|
+
const result = await this.options.remote.accountsCreateServiceToken(token, input);
|
|
12711
|
+
if (!result.ok) return {
|
|
12712
|
+
ok: false,
|
|
12713
|
+
error: accountsErrorMessage(accountsReasonOf(result.error))
|
|
12714
|
+
};
|
|
12715
|
+
return {
|
|
12716
|
+
ok: true,
|
|
12717
|
+
value: result.value
|
|
12718
|
+
};
|
|
12719
|
+
} catch (error) {
|
|
12720
|
+
console.warn("dsh-qa-surface: integration token create failed", error);
|
|
12721
|
+
return {
|
|
12722
|
+
ok: false,
|
|
12723
|
+
error: accountsErrorMessage(null)
|
|
12724
|
+
};
|
|
12725
|
+
}
|
|
12726
|
+
}
|
|
12727
|
+
/**
|
|
12728
|
+
* Revoke one of the signed-in user's integration tokens. The Host is the
|
|
12729
|
+
* authority on whose token it is; a refusal is shown as it arrives.
|
|
12730
|
+
*/
|
|
12731
|
+
async revokeServiceToken(tokenId) {
|
|
12732
|
+
const token = this.tokenValue;
|
|
12733
|
+
if (this.disposed || token === null || this.snapshot.stage !== "authed") return {
|
|
12734
|
+
ok: false,
|
|
12735
|
+
error: accountsErrorMessage(null)
|
|
12736
|
+
};
|
|
12737
|
+
try {
|
|
12738
|
+
const result = await this.options.remote.accountsRevokeServiceToken(token, tokenId);
|
|
12739
|
+
if (!result.ok) return {
|
|
12740
|
+
ok: false,
|
|
12741
|
+
error: accountsErrorMessage(accountsReasonOf(result.error))
|
|
12742
|
+
};
|
|
12743
|
+
return {
|
|
12744
|
+
ok: true,
|
|
12745
|
+
value: null
|
|
12746
|
+
};
|
|
12747
|
+
} catch (error) {
|
|
12748
|
+
console.warn("dsh-qa-surface: integration token revoke failed", error);
|
|
12749
|
+
return {
|
|
12750
|
+
ok: false,
|
|
12751
|
+
error: accountsErrorMessage(null)
|
|
12752
|
+
};
|
|
12753
|
+
}
|
|
12754
|
+
}
|
|
11445
12755
|
async authenticate(mode, call) {
|
|
11446
12756
|
if (this.snapshot.stage !== "gate" || this.snapshot.busy || this.disposed) return;
|
|
11447
12757
|
this.publish({
|
|
@@ -11664,6 +12974,69 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
11664
12974
|
if (summary === void 0) return false;
|
|
11665
12975
|
return summary.origin === "subagent" || summary.parentId !== void 0;
|
|
11666
12976
|
}
|
|
12977
|
+
/**
|
|
12978
|
+
* The chat a session belongs to: itself when nothing delegated it, otherwise
|
|
12979
|
+
* the root of its parent chain.
|
|
12980
|
+
*
|
|
12981
|
+
* A nested child names its own delegated parent in `parentId`, so one hop is
|
|
12982
|
+
* not the chat. The walk stops at the first entry the host list does not know,
|
|
12983
|
+
* which keeps a partially hydrated list from inventing a chat that is not
|
|
12984
|
+
* there; a repeated id (a hostile or broken list) resolves to the id it
|
|
12985
|
+
* repeated on instead of hanging.
|
|
12986
|
+
*/
|
|
12987
|
+
function chatRootOf(byId, sessionId) {
|
|
12988
|
+
let current = sessionId;
|
|
12989
|
+
const seen = /* @__PURE__ */ new Set();
|
|
12990
|
+
while (!seen.has(current)) {
|
|
12991
|
+
seen.add(current);
|
|
12992
|
+
const parent = byId[current]?.parentId;
|
|
12993
|
+
if (parent === void 0) return current;
|
|
12994
|
+
current = String(parent);
|
|
12995
|
+
}
|
|
12996
|
+
return current;
|
|
12997
|
+
}
|
|
12998
|
+
/**
|
|
12999
|
+
* Delegated sessions whose names a page may sign its notices with: the
|
|
13000
|
+
* children of the chats it lists, catalog labels first and list titles after.
|
|
13001
|
+
*
|
|
13002
|
+
* `chats` is the visible chat set — the account's own chats while accounts are
|
|
13003
|
+
* on, and `undefined` for a deployment without accounts, where every chat on
|
|
13004
|
+
* the Host is the browser's own. Ownership is checked against the chat, never
|
|
13005
|
+
* against the child: a delegated session has no owner of its own, so a child
|
|
13006
|
+
* is visible exactly when the chat it belongs to is. Another account's chat
|
|
13007
|
+
* therefore contributes no id and no label — a foreign chat can neither sign
|
|
13008
|
+
* a notice nor be named by one.
|
|
13009
|
+
*/
|
|
13010
|
+
function visibleSubagentCandidates(byId, catalogs, chats) {
|
|
13011
|
+
const visible = (chatId) => chats === void 0 || chats.has(chatId);
|
|
13012
|
+
const candidates = [];
|
|
13013
|
+
const seen = /* @__PURE__ */ new Set();
|
|
13014
|
+
for (const [parentId, catalog] of Object.entries(catalogs)) {
|
|
13015
|
+
if (!visible(parentId)) continue;
|
|
13016
|
+
for (const entry of catalog?.entries ?? []) {
|
|
13017
|
+
if (entry.kind !== "child") continue;
|
|
13018
|
+
const id = entry.id;
|
|
13019
|
+
if (id === void 0 || seen.has(id)) continue;
|
|
13020
|
+
seen.add(id);
|
|
13021
|
+
candidates.push({
|
|
13022
|
+
id,
|
|
13023
|
+
label: entry.label ?? ""
|
|
13024
|
+
});
|
|
13025
|
+
}
|
|
13026
|
+
}
|
|
13027
|
+
for (const [key, summary] of Object.entries(byId)) {
|
|
13028
|
+
if (summary.origin !== "subagent") continue;
|
|
13029
|
+
const id = String(summary.id ?? key);
|
|
13030
|
+
if (seen.has(id)) continue;
|
|
13031
|
+
if (!visible(chatRootOf(byId, id))) continue;
|
|
13032
|
+
seen.add(id);
|
|
13033
|
+
candidates.push({
|
|
13034
|
+
id,
|
|
13035
|
+
label: summary.displayTitle
|
|
13036
|
+
});
|
|
13037
|
+
}
|
|
13038
|
+
return candidates;
|
|
13039
|
+
}
|
|
11667
13040
|
//#endregion
|
|
11668
13041
|
//#region src/client/kiosk.ts
|
|
11669
13042
|
/**
|
|
@@ -14612,13 +15985,22 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
14612
15985
|
if (chat === null) return;
|
|
14613
15986
|
await this.switchTo(chat);
|
|
14614
15987
|
}
|
|
14615
|
-
/**
|
|
14616
|
-
*
|
|
15988
|
+
/**
|
|
15989
|
+
* This browser's chat ids: the account's owned chats while accounts are on,
|
|
15990
|
+
* else the browser-local index. Either way they intersect the host session
|
|
15991
|
+
* list at projection time.
|
|
15992
|
+
*
|
|
15993
|
+
* The local index is what this browser accumulated, not an identity: with
|
|
15994
|
+
* accounts on it is the set the page *claims* at login, never one it lists.
|
|
15995
|
+
* Unioning it in would show a chat another account started — its title, its
|
|
15996
|
+
* timestamp, its live activity — on a shared browser, and a chat this page
|
|
15997
|
+
* has yet to claim is added to the owned list by the claim itself, so the
|
|
15998
|
+
* index has nothing left to supply.
|
|
15999
|
+
*/
|
|
14617
16000
|
chatIds() {
|
|
14618
|
-
const
|
|
14619
|
-
if (
|
|
14620
|
-
|
|
14621
|
-
return [.../* @__PURE__ */ new Set([...owned, ...local])];
|
|
16001
|
+
const accounts = this.accounts;
|
|
16002
|
+
if (accounts === void 0) return this.chats.chatIds();
|
|
16003
|
+
return accounts.ownedIds();
|
|
14622
16004
|
}
|
|
14623
16005
|
/** The bound session id, or null while no chat is bound. */
|
|
14624
16006
|
activeSessionId() {
|
|
@@ -14941,22 +16323,33 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
14941
16323
|
* delegation's description verbatim; a child the host listed without a
|
|
14942
16324
|
* catalog falls back to its own list title. Tolerates a host bundle older
|
|
14943
16325
|
* than either field: an absent snapshot piece just contributes no names.
|
|
16326
|
+
*
|
|
16327
|
+
* Only the chats this page lists contribute: the host list is the whole
|
|
16328
|
+
* deployment's, so an unfiltered read would hand another account's
|
|
16329
|
+
* delegation into this browser — and a notice signed with a name that is
|
|
16330
|
+
* not the chat's own is exactly the leak the chat list itself is scoped
|
|
16331
|
+
* against.
|
|
14944
16332
|
*/
|
|
14945
16333
|
subagentNames() {
|
|
14946
16334
|
const names = {};
|
|
14947
16335
|
const list = this.sessions.list.getSnapshot();
|
|
14948
|
-
|
|
14949
|
-
|
|
14950
|
-
|
|
14951
|
-
|
|
14952
|
-
|
|
14953
|
-
for (const summary of Object.values(list.byId ?? {})) {
|
|
14954
|
-
if (summary.origin !== "subagent" || names[summary.id] !== void 0) continue;
|
|
14955
|
-
const name = readableSubagentName(summary.displayTitle, summary.id);
|
|
14956
|
-
if (name !== void 0) names[summary.id] = name;
|
|
16336
|
+
const chats = this.visibleChatIds();
|
|
16337
|
+
const candidates = visibleSubagentCandidates(list.byId ?? {}, list.subagentsByParent ?? {}, chats);
|
|
16338
|
+
for (const candidate of candidates) {
|
|
16339
|
+
const name = readableSubagentName(candidate.label, candidate.id);
|
|
16340
|
+
if (name !== void 0) names[candidate.id] = name;
|
|
14957
16341
|
}
|
|
14958
16342
|
return names;
|
|
14959
16343
|
}
|
|
16344
|
+
/**
|
|
16345
|
+
* The chats this page may show and name: the account's owned list while
|
|
16346
|
+
* accounts are on, and `undefined` — every chat on the Host — for a
|
|
16347
|
+
* deployment without accounts, where the list is the browser's own.
|
|
16348
|
+
*/
|
|
16349
|
+
visibleChatIds() {
|
|
16350
|
+
if (this.accounts === void 0) return void 0;
|
|
16351
|
+
return new Set(this.accounts.ownedIds());
|
|
16352
|
+
}
|
|
14960
16353
|
fail(message, error) {
|
|
14961
16354
|
if (!(error instanceof QaPolicyAttestationError)) console.error("dsh-qa-surface: session operation failed", error);
|
|
14962
16355
|
if (this.disposed) return;
|
|
@@ -15340,8 +16733,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15340
16733
|
};
|
|
15341
16734
|
}
|
|
15342
16735
|
/**
|
|
15343
|
-
* The file picker's `accept` value: the raster formats plus either
|
|
15344
|
-
* configured
|
|
16736
|
+
* The file picker's `accept` value: the raster formats plus either every
|
|
16737
|
+
* configured extension and the browser's whole `text/*` family, or nothing
|
|
16738
|
+
* when file attachments are off.
|
|
15345
16739
|
* @param limits - attachment policy in effect.
|
|
15346
16740
|
* @returns the accept attribute value.
|
|
15347
16741
|
*/
|
|
@@ -15369,10 +16763,33 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15369
16763
|
function isTextMediaType(mediaType) {
|
|
15370
16764
|
return mediaType.toLowerCase().startsWith("text/");
|
|
15371
16765
|
}
|
|
15372
|
-
/**
|
|
15373
|
-
|
|
16766
|
+
/**
|
|
16767
|
+
* Whether a dropped payload may be attached as a file at all. An extension the
|
|
16768
|
+
* operator listed is enough on its own: the list is what the deployment can
|
|
16769
|
+
* work with, and a stand whose pipeline reads Word documents lists `docx`
|
|
16770
|
+
* rather than hoping the browser calls it text.
|
|
16771
|
+
*/
|
|
16772
|
+
function acceptsFileAttachment(name, mediaType, limits) {
|
|
15374
16773
|
if (!limits.textFiles) return false;
|
|
15375
|
-
return
|
|
16774
|
+
return hasAcceptedExtension(name, limits.extensions) || isTextMediaType(mediaType);
|
|
16775
|
+
}
|
|
16776
|
+
/**
|
|
16777
|
+
* Why one non-image file is refused, in the visitor's terms, or null when it is
|
|
16778
|
+
* accepted. The copy used to name a fixed list ("md, txt, log и другие") that
|
|
16779
|
+
* had nothing to do with the deployment's own setting, which is how a stand
|
|
16780
|
+
* able to read Word documents ended up looking like a text-only one.
|
|
16781
|
+
* @param name - display file name.
|
|
16782
|
+
* @param mediaType - MIME type the browser reported.
|
|
16783
|
+
* @param limits - attachment policy in effect.
|
|
16784
|
+
* @returns the refusal message, or null.
|
|
16785
|
+
*/
|
|
16786
|
+
function fileAttachmentRefusal(name, mediaType, limits) {
|
|
16787
|
+
if (acceptsFileAttachment(name, mediaType, limits)) return null;
|
|
16788
|
+
if (!limits.textFiles) return "Файловые вложения выключены: можно приложить только изображения.";
|
|
16789
|
+
const leaf = name.trim().toLowerCase();
|
|
16790
|
+
const extension = fileExtensionOf(name);
|
|
16791
|
+
if (extension === "" || extension === leaf) return "У файла нет расширения, а принять его можно только по расширению из списка разрешённых.";
|
|
16792
|
+
return `Формат «.${extension}» не разрешён на этом стенде. Список разрешённых расширений задаёт оператор.`;
|
|
15376
16793
|
}
|
|
15377
16794
|
function imageDraftFromBlob(blob, name) {
|
|
15378
16795
|
return readAsArrayBuffer(blob).then((buffer) => ({
|
|
@@ -15396,7 +16813,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15396
16813
|
if (file.size > 15728640) return `Изображение слишком большое (лимит ${formatFileSize(QA_MAX_IMAGE_BYTES)}).`;
|
|
15397
16814
|
return imageDraftFromBlob(file, file.name);
|
|
15398
16815
|
}
|
|
15399
|
-
|
|
16816
|
+
const refusal = fileAttachmentRefusal(file.name, file.type, limits);
|
|
16817
|
+
if (refusal !== null) return refusal;
|
|
15400
16818
|
if (file.size > limits.maxFileBytes) return `Файл слишком большой (лимит ${formatFileSize(limits.maxFileBytes)}).`;
|
|
15401
16819
|
return {
|
|
15402
16820
|
kind: "file",
|
|
@@ -15466,15 +16884,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15466
16884
|
*/
|
|
15467
16885
|
function QaAuthGate(props) {
|
|
15468
16886
|
const { snapshot, accounts } = props;
|
|
15469
|
-
const
|
|
15470
|
-
const
|
|
16887
|
+
const gate = snapshot.stage === "gate" ? snapshot : void 0;
|
|
16888
|
+
const mode = gate?.mode ?? "login";
|
|
16889
|
+
const busy = gate?.busy ?? false;
|
|
16890
|
+
const notice = gate?.notice ?? null;
|
|
15471
16891
|
const [email, setEmail] = (0, react.useState)("");
|
|
15472
16892
|
const [password, setPassword] = (0, react.useState)("");
|
|
15473
16893
|
const showRegister = props.allowRegistration;
|
|
16894
|
+
const reset = mode === "reset";
|
|
15474
16895
|
const submit = (event) => {
|
|
15475
16896
|
event.preventDefault();
|
|
15476
16897
|
if (busy) return;
|
|
15477
|
-
mode === "register" ? accounts.register(email, password) : accounts.login(email, password);
|
|
16898
|
+
reset ? accounts.requestPasswordReset(email) : mode === "register" ? accounts.register(email, password) : accounts.login(email, password);
|
|
15478
16899
|
};
|
|
15479
16900
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("main", {
|
|
15480
16901
|
className: "dsh-qa-surface dsh-qa-auth",
|
|
@@ -15487,7 +16908,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15487
16908
|
className: "dsh-qa-auth__brand",
|
|
15488
16909
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Logo, { logoUrl: props.logoUrl }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", { children: props.title })]
|
|
15489
16910
|
}),
|
|
15490
|
-
|
|
16911
|
+
reset ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
16912
|
+
className: "dsh-qa-auth__lead",
|
|
16913
|
+
children: "Укажите email: заявку увидит оператор и сбросит пароль. Почта с ссылкой на этом стенде не настроена."
|
|
16914
|
+
}) : null,
|
|
16915
|
+
showRegister && !reset ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
15491
16916
|
className: "dsh-qa-auth__tabs",
|
|
15492
16917
|
role: "tablist",
|
|
15493
16918
|
"aria-label": "Вход или регистрация",
|
|
@@ -15519,7 +16944,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15519
16944
|
onChange: (event) => setEmail(event.currentTarget.value)
|
|
15520
16945
|
})]
|
|
15521
16946
|
}),
|
|
15522
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
|
|
16947
|
+
reset ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
|
|
15523
16948
|
className: "dsh-qa-auth__field",
|
|
15524
16949
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "Пароль" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
15525
16950
|
type: "password",
|
|
@@ -15532,16 +16957,28 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15532
16957
|
onChange: (event) => setPassword(event.currentTarget.value)
|
|
15533
16958
|
})]
|
|
15534
16959
|
}),
|
|
15535
|
-
|
|
16960
|
+
gate !== void 0 && gate.error !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
15536
16961
|
className: "dsh-qa-auth__error",
|
|
15537
16962
|
role: "alert",
|
|
15538
|
-
children:
|
|
16963
|
+
children: gate.error
|
|
15539
16964
|
}) : null,
|
|
16965
|
+
notice === null ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
16966
|
+
className: "dsh-qa-auth__notice",
|
|
16967
|
+
role: "status",
|
|
16968
|
+
children: notice
|
|
16969
|
+
}),
|
|
15540
16970
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
15541
16971
|
type: "submit",
|
|
15542
16972
|
className: "dsh-qa-auth__submit",
|
|
15543
16973
|
disabled: busy,
|
|
15544
|
-
children: busy ? "Подождите…" : mode === "register" ? "Зарегистрироваться" : "Войти"
|
|
16974
|
+
children: busy ? "Подождите…" : reset ? "Отправить заявку" : mode === "register" ? "Зарегистрироваться" : "Войти"
|
|
16975
|
+
}),
|
|
16976
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
16977
|
+
type: "button",
|
|
16978
|
+
className: "dsh-qa-auth__link",
|
|
16979
|
+
disabled: busy,
|
|
16980
|
+
onClick: () => accounts.setMode(reset ? "login" : "reset"),
|
|
16981
|
+
children: reset ? "Вернуться ко входу" : "Забыли пароль?"
|
|
15545
16982
|
})
|
|
15546
16983
|
]
|
|
15547
16984
|
})
|
|
@@ -48495,8 +49932,32 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
48495
49932
|
}
|
|
48496
49933
|
//#endregion
|
|
48497
49934
|
//#region src/client/components/QaChangelog.tsx
|
|
48498
|
-
const QA_VERSION = "0.
|
|
49935
|
+
const QA_VERSION = "0.11.0";
|
|
48499
49936
|
const QA_CHANGELOG = [
|
|
49937
|
+
{
|
|
49938
|
+
version: "0.11.0",
|
|
49939
|
+
date: "2026-09-21",
|
|
49940
|
+
sections: [{
|
|
49941
|
+
title: "Новое",
|
|
49942
|
+
items: [
|
|
49943
|
+
"Правку чужого навыка видно. Администратор может отредактировать личный навык пользователя — это по-прежнему осознанное действие, но больше не бесшумное: пользователь видит в своём списке навыков пометку «Изменено администратором» с датой, пока в файле лежит именно та версия, которую записал администратор. Как только владелец сохраняет навык сам, пометка исчезает: она отвечает на вопрос «кто написал то, что я сейчас вижу», а не ведёт историю правок. Каждое изменение — создание, правка, удаление — попадает в аудит стенда с указанием администратора, навыка и хранилища, в которое он писал.",
|
|
49944
|
+
"Вопрос помощнику можно задать по API — без браузера. У стенда появился адрес /qa/api/ask: другая программа отправляет вопрос, получает ответ в Markdown и может продолжить тот же диалог, отправив обратно полученный идентификатор чата. Так обращение из системы заявок попадает к помощнику автоматически, а ответ возвращается туда же, где живёт заявка, и человек решает, что публиковать клиенту. Рядом есть /qa/api/health, по нему внешняя программа проверяет, что стенд жив и какие модели ему доступны. По умолчанию этот адрес закрыт: его включает оператор стенда, а запросы принимаются только с интеграционным токеном. Ответ приходит не позже чем через 90 секунд — если ассистент не успел, вместо ожидания придёт отметка «нужен специалист» и тот же идентификатор чата, чтобы не потерять начатый разговор. Длинный ответ обрезается до размера, который помещается в комментарий заявки, причём по границе абзаца и с многоточием, чтобы в заявке не оказалось оборванной на полуслове фразы; размер настраивается оператором стенда. Картинки из обращения прикладываются к вопросу как есть, а файлы, которые к обращению приложил клиент, ассистент теперь тоже видит: текстовые (txt, csv, md) он читает как текст, а PDF, Word, Excel и PowerPoint — через конвейер документов стенда, тот же, которым пользуются инструменты работы с документами. Так вопрос «разберись по вложению» действительно опирается на вложение, а не отправляется специалисту только потому, что файл не картинка. Вложение, которое стенд прочитать не может (нет конвейера документов, нечитаемый файл), честно отклоняется: внешняя программа повторит вопрос без вложений и всё равно получит ответ — хуже ответить, не прочитав то, о чём спрашивают. Ничего лишнего при этом не остаётся: файл живёт во временном каталоге только на время чтения, а в вопрос попадает ограниченный по объёму текст с обрезкой и пометкой.",
|
|
49945
|
+
"Интеграционные токены выдаются и отзываются прямо в настройках, в разделе «Интеграционные токены». Там же видно, какие токены уже есть: название, права, дата создания и срок, сколько раз им пользовались и когда в последний раз. Новый токен создаётся за один шаг — название, права и срок, — а его значение показывается ровно один раз: на стенде остаётся только отпечаток, поэтому скопируйте его сразу и передайте интеграции. Отзыв токена просит подтверждение, потому что отменить его нельзя, а работающая интеграция сразу теряет доступ; отозванный или истёкший токен остаётся в списке как запись. Пока интеграционный адрес выключен на стенде, раздел честно объясняет это вместо кнопки, которая всё равно отказала бы, но уже выданные токены по-прежнему можно отозвать. Токен всегда принадлежит вашей учётной записи: чужие токены не видны и не отзываются, а выдать токен другому человеку по-прежнему может только администратор командой qa-accounts token create.",
|
|
49946
|
+
"Интеграционные токены: доступ для внешних программ выдаётся отдельно от паролей и браузерных сессий. Токен создаётся командой qa-accounts token create <почта> — секрет печатается один раз и больше не восстанавливается, а в базе остаётся только его отпечаток. Такой токен переживает смену пароля человеком (смена пароля не должна останавливать работающую интеграцию), имеет собственный срок жизни, отдельно отзывается командой qa-accounts token revoke и ограничен правами: по умолчанию он умеет только задавать вопросы. Отключение учётной записи и команда «отозвать все токены» закрывают его вместе с остальными доступами. Список выданных токенов с датами последнего использования — команда qa-accounts token list.",
|
|
49947
|
+
"Внешняя программа может прочитать переписку своего диалога, а не только задавать вопросы. По адресу /qa/api/session она запрашивает историю чата по его идентификатору и получает сообщения по порядку: что спрашивал человек и что отвечал помощник, с тем же текстом, что и в самом ответе. Это нужно там, где обращение из системы заявок ушло специалисту: он видит, о чём уже говорили, и не должен задавать тот же вопрос заново — раньше единственным способом «прочитать» историю было повторить вопрос, потратив на это отдельный ответ. Чужой чат при этом недоступен: несуществующий идентификатор и разговор другой учётной записи отвечают одинаково, поэтому по одному идентификатору нельзя узнать, что чужая переписка существует. Чтение требует отдельного права, его выдаёт та же выдача интеграционных токенов: можно выдать право читать историю, не давая права задавать вопросы, — например, для отчётной интеграции. История отдаётся страницами от последних сообщений к предыдущим: программа запоминает, до какого места дочитала, и просит только новое, а если что-то осталось ниже страницы, ответ честно об этом говорит.",
|
|
49948
|
+
"Ассистент ищет ответ в документации стенда, а не по памяти. Стенд публикует документацию в каталоге docs рабочего каталога чата, и инструмента, который бы это говорил, у ассистента не было: замечание ревьювера могло сослаться на конкретный путь в этом дереве, а ассистент вместо чтения перебирал рабочий каталог поиском по маске, уходил за контекстом в память и в итоге отвечал по чужим данным — промах читался как «документа нет», а не как «не то дерево». Теперь в наборе инструментов стенда есть поиск по документации (docs_search) и чтение её файла (docs_read). Поиск ищет фразу по строкам и показывает каждое попадание с путём, номером строки и пометкой модуля и версии, разобранными из раскладки docs/<модуль>/<версия>/…; фильтры «версия», «модуль» и «подкаталог» сужают поиск до одной редакции или одного раздела — известно, что вопрос про конкретную версию, значит перебирать все не нужно. Чтение открывает один документ окном строк, которое можно продолжить с нужного места. Оба инструмента ограничивают ответ — число попаданий и объём отчёта у поиска, число строк у чтения — и честно помечают ответ неполным, если что-то не поместилось, чтобы «правильный поиск» не отвечал простынёй. Оба читают только дерево документации: путь вне него, каталог вместо файла, файл, который не читается текстом, и путь, ушедший по символической ссылке за пределы дерева, отвергаются с понятной причиной, а причина не называет путь на диске стенда. В описаниях инструментов прямо сказано, что документация читается здесь, а не из памяти: у ассистента теперь есть куда идти за документацией, и угадывать путь ему не нужно.",
|
|
49949
|
+
"Ассистент отвечает из того источника, который владеет вопросом, а не из памяти по умолчанию. В разделе «Заметки модели» появилась заметка о приоритете источников: сначала то, что уже есть в разговоре и во вложениях, затем документация продукта и доменный эксперт, и только потом память. Раньше порядок источников нигде не проговаривался, поэтому нехватка контекста читалась как повод идти в память: агент сериями вызывал поиск по воспоминаниям вместо того, чтобы открыть приложенный документ. Отдельно сказано, что пустой результат в памяти ничего не доказывает и что документы, страницы и факты о продукте ищут не там. Заметка включается и переписывается своими словами, как и остальные три, и работает в тех чатах, где другие заметки тоже доходят."
|
|
49950
|
+
]
|
|
49951
|
+
}, {
|
|
49952
|
+
title: "Исправления",
|
|
49953
|
+
items: [
|
|
49954
|
+
"Приложенный документ теперь разбирается целиком — и помощником, и панелью «Файлы». Загруженный файл стенд хранит в отдельном хранилище вложений, вне рабочего каталога чата, и читать его помощнику разрешено: путь к нему стоит в самом вопросе. Но инструменты работы с документами об этом хранилище не знали и отказывались открывать файл, который помощнику как раз разрешили прочитать, — просьба разобрать приложенный документ заканчивалась ответом «файла нет», хотя файл на месте, а приложенный документ Word нельзя было посмотреть в панели «Файлы». Теперь хранилище вложений передаётся этим инструментам так же, как его знает остальная часть стенда: документ разбирается по тому же пути, что пришёл в вопросе, а доступ к остальному содержимому хранилища не открывается — читается ровно один названный файл, и только на чтение. Доступ выдаётся тому чату, который его получил, вместе с его дочерними помощниками, и снимается вместе с чатом.",
|
|
49955
|
+
"Документ Word или PDF можно приложить к вопросу — раньше он отбивался прямо при перетаскивании. Список приложимых файлов был списком текстовых расширений: он так и назывался в настройках, и сообщение об отказе перечисляло свой набор «md, txt, log и другие», никак не связанный с настройкой стенда. Получалось несоответствие: стенд разбирает такие документы конвейером документов и показывает документ Word прямо в чате, а приложить его было нельзя. Теперь разрешённые расширения — это то, чем стенд действительно умеет работать: к текстовым файлам добавлены docx и pdf, а если формат всё-таки не разрешён, отказ называет само расширение и говорит, что список задаёт оператор стенда. Там, где список задан явно, он остаётся ровно таким, каким его задали, — добавление работает для стендов, которые полагаются на значения по умолчанию.",
|
|
49956
|
+
"Приложенный документ Word или PDF читается своим инструментом, а не универсальным чтением файла. Документ из вложения лежит на диске путём, и универсальное чтение отказывает таким форматам как бинарным — «cannot read …docx: binary file». Этот отказ ничего не говорит о том, есть ли файл на месте, но читался он именно так: агент решал, что документа нет, начинал искать его по рабочим каталогам и сообщал пользователю, что до файла не дотянуться, хотя конвейер документов всё это время был доступен. В разделе «Заметки модели» появилась заметка о документах: она называет инструменты конвейера (document_inspect, document_to_markdown, а для вложения по ссылке — document_from_url), говорит, что отказ универсального чтения на офисных форматах — это ожидаемый ответ, а не повод искать файл в другом месте, и что отказ самого конвейера нужно назвать вместе с путём, который он назвал. Заметка включается и переписывается своими словами, как и остальные, — стенду без конвейера документов её стоит выключить.",
|
|
49957
|
+
"Список чатов показывает только ваши чаты. Обычно список собирался и из ваших разговоров, и из того, что этот браузер запомнил раньше, поэтому на общем компьютере — в переговорке, у стенда, за одной учётной записью Windows — в него попадали разговоры, начатые до вас: с их названиями, временем и значком работы помощника в момент, когда чужой разговор шёл. Теперь список — это ровно ваши чаты: чужой разговор в нём не появится, а разговор, начатый или открытый после входа, виден сразу, без перезагрузки страницы. На стенде без учётных записей ничего не изменилось: список по-прежнему ваш собственный. Имена фоновых помощников в плашках о завершении берутся только из ваших разговоров."
|
|
49958
|
+
]
|
|
49959
|
+
}]
|
|
49960
|
+
},
|
|
48500
49961
|
{
|
|
48501
49962
|
version: "0.10.0",
|
|
48502
49963
|
date: "2026-09-19",
|
|
@@ -48853,7 +50314,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
48853
50314
|
className: "dsh-qa-changelog__date",
|
|
48854
50315
|
children: entry.date
|
|
48855
50316
|
}),
|
|
48856
|
-
entry.version === "0.
|
|
50317
|
+
entry.version === "0.11.0" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
48857
50318
|
className: "dsh-qa-changelog__current",
|
|
48858
50319
|
children: "текущая"
|
|
48859
50320
|
}) : null
|
|
@@ -51064,6 +52525,436 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
51064
52525
|
});
|
|
51065
52526
|
}
|
|
51066
52527
|
//#endregion
|
|
52528
|
+
//#region src/shared/integration-tokens.ts
|
|
52529
|
+
/**
|
|
52530
|
+
* The integration-token vocabulary and its bounds, on the browser side too.
|
|
52531
|
+
*
|
|
52532
|
+
* Minting lives in `accounts/service-token.ts`, which is Host-only (it hashes a
|
|
52533
|
+
* secret before storing it); the profile page has to name the same scopes and
|
|
52534
|
+
* enforce the same limits without importing that. Dependency-free like every
|
|
52535
|
+
* `src/shared` module, so both bundles inline it and there is exactly one copy
|
|
52536
|
+
* of the numbers the two halves have to agree on.
|
|
52537
|
+
*/
|
|
52538
|
+
/**
|
|
52539
|
+
* What an integration token may do. Scopes are checked per request rather than
|
|
52540
|
+
* per deployment: the same bridge token that asks questions carries no
|
|
52541
|
+
* permission to read back a conversation catalog it was not given.
|
|
52542
|
+
*/
|
|
52543
|
+
const QA_SERVICE_TOKEN_SCOPES = Object.freeze(["ask", "sessions:read"]);
|
|
52544
|
+
/** A token that carries no scope is useless; `ask` is what the API is for. */
|
|
52545
|
+
const QA_SERVICE_TOKEN_DEFAULT_SCOPES = Object.freeze(["ask"]);
|
|
52546
|
+
const QA_SERVICE_TOKEN_TTL_DAYS_MAX = 3650;
|
|
52547
|
+
//#endregion
|
|
52548
|
+
//#region src/client/user-settings/IntegrationTokensPage.tsx
|
|
52549
|
+
/** Scope names as the person choosing them reads them. */
|
|
52550
|
+
const SCOPE_LABELS = {
|
|
52551
|
+
ask: "Задавать вопросы",
|
|
52552
|
+
"sessions:read": "Читать историю чатов"
|
|
52553
|
+
};
|
|
52554
|
+
/** The lifetimes a token is usually asked for; the Host bounds the real range. */
|
|
52555
|
+
const TTL_CHOICES = [
|
|
52556
|
+
30,
|
|
52557
|
+
90,
|
|
52558
|
+
180,
|
|
52559
|
+
365
|
|
52560
|
+
];
|
|
52561
|
+
function scopeLabels(scopes) {
|
|
52562
|
+
return scopes.length === 0 ? "без прав" : scopes.map((scope) => SCOPE_LABELS[scope]).join(", ");
|
|
52563
|
+
}
|
|
52564
|
+
/** `2026-09-21` for a stored ISO timestamp; the empty string when unparseable. */
|
|
52565
|
+
function day(iso) {
|
|
52566
|
+
const at = Date.parse(iso);
|
|
52567
|
+
return Number.isFinite(at) ? new Date(at).toISOString().slice(0, 10) : "";
|
|
52568
|
+
}
|
|
52569
|
+
function tokenState(token, now) {
|
|
52570
|
+
if (token.revokedAt !== null) return "revoked";
|
|
52571
|
+
return Date.parse(token.expiresAt) <= now ? "expired" : "active";
|
|
52572
|
+
}
|
|
52573
|
+
/**
|
|
52574
|
+
* The integration tokens of the signed-in account: mint, read the secret once,
|
|
52575
|
+
* and revoke.
|
|
52576
|
+
*
|
|
52577
|
+
* An integration token is the credential a non-browser application presents to
|
|
52578
|
+
* the QA HTTP API, and it is deliberately a second, separate credential from
|
|
52579
|
+
* the browser session: it survives a password change, it carries its own
|
|
52580
|
+
* scopes and expiry, and it is revoked here rather than by signing anybody out.
|
|
52581
|
+
* The page therefore says what the token is *for* before it offers to mint one
|
|
52582
|
+
* — handing a long-lived key to a service is not a preference toggle.
|
|
52583
|
+
*
|
|
52584
|
+
* The plaintext exists in exactly one place: the answer that minted it. It is
|
|
52585
|
+
* shown once, with the warning that this is the only time, and the list that
|
|
52586
|
+
* follows carries no secret in any state — a list that could repeat a
|
|
52587
|
+
* credential would be a list that leaks it.
|
|
52588
|
+
*/
|
|
52589
|
+
function QaIntegrationTokensPage(props) {
|
|
52590
|
+
const [tokens, setTokens] = (0, react.useState)([]);
|
|
52591
|
+
const [loading, setLoading] = (0, react.useState)(true);
|
|
52592
|
+
const [error, setError] = (0, react.useState)(null);
|
|
52593
|
+
const [label, setLabel] = (0, react.useState)("");
|
|
52594
|
+
const [days, setDays] = (0, react.useState)(TTL_CHOICES[1] ?? 90);
|
|
52595
|
+
const [scopes, setScopes] = (0, react.useState)(QA_SERVICE_TOKEN_DEFAULT_SCOPES);
|
|
52596
|
+
const [busy, setBusy] = (0, react.useState)(false);
|
|
52597
|
+
const [issued, setIssued] = (0, react.useState)(null);
|
|
52598
|
+
const [copied, setCopied] = (0, react.useState)(false);
|
|
52599
|
+
const [pendingRevoke, setPendingRevoke] = (0, react.useState)(null);
|
|
52600
|
+
const [revoking, setRevoking] = (0, react.useState)(null);
|
|
52601
|
+
(0, react.useEffect)(() => {
|
|
52602
|
+
let live = true;
|
|
52603
|
+
props.api.list().then((result) => {
|
|
52604
|
+
if (!live) return;
|
|
52605
|
+
setLoading(false);
|
|
52606
|
+
if (result.ok) {
|
|
52607
|
+
setTokens(result.value);
|
|
52608
|
+
return;
|
|
52609
|
+
}
|
|
52610
|
+
setError(result.error);
|
|
52611
|
+
});
|
|
52612
|
+
return () => {
|
|
52613
|
+
live = false;
|
|
52614
|
+
};
|
|
52615
|
+
}, [props.api]);
|
|
52616
|
+
const reload = async () => {
|
|
52617
|
+
const result = await props.api.list();
|
|
52618
|
+
if (result.ok) {
|
|
52619
|
+
setTokens(result.value);
|
|
52620
|
+
setError(null);
|
|
52621
|
+
return;
|
|
52622
|
+
}
|
|
52623
|
+
setError(result.error);
|
|
52624
|
+
};
|
|
52625
|
+
const submit = (event) => {
|
|
52626
|
+
event.preventDefault();
|
|
52627
|
+
if (busy) return;
|
|
52628
|
+
setBusy(true);
|
|
52629
|
+
setError(null);
|
|
52630
|
+
setCopied(false);
|
|
52631
|
+
props.api.create({
|
|
52632
|
+
label: label.trim(),
|
|
52633
|
+
scopes: [...scopes],
|
|
52634
|
+
ttlDays: days
|
|
52635
|
+
}).then(async (result) => {
|
|
52636
|
+
setBusy(false);
|
|
52637
|
+
if (!result.ok) {
|
|
52638
|
+
setError(result.error);
|
|
52639
|
+
return;
|
|
52640
|
+
}
|
|
52641
|
+
setIssued(result.value);
|
|
52642
|
+
setLabel("");
|
|
52643
|
+
await reload();
|
|
52644
|
+
});
|
|
52645
|
+
};
|
|
52646
|
+
const toggleScope = (scope, checked) => {
|
|
52647
|
+
setScopes((current) => checked ? QA_SERVICE_TOKEN_SCOPES.filter((candidate) => candidate === scope || current.includes(candidate)) : current.filter((candidate) => candidate !== scope));
|
|
52648
|
+
};
|
|
52649
|
+
const revoke = (tokenId) => {
|
|
52650
|
+
if (revoking !== null) return;
|
|
52651
|
+
setRevoking(tokenId);
|
|
52652
|
+
setError(null);
|
|
52653
|
+
props.api.revoke(tokenId).then(async (result) => {
|
|
52654
|
+
setRevoking(null);
|
|
52655
|
+
setPendingRevoke(null);
|
|
52656
|
+
if (!result.ok) {
|
|
52657
|
+
setError(result.error);
|
|
52658
|
+
return;
|
|
52659
|
+
}
|
|
52660
|
+
await reload();
|
|
52661
|
+
});
|
|
52662
|
+
};
|
|
52663
|
+
const copySecret = (secret) => {
|
|
52664
|
+
const clipboard = navigator.clipboard;
|
|
52665
|
+
if (clipboard === void 0) return;
|
|
52666
|
+
clipboard.writeText(secret).then(() => setCopied(true), () => void 0);
|
|
52667
|
+
};
|
|
52668
|
+
const now = Date.now();
|
|
52669
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
52670
|
+
className: "dsh-qa-settings__page",
|
|
52671
|
+
children: [
|
|
52672
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
|
|
52673
|
+
className: "dsh-qa-settings__page-title",
|
|
52674
|
+
children: "Интеграционные токены"
|
|
52675
|
+
}),
|
|
52676
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
52677
|
+
className: "dsh-qa-settings__lead",
|
|
52678
|
+
children: "Токен — это ключ для другой программы: она задаёт вопросы от имени вашей учётной записи, не открывая браузер. Выдавайте отдельный токен каждой интеграции и отзывайте его, когда она больше не нужна. Токен переживает смену вашего пароля, поэтому отзывается отдельно."
|
|
52679
|
+
}),
|
|
52680
|
+
issued === null ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(QaSettingsSection, {
|
|
52681
|
+
title: "Токен создан",
|
|
52682
|
+
children: [
|
|
52683
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsNotice, {
|
|
52684
|
+
tone: "warn",
|
|
52685
|
+
children: "Скопируйте значение сейчас и передайте его интеграции. Показать его повторно нельзя: на стенде хранится только отпечаток."
|
|
52686
|
+
}),
|
|
52687
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsField, {
|
|
52688
|
+
label: "Значение токена",
|
|
52689
|
+
hint: "Передавайте его как заголовок Authorization: Bearer …",
|
|
52690
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
52691
|
+
className: "dsh-qa-settings__code",
|
|
52692
|
+
value: issued.token,
|
|
52693
|
+
readOnly: true,
|
|
52694
|
+
onFocus: (event) => event.currentTarget.select()
|
|
52695
|
+
})
|
|
52696
|
+
}),
|
|
52697
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(QaSettingsActions, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsButton, {
|
|
52698
|
+
label: copied ? "Скопировано" : "Скопировать",
|
|
52699
|
+
onClick: () => copySecret(issued.token)
|
|
52700
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsButton, {
|
|
52701
|
+
tone: "primary",
|
|
52702
|
+
label: "Я сохранил токен",
|
|
52703
|
+
onClick: () => {
|
|
52704
|
+
setIssued(null);
|
|
52705
|
+
setCopied(false);
|
|
52706
|
+
}
|
|
52707
|
+
})] })
|
|
52708
|
+
]
|
|
52709
|
+
}),
|
|
52710
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsSection, {
|
|
52711
|
+
title: "Новый токен",
|
|
52712
|
+
children: props.api.canCreate ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("form", {
|
|
52713
|
+
className: "dsh-qa-settings__page",
|
|
52714
|
+
onSubmit: submit,
|
|
52715
|
+
children: [
|
|
52716
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsField, {
|
|
52717
|
+
label: "Название",
|
|
52718
|
+
hint: "По нему вы отличите токены в списке: например, «мост заявок».",
|
|
52719
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
52720
|
+
value: label,
|
|
52721
|
+
maxLength: 80,
|
|
52722
|
+
placeholder: "мост заявок",
|
|
52723
|
+
onChange: (event) => setLabel(event.currentTarget.value)
|
|
52724
|
+
})
|
|
52725
|
+
}),
|
|
52726
|
+
QA_SERVICE_TOKEN_SCOPES.map((scope) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
52727
|
+
className: "dsh-qa-settings__toggle-row",
|
|
52728
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
|
|
52729
|
+
className: "dsh-qa-settings__toggle",
|
|
52730
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
52731
|
+
type: "checkbox",
|
|
52732
|
+
checked: scopes.includes(scope),
|
|
52733
|
+
onChange: (event) => toggleScope(scope, event.currentTarget.checked)
|
|
52734
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
52735
|
+
className: "dsh-qa-settings__toggle-label",
|
|
52736
|
+
children: SCOPE_LABELS[scope]
|
|
52737
|
+
})]
|
|
52738
|
+
})
|
|
52739
|
+
}, scope)),
|
|
52740
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
52741
|
+
className: "dsh-qa-settings__field-hint",
|
|
52742
|
+
children: "Права ограничивают токен, но не расширяют доступ вашей учётной записи: токен не может больше того, что можете вы."
|
|
52743
|
+
}),
|
|
52744
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsField, {
|
|
52745
|
+
label: "Срок, дней",
|
|
52746
|
+
hint: `От ${String(1)} до ${String(QA_SERVICE_TOKEN_TTL_DAYS_MAX)}; по умолчанию — срок вашей сессии.`,
|
|
52747
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
|
|
52748
|
+
value: days,
|
|
52749
|
+
onChange: (event) => setDays(Number(event.currentTarget.value)),
|
|
52750
|
+
children: TTL_CHOICES.map((choice) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
52751
|
+
value: choice,
|
|
52752
|
+
children: choice
|
|
52753
|
+
}, choice))
|
|
52754
|
+
})
|
|
52755
|
+
}),
|
|
52756
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsActions, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsButton, {
|
|
52757
|
+
type: "submit",
|
|
52758
|
+
tone: "primary",
|
|
52759
|
+
disabled: busy,
|
|
52760
|
+
label: busy ? "Создание…" : "Создать токен"
|
|
52761
|
+
}) })
|
|
52762
|
+
]
|
|
52763
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsNotice, {
|
|
52764
|
+
tone: "info",
|
|
52765
|
+
children: "Интеграционный API выключен на этом стенде, поэтому создавать токены пока не для чего. Выданные ранее токены остаются в списке ниже — их можно отозвать."
|
|
52766
|
+
})
|
|
52767
|
+
}),
|
|
52768
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(QaSettingsSection, {
|
|
52769
|
+
title: "Выданные токены",
|
|
52770
|
+
children: [error === null ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsNotice, {
|
|
52771
|
+
tone: "error",
|
|
52772
|
+
children: error
|
|
52773
|
+
}), loading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
52774
|
+
className: "dsh-qa-settings__field-hint",
|
|
52775
|
+
children: "Загрузка…"
|
|
52776
|
+
}) : tokens.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
52777
|
+
className: "dsh-qa-settings__field-hint",
|
|
52778
|
+
children: "У вас пока нет интеграционных токенов."
|
|
52779
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
|
|
52780
|
+
className: "dsh-qa-settings__rows",
|
|
52781
|
+
children: tokens.map((token) => {
|
|
52782
|
+
const state = tokenState(token, now);
|
|
52783
|
+
const confirming = pendingRevoke === token.id;
|
|
52784
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
|
|
52785
|
+
className: "dsh-qa-settings__row",
|
|
52786
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
52787
|
+
className: "dsh-qa-settings__row-button",
|
|
52788
|
+
children: [
|
|
52789
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
52790
|
+
className: "dsh-qa-settings__row-title",
|
|
52791
|
+
children: token.label
|
|
52792
|
+
}),
|
|
52793
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
52794
|
+
className: "dsh-qa-settings__row-description",
|
|
52795
|
+
children: scopeLabels(token.scopes)
|
|
52796
|
+
}),
|
|
52797
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
52798
|
+
className: "dsh-qa-settings__row-meta",
|
|
52799
|
+
children: [
|
|
52800
|
+
"создан ",
|
|
52801
|
+
day(token.createdAt),
|
|
52802
|
+
" · до ",
|
|
52803
|
+
day(token.expiresAt),
|
|
52804
|
+
" ",
|
|
52805
|
+
"· использований: ",
|
|
52806
|
+
token.useCount,
|
|
52807
|
+
token.lastUsedAt === null ? "" : ` · последний раз ${day(token.lastUsedAt)}`
|
|
52808
|
+
]
|
|
52809
|
+
}),
|
|
52810
|
+
state === "active" ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
52811
|
+
className: state === "revoked" ? "dsh-qa-settings__row-meta" : "dsh-qa-settings__row-warning",
|
|
52812
|
+
children: state === "revoked" ? "отозван" : "истёк — интеграция больше не может им пользоваться"
|
|
52813
|
+
}),
|
|
52814
|
+
state === "active" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsActions, { children: confirming ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsButton, {
|
|
52815
|
+
label: "Отмена",
|
|
52816
|
+
onClick: () => setPendingRevoke(null)
|
|
52817
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsButton, {
|
|
52818
|
+
tone: "danger",
|
|
52819
|
+
disabled: revoking === token.id,
|
|
52820
|
+
label: revoking === token.id ? "Отзываем…" : "Отозвать окончательно",
|
|
52821
|
+
onClick: () => revoke(token.id)
|
|
52822
|
+
})] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsButton, {
|
|
52823
|
+
tone: "danger",
|
|
52824
|
+
label: "Отозвать",
|
|
52825
|
+
title: `Отозвать токен «${token.label}»`,
|
|
52826
|
+
onClick: () => setPendingRevoke(token.id)
|
|
52827
|
+
}) }) : null
|
|
52828
|
+
]
|
|
52829
|
+
})
|
|
52830
|
+
}, token.id);
|
|
52831
|
+
})
|
|
52832
|
+
})]
|
|
52833
|
+
})
|
|
52834
|
+
]
|
|
52835
|
+
});
|
|
52836
|
+
}
|
|
52837
|
+
//#endregion
|
|
52838
|
+
//#region src/client/user-settings/PasswordSettingsPage.tsx
|
|
52839
|
+
/** The Host's own floor; repeated here so the form refuses before the round trip. */
|
|
52840
|
+
const MIN_PASSWORD_LENGTH$1 = 8;
|
|
52841
|
+
/**
|
|
52842
|
+
* The password section of the settings dialog: current, new, repeat. The
|
|
52843
|
+
* repeat field is client-side only — it exists to catch a typo in the field
|
|
52844
|
+
* that, unlike a name, cannot be read back later.
|
|
52845
|
+
*
|
|
52846
|
+
* The consequence is stated rather than discovered: changing a password ends
|
|
52847
|
+
* every *other* session of this account, which is exactly the point after a
|
|
52848
|
+
* leak and exactly what looks like a bug when nobody said so.
|
|
52849
|
+
*/
|
|
52850
|
+
function QaPasswordSettingsPage(props) {
|
|
52851
|
+
const [current, setCurrent] = (0, react.useState)("");
|
|
52852
|
+
const [next, setNext] = (0, react.useState)("");
|
|
52853
|
+
const [repeat, setRepeat] = (0, react.useState)("");
|
|
52854
|
+
const [busy, setBusy] = (0, react.useState)(false);
|
|
52855
|
+
const [error, setError] = (0, react.useState)(null);
|
|
52856
|
+
const [saved, setSaved] = (0, react.useState)(false);
|
|
52857
|
+
const tooShort = next !== "" && next.length < MIN_PASSWORD_LENGTH$1;
|
|
52858
|
+
const mismatch = repeat !== "" && repeat !== next;
|
|
52859
|
+
const incomplete = current === "" || next === "" || repeat === "";
|
|
52860
|
+
const submit = (event) => {
|
|
52861
|
+
event.preventDefault();
|
|
52862
|
+
if (busy || incomplete || mismatch || tooShort) return;
|
|
52863
|
+
setBusy(true);
|
|
52864
|
+
setError(null);
|
|
52865
|
+
setSaved(false);
|
|
52866
|
+
props.onChange(current, next).then((refusal) => {
|
|
52867
|
+
setBusy(false);
|
|
52868
|
+
if (refusal !== null) {
|
|
52869
|
+
setError(refusal);
|
|
52870
|
+
return;
|
|
52871
|
+
}
|
|
52872
|
+
setCurrent("");
|
|
52873
|
+
setNext("");
|
|
52874
|
+
setRepeat("");
|
|
52875
|
+
setSaved(true);
|
|
52876
|
+
});
|
|
52877
|
+
};
|
|
52878
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("form", {
|
|
52879
|
+
className: "dsh-qa-settings__page",
|
|
52880
|
+
onSubmit: submit,
|
|
52881
|
+
children: [
|
|
52882
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
|
|
52883
|
+
className: "dsh-qa-settings__page-title",
|
|
52884
|
+
children: "Пароль"
|
|
52885
|
+
}),
|
|
52886
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
52887
|
+
className: "dsh-qa-settings__lead",
|
|
52888
|
+
children: "Смена пароля закрывает ваши сессии в других браузерах — там придётся войти заново. Текущая сессия сохранится."
|
|
52889
|
+
}),
|
|
52890
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsField, {
|
|
52891
|
+
label: "Текущий пароль",
|
|
52892
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
52893
|
+
type: "password",
|
|
52894
|
+
name: "current-password",
|
|
52895
|
+
autoComplete: "current-password",
|
|
52896
|
+
required: true,
|
|
52897
|
+
disabled: busy,
|
|
52898
|
+
value: current,
|
|
52899
|
+
onChange: (event) => setCurrent(event.currentTarget.value)
|
|
52900
|
+
})
|
|
52901
|
+
}),
|
|
52902
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsField, {
|
|
52903
|
+
label: "Новый пароль",
|
|
52904
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
52905
|
+
type: "password",
|
|
52906
|
+
name: "new-password",
|
|
52907
|
+
autoComplete: "new-password",
|
|
52908
|
+
required: true,
|
|
52909
|
+
minLength: MIN_PASSWORD_LENGTH$1,
|
|
52910
|
+
disabled: busy,
|
|
52911
|
+
value: next,
|
|
52912
|
+
onChange: (event) => setNext(event.currentTarget.value)
|
|
52913
|
+
})
|
|
52914
|
+
}),
|
|
52915
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsField, {
|
|
52916
|
+
label: "Новый пароль ещё раз",
|
|
52917
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
52918
|
+
type: "password",
|
|
52919
|
+
name: "repeat-password",
|
|
52920
|
+
autoComplete: "new-password",
|
|
52921
|
+
required: true,
|
|
52922
|
+
minLength: MIN_PASSWORD_LENGTH$1,
|
|
52923
|
+
disabled: busy,
|
|
52924
|
+
value: repeat,
|
|
52925
|
+
onChange: (event) => setRepeat(event.currentTarget.value)
|
|
52926
|
+
})
|
|
52927
|
+
}),
|
|
52928
|
+
tooShort ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
|
|
52929
|
+
className: "dsh-qa-settings__field-hint",
|
|
52930
|
+
children: [
|
|
52931
|
+
"Пароль должен быть не короче ",
|
|
52932
|
+
MIN_PASSWORD_LENGTH$1,
|
|
52933
|
+
" символов."
|
|
52934
|
+
]
|
|
52935
|
+
}) : null,
|
|
52936
|
+
mismatch ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
52937
|
+
className: "dsh-qa-settings__field-hint",
|
|
52938
|
+
children: "Пароли не совпадают."
|
|
52939
|
+
}) : null,
|
|
52940
|
+
error === null ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsNotice, {
|
|
52941
|
+
tone: "error",
|
|
52942
|
+
children: error
|
|
52943
|
+
}),
|
|
52944
|
+
saved && error === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsNotice, {
|
|
52945
|
+
tone: "info",
|
|
52946
|
+
children: "Пароль изменён. Другие сессии закрыты."
|
|
52947
|
+
}) : null,
|
|
52948
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsActions, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSettingsButton, {
|
|
52949
|
+
type: "submit",
|
|
52950
|
+
tone: "primary",
|
|
52951
|
+
disabled: busy || incomplete || mismatch || tooShort,
|
|
52952
|
+
label: busy ? "Сохранение…" : "Сменить пароль"
|
|
52953
|
+
}) })
|
|
52954
|
+
]
|
|
52955
|
+
});
|
|
52956
|
+
}
|
|
52957
|
+
//#endregion
|
|
51067
52958
|
//#region src/client/user-settings/ProfileSettingsPage.tsx
|
|
51068
52959
|
const FORM_ID$2 = "dsh-qa-settings-profile-form";
|
|
51069
52960
|
/**
|
|
@@ -51239,7 +53130,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
51239
53130
|
"skill-name-invalid": "Название может содержать только строчные латинские буквы, цифры и дефисы.",
|
|
51240
53131
|
"skill-invalid": "Не удалось сохранить навык: проверьте поля ниже.",
|
|
51241
53132
|
"storage-unavailable": "Хранилище навыков недоступно. Обратитесь к администратору стенда.",
|
|
51242
|
-
"workspace-unavailable": "Рабочий каталог вашего аккаунта недоступен. Обратитесь к администратору стенда."
|
|
53133
|
+
"workspace-unavailable": "Рабочий каталог вашего аккаунта недоступен. Обратитесь к администратору стенда.",
|
|
53134
|
+
forbidden: "У вашей роли нет прав на это действие."
|
|
51243
53135
|
};
|
|
51244
53136
|
const REASON_MARKER = /\(reason: ([a-z-]+)\)/u;
|
|
51245
53137
|
const GENERIC_FAILURE = "Не удалось выполнить действие. Попробуйте ещё раз.";
|
|
@@ -51254,6 +53146,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
51254
53146
|
if (reason === void 0) return GENERIC_FAILURE;
|
|
51255
53147
|
return REASON_COPY[reason] ?? GENERIC_FAILURE;
|
|
51256
53148
|
}
|
|
53149
|
+
/**
|
|
53150
|
+
* The badge line for a skill an administrator last wrote.
|
|
53151
|
+
*
|
|
53152
|
+
* It names the role, not the person: the row already carries a date, and who
|
|
53153
|
+
* administers a deployment is not a fact a personal settings page should
|
|
53154
|
+
* depend on. The mark itself comes from the Host, which only reports one while
|
|
53155
|
+
* the stored bytes are still the administrator's.
|
|
53156
|
+
*/
|
|
53157
|
+
function adminEditMessage(edit) {
|
|
53158
|
+
const at = Date.parse(edit.at);
|
|
53159
|
+
if (Number.isNaN(at)) return "Изменено администратором";
|
|
53160
|
+
return `Изменено администратором ${new Date(at).toLocaleDateString("ru-RU", {
|
|
53161
|
+
day: "2-digit",
|
|
53162
|
+
month: "2-digit",
|
|
53163
|
+
year: "numeric"
|
|
53164
|
+
})}`;
|
|
53165
|
+
}
|
|
51257
53166
|
/** Whether a failure is the optimistic-concurrency refusal. */
|
|
51258
53167
|
function isSkillConflict(error) {
|
|
51259
53168
|
const message = typeof error === "object" && error !== null && "message" in error ? String(error.message) : typeof error === "string" ? error : "";
|
|
@@ -51477,6 +53386,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
51477
53386
|
className: "dsh-qa-settings__row-meta",
|
|
51478
53387
|
children: skillMetaLine(skill)
|
|
51479
53388
|
}),
|
|
53389
|
+
skill.adminEdit === null ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
53390
|
+
className: "dsh-qa-settings__row-note",
|
|
53391
|
+
children: adminEditMessage(skill.adminEdit)
|
|
53392
|
+
}),
|
|
51480
53393
|
skillToolWarning(skill) === null ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
51481
53394
|
className: "dsh-qa-settings__row-warning",
|
|
51482
53395
|
children: skillToolWarning(skill)
|
|
@@ -52303,10 +54216,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
52303
54216
|
id: "profile",
|
|
52304
54217
|
title: "Профиль"
|
|
52305
54218
|
});
|
|
54219
|
+
if (props.password !== void 0) models.push({
|
|
54220
|
+
id: "password",
|
|
54221
|
+
title: "Пароль"
|
|
54222
|
+
});
|
|
52306
54223
|
if (props.starters !== void 0) models.push({
|
|
52307
54224
|
id: "starters",
|
|
52308
54225
|
title: "Быстрые сообщения"
|
|
52309
54226
|
});
|
|
54227
|
+
if (props.integrationTokens !== void 0) models.push({
|
|
54228
|
+
id: "tokens",
|
|
54229
|
+
title: "Интеграционные токены"
|
|
54230
|
+
});
|
|
52310
54231
|
models.push({
|
|
52311
54232
|
id: "general",
|
|
52312
54233
|
title: "Общие"
|
|
@@ -52322,7 +54243,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
52322
54243
|
return models;
|
|
52323
54244
|
}, [
|
|
52324
54245
|
props.profile,
|
|
54246
|
+
props.password,
|
|
52325
54247
|
props.starters,
|
|
54248
|
+
props.integrationTokens,
|
|
52326
54249
|
props.skills,
|
|
52327
54250
|
extensionSnapshot.sections
|
|
52328
54251
|
]);
|
|
@@ -52359,10 +54282,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
52359
54282
|
instructionsMaxLength: props.profile.instructionsMaxLength,
|
|
52360
54283
|
onSave: props.profile.onSave
|
|
52361
54284
|
}) : null,
|
|
54285
|
+
active === "password" && props.password !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaPasswordSettingsPage, { onChange: props.password.onChange }) : null,
|
|
52362
54286
|
active === "starters" && props.starters !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaStartersSettingsPage, {
|
|
52363
54287
|
starters: props.starters.starters,
|
|
52364
54288
|
onSave: props.starters.onSave
|
|
52365
54289
|
}) : null,
|
|
54290
|
+
active === "tokens" && props.integrationTokens !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaIntegrationTokensPage, { api: props.integrationTokens }) : null,
|
|
52366
54291
|
active === "general" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaGeneralSettingsPage, {
|
|
52367
54292
|
email: props.email,
|
|
52368
54293
|
role: props.role,
|
|
@@ -53145,7 +55070,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
53145
55070
|
if (rest[0] === "skills") return { page: "skills" };
|
|
53146
55071
|
return { page: "subroles" };
|
|
53147
55072
|
case "subroles": return { page: "subroles" };
|
|
53148
|
-
case "skills": return { page: "skills" };
|
|
55073
|
+
case "skills": return rest[0] === "editor" ? { page: "skill-files" } : { page: "skills" };
|
|
53149
55074
|
case "common": return { page: "common" };
|
|
53150
55075
|
case "conversations": return param === void 0 ? { page: "conversations" } : {
|
|
53151
55076
|
page: "conversation",
|
|
@@ -53169,6 +55094,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
53169
55094
|
case "user": return `/users/${encodeURIComponent(route.userId)}`;
|
|
53170
55095
|
case "subroles": return "/access/subroles";
|
|
53171
55096
|
case "skills": return "/access/skills";
|
|
55097
|
+
case "skill-files": return "/skills/editor";
|
|
53172
55098
|
case "common": return "/access/common";
|
|
53173
55099
|
case "conversations": return "/conversations";
|
|
53174
55100
|
case "conversation": return `/conversations/${encodeURIComponent(route.conversationId)}${route.messageId === void 0 ? "" : `/${encodeURIComponent(route.messageId)}`}`;
|
|
@@ -53262,6 +55188,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
53262
55188
|
children: props.value === void 0 ? "—" : formatRelative(props.value)
|
|
53263
55189
|
});
|
|
53264
55190
|
}
|
|
55191
|
+
function ErrorLine(props) {
|
|
55192
|
+
return props.message === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
55193
|
+
className: "dsh-qa-admin__error",
|
|
55194
|
+
role: "alert",
|
|
55195
|
+
children: props.message
|
|
55196
|
+
});
|
|
55197
|
+
}
|
|
53265
55198
|
/**
|
|
53266
55199
|
* Cursor paging controls. The cursor is opaque to the browser by design: only
|
|
53267
55200
|
* the Host knows how a page was cut.
|
|
@@ -54551,8 +56484,271 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
54551
56484
|
});
|
|
54552
56485
|
}
|
|
54553
56486
|
//#endregion
|
|
56487
|
+
//#region src/client/admin/pages/SkillFiles.tsx
|
|
56488
|
+
function scopeOf(choice) {
|
|
56489
|
+
return choice.kind === "shared" ? { kind: "shared" } : {
|
|
56490
|
+
kind: "user",
|
|
56491
|
+
userId: choice.userId ?? ""
|
|
56492
|
+
};
|
|
56493
|
+
}
|
|
56494
|
+
/**
|
|
56495
|
+
* What the header shows before a user has been chosen: no store is open yet,
|
|
56496
|
+
* and the empty catalog says so without asking the Host for anything.
|
|
56497
|
+
*/
|
|
56498
|
+
function emptyView(choice) {
|
|
56499
|
+
return {
|
|
56500
|
+
scope: scopeOf(choice),
|
|
56501
|
+
owner: null,
|
|
56502
|
+
skills: [],
|
|
56503
|
+
rootPath: ""
|
|
56504
|
+
};
|
|
56505
|
+
}
|
|
56506
|
+
/** How many accounts the picker offers; a deployment's directory is small. */
|
|
56507
|
+
const PICKER_LIMIT = 100;
|
|
56508
|
+
/**
|
|
56509
|
+
* Skill files: the deployment's shared skills, and the personal skills of one
|
|
56510
|
+
* named account.
|
|
56511
|
+
*
|
|
56512
|
+
* The page is a scope picker around the very component a person edits their
|
|
56513
|
+
* own skills with — there is no second editor, because a second editor is a
|
|
56514
|
+
* second set of rules for what a `SKILL.md` may contain. What the console adds
|
|
56515
|
+
* is the choice of store, the naming of its owner, and the fact that its writes
|
|
56516
|
+
* are recorded as an administrator's.
|
|
56517
|
+
*/
|
|
56518
|
+
function AdminSkillFiles(props) {
|
|
56519
|
+
const { api, token } = props;
|
|
56520
|
+
const [choice, setChoice] = (0, react.useState)({ kind: "shared" });
|
|
56521
|
+
const users = useAdminResource(() => api.users(token, {}, null, PICKER_LIMIT), [api, token]);
|
|
56522
|
+
const personal = choice.kind === "user";
|
|
56523
|
+
const chosen = personal && choice.userId !== null;
|
|
56524
|
+
const view = useAdminResource(() => personal && !chosen ? Promise.resolve({
|
|
56525
|
+
ok: true,
|
|
56526
|
+
value: emptyView(choice)
|
|
56527
|
+
}) : api.skills(token, scopeOf(choice)), [
|
|
56528
|
+
api,
|
|
56529
|
+
token,
|
|
56530
|
+
choice,
|
|
56531
|
+
personal,
|
|
56532
|
+
chosen
|
|
56533
|
+
]);
|
|
56534
|
+
const skillApi = (0, react.useMemo)(() => {
|
|
56535
|
+
const scope = scopeOf(choice);
|
|
56536
|
+
return {
|
|
56537
|
+
list: async () => {
|
|
56538
|
+
const result = await api.skills(token, scope);
|
|
56539
|
+
return result.ok ? {
|
|
56540
|
+
ok: true,
|
|
56541
|
+
value: result.value.skills
|
|
56542
|
+
} : {
|
|
56543
|
+
ok: false,
|
|
56544
|
+
error: result.error
|
|
56545
|
+
};
|
|
56546
|
+
},
|
|
56547
|
+
get: (name) => api.skill(token, scope, name),
|
|
56548
|
+
create: (input) => api.saveSkill(token, scope, null, input),
|
|
56549
|
+
update: (name, input) => api.saveSkill(token, scope, name, input),
|
|
56550
|
+
remove: (name, revision) => api.deleteSkill(token, scope, name, revision),
|
|
56551
|
+
tools: () => api.skillTools(token, scope),
|
|
56552
|
+
validate: (name, input) => api.validateSkill(token, scope, name, input)
|
|
56553
|
+
};
|
|
56554
|
+
}, [
|
|
56555
|
+
api,
|
|
56556
|
+
token,
|
|
56557
|
+
choice
|
|
56558
|
+
]);
|
|
56559
|
+
const failure = view.error ?? users.error;
|
|
56560
|
+
const headerError = failure === void 0 ? void 0 : adminErrorMessage(failure);
|
|
56561
|
+
const ready = headerError === void 0 && (chosen || !personal);
|
|
56562
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
56563
|
+
className: "dsh-qa-admin__page",
|
|
56564
|
+
"aria-label": "Редактор навыков",
|
|
56565
|
+
children: [
|
|
56566
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
56567
|
+
className: "dsh-qa-admin__title-row",
|
|
56568
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", { children: "Редактор навыков" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: "Общие навыки видны на всём стенде. Личные навыки администратор правит от имени владельца — тот увидит пометку «изменено администратором». Каждая правка попадает в аудит." })] })
|
|
56569
|
+
}),
|
|
56570
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
56571
|
+
className: "dsh-qa-admin__tabs",
|
|
56572
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
56573
|
+
type: "button",
|
|
56574
|
+
"aria-current": personal ? void 0 : "page",
|
|
56575
|
+
onClick: () => setChoice({ kind: "shared" }),
|
|
56576
|
+
children: "Общие навыки стенда"
|
|
56577
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
56578
|
+
type: "button",
|
|
56579
|
+
"aria-current": personal ? "page" : void 0,
|
|
56580
|
+
onClick: () => setChoice((current) => ({
|
|
56581
|
+
kind: "user",
|
|
56582
|
+
userId: current.kind === "user" ? current.userId : null
|
|
56583
|
+
})),
|
|
56584
|
+
children: "Личные навыки пользователя"
|
|
56585
|
+
})]
|
|
56586
|
+
}),
|
|
56587
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ErrorLine, { message: headerError }),
|
|
56588
|
+
personal ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
|
|
56589
|
+
className: "dsh-qa-admin__filter",
|
|
56590
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "Пользователь" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
|
|
56591
|
+
value: choice.userId ?? "",
|
|
56592
|
+
onChange: (event) => setChoice({
|
|
56593
|
+
kind: "user",
|
|
56594
|
+
userId: event.currentTarget.value
|
|
56595
|
+
}),
|
|
56596
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
56597
|
+
value: "",
|
|
56598
|
+
children: "Выберите пользователя…"
|
|
56599
|
+
}), (users.data?.items ?? []).map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("option", {
|
|
56600
|
+
value: row.id,
|
|
56601
|
+
children: [
|
|
56602
|
+
row.displayName === "" ? row.email : row.displayName,
|
|
56603
|
+
" —",
|
|
56604
|
+
" ",
|
|
56605
|
+
row.email
|
|
56606
|
+
]
|
|
56607
|
+
}, row.id))]
|
|
56608
|
+
})]
|
|
56609
|
+
}) : null,
|
|
56610
|
+
view.data === void 0 || view.data.rootPath === "" ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
|
|
56611
|
+
className: "dsh-qa-admin__facts",
|
|
56612
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: view.data.owner === null ? "Общее хранилище стенда" : `Личное хранилище ${view.data.owner.displayName === "" ? view.data.owner.email : view.data.owner.displayName}` }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
56613
|
+
className: "dsh-qa-admin__mono",
|
|
56614
|
+
title: view.data.rootPath,
|
|
56615
|
+
children: view.data.rootPath
|
|
56616
|
+
})]
|
|
56617
|
+
}),
|
|
56618
|
+
personal && !chosen ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
56619
|
+
className: "dsh-qa-admin__empty",
|
|
56620
|
+
children: "Выберите пользователя, чтобы открыть его личные навыки."
|
|
56621
|
+
}) : null,
|
|
56622
|
+
ready ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSkillsSettingsPage, { api: skillApi }, personal ? choice.userId ?? "personal" : "shared") : null
|
|
56623
|
+
]
|
|
56624
|
+
});
|
|
56625
|
+
}
|
|
56626
|
+
//#endregion
|
|
54554
56627
|
//#region src/client/admin/pages/Users.tsx
|
|
54555
56628
|
const PAGE_SIZE = 25;
|
|
56629
|
+
/** The Host's floor; the form refuses a shorter password before the round trip. */
|
|
56630
|
+
const MIN_PASSWORD_LENGTH = 8;
|
|
56631
|
+
/**
|
|
56632
|
+
* The forgotten-password queue: an account asked for a reset from the sign-in
|
|
56633
|
+
* screen and nobody has answered it yet.
|
|
56634
|
+
*
|
|
56635
|
+
* It renders only while somebody is waiting. A permanently empty panel would
|
|
56636
|
+
* teach operators to ignore it, and this one has to be noticed: answering a row
|
|
56637
|
+
* signs every session of that account out, so the new password must be handed
|
|
56638
|
+
* over deliberately.
|
|
56639
|
+
*/
|
|
56640
|
+
function PasswordResetQueue(props) {
|
|
56641
|
+
const { api, token } = props;
|
|
56642
|
+
const [requests, setRequests] = (0, react.useState)([]);
|
|
56643
|
+
const [drafts, setDrafts] = (0, react.useState)({});
|
|
56644
|
+
const [busy, setBusy] = (0, react.useState)();
|
|
56645
|
+
const [error, setError] = (0, react.useState)();
|
|
56646
|
+
const [notice, setNotice] = (0, react.useState)();
|
|
56647
|
+
const load = (0, react.useCallback)(async () => {
|
|
56648
|
+
const result = await api.passwordResetRequests(token);
|
|
56649
|
+
if (!result.ok) {
|
|
56650
|
+
setError(adminErrorMessage(result.error));
|
|
56651
|
+
return;
|
|
56652
|
+
}
|
|
56653
|
+
setError(void 0);
|
|
56654
|
+
setRequests(result.value);
|
|
56655
|
+
}, [api, token]);
|
|
56656
|
+
(0, react.useEffect)(() => {
|
|
56657
|
+
load();
|
|
56658
|
+
}, [load]);
|
|
56659
|
+
const reset = async (userId) => {
|
|
56660
|
+
const password = (drafts[userId] ?? "").trim();
|
|
56661
|
+
if (password.length < MIN_PASSWORD_LENGTH) {
|
|
56662
|
+
setNotice(void 0);
|
|
56663
|
+
setError(`Пароль должен быть не короче ${MIN_PASSWORD_LENGTH} символов.`);
|
|
56664
|
+
return;
|
|
56665
|
+
}
|
|
56666
|
+
setBusy(userId);
|
|
56667
|
+
const result = await api.resetPassword(token, userId, password);
|
|
56668
|
+
setBusy(void 0);
|
|
56669
|
+
if (!result.ok) {
|
|
56670
|
+
setNotice(void 0);
|
|
56671
|
+
setError(adminErrorMessage(result.error));
|
|
56672
|
+
return;
|
|
56673
|
+
}
|
|
56674
|
+
setError(void 0);
|
|
56675
|
+
setNotice(`Новый пароль для ${result.value.user.email} установлен — передайте его пользователю. Заявка закрыта, его сессии завершены.`);
|
|
56676
|
+
setDrafts((current) => ({
|
|
56677
|
+
...current,
|
|
56678
|
+
[userId]: ""
|
|
56679
|
+
}));
|
|
56680
|
+
await load();
|
|
56681
|
+
};
|
|
56682
|
+
if (requests.length === 0) return null;
|
|
56683
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
56684
|
+
className: "dsh-qa-admin__panel",
|
|
56685
|
+
children: [
|
|
56686
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
56687
|
+
className: "dsh-qa-admin__panel-head",
|
|
56688
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", { children: "Заявки на сброс пароля" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Badge, {
|
|
56689
|
+
tone: "warning",
|
|
56690
|
+
children: requests.length === 1 ? "1 заявка" : `${String(requests.length)} заявок`
|
|
56691
|
+
})]
|
|
56692
|
+
}),
|
|
56693
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
56694
|
+
className: "dsh-qa-admin__panel-note",
|
|
56695
|
+
children: "Пользователь не может войти и просит новый пароль. Сброс завершает все его сессии: старый пароль и выданные токены перестают действовать."
|
|
56696
|
+
}),
|
|
56697
|
+
error === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
56698
|
+
className: "dsh-qa-admin__error",
|
|
56699
|
+
role: "alert",
|
|
56700
|
+
children: error
|
|
56701
|
+
}),
|
|
56702
|
+
notice === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
56703
|
+
className: "dsh-qa-admin__notice",
|
|
56704
|
+
role: "status",
|
|
56705
|
+
children: notice
|
|
56706
|
+
}),
|
|
56707
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("table", {
|
|
56708
|
+
className: "dsh-qa-admin__table",
|
|
56709
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
|
|
56710
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: "Пользователь" }),
|
|
56711
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: "Запрошен" }),
|
|
56712
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: "Заявок" }),
|
|
56713
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: "Новый пароль" }),
|
|
56714
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {})
|
|
56715
|
+
] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", { children: requests.map((request) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
|
|
56716
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("td", { children: [
|
|
56717
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: request.displayName }),
|
|
56718
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: request.email }),
|
|
56719
|
+
request.disabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Badge, {
|
|
56720
|
+
tone: "negative",
|
|
56721
|
+
children: "Отключён"
|
|
56722
|
+
}) }) : null
|
|
56723
|
+
] }),
|
|
56724
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("td", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Stamp, { value: request.lastRequestedAt }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("small", { children: ["первый запрос: ", formatStamp(request.requestedAt)] })] }),
|
|
56725
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", { children: formatCount$1(request.requestCount) }),
|
|
56726
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
56727
|
+
type: "password",
|
|
56728
|
+
autoComplete: "new-password",
|
|
56729
|
+
minLength: MIN_PASSWORD_LENGTH,
|
|
56730
|
+
placeholder: "не короче 8 символов",
|
|
56731
|
+
disabled: busy === request.userId,
|
|
56732
|
+
value: drafts[request.userId] ?? "",
|
|
56733
|
+
onChange: (event) => {
|
|
56734
|
+
const value = event.currentTarget.value;
|
|
56735
|
+
setDrafts((current) => ({
|
|
56736
|
+
...current,
|
|
56737
|
+
[request.userId]: value
|
|
56738
|
+
}));
|
|
56739
|
+
}
|
|
56740
|
+
}) }),
|
|
56741
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
56742
|
+
type: "button",
|
|
56743
|
+
disabled: busy === request.userId,
|
|
56744
|
+
onClick: () => void reset(request.userId),
|
|
56745
|
+
children: busy === request.userId ? "Сбрасываю…" : "Сбросить"
|
|
56746
|
+
}) })
|
|
56747
|
+
] }, request.userId)) })]
|
|
56748
|
+
})
|
|
56749
|
+
]
|
|
56750
|
+
});
|
|
56751
|
+
}
|
|
54556
56752
|
/**
|
|
54557
56753
|
* Users: the table an administrator triages from, and the detail page that
|
|
54558
56754
|
* separates authorization from the QA subrole assignment — an admin may work
|
|
@@ -54601,6 +56797,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
54601
56797
|
className: "dsh-qa-admin__title-row",
|
|
54602
56798
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", { children: "Пользователи" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: "Административная роль и профили агента настраиваются независимо. Удаления нет: историю разговоров сохраняет отключение." })] })
|
|
54603
56799
|
}),
|
|
56800
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PasswordResetQueue, {
|
|
56801
|
+
api: props.api,
|
|
56802
|
+
token: props.token
|
|
56803
|
+
}),
|
|
54604
56804
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
54605
56805
|
className: "dsh-qa-admin__filters",
|
|
54606
56806
|
children: [
|
|
@@ -54943,6 +57143,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
54943
57143
|
group: "Доступ",
|
|
54944
57144
|
permission: "roles.read"
|
|
54945
57145
|
},
|
|
57146
|
+
{
|
|
57147
|
+
page: "skill-files",
|
|
57148
|
+
label: "Редактор навыков",
|
|
57149
|
+
group: "Доступ",
|
|
57150
|
+
permission: "skills.manage"
|
|
57151
|
+
},
|
|
54946
57152
|
{
|
|
54947
57153
|
page: "conversations",
|
|
54948
57154
|
label: "Разговоры",
|
|
@@ -54979,6 +57185,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
54979
57185
|
"overview",
|
|
54980
57186
|
"users",
|
|
54981
57187
|
"user",
|
|
57188
|
+
"skill-files",
|
|
54982
57189
|
"conversations",
|
|
54983
57190
|
"conversation",
|
|
54984
57191
|
"review",
|
|
@@ -55850,7 +58057,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
55850
58057
|
})
|
|
55851
58058
|
]
|
|
55852
58059
|
}, role.id))
|
|
55853
|
-
})] }) : page === "
|
|
58060
|
+
})] }) : adminApi !== void 0 && page === "skill-files" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AdminSkillFiles, {
|
|
58061
|
+
api: adminApi,
|
|
58062
|
+
token: props.token
|
|
58063
|
+
}) : page === "skills" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
55854
58064
|
className: "dsh-qa-admin__title-row",
|
|
55855
58065
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", { children: "Навыки" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: "SKILL.md сам объявляет свою аудиторию и необходимые инструменты. Администратор может расширить или отозвать доступ, не изменяя файл навыка." })] })
|
|
55856
58066
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SkillTable, {
|
|
@@ -56539,6 +58749,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
56539
58749
|
label: accountsSnapshot.user.profile.fullName === "" ? accountsSnapshot.user.email : accountsSnapshot.user.profile.fullName,
|
|
56540
58750
|
onOpen: () => setSettingsOpen(true)
|
|
56541
58751
|
} : void 0, [accountsSnapshot]);
|
|
58752
|
+
const integrationTokens = (0, react.useMemo)(() => accounts === void 0 ? void 0 : {
|
|
58753
|
+
canCreate: config.integration.enabled,
|
|
58754
|
+
list: () => accounts.serviceTokens(),
|
|
58755
|
+
create: (input) => accounts.createServiceToken(input),
|
|
58756
|
+
revoke: (tokenId) => accounts.revokeServiceToken(tokenId)
|
|
58757
|
+
}, [accounts, config.integration.enabled]);
|
|
56542
58758
|
const settingsDialog = (0, react.useMemo)(() => {
|
|
56543
58759
|
if (accounts === void 0 || accountsSnapshot.stage !== "authed") return;
|
|
56544
58760
|
return {
|
|
@@ -56548,17 +58764,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
56548
58764
|
instructionsMaxLength: config.accounts.profile.instructionsMaxLength,
|
|
56549
58765
|
onSave: (input) => accounts.updateProfile(input)
|
|
56550
58766
|
} : void 0,
|
|
58767
|
+
password: { onChange: (currentPassword, nextPassword) => accounts.changePassword(currentPassword, nextPassword) },
|
|
56551
58768
|
starters: config.accounts.starters.enabled ? {
|
|
56552
58769
|
starters: accountsSnapshot.user.starters,
|
|
56553
58770
|
onSave: (input) => accounts.updateStarters(input)
|
|
56554
58771
|
} : void 0,
|
|
56555
|
-
skills: config.accounts.skills.enabled && boundSkillApi !== void 0 ? boundSkillApi : void 0
|
|
58772
|
+
skills: config.accounts.skills.enabled && boundSkillApi !== void 0 ? boundSkillApi : void 0,
|
|
58773
|
+
integrationTokens
|
|
56556
58774
|
};
|
|
56557
58775
|
}, [
|
|
56558
58776
|
accounts,
|
|
56559
58777
|
accountsSnapshot,
|
|
56560
58778
|
config,
|
|
56561
|
-
boundSkillApi
|
|
58779
|
+
boundSkillApi,
|
|
58780
|
+
integrationTokens
|
|
56562
58781
|
]);
|
|
56563
58782
|
const busyTurn = state.phase === "running" ? railItems.at(-1)?.turn ?? null : null;
|
|
56564
58783
|
const chatRows = (0, react.useMemo)(() => buildChatRows(controller?.chatIds() ?? [], listState.byId, activeSessionId, (id) => ownerNames?.get(id)), [
|
|
@@ -56673,7 +58892,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
56673
58892
|
extensions: props.settingsSections,
|
|
56674
58893
|
token: accounts?.token() ?? "",
|
|
56675
58894
|
...settingsDialog.profile === void 0 ? {} : { profile: settingsDialog.profile },
|
|
58895
|
+
...settingsDialog.password === void 0 ? {} : { password: settingsDialog.password },
|
|
56676
58896
|
...settingsDialog.starters === void 0 ? {} : { starters: settingsDialog.starters },
|
|
58897
|
+
...settingsDialog.integrationTokens === void 0 ? {} : { integrationTokens: settingsDialog.integrationTokens },
|
|
56677
58898
|
...settingsDialog.skills === void 0 ? {} : { skills: settingsDialog.skills }
|
|
56678
58899
|
}),
|
|
56679
58900
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("main", {
|
|
@@ -57045,6 +59266,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
57045
59266
|
.dsh-qa-admin__panel h2{margin:0;font-size:15px}
|
|
57046
59267
|
.dsh-qa-admin__panel h3{margin:14px 0 6px;font-size:13px;color:var(--dsw-alias-label-secondary)}
|
|
57047
59268
|
.dsh-qa-admin__panel-head{display:flex;align-items:center;justify-content:space-between;gap:12px}
|
|
59269
|
+
.dsh-qa-admin__panel-note{margin:0;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px}
|
|
59270
|
+
.dsh-qa-admin__notice{margin:0;color:var(--dsh-qa-success);font-size:12px;line-height:17px}
|
|
57048
59271
|
.dsh-qa-admin__columns{display:grid;grid-template-columns:minmax(0,360px) minmax(0,1fr);gap:18px;align-items:start}
|
|
57049
59272
|
.dsh-qa-admin__metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px}
|
|
57050
59273
|
.dsh-qa-admin__metric{display:flex;flex-direction:column;gap:2px;padding:14px 16px;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;background:var(--dsw-alias-bg-layer-3)}
|
|
@@ -57335,6 +59558,12 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
|
|
|
57335
59558
|
.dsh-qa-auth__submit:hover{background:var(--dsh-qa-accent-hover)}
|
|
57336
59559
|
.dsh-qa-auth__submit:focus-visible{outline:2px solid var(--dsh-qa-accent);outline-offset:2px}
|
|
57337
59560
|
.dsh-qa-auth__submit:disabled{opacity:.6;cursor:default}
|
|
59561
|
+
.dsh-qa-auth__lead{margin:0;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px}
|
|
59562
|
+
.dsh-qa-auth__notice{margin:0;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:17px}
|
|
59563
|
+
.dsh-qa-auth__link{appearance:none;padding:0;border:0;background:0 0;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;line-height:17px;text-align:center;text-decoration:underline;cursor:pointer}
|
|
59564
|
+
.dsh-qa-auth__link:hover{color:var(--dsw-alias-label-primary)}
|
|
59565
|
+
.dsh-qa-auth__link:focus-visible{outline:2px solid var(--dsh-qa-accent);outline-offset:2px}
|
|
59566
|
+
.dsh-qa-auth__link:disabled{opacity:.6;cursor:default}
|
|
57338
59567
|
.dsh-qa-crash{align-items:center;justify-content:center;padding:24px}
|
|
57339
59568
|
.dsh-qa-crash__card{display:flex;flex-direction:column;gap:12px;width:min(380px,100%);padding:28px;border:1px solid var(--dsw-alias-border-l2);border-radius:14px;background:var(--dsw-alias-bg-layer-2);box-shadow:0 18px 48px var(--dsh-qa-overlay);text-align:center}
|
|
57340
59569
|
.dsh-qa-crash__card h1{margin:0;color:var(--dsw-alias-label-primary);font-size:19px;font-weight:600;line-height:26px}
|
|
@@ -57394,6 +59623,8 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
|
|
|
57394
59623
|
.dsh-qa-settings__field input,.dsh-qa-settings__field textarea{appearance:none;width:100%;padding:9px 11px;border:1px solid var(--dsw-alias-border-l2);border-radius:9px;background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);font:inherit;font-size:14px;line-height:20px}
|
|
57395
59624
|
.dsh-qa-settings__field textarea{min-height:64px;line-height:19px;resize:vertical}
|
|
57396
59625
|
.dsh-qa-settings__field input:focus,.dsh-qa-settings__field textarea:focus{outline:none;border-color:var(--dsh-qa-brand)}
|
|
59626
|
+
.dsh-qa-settings__field select{appearance:none;width:100%;padding:9px 11px;border:1px solid var(--dsw-alias-border-l2);border-radius:9px;background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);font:inherit;font-size:14px;line-height:20px}
|
|
59627
|
+
.dsh-qa-settings__field select:focus{outline:none;border-color:var(--dsh-qa-brand)}
|
|
57397
59628
|
.dsh-qa-settings__field input:read-only{opacity:.6}
|
|
57398
59629
|
.dsh-qa-settings__code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;line-height:20px}
|
|
57399
59630
|
.dsh-qa-settings__field-hint{margin:0;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px}
|
|
@@ -57429,6 +59660,7 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
|
|
|
57429
59660
|
.dsh-qa-settings__row-title{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:600;line-height:20px}
|
|
57430
59661
|
.dsh-qa-settings__row-description{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:19px}
|
|
57431
59662
|
.dsh-qa-settings__row-meta{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px}
|
|
59663
|
+
.dsh-qa-settings__row-note{color:var(--dsh-qa-info,var(--dsw-alias-label-secondary));font-size:12px;line-height:17px}
|
|
57432
59664
|
.dsh-qa-settings__row-warning{color:var(--dsh-qa-warning);font-size:12px;line-height:17px}
|
|
57433
59665
|
.dsh-qa-settings__row-error{color:var(--dsh-qa-error);font-size:12px;line-height:17px}
|
|
57434
59666
|
.dsh-qa-settings__chips{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}
|
|
@@ -58687,7 +60919,7 @@ ${QA_ROOT_STYLES}`;
|
|
|
58687
60919
|
const paths = [["attachments"]];
|
|
58688
60920
|
const modified = overriddenAny(props, paths);
|
|
58689
60921
|
const stored = attachments?.extensions;
|
|
58690
|
-
const extensions = stored !== void 0 && stored.length > 0 ? stored : props.effective?.attachments.extensions ??
|
|
60922
|
+
const extensions = stored !== void 0 && stored.length > 0 ? stored : props.effective?.attachments.extensions ?? DEFAULT_QA_ATTACHMENT_EXTENSIONS;
|
|
58691
60923
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Section, {
|
|
58692
60924
|
title: "Вложения",
|
|
58693
60925
|
modified,
|
|
@@ -58699,8 +60931,8 @@ ${QA_ROOT_STYLES}`;
|
|
|
58699
60931
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Toggle, {
|
|
58700
60932
|
checked: textFiles,
|
|
58701
60933
|
disabled,
|
|
58702
|
-
label: "
|
|
58703
|
-
hint: "К изображениям можно прикладывать
|
|
60934
|
+
label: "Файловые вложения",
|
|
60935
|
+
hint: "К изображениям можно прикладывать файлы из списка расширений ниже — текстовые и документы. Выключено — только изображения.",
|
|
58704
60936
|
onChange: (value) => {
|
|
58705
60937
|
props.write(["attachments", "textFiles"], value);
|
|
58706
60938
|
}
|
|
@@ -58741,11 +60973,11 @@ ${QA_ROOT_STYLES}`;
|
|
|
58741
60973
|
]
|
|
58742
60974
|
}),
|
|
58743
60975
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ListField, {
|
|
58744
|
-
label: "
|
|
60976
|
+
label: "Разрешённые расширения файлов",
|
|
58745
60977
|
value: extensions,
|
|
58746
60978
|
disabled: disabled || !textFiles,
|
|
58747
|
-
placeholder: "md\\ntxt\\
|
|
58748
|
-
hint: "По одному расширению на строку, без
|
|
60979
|
+
placeholder: "md\\ntxt\\ndocx",
|
|
60980
|
+
hint: "По одному расширению на строку, без точки: текстовые файлы и документы, которые стенд умеет читать (docx, pdf). Дополнительно принимается всё, что браузер помечает как text/*.",
|
|
58749
60981
|
parse: parseCommaList,
|
|
58750
60982
|
onCommit: (values) => {
|
|
58751
60983
|
props.write(["attachments", "extensions"], values);
|
|
@@ -58753,7 +60985,7 @@ ${QA_ROOT_STYLES}`;
|
|
|
58753
60985
|
}),
|
|
58754
60986
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Notice, {
|
|
58755
60987
|
tone: "info",
|
|
58756
|
-
children: "Файл сохраняется на сервере как есть, а в подсказке модели указывается путь к копии:
|
|
60988
|
+
children: "Файл сохраняется на сервере как есть, а в подсказке модели указывается путь к копии: текст читает инструмент чтения, документ — инструменты конвейера документов. Держите «read» (а для документов — инструменты документов) в списке разрешённых инструментов, иначе вложение останется недоступным для модели."
|
|
58757
60989
|
})
|
|
58758
60990
|
]
|
|
58759
60991
|
});
|
|
@@ -59210,9 +61442,11 @@ ${QA_ROOT_STYLES}`;
|
|
|
59210
61442
|
//#region src/client/settings/sections/notes.tsx
|
|
59211
61443
|
/**
|
|
59212
61444
|
* Model notes: the ambient plugin messages the injector writes into a QA chat
|
|
59213
|
-
* (who the user is, the source-provenance rules, delegation naming
|
|
59214
|
-
*
|
|
59215
|
-
*
|
|
61445
|
+
* (who the user is, the source-provenance rules, delegation naming, which
|
|
61446
|
+
* reader an attached document belongs to, where an answer should come from).
|
|
61447
|
+
* Each note has a switch and an optional wording override; an empty template
|
|
61448
|
+
* keeps the built-in text, so the fields double as a wording editor and a mute
|
|
61449
|
+
* switch.
|
|
59216
61450
|
*/
|
|
59217
61451
|
const NOTE_PATHS = [
|
|
59218
61452
|
[
|
|
@@ -59249,6 +61483,26 @@ ${QA_ROOT_STYLES}`;
|
|
|
59249
61483
|
"notes",
|
|
59250
61484
|
"delegation",
|
|
59251
61485
|
"template"
|
|
61486
|
+
],
|
|
61487
|
+
[
|
|
61488
|
+
"notes",
|
|
61489
|
+
"documents",
|
|
61490
|
+
"enabled"
|
|
61491
|
+
],
|
|
61492
|
+
[
|
|
61493
|
+
"notes",
|
|
61494
|
+
"documents",
|
|
61495
|
+
"template"
|
|
61496
|
+
],
|
|
61497
|
+
[
|
|
61498
|
+
"notes",
|
|
61499
|
+
"sourcePriority",
|
|
61500
|
+
"enabled"
|
|
61501
|
+
],
|
|
61502
|
+
[
|
|
61503
|
+
"notes",
|
|
61504
|
+
"sourcePriority",
|
|
61505
|
+
"template"
|
|
59252
61506
|
]
|
|
59253
61507
|
];
|
|
59254
61508
|
/** The ambient notes the Host writes into QA chats as hidden user messages. */
|
|
@@ -59258,6 +61512,8 @@ ${QA_ROOT_STYLES}`;
|
|
|
59258
61512
|
const identity = config?.notes?.identity;
|
|
59259
61513
|
const sources = config?.notes?.sources;
|
|
59260
61514
|
const delegation = config?.notes?.delegation;
|
|
61515
|
+
const documents = config?.notes?.documents;
|
|
61516
|
+
const sourcePriority = config?.notes?.sourcePriority;
|
|
59261
61517
|
const paths = NOTE_PATHS;
|
|
59262
61518
|
const modified = overriddenAny(props, paths);
|
|
59263
61519
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Section, {
|
|
@@ -59368,9 +61624,65 @@ ${QA_ROOT_STYLES}`;
|
|
|
59368
61624
|
], value);
|
|
59369
61625
|
}
|
|
59370
61626
|
}),
|
|
59371
|
-
|
|
61627
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Toggle, {
|
|
61628
|
+
label: "Документы во вложениях",
|
|
61629
|
+
hint: "Напоминание читать приложенный документ Word или PDF конвейером документов (document_inspect, document_to_markdown), а не универсальным чтением файла: оно отказывает таким форматам как бинарным, и отказ читается как «файла нет».",
|
|
61630
|
+
checked: documents?.enabled ?? true,
|
|
61631
|
+
disabled,
|
|
61632
|
+
onChange: (checked) => {
|
|
61633
|
+
props.write([
|
|
61634
|
+
"notes",
|
|
61635
|
+
"documents",
|
|
61636
|
+
"enabled"
|
|
61637
|
+
], checked);
|
|
61638
|
+
}
|
|
61639
|
+
}),
|
|
61640
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextField, {
|
|
61641
|
+
label: "Формулировка заметки о документах",
|
|
61642
|
+
value: documents?.template ?? "",
|
|
61643
|
+
disabled,
|
|
61644
|
+
multiline: true,
|
|
61645
|
+
rows: 4,
|
|
61646
|
+
hint: "Пусто — встроенный текст. Выключите заметку, если на стенде нет конвейера документов.",
|
|
61647
|
+
onChange: (value) => {
|
|
61648
|
+
props.write([
|
|
61649
|
+
"notes",
|
|
61650
|
+
"documents",
|
|
61651
|
+
"template"
|
|
61652
|
+
], value);
|
|
61653
|
+
}
|
|
61654
|
+
}),
|
|
61655
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Toggle, {
|
|
61656
|
+
label: "Приоритет источников",
|
|
61657
|
+
hint: "Напоминание отвечать из того источника, который владеет вопросом: вложения и документация раньше памяти. Срабатывает там, где скилл плагина памяти не активировался.",
|
|
61658
|
+
checked: sourcePriority?.enabled ?? true,
|
|
61659
|
+
disabled,
|
|
61660
|
+
onChange: (checked) => {
|
|
61661
|
+
props.write([
|
|
61662
|
+
"notes",
|
|
61663
|
+
"sourcePriority",
|
|
61664
|
+
"enabled"
|
|
61665
|
+
], checked);
|
|
61666
|
+
}
|
|
61667
|
+
}),
|
|
61668
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextField, {
|
|
61669
|
+
label: "Формулировка заметки о приоритете источников",
|
|
61670
|
+
value: sourcePriority?.template ?? "",
|
|
61671
|
+
disabled,
|
|
61672
|
+
multiline: true,
|
|
61673
|
+
rows: 4,
|
|
61674
|
+
hint: "Пусто — встроенный текст.",
|
|
61675
|
+
onChange: (value) => {
|
|
61676
|
+
props.write([
|
|
61677
|
+
"notes",
|
|
61678
|
+
"sourcePriority",
|
|
61679
|
+
"template"
|
|
61680
|
+
], value);
|
|
61681
|
+
}
|
|
61682
|
+
}),
|
|
61683
|
+
identity?.enabled === false && sources?.enabled === false && delegation?.enabled === false && documents?.enabled === false && sourcePriority?.enabled === false ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Notice, {
|
|
59372
61684
|
tone: "warn",
|
|
59373
|
-
children: "Все заметки выключены: новые чаты не получат ни контекста о пользователе, ни правил источников, ни имён
|
|
61685
|
+
children: "Все заметки выключены: новые чаты не получат ни контекста о пользователе, ни правил источников, ни имён делегаций, ни маршрутизации документов, ни напоминания о приоритете источников."
|
|
59374
61686
|
}) : null
|
|
59375
61687
|
]
|
|
59376
61688
|
});
|
|
@@ -60840,6 +63152,8 @@ textarea.qa-card-control{height:auto;padding:8px 12px;line-height:1.5;resize:ver
|
|
|
60840
63152
|
users: (token, query, cursor, limit) => policyRemote.adminUsers(token, query, cursor, limit),
|
|
60841
63153
|
user: (token, userId) => policyRemote.adminUser(token, userId),
|
|
60842
63154
|
updateUser: (token, userId, update) => policyRemote.adminUpdateUser(token, userId, update),
|
|
63155
|
+
passwordResetRequests: (token) => policyRemote.adminPasswordResetRequests(token),
|
|
63156
|
+
resetPassword: (token, userId, password) => policyRemote.adminResetPassword(token, userId, password),
|
|
60843
63157
|
conversations: (token, query, cursor, limit) => policyRemote.adminConversations(token, query, cursor, limit),
|
|
60844
63158
|
conversation: (token, conversationId) => policyRemote.adminConversation(token, conversationId),
|
|
60845
63159
|
deleteConversation: (token, conversationId) => policyRemote.adminDeleteConversation(token, conversationId),
|
|
@@ -60849,7 +63163,22 @@ textarea.qa-card-control{height:auto;padding:8px 12px;line-height:1.5;resize:ver
|
|
|
60849
63163
|
queueConversation: (token, conversationId, messageId) => policyRemote.adminQueueConversation(token, conversationId, messageId),
|
|
60850
63164
|
saveReview: (token, input) => policyRemote.adminSaveReview(token, input),
|
|
60851
63165
|
metrics: (token) => policyRemote.adminMetrics(token),
|
|
60852
|
-
audit: (token, query, cursor, limit) => policyRemote.adminAudit(token, query, cursor, limit)
|
|
63166
|
+
audit: (token, query, cursor, limit) => policyRemote.adminAudit(token, query, cursor, limit),
|
|
63167
|
+
skills: (token, scope) => policyRemote.adminSkills(token, scope),
|
|
63168
|
+
skill: (token, scope, name) => policyRemote.adminSkill(token, scope, name),
|
|
63169
|
+
saveSkill: (token, scope, name, input) => policyRemote.adminSkillSave(token, scope, name, input),
|
|
63170
|
+
deleteSkill: (token, scope, name, expectedRevision) => policyRemote.adminSkillDelete(token, scope, name, expectedRevision),
|
|
63171
|
+
validateSkill: (token, scope, name, input) => policyRemote.adminSkillValidate(token, scope, name, input),
|
|
63172
|
+
skillTools: async (token, scope) => {
|
|
63173
|
+
const result = await policyRemote.adminSkillTools(token, scope);
|
|
63174
|
+
return result.ok ? {
|
|
63175
|
+
ok: true,
|
|
63176
|
+
value: result.value.tools
|
|
63177
|
+
} : {
|
|
63178
|
+
ok: false,
|
|
63179
|
+
error: result.error
|
|
63180
|
+
};
|
|
63181
|
+
}
|
|
60853
63182
|
};
|
|
60854
63183
|
const sourceApi = {
|
|
60855
63184
|
sources: (token, sessionId) => policyRemote.sources(token, sessionId),
|