oh-my-opencode-cohub 1.7.0 → 1.8.1
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/dist/cli/config-io.d.ts +1 -1
- package/dist/cli/config-io.d.ts.map +1 -1
- package/dist/cli/index.js +6 -4
- package/dist/context-guard/guardian.d.ts +21 -0
- package/dist/context-guard/guardian.d.ts.map +1 -0
- package/dist/context-guard/index.d.ts +21 -0
- package/dist/context-guard/index.d.ts.map +1 -0
- package/dist/context-guard/menu.d.ts +20 -0
- package/dist/context-guard/menu.d.ts.map +1 -0
- package/dist/context-guard/monitor.d.ts +23 -0
- package/dist/context-guard/monitor.d.ts.map +1 -0
- package/dist/context-guard/options/auto-compress.d.ts +10 -0
- package/dist/context-guard/options/auto-compress.d.ts.map +1 -0
- package/dist/context-guard/options/migrate.d.ts +8 -0
- package/dist/context-guard/options/migrate.d.ts.map +1 -0
- package/dist/context-guard/options/session-compact.d.ts +5 -0
- package/dist/context-guard/options/session-compact.d.ts.map +1 -0
- package/dist/context-guard/prompts.d.ts +22 -0
- package/dist/context-guard/prompts.d.ts.map +1 -0
- package/dist/context-guard/state.d.ts +52 -0
- package/dist/context-guard/state.d.ts.map +1 -0
- package/dist/context-guard/token-counter.d.ts +26 -0
- package/dist/context-guard/token-counter.d.ts.map +1 -0
- package/dist/context-guard/types.d.ts +85 -0
- package/dist/context-guard/types.d.ts.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +757 -372
- package/dist/prompts/guardian.d.ts +2 -0
- package/dist/prompts/guardian.d.ts.map +1 -0
- package/dist/prompts/oracle.d.ts +1 -1
- package/dist/prompts/oracle.d.ts.map +1 -1
- package/dist/prompts/orchestrator.d.ts +1 -1
- package/dist/prompts/orchestrator.d.ts.map +1 -1
- package/dist/task-manager/tracker.d.ts +1 -1
- package/dist/task-manager/tracker.d.ts.map +1 -1
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +2 -1
- package/package.json +1 -1
- package/dist/plan-gate-audit.d.ts +0 -50
- package/dist/plan-gate-audit.d.ts.map +0 -1
- package/dist/plan-gate-audit.test.d.ts +0 -2
- package/dist/plan-gate-audit.test.d.ts.map +0 -1
- package/dist/plan-gate.d.ts +0 -77
- package/dist/plan-gate.d.ts.map +0 -1
- package/dist/plan-gate.test.d.ts +0 -2
- package/dist/plan-gate.test.d.ts.map +0 -1
package/dist/cli/config-io.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export declare function addPluginToTuiConfig(): {
|
|
|
8
8
|
success: boolean;
|
|
9
9
|
message: string;
|
|
10
10
|
};
|
|
11
|
-
/** 将所有
|
|
11
|
+
/** 将所有 13 个 co-* 代理注册到 opencode.json 的 agent 字段 */
|
|
12
12
|
export declare function registerCoHubAgents(): {
|
|
13
13
|
success: boolean;
|
|
14
14
|
message: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-io.d.ts","sourceRoot":"","sources":["../../src/cli/config-io.ts"],"names":[],"mappings":"AA4BA,2CAA2C;AAC3C,wBAAgB,yBAAyB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAajF;AAED,sCAAsC;AACtC,wBAAgB,oBAAoB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAa5E;AAOD,mDAAmD;AACnD,wBAAgB,mBAAmB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"config-io.d.ts","sourceRoot":"","sources":["../../src/cli/config-io.ts"],"names":[],"mappings":"AA4BA,2CAA2C;AAC3C,wBAAgB,yBAAyB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAajF;AAED,sCAAsC;AACtC,wBAAgB,oBAAoB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAa5E;AAOD,mDAAmD;AACnD,wBAAgB,mBAAmB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAoC3E;AAID,uBAAuB;AACvB,wBAAgB,kBAAkB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA2C1E;AAED,8BAA8B;AAC9B,wBAAgB,cAAc,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CA6GzE"}
|
package/dist/cli/index.js
CHANGED
|
@@ -65,7 +65,7 @@ function registerCoHubAgents() {
|
|
|
65
65
|
const agents = config.agent;
|
|
66
66
|
const cohubAgents = {
|
|
67
67
|
"co-orchestrator": { description: "纯调度者", mode: "primary", prompt: `<角色>
|
|
68
|
-
你是纯调度者(Orchestrator)。唯一职责:理解需求 → 委派信息收集 → 制定方案 → 调度子代理执行 → 委派验证。**绝不亲自使用任何文件/代码操作工具**(read、grep、glob、bash、edit、write 等)。可使用的工具是调度工具(task、todowrite
|
|
68
|
+
你是纯调度者(Orchestrator)。唯一职责:理解需求 → 委派信息收集 → 制定方案 → 调度子代理执行 → 委派验证。**绝不亲自使用任何文件/代码操作工具**(read、grep、glob、bash、edit、write 等)。可使用的工具是调度工具(task、todowrite)。
|
|
69
69
|
</角色>
|
|
70
70
|
|
|
71
71
|
<子代理>
|
|
@@ -529,7 +529,8 @@ function registerCoHubAgents() {
|
|
|
529
529
|
- 并行化策略
|
|
530
530
|
- 验证步骤
|
|
531
531
|
|
|
532
|
-
**约束**:只读,不修改文件。方案要具体到文件和操作粒度,不可笼统。用 \`todowrite\` 风格的任务列表输出。`, model: "deepseek/deepseek-v4-pro", variant: "high" }
|
|
532
|
+
**约束**:只读,不修改文件。方案要具体到文件和操作粒度,不可笼统。用 \`todowrite\` 风格的任务列表输出。`, model: "deepseek/deepseek-v4-pro", variant: "high" },
|
|
533
|
+
"co-guardian": { description: "上下文卫士", mode: "subagent", prompt: "你是 Guardian——上下文卫士分析师。在上下文窗口紧张时分析会话状态,推荐最优的上下文处理策略(自动压缩/会话压缩/分析迁移)。只读分析,不修改文件。", model: "deepseek/deepseek-v4-flash", variant: "low" }
|
|
533
534
|
};
|
|
534
535
|
let added = 0;
|
|
535
536
|
for (const [name, agentConfig] of Object.entries(cohubAgents)) {
|
|
@@ -562,7 +563,8 @@ function writeDefaultConfig() {
|
|
|
562
563
|
"co-rule-user": { model: "deepseek/deepseek-v4-flash", variant: "medium" },
|
|
563
564
|
"co-rule-project": { model: "deepseek/deepseek-v4-flash", variant: "medium" },
|
|
564
565
|
"co-rule-app": { model: "deepseek/deepseek-v4-flash", variant: "medium" },
|
|
565
|
-
"co-planner": { model: "deepseek/deepseek-v4-pro", variant: "high" }
|
|
566
|
+
"co-planner": { model: "deepseek/deepseek-v4-pro", variant: "high" },
|
|
567
|
+
"co-guardian": { model: "deepseek/deepseek-v4-flash", variant: "low" }
|
|
566
568
|
},
|
|
567
569
|
council: {
|
|
568
570
|
default_preset: "default",
|
|
@@ -713,7 +715,7 @@ async function main() {
|
|
|
713
715
|
console.log(`
|
|
714
716
|
✅ CoHub 安装完成!`);
|
|
715
717
|
console.log(' 重启 OpenCode 后,TAB 选择 "co-orchestrator" 开始纯调度模式。');
|
|
716
|
-
console.log(" 已注册
|
|
718
|
+
console.log(" 已注册 13 个 co-* 代理到 opencode.json 的 agent 字段。");
|
|
717
719
|
} else if (command === "uninstall") {
|
|
718
720
|
console.log(`\uD83E\uDDF9 CoHub 卸载中...
|
|
719
721
|
`);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** 上下文卫士 - Guardian 分析模块 */
|
|
2
|
+
import type { GuardianRecommendation } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 分析会话状态,返回三选一推荐。
|
|
5
|
+
*
|
|
6
|
+
* @experimental 当前使用启发式分析。
|
|
7
|
+
* 后续计划:接入 co-guardian 子代理做基于 LLM 的深度分析。
|
|
8
|
+
*/
|
|
9
|
+
export declare function analyzeSession(sessionID: string, messages: Array<{
|
|
10
|
+
role: string;
|
|
11
|
+
content: string;
|
|
12
|
+
}>): GuardianRecommendation;
|
|
13
|
+
/**
|
|
14
|
+
* 从 messages.transform 的 output.messages 中提取最近消息摘要
|
|
15
|
+
* 供 analyzeSession 使用
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractRecentMessages(messages: Array<Record<string, unknown>>, maxCount?: number): Array<{
|
|
18
|
+
role: string;
|
|
19
|
+
content: string;
|
|
20
|
+
}>;
|
|
21
|
+
//# sourceMappingURL=guardian.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardian.d.ts","sourceRoot":"","sources":["../../src/context-guard/guardian.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,KAAK,EAAE,sBAAsB,EAAe,MAAM,SAAS,CAAC;AAInE;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACjD,sBAAsB,CAIxB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,QAAQ,SAAK,GACZ,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB1C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ContextGuardConfig } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 初始化上下文卫士
|
|
4
|
+
* 返回需要注册到插件的 hooks 对象
|
|
5
|
+
*/
|
|
6
|
+
export declare function initContextGuard(_client: unknown): {
|
|
7
|
+
/** 更新配置 */
|
|
8
|
+
updateConfig(newConfig: Partial<ContextGuardConfig>): void;
|
|
9
|
+
/** event hook:监控 token 用量,返回 TriggerEvent 而非修改 SDK 对象 */
|
|
10
|
+
event: (input: unknown) => Promise<void>;
|
|
11
|
+
/** chat.params hook:捕获上下文窗口大小 */
|
|
12
|
+
'chat.params': (input: unknown) => Promise<void>;
|
|
13
|
+
/** messages.transform hook:注入三选一菜单 + Guardian 分析 */
|
|
14
|
+
'experimental.chat.messages.transform': (input: unknown, output: unknown) => Promise<void>;
|
|
15
|
+
/** chat.message hook:拦截用户选择,通过 output.parts 变异注入回复 */
|
|
16
|
+
'chat.message': (input: unknown, output: unknown) => Promise<void>;
|
|
17
|
+
getConfig: () => ContextGuardConfig;
|
|
18
|
+
};
|
|
19
|
+
export { type ContextGuardConfig, DEFAULT_GUARD_CONFIG } from './types';
|
|
20
|
+
export { cleanupStaleSessions } from './state';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context-guard/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAIlD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO;IAkB7C,WAAW;4BACa,OAAO,CAAC,kBAAkB,CAAC;IAInD,yDAAyD;mBACpC,OAAO;IAO5B,iCAAiC;2BACJ,OAAO;IAIpC,oDAAoD;oDACE,OAAO,UAAU,OAAO;IAO9E,sDAAsD;4BACxB,OAAO,UAAU,OAAO;;EASzD;AAED,OAAO,EAAE,KAAK,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** 上下文卫士 - 菜单注入 */
|
|
2
|
+
import type { PluginInput } from '@opencode-ai/plugin';
|
|
3
|
+
export declare function setPendingUsage(sessionID: string, usage: {
|
|
4
|
+
usedTokens: number;
|
|
5
|
+
contextLimit: number;
|
|
6
|
+
}): void;
|
|
7
|
+
/**
|
|
8
|
+
* messages.transform hook 处理器:注入三选一菜单 + Guardian 分析
|
|
9
|
+
*/
|
|
10
|
+
export declare function createMessagesTransformHandler(): (_input: PluginInput, output: {
|
|
11
|
+
messages?: Array<Record<string, unknown>>;
|
|
12
|
+
}) => Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* chat.message hook 处理器:拦截用户选项选择
|
|
15
|
+
*/
|
|
16
|
+
export declare function createChatMessageHandler(): (input: PluginInput, output: {
|
|
17
|
+
message?: Record<string, unknown>;
|
|
18
|
+
parts?: Array<Record<string, unknown>>;
|
|
19
|
+
}) => Promise<void>;
|
|
20
|
+
//# sourceMappingURL=menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/context-guard/menu.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAYvD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAE5G;AAmBD;;GAEG;AACH,wBAAgB,8BAA8B,KAC9B,QAAQ,WAAW,EAAE,QAAQ;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,KAAG,OAAO,CAAC,IAAI,CAAC,CAgCzG;AAsBD;;GAEG;AACH,wBAAgB,wBAAwB,KAEpC,OAAO,WAAW,EAClB,QAAQ;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,KACpF,OAAO,CAAC,IAAI,CAAC,CAiDjB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** 上下文卫士 - Token 监控器 */
|
|
2
|
+
import type { PluginInput } from '@opencode-ai/plugin';
|
|
3
|
+
import type { ContextGuardConfig } from './types';
|
|
4
|
+
/** 触发事件(返回值,不再修改 SDK 对象) */
|
|
5
|
+
export interface TriggerEvent {
|
|
6
|
+
sessionID: string;
|
|
7
|
+
usedTokens: number;
|
|
8
|
+
contextLimit: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* chat.params hook 处理器:捕获模型上下文窗口大小
|
|
12
|
+
*/
|
|
13
|
+
export declare function createChatParamsHandler(): (input: PluginInput) => Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* event hook 处理器:监听 message.updated 事件,检测 token 阈值
|
|
16
|
+
*
|
|
17
|
+
* 返回值模式:通过返回 TriggerEvent 通知调用方,不再修改 SDK 事件对象。
|
|
18
|
+
* 参考 context-compress 的事件驱动架构。
|
|
19
|
+
*/
|
|
20
|
+
export declare function createEventHandler(config?: Partial<ContextGuardConfig>): (input: PluginInput) => Promise<TriggerEvent | null>;
|
|
21
|
+
/** 获取当前上下文限制 */
|
|
22
|
+
export declare function getContextLimit(): number;
|
|
23
|
+
//# sourceMappingURL=monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/context-guard/monitor.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,SAAS,CAAC;AAEhE,4BAA4B;AAC5B,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAOD;;GAEG;AACH,wBAAgB,uBAAuB,KACvB,OAAO,WAAW,KAAG,OAAO,CAAC,IAAI,CAAC,CAkBjD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,IAGvD,OAAO,WAAW,KAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA2FhE;AAED,gBAAgB;AAChB,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 执行自动压缩:将旧消息替换为摘要占位符
|
|
3
|
+
* 当前简化实现:输出确认信息,实际压缩在 messages.transform 中完成
|
|
4
|
+
*/
|
|
5
|
+
export declare function executeAutoCompress(sessionID: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* 生成压缩占位符消息
|
|
8
|
+
*/
|
|
9
|
+
export declare function createCompressionPlaceholder(originalContent: string, role: string): string;
|
|
10
|
+
//# sourceMappingURL=auto-compress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-compress.d.ts","sourceRoot":"","sources":["../../../src/context-guard/options/auto-compress.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ7D;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,MAAM,GACX,MAAM,CAIR"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/context-guard/options/migrate.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACvD,OAAO,CAAC,MAAM,CAAC,CAoCjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-compact.d.ts","sourceRoot":"","sources":["../../../src/context-guard/options/session-compact.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAG9C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** 上下文卫士 - 提示词模板 */
|
|
2
|
+
/** 三选一菜单文本(注入到 chat) */
|
|
3
|
+
export declare function renderGuardMenu(usedTokens: number, contextLimit: number, recommendation?: {
|
|
4
|
+
option: string;
|
|
5
|
+
confidence: number;
|
|
6
|
+
reasoning: string;
|
|
7
|
+
}): string;
|
|
8
|
+
/** 选项1执行后的确认消息 */
|
|
9
|
+
export declare const AUTO_COMPRESS_DONE = "\u2705 \u81EA\u52A8\u538B\u7F29\u5B8C\u6210\u3002\u65E7\u6D88\u606F\u5DF2\u538B\u7F29\u4E3A\u6458\u8981\u5360\u4F4D\u7B26\uFF0C\u6700\u8FD1\u5BF9\u8BDD\u5B8C\u6574\u4FDD\u7559\u3002\n \u538B\u7F29\u540E\u8BF7\u7EE7\u7EED\u5F53\u524D\u5DE5\u4F5C\uFF0C\u5982\u6709\u9700\u8981\u53EF\u4F7F\u7528 ultrapress_expand \u6062\u590D\u538B\u7F29\u5185\u5BB9\u3002";
|
|
10
|
+
/** 选项2的引导消息 */
|
|
11
|
+
export declare const SESSION_COMPACT_GUIDE = "\u2705 \u51C6\u5907\u89E6\u53D1 Compact Session\u3002\n \u8BF7\u5728 OpenCode \u4E2D\u6309 Ctrl+K\uFF0C\u7136\u540E\u9009\u62E9 \"Compact Session\"\u3002\n \u6216\u8005\u4F7F\u7528\u547D\u4EE4 /compact \u624B\u52A8\u89E6\u53D1\u3002\n \u538B\u7F29\u540E\u5F53\u524D\u4F1A\u8BDD\u5C06\u7EE7\u7EED\uFF0C\u5173\u952E\u4E0A\u4E0B\u6587\u4F1A\u88AB\u4FDD\u7559\u3002";
|
|
12
|
+
/** 选项3:co-guardian 分析会话用的系统提示 */
|
|
13
|
+
export declare const GUARDIAN_ANALYSIS_PROMPT = "\u4F60\u662F\u4E00\u4E2A\u4F1A\u8BDD\u4E0A\u4E0B\u6587\u5206\u6790\u4E13\u5BB6\u3002\u8BF7\u5206\u6790\u5F53\u524D OpenCode \u4F1A\u8BDD\u72B6\u6001\uFF0C\u7ED9\u51FA\u4E0A\u4E0B\u6587\u5904\u7406\u7684\u5EFA\u8BAE\u3002\n\n\u4F60\u9700\u8981\u5206\u6790\u4EE5\u4E0B\u65B9\u9762\uFF1A\n1. \u5F53\u524D\u4EFB\u52A1\u7684\u5B8C\u6210\u8FDB\u5EA6\uFF08\u662F\u5426\u63A5\u8FD1\u5B8C\u6210\uFF1F\u662F\u5426\u8FD8\u6709\u5927\u91CF\u5DE5\u4F5C\uFF1F\uFF09\n2. \u9519\u8BEF/\u95EE\u9898\u7684\u4E25\u91CD\u7A0B\u5EA6\uFF08\u662F\u5426\u53CD\u590D\u51FA\u73B0\u540C\u6837\u7684\u9519\u8BEF\uFF1F\uFF09\n3. \u5173\u952E\u6587\u4EF6\u7684\u4FEE\u6539\u8303\u56F4\uFF08\u662F\u5426\u6D89\u53CA\u5927\u91CF\u6587\u4EF6\uFF1F\u662F\u5426\u6838\u5FC3\u903B\u8F91\uFF1F\uFF09\n4. \u51B3\u7B56\u5BC6\u5EA6\uFF08\u4F1A\u8BDD\u4E2D\u662F\u5426\u6709\u91CD\u8981\u51B3\u7B56\u9700\u8981\u4FDD\u7559\uFF1F\uFF09\n\n\u7136\u540E\u4ECE\u4EE5\u4E0B\u4E09\u4E2A\u9009\u9879\u4E2D\u63A8\u8350\u4E00\u4E2A\uFF1A\n- auto-compress\uFF08\u81EA\u52A8\u538B\u7F29\uFF09\uFF1A\u9002\u5408\u4EFB\u52A1\u8FD8\u5728\u8FDB\u884C\u4E2D\uFF0C\u9700\u8981\u4FDD\u7559\u6700\u8FD1\u5BF9\u8BDD\u8FDE\u7EED\u6027\n- session-compact\uFF08\u4F1A\u8BDD\u538B\u7F29\uFF09\uFF1A\u9002\u5408\u4EFB\u52A1\u63A5\u8FD1\u5B8C\u6210\uFF0C\u53EF\u4EE5\u538B\u7F29\u6574\u4E2A\u4F1A\u8BDD\n- migrate\uFF08\u5206\u6790\u8FC1\u79FB\uFF09\uFF1A\u9002\u5408\u4F1A\u8BDD\u6DF7\u4E71\u3001\u9519\u8BEF\u53CD\u590D\u3001\u9700\u8981\u6574\u7406\u540E\u91CD\u5F00\n\n\u8BF7\u4EE5 JSON \u683C\u5F0F\u8FD4\u56DE\u4F60\u7684\u5206\u6790\uFF1A\n{\n \"option\": \"auto-compress\" | \"session-compact\" | \"migrate\",\n \"confidence\": 0.0-1.0,\n \"reasoning\": \"\u7B80\u8981\u63A8\u8350\u7406\u7531\",\n \"alternatives\": \"\u5907\u9009\u65B9\u6848\u8BF4\u660E\uFF08\u53EF\u9009\uFF09\"\n}";
|
|
14
|
+
/** 迁移文案模板 */
|
|
15
|
+
export declare function renderMigrationText(ctx: {
|
|
16
|
+
currentTask: string;
|
|
17
|
+
keyFiles: string[];
|
|
18
|
+
activeOperations: string[];
|
|
19
|
+
errors: string[];
|
|
20
|
+
decisions: string[];
|
|
21
|
+
}): string;
|
|
22
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/context-guard/prompts.ts"],"names":[],"mappings":"AAAA,oBAAoB;AAEpB,wBAAwB;AACxB,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzE,MAAM,CAkBR;AAED,kBAAkB;AAClB,eAAO,MAAM,kBAAkB,uWACgB,CAAC;AAEhD,eAAe;AACf,eAAO,MAAM,qBAAqB,iXAGV,CAAC;AAEzB,iCAAiC;AACjC,eAAO,MAAM,wBAAwB,yyDAmBnC,CAAC;AAEH,aAAa;AACb,wBAAgB,mBAAmB,CAAC,GAAG,EAAE;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,MAAM,CAgBT"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** 上下文卫士 - 会话状态管理 */
|
|
2
|
+
import type { GuardSessionState, GuardOption, GuardianRecommendation } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 创建新会话状态
|
|
5
|
+
*/
|
|
6
|
+
export declare function createSessionState(sessionId: string): GuardSessionState;
|
|
7
|
+
/**
|
|
8
|
+
* 获取或创建会话状态,同时更新最后访问时间
|
|
9
|
+
*/
|
|
10
|
+
export declare function getSessionState(sessionId: string): GuardSessionState;
|
|
11
|
+
/**
|
|
12
|
+
* 检查是否可以触发三选一
|
|
13
|
+
* 条件:未触发过 + 冷却期已过 + 不是同一个触发消息
|
|
14
|
+
*/
|
|
15
|
+
export declare function canTrigger(state: GuardSessionState, messageId: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* 标记已触发
|
|
18
|
+
*/
|
|
19
|
+
export declare function markTriggered(state: GuardSessionState, messageId: string, tokens?: number, contextLimit?: number): void;
|
|
20
|
+
/**
|
|
21
|
+
* 设置用户选择
|
|
22
|
+
*/
|
|
23
|
+
export declare function setSelectedOption(state: GuardSessionState, option: GuardOption): void;
|
|
24
|
+
/**
|
|
25
|
+
* 设置冷却期(压缩完成后调用)
|
|
26
|
+
*/
|
|
27
|
+
export declare function setCooldown(state: GuardSessionState, afterMessageId: string): void;
|
|
28
|
+
/**
|
|
29
|
+
* 减少冷却轮次(每轮 assistant 回复后调用)
|
|
30
|
+
*/
|
|
31
|
+
export declare function decrementCooldown(state: GuardSessionState): void;
|
|
32
|
+
/**
|
|
33
|
+
* 重置会话状态
|
|
34
|
+
*/
|
|
35
|
+
export declare function resetSessionState(sessionId: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* 缓存 Guardian 推荐(按 sessionId 隔离)
|
|
38
|
+
*/
|
|
39
|
+
export declare function setCachedRecommendation(sessionID: string, rec: GuardianRecommendation): void;
|
|
40
|
+
/**
|
|
41
|
+
* 获取缓存的 Guardian 推荐
|
|
42
|
+
*/
|
|
43
|
+
export declare function getCachedRecommendation(sessionID: string): GuardianRecommendation | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* 清理过期 session 状态(超过 TTL 无访问)
|
|
46
|
+
*/
|
|
47
|
+
export declare function cleanupStaleSessions(): void;
|
|
48
|
+
/**
|
|
49
|
+
* 清理所有状态(插件 dispose 时调用)
|
|
50
|
+
*/
|
|
51
|
+
export declare function cleanupAllStates(): void;
|
|
52
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/context-guard/state.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAYtF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAUvE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAOpE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAK/E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAKvH;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAErF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAGlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAQhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAIzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,sBAAsB,GAAG,IAAI,CAE5F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAE7F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAQ3C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** 上下文卫士 - Token 计数器 */
|
|
2
|
+
import type { ContextUsage } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 启发式 token 估算(字符法,无外部依赖)
|
|
5
|
+
* 针对 CJK 字符使用更准确的系数,避免对中文文本严重低估
|
|
6
|
+
* 综合准确率 ~85-90%
|
|
7
|
+
*/
|
|
8
|
+
export declare function estimateTokens(text: string): number;
|
|
9
|
+
/**
|
|
10
|
+
* 从消息数组中估算 token 用量
|
|
11
|
+
*/
|
|
12
|
+
export declare function estimateMessagesTokens(messages: Array<{
|
|
13
|
+
content?: string;
|
|
14
|
+
}>): number;
|
|
15
|
+
/**
|
|
16
|
+
* 计算上下文使用统计
|
|
17
|
+
*/
|
|
18
|
+
export declare function computeContextUsage(usedTokens: number, contextLimit: number, inputTokens?: number, outputTokens?: number, reasoningTokens?: number): ContextUsage;
|
|
19
|
+
/**
|
|
20
|
+
* 判断是否超过阈值
|
|
21
|
+
* triggerRatio: 上下文窗口已使用比例(默认 0.2 = 20%)
|
|
22
|
+
* tokenThreshold: 绝对 token 数阈值(兜底)
|
|
23
|
+
* 两个条件满足其一即触发
|
|
24
|
+
*/
|
|
25
|
+
export declare function isOverThreshold(usage: ContextUsage, triggerRatio: number, tokenThreshold: number): boolean;
|
|
26
|
+
//# sourceMappingURL=token-counter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-counter.d.ts","sourceRoot":"","sources":["../../src/context-guard/token-counter.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAU5C;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAanD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAQpF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,GACvB,YAAY,CASd;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAE1G"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/** 上下文卫士 - 类型定义 */
|
|
2
|
+
/** 三选一选项 */
|
|
3
|
+
export type GuardOption = 'auto-compress' | 'session-compact' | 'migrate';
|
|
4
|
+
/** co-guardian 分析推荐结果 */
|
|
5
|
+
export interface GuardianRecommendation {
|
|
6
|
+
/** 推荐选项 */
|
|
7
|
+
option: GuardOption;
|
|
8
|
+
/** 置信度 0-1 */
|
|
9
|
+
confidence: number;
|
|
10
|
+
/** 推荐理由 */
|
|
11
|
+
reasoning: string;
|
|
12
|
+
/** 备选方案简要说明 */
|
|
13
|
+
alternatives?: string;
|
|
14
|
+
}
|
|
15
|
+
/** 会话压缩状态 */
|
|
16
|
+
export interface GuardSessionState {
|
|
17
|
+
/** 会话 ID */
|
|
18
|
+
sessionId: string;
|
|
19
|
+
/** 是否已触发过三选一 */
|
|
20
|
+
triggered: boolean;
|
|
21
|
+
/** 累计 token 数 */
|
|
22
|
+
cumulativeTokens: number;
|
|
23
|
+
/** 最后访问时间(时间戳,用于 TTL 清理) */
|
|
24
|
+
lastAccessTime: number;
|
|
25
|
+
/** 触发时的 token 用量 */
|
|
26
|
+
triggerTokens?: number;
|
|
27
|
+
/** 触发时的上下文窗口大小 */
|
|
28
|
+
triggerContextLimit?: number;
|
|
29
|
+
/** 最近一次压缩后的消息 ID(冷却期锚点) */
|
|
30
|
+
cooldownAfterMessageId?: string;
|
|
31
|
+
/** 冷却剩余轮次 */
|
|
32
|
+
cooldownRemaining: number;
|
|
33
|
+
/** 用户选择的选项(选择后设置) */
|
|
34
|
+
selectedOption?: GuardOption;
|
|
35
|
+
/** 触发的消息 ID(防止重复) */
|
|
36
|
+
lastTriggerMessageId?: string;
|
|
37
|
+
}
|
|
38
|
+
/** 上下文使用统计 */
|
|
39
|
+
export interface ContextUsage {
|
|
40
|
+
/** 已使用的 token */
|
|
41
|
+
usedTokens: number;
|
|
42
|
+
/** 上下文窗口总大小 */
|
|
43
|
+
contextLimit: number;
|
|
44
|
+
/** 使用比例 */
|
|
45
|
+
ratio: number;
|
|
46
|
+
/** 输入 token */
|
|
47
|
+
inputTokens?: number;
|
|
48
|
+
/** 输出 token */
|
|
49
|
+
outputTokens?: number;
|
|
50
|
+
/** 推理 token */
|
|
51
|
+
reasoningTokens?: number;
|
|
52
|
+
}
|
|
53
|
+
/** 插件配置 */
|
|
54
|
+
export interface ContextGuardConfig {
|
|
55
|
+
/** 是否启用 */
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
/** 触发阈值(上下文窗口比例,默认 0.2 = 20%) */
|
|
58
|
+
triggerRatio: number;
|
|
59
|
+
/** 绝对 token 阈值(兜底,默认 40000) */
|
|
60
|
+
tokenThreshold: number;
|
|
61
|
+
/** 冷却轮次(压缩后 N 轮不再触发,默认 3) */
|
|
62
|
+
cooldownTurns: number;
|
|
63
|
+
/** 自动压缩保留最近 N 条消息 */
|
|
64
|
+
preserveLastN: number;
|
|
65
|
+
/** 调试模式 */
|
|
66
|
+
debug: boolean;
|
|
67
|
+
}
|
|
68
|
+
/** 默认配置 */
|
|
69
|
+
export declare const DEFAULT_GUARD_CONFIG: ContextGuardConfig;
|
|
70
|
+
/** 迁移文案:分析提取的会话信息 */
|
|
71
|
+
export interface MigrationContext {
|
|
72
|
+
/** 当前任务摘要 */
|
|
73
|
+
currentTask: string;
|
|
74
|
+
/** 关键文件列表 */
|
|
75
|
+
keyFiles: string[];
|
|
76
|
+
/** 进行中的操作 */
|
|
77
|
+
activeOperations: string[];
|
|
78
|
+
/** 错误/问题 */
|
|
79
|
+
errors: string[];
|
|
80
|
+
/** 决策记录 */
|
|
81
|
+
decisions: string[];
|
|
82
|
+
/** 生成的迁移文案(Markdown) */
|
|
83
|
+
migrationText: string;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/context-guard/types.ts"],"names":[],"mappings":"AAAA,mBAAmB;AAEnB,YAAY;AACZ,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAE1E,yBAAyB;AACzB,MAAM,WAAW,sBAAsB;IACrC,WAAW;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,aAAa;AACb,MAAM,WAAW,iBAAiB;IAChC,YAAY;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2BAA2B;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB;IACrB,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,qBAAqB;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,cAAc;AACd,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,eAAe;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,WAAW;AACX,MAAM,WAAW,kBAAkB;IACjC,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,WAAW;AACX,eAAO,MAAM,oBAAoB,EAAE,kBAOlC,CAAC;AAEF,qBAAqB;AACrB,MAAM,WAAW,gBAAgB;IAC/B,aAAa;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa;IACb,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW;IACX,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,wBAAwB;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAyIlD,QAAA,MAAM,WAAW,EAAE,MAublB,CAAC;AAEF,eAAO,MAAM,MAAM,QAAc,CAAC;AAClC,eAAe,WAAW,CAAC"}
|