@steerable/agent-shell 0.6.15
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/LICENSE +91 -0
- package/contracts/tool-contract.json +326 -0
- package/dist/attachments.d.ts +41 -0
- package/dist/attachments.js +147 -0
- package/dist/brand.d.ts +24 -0
- package/dist/brand.js +92 -0
- package/dist/host/http-routes.d.ts +21 -0
- package/dist/host/http-routes.js +55 -0
- package/dist/host/ipc.d.ts +11 -0
- package/dist/host/ipc.js +20 -0
- package/dist/host/pack-assembly.d.ts +86 -0
- package/dist/host/pack-assembly.js +32 -0
- package/dist/host/runtime.d.ts +69 -0
- package/dist/host/runtime.js +207 -0
- package/dist/host/visible-terminal-exec.d.ts +21 -0
- package/dist/host/visible-terminal-exec.js +151 -0
- package/dist/hosted-web-search.d.ts +13 -0
- package/dist/hosted-web-search.js +82 -0
- package/dist/image-attachment.d.ts +39 -0
- package/dist/image-attachment.js +133 -0
- package/dist/insights/flush.d.ts +10 -0
- package/dist/insights/flush.js +139 -0
- package/dist/insights/record.d.ts +17 -0
- package/dist/insights/record.js +44 -0
- package/dist/json-store.d.ts +9 -0
- package/dist/json-store.js +22 -0
- package/dist/llm/index.d.ts +23 -0
- package/dist/llm/index.js +105 -0
- package/dist/llm/ollama.d.ts +23 -0
- package/dist/llm/ollama.js +242 -0
- package/dist/llm/openai-compat.d.ts +20 -0
- package/dist/llm/openai-compat.js +199 -0
- package/dist/llm/sidecar-provider.d.ts +37 -0
- package/dist/llm/sidecar-provider.js +163 -0
- package/dist/llm/tool-choice.d.ts +35 -0
- package/dist/llm/tool-choice.js +85 -0
- package/dist/llm/types.d.ts +122 -0
- package/dist/llm/types.js +1 -0
- package/dist/local-backend/agent-capability.d.ts +101 -0
- package/dist/local-backend/agent-capability.js +174 -0
- package/dist/local-backend/ai-title.d.ts +43 -0
- package/dist/local-backend/ai-title.js +173 -0
- package/dist/local-backend/auto-continue-helper.d.ts +80 -0
- package/dist/local-backend/auto-continue-helper.js +83 -0
- package/dist/local-backend/branch-helper.d.ts +24 -0
- package/dist/local-backend/branch-helper.js +27 -0
- package/dist/local-backend/context-compactor.d.ts +81 -0
- package/dist/local-backend/context-compactor.js +213 -0
- package/dist/local-backend/coreloop-stream.d.ts +245 -0
- package/dist/local-backend/coreloop-stream.js +277 -0
- package/dist/local-backend/deferred-detector.d.ts +15 -0
- package/dist/local-backend/deferred-detector.js +124 -0
- package/dist/local-backend/history-helper.d.ts +30 -0
- package/dist/local-backend/history-helper.js +34 -0
- package/dist/local-backend/interrupted-helper.d.ts +29 -0
- package/dist/local-backend/interrupted-helper.js +25 -0
- package/dist/local-backend/live-stream.d.ts +36 -0
- package/dist/local-backend/live-stream.js +23 -0
- package/dist/local-backend/llm-diagnose.d.ts +37 -0
- package/dist/local-backend/llm-diagnose.js +284 -0
- package/dist/local-backend/message-triggers.d.ts +27 -0
- package/dist/local-backend/message-triggers.js +67 -0
- package/dist/local-backend/pack-backend-routes.d.ts +31 -0
- package/dist/local-backend/pack-backend-routes.js +62 -0
- package/dist/local-backend/pack-turn-hooks.d.ts +37 -0
- package/dist/local-backend/pack-turn-hooks.js +67 -0
- package/dist/local-backend/prompt-builder.d.ts +101 -0
- package/dist/local-backend/prompt-builder.js +246 -0
- package/dist/local-backend/regenerate-helper.d.ts +62 -0
- package/dist/local-backend/regenerate-helper.js +75 -0
- package/dist/local-backend/router.d.ts +175 -0
- package/dist/local-backend/router.js +3139 -0
- package/dist/local-backend/skill-install.d.ts +19 -0
- package/dist/local-backend/skill-install.js +71 -0
- package/dist/local-backend/skill-loader.d.ts +92 -0
- package/dist/local-backend/skill-loader.js +146 -0
- package/dist/local-backend/skills/00-identity/SKILL.md +32 -0
- package/dist/local-backend/skills/10-goal/SKILL.md +59 -0
- package/dist/local-backend/skills/11-loop/SKILL.md +71 -0
- package/dist/local-backend/skills/12-create-skill/SKILL.md +88 -0
- package/dist/local-backend/skills/70-plan-mode/SKILL.md +58 -0
- package/dist/local-backend/skills/80-tool-usage/SKILL.md +70 -0
- package/dist/local-backend/skills/81-anti-deferred/SKILL.md +53 -0
- package/dist/local-backend/skills/82-data-grounding/SKILL.md +56 -0
- package/dist/local-backend/skills/85-local-exec/SKILL.md +86 -0
- package/dist/local-backend/skills/86-proactive-coding/SKILL.md +51 -0
- package/dist/local-backend/subagent-profiles.d.ts +30 -0
- package/dist/local-backend/subagent-profiles.js +74 -0
- package/dist/local-backend/task-process.d.ts +12 -0
- package/dist/local-backend/task-process.js +176 -0
- package/dist/local-backend/task-service.d.ts +135 -0
- package/dist/local-backend/task-service.js +565 -0
- package/dist/local-backend/turn-duration.d.ts +2 -0
- package/dist/local-backend/turn-duration.js +9 -0
- package/dist/local-backend/turn-timeline.d.ts +16 -0
- package/dist/local-backend/turn-timeline.js +42 -0
- package/dist/local-backend/worktree-service.d.ts +84 -0
- package/dist/local-backend/worktree-service.js +243 -0
- package/dist/local-edit.d.ts +48 -0
- package/dist/local-edit.js +44 -0
- package/dist/local-executor.d.ts +255 -0
- package/dist/local-executor.js +881 -0
- package/dist/local-script-registry.d.ts +28 -0
- package/dist/local-script-registry.js +63 -0
- package/dist/log.d.ts +13 -0
- package/dist/log.js +12 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +855 -0
- package/dist/mcp-executor.d.ts +45 -0
- package/dist/mcp-executor.js +241 -0
- package/dist/mcp-server-registry.d.ts +104 -0
- package/dist/mcp-server-registry.js +234 -0
- package/dist/preload-default.d.ts +1 -0
- package/dist/preload-default.js +9 -0
- package/dist/preload.cjs +395 -0
- package/dist/preload.d.ts +20 -0
- package/dist/preload.js +411 -0
- package/dist/product-config.d.ts +43 -0
- package/dist/product-config.js +26 -0
- package/dist/project-registry.d.ts +55 -0
- package/dist/project-registry.js +106 -0
- package/dist/project-rules.d.ts +15 -0
- package/dist/project-rules.js +102 -0
- package/dist/runtime.d.ts +62 -0
- package/dist/runtime.js +217 -0
- package/dist/scenario/pack.d.ts +8 -0
- package/dist/scenario/pack.js +1 -0
- package/dist/scenario/registry.d.ts +24 -0
- package/dist/scenario/registry.js +31 -0
- package/dist/server/http-server.d.ts +39 -0
- package/dist/server/http-server.js +361 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +107 -0
- package/dist/server/sse-bus.d.ts +14 -0
- package/dist/server/sse-bus.js +31 -0
- package/dist/shell-adapt.d.ts +21 -0
- package/dist/shell-adapt.js +104 -0
- package/dist/sidecar/boot.d.ts +36 -0
- package/dist/sidecar/boot.js +343 -0
- package/dist/sidecar/egress-hint.d.ts +15 -0
- package/dist/sidecar/egress-hint.js +46 -0
- package/dist/sidecar/egress-proxy.d.ts +183 -0
- package/dist/sidecar/egress-proxy.js +419 -0
- package/dist/sidecar/errors.d.ts +22 -0
- package/dist/sidecar/errors.js +38 -0
- package/dist/sidecar/exec-sandbox.d.ts +48 -0
- package/dist/sidecar/exec-sandbox.js +94 -0
- package/dist/sidecar/handle.d.ts +32 -0
- package/dist/sidecar/handle.js +53 -0
- package/dist/sidecar/index.d.ts +14 -0
- package/dist/sidecar/index.js +13 -0
- package/dist/sidecar/proxy-detect.d.ts +50 -0
- package/dist/sidecar/proxy-detect.js +182 -0
- package/dist/sidecar/reverse-approval.d.ts +55 -0
- package/dist/sidecar/reverse-approval.js +86 -0
- package/dist/sidecar/reverse-ask-user.d.ts +34 -0
- package/dist/sidecar/reverse-ask-user.js +59 -0
- package/dist/sidecar/reverse-spawn.d.ts +19 -0
- package/dist/sidecar/reverse-spawn.js +161 -0
- package/dist/sidecar/reverse-tools.d.ts +29 -0
- package/dist/sidecar/reverse-tools.js +106 -0
- package/dist/sidecar/safety-patterns.d.ts +41 -0
- package/dist/sidecar/safety-patterns.js +157 -0
- package/dist/sidecar/storage-path.d.ts +14 -0
- package/dist/sidecar/storage-path.js +35 -0
- package/dist/sidecar/supervisor.d.ts +218 -0
- package/dist/sidecar/supervisor.js +932 -0
- package/dist/sidecar/types.d.ts +601 -0
- package/dist/sidecar/types.js +1 -0
- package/dist/single-instance.d.ts +11 -0
- package/dist/single-instance.js +21 -0
- package/dist/storage/empty-chats.d.ts +9 -0
- package/dist/storage/empty-chats.js +16 -0
- package/dist/storage/index.d.ts +373 -0
- package/dist/storage/index.js +1158 -0
- package/dist/storage/insights-redact.d.ts +2 -0
- package/dist/storage/insights-redact.js +30 -0
- package/dist/storage/insights-settings.d.ts +53 -0
- package/dist/storage/insights-settings.js +92 -0
- package/dist/storage/llm-settings.d.ts +120 -0
- package/dist/storage/llm-settings.js +233 -0
- package/dist/storage/local-store-singleton.d.ts +28 -0
- package/dist/storage/local-store-singleton.js +38 -0
- package/dist/storage/message-order.d.ts +25 -0
- package/dist/storage/message-order.js +27 -0
- package/dist/storage/pack-migrations.d.ts +22 -0
- package/dist/storage/pack-migrations.js +24 -0
- package/dist/storage/pack-seeds.d.ts +36 -0
- package/dist/storage/pack-seeds.js +42 -0
- package/dist/storage/telemetry-settings.d.ts +38 -0
- package/dist/storage/telemetry-settings.js +59 -0
- package/dist/storage/usage-summary.d.ts +55 -0
- package/dist/storage/usage-summary.js +38 -0
- package/dist/storage/web-search-settings.d.ts +38 -0
- package/dist/storage/web-search-settings.js +74 -0
- package/dist/storage/write-lease.d.ts +26 -0
- package/dist/storage/write-lease.js +74 -0
- package/dist/terminal-manager.d.ts +83 -0
- package/dist/terminal-manager.js +506 -0
- package/dist/tool-router.d.ts +228 -0
- package/dist/tool-router.js +930 -0
- package/dist/tool-search-rank.d.ts +42 -0
- package/dist/tool-search-rank.js +96 -0
- package/package.json +67 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { type LlmSettings } from './llm-settings.js';
|
|
3
|
+
import { type TelemetrySettings } from './telemetry-settings.js';
|
|
4
|
+
import { type WebSearchSettings } from './web-search-settings.js';
|
|
5
|
+
import { type InsightKind, type InsightsProfile, type InsightsSettings, type InsightsSettingsPatch } from './insights-settings.js';
|
|
6
|
+
import { type UsageSummary } from './usage-summary.js';
|
|
7
|
+
export type { UsageModelBucket, UsageSummary } from './usage-summary.js';
|
|
8
|
+
export interface ChatSessionRecord {
|
|
9
|
+
id: string;
|
|
10
|
+
title: string;
|
|
11
|
+
userId: string;
|
|
12
|
+
agentId: string | null;
|
|
13
|
+
/** 项目模式:绑定的项目 id(ProjectRegistry)。null = 无项目对话(不沙箱)。 */
|
|
14
|
+
projectId: string | null;
|
|
15
|
+
createdAt: string;
|
|
16
|
+
updatedAt: string;
|
|
17
|
+
isPinned: boolean;
|
|
18
|
+
systemPrompt: string | null;
|
|
19
|
+
pinnedRefs: unknown[] | null;
|
|
20
|
+
}
|
|
21
|
+
export interface ChatMessageRecord {
|
|
22
|
+
id: string;
|
|
23
|
+
chatId: string;
|
|
24
|
+
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
25
|
+
content: string;
|
|
26
|
+
messageMetadata: string | null;
|
|
27
|
+
createdAt: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ChatAgentRecord {
|
|
30
|
+
id: string;
|
|
31
|
+
slug: string | null;
|
|
32
|
+
name: string;
|
|
33
|
+
icon: string | null;
|
|
34
|
+
color: string | null;
|
|
35
|
+
description: string | null;
|
|
36
|
+
rolePrompt: string | null;
|
|
37
|
+
forbiddenPrompt: string | null;
|
|
38
|
+
/**
|
|
39
|
+
* 勾选的技能(skill `dirName` 或 `name`):正文无条件常驻系统提示词
|
|
40
|
+
* (绕过触发条件与 eager/catalog 分层)。空 = 不钉任何技能。
|
|
41
|
+
*/
|
|
42
|
+
skillIds: string[];
|
|
43
|
+
/**
|
|
44
|
+
* 模型可见工具的准入策略。`allowlist`/`denylist` 是真实限制:每轮工具
|
|
45
|
+
* 列表、`tool_search` 发现结果、以及反向通道的分发复检三处都执行。
|
|
46
|
+
*/
|
|
47
|
+
toolPolicy: {
|
|
48
|
+
mode: 'all' | 'allowlist' | 'denylist';
|
|
49
|
+
tools: string[];
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* true(默认)= 未勾选的技能照旧按触发条件/目录按需加载;
|
|
53
|
+
* false = 只允许 {@link skillIds} 里的技能(硬白名单,注入、目录、
|
|
54
|
+
* `/技能名` 显式触发三处都拦)。
|
|
55
|
+
*/
|
|
56
|
+
allowExternalSkills: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* true = 无视技能的触发条件全量加载(内置「智能助手」的行为)。
|
|
59
|
+
* 与 `allowExternalSkills: false` 同时设置时白名单仍然优先。
|
|
60
|
+
*/
|
|
61
|
+
loadAllSkills: boolean;
|
|
62
|
+
isBuiltin: boolean;
|
|
63
|
+
isArchived: boolean;
|
|
64
|
+
sortOrder: number;
|
|
65
|
+
createdAt: string;
|
|
66
|
+
updatedAt: string;
|
|
67
|
+
}
|
|
68
|
+
export interface HarnessTraceRecord {
|
|
69
|
+
id: string;
|
|
70
|
+
chatId: string;
|
|
71
|
+
messageId: string | null;
|
|
72
|
+
startedAtMs: number;
|
|
73
|
+
durationMs: number | null;
|
|
74
|
+
status: string;
|
|
75
|
+
payload: string;
|
|
76
|
+
createdAt: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 跨 turn 后台任务(4.6a)。task_run 工具落一行后立刻返回,任务由宿主的
|
|
80
|
+
* 独立 sidecar 流跑完(不绑父 turn 生命周期),终态回写本表。
|
|
81
|
+
*
|
|
82
|
+
* worktree* 三列是 Task×Worktree 组合(4.6c):worktreeState 仅对
|
|
83
|
+
* worktree 任务有意义——任务终态后 'pending'(等待用户合并/丢弃),
|
|
84
|
+
* 操作后落 'merged' / 'discarded'。
|
|
85
|
+
*/
|
|
86
|
+
export interface TaskRecord {
|
|
87
|
+
id: string;
|
|
88
|
+
chatId: string;
|
|
89
|
+
/** 完整的任务指令(模型给的 task 原文)。 */
|
|
90
|
+
task: string;
|
|
91
|
+
/** blocked = 依赖未就绪,等调度点火(依赖任务全部 completed 后自动转 running)。 */
|
|
92
|
+
status: 'blocked' | 'running' | 'completed' | 'failed';
|
|
93
|
+
answer: string | null;
|
|
94
|
+
error: string | null;
|
|
95
|
+
worktreePath: string | null;
|
|
96
|
+
worktreeBranch: string | null;
|
|
97
|
+
worktreeState: 'pending' | 'merged' | 'discarded' | null;
|
|
98
|
+
/** sidecar durable record id(task:<id>),trace.fetch / 排障用。 */
|
|
99
|
+
recordId: string | null;
|
|
100
|
+
traceId: string | null;
|
|
101
|
+
/** 编排依赖:本任务等这些 taskId 全部 completed 才点火(null = 无依赖,立即点火)。 */
|
|
102
|
+
dependsOn: string[] | null;
|
|
103
|
+
/** 推理时间线 JSON(与主对话 TurnBlock 同形);流过程中回写,重启后可回看。 */
|
|
104
|
+
processJson: string | null;
|
|
105
|
+
createdAt: string;
|
|
106
|
+
updatedAt: string;
|
|
107
|
+
}
|
|
108
|
+
export type { LlmSettings, LlmProvider } from './llm-settings.js';
|
|
109
|
+
export { DEFAULT_SYSTEM_PROMPT } from './llm-settings.js';
|
|
110
|
+
export type { TelemetrySettings, TelemetryPrivacyMode } from './telemetry-settings.js';
|
|
111
|
+
export { DEFAULT_TELEMETRY_SETTINGS, telemetryEnabled, normalizeTelemetryEndpoint, } from './telemetry-settings.js';
|
|
112
|
+
export type { WebSearchSettings, WebSearchProviderId } from './web-search-settings.js';
|
|
113
|
+
export { DEFAULT_WEB_SEARCH_SETTINGS, mergeWebSearchSettings, hostedSearchAvailable, sidecarWebSearchEnv, defaultSearchBaseUrl, } from './web-search-settings.js';
|
|
114
|
+
export type { InsightsSettings, InsightsProfile, InsightKind, InsightsSettingsPatch } from './insights-settings.js';
|
|
115
|
+
export { mergeInsightsSettings, insightsNeedsPrompt, canAutoUpload, rowsEligibleForAutoUpload, resolveInsightsApiBase, } from './insights-settings.js';
|
|
116
|
+
export interface InsightOutboxRow {
|
|
117
|
+
id: string;
|
|
118
|
+
kind: InsightKind;
|
|
119
|
+
payload: Record<string, unknown>;
|
|
120
|
+
createdAt: string;
|
|
121
|
+
uploadedAt: string | null;
|
|
122
|
+
uploadError: string | null;
|
|
123
|
+
}
|
|
124
|
+
declare const INSIGHTS_EXPORT_SCHEMA = "deeppath-agent-insights/v1";
|
|
125
|
+
export declare class LocalStore {
|
|
126
|
+
private readonly db;
|
|
127
|
+
private readonly writeLease;
|
|
128
|
+
constructor();
|
|
129
|
+
/**
|
|
130
|
+
* 场景包存储扩展点:把同一个 SQLite 连接借给包内存储类(各包的
|
|
131
|
+
* <Pack>Store)。包只读写自己 migrations 声明的包前缀表;shell 表结构对包不透明。
|
|
132
|
+
*/
|
|
133
|
+
getPackDb(): Database.Database;
|
|
134
|
+
/**
|
|
135
|
+
* One-time cleanup for rows that became orphaned while `foreign_keys` was
|
|
136
|
+
* off in earlier versions of the app (deleteChat() previously left
|
|
137
|
+
* chat_messages/harness_traces behind for deleted chat_sessions).
|
|
138
|
+
*/
|
|
139
|
+
private cleanupOrphanedRows;
|
|
140
|
+
private migrate;
|
|
141
|
+
private readonly appliedPackMigrations;
|
|
142
|
+
/**
|
|
143
|
+
* 应用尚未应用的已注册包迁移(幂等,按包 id 去重)。
|
|
144
|
+
*/
|
|
145
|
+
applyPackMigrations(): void;
|
|
146
|
+
/**
|
|
147
|
+
* 应用一条包智能体种子(0.3d 的通用机制):
|
|
148
|
+
* 包激活 —— 不存在则种子;命中历史代文案则静默升级到当前代;被归档但
|
|
149
|
+
* 未定制的行重新露出。包缺席 —— 未定制的内置行归档。用户改过的行不动。
|
|
150
|
+
*/
|
|
151
|
+
private applyPackAgentSeed;
|
|
152
|
+
/**
|
|
153
|
+
* SQLite 没有 ADD COLUMN IF NOT EXISTS,先查 PRAGMA 再加列。
|
|
154
|
+
*
|
|
155
|
+
* @returns 本次是否真的加了列(调用方据此做一次性回填)。
|
|
156
|
+
*/
|
|
157
|
+
private ensureColumn;
|
|
158
|
+
private seedDefaults;
|
|
159
|
+
/**
|
|
160
|
+
* `Math.max`/`Math.min` propagate `NaN` instead of clamping it, so a bad
|
|
161
|
+
* caller-supplied value (e.g. `?page=abc` parsed via `Number()`) used to
|
|
162
|
+
* produce a NaN OFFSET/LIMIT and an ill-defined SQL query result. All
|
|
163
|
+
* paginated list methods below route through this to clamp to a sane
|
|
164
|
+
* integer range, falling back to `fallback` for non-finite input.
|
|
165
|
+
*/
|
|
166
|
+
private static clampInt;
|
|
167
|
+
listChats(page?: number, limit?: number): {
|
|
168
|
+
chats: ChatSessionRecord[];
|
|
169
|
+
total: number;
|
|
170
|
+
};
|
|
171
|
+
createChat(title?: string, agentId?: string | null, projectId?: string | null): ChatSessionRecord;
|
|
172
|
+
/**
|
|
173
|
+
* 用调用方给定的 id 建会话(**幂等**:已存在则原样返回,不覆盖)。
|
|
174
|
+
*
|
|
175
|
+
* 会话 URL(`/api/v2/chats/:id/*`、前端 `#/agent/:chatId`)在产品和外部
|
|
176
|
+
* 平台眼里就是「一次会话任务」的身份。本地会话可能因为用户清理、空会话
|
|
177
|
+
* prune、或换机重装而消失,但平台仍会拿原来的 URL 再次运行——首次发送时
|
|
178
|
+
* 按 URL 里的 id 现场补建,才不会把一次本来能跑的任务打断在
|
|
179
|
+
* `chat not found`。
|
|
180
|
+
*/
|
|
181
|
+
createChatWithId(chatId: string, title?: string, agentId?: string | null, projectId?: string | null): ChatSessionRecord;
|
|
182
|
+
/** 删除项目时调用:把该项目下所有会话降级为无项目对话(不删会话)。 */
|
|
183
|
+
clearProjectAssignment(projectId: string): number;
|
|
184
|
+
getChat(chatId: string): ChatSessionRecord | null;
|
|
185
|
+
updateChat(chatId: string, updates: Partial<Pick<ChatSessionRecord, 'title' | 'systemPrompt' | 'pinnedRefs' | 'isPinned' | 'projectId'>>): ChatSessionRecord | null;
|
|
186
|
+
deleteChat(chatId: string): boolean;
|
|
187
|
+
chatHasMessages(chatId: string): boolean;
|
|
188
|
+
/**
|
|
189
|
+
* Drop a chat that never received a message. Used when the user leaves a
|
|
190
|
+
* "新对话" composer without sending — empty sessions must not stay in the
|
|
191
|
+
* sidebar. Missing or already-populated chats are a no-op (`false`).
|
|
192
|
+
*/
|
|
193
|
+
deleteChatIfEmpty(chatId: string): boolean;
|
|
194
|
+
/**
|
|
195
|
+
* Delete every session with zero messages, optionally keeping `exceptChatId`
|
|
196
|
+
* (the open composer). Returns the removed ids.
|
|
197
|
+
*/
|
|
198
|
+
deleteEmptyChats(exceptChatId?: string | null): string[];
|
|
199
|
+
/**
|
|
200
|
+
* W5-2: the chat's ACTIVE durable-record id on the sidecar. Regenerate
|
|
201
|
+
* forks the record (non-destructive — the old tail stays discoverable as
|
|
202
|
+
* a branch), so a chat's live record moves from `chatId` to its branch;
|
|
203
|
+
* null means the chatId itself.
|
|
204
|
+
*/
|
|
205
|
+
getChatRecordId(chatId: string): string | null;
|
|
206
|
+
setChatRecordId(chatId: string, recordId: string): void;
|
|
207
|
+
/**
|
|
208
|
+
* W7-1: durable "a turn is in flight" marker, written BEFORE the stream
|
|
209
|
+
* starts and cleared only after the terminal assistant message persists
|
|
210
|
+
* (or the turn fails before any reply could exist). A crash or kill
|
|
211
|
+
* mid-turn never reaches the clear, so a surviving marker is the crash
|
|
212
|
+
* signature — distinct from `completionStatus: 'cancelled' | 'failed'`,
|
|
213
|
+
* which only a live process can write. Cleared AFTER the assistant
|
|
214
|
+
* write, never before: the reverse order would turn a crash in that gap
|
|
215
|
+
* into a lost reply with no recourse, while this order's worst case is a
|
|
216
|
+
* stale marker the detector dismisses once it sees the trailing
|
|
217
|
+
* assistant message.
|
|
218
|
+
*/
|
|
219
|
+
setTurnActive(chatId: string): void;
|
|
220
|
+
clearTurnActive(chatId: string): void;
|
|
221
|
+
getTurnActive(chatId: string): {
|
|
222
|
+
startedAt: string;
|
|
223
|
+
} | null;
|
|
224
|
+
/**
|
|
225
|
+
* Newest first under {@link MESSAGE_ORDER_DESC}, capped at `limit`; callers
|
|
226
|
+
* that want transcript order reverse it.
|
|
227
|
+
*/
|
|
228
|
+
listMessages(chatId: string, limit?: number): ChatMessageRecord[];
|
|
229
|
+
getMessage(chatId: string, messageId: string): ChatMessageRecord | null;
|
|
230
|
+
/**
|
|
231
|
+
* Deletes `messageId` and every message after it in the same chat. Used by
|
|
232
|
+
* regenerate: truncate from the assistant reply being regenerated onward, so
|
|
233
|
+
* the next turn re-runs against the history as it stood right before that
|
|
234
|
+
* reply, instead of appending a new "please regenerate" user turn on top of
|
|
235
|
+
* stale history.
|
|
236
|
+
*
|
|
237
|
+
* "After" is {@link MESSAGE_CUT_FROM_ID}, the same key `listMessages` orders
|
|
238
|
+
* by, so the cut matches what the user sees below the regenerated reply.
|
|
239
|
+
*/
|
|
240
|
+
deleteMessagesFrom(chatId: string, messageId: string): number;
|
|
241
|
+
addMessage(chatId: string, role: ChatMessageRecord['role'], content: string, messageMetadata?: string | null): ChatMessageRecord;
|
|
242
|
+
/**
|
|
243
|
+
* W1.2.1: replace the chat's whole message list with a branch projection.
|
|
244
|
+
* The desktop store is the UI projection of the ACTIVE framework record —
|
|
245
|
+
* switching branches re-projects it. The previous projection is not lost:
|
|
246
|
+
* its source of truth is the framework history record it came from.
|
|
247
|
+
* Timestamps are synthesized (base + index ms) to preserve projection
|
|
248
|
+
* order under the created_at ordering.
|
|
249
|
+
*/
|
|
250
|
+
replaceChatMessages(chatId: string, messages: Array<{
|
|
251
|
+
role: ChatMessageRecord['role'];
|
|
252
|
+
content: string;
|
|
253
|
+
}>): void;
|
|
254
|
+
listChatAgents(includeArchived?: boolean): ChatAgentRecord[];
|
|
255
|
+
getChatAgent(agentId: string): ChatAgentRecord | null;
|
|
256
|
+
createChatAgent(input: Partial<ChatAgentRecord> & {
|
|
257
|
+
name: string;
|
|
258
|
+
}): ChatAgentRecord;
|
|
259
|
+
updateChatAgent(agentId: string, updates: Partial<ChatAgentRecord>): ChatAgentRecord | null;
|
|
260
|
+
archiveChatAgent(agentId: string): boolean;
|
|
261
|
+
saveTrace(input: {
|
|
262
|
+
id: string;
|
|
263
|
+
chatId: string;
|
|
264
|
+
messageId?: string | null;
|
|
265
|
+
startedAtMs: number;
|
|
266
|
+
durationMs?: number | null;
|
|
267
|
+
status: string;
|
|
268
|
+
payload: Record<string, unknown>;
|
|
269
|
+
}): HarnessTraceRecord;
|
|
270
|
+
listTracesByChat(chatId: string, limit?: number): HarnessTraceRecord[];
|
|
271
|
+
getTrace(traceId: string): HarnessTraceRecord | null;
|
|
272
|
+
createTask(input: {
|
|
273
|
+
chatId: string;
|
|
274
|
+
task: string;
|
|
275
|
+
worktreePath?: string | null;
|
|
276
|
+
worktreeBranch?: string | null;
|
|
277
|
+
recordId?: string | null;
|
|
278
|
+
/** 编排依赖(taskId 列表);非空且未就绪时初始状态为 blocked 而非 running。 */
|
|
279
|
+
dependsOn?: string[] | null;
|
|
280
|
+
/** 初始状态(缺省 running;有未就绪依赖时调用方传 blocked)。 */
|
|
281
|
+
initialStatus?: 'blocked' | 'running';
|
|
282
|
+
}): TaskRecord;
|
|
283
|
+
getTask(taskId: string): TaskRecord | null;
|
|
284
|
+
/** 按 chat 列任务(updated_at 新→旧);chatId 缺省时列全部(任务面板的全局视图)。 */
|
|
285
|
+
listTasks(chatId?: string, limit?: number): TaskRecord[];
|
|
286
|
+
/**
|
|
287
|
+
* 终态/进度回写。只写传入的字段(undefined 过滤),updated_at 总是刷新。
|
|
288
|
+
* 与 updateChat 同约定:显式传 null 才是置空。
|
|
289
|
+
*/
|
|
290
|
+
updateTask(taskId: string, updates: Partial<Pick<TaskRecord, 'status' | 'answer' | 'error' | 'worktreeState' | 'traceId' | 'recordId'>>): TaskRecord | null;
|
|
291
|
+
/**
|
|
292
|
+
* 回写推理时间线。故意不碰 updated_at——流过程中的增量不应把任务
|
|
293
|
+
* 面板按「最近活动」反复顶到最上。
|
|
294
|
+
*/
|
|
295
|
+
saveTaskProcess(taskId: string, processJson: string): void;
|
|
296
|
+
/**
|
|
297
|
+
* 启动清扫:running 任务只可能属于上一个已死的进程(任务流不跨进程
|
|
298
|
+
* 存活),全部落成 failed/interrupted——与 W7-1 turn_active 检测器同
|
|
299
|
+
* 理,残留 running 是崩溃签名,不是真相。
|
|
300
|
+
*/
|
|
301
|
+
failRunningTasks(reason: string): number;
|
|
302
|
+
/**
|
|
303
|
+
* 记录一条用量事件(一轮 chat / 一次标题生成 / 一次摘要压缩等)。
|
|
304
|
+
* `costUsd` 为 null 表示该模型无单价(本地/未知)——存 NULL,面板渲染为 "—"。
|
|
305
|
+
*/
|
|
306
|
+
recordUsageEvent(input: {
|
|
307
|
+
chatId?: string | null;
|
|
308
|
+
kind: string;
|
|
309
|
+
provider?: string | null;
|
|
310
|
+
model?: string | null;
|
|
311
|
+
promptTokens: number;
|
|
312
|
+
completionTokens: number;
|
|
313
|
+
totalTokens: number;
|
|
314
|
+
cachedPromptTokens?: number;
|
|
315
|
+
costUsd?: number | null;
|
|
316
|
+
}): void;
|
|
317
|
+
/**
|
|
318
|
+
* 聚合最近 `sinceDays` 天的用量:按 model 分桶( token 合计 + 成本合计),
|
|
319
|
+
* 外加总计。成本只统计有单价的模型(cost_usd 非 NULL);无单价模型的
|
|
320
|
+
* token 照常计入,但成本列不计。返回按 totalTokens 降序。
|
|
321
|
+
*/
|
|
322
|
+
getUsageSummary(sinceDays?: number): UsageSummary;
|
|
323
|
+
getLlmSettings(): LlmSettings | null;
|
|
324
|
+
setLlmSettings(settings: LlmSettings): LlmSettings;
|
|
325
|
+
/** 读取遥测设置;从未配置过时返回 null(调用方按"关"处理)。 */
|
|
326
|
+
getTelemetrySettings(): TelemetrySettings | null;
|
|
327
|
+
setTelemetrySettings(settings: Partial<TelemetrySettings>): TelemetrySettings;
|
|
328
|
+
getWebSearchSettings(): WebSearchSettings | null;
|
|
329
|
+
setWebSearchSettings(settings: Partial<WebSearchSettings>): WebSearchSettings;
|
|
330
|
+
getInsightsSettings(): InsightsSettings | null;
|
|
331
|
+
ensureInsightsSettings(): InsightsSettings;
|
|
332
|
+
setInsightsSettings(settings: InsightsSettingsPatch): InsightsSettings;
|
|
333
|
+
enqueueInsight(kind: InsightKind, payload: Record<string, unknown>): InsightOutboxRow;
|
|
334
|
+
listInsightOutbox(opts?: {
|
|
335
|
+
uploaded?: boolean;
|
|
336
|
+
kind?: InsightKind;
|
|
337
|
+
limit?: number;
|
|
338
|
+
}): InsightOutboxRow[];
|
|
339
|
+
markInsightUploaded(id: string): void;
|
|
340
|
+
markInsightUploadError(id: string, error: string): void;
|
|
341
|
+
insightStats(): {
|
|
342
|
+
events: number;
|
|
343
|
+
turns: number;
|
|
344
|
+
profile: number;
|
|
345
|
+
pending: number;
|
|
346
|
+
};
|
|
347
|
+
exportInsightsBundle(): {
|
|
348
|
+
schema: typeof INSIGHTS_EXPORT_SCHEMA;
|
|
349
|
+
exportedAt: string;
|
|
350
|
+
installId: string;
|
|
351
|
+
settings: {
|
|
352
|
+
shareBehavior: boolean;
|
|
353
|
+
shareConversation: boolean;
|
|
354
|
+
shareProfile: boolean;
|
|
355
|
+
};
|
|
356
|
+
profile: InsightsProfile;
|
|
357
|
+
stats: {
|
|
358
|
+
events: number;
|
|
359
|
+
turns: number;
|
|
360
|
+
profile: number;
|
|
361
|
+
pending: number;
|
|
362
|
+
};
|
|
363
|
+
records: InsightOutboxRow[];
|
|
364
|
+
};
|
|
365
|
+
private mapInsightOutbox;
|
|
366
|
+
private mapChatSession;
|
|
367
|
+
private mapChatMessage;
|
|
368
|
+
private mapHarnessTrace;
|
|
369
|
+
private mapTask;
|
|
370
|
+
private mapChatAgent;
|
|
371
|
+
private safeJson;
|
|
372
|
+
}
|
|
373
|
+
export declare const localStore: LocalStore;
|