@kevisual/cnb 0.0.76 → 0.0.78

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.
@@ -0,0 +1,166 @@
1
+ import { app, cnbManager } from '../../app.ts'
2
+ import z from 'zod'
3
+ import fs from 'node:fs';
4
+ import crypto from 'node:crypto';
5
+
6
+ // pnpm cli embedding getEmbedding -- repo=kevisual/starred-auto text="hello world"
7
+ app.route({
8
+ path: 'embedding',
9
+ key: 'getEmbedding',
10
+ middleware: ['auth'],
11
+ description: '获取文本的向量表示',
12
+ metadata: {
13
+ args: {
14
+ repo: z.string().describe('知识库所属的仓库'),
15
+ text: z.string().describe('需要获取向量表示的文本')
16
+ }
17
+ }
18
+ }).define(async (ctx) => {
19
+ const cnb = await cnbManager.getContext(ctx)
20
+ const { text, repo } = ctx.args
21
+
22
+ const result = await cnb.knowledgeBase.getEmbedding(repo, text)
23
+ console.log('embedding result', result)
24
+ }).addTo(app)
25
+
26
+ // pnpm cli embedding list-docs -- repo=kevisual/starred-auto
27
+ // pnpm cli embedding list-docs -- repo=kevisual/cnb
28
+ app.route({
29
+ path: 'embedding',
30
+ key: 'list-docs',
31
+ middleware: ['auth'],
32
+ description: '获取知识库中的文档列表',
33
+ metadata: {
34
+ args: {
35
+ repo: z.string().describe('知识库所属的仓库'),
36
+ }
37
+ }
38
+ }).define(async (ctx) => {
39
+ const cnb = await cnbManager.getContext(ctx)
40
+ const { repo } = ctx.args
41
+
42
+ const result = await cnb.knowledgeBase.listDocuments(repo)
43
+ console.log('list docs result', result)
44
+ }).addTo(app)
45
+
46
+ // pnpm cli embedding add-doc -- repo=kevisual/starred-auto content="hello world"
47
+ // pnpm cli embedding add-doc -- repo=kevisual/cnb content="hello world"
48
+
49
+ app.route({
50
+ path: 'embedding',
51
+ key: 'add-doc',
52
+ middleware: ['auth'],
53
+ description: '向知识库中添加文档,test',
54
+ metadata: {
55
+ args: {
56
+ repo: z.string().describe('知识库所属的仓库'),
57
+ content: z.string().describe('文档内容')
58
+ }
59
+ }
60
+ }).define(async (ctx) => {
61
+ const cnb = await cnbManager.getContext(ctx)
62
+ let { repo, content } = ctx.args
63
+ const embeddingResult = await cnb.knowledgeBase.getEmbedding(repo, content)
64
+ const embedding = embeddingResult.data.embeddings;
65
+ const path = process.cwd() + '/docs/readme.md'
66
+ const read = fs.readFileSync(path, 'utf-8')
67
+ content = read;
68
+ const size = Buffer.byteLength(content, 'utf-8')
69
+ const gitBlobHashContent = (content: string | Buffer) => {
70
+ const bytes = Buffer.isBuffer(content) ? content : Buffer.from(content);
71
+ return crypto.createHash('md5').update(bytes).digest('hex');
72
+ }
73
+ const result = await cnb.knowledgeBase.addDocument(repo, {
74
+ path: 'docs/readme.md',
75
+ name: 'readme',
76
+ extension: 'md',
77
+ size,
78
+ hash: gitBlobHashContent(content),
79
+ type: 'code',
80
+ url: `https://cnb.cool/kevisual/cnb/-/blob/38f5e7ef1baf583/docs/readme.md`,
81
+ chunks: [
82
+ {
83
+ content,
84
+ hash: gitBlobHashContent(content),
85
+ position: 0,
86
+ embedding: embedding,
87
+ }
88
+ ],
89
+ batch_index: 0,
90
+ batch_count: 1,
91
+ is_last_batch: true,
92
+ })
93
+ console.log('add doc result', result)
94
+ }).addTo(app)
95
+
96
+ // pnpm cli cnb-base query -- repo=kevisual/starred-auto query="openlist"
97
+ app.route({
98
+ path: 'cnb-base',
99
+ key: 'query',
100
+ middleware: ['auth'],
101
+ description: '获取知识库基本信息',
102
+ metadata: {
103
+ args: {
104
+ repo: z.string().describe('知识库所属的仓库'),
105
+ query: z.string().describe('查询文本'),
106
+ score_threshold: z.number().optional().describe('相似度阈值,范围0-1,默认为0.5'),
107
+ top_k: z.number().optional().describe('返回最相似的前K条结果,默认为10')
108
+ }
109
+ }
110
+ }).define(async (ctx) => {
111
+ const cnb = await cnbManager.getContext(ctx)
112
+ const { repo, query, score_threshold, top_k } = ctx.args
113
+
114
+ const result = await cnb.knowledgeBase.queryKnowledgeBase(repo, { query, score_threshold, top_k })
115
+ console.log('get knowledge base result', result)
116
+ }).addTo(app)
117
+
118
+ // pnpm cli cnb-base create-knowledge-base -- repo=kevisual/cnb
119
+ app.route({
120
+ path: 'cnb-base',
121
+ key: 'create-knowledge-base',
122
+ middleware: ['auth'],
123
+ description: '创建知识库',
124
+ metadata: {
125
+ args: {
126
+ repo: z.string().describe('知识库所属的仓库'),
127
+ }
128
+ }
129
+ }).define(async (ctx) => {
130
+ const cnb = await cnbManager.getContext(ctx)
131
+ const repo = 'kevisual/cnb'
132
+ const model_name = 'hunyuan'
133
+ const include = 'docs/**.md'
134
+ const exclude = ''
135
+ const chunk_size = 300
136
+ const chunk_overlap = 50
137
+ const text_separator = '\n'
138
+ const issue_sync_enabled = false
139
+ const issue_labels = ''
140
+ const issue_exclude_labels = ''
141
+ const issue_state = 'open'
142
+ const baseRes = await cnb.knowledgeBase.getBase(repo)
143
+ console.log(JSON.stringify(baseRes, null, 2))
144
+ if (baseRes.code === 200) {
145
+ // console.log('知识库已存在,删除后重新创建')
146
+ // const res = await cnb.knowledgeBase.deleteBase(repo)
147
+ // console.log('delete knowledge base result', res)
148
+ ctx.body = {
149
+ content: '知识库已存',
150
+ }
151
+ return;
152
+ }
153
+ const result = await cnb.knowledgeBase.createKnowledgeBase(repo, {
154
+ model_name,
155
+ include,
156
+ exclude,
157
+ chunk_size,
158
+ chunk_overlap,
159
+ text_separator,
160
+ issue_sync_enabled,
161
+ issue_labels,
162
+ issue_exclude_labels,
163
+ issue_state
164
+ })
165
+ console.log('create knowledge base result', result)
166
+ }).addTo(app)
@@ -1 +1,2 @@
1
- import './ai.ts'
1
+ import './ai.ts'
2
+ import './embedding.ts'
@@ -2,10 +2,10 @@ import { z } from 'zod';
2
2
  import { app, cnbManager } from '../../app.ts';
3
3
 
4
4
  // 查询仓库的标签列表,并导入到新仓库
5
- // pnpm cli cnb importTags -- source=kevisual/cnb target=abearxiong/jour-2026-04-13
5
+ // pnpm cli cnb importLabels -- source=kevisual/cnb target=abearxiong/jour-2026-04-12
6
6
  app.route({
7
7
  path: 'cnb',
8
- key: 'importTags',
8
+ key: 'importLabels',
9
9
  description: '从一个仓库导入标签到另一个仓库',
10
10
  middleware: ['auth'],
11
11
  metadata: {
@@ -33,4 +33,44 @@ app.route({
33
33
  labels: res.data,
34
34
  });
35
35
  ctx.forward(importRes);
36
- }).addTo(app);
36
+ }).addTo(app);
37
+
38
+ // pnpm cli cnb removeLabels -- repo=abearxiong/jour-2026-04-12 all=true
39
+ app.route({
40
+ path: 'cnb',
41
+ key: 'removeLabels',
42
+ description: '从仓库中删除标签',
43
+ middleware: ['auth'],
44
+ metadata: {
45
+ args: {
46
+ repo: z.string().describe('仓库路径, 如 my-user/my-repo'),
47
+ labels: z.array(z.string()).describe('要删除的标签名称列表'),
48
+ all: z.boolean().describe('是否删除所有标签,默认为 false'),
49
+ },
50
+ }
51
+ }).define(async (ctx) => {
52
+ const cnb = await cnbManager.getContext(ctx);
53
+ const repo = ctx.query?.repo;
54
+ let labels = ctx.query?.labels;
55
+ const all = ctx.query?.all === true;
56
+ if (!repo) {
57
+ ctx.throw(400, '缺少参数 repo');
58
+ }
59
+ if (all) {
60
+ const res = await cnb.labels.repoLabel.getAll(repo);
61
+ if (res.code !== 200) {
62
+ return ctx.forward(res)
63
+ }
64
+ labels = res.data.map((label: { name: string }) => label.name);
65
+ }
66
+ if (!labels || !Array.isArray(labels)) {
67
+ ctx.throw(400, '缺少参数 labels 或 labels 不是数组');
68
+ }
69
+
70
+ // 删除标签列表
71
+ const removeRes = await cnb.labels.repoLabel.removeLabels({
72
+ repo,
73
+ labels,
74
+ });
75
+ ctx.forward(removeRes);
76
+ }).addTo(app);
@@ -0,0 +1,23 @@
1
+ import { downloadByCNBApi } from "@/repo/download.ts";
2
+
3
+ import { app } from '../../app.ts';
4
+ import { z } from 'zod';
5
+
6
+ // pnpm cli cnb download -- url=https://
7
+ app.route({
8
+ path: 'cnb',
9
+ key: 'download',
10
+ description: '下载文件',
11
+ middleware: ['auth'],
12
+ metadata: {
13
+ args: {
14
+ url: z.string().describe('文件下载链接'),
15
+ },
16
+ }
17
+ }).define(async (ctx) => {
18
+ const url = ctx.query?.url;
19
+ if (!url) {
20
+ ctx.throw(400, '缺少 url 参数');
21
+ }
22
+ //
23
+ }).addTo(app);
@@ -1,3 +1,4 @@
1
1
  import './list.ts'
2
2
  import './repo.ts'
3
- import './repo-label.ts'
3
+ import './repo-label.ts'
4
+ import './download.ts'
package/dist/cli-live.js CHANGED
@@ -46,7 +46,7 @@ var __export = (target, all) => {
46
46
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
47
47
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
48
48
 
49
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/constants.js
49
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/constants.js
50
50
  var require_constants = __commonJS((exports, module) => {
51
51
  var BINARY_TYPES = ["nodebuffer", "arraybuffer", "fragments"];
52
52
  var hasBlob = typeof Blob !== "undefined";
@@ -66,7 +66,7 @@ var require_constants = __commonJS((exports, module) => {
66
66
  };
67
67
  });
68
68
 
69
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/buffer-util.js
69
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/buffer-util.js
70
70
  var require_buffer_util = __commonJS((exports, module) => {
71
71
  var { EMPTY_BUFFER } = require_constants();
72
72
  var FastBuffer = Buffer[Symbol.species];
@@ -127,7 +127,7 @@ var require_buffer_util = __commonJS((exports, module) => {
127
127
  };
128
128
  });
129
129
 
130
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/limiter.js
130
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/limiter.js
131
131
  var require_limiter = __commonJS((exports, module) => {
132
132
  var kDone = Symbol("kDone");
133
133
  var kRun = Symbol("kRun");
@@ -159,7 +159,7 @@ var require_limiter = __commonJS((exports, module) => {
159
159
  module.exports = Limiter;
160
160
  });
161
161
 
162
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/permessage-deflate.js
162
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/permessage-deflate.js
163
163
  var require_permessage_deflate = __commonJS((exports, module) => {
164
164
  var zlib = __require("zlib");
165
165
  var bufferUtil = require_buffer_util();
@@ -423,7 +423,7 @@ var require_permessage_deflate = __commonJS((exports, module) => {
423
423
  }
424
424
  });
425
425
 
426
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/validation.js
426
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/validation.js
427
427
  var require_validation = __commonJS((exports, module) => {
428
428
  var { isUtf8 } = __require("buffer");
429
429
  var { hasBlob } = require_constants();
@@ -603,7 +603,7 @@ var require_validation = __commonJS((exports, module) => {
603
603
  }
604
604
  });
605
605
 
606
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/receiver.js
606
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/receiver.js
607
607
  var require_receiver = __commonJS((exports, module) => {
608
608
  var { Writable } = __require("stream");
609
609
  var PerMessageDeflate = require_permessage_deflate();
@@ -984,7 +984,7 @@ var require_receiver = __commonJS((exports, module) => {
984
984
  module.exports = Receiver;
985
985
  });
986
986
 
987
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/sender.js
987
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/sender.js
988
988
  var require_sender = __commonJS((exports, module) => {
989
989
  var { Duplex } = __require("stream");
990
990
  var { randomFillSync } = __require("crypto");
@@ -1338,7 +1338,7 @@ var require_sender = __commonJS((exports, module) => {
1338
1338
  }
1339
1339
  });
1340
1340
 
1341
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/event-target.js
1341
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/event-target.js
1342
1342
  var require_event_target = __commonJS((exports, module) => {
1343
1343
  var { kForOnEventAttribute, kListener } = require_constants();
1344
1344
  var kCode = Symbol("kCode");
@@ -1489,7 +1489,7 @@ var require_event_target = __commonJS((exports, module) => {
1489
1489
  }
1490
1490
  });
1491
1491
 
1492
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/extension.js
1492
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/extension.js
1493
1493
  var require_extension = __commonJS((exports, module) => {
1494
1494
  var { tokenChars } = require_validation();
1495
1495
  function push(dest, name, elem) {
@@ -1654,7 +1654,7 @@ var require_extension = __commonJS((exports, module) => {
1654
1654
  module.exports = { format, parse };
1655
1655
  });
1656
1656
 
1657
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/websocket.js
1657
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/websocket.js
1658
1658
  var require_websocket = __commonJS((exports, module) => {
1659
1659
  var EventEmitter = __require("events");
1660
1660
  var https = __require("https");
@@ -2416,7 +2416,7 @@ var require_websocket = __commonJS((exports, module) => {
2416
2416
  }
2417
2417
  });
2418
2418
 
2419
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/stream.js
2419
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/stream.js
2420
2420
  var require_stream = __commonJS((exports, module) => {
2421
2421
  var WebSocket = require_websocket();
2422
2422
  var { Duplex } = __require("stream");
@@ -2519,7 +2519,7 @@ var require_stream = __commonJS((exports, module) => {
2519
2519
  module.exports = createWebSocketStream;
2520
2520
  });
2521
2521
 
2522
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/subprotocol.js
2522
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/subprotocol.js
2523
2523
  var require_subprotocol = __commonJS((exports, module) => {
2524
2524
  var { tokenChars } = require_validation();
2525
2525
  function parse(header) {
@@ -2564,7 +2564,7 @@ var require_subprotocol = __commonJS((exports, module) => {
2564
2564
  module.exports = { parse };
2565
2565
  });
2566
2566
 
2567
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/websocket-server.js
2567
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/lib/websocket-server.js
2568
2568
  var require_websocket_server = __commonJS((exports, module) => {
2569
2569
  var EventEmitter = __require("events");
2570
2570
  var http = __require("http");
@@ -2866,7 +2866,7 @@ var require_websocket_server = __commonJS((exports, module) => {
2866
2866
  }
2867
2867
  });
2868
2868
 
2869
- // node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/wrapper.mjs
2869
+ // ../../node_modules/.pnpm/@kevisual+ws@8.19.0/node_modules/@kevisual/ws/wrapper.mjs
2870
2870
  var exports_wrapper = {};
2871
2871
  __export(exports_wrapper, {
2872
2872
  default: () => wrapper_default,
@@ -2886,7 +2886,7 @@ var init_wrapper = __esm(() => {
2886
2886
  wrapper_default = import_websocket.default;
2887
2887
  });
2888
2888
 
2889
- // node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/error.js
2889
+ // ../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/error.js
2890
2890
  var require_error = __commonJS((exports) => {
2891
2891
  class CommanderError extends Error {
2892
2892
  constructor(exitCode, code, message) {
@@ -2910,7 +2910,7 @@ var require_error = __commonJS((exports) => {
2910
2910
  exports.InvalidArgumentError = InvalidArgumentError;
2911
2911
  });
2912
2912
 
2913
- // node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/argument.js
2913
+ // ../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/argument.js
2914
2914
  var require_argument = __commonJS((exports) => {
2915
2915
  var { InvalidArgumentError } = require_error();
2916
2916
 
@@ -2990,7 +2990,7 @@ var require_argument = __commonJS((exports) => {
2990
2990
  exports.humanReadableArgName = humanReadableArgName;
2991
2991
  });
2992
2992
 
2993
- // node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/help.js
2993
+ // ../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/help.js
2994
2994
  var require_help = __commonJS((exports) => {
2995
2995
  var { humanReadableArgName } = require_argument();
2996
2996
 
@@ -3347,7 +3347,7 @@ ${itemIndentStr}`);
3347
3347
  exports.stripColor = stripColor;
3348
3348
  });
3349
3349
 
3350
- // node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/option.js
3350
+ // ../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/option.js
3351
3351
  var require_option = __commonJS((exports) => {
3352
3352
  var { InvalidArgumentError } = require_error();
3353
3353
 
@@ -3531,7 +3531,7 @@ var require_option = __commonJS((exports) => {
3531
3531
  exports.DualOptions = DualOptions;
3532
3532
  });
3533
3533
 
3534
- // node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/suggestSimilar.js
3534
+ // ../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/suggestSimilar.js
3535
3535
  var require_suggestSimilar = __commonJS((exports) => {
3536
3536
  var maxDistance = 3;
3537
3537
  function editDistance(a, b) {
@@ -3604,7 +3604,7 @@ var require_suggestSimilar = __commonJS((exports) => {
3604
3604
  exports.suggestSimilar = suggestSimilar;
3605
3605
  });
3606
3606
 
3607
- // node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/command.js
3607
+ // ../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/command.js
3608
3608
  var require_command = __commonJS((exports) => {
3609
3609
  var EventEmitter = __require("node:events").EventEmitter;
3610
3610
  var childProcess = __require("node:child_process");
@@ -4959,7 +4959,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
4959
4959
  exports.useColor = useColor;
4960
4960
  });
4961
4961
 
4962
- // node_modules/.pnpm/commander@14.0.3/node_modules/commander/index.js
4962
+ // ../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/index.js
4963
4963
  var require_commander = __commonJS((exports) => {
4964
4964
  var { Argument } = require_argument();
4965
4965
  var { Command } = require_command();
@@ -5176,7 +5176,7 @@ function createKeepAlive(config) {
5176
5176
  import { readFileSync } from "node:fs";
5177
5177
  import path from "node:path";
5178
5178
 
5179
- // node_modules/.pnpm/commander@14.0.3/node_modules/commander/esm.mjs
5179
+ // ../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/esm.mjs
5180
5180
  var import__ = __toESM(require_commander(), 1);
5181
5181
  var {
5182
5182
  program,