guardlink 1.1.0 → 1.3.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/CHANGELOG.md +62 -0
- package/README.md +11 -2
- package/dist/agents/config.d.ts +17 -0
- package/dist/agents/config.d.ts.map +1 -1
- package/dist/agents/config.js +38 -4
- package/dist/agents/config.js.map +1 -1
- package/dist/agents/index.d.ts +5 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +4 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/launcher.d.ts +25 -8
- package/dist/agents/launcher.d.ts.map +1 -1
- package/dist/agents/launcher.js +137 -9
- package/dist/agents/launcher.js.map +1 -1
- package/dist/agents/prompts.d.ts +9 -0
- package/dist/agents/prompts.d.ts.map +1 -1
- package/dist/agents/prompts.js +43 -6
- package/dist/agents/prompts.js.map +1 -1
- package/dist/analyze/index.d.ts +44 -8
- package/dist/analyze/index.d.ts.map +1 -1
- package/dist/analyze/index.js +291 -15
- package/dist/analyze/index.js.map +1 -1
- package/dist/analyze/llm.d.ts +65 -13
- package/dist/analyze/llm.d.ts.map +1 -1
- package/dist/analyze/llm.js +429 -107
- package/dist/analyze/llm.js.map +1 -1
- package/dist/analyze/prompts.d.ts +6 -2
- package/dist/analyze/prompts.d.ts.map +1 -1
- package/dist/analyze/prompts.js +230 -111
- package/dist/analyze/prompts.js.map +1 -1
- package/dist/analyze/tools.d.ts +28 -0
- package/dist/analyze/tools.d.ts.map +1 -0
- package/dist/analyze/tools.js +236 -0
- package/dist/analyze/tools.js.map +1 -0
- package/dist/analyzer/index.d.ts +3 -0
- package/dist/analyzer/index.d.ts.map +1 -1
- package/dist/analyzer/index.js +3 -0
- package/dist/analyzer/index.js.map +1 -1
- package/dist/analyzer/sarif.d.ts +5 -6
- package/dist/analyzer/sarif.d.ts.map +1 -1
- package/dist/analyzer/sarif.js +5 -6
- package/dist/analyzer/sarif.js.map +1 -1
- package/dist/cli/index.d.ts +27 -16
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +524 -105
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/data.d.ts +5 -0
- package/dist/dashboard/data.d.ts.map +1 -1
- package/dist/dashboard/data.js +5 -0
- package/dist/dashboard/data.js.map +1 -1
- package/dist/dashboard/generate.d.ts +8 -5
- package/dist/dashboard/generate.d.ts.map +1 -1
- package/dist/dashboard/generate.js +206 -66
- package/dist/dashboard/generate.js.map +1 -1
- package/dist/dashboard/index.d.ts +5 -0
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +5 -0
- package/dist/dashboard/index.js.map +1 -1
- package/dist/diff/git.d.ts +10 -7
- package/dist/diff/git.d.ts.map +1 -1
- package/dist/diff/git.js +10 -7
- package/dist/diff/git.js.map +1 -1
- package/dist/diff/index.d.ts +4 -0
- package/dist/diff/index.d.ts.map +1 -1
- package/dist/diff/index.js +4 -0
- package/dist/diff/index.js.map +1 -1
- package/dist/init/detect.d.ts +5 -0
- package/dist/init/detect.d.ts.map +1 -1
- package/dist/init/detect.js +5 -0
- package/dist/init/detect.js.map +1 -1
- package/dist/init/index.d.ts +26 -6
- package/dist/init/index.d.ts.map +1 -1
- package/dist/init/index.js +91 -11
- package/dist/init/index.js.map +1 -1
- package/dist/init/picker.d.ts.map +1 -1
- package/dist/init/picker.js +17 -6
- package/dist/init/picker.js.map +1 -1
- package/dist/init/templates.d.ts +20 -0
- package/dist/init/templates.d.ts.map +1 -1
- package/dist/init/templates.js +167 -36
- package/dist/init/templates.js.map +1 -1
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +5 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/lookup.d.ts +5 -0
- package/dist/mcp/lookup.d.ts.map +1 -1
- package/dist/mcp/lookup.js +5 -0
- package/dist/mcp/lookup.js.map +1 -1
- package/dist/mcp/server.d.ts +16 -13
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +140 -17
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/suggest.d.ts +8 -6
- package/dist/mcp/suggest.d.ts.map +1 -1
- package/dist/mcp/suggest.js +8 -6
- package/dist/mcp/suggest.js.map +1 -1
- package/dist/parser/clear.d.ts +36 -0
- package/dist/parser/clear.d.ts.map +1 -0
- package/dist/parser/clear.js +148 -0
- package/dist/parser/clear.js.map +1 -0
- package/dist/parser/index.d.ts +3 -1
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +2 -1
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/parse-file.d.ts +5 -2
- package/dist/parser/parse-file.d.ts.map +1 -1
- package/dist/parser/parse-file.js +29 -2
- package/dist/parser/parse-file.js.map +1 -1
- package/dist/parser/parse-line.d.ts +3 -3
- package/dist/parser/parse-line.js +3 -3
- package/dist/parser/parse-project.d.ts +7 -7
- package/dist/parser/parse-project.d.ts.map +1 -1
- package/dist/parser/parse-project.js +24 -11
- package/dist/parser/parse-project.js.map +1 -1
- package/dist/parser/validate.d.ts +12 -0
- package/dist/parser/validate.d.ts.map +1 -1
- package/dist/parser/validate.js +44 -0
- package/dist/parser/validate.js.map +1 -1
- package/dist/report/index.d.ts +3 -0
- package/dist/report/index.d.ts.map +1 -1
- package/dist/report/index.js +3 -0
- package/dist/report/index.js.map +1 -1
- package/dist/report/report.d.ts +4 -7
- package/dist/report/report.d.ts.map +1 -1
- package/dist/report/report.js +68 -7
- package/dist/report/report.js.map +1 -1
- package/dist/review/index.d.ts +62 -0
- package/dist/review/index.d.ts.map +1 -0
- package/dist/review/index.js +226 -0
- package/dist/review/index.js.map +1 -0
- package/dist/tui/commands.d.ts +26 -1
- package/dist/tui/commands.d.ts.map +1 -1
- package/dist/tui/commands.js +608 -101
- package/dist/tui/commands.js.map +1 -1
- package/dist/tui/config.d.ts +6 -0
- package/dist/tui/config.d.ts.map +1 -1
- package/dist/tui/config.js +6 -0
- package/dist/tui/config.js.map +1 -1
- package/dist/tui/format.d.ts +7 -0
- package/dist/tui/format.d.ts.map +1 -1
- package/dist/tui/format.js +59 -0
- package/dist/tui/format.js.map +1 -1
- package/dist/tui/index.d.ts +8 -8
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +47 -10
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/input.d.ts +6 -0
- package/dist/tui/input.d.ts.map +1 -1
- package/dist/tui/input.js +6 -0
- package/dist/tui/input.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,68 @@ All notable changes to GuardLink CLI will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.3.0] — 2026-02-27
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Review**: `guardlink review` — interactive governance workflow for unmitigated exposures across CLI, TUI (`/review`), and MCP (`guardlink_review_list` + `guardlink_review_accept`). Users walk through exposures sorted by severity and choose: accept (writes `@accepts` + `@audit`), remediate (writes `@audit` with planned-fix note), or skip. Mandatory justification prevents rubber-stamping; timestamped audit trail for compliance.
|
|
13
|
+
- **CLI**: `guardlink clear` — remove all annotations from source files to start fresh, with `--dry-run` preview and `--include-definitions` option
|
|
14
|
+
- **CLI**: `guardlink unannotated` — list source files with no annotations, showing coverage ratio
|
|
15
|
+
- **CLI**: `guardlink sync` — standalone command to sync agent instruction files with current threat model (previously only available via MCP/TUI)
|
|
16
|
+
- **TUI**: `/review`, `/clear`, `/sync`, `/unannotated` commands
|
|
17
|
+
- **MCP**: `guardlink_review_list`, `guardlink_review_accept`, `guardlink_unannotated`, `guardlink_clear`, `guardlink_sync` tools
|
|
18
|
+
- **Dashboard**: File Coverage section on Code & Annotations page with progress bar and collapsible unannotated file list
|
|
19
|
+
- **Parser**: `annotated_files` and `unannotated_files` fields added to ThreatModel
|
|
20
|
+
- **Templates**: Sync guidance in workflow section for all 7 agent instruction formats
|
|
21
|
+
- **Templates**: Tightened negative guardrail — agents prohibited from writing `@accepts` (human-only via `guardlink review`)
|
|
22
|
+
- **Auto-sync**: `status` and `validate` commands now auto-sync agent instruction files after parsing
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- **Parser**: `@shield:begin`/`@shield:end` blocks now properly exclude content from the threat model. Previously, example annotations inside shielded blocks were parsed as real annotations, causing duplicate ID errors and dangling reference warnings.
|
|
27
|
+
- **Init**: Picker "All of the above" now uses a numbered option instead of `a` shortcut for consistency
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- **MCP**: Server version bumped to 1.3.0
|
|
32
|
+
|
|
33
|
+
## [1.2.0] — 2026-02-22
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- **LLM**: Multi-provider support — Anthropic, OpenAI (Responses API), Google Gemini, DeepSeek (reasoning), Ollama, and OpenRouter
|
|
38
|
+
- **LLM**: Tool-call system with CVE lookup (NVD), finding validation, and codebase search for grounded threat analysis
|
|
39
|
+
- **LLM**: Extended thinking / reasoning token support for DeepSeek and Anthropic models
|
|
40
|
+
- **Analyze**: Project context builder — automatically assembles architecture summary, data flows, and unmitigated exposures for LLM context
|
|
41
|
+
- **Analyze**: Code snippet extractor — injects relevant source around annotations into threat reports
|
|
42
|
+
- **CLI**: `threat-report` now accepts custom freeform prompts in addition to framework names
|
|
43
|
+
- **CLI**: `--provider`, `--model`, `--api-key`, `--web-search` flags for threat report generation
|
|
44
|
+
- **CLI**: Inline agent execution mode in launcher
|
|
45
|
+
- **TUI**: Model catalog with provider selection (Anthropic, OpenAI, Google, DeepSeek, Ollama, OpenRouter)
|
|
46
|
+
- **TUI**: Custom prompt input for threat reports alongside framework presets
|
|
47
|
+
- **TUI**: Inline agent execution from TUI sessions
|
|
48
|
+
- **TUI**: Restored `/exposures`, `/show`, `/scan` commands for exposure browsing and coverage scanning
|
|
49
|
+
- **Dashboard**: Collapsible sidebar with SVG navigation icons and localStorage state persistence
|
|
50
|
+
- **Dashboard**: Exposure computation helpers (`computeExposures`)
|
|
51
|
+
- **Docs**: Updated GUARDLINK_REFERENCE.md and SPEC.md with new capabilities
|
|
52
|
+
- **Validation**: Additional parser diagnostics
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
|
|
56
|
+
- **LLM**: Anthropic model IDs now use aliases (`claude-sonnet-4-6`, `claude-opus-4-6`) instead of invalid snapshot dates
|
|
57
|
+
- **Dashboard**: Mermaid diagram render trigger restored on first Diagrams tab visit
|
|
58
|
+
- **TUI**: CLI artifact cleaning (`cleanCliArtifacts`) for stripping agent-specific output formatting
|
|
59
|
+
- **CI**: OIDC trusted publishing preserved across merges (npm ≥11.5.1, no `registry-url` override)
|
|
60
|
+
|
|
61
|
+
### Changed
|
|
62
|
+
|
|
63
|
+
- **CLI**: `threat-report` signature changed from `[framework] [dir]` to `[prompt...] -d <dir>` — directory is now a flag, prompt accepts freeform text
|
|
64
|
+
- **Prompts**: Reframed annotations as developer hypotheses to validate rather than mandates, improving LLM annotation quality
|
|
65
|
+
|
|
66
|
+
### Removed
|
|
67
|
+
|
|
68
|
+
- **Util**: Removed empty `src/util/ansi.ts` placeholder (functionality already in `src/tui/format.ts`)
|
|
69
|
+
|
|
8
70
|
## [1.1.0] — 2026-02-21
|
|
9
71
|
|
|
10
72
|
### Added
|
package/README.md
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<img src=".github/guardlink_banner.png" alt="GuardLink" width="600">
|
|
2
4
|
|
|
3
5
|
[](https://www.npmjs.com/package/guardlink)
|
|
4
6
|
[](https://github.com/Bugb-Technologies/guardlink/actions)
|
|
@@ -6,9 +8,11 @@
|
|
|
6
8
|
[](https://nodejs.org)
|
|
7
9
|
[](docs/SPEC.md)
|
|
8
10
|
|
|
11
|
+
</div>
|
|
12
|
+
|
|
9
13
|
**Security annotations that live in your code. Your threat model updates when your code changes.**
|
|
10
14
|
|
|
11
|
-
> **This repository is secured by GuardLink.** Run `guardlink status .` to see
|
|
15
|
+
> **This repository is secured by GuardLink.** Run `guardlink status .` to see 272 annotations across 12 assets, 13 threats, and 10 controls — maintained by AI agents, validated in CI.
|
|
12
16
|
|
|
13
17
|
```javascript
|
|
14
18
|
// @asset PaymentService (#payments) -- "Handles card transactions"
|
|
@@ -170,6 +174,11 @@ GuardLink ships an MCP server and behavioral directives for AI coding agents. Af
|
|
|
170
174
|
| `guardlink threat-report [fw]` | AI threat report (stride/dread/pasta/attacker/rapid/general) |
|
|
171
175
|
| `guardlink threat-reports` | List saved AI threat reports |
|
|
172
176
|
| `guardlink annotate [prompt]` | Launch a coding agent to add annotations |
|
|
177
|
+
| `guardlink review [dir]` | Interactive governance review — accept, remediate, or skip unmitigated exposures |
|
|
178
|
+
| `guardlink review --list` | List reviewable exposures without prompting |
|
|
179
|
+
| `guardlink clear [dir]` | Remove all annotations from source files (with `--dry-run` preview) |
|
|
180
|
+
| `guardlink sync [dir]` | Sync agent instruction files with current threat model |
|
|
181
|
+
| `guardlink unannotated [dir]` | List source files with no annotations |
|
|
173
182
|
| `guardlink config` | Set AI provider and API key |
|
|
174
183
|
| `guardlink mcp` | Start MCP server for AI agent integration |
|
|
175
184
|
|
package/dist/agents/config.d.ts
CHANGED
|
@@ -9,6 +9,17 @@
|
|
|
9
9
|
* 5. Global config: ~/.config/guardlink/config.json
|
|
10
10
|
*
|
|
11
11
|
* Replaces the fragmented tui-config.json / CLI flag / env var resolution.
|
|
12
|
+
*
|
|
13
|
+
* @exposes #agent-launcher to #api-key-exposure [high] cwe:CWE-798 -- "API keys loaded from env vars, files; stored in config.json"
|
|
14
|
+
* @mitigates #agent-launcher against #api-key-exposure using #key-redaction -- "maskKey() redacts keys for display; keys never logged"
|
|
15
|
+
* @exposes #agent-launcher to #path-traversal [medium] cwe:CWE-22 -- "Config paths resolved from root and homedir"
|
|
16
|
+
* @mitigates #agent-launcher against #path-traversal using #path-validation -- "join() with known base dirs constrains paths"
|
|
17
|
+
* @exposes #agent-launcher to #arbitrary-write [medium] cwe:CWE-73 -- "saveProjectConfig writes to .guardlink/config.json"
|
|
18
|
+
* @mitigates #agent-launcher against #arbitrary-write using #path-validation -- "Output path is fixed relative to project root"
|
|
19
|
+
* @flows EnvVars -> #agent-launcher via process.env -- "Environment variable input"
|
|
20
|
+
* @flows ConfigFile -> #agent-launcher via readFileSync -- "Config file read"
|
|
21
|
+
* @flows #agent-launcher -> ConfigFile via writeFileSync -- "Config file write"
|
|
22
|
+
* @handles secrets on #agent-launcher -- "Processes and stores LLM API keys"
|
|
12
23
|
*/
|
|
13
24
|
import type { LLMConfig, LLMProvider } from '../analyze/llm.js';
|
|
14
25
|
interface SavedConfig {
|
|
@@ -17,6 +28,12 @@ interface SavedConfig {
|
|
|
17
28
|
apiKey?: string;
|
|
18
29
|
aiMode?: 'cli-agent' | 'api';
|
|
19
30
|
cliAgent?: string;
|
|
31
|
+
/** Enable extended thinking (Anthropic) / reasoning (DeepSeek) */
|
|
32
|
+
extendedThinking?: boolean;
|
|
33
|
+
/** Enable web search grounding (OpenAI Responses API) */
|
|
34
|
+
webSearch?: boolean;
|
|
35
|
+
/** Response format: 'text' or 'json' */
|
|
36
|
+
responseFormat?: 'text' | 'json';
|
|
20
37
|
}
|
|
21
38
|
/**
|
|
22
39
|
* Resolve LLM configuration using the unified priority chain.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/agents/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/agents/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIhE,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wCAAwC;IACxC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAkDD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D,SAAS,GAAG,IAAI,CAqDlB;AA6CD,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAEtE;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAEvD;AAED,+CAA+C;AAC/C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAGlE;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,IAAI,WAAW,GAAG,IAAI,CAErD;AAID,uDAAuD;AACvD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG3C;AAED,iDAAiD;AACjD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,MAAM,CAgBR"}
|
package/dist/agents/config.js
CHANGED
|
@@ -9,15 +9,28 @@
|
|
|
9
9
|
* 5. Global config: ~/.config/guardlink/config.json
|
|
10
10
|
*
|
|
11
11
|
* Replaces the fragmented tui-config.json / CLI flag / env var resolution.
|
|
12
|
+
*
|
|
13
|
+
* @exposes #agent-launcher to #api-key-exposure [high] cwe:CWE-798 -- "API keys loaded from env vars, files; stored in config.json"
|
|
14
|
+
* @mitigates #agent-launcher against #api-key-exposure using #key-redaction -- "maskKey() redacts keys for display; keys never logged"
|
|
15
|
+
* @exposes #agent-launcher to #path-traversal [medium] cwe:CWE-22 -- "Config paths resolved from root and homedir"
|
|
16
|
+
* @mitigates #agent-launcher against #path-traversal using #path-validation -- "join() with known base dirs constrains paths"
|
|
17
|
+
* @exposes #agent-launcher to #arbitrary-write [medium] cwe:CWE-73 -- "saveProjectConfig writes to .guardlink/config.json"
|
|
18
|
+
* @mitigates #agent-launcher against #arbitrary-write using #path-validation -- "Output path is fixed relative to project root"
|
|
19
|
+
* @flows EnvVars -> #agent-launcher via process.env -- "Environment variable input"
|
|
20
|
+
* @flows ConfigFile -> #agent-launcher via readFileSync -- "Config file read"
|
|
21
|
+
* @flows #agent-launcher -> ConfigFile via writeFileSync -- "Config file write"
|
|
22
|
+
* @handles secrets on #agent-launcher -- "Processes and stores LLM API keys"
|
|
12
23
|
*/
|
|
13
24
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
14
25
|
import { join } from 'node:path';
|
|
15
26
|
import { homedir } from 'node:os';
|
|
16
27
|
const DEFAULT_MODELS = {
|
|
17
|
-
anthropic: 'claude-sonnet-4-
|
|
18
|
-
openai: 'gpt-
|
|
19
|
-
|
|
28
|
+
anthropic: 'claude-sonnet-4-6',
|
|
29
|
+
openai: 'gpt-5.2',
|
|
30
|
+
google: 'gemini-2.5-flash',
|
|
31
|
+
openrouter: 'anthropic/claude-sonnet-4-6',
|
|
20
32
|
deepseek: 'deepseek-chat',
|
|
33
|
+
ollama: 'llama3.2',
|
|
21
34
|
};
|
|
22
35
|
const CONFIG_FILE = 'config.json';
|
|
23
36
|
const LEGACY_CONFIG_FILE = 'tui-config.json';
|
|
@@ -64,7 +77,7 @@ export function resolveConfig(root, flags) {
|
|
|
64
77
|
const provider = flags.provider;
|
|
65
78
|
return {
|
|
66
79
|
provider,
|
|
67
|
-
model: flags.model || DEFAULT_MODELS[provider] || 'gpt-
|
|
80
|
+
model: flags.model || DEFAULT_MODELS[provider] || 'gpt-5.2',
|
|
68
81
|
apiKey: flags.apiKey,
|
|
69
82
|
};
|
|
70
83
|
}
|
|
@@ -93,6 +106,7 @@ export function resolveConfig(root, flags) {
|
|
|
93
106
|
provider: projectCfg.provider,
|
|
94
107
|
model: flags?.model || projectCfg.model || DEFAULT_MODELS[projectCfg.provider],
|
|
95
108
|
apiKey: projectCfg.apiKey,
|
|
109
|
+
...savedConfigExtras(projectCfg),
|
|
96
110
|
};
|
|
97
111
|
}
|
|
98
112
|
// 5. Global config: ~/.config/guardlink/config.json
|
|
@@ -102,15 +116,29 @@ export function resolveConfig(root, flags) {
|
|
|
102
116
|
provider: globalCfg.provider,
|
|
103
117
|
model: flags?.model || globalCfg.model || DEFAULT_MODELS[globalCfg.provider],
|
|
104
118
|
apiKey: globalCfg.apiKey,
|
|
119
|
+
...savedConfigExtras(globalCfg),
|
|
105
120
|
};
|
|
106
121
|
}
|
|
107
122
|
return null;
|
|
108
123
|
}
|
|
124
|
+
/** Extract optional LLM config extras from saved config */
|
|
125
|
+
function savedConfigExtras(cfg) {
|
|
126
|
+
const extras = {};
|
|
127
|
+
if (cfg.extendedThinking)
|
|
128
|
+
extras.extendedThinking = true;
|
|
129
|
+
if (cfg.webSearch)
|
|
130
|
+
extras.webSearch = true;
|
|
131
|
+
if (cfg.responseFormat)
|
|
132
|
+
extras.responseFormat = cfg.responseFormat;
|
|
133
|
+
return extras;
|
|
134
|
+
}
|
|
109
135
|
/** Resolve from provider-specific env vars (ANTHROPIC_API_KEY, etc.) */
|
|
110
136
|
function resolveFromEnv(modelOverride) {
|
|
111
137
|
const checks = [
|
|
112
138
|
['ANTHROPIC_API_KEY', 'anthropic'],
|
|
113
139
|
['OPENAI_API_KEY', 'openai'],
|
|
140
|
+
['GOOGLE_API_KEY', 'google'],
|
|
141
|
+
['GEMINI_API_KEY', 'google'],
|
|
114
142
|
['OPENROUTER_API_KEY', 'openrouter'],
|
|
115
143
|
['DEEPSEEK_API_KEY', 'deepseek'],
|
|
116
144
|
];
|
|
@@ -134,6 +162,8 @@ function detectProviderFromKey(key) {
|
|
|
134
162
|
return 'openrouter';
|
|
135
163
|
if (key.startsWith('sk-'))
|
|
136
164
|
return 'openai'; // OpenAI uses sk- prefix
|
|
165
|
+
if (key.startsWith('AIza'))
|
|
166
|
+
return 'google'; // Google API keys start with AIza
|
|
137
167
|
return null; // Can't detect — need GUARDLINK_LLM_PROVIDER
|
|
138
168
|
}
|
|
139
169
|
// ─── Save/load for `guardlink config` and `/model` ──────────────────
|
|
@@ -171,6 +201,10 @@ export function describeConfigSource(root, flags) {
|
|
|
171
201
|
return 'ANTHROPIC_API_KEY env var';
|
|
172
202
|
if (process.env.OPENAI_API_KEY)
|
|
173
203
|
return 'OPENAI_API_KEY env var';
|
|
204
|
+
if (process.env.GOOGLE_API_KEY)
|
|
205
|
+
return 'GOOGLE_API_KEY env var';
|
|
206
|
+
if (process.env.GEMINI_API_KEY)
|
|
207
|
+
return 'GEMINI_API_KEY env var';
|
|
174
208
|
if (process.env.OPENROUTER_API_KEY)
|
|
175
209
|
return 'OPENROUTER_API_KEY env var';
|
|
176
210
|
if (process.env.DEEPSEEK_API_KEY)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agents/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agents/config.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/index.d.ts
CHANGED
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Used by CLI, TUI, and MCP to identify and resolve coding agents
|
|
5
5
|
* (Claude Code, Codex, Cursor, Windsurf, Gemini, clipboard).
|
|
6
|
+
*
|
|
7
|
+
* @comment -- "Agent binaries are hardcoded; no user-controlled binary names"
|
|
8
|
+
* @comment -- "parseAgentFlag extracts flags from args; no injection risk"
|
|
6
9
|
*/
|
|
7
10
|
export interface AgentEntry {
|
|
8
11
|
id: string;
|
|
@@ -19,6 +22,7 @@ export declare function parseAgentFlag(args: string): {
|
|
|
19
22
|
};
|
|
20
23
|
/** Resolve agent from Commander option booleans (CLI commands). */
|
|
21
24
|
export declare function agentFromOpts(opts: Record<string, any>): AgentEntry | null;
|
|
22
|
-
export { launchAgentForeground, launchAgentIDE, launchAgent, copyToClipboard } from './launcher.js';
|
|
25
|
+
export { launchAgentForeground, launchAgentIDE, launchAgent, launchAgentInline, copyToClipboard } from './launcher.js';
|
|
26
|
+
export type { InlineResult } from './launcher.js';
|
|
23
27
|
export { buildAnnotatePrompt } from './prompts.js';
|
|
24
28
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,MAAM,EAAE,SAAS,UAAU,EAO9B,CAAC;AAEX,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAO5F;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,UAAU,GAAG,IAAI,CAQ1E;AAED,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACvH,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/agents/index.js
CHANGED
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Used by CLI, TUI, and MCP to identify and resolve coding agents
|
|
5
5
|
* (Claude Code, Codex, Cursor, Windsurf, Gemini, clipboard).
|
|
6
|
+
*
|
|
7
|
+
* @comment -- "Agent binaries are hardcoded; no user-controlled binary names"
|
|
8
|
+
* @comment -- "parseAgentFlag extracts flags from args; no injection risk"
|
|
6
9
|
*/
|
|
7
10
|
export const AGENTS = [
|
|
8
11
|
{ id: 'claude-code', name: 'Claude Code', cmd: 'claude', app: null, flag: '--claude-code' },
|
|
@@ -37,6 +40,6 @@ export function agentFromOpts(opts) {
|
|
|
37
40
|
return AGENTS.find(a => a.id === 'clipboard');
|
|
38
41
|
return null;
|
|
39
42
|
}
|
|
40
|
-
export { launchAgentForeground, launchAgentIDE, launchAgent, copyToClipboard } from './launcher.js';
|
|
43
|
+
export { launchAgentForeground, launchAgentIDE, launchAgent, launchAgentInline, copyToClipboard } from './launcher.js';
|
|
41
44
|
export { buildAnnotatePrompt } from './prompts.js';
|
|
42
45
|
//# sourceMappingURL=index.js.map
|
package/dist/agents/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,MAAM,CAAC,MAAM,MAAM,GAA0B;IAC3C,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAG,GAAG,EAAE,IAAI,EAAQ,IAAI,EAAE,eAAe,EAAE;IAClG,EAAE,EAAE,EAAE,QAAQ,EAAO,IAAI,EAAE,QAAQ,EAAO,GAAG,EAAE,IAAI,EAAO,GAAG,EAAE,QAAQ,EAAI,IAAI,EAAE,UAAU,EAAE;IAC7F,EAAE,EAAE,EAAE,UAAU,EAAK,IAAI,EAAE,UAAU,EAAK,GAAG,EAAE,IAAI,EAAO,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE;IAC/F,EAAE,EAAE,EAAE,OAAO,EAAQ,IAAI,EAAE,WAAW,EAAI,GAAG,EAAE,OAAO,EAAI,GAAG,EAAE,IAAI,EAAQ,IAAI,EAAE,SAAS,EAAE;IAC5F,EAAE,EAAE,EAAE,QAAQ,EAAO,IAAI,EAAE,YAAY,EAAG,GAAG,EAAE,QAAQ,EAAG,GAAG,EAAE,IAAI,EAAQ,IAAI,EAAE,UAAU,EAAE;IAC7F,EAAE,EAAE,EAAE,WAAW,EAAI,IAAI,EAAE,WAAW,EAAI,GAAG,EAAE,IAAI,EAAO,GAAG,EAAE,IAAI,EAAQ,IAAI,EAAE,aAAa,EAAE;CACxF,CAAC;AAEX,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,aAAa,CAAC,IAAyB;IACrD,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,aAAa,CAAE,CAAC;IACtE,IAAI,IAAI,CAAC,MAAM;QAAM,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAE,CAAC;IACjE,IAAI,IAAI,CAAC,QAAQ;QAAI,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAE,CAAC;IACnE,IAAI,IAAI,CAAC,KAAK;QAAO,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAE,CAAC;IAChE,IAAI,IAAI,CAAC,MAAM;QAAM,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAE,CAAC;IACjE,IAAI,IAAI,CAAC,SAAS;QAAG,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAE,CAAC;IACpE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEvH,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -7,14 +7,17 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Clipboard copy is always performed first regardless of agent type.
|
|
9
9
|
*
|
|
10
|
-
* @exposes #agent-launcher to #child-proc-injection [
|
|
11
|
-
* @
|
|
12
|
-
* @mitigates #agent-launcher against #
|
|
13
|
-
* @
|
|
14
|
-
* @
|
|
15
|
-
* @
|
|
16
|
-
* @
|
|
17
|
-
* @
|
|
10
|
+
* @exposes #agent-launcher to #child-proc-injection [critical] cwe:CWE-78 -- "spawn/spawnSync execute external binaries"
|
|
11
|
+
* @mitigates #agent-launcher against #child-proc-injection using #param-commands -- "Binary names from hardcoded AGENTS registry; no shell interpolation"
|
|
12
|
+
* @mitigates #agent-launcher against #cmd-injection using #param-commands -- "Arguments passed as array, not shell string"
|
|
13
|
+
* @exposes #agent-launcher to #prompt-injection [medium] cwe:CWE-77 -- "User prompt passed to agent CLI as argument"
|
|
14
|
+
* @audit #agent-launcher -- "Prompt content is opaque to agent binary; injection risk depends on agent implementation"
|
|
15
|
+
* @exposes #agent-launcher to #dos [low] cwe:CWE-400 -- "No timeout on foreground spawn; agent controls duration"
|
|
16
|
+
* @comment -- "Timeout intentionally omitted for interactive sessions; inline mode has implicit control"
|
|
17
|
+
* @flows UserPrompt -> #agent-launcher via launchAgent -- "Prompt input path"
|
|
18
|
+
* @flows #agent-launcher -> AgentProcess via spawn -- "Process spawn path"
|
|
19
|
+
* @flows AgentProcess -> #agent-launcher via stdout -- "Agent output capture"
|
|
20
|
+
* @boundary #agent-launcher and AgentProcess (#agent-boundary) -- "Trust boundary at process spawn"
|
|
18
21
|
*/
|
|
19
22
|
import type { AgentEntry } from './index.js';
|
|
20
23
|
/** Copy text to system clipboard. Returns true on success. */
|
|
@@ -38,6 +41,20 @@ export declare function launchAgentIDE(agent: AgentEntry, cwd: string): {
|
|
|
38
41
|
success: boolean;
|
|
39
42
|
error?: string;
|
|
40
43
|
};
|
|
44
|
+
export interface InlineResult {
|
|
45
|
+
content: string;
|
|
46
|
+
error?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Run a CLI agent inline (non-interactive) and stream output.
|
|
50
|
+
*
|
|
51
|
+
* Instead of taking over the terminal, this spawns the agent with
|
|
52
|
+
* a print-mode flag and streams stdout back via onChunk.
|
|
53
|
+
* Returns the full collected output when done.
|
|
54
|
+
*/
|
|
55
|
+
export declare function launchAgentInline(agent: AgentEntry, prompt: string, cwd: string, onChunk?: (text: string) => void, opts?: {
|
|
56
|
+
autoYes?: boolean;
|
|
57
|
+
}): Promise<InlineResult>;
|
|
41
58
|
export interface LaunchResult {
|
|
42
59
|
launched: boolean;
|
|
43
60
|
clipboardCopied: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/agents/launcher.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/agents/launcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmBrD;AAID;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG;IACrE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAyBA;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAwCA;AAID,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA0CD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAChC,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,OAAO,CAAC,YAAY,CAAC,CAmFvB;AAID,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAyBxF"}
|
package/dist/agents/launcher.js
CHANGED
|
@@ -7,17 +7,23 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Clipboard copy is always performed first regardless of agent type.
|
|
9
9
|
*
|
|
10
|
-
* @exposes #agent-launcher to #child-proc-injection [
|
|
11
|
-
* @
|
|
12
|
-
* @mitigates #agent-launcher against #
|
|
13
|
-
* @
|
|
14
|
-
* @
|
|
15
|
-
* @
|
|
16
|
-
* @
|
|
17
|
-
* @
|
|
10
|
+
* @exposes #agent-launcher to #child-proc-injection [critical] cwe:CWE-78 -- "spawn/spawnSync execute external binaries"
|
|
11
|
+
* @mitigates #agent-launcher against #child-proc-injection using #param-commands -- "Binary names from hardcoded AGENTS registry; no shell interpolation"
|
|
12
|
+
* @mitigates #agent-launcher against #cmd-injection using #param-commands -- "Arguments passed as array, not shell string"
|
|
13
|
+
* @exposes #agent-launcher to #prompt-injection [medium] cwe:CWE-77 -- "User prompt passed to agent CLI as argument"
|
|
14
|
+
* @audit #agent-launcher -- "Prompt content is opaque to agent binary; injection risk depends on agent implementation"
|
|
15
|
+
* @exposes #agent-launcher to #dos [low] cwe:CWE-400 -- "No timeout on foreground spawn; agent controls duration"
|
|
16
|
+
* @comment -- "Timeout intentionally omitted for interactive sessions; inline mode has implicit control"
|
|
17
|
+
* @flows UserPrompt -> #agent-launcher via launchAgent -- "Prompt input path"
|
|
18
|
+
* @flows #agent-launcher -> AgentProcess via spawn -- "Process spawn path"
|
|
19
|
+
* @flows AgentProcess -> #agent-launcher via stdout -- "Agent output capture"
|
|
20
|
+
* @boundary #agent-launcher and AgentProcess (#agent-boundary) -- "Trust boundary at process spawn"
|
|
18
21
|
*/
|
|
19
|
-
import { spawnSync } from 'node:child_process';
|
|
22
|
+
import { spawnSync, spawn } from 'node:child_process';
|
|
20
23
|
import { platform } from 'node:os';
|
|
24
|
+
import { mkdtempSync, readFileSync, unlinkSync, existsSync } from 'node:fs';
|
|
25
|
+
import { join } from 'node:path';
|
|
26
|
+
import { tmpdir } from 'node:os';
|
|
21
27
|
// ─── Clipboard ───────────────────────────────────────────────────────
|
|
22
28
|
/** Copy text to system clipboard. Returns true on success. */
|
|
23
29
|
export function copyToClipboard(text) {
|
|
@@ -120,6 +126,128 @@ export function launchAgentIDE(agent, cwd) {
|
|
|
120
126
|
return { success: false, error: err.message };
|
|
121
127
|
}
|
|
122
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* CLI agent command + args for non-interactive (print) mode.
|
|
131
|
+
* claude: `claude -p "<prompt>" --dangerously-skip-permissions ...`
|
|
132
|
+
* codex: `codex exec "<prompt>" --dangerously-bypass-approvals-and-sandbox --color never -o <tmpfile>`
|
|
133
|
+
* gemini: `gemini --prompt "<prompt>" --approval-mode yolo`
|
|
134
|
+
*
|
|
135
|
+
* For codex, we use `-o <tmpfile>` to capture the final agent message to a file,
|
|
136
|
+
* which avoids any TTY/streaming issues. The tmpfile path is passed separately.
|
|
137
|
+
*/
|
|
138
|
+
function buildInlineArgs(agentId, prompt, codexOutputFile) {
|
|
139
|
+
switch (agentId) {
|
|
140
|
+
case 'claude-code':
|
|
141
|
+
return [
|
|
142
|
+
'-p', prompt,
|
|
143
|
+
'--dangerously-skip-permissions',
|
|
144
|
+
'--allowedTools', 'Read,Bash(cat *),Bash(find *),Bash(head *),Bash(tail *)',
|
|
145
|
+
'--output-format', 'text',
|
|
146
|
+
];
|
|
147
|
+
case 'codex':
|
|
148
|
+
// `codex exec` runs non-interactively (no TTY needed).
|
|
149
|
+
// --color never: suppress ANSI escape codes in output.
|
|
150
|
+
// -o <file>: write the final agent message to a file for clean extraction.
|
|
151
|
+
// --skip-git-repo-check: allow running outside a git repo.
|
|
152
|
+
return [
|
|
153
|
+
'exec', prompt,
|
|
154
|
+
'--dangerously-bypass-approvals-and-sandbox',
|
|
155
|
+
'--color', 'never',
|
|
156
|
+
'--skip-git-repo-check',
|
|
157
|
+
...(codexOutputFile ? ['-o', codexOutputFile] : []),
|
|
158
|
+
];
|
|
159
|
+
case 'gemini':
|
|
160
|
+
return [
|
|
161
|
+
'--prompt', prompt,
|
|
162
|
+
'--approval-mode', 'yolo',
|
|
163
|
+
];
|
|
164
|
+
default:
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Run a CLI agent inline (non-interactive) and stream output.
|
|
170
|
+
*
|
|
171
|
+
* Instead of taking over the terminal, this spawns the agent with
|
|
172
|
+
* a print-mode flag and streams stdout back via onChunk.
|
|
173
|
+
* Returns the full collected output when done.
|
|
174
|
+
*/
|
|
175
|
+
export async function launchAgentInline(agent, prompt, cwd, onChunk, opts) {
|
|
176
|
+
if (!agent.cmd) {
|
|
177
|
+
return { content: '', error: `${agent.name} is not a terminal agent — cannot run inline` };
|
|
178
|
+
}
|
|
179
|
+
let cmd = agent.cmd;
|
|
180
|
+
let args = buildInlineArgs(agent.id, prompt);
|
|
181
|
+
if (!args) {
|
|
182
|
+
return { content: '', error: `Inline mode not supported for ${agent.name}` };
|
|
183
|
+
}
|
|
184
|
+
return new Promise((resolve) => {
|
|
185
|
+
try {
|
|
186
|
+
// For Codex: use `codex exec` which is designed for non-interactive/headless use.
|
|
187
|
+
// It does NOT require a TTY for stdin or stdout.
|
|
188
|
+
// We use -o <tmpfile> so the final agent message is written to a file we can read
|
|
189
|
+
// back cleanly, avoiding any streaming/buffering issues with the live output.
|
|
190
|
+
let codexOutputFile;
|
|
191
|
+
if (agent.id === 'codex') {
|
|
192
|
+
const tmpDir = mkdtempSync(join(tmpdir(), 'guardlink-codex-'));
|
|
193
|
+
codexOutputFile = join(tmpDir, 'output.md');
|
|
194
|
+
}
|
|
195
|
+
args = buildInlineArgs(agent.id, prompt, codexOutputFile);
|
|
196
|
+
// Claude Code and Gemini still need stdin to be a real TTY (they check isatty(stdin)).
|
|
197
|
+
// Codex exec does not — it reads the prompt from the CLI arg, not stdin.
|
|
198
|
+
const stdinMode = agent.id === 'codex' ? 'pipe' : 'inherit';
|
|
199
|
+
const child = spawn(cmd, args, {
|
|
200
|
+
cwd,
|
|
201
|
+
stdio: [stdinMode, 'pipe', 'pipe'],
|
|
202
|
+
env: { ...process.env, NO_COLOR: '1' },
|
|
203
|
+
});
|
|
204
|
+
// For codex, close stdin immediately so it knows there's no interactive input.
|
|
205
|
+
if (agent.id === 'codex') {
|
|
206
|
+
child.stdin?.end();
|
|
207
|
+
}
|
|
208
|
+
let content = '';
|
|
209
|
+
let stderr = '';
|
|
210
|
+
child.stdout?.on('data', (data) => {
|
|
211
|
+
const text = data.toString();
|
|
212
|
+
content += text;
|
|
213
|
+
if (onChunk)
|
|
214
|
+
onChunk(text);
|
|
215
|
+
});
|
|
216
|
+
child.stderr?.on('data', (data) => {
|
|
217
|
+
stderr += data.toString();
|
|
218
|
+
});
|
|
219
|
+
child.on('error', (err) => {
|
|
220
|
+
const msg = err.code === 'ENOENT'
|
|
221
|
+
? `${agent.name} (${agent.cmd}) not found. Install it first.`
|
|
222
|
+
: `Failed to launch ${agent.name}: ${err.message}`;
|
|
223
|
+
resolve({ content, error: msg });
|
|
224
|
+
});
|
|
225
|
+
child.on('close', (code) => {
|
|
226
|
+
// For codex, prefer the -o output file (final agent message) over streamed stdout.
|
|
227
|
+
if (codexOutputFile && existsSync(codexOutputFile)) {
|
|
228
|
+
try {
|
|
229
|
+
const fileContent = readFileSync(codexOutputFile, 'utf-8').trim();
|
|
230
|
+
unlinkSync(codexOutputFile);
|
|
231
|
+
if (fileContent) {
|
|
232
|
+
resolve({ content: fileContent });
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch { /* fall through to stdout content */ }
|
|
237
|
+
}
|
|
238
|
+
if (code !== 0 && code !== null && !content) {
|
|
239
|
+
resolve({ content, error: `${agent.name} exited with code ${code}${stderr ? ': ' + stderr.slice(0, 200) : ''}` });
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
resolve({ content });
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
resolve({ content: '', error: `Failed to launch ${agent.name}: ${err.message}` });
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
123
251
|
/**
|
|
124
252
|
* Launch an agent with a prompt. Always copies to clipboard first.
|
|
125
253
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/agents/launcher.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/agents/launcher.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/prompts.d.ts
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
* GuardLink Agents — Prompt builders for annotation and analysis.
|
|
3
3
|
*
|
|
4
4
|
* Extracted from tui/commands.ts for shared use across CLI, TUI, MCP.
|
|
5
|
+
*
|
|
6
|
+
* @exposes #agent-launcher to #prompt-injection [high] cwe:CWE-77 -- "User prompt concatenated into agent instruction text"
|
|
7
|
+
* @audit #agent-launcher -- "Prompt injection mitigated by agent's own safety measures; GuardLink prompt is read-only context"
|
|
8
|
+
* @exposes #agent-launcher to #path-traversal [medium] cwe:CWE-22 -- "Reads reference docs from root-relative paths"
|
|
9
|
+
* @mitigates #agent-launcher against #path-traversal using #path-validation -- "resolve() with root constrains file access"
|
|
10
|
+
* @flows UserPrompt -> #agent-launcher via buildAnnotatePrompt -- "User instruction input"
|
|
11
|
+
* @flows ThreatModel -> #agent-launcher via model -- "Model context injection"
|
|
12
|
+
* @flows #agent-launcher -> AgentPrompt via return -- "Assembled prompt output"
|
|
13
|
+
* @handles internal on #agent-launcher -- "Serializes threat model IDs and flows into prompt"
|
|
5
14
|
*/
|
|
6
15
|
import type { ThreatModel } from '../types/index.js';
|
|
7
16
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/agents/prompts.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/agents/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,GAAG,IAAI,GACxB,MAAM,CAyUR"}
|