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,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal, streaming markdown → ANSI renderer for the REPL transcript.
|
|
3
|
+
*
|
|
4
|
+
* The transcript is line-based (`LineSink` → `TranscriptComponent`), so we
|
|
5
|
+
* render markdown per completed line rather than using a component tree. This
|
|
6
|
+
* covers the common shapes an agent emits — headings, fenced and inline code,
|
|
7
|
+
* bold/italic/strike, links, lists, blockquotes, and horizontal rules — and can
|
|
8
|
+
* style a fence's content because it tracks the open/close fence across lines.
|
|
9
|
+
*/
|
|
10
|
+
const ANSI = {
|
|
11
|
+
reset: '\u001b[0m',
|
|
12
|
+
bold: '\u001b[1m',
|
|
13
|
+
italic: '\u001b[3m',
|
|
14
|
+
strike: '\u001b[9m',
|
|
15
|
+
dim: '\u001b[2m',
|
|
16
|
+
heading: '\u001b[1;38;5;180m',
|
|
17
|
+
code: '\u001b[38;5;141m',
|
|
18
|
+
codeBlock: '\u001b[38;5;114m',
|
|
19
|
+
link: '\u001b[38;5;75m',
|
|
20
|
+
bullet: '\u001b[38;5;141m',
|
|
21
|
+
quote: '\u001b[38;5;245m',
|
|
22
|
+
hr: '\u001b[38;5;240m',
|
|
23
|
+
};
|
|
24
|
+
const PLACEHOLDER = /\u0000(\d+)\u0000/g;
|
|
25
|
+
/** Apply inline markdown (code, links, bold, italic, strike) to one line. */
|
|
26
|
+
export function renderMarkdownInline(text) {
|
|
27
|
+
const stash = [];
|
|
28
|
+
const hold = (value) => {
|
|
29
|
+
stash.push(value);
|
|
30
|
+
return `\u0000${stash.length - 1}\u0000`;
|
|
31
|
+
};
|
|
32
|
+
// Protect code spans and links first so emphasis rules cannot rewrite the
|
|
33
|
+
// ANSI sequences or the bracketed parts.
|
|
34
|
+
let out = text
|
|
35
|
+
.replace(/`([^`]+)`/g, (_, code) => hold(`${ANSI.code}${code}${ANSI.reset}`))
|
|
36
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_, label, url) => hold(`${ANSI.link}${label}${ANSI.reset}${ANSI.dim} (${url})${ANSI.reset}`));
|
|
37
|
+
out = out
|
|
38
|
+
.replace(/~~([^~]+)~~/g, `${ANSI.strike}$1${ANSI.reset}`)
|
|
39
|
+
.replace(/\*\*([^*]+)\*\*/g, `${ANSI.bold}$1${ANSI.reset}`)
|
|
40
|
+
.replace(/__([^_]+)__/g, `${ANSI.bold}$1${ANSI.reset}`)
|
|
41
|
+
.replace(/(^|[^*\w])\*([^*\n]+)\*/g, `$1${ANSI.italic}$2${ANSI.reset}`)
|
|
42
|
+
.replace(/(^|[^_\w])_([^_\n]+)_/g, `$1${ANSI.italic}$2${ANSI.reset}`);
|
|
43
|
+
return out.replace(PLACEHOLDER, (_, index) => stash[Number(index)] ?? '');
|
|
44
|
+
}
|
|
45
|
+
/** Render one already-complete markdown line to an ANSI string. */
|
|
46
|
+
export function renderMarkdownLine(line, inCode) {
|
|
47
|
+
if (inCode) {
|
|
48
|
+
return `${ANSI.codeBlock}${line}${ANSI.reset}`;
|
|
49
|
+
}
|
|
50
|
+
const heading = /^ {0,3}(#{1,6})\s+(.*?)\s*#*\s*$/.exec(line);
|
|
51
|
+
if (heading) {
|
|
52
|
+
return `${ANSI.heading}${renderMarkdownInline(heading[2])}${ANSI.reset}`;
|
|
53
|
+
}
|
|
54
|
+
if (/^ {0,3}([-*_])\s*(?:\1\s*){2,}$/.test(line)) {
|
|
55
|
+
return `${ANSI.hr}${'─'.repeat(Math.max(3, Math.min(24, line.trim().length)))}${ANSI.reset}`;
|
|
56
|
+
}
|
|
57
|
+
const quote = /^ {0,3}>\s?(.*)$/.exec(line);
|
|
58
|
+
if (quote) {
|
|
59
|
+
return `${ANSI.quote}│ ${renderMarkdownInline(quote[1])}${ANSI.reset}`;
|
|
60
|
+
}
|
|
61
|
+
const list = /^(\s*)([-*+])\s+(.*)$/.exec(line);
|
|
62
|
+
if (list) {
|
|
63
|
+
return `${list[1]}${ANSI.bullet}•${ANSI.reset} ${renderMarkdownInline(list[3])}`;
|
|
64
|
+
}
|
|
65
|
+
return renderMarkdownInline(line);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A stateful, line-buffered markdown stream. `push` returns the styled lines
|
|
69
|
+
* completed by a chunk; `flush` returns the trailing partial line.
|
|
70
|
+
*/
|
|
71
|
+
export class MarkdownStream {
|
|
72
|
+
buffer = '';
|
|
73
|
+
inCode = false;
|
|
74
|
+
push(chunk) {
|
|
75
|
+
this.buffer += chunk;
|
|
76
|
+
const parts = this.buffer.split('\n');
|
|
77
|
+
this.buffer = parts.pop() ?? '';
|
|
78
|
+
const out = [];
|
|
79
|
+
for (const line of parts) {
|
|
80
|
+
out.push(this.line(line));
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
flush() {
|
|
85
|
+
const out = [];
|
|
86
|
+
if (this.buffer !== '') {
|
|
87
|
+
out.push(this.line(this.buffer));
|
|
88
|
+
this.buffer = '';
|
|
89
|
+
}
|
|
90
|
+
// A fence left open at the end of a message should not colour the next one.
|
|
91
|
+
this.inCode = false;
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
94
|
+
line(line) {
|
|
95
|
+
const fence = /^ {0,3}(```|~~~)/.test(line);
|
|
96
|
+
if (fence) {
|
|
97
|
+
this.inCode = !this.inCode;
|
|
98
|
+
return `${ANSI.dim}${line}${ANSI.reset}`;
|
|
99
|
+
}
|
|
100
|
+
return renderMarkdownLine(line, this.inCode);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/repl/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a `with_model/2` spec (string or dict) into a concrete model profile.
|
|
3
|
+
*
|
|
4
|
+
* Two sources, matching the chat backend:
|
|
5
|
+
* - `PiModelResolver` — pi's live registry; authoritative for existence and
|
|
6
|
+
* auth (the default backend).
|
|
7
|
+
* - `EnvModelResolver` — the bundled model database (the `env` backend).
|
|
8
|
+
*
|
|
9
|
+
* Resolution happens on first use of a scope and is cached by the runner.
|
|
10
|
+
*/
|
|
11
|
+
import type { ModelSpec, ResolvedModel } from '../types.js';
|
|
12
|
+
import { type PiRegistryLike } from './backend.js';
|
|
13
|
+
export declare class ModelResolutionError extends Error {
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parse a raw `model_spec` value (from the Prolog payload) into a `ModelSpec`.
|
|
18
|
+
* Accepts `none`/`default`/empty (→ default), a string
|
|
19
|
+
* (`provider:model`, `provider/model`, `model`, each with an optional `#level`),
|
|
20
|
+
* or a `model{…}` dict.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseModelSpec(raw: unknown): ModelSpec;
|
|
23
|
+
export interface ModelResolver {
|
|
24
|
+
/** Resolve + validate a non-default spec. Throws `ModelResolutionError`. */
|
|
25
|
+
resolve(spec: ModelSpec): Promise<ResolvedModel>;
|
|
26
|
+
/** A short list of available models, for error messages. */
|
|
27
|
+
describe(): string;
|
|
28
|
+
/** The models available in this session, with catalog prices. */
|
|
29
|
+
catalog(): ModelCatalogEntry[];
|
|
30
|
+
}
|
|
31
|
+
/** One entry of the session's model catalog, as shown to the agent. */
|
|
32
|
+
export interface ModelCatalogEntry {
|
|
33
|
+
/** `provider:model` id, usable in `with_model/2`. */
|
|
34
|
+
model: string;
|
|
35
|
+
/** USD per 1M input tokens. */
|
|
36
|
+
inputCost?: number;
|
|
37
|
+
/** USD per 1M output tokens. */
|
|
38
|
+
outputCost?: number;
|
|
39
|
+
contextWindow?: number;
|
|
40
|
+
}
|
|
41
|
+
/** Format a catalog entry as `provider:model ($in/$out per 1M)`. */
|
|
42
|
+
export declare function formatModelCatalogEntry(entry: ModelCatalogEntry): string;
|
|
43
|
+
/** Resolve against pi's live registry (existence + auth are authoritative). */
|
|
44
|
+
export declare class PiModelResolver implements ModelResolver {
|
|
45
|
+
private readonly registry;
|
|
46
|
+
constructor(registry: PiRegistryLike);
|
|
47
|
+
resolve(spec: ModelSpec): Promise<ResolvedModel>;
|
|
48
|
+
describe(): string;
|
|
49
|
+
catalog(): ModelCatalogEntry[];
|
|
50
|
+
}
|
|
51
|
+
/** Resolve against the bundled model database (the `env` backend). */
|
|
52
|
+
export declare class EnvModelResolver implements ModelResolver {
|
|
53
|
+
private readonly sessionProvider;
|
|
54
|
+
constructor(sessionProvider: string);
|
|
55
|
+
resolve(spec: ModelSpec): Promise<ResolvedModel>;
|
|
56
|
+
describe(): string;
|
|
57
|
+
catalog(): ModelCatalogEntry[];
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=model-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../../src/repl/model-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EAA6C,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9F,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAmCtD;AAED,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACjD,4DAA4D;IAC5D,QAAQ,IAAI,MAAM,CAAC;IACnB,iEAAiE;IACjE,OAAO,IAAI,iBAAiB,EAAE,CAAC;CAChC;AAED,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD,oEAAoE;AACpE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAQxE;AAED,+EAA+E;AAC/E,qBAAa,eAAgB,YAAW,aAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,cAAc;IAE/C,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC;IAqCtD,QAAQ,IAAI,MAAM;IAQlB,OAAO,IAAI,iBAAiB,EAAE;CAQ/B;AAED,sEAAsE;AACtE,qBAAa,gBAAiB,YAAW,aAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,EAAE,MAAM;IAE9C,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC;IAoBtD,QAAQ,IAAI,MAAM;IAIlB,OAAO,IAAI,iBAAiB,EAAE;CAG/B"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a `with_model/2` spec (string or dict) into a concrete model profile.
|
|
3
|
+
*
|
|
4
|
+
* Two sources, matching the chat backend:
|
|
5
|
+
* - `PiModelResolver` — pi's live registry; authoritative for existence and
|
|
6
|
+
* auth (the default backend).
|
|
7
|
+
* - `EnvModelResolver` — the bundled model database (the `env` backend).
|
|
8
|
+
*
|
|
9
|
+
* Resolution happens on first use of a scope and is cached by the runner.
|
|
10
|
+
*/
|
|
11
|
+
import { getAllModels, lookupModel, lookupProvider } from '../system/config/model-database.js';
|
|
12
|
+
import { supportedThinkingLevels } from './backend.js';
|
|
13
|
+
export class ModelResolutionError extends Error {
|
|
14
|
+
constructor(message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'ModelResolutionError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse a raw `model_spec` value (from the Prolog payload) into a `ModelSpec`.
|
|
21
|
+
* Accepts `none`/`default`/empty (→ default), a string
|
|
22
|
+
* (`provider:model`, `provider/model`, `model`, each with an optional `#level`),
|
|
23
|
+
* or a `model{…}` dict.
|
|
24
|
+
*/
|
|
25
|
+
export function parseModelSpec(raw) {
|
|
26
|
+
if (raw === null || raw === undefined) {
|
|
27
|
+
return 'default';
|
|
28
|
+
}
|
|
29
|
+
if (typeof raw === 'object') {
|
|
30
|
+
const obj = raw;
|
|
31
|
+
const id = typeof obj.id === 'string' ? obj.id : undefined;
|
|
32
|
+
if (!id) {
|
|
33
|
+
return 'default';
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
provider: typeof obj.provider === 'string' ? obj.provider : undefined,
|
|
37
|
+
id,
|
|
38
|
+
temperature: typeof obj.temperature === 'number' ? obj.temperature : undefined,
|
|
39
|
+
maxTokens: typeof obj.maxTokens === 'number' ? obj.maxTokens : undefined,
|
|
40
|
+
reasoning: typeof obj.reasoning === 'string' ? obj.reasoning : undefined,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const text = String(raw).trim();
|
|
44
|
+
if (!text || text === 'none' || text === 'default') {
|
|
45
|
+
return 'default';
|
|
46
|
+
}
|
|
47
|
+
let body = text;
|
|
48
|
+
let reasoning;
|
|
49
|
+
// Reasoning suffix uses the last `#` (provider/model ids may contain `:`/`/`).
|
|
50
|
+
const hash = body.lastIndexOf('#');
|
|
51
|
+
if (hash > 0) {
|
|
52
|
+
reasoning = body.slice(hash + 1).trim() || undefined;
|
|
53
|
+
body = body.slice(0, hash);
|
|
54
|
+
}
|
|
55
|
+
const sep = body.search(/[:/]/);
|
|
56
|
+
if (sep === -1) {
|
|
57
|
+
return { id: body, reasoning };
|
|
58
|
+
}
|
|
59
|
+
return { provider: body.slice(0, sep), id: body.slice(sep + 1), reasoning };
|
|
60
|
+
}
|
|
61
|
+
function trimCost(value) {
|
|
62
|
+
return String(Number(value.toFixed(3)));
|
|
63
|
+
}
|
|
64
|
+
/** Format a catalog entry as `provider:model ($in/$out per 1M)`. */
|
|
65
|
+
export function formatModelCatalogEntry(entry) {
|
|
66
|
+
const hasCost = typeof entry.inputCost === 'number' || typeof entry.outputCost === 'number';
|
|
67
|
+
if (!hasCost) {
|
|
68
|
+
return entry.model;
|
|
69
|
+
}
|
|
70
|
+
const input = typeof entry.inputCost === 'number' ? `$${trimCost(entry.inputCost)}` : '?';
|
|
71
|
+
const output = typeof entry.outputCost === 'number' ? `$${trimCost(entry.outputCost)}` : '?';
|
|
72
|
+
return `${entry.model} (${input}/${output} per 1M)`;
|
|
73
|
+
}
|
|
74
|
+
/** Resolve against pi's live registry (existence + auth are authoritative). */
|
|
75
|
+
export class PiModelResolver {
|
|
76
|
+
registry;
|
|
77
|
+
constructor(registry) {
|
|
78
|
+
this.registry = registry;
|
|
79
|
+
}
|
|
80
|
+
async resolve(spec) {
|
|
81
|
+
if (spec === 'default') {
|
|
82
|
+
throw new ModelResolutionError('internal: default spec resolved by the runner');
|
|
83
|
+
}
|
|
84
|
+
const available = this.registry.getAvailable();
|
|
85
|
+
const matches = available.filter((model) => model.id === spec.id && (spec.provider ? model.provider === spec.provider : true));
|
|
86
|
+
const label = spec.provider ? `${spec.provider}:${spec.id}` : spec.id;
|
|
87
|
+
if (matches.length === 0) {
|
|
88
|
+
throw new ModelResolutionError(`unknown model "${label}" — available: ${this.describe() || '(none)'}`);
|
|
89
|
+
}
|
|
90
|
+
if (matches.length > 1) {
|
|
91
|
+
throw new ModelResolutionError(`"${spec.id}" is ambiguous (${matches.map((m) => m.provider).join(', ')}) — use "provider:model"`);
|
|
92
|
+
}
|
|
93
|
+
const model = matches[0];
|
|
94
|
+
if (!this.registry.hasConfiguredAuth(model)) {
|
|
95
|
+
throw new ModelResolutionError(`provider "${model.provider}" is not signed in — run \`deepclause login\``);
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
provider: model.provider,
|
|
99
|
+
id: model.id,
|
|
100
|
+
temperature: spec.temperature,
|
|
101
|
+
maxTokens: spec.maxTokens ?? model.maxTokens,
|
|
102
|
+
contextWindow: model.contextWindow,
|
|
103
|
+
reasoning: Boolean(model.reasoning),
|
|
104
|
+
reasoningLevel: spec.reasoning,
|
|
105
|
+
supportedThinkingLevels: supportedThinkingLevels(model),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
describe() {
|
|
109
|
+
return this.registry
|
|
110
|
+
.getAvailable()
|
|
111
|
+
.map((model) => `${model.provider}:${model.id}`)
|
|
112
|
+
.slice(0, 12)
|
|
113
|
+
.join(', ');
|
|
114
|
+
}
|
|
115
|
+
catalog() {
|
|
116
|
+
return this.registry.getAvailable().map((model) => ({
|
|
117
|
+
model: `${model.provider}:${model.id}`,
|
|
118
|
+
inputCost: model.cost?.input,
|
|
119
|
+
outputCost: model.cost?.output,
|
|
120
|
+
contextWindow: model.contextWindow,
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Resolve against the bundled model database (the `env` backend). */
|
|
125
|
+
export class EnvModelResolver {
|
|
126
|
+
sessionProvider;
|
|
127
|
+
constructor(sessionProvider) {
|
|
128
|
+
this.sessionProvider = sessionProvider;
|
|
129
|
+
}
|
|
130
|
+
async resolve(spec) {
|
|
131
|
+
if (spec === 'default') {
|
|
132
|
+
throw new ModelResolutionError('internal: default spec resolved by the runner');
|
|
133
|
+
}
|
|
134
|
+
const provider = spec.provider ?? this.sessionProvider;
|
|
135
|
+
const entry = lookupModel(spec.id);
|
|
136
|
+
const providerEntry = lookupProvider(provider);
|
|
137
|
+
return {
|
|
138
|
+
provider,
|
|
139
|
+
id: spec.id,
|
|
140
|
+
temperature: spec.temperature,
|
|
141
|
+
maxTokens: spec.maxTokens ?? entry?.limit.output,
|
|
142
|
+
contextWindow: entry?.limit.context,
|
|
143
|
+
reasoning: entry?.reasoning ?? false,
|
|
144
|
+
reasoningLevel: spec.reasoning,
|
|
145
|
+
reasoningType: providerEntry?.reasoning_type ?? 'none',
|
|
146
|
+
reasoningBudgetMap: providerEntry?.budget_map,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
describe() {
|
|
150
|
+
return Object.keys(getAllModels()).slice(0, 12).join(', ');
|
|
151
|
+
}
|
|
152
|
+
catalog() {
|
|
153
|
+
return Object.keys(getAllModels()).map((id) => ({ model: id }));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=model-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../src/repl/model-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small readline picker.
|
|
3
|
+
*
|
|
4
|
+
* pi's catalog has hundreds of models across dozens of providers, so printing
|
|
5
|
+
* an exhaustive numbered list ("endless lists") is unusable. Instead we show a
|
|
6
|
+
* bounded page and let the user type to filter, then select by number, id, or
|
|
7
|
+
* Enter for the first match. No full TUI is needed.
|
|
8
|
+
*/
|
|
9
|
+
export interface PickItem {
|
|
10
|
+
id: string;
|
|
11
|
+
label: string;
|
|
12
|
+
/** Optional annotation, e.g. `[reasoning]` or `✓ configured`. */
|
|
13
|
+
hint?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface PickOptions {
|
|
16
|
+
message: string;
|
|
17
|
+
items: PickItem[];
|
|
18
|
+
pageSize?: number;
|
|
19
|
+
/** Case-insensitive matcher over the raw (lowercased) query. */
|
|
20
|
+
match?: (item: PickItem, query: string) => boolean;
|
|
21
|
+
/** Marks the currently-selected item. */
|
|
22
|
+
currentId?: string;
|
|
23
|
+
}
|
|
24
|
+
/** Pure filter helper (exported for tests). */
|
|
25
|
+
export declare function filterItems(items: PickItem[], query: string, match?: (item: PickItem, query: string) => boolean): PickItem[];
|
|
26
|
+
/** Build the display block for one picker iteration (exported for tests). */
|
|
27
|
+
export declare function renderPick(options: PickOptions, query: string): {
|
|
28
|
+
lines: string[];
|
|
29
|
+
page: PickItem[];
|
|
30
|
+
filtered: PickItem[];
|
|
31
|
+
};
|
|
32
|
+
/** Interactive picker. Returns the chosen item id, or null on cancel / no items. */
|
|
33
|
+
export declare function pickFromList(options: PickOptions): Promise<string | null>;
|
|
34
|
+
//# sourceMappingURL=picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../../src/repl/picker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GACjD,QAAQ,EAAE,CAMZ;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CACxB,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,MAAM,GACZ;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;IAAC,QAAQ,EAAE,QAAQ,EAAE,CAAA;CAAE,CAyB7D;AAED,oFAAoF;AACpF,wBAAsB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4B/E"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small readline picker.
|
|
3
|
+
*
|
|
4
|
+
* pi's catalog has hundreds of models across dozens of providers, so printing
|
|
5
|
+
* an exhaustive numbered list ("endless lists") is unusable. Instead we show a
|
|
6
|
+
* bounded page and let the user type to filter, then select by number, id, or
|
|
7
|
+
* Enter for the first match. No full TUI is needed.
|
|
8
|
+
*/
|
|
9
|
+
import * as readline from 'readline';
|
|
10
|
+
/** Pure filter helper (exported for tests). */
|
|
11
|
+
export function filterItems(items, query, match) {
|
|
12
|
+
const needle = query.trim().toLowerCase();
|
|
13
|
+
if (!needle)
|
|
14
|
+
return items;
|
|
15
|
+
const matcher = match
|
|
16
|
+
?? ((item, q) => item.label.toLowerCase().includes(q) || item.id.toLowerCase().includes(q));
|
|
17
|
+
return items.filter((item) => matcher(item, needle));
|
|
18
|
+
}
|
|
19
|
+
/** Build the display block for one picker iteration (exported for tests). */
|
|
20
|
+
export function renderPick(options, query) {
|
|
21
|
+
const pageSize = options.pageSize ?? 15;
|
|
22
|
+
const filtered = filterItems(options.items, query, options.match);
|
|
23
|
+
const page = filtered.slice(0, pageSize);
|
|
24
|
+
const lines = [options.message];
|
|
25
|
+
if (options.currentId) {
|
|
26
|
+
const current = options.items.find((item) => item.id === options.currentId);
|
|
27
|
+
if (current)
|
|
28
|
+
lines.push(` current: ${current.label}`);
|
|
29
|
+
}
|
|
30
|
+
if (page.length === 0) {
|
|
31
|
+
lines.push(' (no matches)');
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
page.forEach((item, index) => {
|
|
35
|
+
lines.push(` ${index + 1}. ${item.label}${item.hint ? ` ${item.hint}` : ''}`);
|
|
36
|
+
});
|
|
37
|
+
if (filtered.length > page.length) {
|
|
38
|
+
lines.push(` … ${filtered.length - page.length} more — type to filter`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
lines.push(page.length === 0
|
|
42
|
+
? 'no matches; refine the filter or q to cancel'
|
|
43
|
+
: `${page.length} of ${options.items.length} • number selects, Enter = first, q cancels`);
|
|
44
|
+
return { lines, page, filtered };
|
|
45
|
+
}
|
|
46
|
+
/** Interactive picker. Returns the chosen item id, or null on cancel / no items. */
|
|
47
|
+
export async function pickFromList(options) {
|
|
48
|
+
if (options.items.length === 0)
|
|
49
|
+
return null;
|
|
50
|
+
if (options.items.length === 1)
|
|
51
|
+
return options.items[0].id;
|
|
52
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
53
|
+
const ask = (question) => new Promise((resolve) => rl.question(question, resolve));
|
|
54
|
+
let query = '';
|
|
55
|
+
try {
|
|
56
|
+
for (;;) {
|
|
57
|
+
const { lines, page } = renderPick(options, query);
|
|
58
|
+
process.stdout.write(`${lines.join('\n')}\n`);
|
|
59
|
+
const answer = (await ask('> ')).trim();
|
|
60
|
+
if (answer === 'q' || answer === 'quit')
|
|
61
|
+
return null;
|
|
62
|
+
if (answer === '') {
|
|
63
|
+
if (page.length > 0)
|
|
64
|
+
return page[0].id;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const asNumber = Number(answer);
|
|
68
|
+
if (Number.isInteger(asNumber) && asNumber >= 1 && asNumber <= page.length) {
|
|
69
|
+
return page[asNumber - 1].id;
|
|
70
|
+
}
|
|
71
|
+
const exact = options.items.find((item) => item.id === answer);
|
|
72
|
+
if (exact)
|
|
73
|
+
return exact.id;
|
|
74
|
+
query = answer;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
rl.close();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker.js","sourceRoot":"","sources":["../../src/repl/picker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace project context: a `AGENTS.md` in the working directory is appended
|
|
3
|
+
* to the authoring agent's system prompt, so repo-specific rules travel with the
|
|
4
|
+
* session (the same idea as pi's project context files).
|
|
5
|
+
*/
|
|
6
|
+
export interface ProjectContext {
|
|
7
|
+
/** Absolute path to the file. */
|
|
8
|
+
path: string;
|
|
9
|
+
/** File content (trimmed). */
|
|
10
|
+
content: string;
|
|
11
|
+
/** Byte length of the trimmed content. */
|
|
12
|
+
bytes: number;
|
|
13
|
+
}
|
|
14
|
+
/** Read `<workspace>/AGENTS.md` if it exists and is non-empty. */
|
|
15
|
+
export declare function loadProjectContext(workspacePath: string | undefined): Promise<ProjectContext | null>;
|
|
16
|
+
//# sourceMappingURL=project-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-context.d.ts","sourceRoot":"","sources":["../../src/repl/project-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,kEAAkE;AAClE,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAU1G"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace project context: a `AGENTS.md` in the working directory is appended
|
|
3
|
+
* to the authoring agent's system prompt, so repo-specific rules travel with the
|
|
4
|
+
* session (the same idea as pi's project context files).
|
|
5
|
+
*/
|
|
6
|
+
import { readFile } from 'fs/promises';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
/** Read `<workspace>/AGENTS.md` if it exists and is non-empty. */
|
|
9
|
+
export async function loadProjectContext(workspacePath) {
|
|
10
|
+
if (!workspacePath)
|
|
11
|
+
return null;
|
|
12
|
+
const file = join(workspacePath, 'AGENTS.md');
|
|
13
|
+
try {
|
|
14
|
+
const content = (await readFile(file, 'utf8')).trim();
|
|
15
|
+
if (!content)
|
|
16
|
+
return null;
|
|
17
|
+
return { path: file, content, bytes: Buffer.byteLength(content, 'utf8') };
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=project-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/repl/project-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAW5B,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,aAAiC;IACxE,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|