copperhead 0.9.0 → 0.11.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/NOTICE +1 -1
- package/README.md +47 -8
- package/dist/agent/context.js +2 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/dock-renderer.js +2 -2
- package/dist/agent/dock-renderer.js.map +1 -1
- package/dist/agent/envelope.js +105 -0
- package/dist/agent/envelope.js.map +1 -0
- package/dist/agent/filetools.js +24 -1
- package/dist/agent/filetools.js.map +1 -1
- package/dist/agent/ledger.js +24 -0
- package/dist/agent/ledger.js.map +1 -1
- package/dist/agent/loop.js +63 -72
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/prompts.js +4 -3
- package/dist/agent/prompts.js.map +1 -1
- package/dist/agent/providers/claude-code.js +17 -1
- package/dist/agent/providers/claude-code.js.map +1 -1
- package/dist/agent/providers/codex.js +84 -39
- package/dist/agent/providers/codex.js.map +1 -1
- package/dist/agent/providers/tool-protocol.js +21 -0
- package/dist/agent/providers/tool-protocol.js.map +1 -1
- package/dist/agent/recovery.js +186 -15
- package/dist/agent/recovery.js.map +1 -1
- package/dist/agent/registry.js +49 -0
- package/dist/agent/registry.js.map +1 -0
- package/dist/agent/render.js +2 -2
- package/dist/agent/render.js.map +1 -1
- package/dist/agent/theme.js +10 -5
- package/dist/agent/theme.js.map +1 -1
- package/dist/agent/tools.js +100 -586
- package/dist/agent/tools.js.map +1 -1
- package/dist/agent/transcript.js +2 -0
- package/dist/agent/transcript.js.map +1 -1
- package/dist/capabilities/define.js +35 -0
- package/dist/capabilities/define.js.map +1 -0
- package/dist/capabilities/handlers.js +744 -0
- package/dist/capabilities/handlers.js.map +1 -0
- package/dist/capabilities/helpers.js +39 -0
- package/dist/capabilities/helpers.js.map +1 -0
- package/dist/capabilities/index.js +50 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/capabilities/skills/generate-report.js +23 -0
- package/dist/capabilities/skills/generate-report.js.map +1 -0
- package/dist/cli.js +158 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/check.js +33 -1
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/create.js +181 -26
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/doctor.js +83 -6
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/skill.js +109 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/sync.js +3 -1
- package/dist/commands/sync.js.map +1 -1
- package/dist/config.js +19 -6
- package/dist/config.js.map +1 -1
- package/dist/kicad/bootstrap.js +24 -3
- package/dist/kicad/bootstrap.js.map +1 -1
- package/dist/kicad/cli.js +106 -18
- package/dist/kicad/cli.js.map +1 -1
- package/dist/kicad/dossier.js +207 -0
- package/dist/kicad/dossier.js.map +1 -0
- package/dist/kicad/draft/draft.js +135 -0
- package/dist/kicad/draft/draft.js.map +1 -0
- package/dist/kicad/draft/engine.js +5310 -0
- package/dist/kicad/draft/engine.js.map +1 -0
- package/dist/kicad/draft/ir.js +368 -0
- package/dist/kicad/draft/ir.js.map +1 -0
- package/dist/kicad/draft/symsource.js +504 -0
- package/dist/kicad/draft/symsource.js.map +1 -0
- package/dist/kicad/emit.js +220 -0
- package/dist/kicad/emit.js.map +1 -0
- package/dist/kicad/fab.js +13 -0
- package/dist/kicad/fab.js.map +1 -1
- package/dist/kicad/legibility.js +608 -0
- package/dist/kicad/legibility.js.map +1 -0
- package/dist/kicad/score.js +431 -0
- package/dist/kicad/score.js.map +1 -0
- package/dist/kicad/sexp.js +265 -6
- package/dist/kicad/sexp.js.map +1 -1
- package/dist/kicad/symlib.js +346 -16
- package/dist/kicad/symlib.js.map +1 -1
- package/dist/mcp/server.js +485 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/memory/bom-table.js +75 -39
- package/dist/memory/bom-table.js.map +1 -1
- package/dist/memory/scaffold.js +14 -1
- package/dist/memory/scaffold.js.map +1 -1
- package/dist/util/redact.js +6 -0
- package/dist/util/redact.js.map +1 -1
- package/package.json +13 -8
- package/src/agent/context.ts +35 -0
- package/src/agent/dock-renderer.ts +3 -2
- package/src/agent/envelope.ts +124 -0
- package/src/agent/filetools.ts +26 -1
- package/src/agent/ledger.ts +24 -0
- package/src/agent/loop.ts +73 -78
- package/src/agent/prompts.ts +4 -3
- package/src/agent/providers/claude-code.ts +22 -1
- package/src/agent/providers/codex.ts +91 -42
- package/src/agent/providers/tool-protocol.ts +22 -0
- package/src/agent/recovery.ts +183 -13
- package/src/agent/registry.ts +58 -0
- package/src/agent/render.ts +4 -3
- package/src/agent/theme.ts +15 -5
- package/src/agent/tools.ts +124 -628
- package/src/agent/transcript.ts +6 -0
- package/src/agent/types.ts +10 -5
- package/src/capabilities/define.ts +88 -0
- package/src/capabilities/handlers.ts +769 -0
- package/src/capabilities/helpers.ts +37 -0
- package/src/capabilities/index.ts +53 -0
- package/src/capabilities/skills/generate-report.ts +25 -0
- package/src/cli.ts +154 -0
- package/src/commands/check.ts +51 -1
- package/src/commands/create.ts +183 -21
- package/src/commands/doctor.ts +85 -6
- package/src/commands/skill.ts +127 -0
- package/src/commands/sync.ts +5 -3
- package/src/config.ts +56 -8
- package/src/kicad/bootstrap.ts +24 -3
- package/src/kicad/cli.ts +129 -18
- package/src/kicad/dossier.ts +217 -0
- package/src/kicad/draft/draft.ts +173 -0
- package/src/kicad/draft/engine.ts +5274 -0
- package/src/kicad/draft/ir.ts +416 -0
- package/src/kicad/draft/symsource.ts +549 -0
- package/src/kicad/emit.ts +300 -0
- package/src/kicad/fab.ts +15 -0
- package/src/kicad/legibility.ts +695 -0
- package/src/kicad/score.ts +502 -0
- package/src/kicad/sexp.ts +346 -6
- package/src/kicad/symlib.ts +364 -18
- package/src/mcp/server.ts +560 -0
- package/src/memory/bom-table.ts +85 -38
- package/src/memory/scaffold.ts +14 -1
- package/src/util/redact.ts +6 -0
- package/dist/memory/synap.js +0 -152
- package/dist/memory/synap.js.map +0 -1
- package/src/memory/synap.ts +0 -217
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bom-table.js","sourceRoot":"","sources":["../../src/memory/bom-table.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMD;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI;SACR,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,2EAA2E;AAC3E,SAAS,cAAc,CAAC,KAAe;IACrC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,
|
|
1
|
+
{"version":3,"file":"bom-table.js","sourceRoot":"","sources":["../../src/memory/bom-table.ts"],"names":[],"mappings":"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"}
|
package/dist/memory/scaffold.js
CHANGED
|
@@ -4,6 +4,7 @@ import { createHash } from 'node:crypto';
|
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { listSymbols, pinNets } from '../kicad/sexp.js';
|
|
6
6
|
import { configPath, loadConfig } from '../config.js';
|
|
7
|
+
import { resolveInRepo } from '../util/paths.js';
|
|
7
8
|
export class InitError extends Error {
|
|
8
9
|
}
|
|
9
10
|
const sha = (s) => createHash('sha256').update(s).digest('hex');
|
|
@@ -56,6 +57,11 @@ What the device is, top-level constraints and budgets.
|
|
|
56
57
|
Every part: refdes, MPN, value, package, and WHY it was chosen. MPNs the agent
|
|
57
58
|
introduces without a datasheet check are flagged UNVERIFIED.
|
|
58
59
|
|
|
60
|
+
Value holds the component value only ("4.7uF", "1M", "500mAh Li-Po") — the
|
|
61
|
+
schematic stage draws it as the symbol's Value field, so a description there
|
|
62
|
+
collides with neighbouring symbols and fails the legibility gate. Prose belongs
|
|
63
|
+
in Rationale. One row per refdes; a grouped row ("C5-C8") matches no symbol.
|
|
64
|
+
|
|
59
65
|
${bomTable(symbols)}
|
|
60
66
|
`,
|
|
61
67
|
'PINOUT.md': `# Pinout
|
|
@@ -105,6 +111,7 @@ Generated by \`copperhead init\`; regenerated on re-runs (do not hand-edit).
|
|
|
105
111
|
- \`maxRepairCycles\`: ERC/DRC repair attempts before rollback (default 5)
|
|
106
112
|
- \`budgets\`: free-form hard constraints (e.g. \`"sleep_current_uA": 25\`); surfaced verbatim into every run's system prompt
|
|
107
113
|
- \`generatedHashes\`: content hashes of generated docs, used to detect hand edits on re-init
|
|
114
|
+
- \`legibility\` (optional): schematic legibility checker tuning. \`legibility.thresholds\` accepts \`gridPitch\` (default 1.27mm), \`minPitch\` (2.54mm edge-to-edge between symbol bodies), \`utilization\` (0.5 of the usable frame), \`maxWireLength\` (50.8mm), and \`familyCap\` (10 findings per family per sheet). \`legibility.severity.<kind>\` overrides any check family to \`error\`, \`advisory\`, or \`off\` (disables it). Absent keys use the defaults; \`check\` reports findings without failing, the \`create\` schematic stage gates on error-severity findings. \`legibility.score.weights.<metric>\` and \`legibility.score.floor\` tune the quantitative scorer.
|
|
108
115
|
|
|
109
116
|
## constraints.json
|
|
110
117
|
|
|
@@ -144,7 +151,13 @@ exec copperhead check
|
|
|
144
151
|
}
|
|
145
152
|
export async function runInit(opts) {
|
|
146
153
|
const { repoRoot } = opts;
|
|
147
|
-
|
|
154
|
+
// AC-4.2: the search root comes from an untrusted caller — a CLI flag, and
|
|
155
|
+
// now an MCP tool input chosen by a host agent. Bare path.resolve lets an
|
|
156
|
+
// absolute or `../` value win outright, which would scaffold this repo's docs
|
|
157
|
+
// from a foreign project and durably write an out-of-repo config.schematic
|
|
158
|
+
// that every later check/do would then operate on. Contain it like every
|
|
159
|
+
// other file path in the codebase.
|
|
160
|
+
const searchRoot = resolveInRepo(repoRoot, opts.searchPath ?? '.');
|
|
148
161
|
const { sch, pcb } = await findKicadFiles(searchRoot);
|
|
149
162
|
if (!sch) {
|
|
150
163
|
throw new InitError(`no .kicad_sch found under ${path.relative(repoRoot, searchRoot) || '.'} — point copperhead at a KiCad project (copperhead init --path <dir>)`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/memory/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,OAAO,EAAqC,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,UAAU,EAAyB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/memory/scaffold.ts"],"names":[],"mappings":"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"}
|
package/dist/util/redact.js
CHANGED
|
@@ -15,6 +15,12 @@ const PATTERNS = [
|
|
|
15
15
|
/npm_[A-Za-z0-9-]{36,}/g,
|
|
16
16
|
/gh[pousr]_[A-Za-z0-9]{36,}/g,
|
|
17
17
|
/github_pat_[A-Za-z0-9_]{22,}/g,
|
|
18
|
+
// Gemini and Groq keys: same idea as sk- above, just a different prefix.
|
|
19
|
+
// Real keys are AIza + 35 chars, but AIzaSy (the common fifth/sixth pair)
|
|
20
|
+
// isn't the only prefix Google issues - match on AIza alone so other
|
|
21
|
+
// Google keys aren't left unredacted.
|
|
22
|
+
/AIza[A-Za-z0-9_-]{20,}/g,
|
|
23
|
+
/gsk_[A-Za-z0-9]{20,}/g,
|
|
18
24
|
];
|
|
19
25
|
export function redactSecrets(text) {
|
|
20
26
|
let out = text;
|
package/dist/util/redact.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/util/redact.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,QAAQ,GAAa;IACzB,oBAAoB;IACpB,+EAA+E;IAC/E,6EAA6E;IAC7E,gDAAgD;IAChD,mCAAmC;IACnC,6EAA6E;IAC7E,oEAAoE;IACpE,oEAAoE;IACpE,wBAAwB;IACxB,6BAA6B;IAC7B,+BAA+B;
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/util/redact.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,QAAQ,GAAa;IACzB,oBAAoB;IACpB,+EAA+E;IAC/E,6EAA6E;IAC7E,gDAAgD;IAChD,mCAAmC;IACnC,6EAA6E;IAC7E,oEAAoE;IACpE,oEAAoE;IACpE,wBAAwB;IACxB,6BAA6B;IAC7B,+BAA+B;IAC/B,yEAAyE;IACzE,0EAA0E;IAC1E,qEAAqE;IACrE,sCAAsC;IACtC,yBAAyB;IACzB,uBAAuB;CACxB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,EAAE,IAAI,QAAQ;QAAE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAC/D,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "copperhead",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Cursor for circuit boards: an AI agent that designs, documents, and validates real PCBs on KiCad repositories",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Animesh Chouhan <animeshchouhan@outlook.com>",
|
|
7
7
|
"homepage": "https://copperhead.sh",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/
|
|
10
|
+
"url": "git+https://github.com/copperheadhq/copperhead.git"
|
|
11
11
|
},
|
|
12
12
|
"bugs": {
|
|
13
|
-
"url": "https://github.com/
|
|
13
|
+
"url": "https://github.com/copperheadhq/copperhead/issues"
|
|
14
14
|
},
|
|
15
15
|
"keywords": [
|
|
16
16
|
"kicad",
|
|
@@ -44,7 +44,8 @@
|
|
|
44
44
|
"provenance": true
|
|
45
45
|
},
|
|
46
46
|
"scripts": {
|
|
47
|
-
"build": "tsc -p tsconfig.json",
|
|
47
|
+
"build": "tsc -p tsconfig.json && npm run postbuild",
|
|
48
|
+
"postbuild": "node -e \"require('fs').chmodSync('dist/cli.js', 0o755)\"",
|
|
48
49
|
"prepublishOnly": "npm run typecheck && npm run build",
|
|
49
50
|
"dev": "tsx src/cli.ts",
|
|
50
51
|
"demo:simple": "bash scripts/demo-simple.sh",
|
|
@@ -55,17 +56,21 @@
|
|
|
55
56
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
56
57
|
"docs:dev": "npm --prefix docs run dev",
|
|
57
58
|
"docs:build": "npm --prefix docs run build",
|
|
58
|
-
"docs:preview": "npm --prefix docs run preview"
|
|
59
|
+
"docs:preview": "npm --prefix docs run preview",
|
|
60
|
+
"refboards": "bash scripts/draft-reference-boards.sh",
|
|
61
|
+
"scoresheets": "tsx scripts/score-sheets.ts",
|
|
62
|
+
"realdesigns": "tsx scripts/draft-real-designs.ts"
|
|
59
63
|
},
|
|
60
64
|
"dependencies": {
|
|
61
65
|
"@anthropic-ai/sdk": "^0.113.0",
|
|
66
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
62
67
|
"commander": "^12.1.0",
|
|
63
68
|
"execa": "^9.5.2",
|
|
64
|
-
"openai": "^6.49.0"
|
|
69
|
+
"openai": "^6.49.0",
|
|
70
|
+
"zod": "^4.4.3"
|
|
65
71
|
},
|
|
66
72
|
"optionalDependencies": {
|
|
67
|
-
"@anthropic-ai/claude-agent-sdk": "^0.3.217"
|
|
68
|
-
"@maximem/synap-js-sdk": "^0.3.0"
|
|
73
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.217"
|
|
69
74
|
},
|
|
70
75
|
"devDependencies": {
|
|
71
76
|
"@openai/codex-sdk": "^0.144.6",
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { CopperheadConfig } from '../config.js';
|
|
2
|
+
import type { CheckReport } from '../kicad/report.js';
|
|
3
|
+
import type { ObligationsLedger } from './ledger.js';
|
|
4
|
+
import type { Transcript } from './transcript.js';
|
|
5
|
+
|
|
6
|
+
export interface FinishRequest {
|
|
7
|
+
outcome: 'done' | 'refuse';
|
|
8
|
+
summary: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Mutable state one run threads through every tool call. */
|
|
12
|
+
export interface RunContext {
|
|
13
|
+
repoRoot: string;
|
|
14
|
+
config: CopperheadConfig;
|
|
15
|
+
transcript: Transcript;
|
|
16
|
+
ledger: ObligationsLedger;
|
|
17
|
+
runId: string;
|
|
18
|
+
interactive: boolean;
|
|
19
|
+
confirm: (question: string) => Promise<boolean>;
|
|
20
|
+
editsUnlocked: boolean;
|
|
21
|
+
changeId: string | null;
|
|
22
|
+
proposalValidated: boolean;
|
|
23
|
+
filesTouched: Set<string>;
|
|
24
|
+
decisions: string[];
|
|
25
|
+
lastErc: CheckReport | null;
|
|
26
|
+
lastDrc: CheckReport | null;
|
|
27
|
+
/** Last check_legibility counts; feeds the run summary's verification section. */
|
|
28
|
+
lastLegibility: { error: number; advisory: number } | null;
|
|
29
|
+
/** Last score composite (AC-16.21); recorded in the run summary. */
|
|
30
|
+
lastScore: number | null;
|
|
31
|
+
/** Last `check_drift` output; used by `generate_report` completion. */
|
|
32
|
+
lastDrift?: string | null;
|
|
33
|
+
repairCycles: number;
|
|
34
|
+
finishRequest: FinishRequest | null;
|
|
35
|
+
}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import { rule, statusBar } from './box.js';
|
|
11
11
|
import { copper, dim, styleOutcome, toolLine, warn } from './theme.js';
|
|
12
12
|
import { fmtDuration, fmtTokens, turnMarker, type ProgressRenderer } from './render.js';
|
|
13
|
+
import type { ViewHint } from './envelope.js';
|
|
13
14
|
import type { TerminalDock } from '../util/dock.js';
|
|
14
15
|
|
|
15
16
|
const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
@@ -57,8 +58,8 @@ export class DockRenderer implements ProgressRenderer {
|
|
|
57
58
|
this.emit(line);
|
|
58
59
|
}
|
|
59
60
|
|
|
60
|
-
toolResult(name: string, firstLine: string): void {
|
|
61
|
-
this.emit(toolLine(name, firstLine));
|
|
61
|
+
toolResult(name: string, firstLine: string, ok?: boolean, viewHint?: ViewHint): void {
|
|
62
|
+
this.emit(toolLine(name, firstLine, ok, viewHint));
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
private turnStartMs = Date.now();
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { redactSecrets } from '../util/redact.js';
|
|
2
|
+
|
|
3
|
+
/** Envelope protocol version for the ToolResult shape (design D5). */
|
|
4
|
+
export const PROTOCOL_VERSION = 1;
|
|
5
|
+
|
|
6
|
+
export type ViewHint = 'diagnostic' | 'mutation' | 'query' | 'export';
|
|
7
|
+
export type ToolErrorKind = 'unavailable' | 'validation' | 'refusal' | 'exception';
|
|
8
|
+
|
|
9
|
+
export interface ToolResult {
|
|
10
|
+
ok: boolean;
|
|
11
|
+
summary: string;
|
|
12
|
+
detail?: string;
|
|
13
|
+
data?: unknown;
|
|
14
|
+
error?: { kind: ToolErrorKind; message: string };
|
|
15
|
+
viewHint?: ViewHint;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function redactEnvelopeText(text: string): string {
|
|
19
|
+
let out = redactSecrets(text);
|
|
20
|
+
for (const [name, val] of Object.entries(process.env)) {
|
|
21
|
+
if (!val || val.length < 8) continue;
|
|
22
|
+
if (!/_(KEY|SECRET|TOKEN)$/.test(name)) continue;
|
|
23
|
+
if (out.includes(val)) out = out.split(val).join('[REDACTED]');
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function redactDeep(value: unknown): unknown {
|
|
29
|
+
if (typeof value === 'string') return redactEnvelopeText(value);
|
|
30
|
+
if (Array.isArray(value)) return value.map(redactDeep);
|
|
31
|
+
if (value && typeof value === 'object') {
|
|
32
|
+
return Object.fromEntries(Object.entries(value as Record<string, unknown>).map(([k, v]) => [k, redactDeep(v)]));
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Redact every string field at construction so render/dock never see secrets. */
|
|
38
|
+
export function seal(partial: ToolResult): ToolResult {
|
|
39
|
+
return {
|
|
40
|
+
ok: partial.ok,
|
|
41
|
+
summary: redactEnvelopeText(partial.summary),
|
|
42
|
+
...(partial.detail !== undefined ? { detail: redactEnvelopeText(partial.detail) } : {}),
|
|
43
|
+
...(partial.data !== undefined ? { data: redactDeep(partial.data) } : {}),
|
|
44
|
+
...(partial.error
|
|
45
|
+
? { error: { kind: partial.error.kind, message: redactEnvelopeText(partial.error.message) } }
|
|
46
|
+
: {}),
|
|
47
|
+
...(partial.viewHint ? { viewHint: partial.viewHint } : {}),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function okResult(text: string, viewHint?: ViewHint, data?: unknown): ToolResult {
|
|
52
|
+
const first = text.split('\n')[0] ?? text;
|
|
53
|
+
return seal({
|
|
54
|
+
ok: true,
|
|
55
|
+
summary: first,
|
|
56
|
+
...(text !== first ? { detail: text } : {}),
|
|
57
|
+
...(data !== undefined ? { data } : {}),
|
|
58
|
+
...(viewHint ? { viewHint } : {}),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function failResult(kind: ToolErrorKind, message: string, viewHint?: ViewHint): ToolResult {
|
|
63
|
+
const first = message.split('\n')[0] ?? message;
|
|
64
|
+
return seal({
|
|
65
|
+
ok: false,
|
|
66
|
+
summary: first,
|
|
67
|
+
error: { kind, message },
|
|
68
|
+
...(viewHint ? { viewHint } : {}),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Flatten an envelope to the string providers already consume as tool Msg content. */
|
|
73
|
+
export function flatten(result: ToolResult): string {
|
|
74
|
+
if (result.error) return result.error.message;
|
|
75
|
+
if (result.detail) {
|
|
76
|
+
return result.detail.startsWith(result.summary) ? result.detail : `${result.summary}\n${result.detail}`;
|
|
77
|
+
}
|
|
78
|
+
return result.summary;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Build an envelope from text plus an outcome already known by the handler. */
|
|
82
|
+
export function outcomeResult(text: string, ok: boolean, viewHint?: ViewHint): ToolResult {
|
|
83
|
+
const first = text.split('\n')[0] ?? text;
|
|
84
|
+
return seal({
|
|
85
|
+
ok,
|
|
86
|
+
summary: first,
|
|
87
|
+
...(text !== first ? { detail: text } : {}),
|
|
88
|
+
...(viewHint ? { viewHint } : {}),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Wrap a legacy handler string. Error-shaped prefixes become typed failures so
|
|
94
|
+
* validation/refusal are not retried; everything else is success. Flattened
|
|
95
|
+
* text equals the original string.
|
|
96
|
+
*/
|
|
97
|
+
export function textResult(text: string, viewHint: ViewHint): ToolResult {
|
|
98
|
+
if (
|
|
99
|
+
/^error:/.test(text) ||
|
|
100
|
+
text.startsWith('rejected:') ||
|
|
101
|
+
text.startsWith('edit REVERTED') ||
|
|
102
|
+
text.startsWith('validation FAILED')
|
|
103
|
+
) {
|
|
104
|
+
return failResult('validation', text, viewHint);
|
|
105
|
+
}
|
|
106
|
+
if (
|
|
107
|
+
text.startsWith('refused:') ||
|
|
108
|
+
text.startsWith('cannot finish yet') ||
|
|
109
|
+
text.startsWith('proposal validated but human declined')
|
|
110
|
+
) {
|
|
111
|
+
return failResult('refusal', text, viewHint);
|
|
112
|
+
}
|
|
113
|
+
return okResult(text, viewHint);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function unavailable(name: string, editsUnlocked: boolean, reason?: string): ToolResult {
|
|
117
|
+
const suffix = reason
|
|
118
|
+
? ` (${reason})`
|
|
119
|
+
: editsUnlocked
|
|
120
|
+
? ''
|
|
121
|
+
: ' (edit tools unlock after the proposal validates)';
|
|
122
|
+
const message = `tool "${name}" is not available${suffix}`;
|
|
123
|
+
return failResult('unavailable', message);
|
|
124
|
+
}
|
package/src/agent/filetools.ts
CHANGED
|
@@ -75,6 +75,31 @@ export interface SearchMatch {
|
|
|
75
75
|
|
|
76
76
|
const SKIP_DIRS = new Set(['.git', 'node_modules', 'dist', '.copperhead']);
|
|
77
77
|
|
|
78
|
+
/**
|
|
79
|
+
* Longest match line returned to the model, in characters.
|
|
80
|
+
*
|
|
81
|
+
* The file-size bound in `toolSearch` (5 MB) bounds the file, not the line, and
|
|
82
|
+
* on a one-object-per-line document those are very different limits. A
|
|
83
|
+
* `transcript.jsonl` line is an entire `{ts, type, data}` record with tool
|
|
84
|
+
* output inline, so a few matches inside one file can be hundreds of thousands
|
|
85
|
+
* of tokens. A live run died on exactly that — `Prompt is too long · the
|
|
86
|
+
* request is ~1003121 tokens (limit 1000000) but this conversation is only
|
|
87
|
+
* ~403383 tokens`, the balance being search results — and it cost a stage
|
|
88
|
+
* attempt. The agent had done nothing wrong: it searched the repo it was told
|
|
89
|
+
* to work in, and a `run-logs/` directory happened to be sitting in it.
|
|
90
|
+
*
|
|
91
|
+
* A match is a pointer, not a payload — enough to see the hit and decide
|
|
92
|
+
* whether to read the file. Truncation is marked so a clipped line is
|
|
93
|
+
* distinguishable from a short one.
|
|
94
|
+
*/
|
|
95
|
+
const MAX_MATCH_CHARS = 400;
|
|
96
|
+
|
|
97
|
+
/** Clip one match line to `MAX_MATCH_CHARS`, marking it when clipped. */
|
|
98
|
+
function clipMatch(line: string): string {
|
|
99
|
+
const t = line.trim();
|
|
100
|
+
return t.length <= MAX_MATCH_CHARS ? t : `${t.slice(0, MAX_MATCH_CHARS)}… [+${t.length - MAX_MATCH_CHARS} chars]`;
|
|
101
|
+
}
|
|
102
|
+
|
|
78
103
|
export function globToRegex(glob: string): RegExp {
|
|
79
104
|
let out = '';
|
|
80
105
|
for (let i = 0; i < glob.length; i++) {
|
|
@@ -125,7 +150,7 @@ export async function toolSearch(
|
|
|
125
150
|
if (text.includes('\u0000')) continue; // binary
|
|
126
151
|
const lines = text.split('\n');
|
|
127
152
|
for (let i = 0; i < lines.length && matches.length < maxMatches; i++) {
|
|
128
|
-
if (re.test(lines[i]!)) matches.push({ file: rel, line: i + 1, text: lines[i]
|
|
153
|
+
if (re.test(lines[i]!)) matches.push({ file: rel, line: i + 1, text: clipMatch(lines[i]!) });
|
|
129
154
|
}
|
|
130
155
|
}
|
|
131
156
|
if (matches.length >= maxMatches) return;
|
package/src/agent/ledger.ts
CHANGED
|
@@ -7,6 +7,7 @@ export type ObligationKind =
|
|
|
7
7
|
| 'erc'
|
|
8
8
|
| 'drc'
|
|
9
9
|
| 'drift'
|
|
10
|
+
| 'legibility'
|
|
10
11
|
| 'changelog'
|
|
11
12
|
| 'decision-log'
|
|
12
13
|
| 'constraint-dual-write'
|
|
@@ -21,6 +22,18 @@ export interface Obligation {
|
|
|
21
22
|
export class ObligationsLedger {
|
|
22
23
|
private open: Obligation[] = [];
|
|
23
24
|
|
|
25
|
+
/**
|
|
26
|
+
* @param gateLegibility whether error-severity legibility findings block
|
|
27
|
+
* `finish`. True for repos whose schematic copperhead authored (create
|
|
28
|
+
* origin) — there the standard is copperhead's own responsibility. False for
|
|
29
|
+
* hand-drawn repos (`do` on an init-ed or hand-maintained project), where a
|
|
30
|
+
* pre-existing sheet could never satisfy the standard without a full redraw
|
|
31
|
+
* and the obligation would wedge every schematic-touching run; those repos
|
|
32
|
+
* get the same findings as advisory information via the tool and `check`
|
|
33
|
+
* (design C6: check reports, create gates).
|
|
34
|
+
*/
|
|
35
|
+
constructor(private readonly gateLegibility = true) {}
|
|
36
|
+
|
|
24
37
|
add(kind: ObligationKind, detail: string, openedBy: string): void {
|
|
25
38
|
if (!this.open.some((o) => o.kind === kind && o.detail === detail)) {
|
|
26
39
|
this.open.push({ kind, detail, openedBy });
|
|
@@ -45,6 +58,9 @@ export class ObligationsLedger {
|
|
|
45
58
|
onKicadEdit(file: string): void {
|
|
46
59
|
this.add('erc', 'ERC must pass after schematic edits', file);
|
|
47
60
|
if (file.endsWith('.kicad_pcb')) this.add('drc', 'DRC must pass after board edits', file);
|
|
61
|
+
if (file.endsWith('.kicad_sch') && this.gateLegibility) {
|
|
62
|
+
this.add('legibility', 'check_legibility must run clean after schematic edits', file);
|
|
63
|
+
}
|
|
48
64
|
this.add('drift', 'check_drift must run clean after KiCad edits', file);
|
|
49
65
|
this.add('changelog', 'CHANGELOG.md entry for this run', file);
|
|
50
66
|
}
|
|
@@ -53,6 +69,14 @@ export class ObligationsLedger {
|
|
|
53
69
|
this.add('drift', 'check_drift must run clean after doc edits', file);
|
|
54
70
|
}
|
|
55
71
|
|
|
72
|
+
/** A checker run updates the obligation: clean clears it, errors re-open it (gated repos only). */
|
|
73
|
+
onLegibilityResult(errorCount: number): void {
|
|
74
|
+
this.clear('legibility');
|
|
75
|
+
if (errorCount > 0 && this.gateLegibility) {
|
|
76
|
+
this.add('legibility', `${errorCount} error-severity legibility finding(s) unreconciled`, 'check_legibility');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
56
80
|
onConstraintChange(constraintKey: string, affects: string[]): void {
|
|
57
81
|
this.add('constraint-dual-write', constraintKey, constraintKey);
|
|
58
82
|
for (const item of affects) {
|