@kienmatu/inkos-studio 0.1.2 → 1.0.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/api/server.d.ts.map +1 -1
- package/dist/api/server.js +91 -9
- package/dist/api/server.js.map +1 -1
- package/dist/assets/{FilmWizard-CuCB-1xV.js → FilmWizard-CxoOJ7MQ.js} +1 -1
- package/dist/assets/{FlowView-rMLtzFZK.js → FlowView-Bt0EtmEr.js} +1 -1
- package/dist/assets/{_baseUniq-xbTfIKo7.js → _baseUniq-ZL9pmMqM.js} +1 -1
- package/dist/assets/{arc-BJ0Jn4qy.js → arc-B8qI0bEW.js} +1 -1
- package/dist/assets/{architectureDiagram-Q4EWVU46-B54hBS8X.js → architectureDiagram-Q4EWVU46-BMqx63uW.js} +1 -1
- package/dist/assets/{blockDiagram-DXYQGD6D-BrQpuNBu.js → blockDiagram-DXYQGD6D-CpTeW9T5.js} +1 -1
- package/dist/assets/{c4Diagram-AHTNJAMY-nN4kJiPC.js → c4Diagram-AHTNJAMY-DEMZhRny.js} +1 -1
- package/dist/assets/channel-DxRmlnS_.js +1 -0
- package/dist/assets/{chunk-4BX2VUAB-DnzQoX6p.js → chunk-4BX2VUAB-CATTVIYo.js} +1 -1
- package/dist/assets/{chunk-4TB4RGXK-PeEeEWP2.js → chunk-4TB4RGXK-BVSOdPwi.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-BZHFzH6I.js → chunk-55IACEB6-roBKSgqh.js} +1 -1
- package/dist/assets/{chunk-EDXVE4YY-B06PJNq-.js → chunk-EDXVE4YY-DcL-JJvQ.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-Cny1qCNu.js → chunk-FMBD7UC4-CTt3nqty.js} +1 -1
- package/dist/assets/{chunk-OYMX7WX6-MqHFCczv.js → chunk-OYMX7WX6-BKloZua_.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-Bu8oSEuV.js → chunk-QZHKN3VN-CksGJW6L.js} +1 -1
- package/dist/assets/{chunk-YZCP3GAM-DW9WLjg7.js → chunk-YZCP3GAM-DFUs85Mo.js} +1 -1
- package/dist/assets/classDiagram-6PBFFD2Q-Bkac267_.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-Bkac267_.js +1 -0
- package/dist/assets/clone-CmiP6enp.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-BFF3VF0W.js → cose-bilkent-S5V4N54A-BhjR9QKW.js} +1 -1
- package/dist/assets/{dagre-KV5264BT-7wO_SFt1.js → dagre-KV5264BT-S0WgqeWF.js} +1 -1
- package/dist/assets/{diagram-5BDNPKRD-DpdLNbTp.js → diagram-5BDNPKRD-iziIar_1.js} +1 -1
- package/dist/assets/{diagram-G4DWMVQ6-B2Xd9yJj.js → diagram-G4DWMVQ6-DGiQ4b3V.js} +1 -1
- package/dist/assets/{diagram-MMDJMWI5-BcJABwZb.js → diagram-MMDJMWI5-Ctfv9R4Z.js} +1 -1
- package/dist/assets/{diagram-TYMM5635-ByagqgDJ.js → diagram-TYMM5635-DpzPFDFI.js} +1 -1
- package/dist/assets/{erDiagram-SMLLAGMA-zfdClUWU.js → erDiagram-SMLLAGMA-e51DloYW.js} +1 -1
- package/dist/assets/{flowDiagram-DWJPFMVM-Cign1ovE.js → flowDiagram-DWJPFMVM-TyuMrie7.js} +1 -1
- package/dist/assets/{ganttDiagram-T4ZO3ILL-zHFblbgr.js → ganttDiagram-T4ZO3ILL-sewHvhyH.js} +1 -1
- package/dist/assets/{gitGraphDiagram-UUTBAWPF-DgUNvxqj.js → gitGraphDiagram-UUTBAWPF-DI7YNaAi.js} +1 -1
- package/dist/assets/{graph-CT_N4MvP.js → graph-iCANBjLp.js} +1 -1
- package/dist/assets/{highlighted-body-OFNGDK62-CbTQmRda.js → highlighted-body-OFNGDK62-DTkXdU8M.js} +1 -1
- package/dist/assets/{index-C5AvWGUU.js → index-3FC9cBAw.js} +272 -262
- package/dist/assets/index-8wiyHNEA.css +1 -0
- package/dist/assets/{infoDiagram-42DDH7IO-B1j6wnrX.js → infoDiagram-42DDH7IO-KcOGgxDZ.js} +1 -1
- package/dist/assets/{ishikawaDiagram-UXIWVN3A-CmTERA2Q.js → ishikawaDiagram-UXIWVN3A-DN46kos1.js} +1 -1
- package/dist/assets/{journeyDiagram-VCZTEJTY-lXMvtopT.js → journeyDiagram-VCZTEJTY-CSnW-uiU.js} +1 -1
- package/dist/assets/{kanban-definition-6JOO6SKY-D2nd3IRf.js → kanban-definition-6JOO6SKY-DgeKhYzm.js} +1 -1
- package/dist/assets/{layout-Dwdg17w2.js → layout-C3k8b-wj.js} +1 -1
- package/dist/assets/{linear-BGLXP-7J.js → linear-CSj-zsdP.js} +1 -1
- package/dist/assets/{min-CWmMAm2D.js → min-BkU8UOgQ.js} +1 -1
- package/dist/assets/{mindmap-definition-QFDTVHPH-Bc_KwUJk.js → mindmap-definition-QFDTVHPH-jaWIxQM2.js} +1 -1
- package/dist/assets/{pieDiagram-DEJITSTG-Dk4TEXCU.js → pieDiagram-DEJITSTG-DSCNVEy0.js} +1 -1
- package/dist/assets/{quadrantDiagram-34T5L4WZ-DjpGwBeJ.js → quadrantDiagram-34T5L4WZ-6Aki-Mea.js} +1 -1
- package/dist/assets/{requirementDiagram-MS252O5E-D-KTxT1S.js → requirementDiagram-MS252O5E-CIA-stPo.js} +1 -1
- package/dist/assets/{sankeyDiagram-XADWPNL6-CAAThfhf.js → sankeyDiagram-XADWPNL6-Dm92baLv.js} +1 -1
- package/dist/assets/{sequenceDiagram-FGHM5R23-EhYXipit.js → sequenceDiagram-FGHM5R23-CijKhpBV.js} +1 -1
- package/dist/assets/{stateDiagram-FHFEXIEX-DlwRa19l.js → stateDiagram-FHFEXIEX-BoRVlJdY.js} +1 -1
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-B2UHePPb.js +1 -0
- package/dist/assets/{timeline-definition-GMOUNBTQ-CnNt36mp.js → timeline-definition-GMOUNBTQ-Dgq0GzH4.js} +1 -1
- package/dist/assets/{value-BUuNnoEe.js → value-BU9Hdjc2.js} +1 -1
- package/dist/assets/{vennDiagram-DHZGUBPP-CONWdidS.js → vennDiagram-DHZGUBPP-DrIu0Q4b.js} +1 -1
- package/dist/assets/{wardley-RL74JXVD-Dx3T9_uF.js → wardley-RL74JXVD-BumycEok.js} +1 -1
- package/dist/assets/{wardleyDiagram-NUSXRM2D-Brxifhti.js → wardleyDiagram-NUSXRM2D-3fn4THet.js} +1 -1
- package/dist/assets/{xychartDiagram-5P7HB3ND-DkX9QW6S.js → xychartDiagram-5P7HB3ND-BMcrjrBB.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +2 -2
- package/dist/assets/channel-BMnRcRpv.js +0 -1
- package/dist/assets/classDiagram-6PBFFD2Q-BpMdbRYm.js +0 -1
- package/dist/assets/classDiagram-v2-HSJHXN6E-BpMdbRYm.js +0 -1
- package/dist/assets/clone-Bfx4_ecn.js +0 -1
- package/dist/assets/index-DaFEDFsq.css +0 -1
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-DWOlnZT2.js +0 -1
package/dist/api/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,OAAO,EAsHL,KAAK,aAAa,EAIlB,KAAK,aAAa,EAMnB,MAAM,sBAAsB,CAAC;AAkB9B,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAItE;AAGD,wBAAgB,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtF;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,OAAO,EAsHL,KAAK,aAAa,EAIlB,KAAK,aAAa,EAMnB,MAAM,sBAAsB,CAAC;AAkB9B,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAItE;AAGD,wBAAgB,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtF;AAk8ED,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE;IAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,aAAa,CAAA;CAAO,8EA6gI7I;AAID,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,IAAI,SAAO,EACX,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CA8Cf"}
|
package/dist/api/server.js
CHANGED
|
@@ -879,6 +879,7 @@ function toolResultText(result, lang = "vi") {
|
|
|
879
879
|
}
|
|
880
880
|
async function executeConfirmedProductionAction(args) {
|
|
881
881
|
const lang = args.language ?? "vi";
|
|
882
|
+
const uiLang = args.uiLanguage ?? lang;
|
|
882
883
|
const id = args.taskId;
|
|
883
884
|
const actionPayload = args.actionPayload;
|
|
884
885
|
const configuredSkills = await loadAvailableAgentSkills({ projectRoot: args.root });
|
|
@@ -950,7 +951,7 @@ async function executeConfirmedProductionAction(args) {
|
|
|
950
951
|
else if (args.requestedIntent === "generate_cover") {
|
|
951
952
|
const payload = actionPayload?.generateCover;
|
|
952
953
|
const title = requirePayloadText(payload?.title, pick(lang, "确认生成封面缺少标题,请重新生成确认卡。", "The cover generation confirmation is missing a title. Regenerate the confirmation card.", "Xác nhận tạo bìa sách thiếu tiêu đề. Vui lòng tạo lại thẻ xác nhận."));
|
|
953
|
-
tool = createGenerateCoverTool(args.root, { actionPayload });
|
|
954
|
+
tool = createGenerateCoverTool(args.root, { actionPayload, language: toWritingLanguage(lang) });
|
|
954
955
|
params = {
|
|
955
956
|
title,
|
|
956
957
|
...(payload?.intro ? { intro: payload.intro } : {}),
|
|
@@ -1204,10 +1205,10 @@ async function executeConfirmedProductionAction(args) {
|
|
|
1204
1205
|
id,
|
|
1205
1206
|
tool: tool.name,
|
|
1206
1207
|
agent,
|
|
1207
|
-
label: resolveToolLabel(tool.name, agent,
|
|
1208
|
+
label: resolveToolLabel(tool.name, agent, uiLang),
|
|
1208
1209
|
status: "running",
|
|
1209
1210
|
args: params,
|
|
1210
|
-
stages: agent ? pipelineStages(agent,
|
|
1211
|
+
stages: agent ? pipelineStages(agent, uiLang)?.map(label => ({ label, status: "pending" })) : undefined,
|
|
1211
1212
|
startedAt: Date.now(),
|
|
1212
1213
|
};
|
|
1213
1214
|
await args.onTaskChange(exec);
|
|
@@ -1266,6 +1267,62 @@ async function executeConfirmedProductionAction(args) {
|
|
|
1266
1267
|
throw new ConfirmedActionExecutionError(message, exec, error);
|
|
1267
1268
|
}
|
|
1268
1269
|
}
|
|
1270
|
+
function parseCompleteShortRunIndex(value, expectedStoryId) {
|
|
1271
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
1272
|
+
return null;
|
|
1273
|
+
const record = value;
|
|
1274
|
+
if (record.version !== 1
|
|
1275
|
+
|| record.kind !== "short-fiction"
|
|
1276
|
+
|| record.id !== expectedStoryId
|
|
1277
|
+
|| record.status !== "complete"
|
|
1278
|
+
|| typeof record.updatedAt !== "string") {
|
|
1279
|
+
return null;
|
|
1280
|
+
}
|
|
1281
|
+
return { storyId: expectedStoryId, updatedAt: record.updatedAt };
|
|
1282
|
+
}
|
|
1283
|
+
function parseShortStoryTitle(value) {
|
|
1284
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
1285
|
+
return null;
|
|
1286
|
+
const storyTitle = value.storyTitle;
|
|
1287
|
+
return typeof storyTitle === "string" && storyTitle.trim() ? storyTitle.trim() : null;
|
|
1288
|
+
}
|
|
1289
|
+
async function loadStudioShortList(root) {
|
|
1290
|
+
const shortsDir = join(root, "shorts");
|
|
1291
|
+
let storyIds = [];
|
|
1292
|
+
try {
|
|
1293
|
+
const entries = await readdir(shortsDir, { withFileTypes: true });
|
|
1294
|
+
storyIds = entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
|
|
1295
|
+
}
|
|
1296
|
+
catch (error) {
|
|
1297
|
+
if (error.code !== "ENOENT")
|
|
1298
|
+
throw error;
|
|
1299
|
+
}
|
|
1300
|
+
const shorts = [];
|
|
1301
|
+
for (const storyId of storyIds) {
|
|
1302
|
+
if (!isSafeBookId(storyId))
|
|
1303
|
+
continue;
|
|
1304
|
+
const shortDir = join(shortsDir, storyId);
|
|
1305
|
+
try {
|
|
1306
|
+
const status = JSON.parse(await readFile(join(shortDir, "status.json"), "utf-8"));
|
|
1307
|
+
const run = parseCompleteShortRunIndex(status, storyId);
|
|
1308
|
+
if (!run)
|
|
1309
|
+
continue;
|
|
1310
|
+
const story = JSON.parse(await readFile(join(shortDir, "final", "short-story.json"), "utf-8"));
|
|
1311
|
+
const title = parseShortStoryTitle(story) ?? storyId;
|
|
1312
|
+
await access(join(shortDir, "final", "full.md"));
|
|
1313
|
+
shorts.push({
|
|
1314
|
+
storyId,
|
|
1315
|
+
title,
|
|
1316
|
+
finalMarkdownPath: toPosixPath(join("shorts", storyId, "final", "full.md")),
|
|
1317
|
+
updatedAt: run.updatedAt,
|
|
1318
|
+
});
|
|
1319
|
+
}
|
|
1320
|
+
catch {
|
|
1321
|
+
// A malformed or incomplete directory is not a completed short work.
|
|
1322
|
+
}
|
|
1323
|
+
}
|
|
1324
|
+
return shorts;
|
|
1325
|
+
}
|
|
1269
1326
|
const subscribers = new Set();
|
|
1270
1327
|
const bookCreateStatus = new Map();
|
|
1271
1328
|
// 内存缓存:service -> 模型列表 + 更新时间戳;避免每次 sidebar 挂载时都打真实 LLM /models
|
|
@@ -2174,6 +2231,9 @@ export function createStudioServer(initialConfig, root, overrides = {}) {
|
|
|
2174
2231
|
}
|
|
2175
2232
|
: sseSink;
|
|
2176
2233
|
const logger = createLogger({ tag: "studio", sinks: [scopedSseSink, consoleSink] });
|
|
2234
|
+
// Progress lines are read by the person watching Studio, so they follow the
|
|
2235
|
+
// UI language rather than the book's writing language.
|
|
2236
|
+
const logLanguage = await currentProjectLanguage();
|
|
2177
2237
|
return {
|
|
2178
2238
|
client: overrides?.client ?? createLLMClient(currentConfig.llm),
|
|
2179
2239
|
model: overrides?.model ?? currentConfig.llm.model,
|
|
@@ -2186,6 +2246,7 @@ export function createStudioServer(initialConfig, root, overrides = {}) {
|
|
|
2186
2246
|
modelOverrides: currentConfig.modelOverrides,
|
|
2187
2247
|
notifyChannels: currentConfig.notify,
|
|
2188
2248
|
logger,
|
|
2249
|
+
logLanguage,
|
|
2189
2250
|
onContextCompression: (event) => {
|
|
2190
2251
|
broadcast("context:compression", {
|
|
2191
2252
|
...(overrides?.sessionIdForSSE ? { sessionId: overrides.sessionIdForSSE } : {}),
|
|
@@ -3189,13 +3250,29 @@ export function createStudioServer(initialConfig, root, overrides = {}) {
|
|
|
3189
3250
|
id: `custom:${s.name ?? "Custom"}`,
|
|
3190
3251
|
baseUrl: s.baseUrl ?? "",
|
|
3191
3252
|
label: s.name ?? "Custom",
|
|
3253
|
+
configuredModels: s.models ?? [],
|
|
3192
3254
|
}))
|
|
3193
|
-
.filter((s) =>
|
|
3194
|
-
|
|
3195
|
-
|
|
3196
|
-
|
|
3197
|
-
|
|
3198
|
-
|
|
3255
|
+
.filter((s) => {
|
|
3256
|
+
if (!s.baseUrl)
|
|
3257
|
+
return false;
|
|
3258
|
+
if (secrets.services[s.id]?.apiKey)
|
|
3259
|
+
return true;
|
|
3260
|
+
// Local/self-hosted endpoints are usable without a key.
|
|
3261
|
+
return isApiKeyOptionalForEndpoint({
|
|
3262
|
+
provider: resolveServiceProviderFamily("custom") ?? "openai",
|
|
3263
|
+
baseUrl: s.baseUrl,
|
|
3264
|
+
});
|
|
3265
|
+
});
|
|
3266
|
+
const groups = await Promise.all(customs.map(async (s) => {
|
|
3267
|
+
const probed = filterTextChatModels(await probeModelsFromUpstream(s.baseUrl, secrets.services[s.id]?.apiKey ?? "", 10_000));
|
|
3268
|
+
// The probe swallows every failure (timeout, offline upstream, bad
|
|
3269
|
+
// gateway) and returns []. Without the configured ids as a fallback a
|
|
3270
|
+
// single slow reload empties the model picker, so the UI drops back to
|
|
3271
|
+
// "set up models" even though the service is configured.
|
|
3272
|
+
const models = mergeServiceModelIds(probed.map((model) => model.id), s.configuredModels)
|
|
3273
|
+
.map((id) => probed.find((model) => model.id.toLowerCase() === id.toLowerCase()) ?? { id, name: id });
|
|
3274
|
+
return { service: s.id, label: s.label, models };
|
|
3275
|
+
}));
|
|
3199
3276
|
return c.json({ groups });
|
|
3200
3277
|
});
|
|
3201
3278
|
app.get("/api/v1/services/:service/models", async (c) => {
|
|
@@ -4025,6 +4102,7 @@ export function createStudioServer(initialConfig, root, overrides = {}) {
|
|
|
4025
4102
|
requestedSkills,
|
|
4026
4103
|
disabledSkills,
|
|
4027
4104
|
language: surfaceLanguage,
|
|
4105
|
+
uiLanguage: language,
|
|
4028
4106
|
taskId,
|
|
4029
4107
|
sourceRequestId,
|
|
4030
4108
|
signal: taskController.signal,
|
|
@@ -5313,6 +5391,10 @@ export function createStudioServer(initialConfig, root, overrides = {}) {
|
|
|
5313
5391
|
films.sort((a, b) => a.title.localeCompare(b.title, "zh"));
|
|
5314
5392
|
return c.json({ films });
|
|
5315
5393
|
});
|
|
5394
|
+
app.get("/api/v1/shorts", async (c) => {
|
|
5395
|
+
const shorts = await loadStudioShortList(root);
|
|
5396
|
+
return c.json({ shorts });
|
|
5397
|
+
});
|
|
5316
5398
|
app.get("/api/v1/translations", async (c) => {
|
|
5317
5399
|
const translationsDir = join(root, "translations");
|
|
5318
5400
|
let entries = [];
|