@actalk/inkos-studio 1.3.7 → 1.3.8

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.
Files changed (60) hide show
  1. package/dist/api/server.d.ts.map +1 -1
  2. package/dist/api/server.js +24 -13
  3. package/dist/api/server.js.map +1 -1
  4. package/dist/assets/{_baseUniq-DObXPjDJ.js → _baseUniq-C9Y1-hO5.js} +1 -1
  5. package/dist/assets/{arc-BdlZFnEp.js → arc-BRZyzuQA.js} +1 -1
  6. package/dist/assets/{architectureDiagram-Q4EWVU46-DWIamVb1.js → architectureDiagram-Q4EWVU46-DjfNd-Bm.js} +1 -1
  7. package/dist/assets/{blockDiagram-DXYQGD6D-B15h8JDl.js → blockDiagram-DXYQGD6D-BPUhG5Pi.js} +1 -1
  8. package/dist/assets/{c4Diagram-AHTNJAMY-CLWyVUi5.js → c4Diagram-AHTNJAMY-_tBGcXBa.js} +1 -1
  9. package/dist/assets/channel-CKcWmxVn.js +1 -0
  10. package/dist/assets/{chunk-4BX2VUAB-CoreBbcY.js → chunk-4BX2VUAB-BiqlhI-C.js} +1 -1
  11. package/dist/assets/{chunk-4TB4RGXK-hpWBtrjE.js → chunk-4TB4RGXK-CpYM-rO3.js} +1 -1
  12. package/dist/assets/{chunk-55IACEB6-CAWFhQRP.js → chunk-55IACEB6-DwgOALxJ.js} +1 -1
  13. package/dist/assets/{chunk-EDXVE4YY-3BFURqnV.js → chunk-EDXVE4YY-CX3dlP_l.js} +1 -1
  14. package/dist/assets/{chunk-FMBD7UC4-VbVgWRBP.js → chunk-FMBD7UC4-C8YFZKmg.js} +1 -1
  15. package/dist/assets/{chunk-OYMX7WX6-P0Kgp9FK.js → chunk-OYMX7WX6-j7_AAktP.js} +1 -1
  16. package/dist/assets/{chunk-QZHKN3VN-C4tZsUim.js → chunk-QZHKN3VN-Vo9weHaU.js} +1 -1
  17. package/dist/assets/{chunk-YZCP3GAM-DGxN4WQV.js → chunk-YZCP3GAM-3YkEYHpK.js} +1 -1
  18. package/dist/assets/classDiagram-6PBFFD2Q-CiyWFxFc.js +1 -0
  19. package/dist/assets/classDiagram-v2-HSJHXN6E-CiyWFxFc.js +1 -0
  20. package/dist/assets/clone-BZHRzjdi.js +1 -0
  21. package/dist/assets/{cose-bilkent-S5V4N54A-uWd9Sg8T.js → cose-bilkent-S5V4N54A-DHN7hc-n.js} +1 -1
  22. package/dist/assets/{dagre-KV5264BT-Bpno7Sui.js → dagre-KV5264BT-BJc8-9vX.js} +1 -1
  23. package/dist/assets/{diagram-5BDNPKRD-uXKJXOTX.js → diagram-5BDNPKRD-LBNFe2C7.js} +1 -1
  24. package/dist/assets/{diagram-G4DWMVQ6-CWAx_MrF.js → diagram-G4DWMVQ6-Bjg4V5BY.js} +1 -1
  25. package/dist/assets/{diagram-MMDJMWI5-C-apgI2M.js → diagram-MMDJMWI5-D900HokL.js} +1 -1
  26. package/dist/assets/{diagram-TYMM5635-oE6H2pqq.js → diagram-TYMM5635-D7SwKLL5.js} +1 -1
  27. package/dist/assets/{erDiagram-SMLLAGMA-BfgDxyIM.js → erDiagram-SMLLAGMA-5sBqfYg6.js} +1 -1
  28. package/dist/assets/{flowDiagram-DWJPFMVM-BLkrIcA5.js → flowDiagram-DWJPFMVM-BMf7yxYw.js} +1 -1
  29. package/dist/assets/{ganttDiagram-T4ZO3ILL-Cgyf68mR.js → ganttDiagram-T4ZO3ILL-CTCXaq4s.js} +1 -1
  30. package/dist/assets/{gitGraphDiagram-UUTBAWPF-dXvSLru9.js → gitGraphDiagram-UUTBAWPF-CWInQLKk.js} +1 -1
  31. package/dist/assets/{graph-ClhNJ_no.js → graph-DwUZOIST.js} +1 -1
  32. package/dist/assets/{highlighted-body-OFNGDK62-CAGQz_wQ.js → highlighted-body-OFNGDK62-BSwDZbkV.js} +1 -1
  33. package/dist/assets/{index-CGOCC7tt.js → index-DZiAZ3ZR.js} +215 -215
  34. package/dist/assets/{infoDiagram-42DDH7IO-CoU2GA9H.js → infoDiagram-42DDH7IO-sN2TrdG3.js} +1 -1
  35. package/dist/assets/{ishikawaDiagram-UXIWVN3A-CNYIiSHo.js → ishikawaDiagram-UXIWVN3A-COUwPi4O.js} +1 -1
  36. package/dist/assets/{journeyDiagram-VCZTEJTY-BIOf8Fr8.js → journeyDiagram-VCZTEJTY-Dae0U8tM.js} +1 -1
  37. package/dist/assets/{kanban-definition-6JOO6SKY-DoKVT16A.js → kanban-definition-6JOO6SKY-DdXwUHK8.js} +1 -1
  38. package/dist/assets/{layout-BP7JvoUj.js → layout-4qR_Jz0Y.js} +1 -1
  39. package/dist/assets/{linear-BaHWv3Cv.js → linear-BWT9oXlV.js} +1 -1
  40. package/dist/assets/{min-B323zLjI.js → min-fjIdbAVp.js} +1 -1
  41. package/dist/assets/{mindmap-definition-QFDTVHPH-831I92Ss.js → mindmap-definition-QFDTVHPH-BT4gPcAu.js} +1 -1
  42. package/dist/assets/{pieDiagram-DEJITSTG-lzn2BmD0.js → pieDiagram-DEJITSTG-ZxucsY3r.js} +1 -1
  43. package/dist/assets/{quadrantDiagram-34T5L4WZ-CUKMogxF.js → quadrantDiagram-34T5L4WZ-CU0sFVVH.js} +1 -1
  44. package/dist/assets/{requirementDiagram-MS252O5E-BhrbxNGm.js → requirementDiagram-MS252O5E-C5V4O9K7.js} +1 -1
  45. package/dist/assets/{sankeyDiagram-XADWPNL6-eCYinXw3.js → sankeyDiagram-XADWPNL6-B-5NWsl3.js} +1 -1
  46. package/dist/assets/{sequenceDiagram-FGHM5R23-BhykTJJs.js → sequenceDiagram-FGHM5R23-Cd_5KZe-.js} +1 -1
  47. package/dist/assets/{stateDiagram-FHFEXIEX-BeJDpoIy.js → stateDiagram-FHFEXIEX-C9zWS2i5.js} +1 -1
  48. package/dist/assets/stateDiagram-v2-QKLJ7IA2-X_Scctdf.js +1 -0
  49. package/dist/assets/{timeline-definition-GMOUNBTQ-C-Z1gWQE.js → timeline-definition-GMOUNBTQ-DVnXsIGm.js} +1 -1
  50. package/dist/assets/{vennDiagram-DHZGUBPP-CN_umDEu.js → vennDiagram-DHZGUBPP-B3pdZFAM.js} +1 -1
  51. package/dist/assets/{wardley-RL74JXVD-BlJ0F_eo.js → wardley-RL74JXVD-B5AYoUfP.js} +1 -1
  52. package/dist/assets/{wardleyDiagram-NUSXRM2D-7eU2x8b0.js → wardleyDiagram-NUSXRM2D-DeSgssK0.js} +1 -1
  53. package/dist/assets/{xychartDiagram-5P7HB3ND-BVz98NOl.js → xychartDiagram-5P7HB3ND-BW4TgRPp.js} +1 -1
  54. package/dist/index.html +1 -1
  55. package/package.json +2 -2
  56. package/dist/assets/channel-CnRwuGVB.js +0 -1
  57. package/dist/assets/classDiagram-6PBFFD2Q-C2Hsd0Kb.js +0 -1
  58. package/dist/assets/classDiagram-v2-HSJHXN6E-C2Hsd0Kb.js +0 -1
  59. package/dist/assets/clone-ULoi9D6A.js +0 -1
  60. package/dist/assets/stateDiagram-v2-QKLJ7IA2-C4HmXN_E.js +0 -1
@@ -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;AAI5B,OAAO,EAoCL,KAAK,aAAa,EAGnB,MAAM,oBAAoB,CAAC;AA0sB5B,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,8EAyqE5E;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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,EAqCL,KAAK,aAAa,EAGnB,MAAM,oBAAoB,CAAC;AA2sB5B,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,8EAmrE5E;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"}
@@ -2,7 +2,7 @@ import { Hono } from "hono";
2
2
  import { cors } from "hono/cors";
3
3
  import { streamSSE } from "hono/streaming";
4
4
  import { serve } from "@hono/node-server";
5
- import { StateManager, PipelineRunner, createLLMClient, createLogger, createInteractionToolsFromDeps, computeAnalytics, loadProjectConfig, loadProjectSession, processProjectInteractionRequest, resolveSessionActiveBook, listBookSessions, loadBookSession, appendManualSessionMessages, createAndPersistBookSession, renameBookSession, deleteBookSession, migrateBookSession, SessionAlreadyMigratedError, runAgentSession, buildAgentSystemPrompt, resolveServicePreset, resolveServiceProviderFamily, resolveServiceModelsBaseUrl, resolveServiceModel, loadSecrets, saveSecrets, listModelsForService, getAllEndpoints, probeModelsFromUpstream, fetchWithProxy, chatCompletion, buildExportArtifact, GLOBAL_ENV_PATH, } from "@actalk/inkos-core";
5
+ import { StateManager, PipelineRunner, createLLMClient, createLogger, createInteractionToolsFromDeps, computeAnalytics, loadProjectConfig, loadProjectSession, processProjectInteractionRequest, resolveSessionActiveBook, listBookSessions, loadBookSession, appendManualSessionMessages, createAndPersistBookSession, renameBookSession, deleteBookSession, migrateBookSession, SessionAlreadyMigratedError, runAgentSession, buildAgentSystemPrompt, resolveServicePreset, resolveServiceProviderFamily, resolveServiceModelsBaseUrl, resolveServiceModel, loadSecrets, saveSecrets, listModelsForService, isApiKeyOptionalForEndpoint, getAllEndpoints, probeModelsFromUpstream, fetchWithProxy, chatCompletion, buildExportArtifact, GLOBAL_ENV_PATH, } from "@actalk/inkos-core";
6
6
  import { access, readFile, readdir, writeFile } from "node:fs/promises";
7
7
  import { isAbsolute, join, relative, resolve } from "node:path";
8
8
  import { isSafeBookId } from "./safety.js";
@@ -407,7 +407,7 @@ function formatServiceProbeError(args) {
407
407
  upstreamDetail ? `\n上游返回:${upstreamDetail}` : "",
408
408
  ].filter(Boolean).join("\n");
409
409
  }
410
- if (args.service === "moonshot" || args.service === "kimiCodingPlan") {
410
+ if (args.service === "moonshot" || args.service === "kimiCodingPlan" || args.service === "kimicode") {
411
411
  return [
412
412
  `${args.label ?? args.service} 测试连接失败。`,
413
413
  context,
@@ -482,7 +482,8 @@ async function probeServiceCapabilities(args) {
482
482
  const serviceFirstModel = endpoint?.checkModel
483
483
  ?? preset?.knownModels?.[0]
484
484
  ?? endpoint?.models.find((model) => model.enabled !== false)?.id;
485
- const useEndpointCheckModel = !isCustomServiceId(args.service) && Boolean(endpoint?.checkModel);
485
+ const useDynamicLocalModels = baseService === "ollama";
486
+ const useEndpointCheckModel = !useDynamicLocalModels && !isCustomServiceId(args.service) && Boolean(endpoint?.checkModel);
486
487
  const configService = typeof llm.service === "string" ? llm.service : undefined;
487
488
  const configModel = !useEndpointCheckModel && configService === args.service
488
489
  ? typeof llm.defaultModel === "string"
@@ -493,7 +494,7 @@ async function probeServiceCapabilities(args) {
493
494
  : undefined;
494
495
  const useCustomFallbacks = isCustomServiceId(args.service);
495
496
  const modelCandidates = buildModelCandidates({
496
- preferredModel: args.preferredModel ?? serviceFirstModel,
497
+ preferredModel: args.preferredModel ?? (useDynamicLocalModels ? discoveredModels[0]?.id ?? serviceFirstModel : serviceFirstModel),
497
498
  configModel,
498
499
  envModel: useCustomFallbacks ? envModel : undefined,
499
500
  discoveredModels: useEndpointCheckModel ? [] : discoveredModels,
@@ -1033,19 +1034,24 @@ export function createStudioServer(initialConfig, root) {
1033
1034
  app.post("/api/v1/services/:service/test", async (c) => {
1034
1035
  const service = c.req.param("service");
1035
1036
  const { apiKey, baseUrl, apiFormat, stream } = await c.req.json();
1036
- if (!apiKey?.trim()) {
1037
- return c.json({ ok: false, error: "API Key 不能为空" }, 400);
1038
- }
1039
1037
  const resolvedBaseUrl = await resolveConfiguredServiceBaseUrl(root, service, baseUrl);
1040
1038
  if (!resolvedBaseUrl) {
1041
1039
  return c.json({ ok: false, error: `未知服务商: ${service}` }, 400);
1042
1040
  }
1041
+ const baseService = isCustomServiceId(service) ? "custom" : service;
1042
+ const apiKeyOptional = isApiKeyOptionalForEndpoint({
1043
+ provider: resolveServiceProviderFamily(baseService) ?? "openai",
1044
+ baseUrl: resolvedBaseUrl,
1045
+ });
1046
+ if (!apiKey?.trim() && !apiKeyOptional) {
1047
+ return c.json({ ok: false, error: "API Key 不能为空" }, 400);
1048
+ }
1043
1049
  const rawConfig = await loadRawConfig(root).catch(() => ({}));
1044
1050
  const llm = rawConfig.llm ?? {};
1045
1051
  const probe = await probeServiceCapabilities({
1046
1052
  root,
1047
1053
  service,
1048
- apiKey: apiKey.trim(),
1054
+ apiKey: apiKey?.trim() ?? "",
1049
1055
  baseUrl: resolvedBaseUrl,
1050
1056
  preferredApiFormat: apiFormat,
1051
1057
  preferredStream: stream,
@@ -1149,10 +1155,15 @@ export function createStudioServer(initialConfig, root) {
1149
1155
  const refresh = c.req.query("refresh") === "1";
1150
1156
  const secrets = await loadSecrets(root);
1151
1157
  const apiKey = c.req.query("apiKey") || secrets.services[service]?.apiKey || "";
1152
- // No key = no models
1153
- if (!apiKey)
1154
- return c.json({ models: [] });
1155
1158
  const resolvedBaseUrl = await resolveConfiguredServiceBaseUrl(root, service);
1159
+ const baseService = isCustomServiceId(service) ? "custom" : service;
1160
+ const apiKeyOptional = isApiKeyOptionalForEndpoint({
1161
+ provider: resolveServiceProviderFamily(baseService) ?? "openai",
1162
+ baseUrl: resolvedBaseUrl,
1163
+ });
1164
+ // No key = no models, except local/self-hosted endpoints such as Ollama.
1165
+ if (!apiKey && !apiKeyOptional)
1166
+ return c.json({ models: [] });
1156
1167
  // Cache by service + resolved baseUrl + apiKey fingerprint; valid for 10 min unless ?refresh=1
1157
1168
  const cacheKey = `${service}::${resolvedBaseUrl ?? ""}::${apiKey.slice(-8)}`;
1158
1169
  if (!refresh) {
@@ -1518,12 +1529,12 @@ export function createStudioServer(initialConfig, root) {
1518
1529
  // Create pipeline with resolved model (so sub_agent tools use the frontend-selected model)
1519
1530
  // Don't spread config.llm — its baseUrl/provider belong to the old service.
1520
1531
  // Let createLLMClient resolve baseUrl from the service preset.
1521
- const pipelineClient = (reqService && reqModel && resolvedApiKey)
1532
+ const pipelineClient = (reqService && reqModel && resolvedModel)
1522
1533
  ? createLLMClient({
1523
1534
  ...config.llm,
1524
1535
  service: configuredEntry?.service ?? reqService,
1525
1536
  model: reqModel,
1526
- apiKey: resolvedApiKey,
1537
+ apiKey: resolvedApiKey ?? "",
1527
1538
  ...(configuredEntry?.apiFormat ? { apiFormat: configuredEntry.apiFormat } : {}),
1528
1539
  ...(configuredEntry?.stream !== undefined ? { stream: configuredEntry.stream } : {}),
1529
1540
  baseUrl: configuredEntry?.baseUrl ?? "",