nolo-cli 0.1.32 → 0.1.33

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 (230) hide show
  1. package/README.md +0 -6
  2. package/agent-runtime/agentRecordConfig.ts +2 -0
  3. package/agent-runtime/hostAdapter.ts +1 -0
  4. package/agent-runtime/index.ts +0 -21
  5. package/agent-runtime/localToolPolicy.ts +6 -13
  6. package/agent-runtime/localWorkspaceTools.ts +30 -333
  7. package/agent-runtime/platformChatProvider.ts +1 -4
  8. package/agent-runtime/runtimeToolPolicy.ts +47 -32
  9. package/agentAliases.ts +14 -83
  10. package/agentCommandSupport.ts +3 -6
  11. package/agentInternalCommandEntries.ts +2 -13
  12. package/agentListCommands.ts +19 -28
  13. package/agentMachineCommands.ts +40 -336
  14. package/agentPullCommand.ts +36 -56
  15. package/agentRecordCommands.ts +3 -5
  16. package/agentRecordHelpers.ts +22 -189
  17. package/agentRunCommand.ts +438 -107
  18. package/agentRuntimeLocal.ts +0 -10
  19. package/ai/agent/cliExecutor.ts +19 -323
  20. package/authCommands.ts +2 -36
  21. package/cli/agentAliases.ts +14 -83
  22. package/cli/agentCommandSupport.ts +3 -6
  23. package/cli/agentInternalCommandEntries.ts +2 -13
  24. package/cli/agentListCommands.ts +19 -28
  25. package/cli/agentMachineCommands.ts +40 -336
  26. package/cli/agentPullCommand.ts +36 -56
  27. package/cli/agentRecordCommands.ts +3 -5
  28. package/cli/agentRecordHelpers.ts +22 -189
  29. package/cli/agentRunCommand.ts +438 -107
  30. package/cli/agentRuntimeLocal.ts +0 -10
  31. package/cli/authCommands.ts +2 -36
  32. package/cli/cliEnvHelpers.ts +21 -162
  33. package/cli/client/agentRun.ts +853 -57
  34. package/cli/client/localRuntimeAdapter.ts +22 -159
  35. package/cli/client/streamingOutput.ts +3 -1
  36. package/cli/client/taskRunPrompt.ts +24 -7
  37. package/cli/commandRegistry.ts +2 -3
  38. package/cli/connectorRunArtifact.ts +10 -34
  39. package/cli/connectorWebSocketTarget.ts +6 -10
  40. package/cli/internalCommandEntries.ts +0 -8
  41. package/cli/localRuntimeDb.ts +2 -39
  42. package/cli/machineCommands.ts +189 -190
  43. package/cli/machineDaemonCommands.ts +165 -9
  44. package/cli/machineHeartbeatCommands.ts +2 -1
  45. package/cli/machineStatusCommands.ts +13 -5
  46. package/cli/machineWatchCommands.ts +1 -1
  47. package/cli/machineWsRunDispatch.ts +14 -48
  48. package/cli/machineWsSession.ts +0 -2
  49. package/cli/offlineMarxistsAgentCommand.ts +314 -0
  50. package/cli/runtimeDoctorCommands.ts +69 -18
  51. package/cli/scriptCommandEntries.ts +45 -5
  52. package/cli/tableCommands.ts +133 -33
  53. package/cli/taskRunCommand.ts +211 -16
  54. package/cli/tui/session.ts +372 -43
  55. package/cli/workflowInternalCommandEntries.ts +0 -20
  56. package/cliEnvHelpers.ts +21 -162
  57. package/client/agentConfigResolver.test.ts +2 -0
  58. package/client/agentRun.test.ts +12 -208
  59. package/client/agentRun.ts +853 -57
  60. package/client/localRuntimeAdapter.test.ts +9 -168
  61. package/client/localRuntimeAdapter.ts +22 -159
  62. package/client/localToolPolicy.test.ts +4 -28
  63. package/client/streamingOutput.ts +3 -1
  64. package/client/taskRunPrompt.ts +24 -7
  65. package/commandRegistry.ts +2 -3
  66. package/connectorRunArtifact.ts +10 -34
  67. package/connectorWebSocketTarget.ts +6 -10
  68. package/database/server/db.ts +34 -15
  69. package/internalCommandEntries.ts +0 -8
  70. package/localRuntimeDb.ts +2 -39
  71. package/machineCommands.ts +189 -190
  72. package/machineDaemonCommands.ts +165 -9
  73. package/machineHeartbeatCommands.ts +2 -1
  74. package/machineStatusCommands.ts +13 -5
  75. package/machineWatchCommands.ts +1 -1
  76. package/machineWsRunDispatch.ts +14 -48
  77. package/machineWsSession.ts +0 -2
  78. package/offlineMarxistsAgentCommand.ts +314 -0
  79. package/package.json +49 -193
  80. package/runtimeDoctorCommands.ts +69 -18
  81. package/scriptCommandEntries.ts +45 -5
  82. package/tableCommands.ts +133 -33
  83. package/taskRunCommand.ts +211 -16
  84. package/tui/session.ts +372 -43
  85. package/workflowInternalCommandEntries.ts +0 -20
  86. package/agent-runtime/dialogStatus.ts +0 -139
  87. package/agent-runtime/hostRuntimeConfig.ts +0 -86
  88. package/agentCreateCustomCommands.ts +0 -278
  89. package/agentDialogsCommands.ts +0 -227
  90. package/agentDoctorCommands.ts +0 -203
  91. package/agentRunLocalWorkspace.ts +0 -182
  92. package/agentRunParsing.ts +0 -298
  93. package/agentSuperviseCommands.ts +0 -8
  94. package/agentUnpublishCommands.ts +0 -113
  95. package/ai/agent/agentRunDialogLineage.ts +0 -56
  96. package/ai/policy/types.ts +0 -64
  97. package/ai/skills/skillSummaryMarker.ts +0 -26
  98. package/app/types.ts +0 -358
  99. package/build.ts +0 -16
  100. package/buildPublish.ts +0 -138
  101. package/buildPublishArtifactAssembly.ts +0 -724
  102. package/buildPublishImportAnalysis.ts +0 -242
  103. package/chat/messages/fetchMessages.ts +0 -84
  104. package/chat/messages/types.ts +0 -185
  105. package/cli/agentCreateCustomCommands.ts +0 -278
  106. package/cli/agentDialogsCommands.ts +0 -227
  107. package/cli/agentDoctorCommands.ts +0 -203
  108. package/cli/agentRunLocalWorkspace.ts +0 -182
  109. package/cli/agentRunParsing.ts +0 -298
  110. package/cli/agentSuperviseCommands.ts +0 -8
  111. package/cli/agentUnpublishCommands.ts +0 -113
  112. package/cli/buildPublish.ts +0 -138
  113. package/cli/buildPublishArtifactAssembly.ts +0 -724
  114. package/cli/buildPublishImportAnalysis.ts +0 -242
  115. package/cli/cliIoTypes.ts +0 -3
  116. package/cli/cliRuntimeDoctorReport.ts +0 -193
  117. package/cli/client/agentRunInput.ts +0 -10
  118. package/cli/client/agentRunLocalExecution.ts +0 -124
  119. package/cli/client/agentRunLocalExecutor.ts +0 -179
  120. package/cli/client/agentRunRuntimeSelection.ts +0 -145
  121. package/cli/client/agentRunServerTransport.ts +0 -397
  122. package/cli/client/agentRunTaskRunRecorder.ts +0 -176
  123. package/cli/customCodingAgentFlow.ts +0 -208
  124. package/cli/customCodingAgentRecord.ts +0 -179
  125. package/cli/dialogDataAccess.ts +0 -186
  126. package/cli/dialogInternalCommandEntries.ts +0 -11
  127. package/cli/dialogReadCommands.ts +0 -180
  128. package/cli/dialogReadHelpers.ts +0 -226
  129. package/cli/dialogStatusCommands.ts +0 -123
  130. package/cli/docInternalCommandEntries.ts +0 -20
  131. package/cli/hybridReadHelpers.ts +0 -109
  132. package/cli/machineCommandPrompts.ts +0 -79
  133. package/cli/machineCommandResolution.ts +0 -43
  134. package/cli/noloReadBridgePrompt.ts +0 -16
  135. package/cli/pageCreateCommands.ts +0 -219
  136. package/cli/pageDeleteCommands.ts +0 -167
  137. package/cli/pageReadCommands.ts +0 -151
  138. package/cli/pageUpdateCommands.ts +0 -249
  139. package/cli/pageWriteHelpers.ts +0 -209
  140. package/cli/publishPackage.ts +0 -36
  141. package/cli/runtimeInternalCommandEntries.ts +0 -15
  142. package/cli/runtimePassthroughCommands.ts +0 -22
  143. package/cli/scriptPassthroughHelpers.ts +0 -28
  144. package/cli/secretScanHelpers.ts +0 -31
  145. package/cli/spaceAttachCommands.ts +0 -134
  146. package/cli/spaceCategoryCommands.ts +0 -263
  147. package/cli/spaceCommands.ts +0 -295
  148. package/cli/spaceDeleteCommands.ts +0 -312
  149. package/cli/spaceInternalCommandEntries.ts +0 -21
  150. package/cli/spaceMutationHelpers.ts +0 -135
  151. package/cli/spaceReadCommands.ts +0 -323
  152. package/cli/tableDataOutput.ts +0 -41
  153. package/cli/tableDataSafety.ts +0 -26
  154. package/cli/tableMetaCommands.ts +0 -307
  155. package/cli/tableMutationCommands.ts +0 -266
  156. package/cli/tableQueryParsing.ts +0 -90
  157. package/cli/tableQueryRequest.ts +0 -53
  158. package/cli/taskRunActions.ts +0 -122
  159. package/cli/taskRunParsing.ts +0 -86
  160. package/cli/taskRunPromptShared.ts +0 -55
  161. package/cli/tui/tuiCatalog.ts +0 -22
  162. package/cli/tui/tuiCommandInterpreter.ts +0 -253
  163. package/cli/tui/tuiPresentation.ts +0 -146
  164. package/cliIoTypes.ts +0 -3
  165. package/cliRuntimeDoctorReport.ts +0 -193
  166. package/client/agentRunInput.ts +0 -10
  167. package/client/agentRunLocalExecution.test.ts +0 -123
  168. package/client/agentRunLocalExecution.ts +0 -124
  169. package/client/agentRunLocalExecutor.ts +0 -179
  170. package/client/agentRunRuntimeSelection.test.ts +0 -159
  171. package/client/agentRunRuntimeSelection.ts +0 -145
  172. package/client/agentRunServerTransport.ts +0 -397
  173. package/client/agentRunTaskRunRecorder.ts +0 -176
  174. package/connector-experimental/daemonLauncher.ts +0 -223
  175. package/create/space/spaceKeys.ts +0 -65
  176. package/create/types.ts +0 -21
  177. package/customCodingAgentFlow.ts +0 -208
  178. package/customCodingAgentRecord.ts +0 -179
  179. package/database/keys.ts +0 -765
  180. package/database/server/authorityStoreTypes.ts +0 -31
  181. package/database/server/legacyServerDb.ts +0 -58
  182. package/database/server/levelAuthorityStore.ts +0 -75
  183. package/database/server/memoryAuthorityStore.ts +0 -133
  184. package/database/server/serverStoreFactory.ts +0 -124
  185. package/database/tombstones.ts +0 -52
  186. package/database/utils/ulid.ts +0 -1
  187. package/dialogDataAccess.ts +0 -186
  188. package/dialogInternalCommandEntries.ts +0 -11
  189. package/dialogReadCommands.ts +0 -180
  190. package/dialogReadHelpers.ts +0 -226
  191. package/dialogStatusCommands.ts +0 -123
  192. package/docInternalCommandEntries.ts +0 -20
  193. package/hybridReadHelpers.ts +0 -109
  194. package/machineCommandPrompts.ts +0 -79
  195. package/machineCommandResolution.ts +0 -43
  196. package/noloReadBridgePrompt.ts +0 -16
  197. package/pageCreateCommands.ts +0 -219
  198. package/pageDeleteCommands.ts +0 -167
  199. package/pageReadCommands.ts +0 -151
  200. package/pageUpdateCommands.ts +0 -249
  201. package/pageWriteHelpers.ts +0 -209
  202. package/publishPackage.ts +0 -36
  203. package/runtimeInternalCommandEntries.ts +0 -15
  204. package/runtimePassthroughCommands.ts +0 -22
  205. package/scriptPassthroughHelpers.ts +0 -28
  206. package/secretScanHelpers.ts +0 -31
  207. package/share/helpers.ts +0 -302
  208. package/share/keys.ts +0 -243
  209. package/share/types.ts +0 -100
  210. package/spaceAttachCommands.ts +0 -134
  211. package/spaceCategoryCommands.ts +0 -263
  212. package/spaceCommands.ts +0 -295
  213. package/spaceDeleteCommands.ts +0 -312
  214. package/spaceInternalCommandEntries.ts +0 -21
  215. package/spaceMutationHelpers.ts +0 -135
  216. package/spaceReadCommands.ts +0 -323
  217. package/tableDataOutput.ts +0 -41
  218. package/tableDataSafety.ts +0 -26
  219. package/tableMetaCommands.ts +0 -307
  220. package/tableMutationCommands.ts +0 -266
  221. package/tableQueryParsing.ts +0 -90
  222. package/tableQueryRequest.ts +0 -53
  223. package/taskRunActions.ts +0 -122
  224. package/taskRunParsing.ts +0 -86
  225. package/taskRunPromptShared.ts +0 -55
  226. package/tui/tuiCatalog.ts +0 -22
  227. package/tui/tuiCommandInterpreter.test.ts +0 -169
  228. package/tui/tuiCommandInterpreter.ts +0 -253
  229. package/tui/tuiPresentation.test.ts +0 -154
  230. 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
- };