nolo-cli 0.1.32 → 0.1.34

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 (234) hide show
  1. package/README.md +4 -10
  2. package/agent-runtime/agentRecordConfig.ts +10 -0
  3. package/agent-runtime/hostAdapter.ts +10 -1
  4. package/agent-runtime/index.ts +9 -20
  5. package/agent-runtime/localLoop.ts +49 -2
  6. package/agent-runtime/localToolPolicy.ts +76 -34
  7. package/agent-runtime/localWorkspaceTools.ts +30 -333
  8. package/agent-runtime/openAiCompatibleProvider.ts +7 -3
  9. package/agent-runtime/openAiCompatibleProviderConfig.ts +15 -26
  10. package/agent-runtime/platformChatProvider.ts +47 -73
  11. package/agent-runtime/providerResolution.ts +244 -0
  12. package/agent-runtime/runtimeToolPolicy.ts +77 -29
  13. package/agent-runtime/shellCommandPolicy.ts +120 -0
  14. package/agentAliases.ts +14 -83
  15. package/agentCommandSupport.ts +3 -6
  16. package/agentInternalCommandEntries.ts +4 -13
  17. package/agentListCommands.ts +18 -27
  18. package/agentMachineCommands.ts +40 -336
  19. package/agentPullCommand.ts +30 -55
  20. package/agentRecordCommands.ts +84 -1
  21. package/agentRecordHelpers.ts +102 -186
  22. package/agentRunCommand.ts +438 -107
  23. package/agentRuntimeLocal.ts +2 -9
  24. package/ai/agent/cliExecutor.ts +19 -323
  25. package/ai/tools/toolNameAliases.ts +70 -0
  26. package/authCommands.ts +2 -36
  27. package/cli/agentAliases.ts +14 -83
  28. package/cli/agentCommandSupport.ts +3 -6
  29. package/cli/agentInternalCommandEntries.ts +4 -13
  30. package/cli/agentListCommands.ts +18 -27
  31. package/cli/agentMachineCommands.ts +40 -336
  32. package/cli/agentPullCommand.ts +30 -55
  33. package/cli/agentRecordCommands.ts +84 -1
  34. package/cli/agentRecordHelpers.ts +102 -186
  35. package/cli/agentRunCommand.ts +438 -107
  36. package/cli/agentRuntimeLocal.ts +2 -9
  37. package/cli/authCommands.ts +2 -36
  38. package/cli/cliCommandDispatch.ts +2 -2
  39. package/cli/cliEnvHelpers.ts +34 -107
  40. package/cli/client/agentRun.ts +854 -57
  41. package/cli/client/localRuntimeAdapter.ts +59 -159
  42. package/cli/client/streamingOutput.ts +3 -1
  43. package/cli/client/taskRunPrompt.ts +24 -7
  44. package/cli/commandRegistry.ts +4 -5
  45. package/cli/connectorRunArtifact.ts +10 -34
  46. package/cli/connectorWebSocketTarget.ts +6 -10
  47. package/cli/internalCommandEntries.ts +0 -8
  48. package/cli/localRuntimeDb.ts +2 -39
  49. package/cli/machineCommands.ts +189 -190
  50. package/cli/machineDaemonCommands.ts +165 -9
  51. package/cli/machineHeartbeatCommands.ts +2 -1
  52. package/cli/machineStatusCommands.ts +13 -5
  53. package/cli/machineWatchCommands.ts +1 -1
  54. package/cli/machineWsRunDispatch.ts +30 -44
  55. package/cli/machineWsSession.ts +0 -2
  56. package/cli/offlineMarxistsAgentCommand.ts +314 -0
  57. package/cli/runtimeDoctorCommands.ts +72 -15
  58. package/cli/scriptCommandEntries.ts +45 -5
  59. package/cli/tableCommands.ts +133 -33
  60. package/cli/taskRunCommand.ts +211 -16
  61. package/cli/tui/session.ts +372 -43
  62. package/cli/workflowInternalCommandEntries.ts +0 -20
  63. package/cliCommandDispatch.ts +2 -2
  64. package/cliEnvHelpers.ts +34 -107
  65. package/client/agentConfigResolver.test.ts +2 -0
  66. package/client/agentRun.test.ts +12 -208
  67. package/client/agentRun.ts +854 -57
  68. package/client/localProviderResolver.test.ts +26 -2
  69. package/client/localRuntimeAdapter.test.ts +296 -171
  70. package/client/localRuntimeAdapter.ts +59 -159
  71. package/client/localToolPolicy.test.ts +4 -28
  72. package/client/streamingOutput.ts +3 -1
  73. package/client/taskRunPrompt.ts +24 -7
  74. package/commandRegistry.ts +4 -5
  75. package/connectorRunArtifact.ts +10 -34
  76. package/connectorWebSocketTarget.ts +6 -10
  77. package/database/server/serverStoreFactory.ts +2 -8
  78. package/internalCommandEntries.ts +0 -8
  79. package/localRuntimeDb.ts +2 -39
  80. package/machineCommands.ts +189 -190
  81. package/machineDaemonCommands.ts +165 -9
  82. package/machineHeartbeatCommands.ts +2 -1
  83. package/machineStatusCommands.ts +13 -5
  84. package/machineWatchCommands.ts +1 -1
  85. package/machineWsRunDispatch.ts +30 -44
  86. package/machineWsSession.ts +0 -2
  87. package/offlineMarxistsAgentCommand.ts +314 -0
  88. package/package.json +52 -188
  89. package/runtimeDoctorCommands.ts +72 -15
  90. package/scriptCommandEntries.ts +45 -5
  91. package/tableCommands.ts +133 -33
  92. package/taskRunCommand.ts +211 -16
  93. package/tui/session.ts +372 -43
  94. package/workflowInternalCommandEntries.ts +0 -20
  95. package/agent-runtime/dialogStatus.ts +0 -139
  96. package/agent-runtime/hostRuntimeConfig.ts +0 -86
  97. package/agentCreateCustomCommands.ts +0 -278
  98. package/agentDialogsCommands.ts +0 -227
  99. package/agentDoctorCommands.ts +0 -203
  100. package/agentRunLocalWorkspace.ts +0 -182
  101. package/agentRunParsing.ts +0 -298
  102. package/agentSuperviseCommands.ts +0 -8
  103. package/agentUnpublishCommands.ts +0 -113
  104. package/ai/agent/agentRunDialogLineage.ts +0 -56
  105. package/ai/policy/types.ts +0 -64
  106. package/ai/skills/skillSummaryMarker.ts +0 -26
  107. package/app/types.ts +0 -358
  108. package/build.ts +0 -16
  109. package/buildPublish.ts +0 -138
  110. package/buildPublishArtifactAssembly.ts +0 -724
  111. package/buildPublishImportAnalysis.ts +0 -242
  112. package/chat/messages/fetchMessages.ts +0 -84
  113. package/chat/messages/types.ts +0 -185
  114. package/cli/agentCreateCustomCommands.ts +0 -278
  115. package/cli/agentDialogsCommands.ts +0 -227
  116. package/cli/agentDoctorCommands.ts +0 -203
  117. package/cli/agentRunLocalWorkspace.ts +0 -182
  118. package/cli/agentRunParsing.ts +0 -298
  119. package/cli/agentSuperviseCommands.ts +0 -8
  120. package/cli/agentUnpublishCommands.ts +0 -113
  121. package/cli/buildPublish.ts +0 -138
  122. package/cli/buildPublishArtifactAssembly.ts +0 -724
  123. package/cli/buildPublishImportAnalysis.ts +0 -242
  124. package/cli/cliIoTypes.ts +0 -3
  125. package/cli/cliRuntimeDoctorReport.ts +0 -193
  126. package/cli/client/agentRunInput.ts +0 -10
  127. package/cli/client/agentRunLocalExecution.ts +0 -124
  128. package/cli/client/agentRunLocalExecutor.ts +0 -179
  129. package/cli/client/agentRunRuntimeSelection.ts +0 -145
  130. package/cli/client/agentRunServerTransport.ts +0 -397
  131. package/cli/client/agentRunTaskRunRecorder.ts +0 -176
  132. package/cli/customCodingAgentFlow.ts +0 -208
  133. package/cli/customCodingAgentRecord.ts +0 -179
  134. package/cli/dialogDataAccess.ts +0 -186
  135. package/cli/dialogInternalCommandEntries.ts +0 -11
  136. package/cli/dialogReadCommands.ts +0 -180
  137. package/cli/dialogReadHelpers.ts +0 -226
  138. package/cli/dialogStatusCommands.ts +0 -123
  139. package/cli/docInternalCommandEntries.ts +0 -20
  140. package/cli/hybridReadHelpers.ts +0 -109
  141. package/cli/machineCommandPrompts.ts +0 -79
  142. package/cli/machineCommandResolution.ts +0 -43
  143. package/cli/noloReadBridgePrompt.ts +0 -16
  144. package/cli/pageCreateCommands.ts +0 -219
  145. package/cli/pageDeleteCommands.ts +0 -167
  146. package/cli/pageReadCommands.ts +0 -151
  147. package/cli/pageUpdateCommands.ts +0 -249
  148. package/cli/pageWriteHelpers.ts +0 -209
  149. package/cli/publishPackage.ts +0 -36
  150. package/cli/runtimeInternalCommandEntries.ts +0 -15
  151. package/cli/runtimePassthroughCommands.ts +0 -22
  152. package/cli/scriptPassthroughHelpers.ts +0 -28
  153. package/cli/secretScanHelpers.ts +0 -31
  154. package/cli/spaceAttachCommands.ts +0 -134
  155. package/cli/spaceCategoryCommands.ts +0 -263
  156. package/cli/spaceCommands.ts +0 -295
  157. package/cli/spaceDeleteCommands.ts +0 -312
  158. package/cli/spaceInternalCommandEntries.ts +0 -21
  159. package/cli/spaceMutationHelpers.ts +0 -135
  160. package/cli/spaceReadCommands.ts +0 -323
  161. package/cli/tableDataOutput.ts +0 -41
  162. package/cli/tableDataSafety.ts +0 -26
  163. package/cli/tableMetaCommands.ts +0 -307
  164. package/cli/tableMutationCommands.ts +0 -266
  165. package/cli/tableQueryParsing.ts +0 -90
  166. package/cli/tableQueryRequest.ts +0 -53
  167. package/cli/taskRunActions.ts +0 -122
  168. package/cli/taskRunParsing.ts +0 -86
  169. package/cli/taskRunPromptShared.ts +0 -55
  170. package/cli/tui/tuiCatalog.ts +0 -22
  171. package/cli/tui/tuiCommandInterpreter.ts +0 -253
  172. package/cli/tui/tuiPresentation.ts +0 -146
  173. package/cliIoTypes.ts +0 -3
  174. package/cliRuntimeDoctorReport.ts +0 -193
  175. package/client/agentRunInput.ts +0 -10
  176. package/client/agentRunLocalExecution.test.ts +0 -123
  177. package/client/agentRunLocalExecution.ts +0 -124
  178. package/client/agentRunLocalExecutor.ts +0 -179
  179. package/client/agentRunRuntimeSelection.test.ts +0 -159
  180. package/client/agentRunRuntimeSelection.ts +0 -145
  181. package/client/agentRunServerTransport.ts +0 -397
  182. package/client/agentRunTaskRunRecorder.ts +0 -176
  183. package/connector-experimental/daemonLauncher.ts +0 -223
  184. package/create/space/spaceKeys.ts +0 -65
  185. package/create/types.ts +0 -21
  186. package/customCodingAgentFlow.ts +0 -208
  187. package/customCodingAgentRecord.ts +0 -179
  188. package/database/keys.ts +0 -765
  189. package/database/tombstones.ts +0 -52
  190. package/database/utils/ulid.ts +0 -1
  191. package/dialogDataAccess.ts +0 -186
  192. package/dialogInternalCommandEntries.ts +0 -11
  193. package/dialogReadCommands.ts +0 -180
  194. package/dialogReadHelpers.ts +0 -226
  195. package/dialogStatusCommands.ts +0 -123
  196. package/docInternalCommandEntries.ts +0 -20
  197. package/hybridReadHelpers.ts +0 -109
  198. package/machineCommandPrompts.ts +0 -79
  199. package/machineCommandResolution.ts +0 -43
  200. package/noloReadBridgePrompt.ts +0 -16
  201. package/pageCreateCommands.ts +0 -219
  202. package/pageDeleteCommands.ts +0 -167
  203. package/pageReadCommands.ts +0 -151
  204. package/pageUpdateCommands.ts +0 -249
  205. package/pageWriteHelpers.ts +0 -209
  206. package/publishPackage.ts +0 -36
  207. package/runtimeInternalCommandEntries.ts +0 -15
  208. package/runtimePassthroughCommands.ts +0 -22
  209. package/scriptPassthroughHelpers.ts +0 -28
  210. package/secretScanHelpers.ts +0 -31
  211. package/share/helpers.ts +0 -302
  212. package/share/keys.ts +0 -243
  213. package/share/types.ts +0 -100
  214. package/spaceAttachCommands.ts +0 -134
  215. package/spaceCategoryCommands.ts +0 -263
  216. package/spaceCommands.ts +0 -295
  217. package/spaceDeleteCommands.ts +0 -312
  218. package/spaceInternalCommandEntries.ts +0 -21
  219. package/spaceMutationHelpers.ts +0 -135
  220. package/spaceReadCommands.ts +0 -323
  221. package/tableDataOutput.ts +0 -41
  222. package/tableDataSafety.ts +0 -26
  223. package/tableMetaCommands.ts +0 -307
  224. package/tableMutationCommands.ts +0 -266
  225. package/tableQueryParsing.ts +0 -90
  226. package/tableQueryRequest.ts +0 -53
  227. package/taskRunActions.ts +0 -122
  228. package/taskRunParsing.ts +0 -86
  229. package/taskRunPromptShared.ts +0 -55
  230. package/tui/tuiCatalog.ts +0 -22
  231. package/tui/tuiCommandInterpreter.test.ts +0 -169
  232. package/tui/tuiCommandInterpreter.ts +0 -253
  233. package/tui/tuiPresentation.test.ts +0 -154
  234. package/tui/tuiPresentation.ts +0 -146
package/database/keys.ts DELETED
@@ -1,765 +0,0 @@
1
- // 文件: database/keys.ts
2
-
3
- /* ===========================================================================
4
- * keys.ts —— 统一的 Key 辅助函数集合
5
- * 1) 通用存储键(row / idx / dir / meta / view /
6
- * 2) 现有业务键(user / tx / token / dialog / page / cybot …)
7
- * 3) 收藏(favorite)相关键(区分 id / key)
8
- * =========================================================================*/
9
-
10
- import { ulid } from "./utils/ulid";
11
- import { curry } from "rambda";
12
- import { DataType } from "../create/types"; // 枚举:DIALOG / PAGE / CYBOT …
13
-
14
- /* --------------------------------------------------------------------------
15
- * 基础工具
16
- * ------------------------------------------------------------------------*/
17
-
18
- export const SEPARATOR = "-";
19
-
20
- export const createKey = (...parts: (string | number)[]) =>
21
- parts.join(SEPARATOR);
22
-
23
- export const splitKey = (key: string) => key.split(SEPARATOR);
24
-
25
- /**
26
- * 判断一个 dbKey 是否是「表定义(TableMeta)」的 key
27
- * 形如:meta-{tenantId}-{tableId}
28
- */
29
- export const isTableMetaKey = (key: string): boolean => {
30
- const parts = splitKey(key);
31
- return parts.length === 3 && parts[0] === "meta";
32
- };
33
-
34
- /**
35
- * 判断一个 dbKey 是否是 Page 的 key
36
- * 形如:PAGE-{userId}-{pageId}
37
- */
38
- export const isPageKey = (key: string): boolean => {
39
- const parts = splitKey(key);
40
- return parts.length >= 3 && parts[0] === DataType.DOC;
41
- };
42
-
43
- /**
44
- * 判断一个 dbKey 是否是 Dialog 的 key
45
- * 形如:DIALOG-{userId}-{dialogId}
46
- */
47
- export const isDialogKey = (key: string): boolean => {
48
- const parts = splitKey(key);
49
- return parts.length >= 3 && parts[0] === DataType.DIALOG;
50
- };
51
-
52
- export const isTaskKey = (key: string): boolean => {
53
- const parts = splitKey(key);
54
- return parts.length >= 3 && parts[0] === DataType.TASK;
55
- };
56
-
57
- /**
58
- * 判断一个 dbKey 是否是 File/Image 的 key
59
- * 形如:file-{userId}-{fileId} 或 image-{userId}-{imageId}
60
- */
61
- export const isFileKey = (key: string): boolean => {
62
- const parts = splitKey(key);
63
- return (
64
- parts.length >= 3 &&
65
- (parts[0] === DataType.FILE || parts[0] === DataType.IMAGE)
66
- );
67
- };
68
-
69
- /**
70
- * 判断一个 dbKey 是否是 Agent/Cybot 的 key
71
- * 形如:agent-{userId}-{agentId} 或 cybot-{userId}-{agentId}
72
- */
73
- export const isAgentKey = (key: string): boolean => {
74
- const parts = splitKey(key);
75
- return (
76
- parts.length >= 3 &&
77
- (parts[0] === DataType.AGENT || parts[0] === DataType.CYBOT)
78
- );
79
- };
80
-
81
- /**
82
- * 判断一个 dbKey 是否是 App 的 key
83
- * 形如:app-{userId}-{appId}
84
- */
85
- export const isAppKey = (key: string): boolean => {
86
- const parts = splitKey(key);
87
- return parts.length >= 2 && parts[0] === DataType.APP;
88
- };
89
-
90
- /**
91
- * 判断一个 dbKey 是否是 Email 的 key
92
- * 形如:email-{ownerId}-{emailId}
93
- */
94
- export const isEmailKey = (key: string): boolean => {
95
- const parts = splitKey(key);
96
- return parts.length >= 3 && parts[0] === DataType.EMAIL;
97
- };
98
-
99
-
100
- /* --------------------------------------------------------------------------
101
- * 1. 通用存储键 —— 行 / 索引 / 目录 / 元数据 / 视图 / 触发器
102
- * ------------------------------------------------------------------------*/
103
-
104
- /**
105
- * 行主键(表行)
106
- *
107
- * 形如:
108
- * row-{tenantId}-{tableId}-{rowId}
109
- *
110
- * 设计原则:
111
- * - 统一以 "row" 前缀标识实体类型,便于全库扫描时按前缀过滤
112
- * - 以 tenantId 在前、tableId 在后,便于:
113
- * - 按租户导出/删除:row-{tenantId}-
114
- * - 按 (tenantId, tableId) 扫描整张表:row-{tenantId}-{tableId}-
115
- */
116
- export const rowKey = {
117
- /** 生成新行主键 + rowId */
118
- create: (tenantId: string, tableId: string) => {
119
- const rowId = ulid();
120
- return { dbKey: createKey("row", tenantId, tableId, rowId), rowId };
121
- },
122
-
123
- /** 单行键 */
124
- single: (tenantId: string, tableId: string, rowId: string) =>
125
- createKey("row", tenantId, tableId, rowId),
126
-
127
- /** 整张表的范围(gte / lte)—— 供批量操作使用 */
128
- range: (tenantId: string, tableId: string) => {
129
- const start = createKey("row", tenantId, tableId, "");
130
- return {
131
- gte: start,
132
- lte: start + "\uffff",
133
- };
134
- },
135
-
136
- /** 旧接口(start / end)—— 与早期代码兼容 */
137
- rangeOfTable: (tenantId: string, tableId: string) => {
138
- const start = createKey("row", tenantId, tableId, "");
139
- return {
140
- start,
141
- end: start + "\uffff",
142
- };
143
- },
144
-
145
- /** 某个租户的所有行范围 */
146
- rangeOfTenant: (tenantId: string) => {
147
- const start = createKey("row", tenantId, "");
148
- return {
149
- start,
150
- end: start + "\uffff",
151
- };
152
- },
153
- };
154
-
155
- /**
156
- * 二级索引键(表行索引用)
157
- *
158
- * 形如:
159
- * idx-{tenantId}-{tableId}-{indexName}-{indexKey}-{rowId}
160
- *
161
- * 说明:
162
- * - 与 rowKey 一致,tenantId 在前、tableId 在后
163
- * - 某表所有索引:
164
- * prefix: idx-{tenantId}-{tableId}-
165
- * - 某索引名前缀:
166
- * idx-{tenantId}-{tableId}-{indexName}-{indexKeyPrefix}
167
- */
168
- export const idxKey = {
169
- /** 写入单条索引 */
170
- put: (
171
- tenantId: string,
172
- tableId: string,
173
- indexName: string,
174
- indexKey: string,
175
- rowId: string
176
- ) => createKey("idx", tenantId, tableId, indexName, indexKey, rowId),
177
-
178
- /** 某一索引名前缀的范围(start / end)—— 供前缀扫描 */
179
- range: (
180
- tenantId: string,
181
- tableId: string,
182
- indexName: string,
183
- indexKeyPrefix = ""
184
- ) => {
185
- const start = createKey(
186
- "idx",
187
- tenantId,
188
- tableId,
189
- indexName,
190
- indexKeyPrefix
191
- );
192
- return { start, end: start + "\uffff" };
193
- },
194
-
195
- /** 整张表所有索引的范围(gte / lte)—— 供整表删除 */
196
- prefix: (tenantId: string, tableId: string) => {
197
- const start = createKey("idx", tenantId, tableId, "");
198
- return {
199
- gte: start,
200
- lte: start + "\uffff",
201
- };
202
- },
203
-
204
- /** 某个租户的所有索引范围 */
205
- rangeOfTenant: (tenantId: string) => {
206
- const start = createKey("idx", tenantId, "");
207
- return {
208
- start,
209
- end: start + "\uffff",
210
- };
211
- },
212
- };
213
-
214
- /**
215
- * 元数据键(表定义 TableMeta)
216
- *
217
- * 形如:
218
- * meta-{tenantId}-{tableId}
219
- */
220
- export const metaKey = Object.assign(
221
- (tenantId: string, tableId: string) => createKey("meta", tenantId, tableId),
222
- {
223
- /** 某个租户的所有表定义范围 */
224
- rangeOfTenant: (tenantId: string) => {
225
- const start = createKey("meta", tenantId, "");
226
- return {
227
- start,
228
- end: start + "\uffff",
229
- };
230
- },
231
- }
232
- );
233
-
234
- /**
235
- * 视图键(TableView)
236
- *
237
- * 形如:
238
- * view-{tenantId}-{tableId}-{viewId}
239
- *
240
- * 用途:
241
- * - 为某张表定义多个视图(grid / kanban / calendar 等)
242
- * - 视图本身作为独立实体存储,便于按表/租户管理
243
- */
244
- export const viewKey = {
245
- /** 创建一个新视图 key + viewId(由调用方生成或传入) */
246
- create: (tenantId: string, tableId: string, viewId?: string) => {
247
- const id = viewId || ulid();
248
- const dbKey = createKey("view", tenantId, tableId, id);
249
- return { dbKey, id };
250
- },
251
-
252
- /** 某一视图的单键 */
253
- single: (tenantId: string, tableId: string, viewId: string) =>
254
- createKey("view", tenantId, tableId, viewId),
255
-
256
- /** 某张表下面的所有视图范围 */
257
- rangeOfTable: (tenantId: string, tableId: string) => {
258
- const start = createKey("view", tenantId, tableId, "");
259
- return {
260
- start,
261
- end: start + "\uffff",
262
- };
263
- },
264
-
265
- /** 某个租户的所有视图范围 */
266
- rangeOfTenant: (tenantId: string) => {
267
- const start = createKey("view", tenantId, "");
268
- return {
269
- start,
270
- end: start + "\uffff",
271
- };
272
- },
273
- };
274
-
275
-
276
-
277
- /* --------------------------------------------------------------------------
278
- * 2. 业务侧原有键(保持完全兼容)
279
- * ------------------------------------------------------------------------*/
280
-
281
- export const DB_PREFIX = {
282
- USER: "user:",
283
- } as const;
284
-
285
- /* ---- User ---- */
286
- // TODO(keys): 目前 user 相关 key 没有统一的前缀(如 "user-settings-"),
287
- // 将来如果需要按实体类型/租户范围扫描,可以考虑加前缀做一次轻量重构。
288
- export const createUserKey = {
289
- settings: (userId: string) => createKey(userId, "settings"),
290
- profile: (userId: string) => createKey(userId, "profile"),
291
- };
292
-
293
- /**
294
- * 用户级“寄存器 / 指针”key。
295
- *
296
- * 用于存放跨服务器 sticky 的小型决策状态(如默认 space 指针),
297
- * 避免把这类高价值字段长期埋在整份 settings blob 里做粗粒度 LWW。
298
- */
299
- export const createUserPreferenceKey = {
300
- single: (userId: string, preferenceName: string) =>
301
- createKey("user", "pref", userId, preferenceName),
302
- defaultSpace: (userId: string) =>
303
- createKey("user", "pref", userId, "space_default"),
304
- defaultAgent: (userId: string) =>
305
- createKey("user", "pref", userId, "agent_default"),
306
- rangeOfUser: (userId: string) => ({
307
- start: createKey("user", "pref", userId, ""),
308
- end: createKey("user", "pref", userId, "\uffff"),
309
- }),
310
- };
311
-
312
- /* ---- Memory ---- */
313
- export const createMemoryKey = (
314
- ownerType: "user" | "space" | "system",
315
- ownerId: string,
316
- memoryId: string
317
- ) => createKey("mem", ownerType, ownerId, memoryId);
318
-
319
- export const createMemoryOwnerIndexKey = (
320
- ownerType: "user" | "space" | "system",
321
- ownerId: string,
322
- createdAt: string,
323
- memoryId: string
324
- ) => createKey("memidx", "owner", ownerType, ownerId, createdAt, memoryId);
325
-
326
- export const createMemorySubjectKindIndexKey = (
327
- subjectType: "user" | "agent" | "space" | "project" | "system",
328
- subjectId: string,
329
- kind: "episodic" | "semantic" | "procedural",
330
- createdAt: string,
331
- memoryId: string
332
- ) =>
333
- createKey(
334
- "memidx",
335
- "subject",
336
- subjectType,
337
- subjectId,
338
- kind,
339
- createdAt,
340
- memoryId
341
- );
342
-
343
- export const isMemoryKey = (key: string): boolean => {
344
- const parts = splitKey(key);
345
- return parts.length >= 4 && parts[0] === "mem";
346
- };
347
-
348
- export const memoryOwnerRange = (
349
- ownerType: "user" | "space" | "system",
350
- ownerId: string
351
- ) => ({
352
- start: createKey("memidx", "owner", ownerType, ownerId, ""),
353
- end: createKey("memidx", "owner", ownerType, ownerId, "\uffff"),
354
- });
355
-
356
- export const memorySubjectKindRange = (
357
- subjectType: "user" | "agent" | "space" | "project" | "system",
358
- subjectId: string,
359
- kind: "episodic" | "semantic" | "procedural"
360
- ) => ({
361
- start: createKey("memidx", "subject", subjectType, subjectId, kind, ""),
362
- end: createKey("memidx", "subject", subjectType, subjectId, kind, "\uffff"),
363
- });
364
-
365
- /* ---- Transaction ---- */
366
- // TODO(keys): tx 相关 key 目前前缀为 "tx",结构为 tx-{userId}-{txId},
367
- // 与表 row/idx/meta 的租户在前原则基本一致,可以后续统一文档说明。
368
- export const createTransactionKey = {
369
- record: curry((userId: string, txId: string) =>
370
- createKey("tx", userId, txId)
371
- ),
372
- index: (txId: string) => createKey("tx", "index", txId),
373
- range: (userId: string) => ({
374
- start: createKey("tx", userId, ""),
375
- end: createKey("tx", userId, "\uffff"),
376
- }),
377
- };
378
-
379
- /* ---- Token ---- */
380
- // TODO(keys): token 统计相关 key 已经带有 "token" 前缀,整体结构还算统一,
381
- // 将来如果需要按 tenant 维度聚合,再考虑是否引入 tenantId 作为前缀第二位。
382
- export const createTokenKey = {
383
- record: curry((userId: string, timestamp: number) =>
384
- createKey("token", userId, timestamp.toString())
385
- ),
386
- range: (userId: string, timestamp: number) => ({
387
- start: createKey("token", userId, timestamp.toString()),
388
- end: createKey("token", userId, (timestamp + 86_400_000).toString()),
389
- }),
390
- /** 某个用户的所有 Token 记录范围 */
391
- rangeOfUser: (userId: string) => ({
392
- start: createKey("token", userId, ""),
393
- end: createKey("token", userId, "\uffff"),
394
- }),
395
- };
396
-
397
- /* ---- Token Stats ---- */
398
- export const createTokenStatsKey = Object.assign(
399
- (userId: string, dateKey: string) =>
400
- createKey("token", "stats", "day", "user", userId, dateKey),
401
- {
402
- /** 某个用户的所有统计记录范围 */
403
- rangeOfUser: (userId: string) => ({
404
- start: createKey("token", "stats", "day", "user", userId, ""),
405
- end: createKey("token", "stats", "day", "user", userId, "\uffff"),
406
- }),
407
- }
408
- );
409
-
410
- /* ---- Dialog ---- */
411
- // TODO(keys): Dialog 相关 key 使用 DataType.DIALOG 前缀,结构为
412
- // DIALOG-{userId}-{dialogId} / DIALOG-{dialogId}-msg-{messageId},
413
- // 已经与其它实体类型的前缀策略对齐,可以保持。
414
- export const createDialogKey = Object.assign(
415
- (userId: string) => createKey(DataType.DIALOG, userId, ulid()),
416
- {
417
- rangeOfUser: (userId: string) => ({
418
- start: createKey(DataType.DIALOG, userId, ""),
419
- end: createKey(DataType.DIALOG, userId, "\uffff"),
420
- }),
421
- }
422
- );
423
-
424
- export const createTaskKey = Object.assign(
425
- (userId: string) => createKey(DataType.TASK, userId, ulid()),
426
- {
427
- rangeOfUser: (userId: string) => ({
428
- start: createKey(DataType.TASK, userId, ""),
429
- end: createKey(DataType.TASK, userId, "\uffff"),
430
- }),
431
- }
432
- );
433
-
434
- /* ---- Notification ---- */
435
- export const createNotificationKey = {
436
- single: (userId: string, notificationId: string) =>
437
- createKey(DataType.NOTIFICATION, userId, notificationId),
438
- rangeOfUser: (userId: string) => ({
439
- start: createKey(DataType.NOTIFICATION, userId, ""),
440
- end: createKey(DataType.NOTIFICATION, userId, "\uffff"),
441
- }),
442
- };
443
-
444
- export const emailKey = {
445
- create: (ownerId: string) => {
446
- const emailId = ulid();
447
- return { dbKey: createKey(DataType.EMAIL, ownerId, emailId), emailId };
448
- },
449
- single: (ownerId: string, emailId: string) =>
450
- createKey(DataType.EMAIL, ownerId, emailId),
451
- rangeOfOwner: (ownerId: string) => ({
452
- start: createKey(DataType.EMAIL, ownerId, ""),
453
- end: createKey(DataType.EMAIL, ownerId, "\uffff"),
454
- }),
455
- };
456
-
457
- export const createDialogMessageKeyAndId = (
458
- dialogId: string,
459
- ulidFn: () => string = ulid
460
- ): { key: string; messageId: string } => {
461
- const messageId = ulidFn();
462
- const key = createKey(DataType.DIALOG, dialogId, "msg", messageId);
463
- return { key, messageId };
464
- };
465
-
466
- /**
467
- * 某个对话下所有消息的 key 范围
468
- * 形如:DIALOG-{dialogId}-msg-{messageId}
469
- */
470
- export const dialogMessageRange = (dialogId: string) => ({
471
- start: createKey(DataType.DIALOG, dialogId, "msg", ""),
472
- end: createKey(DataType.DIALOG, dialogId, "msg", "\uffff"),
473
- });
474
-
475
- /* ---- Page ---- */
476
- // TODO(keys): Page key 目前为 PAGE-{userId}-{pageId},与 Dialog 一致,
477
- // 后续如果有“空间 Space 维度”的独立前缀,可以评估是否要引入 spaceId。
478
- export const createPageKey = {
479
- create: (userId: string) => {
480
- const id = ulid();
481
- return { dbKey: createKey(DataType.DOC, userId, id), id };
482
- },
483
- rangeOfUser: (userId: string) => ({
484
- start: createKey(DataType.DOC, userId, ""),
485
- end: createKey(DataType.DOC, userId, "\uffff"),
486
- }),
487
- };
488
-
489
- /* ---- Cybot / Agent ---- */
490
- // TODO(keys): Agent/Cybot 已采用 DataType.CYBOT 前缀 + userId/cybotId,
491
- // 后续如果引入多租户组织层,可以考虑把 orgId 作为第二位前缀。
492
- export const createCybotKey = {
493
- private: curry((userId: string, cybotId: string) =>
494
- createKey(DataType.CYBOT, userId, cybotId)
495
- ),
496
- public: (cybotId: string) => createKey(DataType.CYBOT, "pub", cybotId),
497
- rangeOfUser: (userId: string) => ({
498
- start: createKey(DataType.CYBOT, userId, ""),
499
- end: createKey(DataType.CYBOT, userId, "\uffff"),
500
- }),
501
- };
502
-
503
- /**
504
- * 推荐使用:新的 Agent Key 系列
505
- * 使用 DataType.AGENT ("agent") 前缀
506
- */
507
- export const createAgentKey = {
508
- private: curry((userId: string, agentId: string) =>
509
- createKey(DataType.AGENT, userId, agentId)
510
- ),
511
- public: (agentId: string) => createKey(DataType.AGENT, "pub", agentId),
512
- rangeOfUser: (userId: string) => ({
513
- start: createKey(DataType.AGENT, userId, ""),
514
- end: createKey(DataType.AGENT, userId, "\uffff"),
515
- }),
516
- };
517
-
518
- /**
519
- * 公开 Agent 列表范围(现有)
520
- * CYBOT-pub-{id}
521
- */
522
- export const pubAgentKeys = {
523
- single: (cybotId: string) => createKey(DataType.CYBOT, "pub", cybotId),
524
- list: () => ({
525
- start: createKey(DataType.CYBOT, "pub", ""),
526
- end: createKey(DataType.CYBOT, "pub", "\uffff"),
527
- }),
528
- /** 同时获取 cybot-pub 和 agent-pub 两个前缀的范围 */
529
- allPublicRanges: () => [
530
- {
531
- start: createKey(DataType.CYBOT, "pub", ""),
532
- end: createKey(DataType.CYBOT, "pub", "\uffff"),
533
- },
534
- {
535
- start: createKey(DataType.AGENT, "pub", ""),
536
- end: createKey(DataType.AGENT, "pub", "\uffff"),
537
- },
538
- ],
539
- };
540
-
541
- /* ---- Share (re-exported from share/keys) ---- */
542
- export { shareKey } from "../share/keys";
543
-
544
- /* --------------------------------------------------------------------------
545
- * 3. 收藏(Favorite)相关键 —— 显式区分 id / key
546
- * ------------------------------------------------------------------------*/
547
-
548
- const FAV_PREFIX = "fav";
549
-
550
- // 类型区分:AgentId 是“逻辑 ID”(比如 cybotId),AgentKey 是“存储键 / dbKey”
551
- export type AgentId = string;
552
- export type AgentKey = string;
553
- // TODO(keys): 将来如果 Page/File 也有单独逻辑 ID,可以在这里增加 PageId/FileId 类型。
554
-
555
- /**
556
- * 收藏关系:
557
- *
558
- * 当前实际使用的是「按 agentKey 存」的版本(byKey):
559
- * - Agent:fav-agent-key-{userId}-{agentKey}
560
- * - Page :fav-page-key-{userId}-{pageKey}
561
- *
562
- * 预留了一套「按逻辑 ID 存」的前缀(byId),将来如果有更抽象的逻辑 ID,可以切换到该版本。
563
- */
564
- export const createFavoriteKey = {
565
- /* ---------- Agent 收藏(按 agentKey 存,当前使用) ---------- */
566
-
567
- /**
568
- * 某个用户收藏了某个 Agent 实例(用完整的 agentKey/dbKey)
569
- * key: fav-agent-key-{userId}-{agentKey}
570
- */
571
- agentByKey: (userId: string, agentKey: AgentKey) =>
572
- createKey(FAV_PREFIX, "agent", "key", userId, agentKey),
573
-
574
- /**
575
- * 查询某用户收藏的所有 Agent(基于 agentKey 版本)
576
- * 范围: [fav-agent-key-{userId}-, fav-agent-key-{userId}-\uffff]
577
- */
578
- agentKeyRangeOfUser: (userId: string) => ({
579
- start: createKey(FAV_PREFIX, "agent", "key", userId, ""),
580
- end: createKey(FAV_PREFIX, "agent", "key", userId, "\uffff"),
581
- }),
582
-
583
- userRangeOfAgentKey: (agentKey: AgentKey) => ({
584
- start: createKey(FAV_PREFIX, "agent", "key", "by-agent", agentKey, ""),
585
- end: createKey(FAV_PREFIX, "agent", "key", "by-agent", agentKey, "\uffff"),
586
- }),
587
- agentByKeyReverse: (agentKey: AgentKey, userId: string) =>
588
- createKey(FAV_PREFIX, "agent", "key", "by-agent", agentKey, userId),
589
-
590
- /* ---------- Agent 收藏(按 agentId 存,预留,将来可用) ---------- */
591
-
592
- /**
593
- * 某个用户收藏了某个逻辑 AgentId(当前未使用,预留)
594
- * key: fav-agent-id-{userId}-{agentId}
595
- */
596
- agentById: (userId: string, agentId: AgentId) =>
597
- createKey(FAV_PREFIX, "agent", "id", userId, agentId),
598
-
599
- /** 查询某用户收藏的所有 AgentId(预留) */
600
- agentIdRangeOfUser: (userId: string) => ({
601
- start: createKey(FAV_PREFIX, "agent", "id", userId, ""),
602
- end: createKey(FAV_PREFIX, "agent", "id", userId, "\uffff"),
603
- }),
604
-
605
- userRangeOfAgentId: (agentId: AgentId) => ({
606
- start: createKey(FAV_PREFIX, "agent", "id", "by-agent", agentId, ""),
607
- end: createKey(FAV_PREFIX, "agent", "id", "by-agent", agentId, "\uffff"),
608
- }),
609
- agentByIdReverse: (agentId: AgentId, userId: string) =>
610
- createKey(FAV_PREFIX, "agent", "id", "by-agent", agentId, userId),
611
-
612
- /* ---------- Page 收藏(同样区分 key / id,当前可以只用 byKey) ---------- */
613
-
614
- // Page byKey: fav-page-key-{userId}-{pageKey}
615
- pageByKey: (userId: string, pageKey: string) =>
616
- createKey(FAV_PREFIX, "page", "key", userId, pageKey),
617
-
618
- pageKeyRangeOfUser: (userId: string) => ({
619
- start: createKey(FAV_PREFIX, "page", "key", userId, ""),
620
- end: createKey(FAV_PREFIX, "page", "key", userId, "\uffff"),
621
- }),
622
-
623
- userRangeOfPageKey: (pageKey: string) => ({
624
- start: createKey(FAV_PREFIX, "page", "key", "by-page", pageKey, ""),
625
- end: createKey(FAV_PREFIX, "page", "key", "by-page", pageKey, "\uffff"),
626
- }),
627
- pageByKeyReverse: (pageKey: string, userId: string) =>
628
- createKey(FAV_PREFIX, "page", "key", "by-page", pageKey, userId),
629
-
630
- // Page byId(预留)
631
- pageById: (userId: string, pageId: string) =>
632
- createKey(FAV_PREFIX, "page", "id", userId, pageId),
633
-
634
- pageIdRangeOfUser: (userId: string) => ({
635
- start: createKey(FAV_PREFIX, "page", "id", userId, ""),
636
- end: createKey(FAV_PREFIX, "page", "id", userId, "\uffff"),
637
- }),
638
-
639
- userRangeOfPageId: (pageId: string) => ({
640
- start: createKey(FAV_PREFIX, "page", "id", "by-page", pageId, ""),
641
- end: createKey(FAV_PREFIX, "page", "id", "by-page", pageId, "\uffff"),
642
- }),
643
-
644
- pageByIdReverse: (pageId: string, userId: string) =>
645
- createKey(FAV_PREFIX, "page", "id", "by-page", pageId, userId),
646
-
647
- /** 从 dbKey 中解析出目标标识符 (agentKey/agentId/pageKey/pageId) */
648
- getIdentifierFromKey: (key: string) => {
649
- const parts = key.split(SEPARATOR);
650
- // 结构: fav-{type}-{mode}-{userId}-{targetIdentifier...}
651
- return parts.slice(4).join(SEPARATOR);
652
- },
653
- };
654
-
655
- /**
656
- * 收藏统计:
657
- * - Agent byKey:fav-agent-count-key-{agentKey}(当前实际使用)
658
- * - Agent byId :fav-agent-count-id-{agentId}(预留)
659
- * - Page 同理
660
- */
661
- export const createFavoriteStatsKey = {
662
- // 被多少人收藏的 Agent(按 agentKey 统计,当前实际使用)
663
- agentByKey: (agentKey: AgentKey) =>
664
- createKey(FAV_PREFIX, "agent-count", "key", agentKey),
665
-
666
- // 预留:按逻辑 AgentId 统计
667
- agentById: (agentId: AgentId) =>
668
- createKey(FAV_PREFIX, "agent-count", "id", agentId),
669
-
670
- // Page:按 pageKey 统计(预留)
671
- pageByKey: (pageKey: string) =>
672
- createKey(FAV_PREFIX, "page-count", "key", pageKey),
673
-
674
- pageById: (pageId: string) =>
675
- createKey(FAV_PREFIX, "page-count", "id", pageId),
676
- };
677
-
678
-
679
- export const jobKey = {
680
- create: (tenantId: string, jobId?: string) => {
681
- const id = jobId || ulid();
682
- const dbKey = createKey("job", tenantId, id);
683
- return { dbKey, id };
684
- },
685
- single: (tenantId: string, jobId: string) =>
686
- createKey("job", tenantId, jobId),
687
- rangeOfTenant: (tenantId: string) => {
688
- const start = createKey("job", tenantId, "");
689
- return { start, end: start + "\uffff" };
690
- },
691
- };
692
-
693
- /* --------------------------------------------------------------------------
694
- * 4. 文件(Blob / File / Stats)相关 key
695
- * ------------------------------------------------------------------------*/
696
-
697
- /**
698
- * Blob 主记录:
699
- * blob-{sha256}
700
- *
701
- * 说明:
702
- * - 以 sha256 唯一标识物理内容
703
- * - 用于查重和 refCount 管理
704
- */
705
- export const blobKey = (sha256: string): string => createKey("blob", sha256);
706
-
707
- /**
708
- * File 主记录:
709
- * file-{tenantId}-{fileId}
710
- *
711
- * 说明:
712
- * - tenantId 在前,便于按租户范围扫描 / 清理
713
- * - fileId 通常为 ulid
714
- */
715
- export const fileKey = {
716
- single: (tenantId: string, fileId: string): string =>
717
- createKey("file", tenantId, fileId),
718
-
719
- rangeOfTenant: (tenantId: string): { start: string; end: string } => {
720
- const start = createKey("file", tenantId, "");
721
- return {
722
- start,
723
- end: start + "\uffff",
724
- };
725
- },
726
- };
727
-
728
- /**
729
- * File 反查索引:
730
- * file-id-{fileId} -> { tenantId, fileId }
731
- *
732
- * 说明:
733
- * - 便于通过 fileId(URL 里只有这个)快速找到 tenant 维度的主记录
734
- * - 避免通过全库扫描来反查 tenantId
735
- */
736
- export const fileIdIndexKey = (fileId: string): string =>
737
- createKey("file", "id", fileId);
738
-
739
- /** 从 fileKey 中解析出 fileId */
740
- export const getFileIdFromKey = (key: string) => {
741
- const parts = key.split(SEPARATOR);
742
- return parts[2]; // file-{userId}-{fileId}
743
- };
744
-
745
-
746
- /**
747
- * 文件统计:
748
- *
749
- * - 按租户 + 日:
750
- * file-stat-tenant-{tenantId}-{dateKey}
751
- *
752
- * - 按模型 + 日(AI 生成):
753
- * file-stat-model-{modelName}-{dateKey}
754
- *
755
- * 说明:
756
- * - 仅存聚合数字,不重复存 metadata
757
- * - dateKey 建议使用 "YYYYMMDD"
758
- */
759
- export const fileStatKey = {
760
- tenantPerDay: (tenantId: string, dateKey: string): string =>
761
- createKey("file", "stat", "tenant", tenantId, dateKey),
762
-
763
- modelPerDay: (modelName: string, dateKey: string): string =>
764
- createKey("file", "stat", "model", modelName, dateKey),
765
- };