@lemoncat7/dsh-knowledge 0.6.0-alpha.6

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 (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +184 -0
  3. package/cordis.patch.yml +12 -0
  4. package/docs/architecture.md +107 -0
  5. package/docs/document-knowledge-design.zh-CN.md +329 -0
  6. package/docs/requirements.md +86 -0
  7. package/lib/api.d.ts +4 -0
  8. package/lib/api.d.ts.map +1 -0
  9. package/lib/api.js +497 -0
  10. package/lib/api.js.map +1 -0
  11. package/lib/client.js +420 -0
  12. package/lib/client.js.map +7 -0
  13. package/lib/config.d.ts +38 -0
  14. package/lib/config.d.ts.map +1 -0
  15. package/lib/config.js +84 -0
  16. package/lib/config.js.map +1 -0
  17. package/lib/connection.d.ts +15 -0
  18. package/lib/connection.d.ts.map +1 -0
  19. package/lib/connection.js +95 -0
  20. package/lib/connection.js.map +1 -0
  21. package/lib/control.d.ts +26 -0
  22. package/lib/control.d.ts.map +1 -0
  23. package/lib/control.js +149 -0
  24. package/lib/control.js.map +1 -0
  25. package/lib/domain.d.ts +207 -0
  26. package/lib/domain.d.ts.map +1 -0
  27. package/lib/domain.js +122 -0
  28. package/lib/domain.js.map +1 -0
  29. package/lib/extraction.d.ts +27 -0
  30. package/lib/extraction.d.ts.map +1 -0
  31. package/lib/extraction.js +367 -0
  32. package/lib/extraction.js.map +1 -0
  33. package/lib/index.d.ts +15 -0
  34. package/lib/index.d.ts.map +1 -0
  35. package/lib/index.js +198 -0
  36. package/lib/index.js.map +1 -0
  37. package/lib/local-provider.d.ts +60 -0
  38. package/lib/local-provider.d.ts.map +1 -0
  39. package/lib/local-provider.js +1096 -0
  40. package/lib/local-provider.js.map +1 -0
  41. package/lib/provider-router.d.ts +19 -0
  42. package/lib/provider-router.d.ts.map +1 -0
  43. package/lib/provider-router.js +83 -0
  44. package/lib/provider-router.js.map +1 -0
  45. package/lib/provider.d.ts +38 -0
  46. package/lib/provider.d.ts.map +1 -0
  47. package/lib/provider.js +2 -0
  48. package/lib/provider.js.map +1 -0
  49. package/lib/recall.d.ts +8 -0
  50. package/lib/recall.d.ts.map +1 -0
  51. package/lib/recall.js +76 -0
  52. package/lib/recall.js.map +1 -0
  53. package/lib/remote-provider.d.ts +51 -0
  54. package/lib/remote-provider.d.ts.map +1 -0
  55. package/lib/remote-provider.js +216 -0
  56. package/lib/remote-provider.js.map +1 -0
  57. package/lib/retrieval.d.ts +35 -0
  58. package/lib/retrieval.d.ts.map +1 -0
  59. package/lib/retrieval.js +206 -0
  60. package/lib/retrieval.js.map +1 -0
  61. package/lib/runtime.d.ts +147 -0
  62. package/lib/runtime.d.ts.map +1 -0
  63. package/lib/runtime.js +26 -0
  64. package/lib/runtime.js.map +1 -0
  65. package/lib/tools.d.ts +6 -0
  66. package/lib/tools.d.ts.map +1 -0
  67. package/lib/tools.js +99 -0
  68. package/lib/tools.js.map +1 -0
  69. package/lib/web.d.ts +3 -0
  70. package/lib/web.d.ts.map +1 -0
  71. package/lib/web.js +71 -0
  72. package/lib/web.js.map +1 -0
  73. package/package.json +79 -0
  74. package/web/app.js +1686 -0
  75. package/web/index.html +19 -0
  76. package/web/styles.css +786 -0
package/lib/config.js ADDED
@@ -0,0 +1,84 @@
1
+ import Schema from '@deepseek-ai/schemastery';
2
+ export const Config = Schema.object({
3
+ backend: Schema.union(['local', 'remote']).default('local'),
4
+ databasePath: Schema.string(),
5
+ remoteUrl: Schema.string(),
6
+ remoteToken: Schema.string().role('secret'),
7
+ remoteTimeoutMs: Schema.number().min(100).max(120_000).default(10_000),
8
+ connectionPath: Schema.string(),
9
+ exposeApi: Schema.boolean().default(false),
10
+ apiToken: Schema.string().role('secret'),
11
+ apiPrefix: Schema.string().default('/knowledge-api/v1'),
12
+ exposeWeb: Schema.boolean().default(false),
13
+ webPath: Schema.string().default('/knowledge'),
14
+ extractionEnabled: Schema.boolean().default(true),
15
+ extractionProvider: Schema.string(),
16
+ extractionModel: Schema.string(),
17
+ extractionMaxTokens: Schema.number().min(128).max(8192).default(4096),
18
+ extractionTimeoutMs: Schema.number().min(1000).max(300_000).default(90_000),
19
+ extractionMaxInputChars: Schema.number().min(1000).max(200_000).default(30_000),
20
+ defaultScope: Schema.union(['project', 'global']).default('project'),
21
+ autoRecallLimit: Schema.number().min(0).max(20).default(3),
22
+ recallMaxChars: Schema.number().min(500).max(50_000).default(6000),
23
+ });
24
+ export function resolveConfig(config) {
25
+ const connectionPath = config.connectionPath ?? deriveConnectionPath(config.databasePath);
26
+ const resolved = {
27
+ ...config,
28
+ remoteTimeoutMs: config.remoteTimeoutMs ?? 10_000,
29
+ ...connectionPath === undefined ? {} : { connectionPath },
30
+ apiPrefix: normalizePrefix(config.apiPrefix ?? '/knowledge-api/v1'),
31
+ exposeWeb: config.exposeWeb ?? false,
32
+ webPath: normalizePrefix(config.webPath ?? '/knowledge'),
33
+ extractionMaxTokens: config.extractionMaxTokens ?? 4096,
34
+ extractionTimeoutMs: config.extractionTimeoutMs ?? 90_000,
35
+ extractionMaxInputChars: config.extractionMaxInputChars ?? 30_000,
36
+ defaultScope: config.defaultScope ?? 'project',
37
+ autoRecallLimit: config.autoRecallLimit ?? 3,
38
+ recallMaxChars: config.recallMaxChars ?? 6000,
39
+ };
40
+ if (resolved.backend === 'local' && (resolved.databasePath === undefined || resolved.databasePath.trim().length === 0)) {
41
+ throw new Error('local knowledge backend requires databasePath');
42
+ }
43
+ if (resolved.backend === 'remote') {
44
+ if (resolved.remoteUrl === undefined || resolved.remoteToken === undefined) {
45
+ throw new Error('remote knowledge backend requires remoteUrl and remoteToken');
46
+ }
47
+ const url = new URL(resolved.remoteUrl);
48
+ const loopback = url.hostname === '127.0.0.1' || url.hostname === 'localhost' || url.hostname === '::1';
49
+ if (url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) {
50
+ throw new Error('remote knowledge backend requires HTTPS (HTTP is allowed only for loopback testing)');
51
+ }
52
+ if (resolved.remoteToken.trim().length < 24)
53
+ throw new Error('remoteToken must contain at least 24 characters');
54
+ if (resolved.exposeApi)
55
+ throw new Error('remote knowledge backend cannot expose the local API');
56
+ }
57
+ const hasExtractionProvider = resolved.extractionProvider !== undefined;
58
+ const hasExtractionModel = resolved.extractionModel !== undefined;
59
+ if (hasExtractionProvider !== hasExtractionModel) {
60
+ throw new Error('extractionProvider and extractionModel must be configured together');
61
+ }
62
+ if (resolved.exposeApi && (resolved.apiToken === undefined || resolved.apiToken.trim().length < 24)) {
63
+ throw new Error('exposeApi requires apiToken with at least 24 characters');
64
+ }
65
+ if (resolved.exposeWeb && !resolved.exposeApi) {
66
+ throw new Error('exposeWeb requires exposeApi so the management console has an authenticated API');
67
+ }
68
+ if (resolved.webPath === resolved.apiPrefix || resolved.webPath.startsWith(`${resolved.apiPrefix}/`) || resolved.apiPrefix.startsWith(`${resolved.webPath}/`)) {
69
+ throw new Error('webPath and apiPrefix must not overlap');
70
+ }
71
+ return resolved;
72
+ }
73
+ function deriveConnectionPath(databasePath) {
74
+ return databasePath === undefined || databasePath.trim().length === 0 ? undefined : `${databasePath}.connection.json`;
75
+ }
76
+ function normalizePrefix(value) {
77
+ const trimmed = value.trim();
78
+ const withSlash = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
79
+ const prefix = withSlash.endsWith('/') ? withSlash.slice(0, -1) : withSlash;
80
+ if (!/^\/[a-zA-Z0-9/_-]+$/.test(prefix))
81
+ throw new Error('apiPrefix must be an absolute URL path');
82
+ return prefix;
83
+ }
84
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAyB7C,MAAM,CAAC,MAAM,MAAM,GAAmB,MAAM,CAAC,MAAM,CAAC;IAClD,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAC3D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;IAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;IAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC3C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACtE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE;IAC/B,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;IAC9C,iBAAiB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACjD,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE;IACnC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;IAChC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACrE,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAC3E,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/E,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACpE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;CACnE,CAAC,CAAA;AAeF,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACzF,MAAM,QAAQ,GAAmB;QAC/B,GAAG,MAAM;QACT,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,MAAM;QACjD,GAAG,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE;QACzD,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,SAAS,IAAI,mBAAmB,CAAC;QACnE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;QACpC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,IAAI,YAAY,CAAC;QACxD,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,IAAI;QACvD,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,MAAM;QACzD,uBAAuB,EAAE,MAAM,CAAC,uBAAuB,IAAI,MAAM;QACjE,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,SAAS;QAC9C,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,CAAC;QAC5C,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;KAC9C,CAAA;IACD,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,KAAK,SAAS,IAAI,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACvH,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAClE,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAClC,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;QAChF,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,CAAA;QACvG,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAA;QACxG,CAAC;QACD,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;QAC/G,IAAI,QAAQ,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IACjG,CAAC;IACD,MAAM,qBAAqB,GAAG,QAAQ,CAAC,kBAAkB,KAAK,SAAS,CAAA;IACvE,MAAM,kBAAkB,GAAG,QAAQ,CAAC,eAAe,KAAK,SAAS,CAAA;IACjE,IAAI,qBAAqB,KAAK,kBAAkB,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;IACvF,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC;QACpG,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;IAC5E,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAA;IACpG,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,SAAS,GAAG,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QAC9J,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC3D,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,YAAgC;IAC5D,OAAO,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,kBAAkB,CAAA;AACvH,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAA;IACnE,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC3E,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAClG,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ResolvedConfig } from './config.js';
2
+ import type { KnowledgeProvider } from './provider.js';
3
+ export interface KnowledgeConnectionSettings {
4
+ backend: 'local' | 'remote';
5
+ remoteUrl?: string;
6
+ remoteToken?: string;
7
+ remoteTimeoutMs: number;
8
+ }
9
+ export declare function connectionSettingsBase(config: ResolvedConfig): KnowledgeConnectionSettings;
10
+ export declare function validateConnectionSettings(settings: KnowledgeConnectionSettings, exposeApi: boolean, localDatabaseAvailable?: boolean): void;
11
+ export declare function createConnectionProvider(config: ResolvedConfig, settings: KnowledgeConnectionSettings): KnowledgeProvider;
12
+ export declare function sameConnection(left: KnowledgeConnectionSettings, right: KnowledgeConnectionSettings): boolean;
13
+ export declare function loadStoredConnection(path: string | undefined): KnowledgeConnectionSettings | undefined;
14
+ export declare function storeConnection(path: string, settings: KnowledgeConnectionSettings): Promise<void>;
15
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAGtD,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,2BAA2B,CAO1F;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,2BAA2B,EACrC,SAAS,EAAE,OAAO,EAClB,sBAAsB,UAAO,GAC5B,IAAI,CAkBN;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,2BAA2B,GACpC,iBAAiB,CASnB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAK7G;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,2BAA2B,GAAG,SAAS,CAqBtG;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CASxG"}
@@ -0,0 +1,95 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { mkdir, rename, rm, writeFile } from 'node:fs/promises';
3
+ import { dirname } from 'node:path';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { LocalKnowledgeProvider } from './local-provider.js';
6
+ import { RemoteKnowledgeProvider } from './remote-provider.js';
7
+ export function connectionSettingsBase(config) {
8
+ return {
9
+ backend: config.backend,
10
+ remoteTimeoutMs: config.remoteTimeoutMs,
11
+ ...config.remoteUrl === undefined ? {} : { remoteUrl: config.remoteUrl },
12
+ ...config.remoteToken === undefined ? {} : { remoteToken: config.remoteToken },
13
+ };
14
+ }
15
+ export function validateConnectionSettings(settings, exposeApi, localDatabaseAvailable = true) {
16
+ if (!Number.isInteger(settings.remoteTimeoutMs) || settings.remoteTimeoutMs < 100 || settings.remoteTimeoutMs > 120_000) {
17
+ throw new Error('remote timeout must be an integer from 100 to 120000 milliseconds');
18
+ }
19
+ if (settings.backend === 'local') {
20
+ if (!localDatabaseAvailable)
21
+ throw new Error('local knowledge backend is unavailable because databasePath is not configured');
22
+ return;
23
+ }
24
+ if (exposeApi)
25
+ throw new Error('a central knowledge server cannot switch its own provider to remote mode');
26
+ if (settings.remoteUrl === undefined || settings.remoteToken === undefined) {
27
+ throw new Error('remote knowledge backend requires a server URL and client token');
28
+ }
29
+ const url = new URL(settings.remoteUrl);
30
+ const loopback = url.hostname === '127.0.0.1' || url.hostname === 'localhost' || url.hostname === '::1';
31
+ if (url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) {
32
+ throw new Error('remote knowledge backend requires HTTPS (HTTP is allowed only for loopback testing)');
33
+ }
34
+ if (settings.remoteToken.trim().length < 24)
35
+ throw new Error('remote client token must contain at least 24 characters');
36
+ }
37
+ export function createConnectionProvider(config, settings) {
38
+ validateConnectionSettings(settings, config.exposeApi, config.databasePath !== undefined && config.databasePath.trim().length > 0);
39
+ return settings.backend === 'local'
40
+ ? new LocalKnowledgeProvider(config.databasePath)
41
+ : new RemoteKnowledgeProvider({
42
+ url: settings.remoteUrl,
43
+ token: settings.remoteToken,
44
+ timeoutMs: settings.remoteTimeoutMs,
45
+ });
46
+ }
47
+ export function sameConnection(left, right) {
48
+ return left.backend === right.backend
49
+ && left.remoteUrl === right.remoteUrl
50
+ && left.remoteToken === right.remoteToken
51
+ && left.remoteTimeoutMs === right.remoteTimeoutMs;
52
+ }
53
+ export function loadStoredConnection(path) {
54
+ if (path === undefined)
55
+ return undefined;
56
+ let parsed;
57
+ try {
58
+ parsed = JSON.parse(readFileSync(path, 'utf8'));
59
+ }
60
+ catch (error) {
61
+ if (error.code === 'ENOENT')
62
+ return undefined;
63
+ throw new Error(`failed to read knowledge connection settings: ${error instanceof Error ? error.message : String(error)}`);
64
+ }
65
+ if (!isRecord(parsed))
66
+ throw new Error('stored knowledge connection settings must be a JSON object');
67
+ if (parsed.backend !== 'local' && parsed.backend !== 'remote') {
68
+ throw new Error('stored knowledge connection backend must be local or remote');
69
+ }
70
+ if (!Number.isInteger(parsed.remoteTimeoutMs)) {
71
+ throw new Error('stored knowledge connection timeout must be an integer');
72
+ }
73
+ const settings = {
74
+ backend: parsed.backend,
75
+ remoteTimeoutMs: parsed.remoteTimeoutMs,
76
+ ...typeof parsed.remoteUrl === 'string' ? { remoteUrl: parsed.remoteUrl } : {},
77
+ ...typeof parsed.remoteToken === 'string' ? { remoteToken: parsed.remoteToken } : {},
78
+ };
79
+ return settings;
80
+ }
81
+ export async function storeConnection(path, settings) {
82
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
83
+ const temporary = `${path}.${randomUUID()}.tmp`;
84
+ try {
85
+ await writeFile(temporary, `${JSON.stringify(settings, null, 2)}\n`, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
86
+ await rename(temporary, path);
87
+ }
88
+ finally {
89
+ await rm(temporary, { force: true }).catch(() => { });
90
+ }
91
+ }
92
+ function isRecord(value) {
93
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
94
+ }
95
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { KnowledgeConnectionSettings } from './connection.js';
2
+ import type { RuntimeContextLike } from './runtime.js';
3
+ export declare const KNOWLEDGE_CONTROL_PATH = "/knowledge-control/v1/connection";
4
+ export interface KnowledgeConnectionView {
5
+ backend: 'local' | 'remote';
6
+ remoteUrl?: string;
7
+ remoteTimeoutMs: number;
8
+ tokenConfigured: boolean;
9
+ canSwitchRemote: boolean;
10
+ writable: boolean;
11
+ }
12
+ export interface KnowledgeConnectionUpdate {
13
+ backend: 'local' | 'remote';
14
+ remoteUrl?: string;
15
+ remoteToken?: string;
16
+ remoteTimeoutMs: number;
17
+ }
18
+ export interface KnowledgeControlOptions {
19
+ current(): KnowledgeConnectionSettings;
20
+ canSwitchRemote: boolean;
21
+ writable: boolean;
22
+ update(value: KnowledgeConnectionUpdate): Promise<KnowledgeConnectionSettings>;
23
+ }
24
+ /** Register the same-origin control surface used by the plugin settings card. */
25
+ export declare function registerKnowledgeControl(ctx: RuntimeContextLike, options: KnowledgeControlOptions): () => void;
26
+ //# sourceMappingURL=control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEtD,eAAO,MAAM,sBAAsB,qCAAqC,CAAA;AAIxE,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,OAAO,CAAA;IACxB,eAAe,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,IAAI,2BAA2B,CAAA;IACtC,eAAe,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAA;CAC/E;AAED,iFAAiF;AACjF,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,kBAAkB,EACvB,OAAO,EAAE,uBAAuB,GAC/B,MAAM,IAAI,CAcZ"}
package/lib/control.js ADDED
@@ -0,0 +1,149 @@
1
+ export const KNOWLEDGE_CONTROL_PATH = '/knowledge-control/v1/connection';
2
+ const MAX_BODY_BYTES = 16_384;
3
+ /** Register the same-origin control surface used by the plugin settings card. */
4
+ export function registerKnowledgeControl(ctx, options) {
5
+ const webServer = ctx.webServer ?? ctx.get('webServer');
6
+ if (webServer === undefined)
7
+ throw new Error('knowledge connection control requires the DSH webServer service');
8
+ return webServer.register({
9
+ kind: 'exact',
10
+ path: KNOWLEDGE_CONTROL_PATH,
11
+ handler: async (req, res) => {
12
+ try {
13
+ await dispatch(req, res, options);
14
+ }
15
+ catch (error) {
16
+ sendControlError(res, error);
17
+ }
18
+ },
19
+ });
20
+ }
21
+ async function dispatch(req, res, options) {
22
+ const method = req.method ?? 'GET';
23
+ if (method === 'GET') {
24
+ return sendJson(res, 200, connectionView(options.current(), options));
25
+ }
26
+ if (method !== 'PUT') {
27
+ res.setHeader('allow', 'GET, PUT');
28
+ throw controlError(405, '此接口仅支持读取或保存连接配置。');
29
+ }
30
+ assertSameOrigin(req);
31
+ if (!isJsonContentType(req.headers['content-type'])) {
32
+ throw controlError(415, '保存连接配置时必须使用 application/json。');
33
+ }
34
+ if (!options.writable)
35
+ throw controlError(409, '当前插件没有配置持久化路径,无法保存连接。');
36
+ const update = parseUpdate(await readObject(req));
37
+ if (update.backend === 'remote' && !options.canSwitchRemote) {
38
+ throw controlError(409, '中央知识库服务不能再连接另一台远程知识库。');
39
+ }
40
+ const active = await options.update(update);
41
+ sendJson(res, 200, connectionView(active, options));
42
+ }
43
+ function connectionView(settings, options) {
44
+ return {
45
+ backend: settings.backend,
46
+ remoteTimeoutMs: settings.remoteTimeoutMs,
47
+ tokenConfigured: typeof settings.remoteToken === 'string' && settings.remoteToken.trim().length >= 24,
48
+ canSwitchRemote: options.canSwitchRemote,
49
+ writable: options.writable,
50
+ ...settings.remoteUrl === undefined ? {} : { remoteUrl: settings.remoteUrl },
51
+ };
52
+ }
53
+ function parseUpdate(body) {
54
+ if (body.backend !== 'local' && body.backend !== 'remote') {
55
+ throw controlError(400, '知识库来源必须是本地或远程。');
56
+ }
57
+ if (!Number.isInteger(body.remoteTimeoutMs) || body.remoteTimeoutMs < 100 || body.remoteTimeoutMs > 120_000) {
58
+ throw controlError(400, '请求超时必须是 100 到 120000 毫秒之间的整数。');
59
+ }
60
+ if (body.remoteUrl !== undefined && typeof body.remoteUrl !== 'string') {
61
+ throw controlError(400, '远程知识库地址格式不正确。');
62
+ }
63
+ if (body.remoteToken !== undefined && typeof body.remoteToken !== 'string') {
64
+ throw controlError(400, '客户端令牌格式不正确。');
65
+ }
66
+ return {
67
+ backend: body.backend,
68
+ remoteTimeoutMs: body.remoteTimeoutMs,
69
+ ...typeof body.remoteUrl === 'string' ? { remoteUrl: body.remoteUrl.trim() } : {},
70
+ ...typeof body.remoteToken === 'string' && body.remoteToken.trim().length > 0
71
+ ? { remoteToken: body.remoteToken.trim() }
72
+ : {},
73
+ };
74
+ }
75
+ function assertSameOrigin(req) {
76
+ const fetchSite = req.headers['sec-fetch-site'];
77
+ if (fetchSite !== undefined && fetchSite !== 'same-origin' && fetchSite !== 'none') {
78
+ throw controlError(403, '已拒绝跨站连接配置请求。');
79
+ }
80
+ const origin = req.headers.origin;
81
+ if (origin === undefined)
82
+ return;
83
+ let originHost;
84
+ try {
85
+ originHost = new URL(origin).host;
86
+ }
87
+ catch {
88
+ throw controlError(403, '请求来源无效。');
89
+ }
90
+ const forwardedHost = firstHeader(req.headers['x-forwarded-host']);
91
+ const expectedHost = forwardedHost ?? req.headers.host;
92
+ if (expectedHost === undefined || originHost.toLowerCase() !== expectedHost.toLowerCase()) {
93
+ throw controlError(403, '已拒绝跨站连接配置请求。');
94
+ }
95
+ }
96
+ function firstHeader(value) {
97
+ const raw = Array.isArray(value) ? value[0] : value;
98
+ return raw?.split(',')[0]?.trim();
99
+ }
100
+ function isJsonContentType(value) {
101
+ return value?.split(';', 1)[0]?.trim().toLowerCase() === 'application/json';
102
+ }
103
+ async function readObject(req) {
104
+ const declared = Number(req.headers['content-length'] ?? 0);
105
+ if (Number.isFinite(declared) && declared > MAX_BODY_BYTES)
106
+ throw controlError(413, '连接配置内容过大。');
107
+ const chunks = [];
108
+ let size = 0;
109
+ for await (const chunk of req) {
110
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
111
+ size += buffer.length;
112
+ if (size > MAX_BODY_BYTES)
113
+ throw controlError(413, '连接配置内容过大。');
114
+ chunks.push(buffer);
115
+ }
116
+ try {
117
+ const value = JSON.parse(Buffer.concat(chunks).toString('utf8'));
118
+ if (!isRecord(value))
119
+ throw new Error();
120
+ return value;
121
+ }
122
+ catch {
123
+ throw controlError(400, '请求正文必须是 JSON 对象。');
124
+ }
125
+ }
126
+ function sendControlError(res, error) {
127
+ const status = isRecord(error) && typeof error.status === 'number' ? error.status : 500;
128
+ const message = status >= 500
129
+ ? '连接配置操作失败,请稍后重试或查看 DSH 日志。'
130
+ : error instanceof Error ? error.message : '连接配置请求无效。';
131
+ sendJson(res, status, { error: message, code: status >= 500 ? 'INTERNAL' : `HTTP_${status}` });
132
+ }
133
+ function sendJson(res, status, body) {
134
+ const payload = JSON.stringify(body);
135
+ res.writeHead(status, {
136
+ 'content-type': 'application/json; charset=utf-8',
137
+ 'content-length': Buffer.byteLength(payload),
138
+ 'cache-control': 'no-store',
139
+ 'x-content-type-options': 'nosniff',
140
+ });
141
+ res.end(payload);
142
+ }
143
+ function controlError(status, message) {
144
+ return Object.assign(new Error(message), { status });
145
+ }
146
+ function isRecord(value) {
147
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
148
+ }
149
+ //# sourceMappingURL=control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,sBAAsB,GAAG,kCAAkC,CAAA;AAExE,MAAM,cAAc,GAAG,MAAM,CAAA;AAyB7B,iFAAiF;AACjF,MAAM,UAAU,wBAAwB,CACtC,GAAuB,EACvB,OAAgC;IAEhC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,CAAoC,CAAA;IAC1F,IAAI,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAA;IAC/G,OAAO,SAAS,CAAC,QAAQ,CAAC;QACxB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAC1B,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAC9B,CAAC;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,GAAoB,EACpB,GAAmB,EACnB,OAAgC;IAEhC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAA;IAClC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;IACvE,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QAClC,MAAM,YAAY,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;IAC7C,CAAC;IACD,gBAAgB,CAAC,GAAG,CAAC,CAAA;IACrB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,YAAY,CAAC,GAAG,EAAE,+BAA+B,CAAC,CAAA;IAC1D,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,MAAM,YAAY,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAA;IACvE,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;IACjD,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5D,MAAM,YAAY,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAA;IAClD,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC3C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,SAAS,cAAc,CACrB,QAAqC,EACrC,OAAsE;IAEtE,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,eAAe,EAAE,QAAQ,CAAC,eAAe;QACzC,eAAe,EAAE,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE;QACrG,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE;KAC7E,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAA6B;IAChD,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,YAAY,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAA;IAC3C,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,IAAK,IAAI,CAAC,eAA0B,GAAG,GAAG,IAAK,IAAI,CAAC,eAA0B,GAAG,OAAO,EAAE,CAAC;QACpI,MAAM,YAAY,CAAC,GAAG,EAAE,+BAA+B,CAAC,CAAA;IAC1D,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACvE,MAAM,YAAY,CAAC,GAAG,EAAE,eAAe,CAAC,CAAA;IAC1C,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC3E,MAAM,YAAY,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACxC,CAAC;IACD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,eAAe,EAAE,IAAI,CAAC,eAAyB;QAC/C,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;QACjF,GAAG,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC3E,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE;YAC1C,CAAC,CAAC,EAAE;KACP,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAoB;IAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC/C,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACnF,MAAM,YAAY,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;IACzC,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAA;IACjC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAM;IAChC,IAAI,UAAkB,CAAA;IACtB,IAAI,CAAC;QAAC,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IAAC,CAAC;IACtF,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAClE,MAAM,YAAY,GAAG,aAAa,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAA;IACtD,IAAI,YAAY,KAAK,SAAS,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1F,MAAM,YAAY,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;IACzC,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAoC;IACvD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACnD,OAAO,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;AACnC,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAyB;IAClD,OAAO,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,kBAAkB,CAAA;AAC7E,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAoB;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3D,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,cAAc;QAAE,MAAM,YAAY,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;IAChG,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClE,IAAI,IAAI,MAAM,CAAC,MAAM,CAAA;QACrB,IAAI,IAAI,GAAG,cAAc;YAAE,MAAM,YAAY,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;QAC/D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY,CAAA;QAC3E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,EAAE,CAAA;QACvC,OAAO,KAAK,CAAA;IACd,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,YAAY,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;IAC7C,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAmB,EAAE,KAAc;IAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAA;IACvF,MAAM,OAAO,GAAG,MAAM,IAAI,GAAG;QAC3B,CAAC,CAAC,2BAA2B;QAC7B,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAA;IACxD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,EAAE,CAAC,CAAA;AAChG,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACpC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,iCAAiC;QACjD,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;QAC5C,eAAe,EAAE,UAAU;QAC3B,wBAAwB,EAAE,SAAS;KACpC,CAAC,CAAA;IACF,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,OAAe;IACnD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC"}
@@ -0,0 +1,207 @@
1
+ export declare const KNOWLEDGE_TYPES: readonly ["preference", "fact", "decision", "procedure", "lesson"];
2
+ export type KnowledgeType = typeof KNOWLEDGE_TYPES[number];
3
+ export declare const DEFAULT_KNOWLEDGE_BASE_ID = "default";
4
+ export type KnowledgeScope = {
5
+ kind: 'global';
6
+ } | {
7
+ kind: 'project';
8
+ id: string;
9
+ };
10
+ export type KnowledgeStatus = 'active' | 'archived';
11
+ export type CandidateAction = 'create' | 'update' | 'conflict';
12
+ export type CandidateStatus = 'pending' | 'approved' | 'rejected';
13
+ export type KnowledgeBaseStatus = 'active' | 'archived';
14
+ export type KnowledgeMountTargetKind = 'project' | 'session';
15
+ export type KnowledgeWriteMode = 'none' | 'audit' | 'direct';
16
+ export interface KnowledgeBaseDraft {
17
+ name: string;
18
+ description: string;
19
+ defaultTags: string[];
20
+ extractionInstructions: string;
21
+ /** Empty means use the model route from the current assistant turn. */
22
+ writebackProvider?: string;
23
+ writebackModel?: string;
24
+ }
25
+ export interface KnowledgeBasePatch {
26
+ name?: string;
27
+ description?: string;
28
+ defaultTags?: string[];
29
+ extractionInstructions?: string;
30
+ writebackProvider?: string | null;
31
+ writebackModel?: string | null;
32
+ }
33
+ export interface KnowledgeBase extends KnowledgeBaseDraft {
34
+ id: string;
35
+ status: KnowledgeBaseStatus;
36
+ createdAt: string;
37
+ updatedAt: string;
38
+ }
39
+ /** User-facing Markdown projection of approved knowledge entries. */
40
+ export interface KnowledgeDocument {
41
+ id: string;
42
+ knowledgeBaseId: string;
43
+ relPath: string;
44
+ title: string;
45
+ content: string;
46
+ entryCount: number;
47
+ contentHash: string;
48
+ createdAt: string;
49
+ updatedAt: string;
50
+ }
51
+ export interface KnowledgeMountDraft {
52
+ targetKind: KnowledgeMountTargetKind;
53
+ targetId: string;
54
+ knowledgeBaseId: string;
55
+ enabled: boolean;
56
+ recallEnabled: boolean;
57
+ writeMode: KnowledgeWriteMode;
58
+ includeTags: string[];
59
+ excludeTags: string[];
60
+ extractionInstructions: string;
61
+ }
62
+ export interface KnowledgeMount extends KnowledgeMountDraft {
63
+ id: string;
64
+ createdAt: string;
65
+ updatedAt: string;
66
+ }
67
+ export interface KnowledgeMountBatch {
68
+ upserts: KnowledgeMountDraft[];
69
+ deleteIds: string[];
70
+ }
71
+ export interface KnowledgeMountBatchResult {
72
+ mounts: KnowledgeMount[];
73
+ deletedIds: string[];
74
+ }
75
+ export interface ResolvedKnowledgeMount extends KnowledgeMount {
76
+ base: KnowledgeBase;
77
+ inheritedFrom?: 'project';
78
+ }
79
+ export interface KnowledgeSource {
80
+ sessionId?: string;
81
+ messageId?: string;
82
+ turn?: number;
83
+ clientId?: string;
84
+ }
85
+ export interface KnowledgeDraft {
86
+ knowledgeBaseId: string;
87
+ title: string;
88
+ body: string;
89
+ type: KnowledgeType;
90
+ tags: string[];
91
+ scope: KnowledgeScope;
92
+ confidence: number;
93
+ source?: KnowledgeSource;
94
+ }
95
+ export interface KnowledgeEntry extends KnowledgeDraft {
96
+ id: string;
97
+ status: KnowledgeStatus;
98
+ version: number;
99
+ createdAt: string;
100
+ updatedAt: string;
101
+ }
102
+ export interface KnowledgeVersion {
103
+ id: string;
104
+ knowledgeId: string;
105
+ version: number;
106
+ snapshot: KnowledgeDraft & {
107
+ status: KnowledgeStatus;
108
+ };
109
+ changeKind: 'create' | 'update' | 'archive' | 'restore';
110
+ createdAt: string;
111
+ }
112
+ export interface CandidateProposal {
113
+ action: CandidateAction;
114
+ targetId?: string;
115
+ draft: KnowledgeDraft;
116
+ reason: string;
117
+ }
118
+ export interface KnowledgeCandidate extends CandidateProposal {
119
+ id: string;
120
+ status: CandidateStatus;
121
+ sourceKey?: string;
122
+ createdAt: string;
123
+ reviewedAt?: string;
124
+ reviewNote?: string;
125
+ }
126
+ export interface SearchRequest {
127
+ text: string;
128
+ projectId?: string;
129
+ knowledgeBaseIds?: string[];
130
+ includeTags?: string[];
131
+ excludeTags?: string[];
132
+ types?: KnowledgeType[];
133
+ limit: number;
134
+ }
135
+ export interface SearchHit {
136
+ entry: KnowledgeEntry;
137
+ score: number;
138
+ }
139
+ export interface ListRequest {
140
+ status?: KnowledgeStatus;
141
+ projectId?: string;
142
+ knowledgeBaseId?: string;
143
+ type?: KnowledgeType;
144
+ limit: number;
145
+ cursor?: string;
146
+ }
147
+ export interface ListResult<T> {
148
+ items: T[];
149
+ nextCursor?: string;
150
+ }
151
+ export interface ReviewDecision {
152
+ decision: 'approve' | 'reject';
153
+ note?: string;
154
+ draft?: KnowledgeDraft;
155
+ }
156
+ export interface ExtractionJobRecord {
157
+ sourceKey: string;
158
+ status: 'running' | 'completed' | 'failed';
159
+ attempts: number;
160
+ candidateCount: number;
161
+ lastError?: string;
162
+ updatedAt: string;
163
+ }
164
+ export interface KnowledgeStats {
165
+ knowledgeBases: {
166
+ total: number;
167
+ active: number;
168
+ archived: number;
169
+ };
170
+ entries: {
171
+ total: number;
172
+ active: number;
173
+ archived: number;
174
+ byType: Record<KnowledgeType, number>;
175
+ };
176
+ candidates: {
177
+ total: number;
178
+ pending: number;
179
+ approved: number;
180
+ rejected: number;
181
+ };
182
+ extractionJobs: {
183
+ total: number;
184
+ running: number;
185
+ completed: number;
186
+ failed: number;
187
+ };
188
+ }
189
+ export declare const TOKEN_PERMISSIONS: readonly ["read", "propose", "write", "admin"];
190
+ export type TokenPermission = typeof TOKEN_PERMISSIONS[number];
191
+ export interface ApiTokenRecord {
192
+ id: string;
193
+ name: string;
194
+ permissions: TokenPermission[];
195
+ createdAt: string;
196
+ lastUsedAt?: string;
197
+ revokedAt?: string;
198
+ }
199
+ export declare function newId(): string;
200
+ export declare function nowIso(): string;
201
+ export declare function normalizeTags(tags: readonly string[]): string[];
202
+ export declare function normalizeDraft(input: KnowledgeDraft): KnowledgeDraft;
203
+ export declare function contentHash(draft: KnowledgeDraft): string;
204
+ export declare function normalizeKnowledgeBaseDraft(input: KnowledgeBaseDraft): KnowledgeBaseDraft;
205
+ export declare function normalizeKnowledgeMountDraft(input: KnowledgeMountDraft): KnowledgeMountDraft;
206
+ export declare function isKnowledgeType(value: unknown): value is KnowledgeType;
207
+ //# sourceMappingURL=domain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../src/domain.ts"],"names":[],"mappings":"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"}