@vextlabs/theron-cli 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -5
- package/dist/banner.d.ts +8 -1
- package/dist/banner.js +14 -2
- package/dist/banner.js.map +1 -1
- package/dist/file_refs.d.ts +38 -0
- package/dist/file_refs.js +219 -0
- package/dist/file_refs.js.map +1 -0
- package/dist/index.js +112 -2
- package/dist/index.js.map +1 -1
- package/dist/repl.d.ts +15 -2
- package/dist/repl.js +420 -44
- package/dist/repl.js.map +1 -1
- package/dist/sessions.d.ts +47 -0
- package/dist/sessions.js +200 -0
- package/dist/sessions.js.map +1 -0
- package/dist/slash_commands.d.ts +47 -0
- package/dist/slash_commands.js +194 -0
- package/dist/slash_commands.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -1
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ theron onboard
|
|
|
11
11
|
|
|
12
12
|
Most coding CLIs end a turn the moment the model stops talking. Theron CLI adds a grading step after each turn and a switchable domain council on top of the agent loop:
|
|
13
13
|
|
|
14
|
-
- **Output verification after every turn.** A suite of up to 8 verifier kernels is available; each profile runs its own subset (the default `code` profile runs 3: `typecheck`, `lint`, `test_smoke`), in parallel (each with a 5s timeout)
|
|
14
|
+
- **Output verification after every turn.** A suite of up to 8 verifier kernels is available; each profile runs its own subset (the default `code` profile runs 3: `typecheck`, `lint`, `test_smoke`), in parallel (each with a 5s timeout). The file kernels (`typecheck`/`lint`/`test_smoke`) run over the files the model just touched; the text kernels (em-dash, AI-isms, citations, arithmetic) run over the response text itself. The full kernel set: `typecheck` (real `npx tsc --noEmit` on touched `.ts`, parses `TSxxxx` errors and blocks), `lint` (flags `console.log`/`debugger`/`.only`/`eslint-disable`), `test_smoke` (runs your `test:smoke` / `test:fast` or `pytest` on touched files), `style_lint`, `em_dash_check` (blocks every em-dash), `ai_ism_check` (flags filler like "delve"/"tapestry"/"leverage"), `citation_presence` (warns when long legal/research/medical output ships no citation), and `arithmetic_recheck` (re-evaluates asserted `X op Y = Z` equations and blocks mismatches). These checks run after the turn; blocking issues are auto-prepended to the next turn so the model fixes them on the following response.
|
|
15
15
|
- **A 33-profile domain council.** Switch the active persona mid-session with `/mode` — 6 hand-tuned profiles (code, legal, finance, design, research, writing) plus 27 template-generated baselines, each carrying its own verifier set and tool policy. Read-only profiles (e.g. medical, therapy) drop Write/Edit/Bash entirely.
|
|
16
16
|
- **Stoa signed-receipt cap tool.** The built-in `Stoa` tool reaches any Stoa-registered SaaS capability (send a Slack message, open a GitHub issue, charge via Stripe) and returns the server's signed, cost-stamped receipt — an auditable record of every external action, not a generic bridge. The CLI displays whatever signature algorithm and value the server returns.
|
|
17
17
|
- **One-command import from Claude.** `theron import-claude <export.zip>` reads a Claude data export locally, extracts your voice preferences, recurring proper-nouns, and first-person facts (user messages only — raw conversations never leave your machine), confirms, then uploads just those to Theron memory.
|
|
@@ -20,9 +20,20 @@ Most coding CLIs end a turn the moment the model stops talking. Theron CLI adds
|
|
|
20
20
|
|
|
21
21
|
- Streams from `theron.tryvext.com` and runs an agentic tool loop: each turn the model can call tools, the CLI runs them locally, feeds results back, and loops (up to 20 inner iterations) until the turn ends.
|
|
22
22
|
- **8 local tools** execute in your working directory: `Read`, `Write`, `Edit`, `Bash`, `Glob`, `Grep`, `LS`, and `Stoa`. `Read` caps large files, `Bash` has a 120s default / 600s max timeout with a byte cap, `Edit` does exact-unique-substring replacement.
|
|
23
|
-
- **Confirmation gating.** `Write`, `Edit`, `Bash`, and `Stoa` prompt `(y/N)` before running; `Read`, `Glob`, `Grep`, `LS` never prompt. Pass `--yes` (or `/yolo` in-session) to auto-approve.
|
|
23
|
+
- **Confirmation gating.** `Write`, `Edit`, `Bash`, and `Stoa` prompt `(y/N)` before running; `Read`, `Glob`, `Grep`, `LS` never prompt. Pass `--yes` (or `/yolo` in-session) to auto-approve. In **plan mode** (`--plan` / `/plan`) those four tools are hard-denied at the executor regardless of `--yes`, so the run stays strictly read-only.
|
|
24
24
|
- **Onboarding wizard** (`theron onboard`): logs you in, picks your top-3 specialists, installs a `cl` shell alias, opens Microsoft 365 + Google Workspace OAuth, links the Office add-in sideload, and optionally imports a Claude export — in one flow.
|
|
25
25
|
|
|
26
|
+
## Workflow features
|
|
27
|
+
|
|
28
|
+
These mirror the day-to-day ergonomics most terminal coding assistants expose. Every one is client-side and works with the existing chat endpoint.
|
|
29
|
+
|
|
30
|
+
- **Custom slash commands.** Drop a markdown file at `./.theron/commands/<name>.md` (project) or `~/.theron/commands/<name>.md` (global) and typing `/<name>` sends that file's body as the turn's prompt. The body supports `$ARGUMENTS` (the full argument string) and `$1`, `$2`, … (whitespace-split positionals); a placeholder with no matching argument expands to empty, and a literal `$word` is left untouched. An optional `--- description: … ---` frontmatter line sets the `/help` blurb and is stripped from the prompt. Project commands override global ones on a name collision; a command whose name collides with a built-in (`/clear`, `/help`, …) is rejected at load so it can never shadow the built-in. `/commands` lists them; `/commands reload` re-scans without restarting. The substituted text is sent to the model as a prompt — it is never passed to a shell.
|
|
31
|
+
- **Plan mode.** Start with `--plan`, or toggle `/plan` mid-session. In plan mode the model is sent only the read-only tool subset (`Read`, `Glob`, `Grep`, `LS`) and any `Write` / `Edit` / `Bash` / `Stoa` call is hard-denied at the executor **before** the confirmation/`--yes` check — so no write can run even under `--yes`/`/yolo`. A plan-mode instruction is prepended to the turn asking the model to investigate read-only and produce a numbered plan. Type `approve` (or `/plan` again) to leave plan mode and restore the normal tool policy.
|
|
32
|
+
- **Session resume.** Every interactive session is saved under `~/.theron/sessions/<id>.json`, where `<id>` is a stable hash of the working directory, after every turn (written atomically; capped at 5 MB with oldest-message eviction). `theron --continue` resumes the most-recent session for the current directory; `theron --resume [id]` resumes a specific session, or shows a numbered picker when no id is given. `/sessions` lists saved sessions. `/clear` resets the on-disk session too. A missing or corrupt session file fails open — the CLI starts fresh rather than crashing.
|
|
33
|
+
- **Headless mode (`-p` / `--print`).** Run one full agentic turn non-interactively and exit — the prompt comes from the positional argument or, if omitted, from stdin. `--output-format text` (default) prints just the answer; `--output-format json` prints a single JSON object `{answer, tools_used, verifier, cost, session_id}`. No banner, spinner, or chips reach stdout, so the output pipes cleanly. The exit code is `0` on a completed turn and `1` on a stream/tool error. `cost` is always `null`: the streaming wire format carries no usage/cost frame, and the CLI never fabricates a number.
|
|
34
|
+
- **`@`-file references.** Write `@path/to/file` in a prompt and, when the token resolves to an existing readable file **inside** the working directory, its contents are read and inlined as a fenced block labeled with the path (capped at 32 KB, head kept). Path traversal is refused (`@../../../etc/passwd` is rejected), absolute paths are not auto-inlined (use the `Read` tool, which prompts), and likely-secret files (`.env*`, `*credentials*`, `*.pem`, `id_rsa`, …) and binaries are skipped. A token that doesn't resolve to a file — including a bare `@specialist` name — is left untouched for the council's `@`-mention router.
|
|
35
|
+
- **Markdown rendering.** `--render` pretty-prints the assistant's reply once the turn ends (`--no-render` to disable, `/render` to toggle). It is **on by default for an interactive TTY** and **forced off** when piped, headless, or `NO_COLOR` is set, so plain text always pipes cleanly. When rendering is on the raw token stream is buffered and the rendered block is emitted exactly once, so the answer is never printed twice.
|
|
36
|
+
|
|
26
37
|
## Project memory (`THERON.md`)
|
|
27
38
|
|
|
28
39
|
The CLI auto-loads a per-project instructions file and injects it into every turn as authoritative repo context — so the model knows your build command, code style, and house rules without you re-typing them each session.
|
|
@@ -39,6 +50,12 @@ theron "fix the bug in foo.ts" # one-shot prompt, exits on end-turn (pipeable
|
|
|
39
50
|
theron --mode legal # start in the Legal profile
|
|
40
51
|
theron --mode list # see all 33 profiles
|
|
41
52
|
theron --yes # auto-approve every tool call (yolo mode)
|
|
53
|
+
theron --plan # plan mode — read-only tools, propose a plan
|
|
54
|
+
theron --continue # resume the most-recent session for this dir
|
|
55
|
+
theron --resume # pick a saved session from a list
|
|
56
|
+
theron -p "summarize this repo" # headless: one turn, print the answer, exit
|
|
57
|
+
theron -p "list the bugs" --output-format json # headless, single JSON object
|
|
58
|
+
echo "what changed?" | theron -p --output-format json # prompt from stdin
|
|
42
59
|
```
|
|
43
60
|
|
|
44
61
|
## Top-level commands
|
|
@@ -58,9 +75,13 @@ theron --yes # auto-approve every tool call (yolo mode)
|
|
|
58
75
|
## In-REPL slash commands
|
|
59
76
|
|
|
60
77
|
```
|
|
61
|
-
/help Show the menu
|
|
62
|
-
/clear Reset the current conversation
|
|
78
|
+
/help Show the menu (also lists your custom commands)
|
|
79
|
+
/clear Reset the current conversation (and its saved session)
|
|
63
80
|
/yolo Toggle auto-approve for tool calls
|
|
81
|
+
/plan Toggle plan mode (read-only tools); 'approve' exits plan mode
|
|
82
|
+
/render Toggle pretty markdown rendering of the reply at end of turn
|
|
83
|
+
/commands List custom slash commands; /commands reload re-scans them
|
|
84
|
+
/sessions List saved sessions (resume with `theron --resume <id>` / `--continue`)
|
|
64
85
|
/cwd Show current working directory
|
|
65
86
|
/cd <path> Change working directory
|
|
66
87
|
/tools List available tools
|
|
@@ -70,14 +91,17 @@ theron --yes # auto-approve every tool call (yolo mode)
|
|
|
70
91
|
/pin <spec> Pin a council specialist for the next turn (@legal, @code, …)
|
|
71
92
|
/unpin Clear pinned specialists
|
|
72
93
|
/cap list Show registered Stoa caps you can invoke as tools
|
|
73
|
-
/status Show cwd / mode / api / auth / yolo state
|
|
94
|
+
/status Show cwd / mode / api / auth / yolo / plan / render / session state
|
|
74
95
|
/login Tells you to exit and run `theron login`
|
|
75
96
|
/logout Clear stored credentials
|
|
76
97
|
/connections List connected SaaS accounts (alias: /integrations)
|
|
77
98
|
/bug Print where to send CLI feedback
|
|
78
99
|
/quit Exit (or Ctrl-C)
|
|
100
|
+
/<custom> Run a command from ./.theron/commands or ~/.theron/commands
|
|
79
101
|
```
|
|
80
102
|
|
|
103
|
+
In a prompt, `@path/to/file` inlines a readable file from the working directory (see Workflow features above); `@specialist` still pins a council member.
|
|
104
|
+
|
|
81
105
|
## Authentication
|
|
82
106
|
|
|
83
107
|
`theron login` saves your API key to `~/.theron/credentials` (file mode 0600, directory mode 0700). The key is resolved in this priority order (first wins):
|
package/dist/banner.d.ts
CHANGED
|
@@ -26,4 +26,11 @@ export declare const SLASH_COMMANDS: Array<{
|
|
|
26
26
|
trigger: string;
|
|
27
27
|
desc: string;
|
|
28
28
|
}>;
|
|
29
|
-
|
|
29
|
+
/** A custom user command to list under /help. */
|
|
30
|
+
export interface CustomCommandHelp {
|
|
31
|
+
/** Command name with leading slash, e.g. "/review". */
|
|
32
|
+
trigger: string;
|
|
33
|
+
/** One-line description (from the command's frontmatter, or a default). */
|
|
34
|
+
desc: string;
|
|
35
|
+
}
|
|
36
|
+
export declare function renderSlashHelp(customCommands?: CustomCommandHelp[]): string;
|
package/dist/banner.js
CHANGED
|
@@ -164,6 +164,10 @@ export const SLASH_COMMANDS = [
|
|
|
164
164
|
{ trigger: "/unpin", desc: "Clear pinned specialists" },
|
|
165
165
|
{ trigger: "/mode <slug>", desc: "Switch domain profile (code, legal, finance, design, research, writing, +27)" },
|
|
166
166
|
{ trigger: "/mode list", desc: "Show all 33 profiles + descriptions" },
|
|
167
|
+
{ trigger: "/plan", desc: "Toggle plan mode — read-only tools; the model proposes a plan and stops. 'approve' exits" },
|
|
168
|
+
{ trigger: "/render", desc: "Toggle pretty markdown rendering of the assistant's reply at end of turn" },
|
|
169
|
+
{ trigger: "/commands", desc: "List custom slash commands; /commands reload re-scans the commands dirs" },
|
|
170
|
+
{ trigger: "/sessions", desc: "List saved sessions (resume with `theron --resume <id>` or `--continue`)" },
|
|
167
171
|
{ trigger: "/cap list", desc: "Show registered Stoa caps + per-cap policy (~/.theron/caps.json overlaid by ./.theron/caps.json)" },
|
|
168
172
|
{ trigger: "/memory", desc: "Show loaded project memory (THERON.md / CLAUDE.md / AGENTS.md); /memory reload re-reads it" },
|
|
169
173
|
{ trigger: "/readiness", desc: "Probe prod substrate health (council, db, Stoa, RAG, OAuth, driver loop)" },
|
|
@@ -177,7 +181,7 @@ export const SLASH_COMMANDS = [
|
|
|
177
181
|
{ trigger: "/bug", desc: "File an issue against the CLI (opens the issue tracker)" },
|
|
178
182
|
{ trigger: "/quit", desc: "Exit (or Ctrl-C)" },
|
|
179
183
|
];
|
|
180
|
-
export function renderSlashHelp() {
|
|
184
|
+
export function renderSlashHelp(customCommands = []) {
|
|
181
185
|
const out = [];
|
|
182
186
|
out.push(chalk.bold.hex(AMBER)("theron") + chalk.dim(" — slash commands:"));
|
|
183
187
|
out.push("");
|
|
@@ -185,8 +189,16 @@ export function renderSlashHelp() {
|
|
|
185
189
|
const pad = c.trigger.padEnd(16, " ");
|
|
186
190
|
out.push(" " + chalk.hex(AMBER)(pad) + " " + chalk.dim(c.desc));
|
|
187
191
|
}
|
|
192
|
+
if (customCommands.length > 0) {
|
|
193
|
+
out.push("");
|
|
194
|
+
out.push(chalk.dim(" custom commands (from ~/.theron/commands + ./.theron/commands):"));
|
|
195
|
+
for (const c of customCommands) {
|
|
196
|
+
const pad = c.trigger.padEnd(16, " ");
|
|
197
|
+
out.push(" " + chalk.hex(AMBER)(pad) + " " + chalk.dim(c.desc));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
188
200
|
out.push("");
|
|
189
|
-
out.push(chalk.dim("type any message to chat · ") + chalk.dim("@") + chalk.dim("specialist to
|
|
201
|
+
out.push(chalk.dim("type any message to chat · ") + chalk.dim("@") + chalk.dim("specialist or @path/to/file · ") + chalk.dim("Shift+Enter for newline"));
|
|
190
202
|
return out.join("\n");
|
|
191
203
|
}
|
|
192
204
|
//# sourceMappingURL=banner.js.map
|
package/dist/banner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../src/banner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../src/banner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface FileAttachment {
|
|
2
|
+
/** The @-token path as the user typed it. */
|
|
3
|
+
token: string;
|
|
4
|
+
/** Resolved absolute path that was read. */
|
|
5
|
+
resolved: string;
|
|
6
|
+
/** File contents (possibly truncated). */
|
|
7
|
+
content: string;
|
|
8
|
+
truncated: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ResolvedRefs {
|
|
11
|
+
/** Prompt text with the resolved @-tokens removed (so they aren't
|
|
12
|
+
* re-interpreted as specialists) and the inlined blocks appended. */
|
|
13
|
+
text: string;
|
|
14
|
+
/** Files that were inlined. Empty when no @-ref resolved to a file. */
|
|
15
|
+
attachments: FileAttachment[];
|
|
16
|
+
/** Tokens that looked path-like but were refused (traversal / secret /
|
|
17
|
+
* binary / missing). Surfaced so the user knows why nothing inlined. */
|
|
18
|
+
skipped: Array<{
|
|
19
|
+
token: string;
|
|
20
|
+
reason: string;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve @<path> file references in a prompt.
|
|
25
|
+
*
|
|
26
|
+
* For each @-token:
|
|
27
|
+
* 1. Skip absolute tokens (left for explicit Read; not auto-inlined).
|
|
28
|
+
* 2. Resolve relative/`~` tokens under cwd.
|
|
29
|
+
* 3. Require the real path to stay inside cwd (traversal guard).
|
|
30
|
+
* 4. Require an existing regular file, not a secret, not binary.
|
|
31
|
+
* 5. Inline its (byte-capped) contents as a fenced block.
|
|
32
|
+
*
|
|
33
|
+
* Tokens that don't resolve to a safe file are left in the text untouched
|
|
34
|
+
* so the existing @<specialist> router still sees them.
|
|
35
|
+
*
|
|
36
|
+
* Never throws — any fs error on a token just skips that token.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveFileRefs(text: string, cwd: string): ResolvedRefs;
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
// file_refs — inline @<path> file references in a prompt.
|
|
2
|
+
//
|
|
3
|
+
// Theron's analogue to Claude Code's `@file` mentions. When a prompt
|
|
4
|
+
// contains `@src/foo.ts` (or `@./a.md`, `@~/notes.txt`, `@/abs/path`)
|
|
5
|
+
// and that token resolves to an existing readable regular file, the
|
|
6
|
+
// CLI reads the file and inlines its contents as a fenced block labeled
|
|
7
|
+
// with the path. The model then sees the file without an extra Read
|
|
8
|
+
// round-trip.
|
|
9
|
+
//
|
|
10
|
+
// DISAMBIGUATION with @<specialist>:
|
|
11
|
+
// The council's @-mention router matches /@([a-z]+)\b/ — a lowercase
|
|
12
|
+
// word with no slash/dot/tilde. Real paths (@src/foo.ts, @./a.md,
|
|
13
|
+
// @~/x) never match that pattern, so they can't be mistaken for a
|
|
14
|
+
// specialist. The only ambiguous case is a bare @word that is also a
|
|
15
|
+
// filename in cwd; we resolve file-FIRST but ONLY when statSync
|
|
16
|
+
// confirms a regular file under cwd — otherwise the token is left
|
|
17
|
+
// untouched for the specialist router.
|
|
18
|
+
//
|
|
19
|
+
// SECURITY (path traversal): an @-ref inlines a file with NO confirmation
|
|
20
|
+
// prompt (unlike the Read tool), so the policy here is STRICTER than the
|
|
21
|
+
// Read tool:
|
|
22
|
+
// - Relative tokens resolve under cwd; the resolved real path MUST stay
|
|
23
|
+
// inside cwd. `@../../../etc/passwd` is refused.
|
|
24
|
+
// - Absolute tokens (`@/etc/shadow`) are NOT auto-inlined — they're
|
|
25
|
+
// left for the model to Read explicitly (which prompts). This keeps
|
|
26
|
+
// a silent inline from ever reaching outside the repo.
|
|
27
|
+
// - `~`-prefixed tokens expand to HOME but are then subject to the same
|
|
28
|
+
// "must be inside cwd" check, so they only inline when cwd is under
|
|
29
|
+
// HOME and the file is within cwd.
|
|
30
|
+
// - Dotfiles that commonly hold secrets (.env*, *credentials*, *.pem,
|
|
31
|
+
// id_rsa, etc.) are skipped.
|
|
32
|
+
// - Binary files are skipped (NUL-byte sniff).
|
|
33
|
+
// - Contents are byte-capped (32KB, head kept) like project_memory.
|
|
34
|
+
import fs from "node:fs";
|
|
35
|
+
import path from "node:path";
|
|
36
|
+
import process from "node:process";
|
|
37
|
+
/** Max bytes inlined per file (head kept, truncation marked). Mirrors
|
|
38
|
+
* project_memory's cap. */
|
|
39
|
+
const MAX_FILE_BYTES = 32 * 1024;
|
|
40
|
+
/** Filenames/patterns we refuse to auto-inline even when they resolve —
|
|
41
|
+
* secrets must never silently enter the prompt. */
|
|
42
|
+
const SECRET_PATTERNS = [
|
|
43
|
+
/(^|\/)\.env(\..*)?$/i,
|
|
44
|
+
/credential/i,
|
|
45
|
+
/\.pem$/i,
|
|
46
|
+
/\.key$/i,
|
|
47
|
+
/(^|\/)id_rsa/i,
|
|
48
|
+
/(^|\/)id_ed25519/i,
|
|
49
|
+
/\.p12$/i,
|
|
50
|
+
/\.pfx$/i,
|
|
51
|
+
/secrets?\.(json|ya?ml|toml)$/i,
|
|
52
|
+
];
|
|
53
|
+
/** True when a token looks like a path rather than a bare specialist
|
|
54
|
+
* word. Anything with a slash, a dot, or a leading ~ is path-like; a
|
|
55
|
+
* bare lowercase word is left for the specialist router and only treated
|
|
56
|
+
* as a file if it actually statSyncs as one (handled in resolve). */
|
|
57
|
+
function looksPathLike(token) {
|
|
58
|
+
return /[\/.~]/.test(token);
|
|
59
|
+
}
|
|
60
|
+
/** NUL-byte sniff for binary content. */
|
|
61
|
+
function looksBinary(buf) {
|
|
62
|
+
const n = Math.min(buf.length, 8000);
|
|
63
|
+
for (let i = 0; i < n; i++)
|
|
64
|
+
if (buf[i] === 0)
|
|
65
|
+
return true;
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
function isSecretPath(p) {
|
|
69
|
+
return SECRET_PATTERNS.some((re) => re.test(p));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Resolve @<path> file references in a prompt.
|
|
73
|
+
*
|
|
74
|
+
* For each @-token:
|
|
75
|
+
* 1. Skip absolute tokens (left for explicit Read; not auto-inlined).
|
|
76
|
+
* 2. Resolve relative/`~` tokens under cwd.
|
|
77
|
+
* 3. Require the real path to stay inside cwd (traversal guard).
|
|
78
|
+
* 4. Require an existing regular file, not a secret, not binary.
|
|
79
|
+
* 5. Inline its (byte-capped) contents as a fenced block.
|
|
80
|
+
*
|
|
81
|
+
* Tokens that don't resolve to a safe file are left in the text untouched
|
|
82
|
+
* so the existing @<specialist> router still sees them.
|
|
83
|
+
*
|
|
84
|
+
* Never throws — any fs error on a token just skips that token.
|
|
85
|
+
*/
|
|
86
|
+
export function resolveFileRefs(text, cwd) {
|
|
87
|
+
const attachments = [];
|
|
88
|
+
const skipped = [];
|
|
89
|
+
const cwdResolved = path.resolve(cwd);
|
|
90
|
+
// Track the exact @<token> spans we consumed so we can strip them.
|
|
91
|
+
const consumed = [];
|
|
92
|
+
// Match @ followed by a path-ish run. Allow letters, digits, /._-~ and
|
|
93
|
+
// path separators. Stop at whitespace. We post-filter with looksPathLike
|
|
94
|
+
// so bare specialist words fall through unless they resolve to a file.
|
|
95
|
+
const tokenRe = /@([A-Za-z0-9_./~-][A-Za-z0-9_./~-]*)/g;
|
|
96
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
97
|
+
let m;
|
|
98
|
+
while ((m = tokenRe.exec(text)) !== null) {
|
|
99
|
+
const full = m[0]; // "@src/foo.ts"
|
|
100
|
+
const token = m[1]; // "src/foo.ts"
|
|
101
|
+
// Expand ~ for resolution but keep the original token for labeling.
|
|
102
|
+
let candidate = token;
|
|
103
|
+
if (candidate === "~" || candidate.startsWith("~/")) {
|
|
104
|
+
if (!home) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
candidate = path.join(home, candidate.slice(1));
|
|
108
|
+
}
|
|
109
|
+
const isAbs = path.isAbsolute(candidate);
|
|
110
|
+
// Bare-word (no slash/dot/tilde) tokens: only treat as a file if they
|
|
111
|
+
// actually resolve to a regular file under cwd; otherwise leave for
|
|
112
|
+
// the specialist router (don't even probe absolute).
|
|
113
|
+
const pathLike = looksPathLike(token);
|
|
114
|
+
// SECURITY: never auto-inline an absolute path — leave it for an
|
|
115
|
+
// explicit Read (which prompts). Absolute tokens fall through.
|
|
116
|
+
if (isAbs) {
|
|
117
|
+
if (pathLike)
|
|
118
|
+
skipped.push({ token, reason: "absolute path not auto-inlined (use Read)" });
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const resolved = path.resolve(cwdResolved, candidate);
|
|
122
|
+
// Traversal guard: resolved must be inside cwd.
|
|
123
|
+
const rel = path.relative(cwdResolved, resolved);
|
|
124
|
+
const insideCwd = rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
|
|
125
|
+
if (!insideCwd) {
|
|
126
|
+
if (pathLike)
|
|
127
|
+
skipped.push({ token, reason: "outside the working directory" });
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
// Stat — must be an existing regular file.
|
|
131
|
+
let st;
|
|
132
|
+
try {
|
|
133
|
+
st = fs.statSync(resolved);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
if (pathLike)
|
|
137
|
+
skipped.push({ token, reason: "no such file" });
|
|
138
|
+
continue; // bare words silently fall through to the specialist router
|
|
139
|
+
}
|
|
140
|
+
if (!st.isFile()) {
|
|
141
|
+
if (pathLike)
|
|
142
|
+
skipped.push({ token, reason: "not a regular file" });
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
// SECURITY: the lexical guard above is defeatable by a symlink planted
|
|
146
|
+
// INSIDE cwd that points OUTSIDE it (statSync/readFileSync follow links).
|
|
147
|
+
// Resolve the REAL paths and re-check containment; refuse any symlink
|
|
148
|
+
// escape. (realpath both sides so a symlinked cwd — e.g. /tmp on macOS —
|
|
149
|
+
// doesn't trip a false escape.)
|
|
150
|
+
try {
|
|
151
|
+
const realCwd = fs.realpathSync(cwdResolved);
|
|
152
|
+
const realResolved = fs.realpathSync(resolved);
|
|
153
|
+
const realRel = path.relative(realCwd, realResolved);
|
|
154
|
+
if (realRel !== "" && (realRel.startsWith("..") || path.isAbsolute(realRel))) {
|
|
155
|
+
skipped.push({ token, reason: "symlink points outside the working directory" });
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
if (pathLike)
|
|
161
|
+
skipped.push({ token, reason: "unreadable" });
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (isSecretPath(resolved)) {
|
|
165
|
+
skipped.push({ token, reason: "looks like a secret file; not inlined" });
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (st.size > 5_000_000) {
|
|
169
|
+
skipped.push({ token, reason: "file too large to inline" });
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
// Read + binary sniff + byte cap.
|
|
173
|
+
let buf;
|
|
174
|
+
try {
|
|
175
|
+
buf = fs.readFileSync(resolved);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
if (pathLike)
|
|
179
|
+
skipped.push({ token, reason: "unreadable" });
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (looksBinary(buf)) {
|
|
183
|
+
skipped.push({ token, reason: "binary file; not inlined" });
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
let truncated = false;
|
|
187
|
+
let body = buf.toString("utf8");
|
|
188
|
+
if (Buffer.byteLength(body, "utf8") > MAX_FILE_BYTES) {
|
|
189
|
+
body = Buffer.from(body, "utf8").subarray(0, MAX_FILE_BYTES).toString("utf8");
|
|
190
|
+
truncated = true;
|
|
191
|
+
}
|
|
192
|
+
attachments.push({ token, resolved, content: body, truncated });
|
|
193
|
+
consumed.push(full);
|
|
194
|
+
}
|
|
195
|
+
if (attachments.length === 0) {
|
|
196
|
+
return { text, attachments, skipped };
|
|
197
|
+
}
|
|
198
|
+
// Strip the consumed @<token> occurrences from the prompt text so they
|
|
199
|
+
// are NOT re-read by the specialist router, then append the fenced
|
|
200
|
+
// file blocks after the user's prose.
|
|
201
|
+
let stripped = text;
|
|
202
|
+
for (const full of consumed) {
|
|
203
|
+
// Replace each occurrence of the exact token span. Use split/join to
|
|
204
|
+
// avoid regex-escaping the (path) token.
|
|
205
|
+
stripped = stripped.split(full).join("");
|
|
206
|
+
}
|
|
207
|
+
stripped = stripped.replace(/[ \t]{2,}/g, " ").trim();
|
|
208
|
+
const blocks = attachments
|
|
209
|
+
.map((a) => {
|
|
210
|
+
const ext = path.extname(a.resolved).replace(/^\./, "");
|
|
211
|
+
const fence = "```" + (ext || "");
|
|
212
|
+
const head = `File: ${a.token}${a.truncated ? " (truncated to 32KB)" : ""}`;
|
|
213
|
+
return `${head}\n${fence}\n${a.content}\n\`\`\``;
|
|
214
|
+
})
|
|
215
|
+
.join("\n\n");
|
|
216
|
+
const text2 = stripped.length > 0 ? `${stripped}\n\n${blocks}` : blocks;
|
|
217
|
+
return { text: text2, attachments, skipped };
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=file_refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file_refs.js","sourceRoot":"","sources":["../src/file_refs.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -34,6 +34,22 @@ USAGE
|
|
|
34
34
|
|
|
35
35
|
OPTIONS
|
|
36
36
|
--yes, -y auto-approve every tool call (yolo mode)
|
|
37
|
+
--plan start in PLAN MODE — read-only tools only
|
|
38
|
+
(Write / Edit / Bash / Stoa are blocked even
|
|
39
|
+
with --yes); the model proposes a plan and stops.
|
|
40
|
+
Toggle mid-session with /plan; type "approve" to exit.
|
|
41
|
+
-p, --print [prompt] headless mode: run one turn non-interactively and
|
|
42
|
+
exit. Prompt from [prompt] or, if omitted, stdin.
|
|
43
|
+
No banner/spinner on stdout.
|
|
44
|
+
--output-format <text|json> with -p: "text" (default) prints the answer;
|
|
45
|
+
"json" prints one object
|
|
46
|
+
{answer, tools_used, verifier, cost, session_id}.
|
|
47
|
+
--continue resume the most-recent session for this directory.
|
|
48
|
+
--resume [id] resume a saved session; with no id, pick from a list.
|
|
49
|
+
--render / --no-render pretty-render the assistant's markdown at end of
|
|
50
|
+
turn (default: on for an interactive TTY, off when
|
|
51
|
+
piped / headless so plain text pipes cleanly).
|
|
52
|
+
Toggle mid-session with /render.
|
|
37
53
|
--cwd <dir> use <dir> as the working directory (default: $PWD)
|
|
38
54
|
--mode, --profile <slug> start in a domain profile (code | legal | finance |
|
|
39
55
|
design | research | writing | …33 total). Default: code.
|
|
@@ -81,6 +97,41 @@ function parseArgs(argv) {
|
|
|
81
97
|
if (a === "--yes" || a === "-y") {
|
|
82
98
|
out.yolo = true;
|
|
83
99
|
}
|
|
100
|
+
else if (a === "--plan") {
|
|
101
|
+
out.planMode = true;
|
|
102
|
+
}
|
|
103
|
+
else if (a === "-p" || a === "--print") {
|
|
104
|
+
out.print = true;
|
|
105
|
+
}
|
|
106
|
+
else if (a === "--output-format") {
|
|
107
|
+
const v = readFlagValue(out, a, argv, i);
|
|
108
|
+
if (v == null)
|
|
109
|
+
return out;
|
|
110
|
+
if (v !== "text" && v !== "json") {
|
|
111
|
+
out.parseError = { code: 2, message: `--output-format must be 'text' or 'json' (got '${v}'). Run \`theron --help\`.` };
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
out.outputFormat = v;
|
|
115
|
+
i++;
|
|
116
|
+
}
|
|
117
|
+
else if (a === "--continue") {
|
|
118
|
+
out.continueSession = true;
|
|
119
|
+
}
|
|
120
|
+
else if (a === "--resume") {
|
|
121
|
+
out.resumeSession = true;
|
|
122
|
+
// Optional id arg — only consume it when it doesn't look like a flag.
|
|
123
|
+
const v = argv[i + 1];
|
|
124
|
+
if (v !== undefined && !v.startsWith("-")) {
|
|
125
|
+
out.resumeId = v;
|
|
126
|
+
i++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else if (a === "--render") {
|
|
130
|
+
out.render = true;
|
|
131
|
+
}
|
|
132
|
+
else if (a === "--no-render") {
|
|
133
|
+
out.render = false;
|
|
134
|
+
}
|
|
84
135
|
else if (a === "--cwd") {
|
|
85
136
|
const v = readFlagValue(out, a, argv, i);
|
|
86
137
|
if (v == null)
|
|
@@ -219,7 +270,43 @@ export async function main(argv) {
|
|
|
219
270
|
return 2;
|
|
220
271
|
}
|
|
221
272
|
}
|
|
222
|
-
|
|
273
|
+
// Headless print mode (-p / --print). The prompt comes from the
|
|
274
|
+
// positional arg, or — when none was given — from stdin (read to EOF).
|
|
275
|
+
// This is the only place we read stdin eagerly; the parser can't.
|
|
276
|
+
let oneShotPrompt = args.prompt;
|
|
277
|
+
let headless = false;
|
|
278
|
+
let outputFormat = "text";
|
|
279
|
+
if (args.print) {
|
|
280
|
+
headless = true;
|
|
281
|
+
outputFormat = args.outputFormat ?? "text";
|
|
282
|
+
if (!oneShotPrompt) {
|
|
283
|
+
const piped = await readStdinToEof();
|
|
284
|
+
oneShotPrompt = piped.trim();
|
|
285
|
+
}
|
|
286
|
+
if (!oneShotPrompt) {
|
|
287
|
+
process.stderr.write("-p / --print needs a prompt — pass one as an argument or pipe it on stdin.\n");
|
|
288
|
+
return 2;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
else if (args.outputFormat) {
|
|
292
|
+
// --output-format only means something with -p.
|
|
293
|
+
process.stderr.write("--output-format only applies with -p / --print.\n");
|
|
294
|
+
return 2;
|
|
295
|
+
}
|
|
296
|
+
// Render mode: tri-state. Forced off in headless (so pipes get clean
|
|
297
|
+
// text / valid JSON); otherwise the flag wins; otherwise auto (on for
|
|
298
|
+
// an interactive TTY, off when piped or NO_COLOR).
|
|
299
|
+
let renderMode;
|
|
300
|
+
if (headless) {
|
|
301
|
+
renderMode = false;
|
|
302
|
+
}
|
|
303
|
+
else if (typeof args.render === "boolean") {
|
|
304
|
+
renderMode = args.render;
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
renderMode = !!process.stdout.isTTY && !process.env.NO_COLOR && !oneShotPrompt;
|
|
308
|
+
}
|
|
309
|
+
if (!apiKey && !process.env.THERON_API_KEY && !oneShotPrompt) {
|
|
223
310
|
// Anonymous calls work — auth just unlocks higher rate limits +
|
|
224
311
|
// saved history. Quiet info line on interactive launch only;
|
|
225
312
|
// one-shot mode keeps stdout clean for piping.
|
|
@@ -230,8 +317,31 @@ export async function main(argv) {
|
|
|
230
317
|
apiKey,
|
|
231
318
|
cwd,
|
|
232
319
|
yolo: args.yolo,
|
|
233
|
-
oneShot:
|
|
320
|
+
oneShot: oneShotPrompt,
|
|
234
321
|
profile: args.profile,
|
|
322
|
+
planMode: args.planMode,
|
|
323
|
+
headless,
|
|
324
|
+
outputFormat,
|
|
325
|
+
continueSession: args.continueSession,
|
|
326
|
+
resumeSession: args.resumeSession,
|
|
327
|
+
resumeId: args.resumeId,
|
|
328
|
+
renderMode,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
/** Read all of stdin to EOF as a UTF-8 string. Resolves "" when stdin is
|
|
332
|
+
* a TTY (no piped input) so headless mode fails the empty-prompt check
|
|
333
|
+
* rather than hanging on a terminal that never EOFs. */
|
|
334
|
+
function readStdinToEof() {
|
|
335
|
+
return new Promise((resolve) => {
|
|
336
|
+
if (process.stdin.isTTY) {
|
|
337
|
+
resolve("");
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
let buf = "";
|
|
341
|
+
process.stdin.setEncoding("utf8");
|
|
342
|
+
process.stdin.on("data", (chunk) => { buf += chunk; });
|
|
343
|
+
process.stdin.on("end", () => resolve(buf));
|
|
344
|
+
process.stdin.on("error", () => resolve(buf));
|
|
235
345
|
});
|
|
236
346
|
}
|
|
237
347
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,uEAAuE;AACvE,EAAE;AACF,SAAS;AACT,sDAAsD;AACtD,gEAAgE;AAChE,mDAAmD;AACnD,wDAAwD;AACxD,2DAA2D;AAC3D,0DAA0D;AAC1D,kBAAkB;AAElB,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|