oh-my-opencode-cohub 1.8.2 → 1.9.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/dist/context-guard/index.d.ts +1 -0
- package/dist/context-guard/index.d.ts.map +1 -1
- package/dist/context-guard/menu.d.ts.map +1 -1
- package/dist/context-guard/monitor.d.ts +2 -0
- package/dist/context-guard/monitor.d.ts.map +1 -1
- package/dist/context-guard/prompts.d.ts +4 -2
- package/dist/context-guard/prompts.d.ts.map +1 -1
- package/dist/context-guard/types.d.ts +5 -1
- package/dist/context-guard/types.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +56 -6
- package/package.json +1 -1
|
@@ -18,4 +18,5 @@ export declare function initContextGuard(_client: unknown): {
|
|
|
18
18
|
};
|
|
19
19
|
export { type ContextGuardConfig, DEFAULT_GUARD_CONFIG } from './types';
|
|
20
20
|
export { cleanupStaleSessions } from './state';
|
|
21
|
+
export { cleanupCountedMessages } from './monitor';
|
|
21
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +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"}
|
|
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;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -1 +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,
|
|
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,CAiCzG;AAyBD;;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,CA2DjB"}
|
|
@@ -20,4 +20,6 @@ export declare function createChatParamsHandler(): (input: PluginInput) => Promi
|
|
|
20
20
|
export declare function createEventHandler(config?: Partial<ContextGuardConfig>): (input: PluginInput) => Promise<TriggerEvent | null>;
|
|
21
21
|
/** 获取当前上下文限制 */
|
|
22
22
|
export declare function getContextLimit(): number;
|
|
23
|
+
/** 清理已计数消息缓存(dispose 时调用) */
|
|
24
|
+
export declare function cleanupCountedMessages(): void;
|
|
23
25
|
//# sourceMappingURL=monitor.d.ts.map
|
|
@@ -1 +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;
|
|
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;AAUD;;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,CA+FhE;AAED,gBAAgB;AAChB,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,6BAA6B;AAC7B,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/** 上下文卫士 - 提示词模板 */
|
|
2
|
-
/**
|
|
3
|
-
export declare function renderGuardMenu(usedTokens: number, contextLimit: number, recommendation?: {
|
|
2
|
+
/** 三选一 + defer 菜单文本(注入到 chat) */
|
|
3
|
+
export declare function renderGuardMenu(usedTokens: number, contextLimit: number, nextRatio: number, recommendation?: {
|
|
4
4
|
option: string;
|
|
5
5
|
confidence: number;
|
|
6
6
|
reasoning: string;
|
|
7
7
|
}): string;
|
|
8
|
+
/** 计算下一个 defer 阈值(从 DEFER_LEVELS 阶梯中取大于当前 ratio 的最小值) */
|
|
9
|
+
export declare function nextDeferThreshold(currentRatio: number): number;
|
|
8
10
|
/** 选项1执行后的确认消息 */
|
|
9
11
|
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
12
|
/** 选项2的引导消息 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/context-guard/prompts.ts"],"names":[],"mappings":"AAAA,oBAAoB;AAEpB,
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/context-guard/prompts.ts"],"names":[],"mappings":"AAAA,oBAAoB;AAEpB,iCAAiC;AACjC,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzE,MAAM,CAoBR;AAED,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAM/D;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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/** 上下文卫士 - 类型定义 */
|
|
2
2
|
/** 三选一选项 */
|
|
3
|
-
export type GuardOption = 'auto-compress' | 'session-compact' | 'migrate';
|
|
3
|
+
export type GuardOption = 'auto-compress' | 'session-compact' | 'migrate' | 'defer';
|
|
4
|
+
/** 轻微提醒的阈值阶梯 */
|
|
5
|
+
export declare const DEFER_LEVELS: readonly [0.2, 0.4, 0.6, 0.8];
|
|
4
6
|
/** co-guardian 分析推荐结果 */
|
|
5
7
|
export interface GuardianRecommendation {
|
|
6
8
|
/** 推荐选项 */
|
|
@@ -32,6 +34,8 @@ export interface GuardSessionState {
|
|
|
32
34
|
cooldownRemaining: number;
|
|
33
35
|
/** 用户选择的选项(选择后设置) */
|
|
34
36
|
selectedOption?: GuardOption;
|
|
37
|
+
/** defer 后下次触发的阈值(比例,如 0.4) */
|
|
38
|
+
deferThreshold?: number;
|
|
35
39
|
/** 触发的消息 ID(防止重复) */
|
|
36
40
|
lastTriggerMessageId?: string;
|
|
37
41
|
}
|
|
@@ -1 +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;
|
|
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,GAAG,OAAO,CAAC;AAEpF,gBAAgB;AAChB,eAAO,MAAM,YAAY,+BAAgC,CAAC;AAE1D,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,+BAA+B;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,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;AA0IlD,QAAA,MAAM,WAAW,EAAE,MA2clB,CAAC;AAEF,eAAO,MAAM,MAAM,QAAc,CAAC;AAClC,eAAe,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -632,6 +632,7 @@ function cleanupAllStates() {
|
|
|
632
632
|
}
|
|
633
633
|
|
|
634
634
|
// src/context-guard/monitor.ts
|
|
635
|
+
var countedMessages = new Map;
|
|
635
636
|
var modelContext = {
|
|
636
637
|
contextLimit: 200000
|
|
637
638
|
};
|
|
@@ -694,8 +695,11 @@ function createEventHandler(config) {
|
|
|
694
695
|
if (totalTokens <= 0) {
|
|
695
696
|
totalTokens = state.cumulativeTokens;
|
|
696
697
|
}
|
|
697
|
-
if (
|
|
698
|
-
state.cumulativeTokens
|
|
698
|
+
if (!countedMessages.get(sessionID)?.has(messageId)) {
|
|
699
|
+
state.cumulativeTokens += totalTokens;
|
|
700
|
+
if (!countedMessages.has(sessionID))
|
|
701
|
+
countedMessages.set(sessionID, new Set);
|
|
702
|
+
countedMessages.get(sessionID).add(messageId);
|
|
699
703
|
}
|
|
700
704
|
let estimatedTotal = totalTokens;
|
|
701
705
|
if (estimatedTotal <= 0) {
|
|
@@ -712,7 +716,8 @@ function createEventHandler(config) {
|
|
|
712
716
|
if (estimatedTotal <= 0)
|
|
713
717
|
return null;
|
|
714
718
|
const usage = computeContextUsage(estimatedTotal, modelContext.contextLimit, inputTokens, outputTokens, reasoningTokens);
|
|
715
|
-
|
|
719
|
+
const effectiveRatio = state.deferThreshold ?? cfg.triggerRatio;
|
|
720
|
+
if (!isOverThreshold(usage, effectiveRatio, cfg.tokenThreshold))
|
|
716
721
|
return null;
|
|
717
722
|
markTriggered(state, messageId, estimatedTotal, modelContext.contextLimit);
|
|
718
723
|
return { sessionID, usedTokens: estimatedTotal, contextLimit: modelContext.contextLimit };
|
|
@@ -723,10 +728,14 @@ function createEventHandler(config) {
|
|
|
723
728
|
}
|
|
724
729
|
};
|
|
725
730
|
}
|
|
731
|
+
function cleanupCountedMessages() {
|
|
732
|
+
countedMessages.clear();
|
|
733
|
+
}
|
|
726
734
|
|
|
727
735
|
// src/context-guard/prompts.ts
|
|
728
|
-
function renderGuardMenu(usedTokens, contextLimit, recommendation) {
|
|
736
|
+
function renderGuardMenu(usedTokens, contextLimit, nextRatio, recommendation) {
|
|
729
737
|
const ratio = (usedTokens / contextLimit * 100).toFixed(1);
|
|
738
|
+
const nextPct = (nextRatio * 100).toFixed(0);
|
|
730
739
|
const recSection = recommendation ? `
|
|
731
740
|
|
|
732
741
|
\uD83E\uDDE0 co-guardian 分析建议:
|
|
@@ -741,12 +750,21 @@ function renderGuardMenu(usedTokens, contextLimit, recommendation) {
|
|
|
741
750
|
`║ 1️⃣ 自动压缩 — 压缩旧消息,保留最近对话 ║`,
|
|
742
751
|
`║ 2️⃣ 会话压缩 — 触发 Compact Session ║`,
|
|
743
752
|
`║ 3️⃣ 分析迁移 — 提取关键上下文,生成迁移文案 ║`,
|
|
753
|
+
`║ 4️⃣ 稍后提醒 — 到 ${nextPct}% 时再提醒 ║`,
|
|
744
754
|
`║ ║`,
|
|
745
|
-
`║ 请回复数字 1、2 或
|
|
755
|
+
`║ 请回复数字 1、2、3 或 4 ║`,
|
|
746
756
|
`╚══════════════════════════════════════════════════╝`
|
|
747
757
|
].join(`
|
|
748
758
|
`);
|
|
749
759
|
}
|
|
760
|
+
function nextDeferThreshold(currentRatio) {
|
|
761
|
+
const LEVELS = [0.4, 0.6, 0.8];
|
|
762
|
+
for (const l of LEVELS) {
|
|
763
|
+
if (l > currentRatio + 0.01)
|
|
764
|
+
return l;
|
|
765
|
+
}
|
|
766
|
+
return 0.9;
|
|
767
|
+
}
|
|
750
768
|
var AUTO_COMPRESS_DONE = `✅ 自动压缩完成。旧消息已压缩为摘要占位符,最近对话完整保留。
|
|
751
769
|
压缩后请继续当前工作,如有需要可使用 ultrapress_expand 恢复压缩内容。`;
|
|
752
770
|
var SESSION_COMPACT_GUIDE = `✅ 准备触发 Compact Session。
|
|
@@ -986,7 +1004,8 @@ function createMessagesTransformHandler() {
|
|
|
986
1004
|
pendingUsages.delete(found.sessionID);
|
|
987
1005
|
const recentMsgs = extractRecentMessages(output.messages, 30);
|
|
988
1006
|
const recommendation = analyzeSession(found.sessionID, recentMsgs);
|
|
989
|
-
const
|
|
1007
|
+
const nextRatio = nextDeferThreshold(usage.usedTokens / usage.contextLimit);
|
|
1008
|
+
const menu = renderGuardMenu(usage.usedTokens, usage.contextLimit, nextRatio, recommendation);
|
|
990
1009
|
const parts = found.msg.parts;
|
|
991
1010
|
if (parts) {
|
|
992
1011
|
for (let j = parts.length - 1;j >= 0; j--) {
|
|
@@ -1011,18 +1030,24 @@ function parseOption(text) {
|
|
|
1011
1030
|
return "session-compact";
|
|
1012
1031
|
if (t === "3" || t === "3")
|
|
1013
1032
|
return "migrate";
|
|
1033
|
+
if (t === "4" || t === "4")
|
|
1034
|
+
return "defer";
|
|
1014
1035
|
if (/^[选11]\s*[.、,,]?\s*(自动压缩|选项1)/.test(t))
|
|
1015
1036
|
return "auto-compress";
|
|
1016
1037
|
if (/^[选22]\s*[.、,,]?\s*(会话压缩|compact|选项2)/i.test(t))
|
|
1017
1038
|
return "session-compact";
|
|
1018
1039
|
if (/^[选33]\s*[.、,,]?\s*(分析迁移|迁移|选项3)/.test(t))
|
|
1019
1040
|
return "migrate";
|
|
1041
|
+
if (/^[选44]\s*[.、,,]?\s*(稍后|推迟|延迟|选项4)/i.test(t))
|
|
1042
|
+
return "defer";
|
|
1020
1043
|
if (t === "自动压缩")
|
|
1021
1044
|
return "auto-compress";
|
|
1022
1045
|
if (t === "会话压缩")
|
|
1023
1046
|
return "session-compact";
|
|
1024
1047
|
if (t === "分析迁移")
|
|
1025
1048
|
return "migrate";
|
|
1049
|
+
if (t === "稍后提醒" || t === "稍后")
|
|
1050
|
+
return "defer";
|
|
1026
1051
|
return;
|
|
1027
1052
|
}
|
|
1028
1053
|
function createChatMessageHandler() {
|
|
@@ -1058,6 +1083,14 @@ function createChatMessageHandler() {
|
|
|
1058
1083
|
case "migrate":
|
|
1059
1084
|
replyText = await executeMigrate(sessionID, []);
|
|
1060
1085
|
break;
|
|
1086
|
+
case "defer": {
|
|
1087
|
+
const nextRatio = nextDeferThreshold((state.cumulativeTokens || 0) / (state.triggerContextLimit || 200000));
|
|
1088
|
+
const nextPct = (nextRatio * 100).toFixed(0);
|
|
1089
|
+
state.triggered = false;
|
|
1090
|
+
state.deferThreshold = nextRatio;
|
|
1091
|
+
replyText = `⏸️ 已推迟提醒。下次到 ${nextPct}% 时再弹窗。`;
|
|
1092
|
+
break;
|
|
1093
|
+
}
|
|
1061
1094
|
}
|
|
1062
1095
|
if (output.parts) {
|
|
1063
1096
|
output.parts.length = 0;
|
|
@@ -2258,6 +2291,13 @@ var CoHubPlugin = async (input, options) => {
|
|
|
2258
2291
|
agent.config.prompt = resolvePrompt(agent.config.prompt, override.replace, override.append);
|
|
2259
2292
|
}
|
|
2260
2293
|
}
|
|
2294
|
+
const orchestratorAgent = agents.find((a) => a.name === "co-orchestrator");
|
|
2295
|
+
const criticalRulesMatch = orchestratorAgent?.config.prompt?.match(/<critical_rules>([\s\S]*?)<\/critical_rules>/);
|
|
2296
|
+
const coreRulesInjectionText = criticalRulesMatch ? `
|
|
2297
|
+
|
|
2298
|
+
--- 核心规则提醒(本轮注入,不持久化) ---
|
|
2299
|
+
<critical_rules>${criticalRulesMatch[1]}</critical_rules>
|
|
2300
|
+
--- 注入结束 ---` : null;
|
|
2261
2301
|
const DEFAULT_COUNCIL_CONFIG = {
|
|
2262
2302
|
default_preset: "default",
|
|
2263
2303
|
timeout: 180000,
|
|
@@ -2485,6 +2525,15 @@ var CoHubPlugin = async (input, options) => {
|
|
|
2485
2525
|
if (guardTransform)
|
|
2486
2526
|
await guardTransform(_input, output);
|
|
2487
2527
|
} catch {}
|
|
2528
|
+
if (coreRulesInjectionText) {
|
|
2529
|
+
for (let k = lastUserMsg.parts.length - 1;k >= 0; k--) {
|
|
2530
|
+
const part = lastUserMsg.parts[k];
|
|
2531
|
+
if (part.type === "text") {
|
|
2532
|
+
part.text += coreRulesInjectionText;
|
|
2533
|
+
break;
|
|
2534
|
+
}
|
|
2535
|
+
}
|
|
2536
|
+
}
|
|
2488
2537
|
} catch (err) {
|
|
2489
2538
|
console.warn("[oh-my-opencode-cohub] messages.transform hook 失败:", err);
|
|
2490
2539
|
}
|
|
@@ -2506,6 +2555,7 @@ var CoHubPlugin = async (input, options) => {
|
|
|
2506
2555
|
clearInterval(cleanupTimer);
|
|
2507
2556
|
clearInterval(contextCleanupTimer);
|
|
2508
2557
|
cleanupAllStates();
|
|
2558
|
+
cleanupCountedMessages();
|
|
2509
2559
|
}
|
|
2510
2560
|
};
|
|
2511
2561
|
};
|