deepclause-sdk 0.0.89 → 0.1.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/README.md +481 -941
- package/dist/agent.d.ts +19 -2
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +75 -21
- package/dist/agent.js.map +1 -1
- package/dist/cli/config.d.ts +385 -178
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +161 -188
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/index.d.ts +3 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +85 -411
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/login.d.ts +29 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +184 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/readline.d.ts +6 -0
- package/dist/cli/readline.d.ts.map +1 -0
- package/dist/cli/readline.js +15 -0
- package/dist/cli/readline.js.map +1 -0
- package/dist/cli/repl-bin.d.ts +9 -0
- package/dist/cli/repl-bin.d.ts.map +1 -0
- package/dist/cli/repl-bin.js +16 -0
- package/dist/cli/repl-bin.js.map +1 -0
- package/dist/cli/repl.d.ts +216 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +1392 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/run.d.ts +17 -18
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +202 -183
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/set-backend.d.ts +53 -0
- package/dist/cli/set-backend.d.ts.map +1 -0
- package/dist/cli/set-backend.js +259 -0
- package/dist/cli/set-backend.js.map +1 -0
- package/dist/cli/visualize.d.ts +42 -0
- package/dist/cli/visualize.d.ts.map +1 -0
- package/dist/cli/visualize.js +150 -0
- package/dist/cli/visualize.js.map +1 -0
- package/dist/compiler.d.ts +5 -52
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +4 -768
- package/dist/compiler.js.map +1 -1
- package/dist/index.d.ts +27 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/dist/prolog/bridge.d.ts +5 -1
- package/dist/prolog/bridge.d.ts.map +1 -1
- package/dist/prolog/bridge.js +10 -1
- package/dist/prolog/bridge.js.map +1 -1
- package/dist/prolog-src/deepclause_analysis.pl +10 -2
- package/dist/prolog-src/deepclause_mi.pl +2440 -49
- package/dist/repl/agent.d.ts +90 -0
- package/dist/repl/agent.d.ts.map +1 -0
- package/dist/repl/agent.js +410 -0
- package/dist/repl/agent.js.map +1 -0
- package/dist/repl/auth.d.ts +45 -0
- package/dist/repl/auth.d.ts.map +1 -0
- package/dist/repl/auth.js +116 -0
- package/dist/repl/auth.js.map +1 -0
- package/dist/repl/backend.d.ts +321 -0
- package/dist/repl/backend.d.ts.map +1 -0
- package/dist/repl/backend.js +415 -0
- package/dist/repl/backend.js.map +1 -0
- package/dist/repl/compaction.d.ts +122 -0
- package/dist/repl/compaction.d.ts.map +1 -0
- package/dist/repl/compaction.js +318 -0
- package/dist/repl/compaction.js.map +1 -0
- package/dist/repl/export.d.ts +30 -0
- package/dist/repl/export.d.ts.map +1 -0
- package/dist/repl/export.js +23 -0
- package/dist/repl/export.js.map +1 -0
- package/dist/repl/frames.d.ts +21 -0
- package/dist/repl/frames.d.ts.map +1 -0
- package/dist/repl/frames.js +79 -0
- package/dist/repl/frames.js.map +1 -0
- package/dist/repl/harness-tools.d.ts +99 -0
- package/dist/repl/harness-tools.d.ts.map +1 -0
- package/dist/repl/harness-tools.js +192 -0
- package/dist/repl/harness-tools.js.map +1 -0
- package/dist/repl/highlight.d.ts +30 -0
- package/dist/repl/highlight.d.ts.map +1 -0
- package/dist/repl/highlight.js +285 -0
- package/dist/repl/highlight.js.map +1 -0
- package/dist/repl/history.d.ts +234 -0
- package/dist/repl/history.d.ts.map +1 -0
- package/dist/repl/history.js +661 -0
- package/dist/repl/history.js.map +1 -0
- package/dist/repl/imagegen.d.ts +29 -0
- package/dist/repl/imagegen.d.ts.map +1 -0
- package/dist/repl/imagegen.js +84 -0
- package/dist/repl/imagegen.js.map +1 -0
- package/dist/repl/index.d.ts +130 -0
- package/dist/repl/index.d.ts.map +1 -0
- package/dist/repl/index.js +112 -0
- package/dist/repl/index.js.map +1 -0
- package/dist/repl/judge.d.ts +51 -0
- package/dist/repl/judge.d.ts.map +1 -0
- package/dist/repl/judge.js +58 -0
- package/dist/repl/judge.js.map +1 -0
- package/dist/repl/markdown.d.ts +25 -0
- package/dist/repl/markdown.d.ts.map +1 -0
- package/dist/repl/markdown.js +103 -0
- package/dist/repl/markdown.js.map +1 -0
- package/dist/repl/model-resolver.d.ts +59 -0
- package/dist/repl/model-resolver.d.ts.map +1 -0
- package/dist/repl/model-resolver.js +156 -0
- package/dist/repl/model-resolver.js.map +1 -0
- package/dist/repl/picker.d.ts +34 -0
- package/dist/repl/picker.d.ts.map +1 -0
- package/dist/repl/picker.js +81 -0
- package/dist/repl/picker.js.map +1 -0
- package/dist/repl/project-context.d.ts +16 -0
- package/dist/repl/project-context.d.ts.map +1 -0
- package/dist/repl/project-context.js +23 -0
- package/dist/repl/project-context.js.map +1 -0
- package/dist/repl/render.d.ts +187 -0
- package/dist/repl/render.d.ts.map +1 -0
- package/dist/repl/render.js +808 -0
- package/dist/repl/render.js.map +1 -0
- package/dist/repl/session.d.ts +424 -0
- package/dist/repl/session.d.ts.map +1 -0
- package/dist/repl/session.js +1473 -0
- package/dist/repl/session.js.map +1 -0
- package/dist/repl/status.d.ts +100 -0
- package/dist/repl/status.d.ts.map +1 -0
- package/dist/repl/status.js +218 -0
- package/dist/repl/status.js.map +1 -0
- package/dist/repl/tools.d.ts +53 -0
- package/dist/repl/tools.d.ts.map +1 -0
- package/dist/repl/tools.js +307 -0
- package/dist/repl/tools.js.map +1 -0
- package/dist/repl/toolset.d.ts +32 -0
- package/dist/repl/toolset.d.ts.map +1 -0
- package/dist/repl/toolset.js +82 -0
- package/dist/repl/toolset.js.map +1 -0
- package/dist/repl/tui/editor.d.ts +17 -0
- package/dist/repl/tui/editor.d.ts.map +1 -0
- package/dist/repl/tui/editor.js +39 -0
- package/dist/repl/tui/editor.js.map +1 -0
- package/dist/repl/tui/status-bar.d.ts +26 -0
- package/dist/repl/tui/status-bar.d.ts.map +1 -0
- package/dist/repl/tui/status-bar.js +47 -0
- package/dist/repl/tui/status-bar.js.map +1 -0
- package/dist/repl/tui/theme.d.ts +30 -0
- package/dist/repl/tui/theme.d.ts.map +1 -0
- package/dist/repl/tui/theme.js +81 -0
- package/dist/repl/tui/theme.js.map +1 -0
- package/dist/repl/tui/transcript.d.ts +41 -0
- package/dist/repl/tui/transcript.d.ts.map +1 -0
- package/dist/repl/tui/transcript.js +139 -0
- package/dist/repl/tui/transcript.js.map +1 -0
- package/dist/runner.d.ts +143 -13
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +532 -290
- package/dist/runner.js.map +1 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +0 -32
- package/dist/sdk.js.map +1 -1
- package/dist/system/assets/docs/AGENT_PROMPT.md +1447 -0
- package/dist/system/assets/docs/DML_AUTHORING.md +195 -0
- package/dist/system/assets/docs/DML_REFERENCE.md +344 -72
- package/dist/system/assets/docs/HARNESS_EXAMPLES.md +172 -0
- package/dist/system/assets/docs/HARNESS_PATTERNS.md +562 -0
- package/dist/system/assets/docs/META_PROMPT.md +68 -0
- package/dist/system/assets/docs/PROLOG_SNIPPETS.md +117 -0
- package/dist/system/assets/index.d.ts +9 -17
- package/dist/system/assets/index.d.ts.map +1 -1
- package/dist/system/assets/index.js +26 -85
- package/dist/system/assets/index.js.map +1 -1
- package/dist/system/runtime/agentvm-manager.d.ts +9 -2
- package/dist/system/runtime/agentvm-manager.d.ts.map +1 -1
- package/dist/system/runtime/agentvm-manager.js +70 -44
- package/dist/system/runtime/agentvm-manager.js.map +1 -1
- package/dist/system/runtime/media.d.ts +23 -0
- package/dist/system/runtime/media.d.ts.map +1 -0
- package/dist/system/runtime/media.js +55 -0
- package/dist/system/runtime/media.js.map +1 -0
- package/dist/system/runtime/shell-limits.d.ts +21 -0
- package/dist/system/runtime/shell-limits.d.ts.map +1 -0
- package/dist/system/runtime/shell-limits.js +39 -0
- package/dist/system/runtime/shell-limits.js.map +1 -0
- package/dist/system/runtime/shell-manager.d.ts +8 -3
- package/dist/system/runtime/shell-manager.d.ts.map +1 -1
- package/dist/system/runtime/shell-manager.js +56 -39
- package/dist/system/runtime/shell-manager.js.map +1 -1
- package/dist/system/runtime/shell-tool-events.js +5 -0
- package/dist/system/runtime/shell-tool-events.js.map +1 -1
- package/dist/system/runtime/token-usage.d.ts +2 -0
- package/dist/system/runtime/token-usage.d.ts.map +1 -1
- package/dist/system/runtime/token-usage.js +7 -0
- package/dist/system/runtime/token-usage.js.map +1 -1
- package/dist/tools.d.ts +3 -21
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +14 -168
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +136 -119
- package/dist/types.d.ts.map +1 -1
- package/dist/validate.d.ts +19 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +338 -0
- package/dist/validate.js.map +1 -0
- package/dist/visualize/ascii.d.ts +55 -0
- package/dist/visualize/ascii.d.ts.map +1 -0
- package/dist/visualize/ascii.js +242 -0
- package/dist/visualize/ascii.js.map +1 -0
- package/dist/visualize/display.d.ts +24 -0
- package/dist/visualize/display.d.ts.map +1 -0
- package/dist/visualize/display.js +29 -0
- package/dist/visualize/display.js.map +1 -0
- package/dist/visualize/graphics.d.ts +35 -0
- package/dist/visualize/graphics.d.ts.map +1 -0
- package/dist/visualize/graphics.js +96 -0
- package/dist/visualize/graphics.js.map +1 -0
- package/dist/visualize/image.d.ts +38 -0
- package/dist/visualize/image.d.ts.map +1 -0
- package/dist/visualize/image.js +95 -0
- package/dist/visualize/image.js.map +1 -0
- package/dist/visualize/index.d.ts +59 -0
- package/dist/visualize/index.d.ts.map +1 -0
- package/dist/visualize/index.js +198 -0
- package/dist/visualize/index.js.map +1 -0
- package/dist/visualize/raster.d.ts +23 -0
- package/dist/visualize/raster.d.ts.map +1 -0
- package/dist/visualize/raster.js +47 -0
- package/dist/visualize/raster.js.map +1 -0
- package/dist/visualize/svg.d.ts +39 -0
- package/dist/visualize/svg.d.ts.map +1 -0
- package/dist/visualize/svg.js +148 -0
- package/dist/visualize/svg.js.map +1 -0
- package/dist/visualize/transcode.d.ts +13 -0
- package/dist/visualize/transcode.d.ts.map +1 -0
- package/dist/visualize/transcode.js +40 -0
- package/dist/visualize/transcode.js.map +1 -0
- package/docs/images/repl.png +0 -0
- package/package.json +19 -15
- package/src/prolog-src/deepclause_analysis.pl +10 -2
- package/src/prolog-src/deepclause_mi.pl +2440 -49
- package/dist/cli/commands.d.ts +0 -42
- package/dist/cli/commands.d.ts.map +0 -1
- package/dist/cli/commands.js +0 -246
- package/dist/cli/commands.js.map +0 -1
- package/dist/cli/compile.d.ts +0 -99
- package/dist/cli/compile.d.ts.map +0 -1
- package/dist/cli/compile.js +0 -363
- package/dist/cli/compile.js.map +0 -1
- package/dist/cli/default-skills.d.ts +0 -10
- package/dist/cli/default-skills.d.ts.map +0 -1
- package/dist/cli/default-skills.js +0 -206
- package/dist/cli/default-skills.js.map +0 -1
- package/dist/cli/interactive.d.ts +0 -2
- package/dist/cli/interactive.d.ts.map +0 -1
- package/dist/cli/interactive.js +0 -20
- package/dist/cli/interactive.js.map +0 -1
- package/dist/cli/mcp.d.ts +0 -56
- package/dist/cli/mcp.d.ts.map +0 -1
- package/dist/cli/mcp.js +0 -138
- package/dist/cli/mcp.js.map +0 -1
- package/dist/cli/prompt.d.ts +0 -2
- package/dist/cli/prompt.d.ts.map +0 -1
- package/dist/cli/prompt.js +0 -2
- package/dist/cli/prompt.js.map +0 -1
- package/dist/cli/search.d.ts +0 -19
- package/dist/cli/search.d.ts.map +0 -1
- package/dist/cli/search.js +0 -189
- package/dist/cli/search.js.map +0 -1
- package/dist/cli/tool-args.d.ts +0 -2
- package/dist/cli/tool-args.d.ts.map +0 -1
- package/dist/cli/tool-args.js +0 -39
- package/dist/cli/tool-args.js.map +0 -1
- package/dist/cli/tools.d.ts +0 -36
- package/dist/cli/tools.d.ts.map +0 -1
- package/dist/cli/tools.js +0 -229
- package/dist/cli/tools.js.map +0 -1
- package/dist/cli/tui/index.d.ts +0 -22
- package/dist/cli/tui/index.d.ts.map +0 -1
- package/dist/cli/tui/index.js +0 -29
- package/dist/cli/tui/index.js.map +0 -1
- package/dist/cli/tui.d.ts +0 -167
- package/dist/cli/tui.d.ts.map +0 -1
- package/dist/cli/tui.js +0 -5228
- package/dist/cli/tui.js.map +0 -1
- package/dist/compiler_prompt.d.ts +0 -20
- package/dist/compiler_prompt.d.ts.map +0 -1
- package/dist/compiler_prompt.js +0 -870
- package/dist/compiler_prompt.js.map +0 -1
- package/dist/deepclause-cli.skill +0 -0
- package/dist/prolog-src/deepclause_mi.pl.bak +0 -570
- package/dist/system/assets/docs/CONDUCTOR_PROMPT.md +0 -105
- package/dist/system/assets/docs/DML_COMPILER_PROMPT.md +0 -700
- package/dist/system/assets/docs/TUI.md +0 -150
- package/dist/system/assets/recipes/deepclause-coding-workflow/SKILL.md +0 -100
- package/dist/system/assets/skills/conductor.dml +0 -76
- package/dist/system/assets/skills/deep-planner.dml +0 -412
- package/dist/system/assets/skills/plan.dml +0 -429
- package/dist/system/assets/skills/security-planner.dml +0 -337
- package/dist/system/assets/skills/skill-creator.dml +0 -187
- package/dist/system/runtime/catalog-recipes.d.ts +0 -24
- package/dist/system/runtime/catalog-recipes.d.ts.map +0 -1
- package/dist/system/runtime/catalog-recipes.js +0 -273
- package/dist/system/runtime/catalog-recipes.js.map +0 -1
- package/dist/system/runtime/catalog-skills.d.ts +0 -50
- package/dist/system/runtime/catalog-skills.d.ts.map +0 -1
- package/dist/system/runtime/catalog-skills.js +0 -152
- package/dist/system/runtime/catalog-skills.js.map +0 -1
- package/dist/system/runtime/conductor.d.ts +0 -105
- package/dist/system/runtime/conductor.d.ts.map +0 -1
- package/dist/system/runtime/conductor.js +0 -732
- package/dist/system/runtime/conductor.js.map +0 -1
- package/dist/system/runtime/console-capture.d.ts +0 -9
- package/dist/system/runtime/console-capture.d.ts.map +0 -1
- package/dist/system/runtime/console-capture.js +0 -67
- package/dist/system/runtime/console-capture.js.map +0 -1
- package/dist/system/runtime/dml-executor.d.ts +0 -52
- package/dist/system/runtime/dml-executor.d.ts.map +0 -1
- package/dist/system/runtime/dml-executor.js +0 -203
- package/dist/system/runtime/dml-executor.js.map +0 -1
- package/dist/system/runtime/runtime-tools.d.ts +0 -31
- package/dist/system/runtime/runtime-tools.d.ts.map +0 -1
- package/dist/system/runtime/runtime-tools.js +0 -312
- package/dist/system/runtime/runtime-tools.js.map +0 -1
- package/dist/system/runtime/skill-creator.d.ts +0 -38
- package/dist/system/runtime/skill-creator.d.ts.map +0 -1
- package/dist/system/runtime/skill-creator.js +0 -763
- package/dist/system/runtime/skill-creator.js.map +0 -1
- package/src/prolog-src/deepclause_mi.pl.bak +0 -570
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend resolution for the REPL (M5).
|
|
3
|
+
*
|
|
4
|
+
* `env` uses the SDK's provider/API-key backend (unchanged). `pi` reuses pi's
|
|
5
|
+
* own model registry and credential store so the REPL runs against the model
|
|
6
|
+
* configured in pi, without asking for API keys or writing provider env vars.
|
|
7
|
+
*
|
|
8
|
+
* The pi packages are optional peers and loaded with a dynamic import only when
|
|
9
|
+
* the pi backend is selected.
|
|
10
|
+
*/
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
export const THINKING_LEVELS = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];
|
|
13
|
+
/** Levels a model accepts: reasoning models expose all but explicitly-unsupported ones. */
|
|
14
|
+
export function supportedThinkingLevels(model) {
|
|
15
|
+
if (!model.reasoning) {
|
|
16
|
+
return ['off'];
|
|
17
|
+
}
|
|
18
|
+
return THINKING_LEVELS.filter((level) => model.thinkingLevelMap?.[level] !== null);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate a requested thinking level against the model. Returns the level to
|
|
22
|
+
* pass through (or `undefined` for the provider default) plus a warning when a
|
|
23
|
+
* request had to be dropped.
|
|
24
|
+
*/
|
|
25
|
+
export function resolveThinkingLevel(model, requested) {
|
|
26
|
+
const supported = supportedThinkingLevels(model);
|
|
27
|
+
if (!requested) {
|
|
28
|
+
return { level: undefined, supported };
|
|
29
|
+
}
|
|
30
|
+
if (THINKING_LEVELS.includes(requested) && supported.includes(requested)) {
|
|
31
|
+
return { level: requested, supported };
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
level: undefined,
|
|
35
|
+
supported,
|
|
36
|
+
warning: `thinking level '${requested}' is not supported by ${model.provider}/${model.id}; using the provider default`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Resolve pi's agent dir, models.json, and auth.json paths. */
|
|
40
|
+
export function resolvePiPaths(config, defaults) {
|
|
41
|
+
const agentDir = config.agentDir ?? defaults.agentDir;
|
|
42
|
+
return {
|
|
43
|
+
agentDir,
|
|
44
|
+
modelsPath: config.modelsPath ?? path.join(agentDir, 'models.json'),
|
|
45
|
+
authPath: config.authPath ?? path.join(agentDir, 'auth.json'),
|
|
46
|
+
model: config.model,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function modelLabel(model) {
|
|
50
|
+
return `${model.provider}/${model.id}`;
|
|
51
|
+
}
|
|
52
|
+
/** Find a pi model by provider+id (registry `find` when present, else the catalog). */
|
|
53
|
+
function findPiModel(registry, target) {
|
|
54
|
+
const found = registry.find?.(target.provider, target.id);
|
|
55
|
+
if (found) {
|
|
56
|
+
return found;
|
|
57
|
+
}
|
|
58
|
+
return registry.getAvailable().find((model) => model.provider === target.provider && model.id === target.id);
|
|
59
|
+
}
|
|
60
|
+
/** Select the pi model to use, honoring an explicit provider/model request. */
|
|
61
|
+
export function selectPiModel(registry, requested) {
|
|
62
|
+
const available = registry.getAvailable();
|
|
63
|
+
if (available.length === 0) {
|
|
64
|
+
throw new Error('pi has no configured models; run pi or `deepclause set-backend env`');
|
|
65
|
+
}
|
|
66
|
+
if (requested) {
|
|
67
|
+
const normalized = requested.replace(':', '/');
|
|
68
|
+
const [provider, ...rest] = normalized.split('/');
|
|
69
|
+
const modelId = rest.join('/');
|
|
70
|
+
if (modelId && registry.find) {
|
|
71
|
+
const found = registry.find(provider, modelId);
|
|
72
|
+
if (found)
|
|
73
|
+
return found;
|
|
74
|
+
}
|
|
75
|
+
const byId = available.find((model) => model.id === requested || modelLabel(model) === requested);
|
|
76
|
+
if (byId)
|
|
77
|
+
return byId;
|
|
78
|
+
throw new Error(`pi model not found: ${requested}`);
|
|
79
|
+
}
|
|
80
|
+
return available[0];
|
|
81
|
+
}
|
|
82
|
+
function emptyUsage() {
|
|
83
|
+
return { input: 0, output: 0, totalTokens: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0 };
|
|
84
|
+
}
|
|
85
|
+
function toPiMessages(messages, model) {
|
|
86
|
+
return messages
|
|
87
|
+
.filter((message) => message.role !== 'system')
|
|
88
|
+
.map((message) => {
|
|
89
|
+
if (message.role === 'assistant' && message.providerData) {
|
|
90
|
+
return message.providerData;
|
|
91
|
+
}
|
|
92
|
+
if (message.role === 'user') {
|
|
93
|
+
// Attach resolved media as pi image content blocks alongside the text.
|
|
94
|
+
const content = message.media && message.media.length > 0
|
|
95
|
+
? [
|
|
96
|
+
...(message.content ? [{ type: 'text', text: message.content }] : []),
|
|
97
|
+
...message.media.map((media) => ({
|
|
98
|
+
type: 'image',
|
|
99
|
+
data: media.data,
|
|
100
|
+
mimeType: media.mimeType,
|
|
101
|
+
})),
|
|
102
|
+
]
|
|
103
|
+
: message.content;
|
|
104
|
+
return { role: 'user', content, timestamp: Date.now() };
|
|
105
|
+
}
|
|
106
|
+
if (message.role === 'tool') {
|
|
107
|
+
return {
|
|
108
|
+
role: 'toolResult',
|
|
109
|
+
toolCallId: message.toolCallId ?? 'unknown',
|
|
110
|
+
toolName: message.toolName ?? 'unknown',
|
|
111
|
+
content: [{ type: 'text', text: message.content }],
|
|
112
|
+
isError: false,
|
|
113
|
+
timestamp: Date.now(),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
role: 'assistant',
|
|
118
|
+
content: [
|
|
119
|
+
...(message.content ? [{ type: 'text', text: message.content }] : []),
|
|
120
|
+
...(message.toolCalls ?? []).map((call) => ({
|
|
121
|
+
type: 'toolCall',
|
|
122
|
+
id: call.id,
|
|
123
|
+
name: call.name,
|
|
124
|
+
arguments: call.arguments,
|
|
125
|
+
})),
|
|
126
|
+
],
|
|
127
|
+
api: model.api,
|
|
128
|
+
provider: model.provider,
|
|
129
|
+
model: model.id,
|
|
130
|
+
usage: emptyUsage(),
|
|
131
|
+
stopReason: message.toolCalls?.length ? 'toolUse' : 'stop',
|
|
132
|
+
timestamp: Date.now(),
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Wrap a pi registry + model as an SDK `LLMBackend`. Reused by the extension
|
|
138
|
+
* embedding, which passes its live registry.
|
|
139
|
+
*
|
|
140
|
+
* `thinkingLevel` is forwarded to the provider only for reasoning models and
|
|
141
|
+
* non-`off` levels, so provider defaults are preserved for every other model.
|
|
142
|
+
*/
|
|
143
|
+
export function createPiAdapter(registry, model, maxTokens = 65536, thinkingLevel) {
|
|
144
|
+
if (!registry.hasConfiguredAuth(model)) {
|
|
145
|
+
throw new Error(`pi has no configured authentication for ${modelLabel(model)}`);
|
|
146
|
+
}
|
|
147
|
+
const baseResolved = resolveThinkingLevel(model, thinkingLevel);
|
|
148
|
+
// Per-call model overrides from `with_model/2`, resolved lazily and cached.
|
|
149
|
+
const scoped = new Map();
|
|
150
|
+
const resolveScoped = (target) => {
|
|
151
|
+
const key = `${target.provider}/${target.id}`;
|
|
152
|
+
const cached = scoped.get(key);
|
|
153
|
+
if (cached) {
|
|
154
|
+
return cached;
|
|
155
|
+
}
|
|
156
|
+
const found = findPiModel(registry, target);
|
|
157
|
+
if (!found) {
|
|
158
|
+
throw new Error(`pi model not found: ${key}`);
|
|
159
|
+
}
|
|
160
|
+
if (!registry.hasConfiguredAuth(found)) {
|
|
161
|
+
throw new Error(`pi has no configured authentication for ${key}`);
|
|
162
|
+
}
|
|
163
|
+
const entry = { model: found, resolved: resolveThinkingLevel(found, target.reasoningLevel) };
|
|
164
|
+
scoped.set(key, entry);
|
|
165
|
+
return entry;
|
|
166
|
+
};
|
|
167
|
+
const completeWith = async (activeModel, activeResolved, defaultMaxTokens, request) => {
|
|
168
|
+
const systemPrompt = request.messages
|
|
169
|
+
.filter((message) => message.role === 'system')
|
|
170
|
+
.map((message) => message.content)
|
|
171
|
+
.join('\n\n');
|
|
172
|
+
const context = {
|
|
173
|
+
systemPrompt: systemPrompt || undefined,
|
|
174
|
+
messages: toPiMessages(request.messages, activeModel),
|
|
175
|
+
tools: request.tools?.map((tool) => ({
|
|
176
|
+
name: tool.name,
|
|
177
|
+
description: tool.description,
|
|
178
|
+
parameters: tool.parameters,
|
|
179
|
+
})),
|
|
180
|
+
};
|
|
181
|
+
const options = {
|
|
182
|
+
signal: request.signal,
|
|
183
|
+
maxTokens: request.maxTokens ?? defaultMaxTokens,
|
|
184
|
+
cacheRetention: 'none',
|
|
185
|
+
};
|
|
186
|
+
// Model defaults the caller's temperature only when a scope explicitly set
|
|
187
|
+
// one (pi itself never forwards an ambient temperature, and some models —
|
|
188
|
+
// e.g. github-copilot — reject the parameter). `compat.supportsTemperature`
|
|
189
|
+
// opts a model out when pi knows it rejects it.
|
|
190
|
+
const scopedTemperature = request.target?.temperature;
|
|
191
|
+
if (typeof scopedTemperature === 'number'
|
|
192
|
+
&& activeModel.compat?.supportsTemperature !== false) {
|
|
193
|
+
options.temperature = scopedTemperature;
|
|
194
|
+
}
|
|
195
|
+
if (activeModel.reasoning && activeResolved.level && activeResolved.level !== 'off') {
|
|
196
|
+
// pi's `SimpleStreamOptions` enables thinking with `reasoning` (a
|
|
197
|
+
// ThinkingLevel), not `thinkingLevel`.
|
|
198
|
+
options.reasoning = activeResolved.level;
|
|
199
|
+
}
|
|
200
|
+
let response;
|
|
201
|
+
if (registry.streamSimple) {
|
|
202
|
+
// Stream text/thinking deltas as they arrive; the final message carries
|
|
203
|
+
// the full text, tool calls, and usage.
|
|
204
|
+
const stream = registry.streamSimple(activeModel, context, options);
|
|
205
|
+
for await (const event of stream) {
|
|
206
|
+
if (event.type === 'text_delta') {
|
|
207
|
+
if (event.delta)
|
|
208
|
+
request.onText?.(event.delta);
|
|
209
|
+
}
|
|
210
|
+
else if (event.type === 'thinking_delta') {
|
|
211
|
+
if (event.delta)
|
|
212
|
+
request.onReasoning?.(event.delta);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
response = await stream.result();
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
response = await registry.complete(activeModel, context, options);
|
|
219
|
+
const streamedText = response.content
|
|
220
|
+
.filter((content) => content.type === 'text')
|
|
221
|
+
.map((content) => content.text)
|
|
222
|
+
.join('');
|
|
223
|
+
if (streamedText)
|
|
224
|
+
request.onText?.(streamedText);
|
|
225
|
+
}
|
|
226
|
+
if (response.stopReason === 'error' || response.stopReason === 'aborted') {
|
|
227
|
+
throw new Error(response.errorMessage || `pi model request ${response.stopReason}`);
|
|
228
|
+
}
|
|
229
|
+
const text = response.content
|
|
230
|
+
.filter((content) => content.type === 'text')
|
|
231
|
+
.map((content) => content.text)
|
|
232
|
+
.join('');
|
|
233
|
+
return {
|
|
234
|
+
text,
|
|
235
|
+
toolCalls: response.content
|
|
236
|
+
.filter((content) => content.type === 'toolCall')
|
|
237
|
+
.map((call) => ({ id: call.id, name: call.name, arguments: call.arguments })),
|
|
238
|
+
usage: {
|
|
239
|
+
inputTokens: response.usage.input,
|
|
240
|
+
outputTokens: response.usage.output,
|
|
241
|
+
totalTokens: response.usage.totalTokens,
|
|
242
|
+
cacheReadTokens: response.usage.cacheRead || undefined,
|
|
243
|
+
cacheWriteTokens: response.usage.cacheWrite || undefined,
|
|
244
|
+
reasoningTokens: response.usage.reasoning || undefined,
|
|
245
|
+
},
|
|
246
|
+
finishReason: response.stopReason === 'toolUse'
|
|
247
|
+
? 'tool_use'
|
|
248
|
+
: response.stopReason === 'length'
|
|
249
|
+
? 'length'
|
|
250
|
+
: 'stop',
|
|
251
|
+
providerData: response,
|
|
252
|
+
};
|
|
253
|
+
};
|
|
254
|
+
const backend = {
|
|
255
|
+
async complete(request) {
|
|
256
|
+
if (request.target && (request.target.provider !== model.provider || request.target.id !== model.id)) {
|
|
257
|
+
const entry = resolveScoped(request.target);
|
|
258
|
+
return completeWith(entry.model, entry.resolved, request.target.maxTokens ?? maxTokens, request);
|
|
259
|
+
}
|
|
260
|
+
return completeWith(model, baseResolved, maxTokens, request);
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
return {
|
|
264
|
+
backend,
|
|
265
|
+
registry,
|
|
266
|
+
modelId: modelLabel(model),
|
|
267
|
+
provider: model.provider,
|
|
268
|
+
contextWindow: model.contextWindow,
|
|
269
|
+
maxTokens,
|
|
270
|
+
reasoning: Boolean(model.reasoning),
|
|
271
|
+
thinkingLevel: baseResolved.level,
|
|
272
|
+
supportedThinkingLevels: baseResolved.supported,
|
|
273
|
+
warning: baseResolved.warning,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
const PI_PACKAGE_NAME = '@earendil-works/pi-coding-agent';
|
|
277
|
+
/**
|
|
278
|
+
* Import the pi coding agent. It is a regular dependency of this SDK, so the
|
|
279
|
+
* bare specifier always resolves; a globally installed `pi` is deliberately
|
|
280
|
+
* not consulted, which keeps the version deterministic.
|
|
281
|
+
*/
|
|
282
|
+
async function importPiModule() {
|
|
283
|
+
try {
|
|
284
|
+
return (await import(PI_PACKAGE_NAME));
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
throw new Error(`Backend 'pi' requires ${PI_PACKAGE_NAME} (a dependency of this SDK). `
|
|
288
|
+
+ 'Reinstall dependencies, or run `deepclause set-backend env` to use the SDK provider/API-key backend.');
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/** Build the catalog `PiModelInfo` (with reasoning levels) from a raw model. */
|
|
292
|
+
export function toPiModelInfo(model) {
|
|
293
|
+
return {
|
|
294
|
+
provider: model.provider,
|
|
295
|
+
id: model.id,
|
|
296
|
+
name: model.name ?? model.id,
|
|
297
|
+
reasoning: Boolean(model.reasoning),
|
|
298
|
+
contextWindow: model.contextWindow,
|
|
299
|
+
maxTokens: model.maxTokens,
|
|
300
|
+
supportedThinkingLevels: supportedThinkingLevels(model),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
/** List providers from a pi runtime with auth capability/status. */
|
|
304
|
+
export function listPiProviders(runtime) {
|
|
305
|
+
return runtime.getProviders().map((provider) => {
|
|
306
|
+
const status = runtime.getProviderAuthStatus(provider.id);
|
|
307
|
+
return {
|
|
308
|
+
id: provider.id,
|
|
309
|
+
name: provider.name ?? provider.id,
|
|
310
|
+
apiKey: Boolean(provider.auth?.apiKey),
|
|
311
|
+
oauth: Boolean(provider.auth?.oauth),
|
|
312
|
+
configured: status?.configured ?? runtime.hasConfiguredAuth(provider.id),
|
|
313
|
+
source: status?.source,
|
|
314
|
+
label: status?.label,
|
|
315
|
+
};
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
/** List chat models from a pi runtime, optionally filtered by provider. */
|
|
319
|
+
export function listPiModels(runtime, providerId) {
|
|
320
|
+
return runtime.getModels(providerId).map((model) => toPiModelInfo(model));
|
|
321
|
+
}
|
|
322
|
+
/** Whether the pi dependency resolves (it is a required dependency of the SDK). */
|
|
323
|
+
export function isPiPackageAvailable() {
|
|
324
|
+
try {
|
|
325
|
+
const resolve = import.meta.resolve;
|
|
326
|
+
return typeof resolve === 'function' && Boolean(resolve(PI_PACKAGE_NAME));
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Open a pi runtime using an existing install's credential store and model
|
|
334
|
+
* catalog. This is the setup entry point used by `set-backend pi`; it does not
|
|
335
|
+
* require the pi CLI or a pre-existing pi session.
|
|
336
|
+
*/
|
|
337
|
+
export async function openPiRuntime(options = {}) {
|
|
338
|
+
const pi = await importPiModule();
|
|
339
|
+
const paths = resolvePiPaths(options, { agentDir: pi.getAgentDir() });
|
|
340
|
+
const runtime = (await pi.ModelRuntime.create({
|
|
341
|
+
authPath: paths.authPath,
|
|
342
|
+
modelsPath: paths.modelsPath,
|
|
343
|
+
allowModelNetwork: false,
|
|
344
|
+
}));
|
|
345
|
+
const registry = options.modelRegistry ?? new pi.ModelRegistry(runtime);
|
|
346
|
+
return {
|
|
347
|
+
registry,
|
|
348
|
+
runtime,
|
|
349
|
+
listProviders: () => listPiProviders(runtime),
|
|
350
|
+
listModels: (providerId) => listPiModels(runtime, providerId),
|
|
351
|
+
hasAuth: (providerId) => runtime.hasConfiguredAuth(providerId),
|
|
352
|
+
isUsingOAuth: (providerId) => runtime.isUsingOAuth(providerId),
|
|
353
|
+
listCredentials: async () => (await runtime.listCredentials()) ?? [],
|
|
354
|
+
login: async (providerId, interaction, type) => {
|
|
355
|
+
const authType = type ?? 'api_key';
|
|
356
|
+
await runtime.login(providerId, authType, interaction, {});
|
|
357
|
+
},
|
|
358
|
+
logout: async (providerId) => {
|
|
359
|
+
await runtime.logout(providerId);
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Build an `LLMBackend` from pi's credential store. Throws a clear error when
|
|
365
|
+
* the pi packages are not installed.
|
|
366
|
+
*/
|
|
367
|
+
export async function createPiBackend(options = {}) {
|
|
368
|
+
let registry = options.modelRegistry;
|
|
369
|
+
let requested = options.model;
|
|
370
|
+
if (!registry) {
|
|
371
|
+
const pi = await importPiModule();
|
|
372
|
+
const paths = resolvePiPaths(options, { agentDir: pi.getAgentDir() });
|
|
373
|
+
requested = requested ?? paths.model;
|
|
374
|
+
const runtime = await pi.ModelRuntime.create({
|
|
375
|
+
authPath: paths.authPath,
|
|
376
|
+
modelsPath: paths.modelsPath,
|
|
377
|
+
allowModelNetwork: false,
|
|
378
|
+
});
|
|
379
|
+
registry = new pi.ModelRegistry(runtime);
|
|
380
|
+
}
|
|
381
|
+
const model = selectPiModel(registry, requested);
|
|
382
|
+
return createPiAdapter(registry, model, options.maxTokens, options.thinkingLevel);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Resolve the shared pi/env model backend used by both `deepclause run` and the
|
|
386
|
+
* REPL. `pi` (the default) returns an injected `LLMBackend`; `env` returns the
|
|
387
|
+
* provider/model so the runner builds the SDK provider backend.
|
|
388
|
+
*/
|
|
389
|
+
export async function resolveLlmBackend(options = {}) {
|
|
390
|
+
const kind = options.kind ?? 'pi';
|
|
391
|
+
if (kind === 'pi') {
|
|
392
|
+
const pi = await createPiBackend({
|
|
393
|
+
agentDir: options.agentDir,
|
|
394
|
+
modelsPath: options.modelsPath ?? undefined,
|
|
395
|
+
authPath: options.authPath ?? undefined,
|
|
396
|
+
model: options.model,
|
|
397
|
+
maxTokens: options.maxTokens,
|
|
398
|
+
thinkingLevel: options.thinkingLevel,
|
|
399
|
+
});
|
|
400
|
+
return {
|
|
401
|
+
kind: 'pi',
|
|
402
|
+
llmBackend: pi.backend,
|
|
403
|
+
registry: pi.registry,
|
|
404
|
+
provider: pi.provider,
|
|
405
|
+
model: pi.modelId.split('/').slice(1).join('/') || pi.modelId,
|
|
406
|
+
modelId: pi.modelId,
|
|
407
|
+
contextWindow: pi.contextWindow,
|
|
408
|
+
reasoning: pi.reasoning,
|
|
409
|
+
thinkingLevel: pi.thinkingLevel,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
const model = options.model ?? 'gpt-4o';
|
|
413
|
+
return { kind: 'env', provider: options.provider ?? 'openai', model, modelId: model };
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/repl/backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript context compaction for the REPL (and, later, the one-shot runner).
|
|
3
|
+
*
|
|
4
|
+
* This ports pi's compaction algorithm (`core/compaction/compaction.ts`) to the
|
|
5
|
+
* SDK's `MemoryMessage[]` model. It intentionally shares pi's shapes:
|
|
6
|
+
*
|
|
7
|
+
* - chars/4 token estimation (`estimateMemoryTokens`);
|
|
8
|
+
* - `shouldCompact` threshold semantics (`contextWindow - reserveTokens`);
|
|
9
|
+
* - the cut-point search that keeps a recent tail;
|
|
10
|
+
* - the structured summarization prompts (Goal / Constraints / Progress /
|
|
11
|
+
* Decisions / Next Steps / Critical Context).
|
|
12
|
+
*
|
|
13
|
+
* Unlike pi's version it does not use `SessionEntry`/`AgentMessage` trees: the
|
|
14
|
+
* REPL stores memory as `message{role, content}` Prolog terms, mapped to
|
|
15
|
+
* `MemoryMessage[]` on the host. The summarization call goes through the active
|
|
16
|
+
* `LLMBackend`, so it reuses pi's model, credentials, streaming, and cancellation.
|
|
17
|
+
*/
|
|
18
|
+
import type { LLMBackend, LLMUsage, MemoryMessage } from '../types.js';
|
|
19
|
+
import { DEFAULT_COMPACTION_SETTINGS } from '@earendil-works/pi-coding-agent';
|
|
20
|
+
/**
|
|
21
|
+
* pi's compaction settings (same shape as its `core/compaction` settings).
|
|
22
|
+
* `DEFAULT_COMPACTION_SETTINGS` and the threshold come straight from pi; only
|
|
23
|
+
* the cut/summarization below is the SDK's port.
|
|
24
|
+
*/
|
|
25
|
+
export interface CompactionSettings {
|
|
26
|
+
enabled: boolean;
|
|
27
|
+
reserveTokens: number;
|
|
28
|
+
keepRecentTokens: number;
|
|
29
|
+
}
|
|
30
|
+
export { DEFAULT_COMPACTION_SETTINGS };
|
|
31
|
+
/** Leading marker of a compacted checkpoint message. */
|
|
32
|
+
export declare const SUMMARY_PREFIX = "[Context summary]";
|
|
33
|
+
/** Conservative chars/4 estimate for one message. */
|
|
34
|
+
export declare function estimateMessageTokens(message: MemoryMessage): number;
|
|
35
|
+
/** Conservative chars/4 estimate for a message list. */
|
|
36
|
+
export declare function estimateMemoryTokens(messages: MemoryMessage[]): number;
|
|
37
|
+
/** Total context tokens from a usage record, preferring the provider total. */
|
|
38
|
+
export declare function calculateContextTokens(usage: LLMUsage): number;
|
|
39
|
+
/** Whether the context has grown past `contextWindow - reserveTokens`. */
|
|
40
|
+
export declare function shouldCompact(contextTokens: number, contextWindow: number, settings?: CompactionSettings): boolean;
|
|
41
|
+
export interface CompactionCut {
|
|
42
|
+
/** Index of the first message to keep. `0` means "nothing to summarize". */
|
|
43
|
+
cutIndex: number;
|
|
44
|
+
/** Messages to hand to the summarizer. */
|
|
45
|
+
messagesToSummarize: MemoryMessage[];
|
|
46
|
+
/** Messages retained verbatim. */
|
|
47
|
+
keptMessages: MemoryMessage[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Walk from the newest message backwards, accumulating estimated tokens, until
|
|
51
|
+
* `keepRecentTokens` is reached. The cut is then moved back to the nearest
|
|
52
|
+
* `user` boundary so an assistant turn is never separated from its prompt.
|
|
53
|
+
*
|
|
54
|
+
* System messages are never summarized (they carry the checkpoint and the
|
|
55
|
+
* runtime contract) and are excluded from the accumulated size, matching the
|
|
56
|
+
* intent of pi's "never cut the current system prompt" rule.
|
|
57
|
+
*/
|
|
58
|
+
export declare function findCompactionCut(messages: MemoryMessage[], keepRecentTokens?: number): CompactionCut;
|
|
59
|
+
/** The most recent compacted checkpoint, if the memory already contains one. */
|
|
60
|
+
export declare function findExistingSummary(messages: MemoryMessage[]): string | undefined;
|
|
61
|
+
/** Wrap a summary as the checkpoint message prepended to compacted memory. */
|
|
62
|
+
export declare function buildSummaryMessage(summary: string): MemoryMessage;
|
|
63
|
+
/** Ported verbatim from pi's `SUMMARIZATION_SYSTEM_PROMPT`. */
|
|
64
|
+
export declare const SUMMARIZATION_SYSTEM_PROMPT = "You are a context summarization assistant. Your task is to read a conversation between a user and an AI assistant, then produce a structured summary following the exact format specified.\n\nDo NOT continue the conversation. Do NOT respond to any questions in the conversation. ONLY output the structured summary.";
|
|
65
|
+
/** Serialize a conversation to text so the model summarizes instead of continuing. */
|
|
66
|
+
export declare function serializeMemoryConversation(messages: MemoryMessage[]): string;
|
|
67
|
+
/** Build the user-side summarization prompt, wrapping the conversation in tags. */
|
|
68
|
+
export declare function buildSummarizationPrompt(messages: MemoryMessage[], previousSummary?: string, customInstructions?: string): string;
|
|
69
|
+
export interface GenerateMemorySummaryParams {
|
|
70
|
+
/** Messages to summarize (already cut). System messages are ignored. */
|
|
71
|
+
messages: MemoryMessage[];
|
|
72
|
+
previousSummary?: string;
|
|
73
|
+
backend: LLMBackend;
|
|
74
|
+
model: string;
|
|
75
|
+
reserveTokens?: number;
|
|
76
|
+
signal?: AbortSignal;
|
|
77
|
+
customInstructions?: string;
|
|
78
|
+
}
|
|
79
|
+
/** Generate a structured summary of `messages` through the active backend. */
|
|
80
|
+
export declare function generateMemorySummary(params: GenerateMemorySummaryParams): Promise<{
|
|
81
|
+
summary: string;
|
|
82
|
+
usage?: LLMUsage;
|
|
83
|
+
}>;
|
|
84
|
+
export interface CompactMemoryParams {
|
|
85
|
+
messages: MemoryMessage[];
|
|
86
|
+
backend: LLMBackend;
|
|
87
|
+
model: string;
|
|
88
|
+
contextWindow?: number;
|
|
89
|
+
settings?: CompactionSettings;
|
|
90
|
+
signal?: AbortSignal;
|
|
91
|
+
customInstructions?: string;
|
|
92
|
+
/** Compact even when the context is below the threshold (manual `compact.`). */
|
|
93
|
+
force?: boolean;
|
|
94
|
+
}
|
|
95
|
+
export type CompactMemoryReason = 'applied' | 'disabled' | 'below-threshold' | 'nothing-to-summarize' | 'empty-summary' | 'no-reduction' | 'failed';
|
|
96
|
+
export interface CompactMemoryResult {
|
|
97
|
+
applied: boolean;
|
|
98
|
+
reason: CompactMemoryReason;
|
|
99
|
+
messages: MemoryMessage[];
|
|
100
|
+
summary?: string;
|
|
101
|
+
tokensBefore: number;
|
|
102
|
+
tokensAfter: number;
|
|
103
|
+
usage?: LLMUsage;
|
|
104
|
+
error?: string;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Compact `messages` if needed (or `force`d). Returns the rewritten list: the
|
|
108
|
+
* preserved system messages, the new checkpoint, then the recent tail.
|
|
109
|
+
*/
|
|
110
|
+
export declare function compactMemory(params: CompactMemoryParams): Promise<CompactMemoryResult>;
|
|
111
|
+
export interface MemoryCompactionEvent {
|
|
112
|
+
scope: 'loop' | 'session';
|
|
113
|
+
trigger: 'before_model_call' | 'before_user_message';
|
|
114
|
+
action: 'applied' | 'skipped' | 'failed';
|
|
115
|
+
beforeTokens: number;
|
|
116
|
+
afterTokens: number;
|
|
117
|
+
error?: string;
|
|
118
|
+
usage?: LLMUsage;
|
|
119
|
+
}
|
|
120
|
+
/** Turn a `CompactMemoryResult` into the fields consumed by a `memory_compaction` event. */
|
|
121
|
+
export declare function toCompactionEvent(scope: MemoryCompactionEvent['scope'], trigger: MemoryCompactionEvent['trigger'], result: CompactMemoryResult): MemoryCompactionEvent;
|
|
122
|
+
//# sourceMappingURL=compaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../src/repl/compaction.ts"],"names":[],"mappings":"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"}
|