@musnows/scriverse 1.0.7 → 1.0.9

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
@@ -1111,6 +1111,18 @@ function redactSuggestion(record, permissions) {
1111
1111
  restricted: true
1112
1112
  };
1113
1113
  }
1114
+ function redactAiConversationInlineReferences(content, permissions) {
1115
+ const source = typeof content === "string" ? content : "";
1116
+ return source.replace(/<ai_reference kind="(character|setting|chapter|context-settings)" id="[^"]+">[\s\S]*?<\/ai_reference>/gu, (reference, kind) => {
1117
+ const readable = ({
1118
+ character: permissions.characters !== "none",
1119
+ setting: permissions.settings !== "none",
1120
+ chapter: permissions.prose !== "none",
1121
+ "context-settings": permissions.settings !== "none"
1122
+ })[kind] ?? false;
1123
+ return readable ? reference : "(已隐藏引用)";
1124
+ });
1125
+ }
1114
1126
  function redactAiConversationMessage(item, permissions) {
1115
1127
  const message = recordValue(item);
1116
1128
  if (!message)
@@ -1130,9 +1142,10 @@ function redactAiConversationMessage(item, permissions) {
1130
1142
  delete readableMetadata.mentionSettingIds;
1131
1143
  if (permissions.settings === "none")
1132
1144
  delete readableMetadata.mentionContextSettingIds;
1133
- if (Object.keys(readableMetadata).length === Object.keys(metadata).length)
1145
+ const content = redactAiConversationInlineReferences(message.content, permissions);
1146
+ if (Object.keys(readableMetadata).length === Object.keys(metadata).length && content === message.content)
1134
1147
  return item;
1135
- return { ...message, metadata: readableMetadata };
1148
+ return { ...message, content, metadata: readableMetadata };
1136
1149
  }
1137
1150
  return {
1138
1151
  ...message,
@@ -4034,15 +4047,6 @@ export function createRuntime(options) {
4034
4047
  }
4035
4048
  if (begun.request.status === "completed" && begun.assistantMessage) {
4036
4049
  const content = String(begun.assistantMessage.content ?? "");
4037
- const assistantMetadata = begun.assistantMessage.metadata && typeof begun.assistantMessage.metadata === "object"
4038
- ? begun.assistantMessage.metadata
4039
- : {};
4040
- const writingSuggestionId = typeof assistantMetadata.writingSuggestionId === "string"
4041
- ? assistantMetadata.writingSuggestionId
4042
- : "";
4043
- const writingSuggestion = writingSuggestionId
4044
- ? redactSuggestion(ai.getSuggestion(writingSuggestionId), permissions)
4045
- : null;
4046
4050
  if (content)
4047
4051
  sendEvent("delta", { delta: content, replayed: true });
4048
4052
  sendEvent("complete", {
@@ -4050,8 +4054,7 @@ export function createRuntime(options) {
4050
4054
  conversationId,
4051
4055
  conversationTitle: store.getAiConversationSummary(conversationId).title,
4052
4056
  messageId: begun.assistantMessage.id,
4053
- messageCreatedAt: begun.assistantMessage.createdAt,
4054
- ...(writingSuggestion ? { writingSuggestion } : {})
4057
+ messageCreatedAt: begun.assistantMessage.createdAt
4055
4058
  });
4056
4059
  }
4057
4060
  else {
@@ -4083,7 +4086,7 @@ export function createRuntime(options) {
4083
4086
  questionId: pendingQuestion.id
4084
4087
  });
4085
4088
  }
4086
- const suggestion = await ai.createStreamingChat({
4089
+ const result = await ai.createStreamingChat({
4087
4090
  workId: request.params.workId,
4088
4091
  instruction: resolvedInstruction,
4089
4092
  skillInstruction: instructionText,
@@ -4101,33 +4104,30 @@ export function createRuntime(options) {
4101
4104
  ...(input.parameters ? { parameters: input.parameters } : {}),
4102
4105
  ...(preparedChatImageAttachments.length ? { imageAttachments: preparedChatImageAttachments } : {})
4103
4106
  }, (delta) => sendEvent("delta", { delta }));
4104
- const assistantMessageId = typeof suggestion.conversationMessage === "object" && suggestion.conversationMessage !== null
4105
- ? String(suggestion.conversationMessage.id ?? "")
4107
+ const assistantMessageId = typeof result.conversationMessage === "object" && result.conversationMessage !== null
4108
+ ? String(result.conversationMessage.id ?? "")
4106
4109
  : "";
4107
4110
  if (!stopping) {
4108
4111
  store.finishAiConversationStreamRequest(streamRequestId, "completed", "completed", assistantMessageId || undefined);
4109
4112
  }
4110
4113
  streamRequestFinished = true;
4111
4114
  sendEvent("complete", {
4112
- suggestionId: suggestion.id,
4113
- callId: suggestion.callId,
4114
- provider: suggestion.provider,
4115
- model: suggestion.model,
4116
- outputTokens: suggestion.outputTokens,
4117
- cacheHitPercent: suggestion.cacheHitPercent,
4118
- processDurationMs: suggestion.processDurationMs,
4119
- chapterVersion: suggestion.chapterVersion,
4120
- toolCalls: suggestion.toolCalls,
4121
- processSteps: suggestion.processSteps,
4122
- contextUsage: suggestion.contextUsage,
4115
+ callId: result.callId,
4116
+ provider: result.provider,
4117
+ model: result.model,
4118
+ outputTokens: result.outputTokens,
4119
+ cacheHitPercent: result.cacheHitPercent,
4120
+ processDurationMs: result.processDurationMs,
4121
+ toolCalls: result.toolCalls,
4122
+ processSteps: result.processSteps,
4123
+ contextUsage: result.contextUsage,
4123
4124
  conversationId,
4124
- conversationTitle: suggestion.conversationTitle,
4125
- ...(suggestion.action !== "note" ? { writingSuggestion: redactSuggestion(suggestion, permissions) } : {}),
4126
- messageId: typeof suggestion.conversationMessage === "object" && suggestion.conversationMessage !== null
4127
- ? suggestion.conversationMessage.id
4125
+ conversationTitle: result.conversationTitle,
4126
+ messageId: typeof result.conversationMessage === "object" && result.conversationMessage !== null
4127
+ ? result.conversationMessage.id
4128
4128
  : undefined,
4129
- messageCreatedAt: typeof suggestion.conversationMessage === "object" && suggestion.conversationMessage !== null
4130
- ? suggestion.conversationMessage.createdAt
4129
+ messageCreatedAt: typeof result.conversationMessage === "object" && result.conversationMessage !== null
4130
+ ? result.conversationMessage.createdAt
4131
4131
  : undefined
4132
4132
  });
4133
4133
  }
@@ -4183,15 +4183,6 @@ export function createRuntime(options) {
4183
4183
  const permissions = requestPermissions(request, String(suggestion.workId));
4184
4184
  data(response, redactContinuationGuard(await ai.runSuggestionGuard(request.params.suggestionId, input.content), permissions), 201);
4185
4185
  });
4186
- app.post("/api/suggestions/:suggestionId/accept", (request, response) => {
4187
- const input = parse(z.object({ content: z.string().max(2_000_000).optional() }), request.body ?? {});
4188
- const suggestion = ai.getSuggestion(request.params.suggestionId);
4189
- const permissions = requestPermissions(request, String(suggestion.workId));
4190
- if (!canWriteWorkModule(permissions, "prose")) {
4191
- throw new AppError(403, "WORK_MODULE_WRITE_DENIED", "你没有将 AI 建议写入正文的权限");
4192
- }
4193
- data(response, ai.acceptSuggestion(request.params.suggestionId, input.content));
4194
- });
4195
4186
  app.post("/api/suggestions/:suggestionId/reject", (request, response) => {
4196
4187
  const suggestion = ai.rejectSuggestion(request.params.suggestionId);
4197
4188
  const permissions = requestPermissions(request, String(suggestion.workId));