c0de-agent 1.11.0 → 1.13.0
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.
- package/README.md +63 -16
- package/dist/cli/commands/acp.js +26 -8
- package/dist/cli/commands/chat.js +151 -1
- package/dist/cli/commands/config.d.ts +2 -0
- package/dist/cli/commands/config.js +63 -3
- package/dist/cli/commands/serve.js +11 -2
- package/dist/cli/commands/sessions.js +109 -3
- package/dist/cli/commands/trust.d.ts +11 -0
- package/dist/cli/commands/trust.js +31 -0
- package/dist/cli/commands/update.js +4 -0
- package/dist/cli/deps.d.ts +9 -6
- package/dist/cli/deps.js +66 -19
- package/dist/cli/index.d.ts +4 -1
- package/dist/cli/index.js +110 -11
- package/dist/cli/modes/acp.js +39 -8
- package/dist/cli/modes/print.d.ts +3 -0
- package/dist/cli/modes/print.js +78 -8
- package/dist/core/agent.d.ts +1 -1
- package/dist/core/agent.js +9 -4
- package/dist/core/agents/builtin.js +2 -2
- package/dist/core/agents/index.d.ts +0 -1
- package/dist/core/agents/index.js +0 -1
- package/dist/core/compact.d.ts +2 -0
- package/dist/core/compact.js +1 -0
- package/dist/core/config.d.ts +53 -2
- package/dist/core/config.js +235 -19
- package/dist/core/loop/compaction.d.ts +2 -1
- package/dist/core/loop/compaction.js +19 -6
- package/dist/core/loop/segment.d.ts +3 -1
- package/dist/core/loop/segment.js +24 -1
- package/dist/core/loop/stream-collect.js +9 -1
- package/dist/core/loop/subagent.js +88 -37
- package/dist/core/loop.d.ts +7 -0
- package/dist/core/loop.js +90 -6
- package/dist/core/redact.d.ts +11 -0
- package/dist/core/redact.js +49 -0
- package/dist/core/slash.d.ts +10 -0
- package/dist/core/slash.js +237 -65
- package/dist/core/title.js +7 -1
- package/dist/core/types.d.ts +22 -1
- package/dist/core/workflows/context.js +44 -4
- package/dist/core/workflows/discovery.d.ts +2 -2
- package/dist/core/workflows/discovery.js +5 -7
- package/dist/core/workflows/index.d.ts +2 -1
- package/dist/core/workflows/index.js +2 -1
- package/dist/core/workflows/registry.d.ts +13 -3
- package/dist/core/workflows/registry.js +14 -9
- package/dist/core/workflows/resolve.d.ts +22 -0
- package/dist/core/workflows/resolve.js +23 -0
- package/dist/core/workflows/runtime.d.ts +6 -1
- package/dist/core/workflows/runtime.js +19 -2
- package/dist/db/schema.d.ts +373 -1
- package/dist/db/schema.js +60 -4
- package/dist/kanban/index.d.ts +2 -1
- package/dist/kanban/index.js +1 -1
- package/dist/kanban/store.d.ts +87 -1
- package/dist/kanban/store.js +429 -22
- package/dist/llm/index.d.ts +1 -1
- package/dist/llm/index.js +1 -1
- package/dist/llm/provider.js +1 -1
- package/dist/llm/registry.d.ts +7 -1
- package/dist/llm/registry.js +7 -1
- package/dist/llm/retry.d.ts +5 -2
- package/dist/llm/retry.js +6 -5
- package/dist/llm/routing.d.ts +24 -1
- package/dist/llm/routing.js +29 -1
- package/dist/plugins/init.d.ts +7 -0
- package/dist/plugins/init.js +22 -1
- package/dist/plugins/loader.d.ts +7 -1
- package/dist/plugins/loader.js +12 -4
- package/dist/project/index.d.ts +1 -1
- package/dist/project/index.js +1 -1
- package/dist/project/project.d.ts +37 -0
- package/dist/project/project.js +142 -1
- package/dist/project/trust.d.ts +65 -0
- package/dist/project/trust.js +328 -0
- package/dist/server/agent-manager.d.ts +15 -2
- package/dist/server/agent-manager.js +18 -3
- package/dist/server/app.js +45 -30
- package/dist/server/auth-manager.d.ts +26 -9
- package/dist/server/auth-manager.js +78 -42
- package/dist/server/context.js +14 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/middleware/auth.d.ts +11 -1
- package/dist/server/middleware/auth.js +25 -3
- package/dist/server/permission/interactive.d.ts +11 -3
- package/dist/server/permission/interactive.js +23 -4
- package/dist/server/permission/store.d.ts +14 -2
- package/dist/server/permission/store.js +39 -3
- package/dist/server/registry-config.d.ts +14 -0
- package/dist/server/registry-config.js +44 -0
- package/dist/server/routes/auth.js +66 -10
- package/dist/server/routes/chat.d.ts +21 -0
- package/dist/server/routes/chat.js +685 -52
- package/dist/server/routes/commands.d.ts +4 -2
- package/dist/server/routes/commands.js +9 -4
- package/dist/server/routes/config.js +180 -23
- package/dist/server/routes/files.js +142 -28
- package/dist/server/routes/kanban.js +218 -26
- package/dist/server/routes/permissions.d.ts +0 -4
- package/dist/server/routes/permissions.js +140 -7
- package/dist/server/routes/project.js +132 -29
- package/dist/server/routes/provider.js +54 -3
- package/dist/server/routes/session.js +463 -23
- package/dist/server/routes/tool.js +24 -5
- package/dist/server/routes/update.d.ts +11 -5
- package/dist/server/routes/update.js +145 -29
- package/dist/server/routes/usage.d.ts +4 -0
- package/dist/server/routes/usage.js +133 -0
- package/dist/server/routes/workflows.js +476 -87
- package/dist/server/server.d.ts +16 -13
- package/dist/server/server.js +364 -107
- package/dist/server/terminal/pty-manager.d.ts +12 -0
- package/dist/server/terminal/pty-manager.js +63 -7
- package/dist/server/types.d.ts +16 -0
- package/dist/session/archive.d.ts +3 -1
- package/dist/session/archive.js +13 -1
- package/dist/session/branch.d.ts +2 -1
- package/dist/session/branch.js +92 -9
- package/dist/session/context.js +28 -2
- package/dist/session/import.d.ts +44 -0
- package/dist/session/import.js +83 -0
- package/dist/session/index.d.ts +1 -1
- package/dist/session/index.js +1 -1
- package/dist/session/jobs.d.ts +12 -0
- package/dist/session/jobs.js +53 -0
- package/dist/session/message.d.ts +7 -1
- package/dist/session/message.js +21 -1
- package/dist/session/session.d.ts +186 -12
- package/dist/session/session.js +577 -33
- package/dist/session/snapshot.d.ts +5 -2
- package/dist/session/snapshot.js +10 -2
- package/dist/session/types.d.ts +13 -1
- package/dist/session/usage.d.ts +62 -0
- package/dist/session/usage.js +194 -0
- package/dist/shared/types/agent.d.ts +29 -2
- package/dist/shared/types/config.d.ts +64 -5
- package/dist/shared/types/kanban.d.ts +17 -2
- package/dist/shared/types/message.d.ts +23 -0
- package/dist/tools/builtin/kanban.js +13 -2
- package/dist/tools/index.d.ts +14 -3
- package/dist/tools/index.js +23 -5
- package/dist/tools/websearch/index.d.ts +5 -1
- package/dist/tools/websearch/index.js +46 -7
- package/dist/tools/websearch/providers/brave.js +2 -2
- package/dist/tools/websearch/providers/duckduckgo.js +2 -1
- package/dist/tools/websearch/providers/tavily.js +2 -2
- package/dist/tools/websearch/types.d.ts +5 -1
- package/dist/tools/websearch/types.js +7 -1
- package/dist/update/index.d.ts +3 -3
- package/dist/update/index.js +2 -2
- package/dist/update/ipc.d.ts +13 -2
- package/dist/update/ipc.js +36 -2
- package/dist/update/scheduler.js +5 -2
- package/dist/update/snapshot.d.ts +18 -3
- package/dist/update/snapshot.js +5 -2
- package/dist/update/updater.d.ts +17 -1
- package/dist/update/updater.js +47 -18
- package/dist/update/version.d.ts +3 -0
- package/dist/update/version.js +9 -3
- package/drizzle/0008_tranquil_lily_hollister.sql +1 -0
- package/drizzle/0010_usage_events_ledger.sql +17 -0
- package/drizzle/0011_slow_slapstick.sql +12 -0
- package/drizzle/0012_chief_timeslip.sql +1 -0
- package/drizzle/0013_swift_zeigeist.sql +1 -0
- package/drizzle/0014_flimsy_legion.sql +1 -0
- package/drizzle/meta/0008_snapshot.json +875 -0
- package/drizzle/meta/0010_snapshot.json +1010 -0
- package/drizzle/meta/0011_snapshot.json +1055 -0
- package/drizzle/meta/0012_snapshot.json +1062 -0
- package/drizzle/meta/0013_snapshot.json +1068 -0
- package/drizzle/meta/0014_snapshot.json +1075 -0
- package/drizzle/meta/_journal.json +42 -0
- package/package.json +42 -42
- package/dist/core/agents/discovery.d.ts +0 -6
- package/dist/core/agents/discovery.js +0 -96
|
@@ -9,6 +9,12 @@ declare function getMessages(handle: DB, sessionId: string, opts?: {
|
|
|
9
9
|
limit?: number;
|
|
10
10
|
offset?: number;
|
|
11
11
|
}): Promise<Message[]>;
|
|
12
|
+
/**
|
|
13
|
+
* 会话 steering 条目映射为 Message 形态(role='user',内容为 steering part)。
|
|
14
|
+
* 时间线渲染与消息合并使用(P0:追加指令持久化后的展示路径);
|
|
15
|
+
* 不并入 getMessages——compaction/shake/export 等仅处理真实消息的消费者不受影响。
|
|
16
|
+
*/
|
|
17
|
+
declare function getSteeringAsMessages(handle: DB, sessionId: string): Promise<Message[]>;
|
|
12
18
|
/** Count messages in a session. */
|
|
13
19
|
declare function getMessageCount(handle: DB, sessionId: string): Promise<number>;
|
|
14
20
|
/** Delete all messages after the given 0-based index (keeps 0..index inclusive). */
|
|
@@ -19,4 +25,4 @@ declare function getEntries(handle: DB, sessionId: string): Promise<SessionEntry
|
|
|
19
25
|
declare function deleteEntriesByIds(handle: DB, ids: string[]): Promise<void>;
|
|
20
26
|
/** Low-level: insert a raw entry row (for compaction/squash/branch_summary/steering). */
|
|
21
27
|
declare function insertEntry(handle: DB, values: typeof sessionEntries.$inferInsert): Promise<typeof sessionEntries.$inferSelect>;
|
|
22
|
-
export { appendMessage, deleteEntriesByIds, deleteMessagesAfter, getEntries, getMessageCount, getMessages, insertEntry, };
|
|
28
|
+
export { appendMessage, deleteEntriesByIds, deleteMessagesAfter, getEntries, getMessageCount, getMessages, getSteeringAsMessages, insertEntry, };
|
package/dist/session/message.js
CHANGED
|
@@ -104,6 +104,26 @@ async function getMessages(handle, sessionId, opts) {
|
|
|
104
104
|
.offset(opts?.offset ?? 0);
|
|
105
105
|
return rows.map(rowToMessage);
|
|
106
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* 会话 steering 条目映射为 Message 形态(role='user',内容为 steering part)。
|
|
109
|
+
* 时间线渲染与消息合并使用(P0:追加指令持久化后的展示路径);
|
|
110
|
+
* 不并入 getMessages——compaction/shake/export 等仅处理真实消息的消费者不受影响。
|
|
111
|
+
*/
|
|
112
|
+
async function getSteeringAsMessages(handle, sessionId) {
|
|
113
|
+
const rows = await handle.db
|
|
114
|
+
.select()
|
|
115
|
+
.from(sessionEntries)
|
|
116
|
+
.where(and(eq(sessionEntries.sessionId, sessionId), eq(sessionEntries.tag, 'steering')))
|
|
117
|
+
.orderBy(asc(sessionEntries.createdAt));
|
|
118
|
+
return rows.map((row) => ({
|
|
119
|
+
id: row.id,
|
|
120
|
+
sessionId: row.sessionId,
|
|
121
|
+
role: 'user',
|
|
122
|
+
content: [{ _tag: 'steering', text: row.content.text ?? '' }],
|
|
123
|
+
tokenCount: row.tokenCount ?? 0,
|
|
124
|
+
createdAt: toEpochMs(row.createdAt),
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
107
127
|
/** Count messages in a session. */
|
|
108
128
|
async function getMessageCount(handle, sessionId) {
|
|
109
129
|
const [result] = await handle.db
|
|
@@ -142,4 +162,4 @@ async function insertEntry(handle, values) {
|
|
|
142
162
|
throw new Error('Failed to insert entry');
|
|
143
163
|
return row;
|
|
144
164
|
}
|
|
145
|
-
export { appendMessage, deleteEntriesByIds, deleteMessagesAfter, getEntries, getMessageCount, getMessages, insertEntry, };
|
|
165
|
+
export { appendMessage, deleteEntriesByIds, deleteMessagesAfter, getEntries, getMessageCount, getMessages, getSteeringAsMessages, insertEntry, };
|
|
@@ -2,39 +2,179 @@ import type { DB } from '../db/client.js';
|
|
|
2
2
|
import { sessions } from '../db/schema.js';
|
|
3
3
|
import type { LLMSegment } from '../shared/types/agent.js';
|
|
4
4
|
import type { ChatTool } from '../shared/types/llm.js';
|
|
5
|
-
import type { LastRun, Session } from '../shared/types/message.js';
|
|
5
|
+
import type { LastRun, Session, SessionMetadata } from '../shared/types/message.js';
|
|
6
6
|
/** Convert a DB row (with Date timestamps) to the shared Session type (with number timestamps). */
|
|
7
7
|
export declare function rowToSession(row: typeof sessions.$inferSelect): Session;
|
|
8
8
|
/** Create a new root session. */
|
|
9
|
-
declare function createSession(handle: DB, title: string, projectId?: string, agentType?: string, source?: 'web' | 'cli'
|
|
9
|
+
declare function createSession(handle: DB, title: string, projectId?: string, agentType?: string, source?: 'web' | 'cli',
|
|
10
|
+
/** P1 会话树治理:子 agent 会话挂到父会话(树内嵌套 + 删除级联)。 */
|
|
11
|
+
parentId?: string,
|
|
12
|
+
/** 会话工作目录(CLI 会话必填:Web 打开时 agent 工具在该目录执行,而非 serve cwd)。 */
|
|
13
|
+
worktreePath?: string,
|
|
14
|
+
/** 初始 metadata(如工作流运行会话记录 workflowName,供中断恢复指引展示)。 */
|
|
15
|
+
metadata?: Record<string, unknown>): Promise<Session>;
|
|
16
|
+
/**
|
|
17
|
+
* Web 会话树可见性条件:web 会话(source 为 null/web)或「持久的 CLI 会话」。
|
|
18
|
+
* 一次性 CLI print 会话与 CLI 来源的 workflow 会话是临时数据,隐藏;
|
|
19
|
+
* Web 来源的 workflow 会话(source=null)在树中可见(标题带时间戳)。
|
|
20
|
+
* 两类临时会话到期后统一**移入回收站**(purgeTemporarySessions),不再物理清除——
|
|
21
|
+
* 可见节点(含其子 agent 会话)享有 60 天可恢复承诺。
|
|
22
|
+
* --continue 续接后 agentType 已清除(upgradeTemporarySession),即对 Web 可见。
|
|
23
|
+
*/
|
|
24
|
+
export declare function webVisibleSessionCondition(): import("drizzle-orm").SQL<unknown> | undefined;
|
|
10
25
|
/** Get a session by id, or null if not found. */
|
|
11
26
|
declare function getSession(handle: DB, id: string): Promise<Session | null>;
|
|
12
|
-
/** List all active sessions
|
|
27
|
+
/** List all active sessions(未软删除、Web 树可见:web 会话 + 持久化 CLI 会话)。 */
|
|
13
28
|
declare function listSessions(handle: DB): Promise<Session[]>;
|
|
14
29
|
/** 列出所有未软删除会话(含 CLI 来源;供 ACP/CLI 等非 Web 消费者使用)。 */
|
|
15
30
|
declare function listAllSessions(handle: DB): Promise<Session[]>;
|
|
16
|
-
/** List soft-deleted sessions (回收站)
|
|
17
|
-
|
|
31
|
+
/** List soft-deleted sessions (回收站);projectId 提供时仅列出归属该项目的会话
|
|
32
|
+
* (P1-7:回收站此前全库共享,项目 A 的界面能清空项目 B 的删除会话)。 */
|
|
33
|
+
declare function listDeletedSessions(handle: DB, projectId?: string): Promise<Session[]>;
|
|
34
|
+
/** 列出未归属任何项目的已软删除会话(孤儿)。删除项目时 FK set null 使会话失去 projectId,
|
|
35
|
+
* 在任何项目的回收站视图都不可见(F1),需专门的全局视图暴露以便恢复/归巢。 */
|
|
36
|
+
declare function listOrphanDeletedSessions(handle: DB): Promise<Session[]>;
|
|
37
|
+
/**
|
|
38
|
+
* 标记回收站条目「已被用户看到」,记录 metadata.trashSeenAt = now(仅首次,不重置)。
|
|
39
|
+
* 回收站保留期自首次看到起算(见 purgeDeletedSessions)。语义为分组粒度(M1):
|
|
40
|
+
* 一次调用标记 scope 内全部条目——「首次看到」指用户打开该回收站分组,而非逐条
|
|
41
|
+
* 浏览到某个条目;分组内条目同时起算,列表按到期先后置顶展示以补偿该粒度。
|
|
42
|
+
* 软删除时会清除旧标记,恢复后再次删除须重新看到回收站才重新起算——
|
|
43
|
+
* 避免「未重新看到就被过早清空」。
|
|
44
|
+
* scope.orphan=true 时仅标记未归属项目的孤儿会话(与 listOrphanDeletedSessions 对齐);
|
|
45
|
+
* 孤儿标记仅在用户展开「未归属项目」分组时由前端显式调用(POST /deleted/orphans/seen),
|
|
46
|
+
* 避免打开任意项目回收站连带启动无关孤儿条目的倒计时。
|
|
47
|
+
*/
|
|
48
|
+
declare function touchTrashSeen(handle: DB, scope?: {
|
|
49
|
+
projectId?: string;
|
|
50
|
+
orphan?: boolean;
|
|
51
|
+
}): Promise<number>;
|
|
18
52
|
/**
|
|
19
53
|
* 软删除会话(级联其所有 fork 后代)。设置 deletedAt = now;
|
|
20
|
-
*
|
|
54
|
+
* 60 天后由 purgeDeletedSessions 物理清除(到期先标记、宽限 7 天)。
|
|
55
|
+
* A3:同时清除 trashSeenAt/purgePendingAt——恢复后重删的会话必须重新被
|
|
56
|
+
* 用户看到才重新起算,宽限期标记不跨删除周期生效。
|
|
21
57
|
* 会话不存在或已在回收站 → 返回 false(调用方按 404 处理)。
|
|
22
58
|
*/
|
|
23
59
|
declare function softDeleteSession(handle: DB, id: string): Promise<boolean>;
|
|
60
|
+
/**
|
|
61
|
+
* A3:清除回收站倒计时/宽限期标记(软删除与项目删除共用)。
|
|
62
|
+
* 恢复后重删的会话须重新被看到才重新起算;宽限期标记不跨删除周期生效。
|
|
63
|
+
* 无标记时原样返回,避免无谓的 jsonb 覆写。
|
|
64
|
+
*/
|
|
65
|
+
declare function clearTrashMarks(meta: SessionMetadata): SessionMetadata;
|
|
66
|
+
/**
|
|
67
|
+
* 把会话归属到指定项目(P1-2 孤儿会话补救):设置 projectId 与 worktreePath。
|
|
68
|
+
* 会话不存在返回 false。
|
|
69
|
+
*/
|
|
70
|
+
declare function rebindSession(handle: DB, id: string, project: {
|
|
71
|
+
id: string;
|
|
72
|
+
worktree: string;
|
|
73
|
+
}): Promise<boolean>;
|
|
24
74
|
/**
|
|
25
75
|
* 从回收站恢复会话:默认连带恢复其已软删除的祖先链——
|
|
26
76
|
* 否则恢复的会话因父仍在回收站而游离于会话树之外(P2-1:UI 不可达)。
|
|
27
77
|
* 祖先中未删除的(活跃)节点不需要也不应该被改动。
|
|
78
|
+
*
|
|
79
|
+
* P2 修复:删除级联后代入回收站,恢复同样级联还原目标会话的整棵后代子树——
|
|
80
|
+
* 否则「删除根会话 → 恢复根会话」后分支仍滞留回收站且无任何提示,保留期后被清。
|
|
81
|
+
* 兄弟分支(祖先的其他后代)不受影响。
|
|
82
|
+
*/
|
|
83
|
+
export type RestoreResult = {
|
|
84
|
+
restored: boolean;
|
|
85
|
+
/** 为可达性连带还原的祖先会话数量(不含目标会话与其同批次后代)。 */
|
|
86
|
+
restoredAncestorCount: number;
|
|
87
|
+
/** 是否连带还原了与目标非同一次删除批次的祖先(用户早先单独删除的会话)。 */
|
|
88
|
+
crossedBatchAncestor: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* A2:已删除但未随本次恢复的后代数量(删除批次不同——典型场景是项目删除时
|
|
91
|
+
* 各会话批次断裂)。这些 fork 分支滞留在回收站,必须显式告知用户单独恢复,
|
|
92
|
+
* 否则会被静默物理清除。
|
|
93
|
+
*/
|
|
94
|
+
leftBehindDescendantCount: number;
|
|
95
|
+
};
|
|
96
|
+
declare function restoreSessionCore(handle: DB, id: string, opts?: {
|
|
97
|
+
includeDescendants?: boolean;
|
|
98
|
+
}): Promise<RestoreResult>;
|
|
99
|
+
declare function restoreSession(handle: DB, id: string, opts?: {
|
|
100
|
+
includeDescendants?: boolean;
|
|
101
|
+
}): Promise<boolean>;
|
|
102
|
+
/**
|
|
103
|
+
* P2-4:回收站保留期 60 天(原 30 天),自「用户首次在回收站看到该条目」
|
|
104
|
+
* (metadata.trashSeenAt)起算,而非删除时间(墙钟)——否则用户删除后长期不开服务、
|
|
105
|
+
* 重启即被静默物理清除,从未见过任何倒计时。临时会话(CLI print / workflow)保留期
|
|
106
|
+
* 仍为 30 天,见 purgeTemporarySessions。
|
|
107
|
+
*/
|
|
108
|
+
export declare const TRASH_RETENTION_MS: number;
|
|
109
|
+
/**
|
|
110
|
+
* 绝对上限(365 天):自删除起超过此时长的条目,无论是否被看到都进入宽限期清理。
|
|
111
|
+
* 兜底「用户从不开回收站 → trashSeenAt 永不写入 → 条目永不清理」的无界增长死角。
|
|
112
|
+
* 到期仍走先标记(宽限 7 天、UI 显示「即将清除」可恢复)再物理清除的两阶段流程。
|
|
113
|
+
*/
|
|
114
|
+
export declare const TRASH_ABSOLUTE_MAX_MS: number;
|
|
115
|
+
/**
|
|
116
|
+
* A3:到期标记 → 物理清除的宽限期(默认 7 天)。
|
|
117
|
+
* 条目到期后先写 metadata.purgePendingAt,UI 显示「即将清除」并可恢复;
|
|
118
|
+
* 宽限期满才物理清除——杜绝「到期即静默物理清空」的数据丢失死角。
|
|
119
|
+
*/
|
|
120
|
+
export declare const TRASH_PURGE_GRACE_MS: number;
|
|
121
|
+
/** 清除结果:marked = 本次新标记进入宽限期的条目数;deleted = 本次物理清除数。 */
|
|
122
|
+
export type TrashPurgeResult = {
|
|
123
|
+
marked: number;
|
|
124
|
+
deleted: number;
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* 回收站两阶段清理(启动时与每日定时调用):
|
|
128
|
+
* 阶段一:进入保留期截止(首次看到 + 60 天)或绝对上限(删除 + 365 天,无论是否
|
|
129
|
+
* 被看到)且未标记 → 标记 purgePendingAt(进入宽限期,可恢复)。
|
|
130
|
+
* 阶段二:purgePendingAt 早于宽限截止 → 物理清除(子会话先于父,自引用 FK 要求)。
|
|
131
|
+
* 恢复后重删、尚未重新看到的会话按「首次看到 + 60 天」计(绝对上限兜底仍生效)。
|
|
28
132
|
*/
|
|
29
|
-
declare function
|
|
133
|
+
declare function purgeDeletedSessions(handle: DB, retentionMs?: number, graceMs?: number): Promise<TrashPurgeResult>;
|
|
30
134
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
135
|
+
* C4:清理长期空置的 web 会话(无任何条目、无子会话、未删除、创建早于保留期)。
|
|
136
|
+
* 覆盖「新建会话后未发言」的残留:首条消息失败清理依赖前端 JS 执行,
|
|
137
|
+
* 崩溃/断电/离线时必然残留空「New Session」行。CLI 临时会话由 purgeTemporarySessions 负责。
|
|
34
138
|
*/
|
|
35
|
-
declare function
|
|
139
|
+
declare function purgeEmptySessions(handle: DB, retentionMs?: number): Promise<number>;
|
|
36
140
|
/** Update a session's title. */
|
|
37
141
|
declare function updateSessionTitle(handle: DB, id: string, title: string): Promise<void>;
|
|
142
|
+
/**
|
|
143
|
+
* P3-9:物理删除一个「真空会话」——无任何条目且无子会话(首条消息发送失败后
|
|
144
|
+
* 的前端清理路径使用)。非空会话绝不触碰(返回 false),防误删走错回收站语义。
|
|
145
|
+
* 软删除会话(回收站条目)不在本路径处理。
|
|
146
|
+
*/
|
|
147
|
+
declare function purgeEmptySession(handle: DB, id: string): Promise<boolean>;
|
|
148
|
+
/**
|
|
149
|
+
* 彻底删除某个回收站会话及其全部后代(含未软删除的 fork 后代,防御数据异常)。
|
|
150
|
+
* 子会话先于父会话删除(自引用 FK RESTRICT 要求);entries/archives 经 FK cascade 清理。
|
|
151
|
+
* 返回删除数量。会话不存在或不在回收站 → 返回 0。
|
|
152
|
+
*/
|
|
153
|
+
declare function permanentlyDeleteSession(handle: DB, id: string): Promise<number>;
|
|
154
|
+
/** 清空回收站:物理删除所有已软删除会话(子先于父)。返回删除数量。
|
|
155
|
+
* projectId 提供时仅清空该项目(P1-7)。 */
|
|
156
|
+
declare function emptyTrash(handle: DB, projectId?: string): Promise<number>;
|
|
157
|
+
/**
|
|
158
|
+
* 清理过期临时会话(P2 → P1 收紧:仅处理显式标记的临时会话)。
|
|
159
|
+
* - agentType='print':CLI 一次性问答(c0de chat,非 --continue)创建的会话。
|
|
160
|
+
* - agentType='workflow':工作流运行产生的会话。
|
|
161
|
+
* 普通 CLI 会话(ACP)与 --continue 续接的会话(续接时已升级)永不清理——
|
|
162
|
+
* 此前按 source='cli' 全删会把用户显式续接的历史静默物理删除。
|
|
163
|
+
* 保留期默认 30 天。
|
|
164
|
+
*
|
|
165
|
+
* P1(本轮):清理方式从物理删除改为**移入回收站**(softDeleteSession)——
|
|
166
|
+
* 工作流/print 会话的子 agent 会话在 Web 树中可见,此前「30 天到点即物理清除」
|
|
167
|
+
* 让可见节点无回收站保护地凭空消失,与「60 天可恢复」的产品承诺冲突。
|
|
168
|
+
* 软删除级联同批次后代;随后由 purgeDeletedSessions 的两阶段回收站机制
|
|
169
|
+
* (trashSeenAt 60 天 / 绝对上限 365 天 + 7 天宽限)统一兜底。
|
|
170
|
+
* 返回本次移入回收站的会话数。
|
|
171
|
+
*/
|
|
172
|
+
declare function purgeTemporarySessions(handle: DB, retentionMs?: number): Promise<number>;
|
|
173
|
+
/**
|
|
174
|
+
* 把临时会话升级为持久会话(--continue 续接时调用):
|
|
175
|
+
* 清除 print 标记,30 天临时清理不再触及。
|
|
176
|
+
*/
|
|
177
|
+
declare function upgradeTemporarySession(handle: DB, id: string): Promise<void>;
|
|
38
178
|
/** Bump updatedAt to now (used after appending messages). */
|
|
39
179
|
declare function touchSession(handle: DB, id: string): Promise<void>;
|
|
40
180
|
/** 记录会话上次打开时间(用于会话列表按最近打开排序)。 */
|
|
@@ -55,5 +195,39 @@ export declare function getLLMSegments(handle: DB, id: string): Promise<LLMSegme
|
|
|
55
195
|
export declare function saveLLMSegments(handle: DB, id: string, segments: LLMSegment[]): Promise<void>;
|
|
56
196
|
/** 更新会话 metadata.lastRun(agent run 开始/结束时写入;重启后检测中断用)。 */
|
|
57
197
|
declare function updateSessionLastRun(handle: DB, id: string, lastRun: LastRun): Promise<void>;
|
|
198
|
+
/**
|
|
199
|
+
* P2-3:预算超支暂停时把原因写入 metadata.budgetPauseReason。
|
|
200
|
+
* 热更新/重启后 run 重建时由 consumeBudgetPauseMarker 消费——恢复内存
|
|
201
|
+
* budgetPauseTriggered 标记,避免同一超支原因二次暂停。
|
|
202
|
+
*/
|
|
203
|
+
declare function markBudgetPause(handle: DB, id: string, reason: string): Promise<void>;
|
|
204
|
+
/**
|
|
205
|
+
* P2-3:消费预算暂停标记(新 run 启动时调用一次)。返回上次暂停原因并删除字段;
|
|
206
|
+
* 无标记返回 null。消费即删除——单次语义,之后 run 恢复常规预算检查。
|
|
207
|
+
*/
|
|
208
|
+
declare function consumeBudgetPauseMarker(handle: DB, id: string): Promise<string | null>;
|
|
58
209
|
declare function listSessionsByProject(handle: DB, projectId: string): Promise<Session[]>;
|
|
59
|
-
|
|
210
|
+
/**
|
|
211
|
+
* 跨会话搜索(P2-6):标题 + 消息内容子串匹配。
|
|
212
|
+
* 默认仅搜索未软删除的非 CLI 会话(与 Web 会话树一致);projectId 提供时限定项目。
|
|
213
|
+
* opts.includeDeleted=true 时搜索回收站(P3:回收站无搜索,删后找内容只能逐行翻)。
|
|
214
|
+
* 返回 { session, matchedBy: 'title' | 'content' }。
|
|
215
|
+
*/
|
|
216
|
+
declare function searchSessions(handle: DB, query: string, projectId?: string, opts?: {
|
|
217
|
+
includeDeleted?: boolean;
|
|
218
|
+
}): Promise<Array<{
|
|
219
|
+
session: Session;
|
|
220
|
+
matchedBy: 'title' | 'content';
|
|
221
|
+
}>>;
|
|
222
|
+
/**
|
|
223
|
+
* M3:把中断 run 的半截轮次标记为「未完成」——写入 metadata 的
|
|
224
|
+
* (unfinishedSinceEntryId, unfinishedUntilEntryId] 区间。
|
|
225
|
+
* 检测条件:lastRun.status 仍为 running/paused(进程崩溃/重启或热更新交接
|
|
226
|
+
* 未能写入 completed;deliberate abort 由 SSE finally 正常写 completed,不误标)。
|
|
227
|
+
* 边界 = 最后一条含文本的 user 消息;其后的条目全部属中断轮次——
|
|
228
|
+
* 上下文构建剔除(context.ts),前端时间线置灰。
|
|
229
|
+
* 边界已是最后一条 → 无半截内容,跳过标记。
|
|
230
|
+
* 重复中断:区间起点不变(重发不追加 user 消息),终点推进到最新末尾,天然合并。
|
|
231
|
+
*/
|
|
232
|
+
declare function markUnfinishedTurn(handle: DB, sessionId: string): Promise<void>;
|
|
233
|
+
export { clearTrashMarks, consumeBudgetPauseMarker, createSession, emptyTrash, getSession, listAllSessions, listDeletedSessions, listOrphanDeletedSessions, listSessions, listSessionsByProject, markBudgetPause, markUnfinishedTurn, permanentlyDeleteSession, purgeDeletedSessions, purgeEmptySession, purgeEmptySessions, purgeTemporarySessions, rebindSession, restoreSession, restoreSessionCore, searchSessions, softDeleteSession, touchLastOpened, touchSession, touchTrashSeen, updateSessionLastRun, updateSessionTitle, upgradeTemporarySession, };
|