@musnows/scriverse 0.8.0 → 0.8.1

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/dist/app.js CHANGED
@@ -40,10 +40,14 @@ import { S3BackupManager } from "./s3-backup.js";
40
40
  import { APP_VERSION } from "./version.js";
41
41
  import { ReleaseUpdateChecker } from "./release-update.js";
42
42
  import { DEFAULT_IMAGE_UPLOAD_LIMITS, formatUploadLimit } from "./upload-limits.js";
43
- import { canReadWorkModule, canWriteWorkModule, fullWorkModulePermissions, proseReplacementPermissionModules } from "./work-permissions.js";
43
+ import { canReadWorkModule, canWriteWorkModule, chapterAnnotationPermissionModule, fullWorkModulePermissions, proseReplacementPermissionModules } from "./work-permissions.js";
44
44
  import { CollaborationPresence, editorPageKey, entityEditorPageKey, modulePageKey, presencePageKinds } from "./collaboration-presence.js";
45
45
  import { PresenceStore } from "./presence-store.js";
46
46
  import { analysisTaskReadModules, clearSessionCookie, createCliApiScopeMiddleware, createUserSessionMiddleware, createWorkAuthorizationMiddleware, relationshipAnalysisReadModules, setSessionCookie, UserAuthService } from "./user-auth.js";
47
+ const chapterAnnotationKinds = ["note", "todo"];
48
+ function readableChapterAnnotationKinds(permissions) {
49
+ return chapterAnnotationKinds.filter((kind) => canReadWorkModule(permissions, chapterAnnotationPermissionModule(kind)));
50
+ }
47
51
  const nonEmpty = z.string().trim().min(1);
48
52
  const identifier = z.string().trim().min(1).max(200);
49
53
  const idempotencyKeySchema = z.string().trim().min(16).max(128)
@@ -110,6 +114,8 @@ const memberRoleValueSchema = z.enum(["editor", "settings-editor", "viewer"]);
110
114
  const moduleAccessSchema = z.enum(["none", "read", "write"]);
111
115
  const modulePermissionsSchema = z.object({
112
116
  prose: moduleAccessSchema,
117
+ comments: moduleAccessSchema.optional(),
118
+ todos: moduleAccessSchema.optional(),
113
119
  drafts: moduleAccessSchema.optional(),
114
120
  settings: moduleAccessSchema,
115
121
  characters: moduleAccessSchema,
@@ -124,6 +130,8 @@ const modulePermissionsSchema = z.object({
124
130
  "ai-settings": moduleAccessSchema
125
131
  }).strict().transform((permissions) => ({
126
132
  ...permissions,
133
+ comments: permissions.comments ?? permissions.prose,
134
+ todos: permissions.todos ?? permissions.prose,
127
135
  drafts: permissions.drafts ?? (permissions.prose === "write" && permissions.settings === "write"
128
136
  ? "write"
129
137
  : permissions.prose === "none" || permissions.settings === "none" ? "none" : "read")
@@ -932,12 +940,18 @@ function redactAiConversationMessage(item, permissions) {
932
940
  if (!message)
933
941
  return item;
934
942
  if (permissions.prose !== "none") {
935
- if (permissions.characters !== "none")
936
- return item;
937
943
  const metadata = recordValue(message.metadata);
938
- if (!metadata || !("mentionCharacterIds" in metadata))
944
+ if (!metadata)
945
+ return item;
946
+ const readableMetadata = { ...metadata };
947
+ if (permissions.characters === "none")
948
+ delete readableMetadata.mentionCharacterIds;
949
+ if (permissions.races === "none")
950
+ delete readableMetadata.mentionRaceIds;
951
+ if (permissions.organizations === "none")
952
+ delete readableMetadata.mentionOrganizationIds;
953
+ if (Object.keys(readableMetadata).length === Object.keys(metadata).length)
939
954
  return item;
940
- const { mentionCharacterIds: _mentionCharacterIds, ...readableMetadata } = metadata;
941
955
  return { ...message, metadata: readableMetadata };
942
956
  }
943
957
  return {
@@ -1609,12 +1623,23 @@ export function createRuntime(options) {
1609
1623
  const pagination = parsePagination(request.query);
1610
1624
  data(response, pagination ? store.listChapterInsightsPage(request.params.chapterId, pagination) : store.listChapterInsights(request.params.chapterId));
1611
1625
  });
1612
- app.get("/api/chapters/:chapterId/annotations", (request, response) => data(response, store.listChapterAnnotations(request.params.chapterId)));
1626
+ app.get("/api/chapters/:chapterId/annotation-counts", (request, response) => {
1627
+ const permissions = requestPermissions(request);
1628
+ data(response, store.listChapterAnnotationCounts(request.params.chapterId, readableChapterAnnotationKinds(permissions)));
1629
+ });
1630
+ app.get("/api/chapters/:chapterId/annotations", (request, response) => {
1631
+ const line = request.query.line === undefined
1632
+ ? undefined
1633
+ : parse(z.coerce.number().int().positive().max(100_000), request.query.line);
1634
+ const permissions = requestPermissions(request);
1635
+ data(response, store.listChapterAnnotations(request.params.chapterId, readableChapterAnnotationKinds(permissions), line));
1636
+ });
1613
1637
  app.get("/api/works/:workId/chapter-annotations", (request, response) => {
1614
1638
  const pagination = parsePagination(request.query);
1639
+ const permissions = requestPermissions(request, request.params.workId);
1615
1640
  data(response, pagination
1616
- ? store.listWorkChapterAnnotationsPage(request.params.workId, pagination)
1617
- : store.listWorkChapterAnnotations(request.params.workId));
1641
+ ? store.listWorkChapterAnnotationsPage(request.params.workId, pagination, readableChapterAnnotationKinds(permissions))
1642
+ : store.listWorkChapterAnnotations(request.params.workId, readableChapterAnnotationKinds(permissions)));
1618
1643
  });
1619
1644
  app.post("/api/chapters/:chapterId/annotations", (request, response) => {
1620
1645
  const input = parse(z.object({
@@ -2709,6 +2734,8 @@ export function createRuntime(options) {
2709
2734
  ...(resolvedScope.characterIds ?? []),
2710
2735
  ...(resolvedScope.mentionCharacterIds ?? [])
2711
2736
  ])];
2737
+ const mentionRaceIds = [...new Set(resolvedScope.raceIds ?? [])];
2738
+ const mentionOrganizationIds = [...new Set(resolvedScope.organizationIds ?? [])];
2712
2739
  const begun = store.beginAiConversationStreamRequest({
2713
2740
  workId: request.params.workId,
2714
2741
  conversationId,
@@ -2719,9 +2746,11 @@ export function createRuntime(options) {
2719
2746
  content: input.instruction,
2720
2747
  citations,
2721
2748
  ...(input.currentMessageId ? { existingMessageId: input.currentMessageId } : {}),
2722
- ...((modelId || mentionCharacterIds.length) ? { metadata: {
2749
+ ...((modelId || mentionCharacterIds.length || mentionRaceIds.length || mentionOrganizationIds.length) ? { metadata: {
2723
2750
  ...(modelId ? { modelId } : {}),
2724
- ...(mentionCharacterIds.length ? { mentionCharacterIds } : {})
2751
+ ...(mentionCharacterIds.length ? { mentionCharacterIds } : {}),
2752
+ ...(mentionRaceIds.length ? { mentionRaceIds } : {}),
2753
+ ...(mentionOrganizationIds.length ? { mentionOrganizationIds } : {})
2725
2754
  } } : {})
2726
2755
  }
2727
2756
  });