@qnote/q-ai-note 1.0.3 → 1.0.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"aiClient.d.ts","sourceRoot":"","sources":["../../src/server/aiClient.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACzC;AAsBD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgFxG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE"}
1
+ {"version":3,"file":"aiClient.d.ts","sourceRoot":"","sources":["../../src/server/aiClient.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACzC;AA+BD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiFxG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE"}
@@ -2,12 +2,18 @@ import { getAllSettings } from './config.js';
2
2
  function getAiSettings() {
3
3
  const settings = getAllSettings();
4
4
  const normalizedKey = String(settings.api_key || '').trim().replace(/^Bearer\s+/i, '');
5
+ const headers = settings.headers && typeof settings.headers === 'object' && !Array.isArray(settings.headers)
6
+ ? Object.fromEntries(Object.entries(settings.headers)
7
+ .map(([k, v]) => [String(k || '').trim(), String(v ?? '').trim()])
8
+ .filter(([k, v]) => k && v))
9
+ : {};
5
10
  return {
6
11
  api_url: settings.api_url || 'https://api.minimax.com/v1',
7
12
  api_key: normalizedKey,
8
13
  model: settings.model || 'M2-her',
9
14
  group_id: settings.group_id,
10
15
  proxy: settings.proxy,
16
+ headers,
11
17
  };
12
18
  }
13
19
  export async function callAiMessages(messages, options = {}) {
@@ -45,6 +51,7 @@ export async function callAiMessages(messages, options = {}) {
45
51
  const fetchOptions = {
46
52
  method: 'POST',
47
53
  headers: {
54
+ ...settings.headers,
48
55
  'Content-Type': 'application/json',
49
56
  Authorization: `Bearer ${settings.api_key}`,
50
57
  },
@@ -1 +1 @@
1
- {"version":3,"file":"aiClient.js","sourceRoot":"","sources":["../../src/server/aiClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aiClient.js","sourceRoot":"","sources":["../../src/server/aiClient.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/server/api/settings.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA0CxB,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/server/api/settings.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAyDxB,eAAe,MAAM,CAAC"}
@@ -1,13 +1,22 @@
1
1
  import { Router } from 'express';
2
2
  import { setSetting, getAllSettings } from '../config.js';
3
3
  const router = Router();
4
- const ALLOWED_SETTING_KEYS = new Set(['api_url', 'api_key', 'model', 'group_id', 'proxy']);
4
+ const ALLOWED_SETTING_KEYS = new Set(['api_url', 'api_key', 'model', 'group_id', 'proxy', 'headers']);
5
+ function normalizeHeadersInput(value) {
6
+ if (!value || typeof value !== 'object' || Array.isArray(value))
7
+ return {};
8
+ const normalizedEntries = Object.entries(value)
9
+ .map(([k, v]) => [String(k || '').trim(), String(v ?? '').trim()])
10
+ .filter(([k, v]) => k && v);
11
+ return Object.fromEntries(normalizedEntries);
12
+ }
5
13
  router.get('/', (_req, res) => {
6
14
  try {
7
15
  const settings = getAllSettings();
8
16
  const sanitizedSettings = {
9
17
  ...settings,
10
18
  has_api_key: Boolean(settings.api_key),
19
+ headers: normalizeHeadersInput(settings.headers),
11
20
  };
12
21
  delete sanitizedSettings.api_key;
13
22
  const response = { success: true, data: sanitizedSettings };
@@ -30,6 +39,12 @@ router.put('/:key', (req, res) => {
30
39
  const response = { success: false, error: 'Value is required' };
31
40
  return res.status(400).json(response);
32
41
  }
42
+ if (key === 'headers') {
43
+ const normalizedHeaders = normalizeHeadersInput(value);
44
+ setSetting('headers', normalizedHeaders);
45
+ const response = { success: true, data: { key, value: normalizedHeaders } };
46
+ return res.json(response);
47
+ }
33
48
  const normalizedValue = String(value);
34
49
  setSetting(key, normalizedValue);
35
50
  const safeValue = key === 'api_key' ? '***' : normalizedValue;
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/server/api/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG1D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AACxB,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3F,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IAC5B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,EAAwC,CAAC;QACxE,MAAM,iBAAiB,GAAqC;YAC1D,GAAG,QAAQ;YACX,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;SACvC,CAAC;QACF,OAAO,iBAAiB,CAAC,OAAO,CAAC;QACjC,MAAM,QAAQ,GAAkD,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;QAC3G,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC3B,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,GAAG,EAAE,EAAE,CAAC;YAC3F,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;YAC7E,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,UAAU,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9D,MAAM,QAAQ,GAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC;QACjF,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/server/api/settings.ts"],"names":[],"mappings":"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"}
@@ -4,11 +4,12 @@ interface Config {
4
4
  model?: string;
5
5
  group_id?: string;
6
6
  proxy?: string;
7
+ headers?: Record<string, string>;
7
8
  }
8
9
  export declare function getResolvedConfigDir(): string;
9
10
  export declare function getResolvedConfigPath(): string;
10
- export declare function getSetting(key: string): string | undefined;
11
- export declare function setSetting(key: string, value: string): void;
11
+ export declare function getSetting(key: string): string | Record<string, string> | undefined;
12
+ export declare function setSetting(key: string, value: string | Record<string, string>): void;
12
13
  export declare function getAllSettings(): Config;
13
14
  export {};
14
15
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAIA,UAAU,MAAM;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoBD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAsBD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG1D;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAIpD;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAIA,UAAU,MAAM;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAoBD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAsBD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAGnF;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAQ7E;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -47,7 +47,12 @@ export function getSetting(key) {
47
47
  }
48
48
  export function setSetting(key, value) {
49
49
  const config = readConfig();
50
- config[key] = value;
50
+ if (key === 'headers') {
51
+ config.headers = value && typeof value === 'object' ? { ...value } : {};
52
+ }
53
+ else {
54
+ config[key] = value;
55
+ }
51
56
  writeConfig(config);
52
57
  }
53
58
  export function getAllSettings() {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAUpB,SAAS,eAAe;IACtB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC;IACxG,OAAO,eAAe,IAAI,eAAe,CAAC,IAAI,EAAE;QAC9C,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAY,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,UAAU;IACjB,eAAe,EAAE,CAAC;IAClB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,eAAe,EAAE,CAAC;IAClB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,GAAmB,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,KAAa;IACnD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC3B,MAAc,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC7B,WAAW,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAWpB,SAAS,eAAe;IACtB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC;IACxG,OAAO,eAAe,IAAI,eAAe,CAAC,IAAI,EAAE;QAC9C,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAY,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,UAAU;IACjB,eAAe,EAAE,CAAC;IAClB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,eAAe,EAAE,CAAC;IAClB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,GAAmB,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,KAAsC;IAC5E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;SAAM,CAAC;QACL,MAAkC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnD,CAAC;IACD,WAAW,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC"}
package/dist/web/app.js CHANGED
@@ -1196,6 +1196,49 @@ async function loadSettings() {
1196
1196
  apiKeyInput.value = '';
1197
1197
  apiKeyInput.placeholder = state.settings.has_api_key ? '已配置,留空表示不修改' : 'sk-...';
1198
1198
  document.getElementById('setting-model').value = state.settings.model || '';
1199
+ renderSettingHeadersRows(state.settings.headers || {});
1200
+ }
1201
+
1202
+ function createSettingHeaderRow(key = '', value = '') {
1203
+ const row = document.createElement('div');
1204
+ row.className = 'settings-kv-row';
1205
+ row.innerHTML = `
1206
+ <input type="text" class="setting-header-key" placeholder="Header 名称" value="${escapeHtml(String(key || ''))}">
1207
+ <input type="text" class="setting-header-value" placeholder="Header 值" value="${escapeHtml(String(value || ''))}">
1208
+ <button class="btn btn-secondary btn-sm remove-setting-header-btn" type="button">删除</button>
1209
+ `;
1210
+ row.querySelector('.remove-setting-header-btn')?.addEventListener('click', () => {
1211
+ row.remove();
1212
+ });
1213
+ return row;
1214
+ }
1215
+
1216
+ function renderSettingHeadersRows(headers) {
1217
+ const list = document.getElementById('setting-headers-list');
1218
+ if (!(list instanceof HTMLElement)) return;
1219
+ list.innerHTML = '';
1220
+ const entries = Object.entries(headers || {}).filter(([k, v]) => String(k || '').trim() && String(v || '').trim());
1221
+ if (!entries.length) {
1222
+ list.appendChild(createSettingHeaderRow('', ''));
1223
+ return;
1224
+ }
1225
+ entries.forEach(([k, v]) => list.appendChild(createSettingHeaderRow(String(k), String(v))));
1226
+ }
1227
+
1228
+ function collectSettingHeadersFromUI() {
1229
+ const list = document.getElementById('setting-headers-list');
1230
+ if (!(list instanceof HTMLElement)) return {};
1231
+ const rows = Array.from(list.querySelectorAll('.settings-kv-row'));
1232
+ const headers = {};
1233
+ rows.forEach((row) => {
1234
+ const keyInput = row.querySelector('.setting-header-key');
1235
+ const valueInput = row.querySelector('.setting-header-value');
1236
+ const key = String(keyInput?.value || '').trim();
1237
+ const value = String(valueInput?.value || '').trim();
1238
+ if (!key || !value) return;
1239
+ headers[key] = value;
1240
+ });
1241
+ return headers;
1199
1242
  }
1200
1243
 
1201
1244
  async function loadChats() {
@@ -1667,6 +1710,7 @@ function initApp() {
1667
1710
  const api_url = document.getElementById('setting-api-url').value;
1668
1711
  const api_key = document.getElementById('setting-api-key').value;
1669
1712
  const model = document.getElementById('setting-model').value;
1713
+ const headers = collectSettingHeadersFromUI();
1670
1714
 
1671
1715
  await apiRequest(`${API_BASE}/settings/api_url`, {
1672
1716
  method: 'PUT',
@@ -1682,11 +1726,21 @@ function initApp() {
1682
1726
  method: 'PUT',
1683
1727
  body: JSON.stringify({ value: model }),
1684
1728
  });
1729
+ await apiRequest(`${API_BASE}/settings/headers`, {
1730
+ method: 'PUT',
1731
+ body: JSON.stringify({ value: headers }),
1732
+ });
1685
1733
 
1686
1734
  alert('设置已保存');
1687
1735
  await loadSettings();
1688
1736
  });
1689
1737
 
1738
+ document.getElementById('add-setting-header-btn')?.addEventListener('click', () => {
1739
+ const list = document.getElementById('setting-headers-list');
1740
+ if (!(list instanceof HTMLElement)) return;
1741
+ list.appendChild(createSettingHeaderRow('', ''));
1742
+ });
1743
+
1690
1744
  document.getElementById('work-item-search')?.addEventListener('input', (e) => {
1691
1745
  state.workItemSearch = e.target.value || '';
1692
1746
  renderWorkTree();
@@ -210,6 +210,11 @@
210
210
  <label>Model</label>
211
211
  <input type="text" id="setting-model" placeholder="abab6.5s-chat">
212
212
  </div>
213
+ <div class="setting-group">
214
+ <label>额外 Headers</label>
215
+ <div class="settings-kv-list" id="setting-headers-list"></div>
216
+ <button class="btn btn-secondary btn-sm" id="add-setting-header-btn" type="button">+ 添加 Header</button>
217
+ </div>
213
218
  <button class="btn btn-primary" id="save-settings-btn">保存</button>
214
219
  </div>
215
220
  </div>
@@ -1227,6 +1227,25 @@ h2 {
1227
1227
  border-color: var(--primary);
1228
1228
  }
1229
1229
 
1230
+ .settings-kv-list {
1231
+ display: flex;
1232
+ flex-direction: column;
1233
+ gap: 8px;
1234
+ margin-bottom: 8px;
1235
+ }
1236
+
1237
+ .settings-kv-row {
1238
+ display: grid;
1239
+ grid-template-columns: 1fr 1fr auto;
1240
+ gap: 8px;
1241
+ align-items: center;
1242
+ }
1243
+
1244
+ .settings-kv-row .setting-header-key,
1245
+ .settings-kv-row .setting-header-value {
1246
+ width: 100%;
1247
+ }
1248
+
1230
1249
  /* Dialog */
1231
1250
  dialog {
1232
1251
  position: fixed;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qnote/q-ai-note",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "type": "module",
5
5
  "description": "AI-assisted personal work sandbox and diary system",
6
6
  "main": "dist/server/index.js",