@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/ai.js +11 -89
- package/dist/ai.js.map +1 -1
- package/dist/app.js +33 -42
- package/dist/app.js.map +1 -1
- package/dist/public/ai-context-meter.js +45 -4
- package/dist/public/ai-render-scheduler.js +30 -0
- package/dist/public/app.js +284 -194
- package/dist/public/index.html +6 -4
- package/dist/public/markdown.js +22 -10
- package/dist/public/stream-markdown.js +107 -0
- package/dist/public/stream-typewriter.d.ts +1 -0
- package/dist/public/stream-typewriter.js +33 -19
- package/dist/public/styles.css +28 -38
- package/dist/skills/continue-writing/SKILL.md +2 -2
- package/dist/skills/polish-writing/SKILL.md +2 -2
- package/dist/user-auth.js +0 -3
- package/dist/user-auth.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
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
|
-
|
|
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
|
|
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
|
|
4105
|
-
? String(
|
|
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
|
-
|
|
4113
|
-
|
|
4114
|
-
|
|
4115
|
-
|
|
4116
|
-
|
|
4117
|
-
|
|
4118
|
-
|
|
4119
|
-
|
|
4120
|
-
|
|
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:
|
|
4125
|
-
|
|
4126
|
-
|
|
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
|
|
4130
|
-
?
|
|
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));
|