dsh-super-code 0.3.5 → 0.3.7
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 +91 -57
- package/client/index.js +717 -36
- package/cordis.patch.yml +2 -2
- package/docs/Changelog.md +16 -0
- package/docs/Compatibility.md +56 -0
- package/docs/EvaluationResults.md +134 -58
- package/docs/UsageGuide.md +103 -0
- package/lib/core/deletion-command.d.ts +3 -0
- package/lib/core/deletion-command.d.ts.map +1 -0
- package/lib/core/deletion-command.js +169 -0
- package/lib/core/deletion-command.js.map +1 -0
- package/lib/dsh/budget-settings.d.ts +51 -0
- package/lib/dsh/budget-settings.d.ts.map +1 -0
- package/lib/dsh/budget-settings.js +188 -0
- package/lib/dsh/budget-settings.js.map +1 -0
- package/lib/dsh/budgets.d.ts +39 -0
- package/lib/dsh/budgets.d.ts.map +1 -0
- package/lib/dsh/budgets.js +76 -0
- package/lib/dsh/budgets.js.map +1 -0
- package/lib/dsh/compaction.d.ts +40 -0
- package/lib/dsh/compaction.d.ts.map +1 -0
- package/lib/dsh/compaction.js +146 -0
- package/lib/dsh/compaction.js.map +1 -0
- package/lib/dsh/deletion-protection.d.ts +13 -0
- package/lib/dsh/deletion-protection.d.ts.map +1 -0
- package/lib/dsh/deletion-protection.js +68 -0
- package/lib/dsh/deletion-protection.js.map +1 -0
- package/lib/dsh/index.d.ts +4 -1
- package/lib/dsh/index.d.ts.map +1 -1
- package/lib/dsh/index.js +11 -1
- package/lib/dsh/index.js.map +1 -1
- package/lib/dsh/official-budgets.d.ts +3 -0
- package/lib/dsh/official-budgets.d.ts.map +1 -0
- package/lib/dsh/official-budgets.js +114 -0
- package/lib/dsh/official-budgets.js.map +1 -0
- package/lib/dsh/ptc-budget.d.ts +5 -0
- package/lib/dsh/ptc-budget.d.ts.map +1 -0
- package/lib/dsh/ptc-budget.js +65 -0
- package/lib/dsh/ptc-budget.js.map +1 -0
- package/lib/dsh/super-code.d.ts.map +1 -1
- package/lib/dsh/super-code.js +26 -8
- package/lib/dsh/super-code.js.map +1 -1
- package/lib/index.d.ts +5 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -2
- package/lib/index.js.map +1 -1
- package/lib/task-feedback-projection.d.ts +68 -0
- package/lib/task-feedback-projection.d.ts.map +1 -0
- package/lib/task-feedback-projection.js +176 -0
- package/lib/task-feedback-projection.js.map +1 -0
- package/package.json +17 -7
- package/presets/super-code/agent.cordis.yml +2 -2
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { BasicCompactionEngine } from '@deepseek-ai/dsh-compaction-basic';
|
|
2
|
+
import { CompactionEngine, toolPairingBalancedBefore } from '@deepseek-ai/dsh-compaction';
|
|
3
|
+
import { createScope } from '@deepseek-ai/dsh-scope';
|
|
4
|
+
import { budgetSchema, configurationOf, validateConfiguration } from './budgets.js';
|
|
5
|
+
export const name = 'super-code-compaction';
|
|
6
|
+
export const inject = ['llm', 'tokenMeter', 'sessions'];
|
|
7
|
+
export const Config = budgetSchema;
|
|
8
|
+
/** Preserve the system head and extend the retained tail to a balanced tool boundary. */
|
|
9
|
+
export function compactableRange(session, measurement, retainTokens) {
|
|
10
|
+
const nodes = session.surface.nodes;
|
|
11
|
+
if (!nodes.length)
|
|
12
|
+
return { kind: 'none' };
|
|
13
|
+
if (nodes.length !== measurement.nodes.length || nodes.some((seq, index) => seq !== measurement.nodes[index]?.seq))
|
|
14
|
+
throw new Error('Compression measurement does not match the current surface');
|
|
15
|
+
const first = session.eventAt(nodes[0])?.type === 'system/message' ? 1 : 0;
|
|
16
|
+
let tokens = 0, keep = nodes.length;
|
|
17
|
+
for (let index = nodes.length - 1; index >= 0; index--) {
|
|
18
|
+
tokens += measurement.nodes[index].tokens;
|
|
19
|
+
keep = index;
|
|
20
|
+
if (tokens >= retainTokens)
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
while (keep > first && !toolPairingBalancedBefore(session, nodes[keep]))
|
|
24
|
+
keep--;
|
|
25
|
+
return keep <= first ? { kind: 'none' } : { start: nodes[first], end: nodes[keep - 1] };
|
|
26
|
+
}
|
|
27
|
+
export class BudgetCompactionEngine extends BasicCompactionEngine {
|
|
28
|
+
budgets;
|
|
29
|
+
constructor(ctx, budgets = {}) {
|
|
30
|
+
validateConfiguration({ budgets });
|
|
31
|
+
super(ctx, {
|
|
32
|
+
thresholdRatio: budgets.thresholdRatio,
|
|
33
|
+
retainRatio: budgets.retainRatio,
|
|
34
|
+
maxTokens: budgets.summaryMaxTokens,
|
|
35
|
+
compactionRetries: budgets.compactionRetries,
|
|
36
|
+
maxOverflowRetries: budgets.maxOverflowRetries,
|
|
37
|
+
});
|
|
38
|
+
this.budgets = budgets;
|
|
39
|
+
}
|
|
40
|
+
async compactIfNeeded(agent, trigger, signal) {
|
|
41
|
+
if (this.budgets.pressureBasis !== 'window' || trigger !== 'pressure')
|
|
42
|
+
return super.compactIfNeeded(agent, trigger, signal);
|
|
43
|
+
return compactByWindow(this, this.budgets, agent, signal);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Share the window policy with an official engine without replacing its transaction or listeners. */
|
|
47
|
+
export async function compactByWindow(engine, budgets, agent, signal) {
|
|
48
|
+
const ctx = engine['ctx'];
|
|
49
|
+
signal.throwIfAborted();
|
|
50
|
+
const config = agent.session.requestHeader()?.config;
|
|
51
|
+
if (!config?.provider || !config.model)
|
|
52
|
+
return null;
|
|
53
|
+
const info = await ctx.llm.resolveModelInfo(config.provider, config.model, signal);
|
|
54
|
+
const window = info.context?.contextWindow;
|
|
55
|
+
if (!Number.isSafeInteger(window) || !window || window < 1)
|
|
56
|
+
throw new Error('Compression requires the routed model context window');
|
|
57
|
+
const threshold = Math.floor(window * (budgets.thresholdRatio ?? engine.config.thresholdRatio));
|
|
58
|
+
const retain = Math.floor(window * (budgets.retainRatio ?? engine.config.retainRatio ?? 0.16));
|
|
59
|
+
let measurement = ctx.tokenMeter.measure(agent.session);
|
|
60
|
+
if (measurement.totalTokens < threshold)
|
|
61
|
+
return null;
|
|
62
|
+
const pruner = ctx.get('toolResultPruner');
|
|
63
|
+
if (pruner) {
|
|
64
|
+
pruner.pruneSession(agent.session);
|
|
65
|
+
measurement = ctx.tokenMeter.measure(agent.session);
|
|
66
|
+
}
|
|
67
|
+
if (measurement.totalTokens < threshold)
|
|
68
|
+
return null;
|
|
69
|
+
let result = null;
|
|
70
|
+
for (let attempt = 0; attempt <= (budgets.compactionRetries ?? engine.config.compactionRetries); attempt++) {
|
|
71
|
+
signal.throwIfAborted();
|
|
72
|
+
const range = compactableRange(agent.session, measurement, retain);
|
|
73
|
+
if ('kind' in range)
|
|
74
|
+
return result;
|
|
75
|
+
result = await engine.compactRegion(range.start, range.end, agent, signal);
|
|
76
|
+
measurement = ctx.tokenMeter.measure(agent.session);
|
|
77
|
+
if (measurement.totalTokens < threshold)
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
throw new Error('Compression remains above the configured window threshold after its retry budget');
|
|
81
|
+
}
|
|
82
|
+
/** Retained preset generations share this router, while each Agent owns its host engine. */
|
|
83
|
+
export class AgentBudgetCompaction extends CompactionEngine {
|
|
84
|
+
overrides;
|
|
85
|
+
engines = new WeakMap();
|
|
86
|
+
constructor(ctx, overrides = {}) {
|
|
87
|
+
super(ctx);
|
|
88
|
+
this.overrides = overrides;
|
|
89
|
+
validateConfiguration({ budgets: overrides });
|
|
90
|
+
ctx.on('agent/created', async ({ agent }) => { await this.forAgent(agent); });
|
|
91
|
+
ctx.on('agent/disposed', async ({ agent }) => {
|
|
92
|
+
const entry = this.engines.get(agent);
|
|
93
|
+
this.engines.delete(agent);
|
|
94
|
+
await entry?.dispose();
|
|
95
|
+
});
|
|
96
|
+
// Older creation events do not await listeners; finish setup before the first pressure check.
|
|
97
|
+
ctx.on('agent/pre-step', async ({ agent, signal }, next) => {
|
|
98
|
+
const ready = this.engines.get(agent)?.ready;
|
|
99
|
+
const engine = await this.forAgent(agent);
|
|
100
|
+
if (!ready && !signal.aborted) {
|
|
101
|
+
try {
|
|
102
|
+
await engine.compactIfNeeded(agent, 'pressure', signal);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
106
|
+
ctx.logger.warn(`step compaction failed: ${message}; continuing the turn`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return next();
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
forAgent(agent) {
|
|
113
|
+
let entry = this.engines.get(agent);
|
|
114
|
+
if (!entry) {
|
|
115
|
+
const scope = createScope(this.ctx, agent);
|
|
116
|
+
const budgets = { ...configurationOf(this.ctx, agent).budgets, ...this.overrides };
|
|
117
|
+
const fiber = scope.ctx.isolate('compaction').plugin({ inject, apply(owner) { new BudgetCompactionEngine(owner, budgets); } });
|
|
118
|
+
const created = {
|
|
119
|
+
ready: false, dispose: scope.dispose,
|
|
120
|
+
engine: fiber.await().then(() => {
|
|
121
|
+
const engine = fiber.ctx.get('compaction');
|
|
122
|
+
if (!engine)
|
|
123
|
+
throw new Error('Agent compression engine did not become available');
|
|
124
|
+
created.ready = true;
|
|
125
|
+
return engine;
|
|
126
|
+
}).catch(async (error) => { await scope.dispose(); throw error; }),
|
|
127
|
+
};
|
|
128
|
+
entry = created;
|
|
129
|
+
this.engines.set(agent, entry);
|
|
130
|
+
}
|
|
131
|
+
return entry.engine;
|
|
132
|
+
}
|
|
133
|
+
async compactIfNeeded(agent, trigger, signal) {
|
|
134
|
+
return (await this.forAgent(agent)).compactIfNeeded(agent, trigger, signal);
|
|
135
|
+
}
|
|
136
|
+
async compactRegion(start, end, agent, signal) {
|
|
137
|
+
return (await this.forAgent(agent)).compactRegion(start, end, agent, signal);
|
|
138
|
+
}
|
|
139
|
+
async compactNow(agent, signal, sourceCommandId) {
|
|
140
|
+
return (await this.forAgent(agent)).compactNow(agent, signal, sourceCommandId);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
export function apply(ctx, config = {}) {
|
|
144
|
+
new AgentBudgetCompaction(ctx, config);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=compaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/dsh/compaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Global registration with per-preset eligibility; no shell rewriting or remembered grants. */
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
declare module '@deepseek-ai/dsh-llm' {
|
|
4
|
+
interface MessageSourceMap {
|
|
5
|
+
'dsh-super-code/deletion-protection': {
|
|
6
|
+
kind: 'dsh-super-code/deletion-protection';
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export declare const DELETION_INSTRUCTION: string;
|
|
11
|
+
export declare const RELAXED_DELETION_INSTRUCTION: string;
|
|
12
|
+
export declare function applyDeletionProtection(ctx: Context): void;
|
|
13
|
+
//# sourceMappingURL=deletion-protection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deletion-protection.d.ts","sourceRoot":"","sources":["../../src/dsh/deletion-protection.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AASlD,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAU,gBAAgB;QAAG,oCAAoC,EAAE;YAAE,IAAI,EAAE,oCAAoC,CAAA;SAAE,CAAA;KAAE;CACpH;AAED,eAAO,MAAM,oBAAoB,EAAE,MAA6xB,CAAA;AAEh0B,eAAO,MAAM,4BAA4B,EAAE,MAA+uB,CAAA;AAa1xB,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA4C1D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { createUserMessage } from '@deepseek-ai/dsh-llm';
|
|
2
|
+
import { configurationOf, deletionProtectionMode } from './budgets.js';
|
|
3
|
+
import { deletionCommand } from '../core/deletion-command.js';
|
|
4
|
+
export const DELETION_INSTRUCTION = '删除文件或目录默认用 trash <path>(可恢复);仅清理临时文件、构建产物且我已确认时才用 rm。脚本、内联脚本和间接调用也不允许直接使用 rm 或其他永久删除命令,不得用脚本绕过删除保护;同样优先移动到回收站。确需清理临时文件或构建产物时,必须对具体命令和路径取得用户二次确认,仅对当前调用有效。trash 不可用时,改用其他可恢复的回收站方式或先停止,不得静默退回 rm。\nUse trash <path> (recoverable) by default for files and directories. Use rm only to clean temporary files or build artifacts after the user explicitly confirms the exact operation. Scripts, inline scripts, and indirect invocations must also avoid rm or other permanent deletion commands; never use a script to bypass this protection. Prefer a recoverable trash mechanism. An exception requires a separate user confirmation for this exact command and its paths, valid for this call only. If trash is unavailable, use another recoverable trash mechanism or stop; never silently fall back to rm.';
|
|
5
|
+
export const RELAXED_DELETION_INSTRUCTION = '删除文件或目录默认用 trash <path>(可恢复);仅清理临时文件、构建产物且我已确认时才用 rm。脚本、内联脚本和间接调用中也建议使用 trash 等可恢复命令,尽量避免 rm。当前为宽松模式:用户已明确说明需要使用 rm 时,可以按用户指定的范围使用,包括在脚本中使用;该明确要求可作为确认,无需本插件额外二次确认。用户没有明确要求时,不要自行改用永久删除。宿主原有权限检查仍然有效。\nUse trash <path> (recoverable) by default for files and directories; use rm for temporary files or build artifacts after confirmation. Scripts, inline scripts, and indirect calls should also prefer recoverable trash commands and avoid rm when possible. In relaxed mode, an explicit user request to use rm is sufficient confirmation within the requested scope, including in scripts; this plugin requires no additional confirmation. Without an explicit request, do not silently switch to permanent deletion. Host permission checks still apply.';
|
|
6
|
+
function instruction(mode) {
|
|
7
|
+
return mode === 'strict' ? DELETION_INSTRUCTION : mode === 'relaxed' ? RELAXED_DELETION_INSTRUCTION : '';
|
|
8
|
+
}
|
|
9
|
+
const corrective = 'SUPER_CODE_DELETE_PROTECTED: 已拦截永久删除命令。请使用 trash <path> 等可恢复的回收站命令,脚本也不得绕过。仅清理临时文件或构建产物且用户对当前命令二次确认后才可执行。\nPermanent deletion blocked. Use trash <path> or another recoverable trash command, including in scripts. Only temporary/build cleanup with a separate one-time user confirmation may proceed.';
|
|
10
|
+
const official = new Set(['standard', 'ptc', 'minimal', 'cordis']);
|
|
11
|
+
export function applyDeletionProtection(ctx) {
|
|
12
|
+
ctx.inject(['tools', 'systemPrompt'], owner => {
|
|
13
|
+
const modeFor = (agent) => {
|
|
14
|
+
const config = configurationOf(owner);
|
|
15
|
+
const mode = deletionProtectionMode(config);
|
|
16
|
+
if (mode === 'off' || !agent)
|
|
17
|
+
return 'off';
|
|
18
|
+
if (owner.tools.get('super_code_task', agent))
|
|
19
|
+
return mode;
|
|
20
|
+
const presets = owner.get('agentPresets');
|
|
21
|
+
return config.deletionProtectionForOfficialPresets === true && !!presets && official.has(presets.composedPreset(agent.ctx) ?? '') ? mode : 'off';
|
|
22
|
+
};
|
|
23
|
+
owner.systemPrompt.section({ name: 'super-code:deletion-protection', order: 95,
|
|
24
|
+
text: ({ agent }) => instruction(modeFor(agent)) });
|
|
25
|
+
// Minimal owns a complete system prompt and suppresses global context.
|
|
26
|
+
// Use its public pre-step message seam so the policy remains logged and replayable.
|
|
27
|
+
const minimalNotices = new WeakMap();
|
|
28
|
+
owner.on('agent/pre-step', async ({ agent }, next) => {
|
|
29
|
+
const result = await next();
|
|
30
|
+
const presets = owner.get('agentPresets');
|
|
31
|
+
if (result.kind !== 'enter' || presets?.composedPreset(agent.ctx) !== 'minimal')
|
|
32
|
+
return result;
|
|
33
|
+
const mode = modeFor(agent), previous = minimalNotices.get(agent);
|
|
34
|
+
if (previous === mode || mode === 'off' && previous === undefined)
|
|
35
|
+
return result;
|
|
36
|
+
minimalNotices.set(agent, mode);
|
|
37
|
+
const notice = createUserMessage({ source: { kind: 'dsh-super-code/deletion-protection' }, content: [{ type: 'text',
|
|
38
|
+
text: mode === 'off' ? '此预设的删除保护已关闭,先前的删除保护提示不再适用;宿主自身权限检查仍然有效。\nDeletion protection is now disabled for this preset. Earlier deletion-protection notices no longer apply; host permission checks still apply.'
|
|
39
|
+
: (previous === undefined ? '' : '删除保护模式已切换,以下规则取代先前的删除保护规则。\nThe deletion-protection mode has changed; the following rules replace earlier deletion-protection instructions.\n') + instruction(mode),
|
|
40
|
+
}] });
|
|
41
|
+
return { ...result, messages: [...result.messages, notice] };
|
|
42
|
+
});
|
|
43
|
+
owner.on('tools/execute', async (exec, next) => {
|
|
44
|
+
if (modeFor(exec.agent) !== 'strict' || !['bash', 'pwsh'].includes(exec.name))
|
|
45
|
+
return next();
|
|
46
|
+
const args = exec.arguments;
|
|
47
|
+
if (typeof args?.command !== 'string' || !deletionCommand(args.command, exec.name === 'pwsh'))
|
|
48
|
+
return next();
|
|
49
|
+
exec.signal.throwIfAborted();
|
|
50
|
+
const approval = owner.get('approval');
|
|
51
|
+
if (!approval || !exec.agent)
|
|
52
|
+
throw new Error(corrective + '\n当前宿主无可用确认渠道,命令未执行。 No approval channel is available; nothing ran.');
|
|
53
|
+
const reason = `删除保护:建议改用 trash。仅在本次操作是临时文件或构建产物清理时,确认以下命令的永久删除;其他文件请选择拒绝。\nDeletion protection: prefer trash. Approve permanent deletion only for temporary files or build artifacts in this exact call; reject other deletions.\n${typeof args.workdir === 'string' ? `工作目录 / Workdir: ${args.workdir}\n` : ''}${args.command}`;
|
|
54
|
+
let outcome;
|
|
55
|
+
try {
|
|
56
|
+
outcome = await approval.request({ agent: exec.agent, toolName: exec.name, callId: exec.callId, reason, signal: exec.signal });
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
throw new Error(corrective + '\n确认渠道不可用,命令未执行。 Approval failed; nothing ran.');
|
|
60
|
+
}
|
|
61
|
+
exec.signal.throwIfAborted();
|
|
62
|
+
if (outcome !== 'allowed-once')
|
|
63
|
+
throw new Error(corrective + `\n确认结果 / Approval: ${outcome}`);
|
|
64
|
+
return next();
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=deletion-protection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deletion-protection.js","sourceRoot":"","sources":["../../src/dsh/deletion-protection.ts"],"names":[],"mappings":"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"}
|
package/lib/dsh/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import { configurationSchema } from './budgets.js';
|
|
3
|
+
import type { Configuration } from './budgets.js';
|
|
2
4
|
export declare const name = "super-code";
|
|
3
|
-
export declare
|
|
5
|
+
export declare const Config: typeof configurationSchema;
|
|
6
|
+
export declare function apply(ctx: Context, config?: Configuration): Promise<void>;
|
|
4
7
|
export default apply;
|
|
5
8
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/dsh/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dsh/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAQlD,eAAO,MAAM,IAAI,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dsh/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAQlD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAKjD,eAAO,MAAM,IAAI,eAAe,CAAA;AAChC,eAAO,MAAM,MAAM,EAAE,OAAO,mBAAyC,CAAA;AAgBrE,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAenF;AAED,eAAe,KAAK,CAAA"}
|
package/lib/dsh/index.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
/** Host projections and preset installation; execution belongs to Harness. */
|
|
2
2
|
import { applyPresetInstallation } from './preset-installation.js';
|
|
3
3
|
import { superAgentUsageProjectionDefinition } from '../super-agent-usage.js';
|
|
4
|
+
import { taskFeedbackProjection } from '../task-feedback-projection.js';
|
|
4
5
|
import { taskMemoryProjection } from '../task-memory-projection.js';
|
|
5
6
|
import { LongMemoryStore, longMemoryDomainSpec } from '../long-memory.js';
|
|
6
7
|
import { memoryUsageProjection } from '../memory-usage-projection.js';
|
|
7
8
|
import { SuperCodeMemory } from './memory-library.js';
|
|
9
|
+
import { configurationSchema } from './budgets.js';
|
|
10
|
+
import { applyBudgetSettings } from './budget-settings.js';
|
|
11
|
+
import { applyOfficialBudgets } from './official-budgets.js';
|
|
12
|
+
import { applyDeletionProtection } from './deletion-protection.js';
|
|
8
13
|
export const name = 'super-code';
|
|
14
|
+
export const Config = configurationSchema;
|
|
9
15
|
async function installLongMemory(ctx) {
|
|
10
16
|
await ctx.inject(['storageDomain'], async (owner) => {
|
|
11
17
|
try {
|
|
@@ -20,7 +26,10 @@ async function installLongMemory(ctx) {
|
|
|
20
26
|
}
|
|
21
27
|
});
|
|
22
28
|
}
|
|
23
|
-
export async function apply(ctx) {
|
|
29
|
+
export async function apply(ctx, config = {}) {
|
|
30
|
+
applyBudgetSettings(ctx, config);
|
|
31
|
+
applyOfficialBudgets(ctx);
|
|
32
|
+
applyDeletionProtection(ctx);
|
|
24
33
|
applyPresetInstallation(ctx);
|
|
25
34
|
ctx.inject(['superCodeLongMemory', 'sessions'], owner => {
|
|
26
35
|
new SuperCodeMemory(owner, owner.get('superCodeLongMemory'));
|
|
@@ -28,6 +37,7 @@ export async function apply(ctx) {
|
|
|
28
37
|
ctx.inject(['sessionProjections'], projectionCtx => {
|
|
29
38
|
projectionCtx.sessionProjections.register(superAgentUsageProjectionDefinition);
|
|
30
39
|
projectionCtx.sessionProjections.register(taskMemoryProjection);
|
|
40
|
+
projectionCtx.sessionProjections.register(taskFeedbackProjection);
|
|
31
41
|
projectionCtx.sessionProjections.register(memoryUsageProjection);
|
|
32
42
|
});
|
|
33
43
|
await installLongMemory(ctx);
|
package/lib/dsh/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dsh/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAElE,OAAO,EAAE,mCAAmC,EAAE,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dsh/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAElE,OAAO,EAAE,mCAAmC,EAAE,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAElE,MAAM,CAAC,MAAM,IAAI,GAAG,YAAY,CAAA;AAChC,MAAM,CAAC,MAAM,MAAM,GAA+B,mBAAmB,CAAA;AAErE,KAAK,UAAU,iBAAiB,CAAC,GAAY;IAC3C,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;QAChD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAmB,CAAA;YAC7D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YACxD,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC9F,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAA;QACpG,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAY,EAAE,SAAwB,EAAE;IAClE,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAChC,oBAAoB,CAAC,GAAG,CAAC,CAAA;IACzB,uBAAuB,CAAC,GAAG,CAAC,CAAA;IAC5B,uBAAuB,CAAC,GAAG,CAAC,CAAA;IAC5B,GAAG,CAAC,MAAM,CAAC,CAAC,qBAAqB,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,EAAE;QACtD,IAAI,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAoB,CAAC,CAAA;IACjF,CAAC,CAAC,CAAA;IACF,GAAG,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,EAAE,aAAa,CAAC,EAAE;QACjD,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAA;QAC9E,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAA;QAC/D,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAA;QACjE,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IACF,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAA;AAC9B,CAAC;AAED,eAAe,KAAK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"official-budgets.d.ts","sourceRoot":"","sources":["../../src/dsh/official-budgets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAiFlD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA8BvD"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/** Apply common budgets to existing official engines, scoped to each Agent. */
|
|
2
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
|
+
import { symbols } from '@deepseek-ai/cordis';
|
|
4
|
+
import { configurationOf } from './budgets.js';
|
|
5
|
+
import { compactByWindow } from './compaction.js';
|
|
6
|
+
import { applyPtcBudget } from './ptc-budget.js';
|
|
7
|
+
const current = new AsyncLocalStorage();
|
|
8
|
+
const officialPresets = new Set(['standard', 'ptc', 'minimal', 'cordis']);
|
|
9
|
+
// Profile plugins can load the same package in separate module graphs. Match the
|
|
10
|
+
// public engine contract rather than constructor identity across those graphs.
|
|
11
|
+
function isBasicEngine(value) {
|
|
12
|
+
if (!value || typeof value !== 'object')
|
|
13
|
+
return false;
|
|
14
|
+
const engine = value;
|
|
15
|
+
return typeof engine.compactIfNeeded === 'function' && typeof engine.compactRegion === 'function'
|
|
16
|
+
&& typeof engine.compactNow === 'function' && !!engine.config && Array.isArray(engine.config.modelPolicies);
|
|
17
|
+
}
|
|
18
|
+
function restoreOnDispose(ctx, reference, descriptors) {
|
|
19
|
+
ctx.effect(() => () => {
|
|
20
|
+
const target = reference.deref();
|
|
21
|
+
if (!target)
|
|
22
|
+
return;
|
|
23
|
+
for (const [key, descriptor] of Object.entries(descriptors)) {
|
|
24
|
+
if (descriptor)
|
|
25
|
+
Object.defineProperty(target, key, descriptor);
|
|
26
|
+
else
|
|
27
|
+
Reflect.deleteProperty(target, key);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function mergedConfig(base, budgets) {
|
|
32
|
+
const overrides = Object.fromEntries(Object.entries({ thresholdRatio: budgets.thresholdRatio,
|
|
33
|
+
retainRatio: budgets.retainRatio, maxTokens: budgets.summaryMaxTokens,
|
|
34
|
+
compactionRetries: budgets.compactionRetries, maxOverflowRetries: budgets.maxOverflowRetries,
|
|
35
|
+
}).filter(([, value]) => value !== undefined));
|
|
36
|
+
const merge = (value) => {
|
|
37
|
+
const config = { ...value, ...overrides };
|
|
38
|
+
if (budgets.retainRatio !== undefined)
|
|
39
|
+
delete config.retainTokens;
|
|
40
|
+
return config;
|
|
41
|
+
};
|
|
42
|
+
return { ...merge(base), modelPolicies: base.modelPolicies.map(merge) };
|
|
43
|
+
}
|
|
44
|
+
function bridge(ctx, engine, select) {
|
|
45
|
+
const base = engine.config;
|
|
46
|
+
const cached = new WeakMap();
|
|
47
|
+
const policy = (agent) => {
|
|
48
|
+
const budgets = select(agent);
|
|
49
|
+
if (!budgets)
|
|
50
|
+
return false;
|
|
51
|
+
let value = cached.get(agent);
|
|
52
|
+
if (!value) {
|
|
53
|
+
value = { engine, budgets, config: mergedConfig(base, budgets) };
|
|
54
|
+
cached.set(agent, value);
|
|
55
|
+
}
|
|
56
|
+
return value;
|
|
57
|
+
};
|
|
58
|
+
const descriptors = Object.fromEntries(['config', 'compactIfNeeded', 'compactRegion', 'compactNow']
|
|
59
|
+
.map(key => [key, Object.getOwnPropertyDescriptor(engine, key)]));
|
|
60
|
+
Object.defineProperty(engine, 'config', { configurable: true, get: () => {
|
|
61
|
+
const active = current.getStore();
|
|
62
|
+
return active && active.engine === engine ? active.config : base;
|
|
63
|
+
} });
|
|
64
|
+
const pressure = engine.compactIfNeeded, region = engine.compactRegion, now = engine.compactNow;
|
|
65
|
+
const run = (agent, action) => {
|
|
66
|
+
const selected = policy(agent);
|
|
67
|
+
return selected ? current.run(selected, () => action(selected.budgets)) : current.run(false, () => action(false));
|
|
68
|
+
};
|
|
69
|
+
engine.compactIfNeeded = (agent, trigger, signal) => run(agent, budgets => budgets && budgets.pressureBasis === 'window' && trigger === 'pressure'
|
|
70
|
+
? compactByWindow(engine, budgets, agent, signal) : pressure.call(engine, agent, trigger, signal));
|
|
71
|
+
engine.compactRegion = (start, end, agent, signal) => run(agent, () => region.call(engine, start, end, agent, signal));
|
|
72
|
+
engine.compactNow = (agent, signal, command) => run(agent, () => now.call(engine, agent, signal, command));
|
|
73
|
+
// Weak ownership avoids retaining obsolete preset generations for a long conversation.
|
|
74
|
+
restoreOnDispose(ctx, new WeakRef(engine), descriptors);
|
|
75
|
+
return run;
|
|
76
|
+
}
|
|
77
|
+
export function applyOfficialBudgets(ctx) {
|
|
78
|
+
ctx.inject(['agentPresets'], owner => {
|
|
79
|
+
const registry = owner.get('agentPresets');
|
|
80
|
+
const select = (agent) => {
|
|
81
|
+
if (!agent || !officialPresets.has(registry.composedPreset(agent.ctx) ?? ''))
|
|
82
|
+
return false;
|
|
83
|
+
const config = configurationOf(owner, agent);
|
|
84
|
+
return config.applyToOfficialPresets ? config.budgets ?? {} : false;
|
|
85
|
+
};
|
|
86
|
+
const engines = new WeakMap();
|
|
87
|
+
const install = (agent) => {
|
|
88
|
+
if (!select(agent))
|
|
89
|
+
return false;
|
|
90
|
+
let service = registry.serviceFor(agent, 'compaction');
|
|
91
|
+
while (service && service[symbols.original]) {
|
|
92
|
+
service = service[symbols.original];
|
|
93
|
+
}
|
|
94
|
+
if (!isBasicEngine(service))
|
|
95
|
+
return false;
|
|
96
|
+
let run = engines.get(service);
|
|
97
|
+
if (!run) {
|
|
98
|
+
run = bridge(owner, service, select);
|
|
99
|
+
engines.set(service, run);
|
|
100
|
+
}
|
|
101
|
+
return run;
|
|
102
|
+
};
|
|
103
|
+
owner.on('agent/created', ({ agent }) => { install(agent); });
|
|
104
|
+
// Also covers changing the preset of a blank conversation before its first step.
|
|
105
|
+
owner.on('agent/pre-step', ({ agent }, next) => { install(agent); return next(); }, true);
|
|
106
|
+
// Overflow retry limits are read by the host listener before compactIfNeeded.
|
|
107
|
+
owner.on('agent/request-error', ({ agent }, next) => {
|
|
108
|
+
const run = install(agent);
|
|
109
|
+
return run ? run(agent, () => next()) : current.run(false, () => next());
|
|
110
|
+
}, true);
|
|
111
|
+
applyPtcBudget(owner, agent => select(agent) || {});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=official-budgets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"official-budgets.js","sourceRoot":"","sources":["../../src/dsh/official-budgets.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAI7C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAQhD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAkB,CAAA;AACvD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAA;AAGzE,iFAAiF;AACjF,+EAA+E;AAC/E,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACrD,MAAM,MAAM,GAAG,KAA8B,CAAA;IAC7C,OAAO,OAAO,MAAM,CAAC,eAAe,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,UAAU;WAC5F,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;AAC/G,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAY,EAAE,SAAyC,EAAE,WAA2D;IAC5I,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;QACpB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAA;QAChC,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5D,IAAI,UAAU;gBAAE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAA;;gBACzD,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAkB,EAAE,OAAgB;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc;QAC1F,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,gBAAgB;QACrE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;KAC7F,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAA;IAC9C,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,SAAS,EAA6B,CAAA;QACpE,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,YAAY,CAAA;QACjE,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IACD,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAA6B,CAAA;AACpG,CAAC;AAED,SAAS,MAAM,CAAC,GAAY,EAAE,MAA6B,EAAE,MAAyC;IACpG,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAA;IAC1B,MAAM,MAAM,GAAG,IAAI,OAAO,EAAiB,CAAA;IAC3C,MAAM,MAAM,GAAG,CAAC,KAAY,EAAkB,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;QAC1B,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QAAC,CAAC;QAC1G,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,CAAC;SAChG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE;YACtE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;YACjC,OAAO,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;QAClE,CAAC,EAAE,CAAC,CAAA;IACJ,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,GAAG,GAAG,MAAM,CAAC,UAAU,CAAA;IAC/F,MAAM,GAAG,GAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QAC9B,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACnH,CAAC,CAAA;IACD,MAAM,CAAC,eAAe,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,IAAI,OAAO,CAAC,aAAa,KAAK,QAAQ,IAAI,OAAO,KAAK,UAAU;QAChJ,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;IACpG,MAAM,CAAC,aAAa,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;IACtH,MAAM,CAAC,UAAU,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC1G,uFAAuF;IACvF,gBAAgB,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAA;IACvD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,GAAG,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,EAAE;QACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,CAAa,CAAA;QACtD,MAAM,MAAM,GAAG,CAAC,KAAa,EAAmB,EAAE;YAChD,IAAI,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAAE,OAAO,KAAK,CAAA;YAC1F,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YAC5C,OAAO,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;QACrE,CAAC,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAoC,CAAA;QAC/D,MAAM,OAAO,GAAG,CAAC,KAAY,EAAqB,EAAE;YAClD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAA;YAChC,IAAI,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,CAAsC,CAAA;YAC3F,OAAO,OAAO,IAAK,OAA4D,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClG,OAAO,GAAI,OAA4D,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YAC3F,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;gBAAE,OAAO,KAAK,CAAA;YACzC,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAC9B,IAAI,CAAC,GAAG,EAAE,CAAC;gBAAC,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YAAC,CAAC;YAC7E,OAAO,GAAG,CAAA;QACZ,CAAC,CAAA;QACD,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAC5D,iFAAiF;QACjF,KAAK,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAA,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACxF,8EAA8E;QAC9E,KAAK,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE;YAClD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;YAC1B,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QAC1E,CAAC,EAAE,IAAI,CAAC,CAAA;QACR,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
3
|
+
import type { Budgets } from './budgets.js';
|
|
4
|
+
export declare function applyPtcBudget(ctx: Context, policy: Budgets | ((agent?: Agent) => Budgets)): void;
|
|
5
|
+
//# sourceMappingURL=ptc-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ptc-budget.d.ts","sourceRoot":"","sources":["../../src/dsh/ptc-budget.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AA2C3C,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,GAAG,IAAI,CAejG"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Bridge a scoped default to the host's shared PTC provider without rewriting logged tool arguments. */
|
|
2
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
|
+
import { symbols } from '@deepseek-ai/cordis';
|
|
4
|
+
const current = new AsyncLocalStorage();
|
|
5
|
+
const bridges = new WeakMap();
|
|
6
|
+
/** One reference-counted adapter per provider, removed when its last scope unloads. */
|
|
7
|
+
function retainBridge(service) {
|
|
8
|
+
let runtime = service;
|
|
9
|
+
while (runtime[symbols.original])
|
|
10
|
+
runtime = runtime[symbols.original];
|
|
11
|
+
let bridge = bridges.get(runtime);
|
|
12
|
+
if (!bridge) {
|
|
13
|
+
const original = runtime.resolve;
|
|
14
|
+
const wrapped = function (request) {
|
|
15
|
+
const budget = current.getStore();
|
|
16
|
+
if (!budget)
|
|
17
|
+
return original.call(this, request);
|
|
18
|
+
const limits = this.timeout;
|
|
19
|
+
if (!limits)
|
|
20
|
+
throw new Error('This PTC provider does not support configured elapsed budgets');
|
|
21
|
+
const cap = Math.min(budget.ptcMaxTimeoutMs ?? limits.maxMs, limits.maxMs);
|
|
22
|
+
const timeout = request.timeoutMs ?? budget.ptcTimeoutMs ?? limits.defaultMs;
|
|
23
|
+
// Explicit no-deadline calls remain no-deadline unless the plugin configured a ceiling.
|
|
24
|
+
const selected = request.timeoutMs === null && budget.ptcMaxTimeoutMs === undefined ? null : Math.min(timeout, cap);
|
|
25
|
+
return original.call(this, { ...request, timeoutMs: selected });
|
|
26
|
+
};
|
|
27
|
+
bridge = { users: 0, original, wrapped };
|
|
28
|
+
runtime.resolve = wrapped;
|
|
29
|
+
bridges.set(runtime, bridge);
|
|
30
|
+
}
|
|
31
|
+
bridge.users++;
|
|
32
|
+
let released = false;
|
|
33
|
+
return () => {
|
|
34
|
+
if (released)
|
|
35
|
+
return;
|
|
36
|
+
released = true;
|
|
37
|
+
if (--bridge.users !== 0)
|
|
38
|
+
return;
|
|
39
|
+
if (runtime.resolve === bridge.wrapped)
|
|
40
|
+
runtime.resolve = bridge.original;
|
|
41
|
+
bridges.delete(runtime);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function applyPtcBudget(ctx, policy) {
|
|
45
|
+
if (typeof policy !== 'function' && policy.ptcTimeoutMs === undefined && policy.ptcMaxTimeoutMs === undefined)
|
|
46
|
+
return;
|
|
47
|
+
ctx.inject(['ptcRuntime'], owner => {
|
|
48
|
+
const runtime = owner.get('ptcRuntime');
|
|
49
|
+
const release = retainBridge(runtime);
|
|
50
|
+
owner.effect(() => release);
|
|
51
|
+
owner.on('tools/execute', (exec, next) => {
|
|
52
|
+
if (exec.name !== 'run_code')
|
|
53
|
+
return next();
|
|
54
|
+
const budgets = typeof policy === 'function' ? policy(exec.agent) : policy;
|
|
55
|
+
if (budgets.ptcTimeoutMs === undefined && budgets.ptcMaxTimeoutMs === undefined)
|
|
56
|
+
return next();
|
|
57
|
+
if (!runtime.timeout)
|
|
58
|
+
throw new Error('This PTC provider does not support configured elapsed budgets');
|
|
59
|
+
if ((budgets.ptcTimeoutMs ?? 0) > runtime.timeout.maxMs || (budgets.ptcMaxTimeoutMs ?? 0) > runtime.timeout.maxMs)
|
|
60
|
+
throw new Error('Configured PTC budget exceeds the host provider ceiling');
|
|
61
|
+
return current.run(budgets, next);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=ptc-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ptc-budget.js","sourceRoot":"","sources":["../../src/dsh/ptc-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"super-code.d.ts","sourceRoot":"","sources":["../../src/dsh/super-code.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAgBxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"super-code.d.ts","sourceRoot":"","sources":["../../src/dsh/super-code.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAgBxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAStD,eAAO,MAAM,IAAI,eAAe,CAAA;AAChC,eAAO,MAAM,MAAM,EAAE,SAAS,MAAM,EAAgE,CAAA;AACpG,MAAM,WAAW,MAAM;IAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAE;AACvM,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAM3B,CAAA;AAuCF,wDAAwD;AACxD,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAW,GAAG,IAAI,CAsS7D;AAED,QAAA,MAAM,MAAM,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,KAAK,CAAA;CAAoC,CAAA;AACvK,eAAe,MAAM,CAAA"}
|