@fusengine/harness 0.1.15 → 0.1.17
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/dist/adapters/claude/index.mjs +1 -1
- package/dist/adapters/cline/index.mjs +1 -1
- package/dist/adapters/codex/index.mjs +1 -1
- package/dist/adapters/cursor/index.mjs +1 -1
- package/dist/adapters/gemini/index.mjs +1 -1
- package/dist/{claude-0DB5pb4d.mjs → claude-DH4B1kOe.mjs} +1 -1
- package/dist/cli/bin.mjs +2 -2
- package/dist/cli/index.mjs +1 -1
- package/dist/{evaluate-urGmc24B.mjs → evaluate-BmPDUtND.mjs} +27 -7
- package/dist/{handle-D_cJGRjJ.mjs → handle-BycRtJ0S.mjs} +27 -8
- package/dist/{index-BKSKTgnV.d.mts → index-Dz55GnvV.d.mts} +10 -3
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +4 -4
- package/dist/policy/index.d.mts +2 -2
- package/dist/policy/index.mjs +4 -4
- package/dist/{policy-Cpa5aWek.mjs → policy-EuVJ_5hS.mjs} +1 -13
- package/dist/{run-CsWHdBJp.mjs → run-BCvtbPca.mjs} +1 -1
- package/dist/runtime/index.d.mts +4 -0
- package/dist/runtime/index.mjs +1 -1
- package/dist/session-state-DxNkIBZ2.d.mts +35 -0
- package/dist/tracking/index.d.mts +1 -33
- package/dist/{verbosity-ZYT7tLCw.mjs → verbosity-D82yP4WD.mjs} +34 -10
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as readClaudeInput, i as guard, n as denyResponse, o as toClaudeResponse, r as fileSizeGuard, t as contextResponse } from "../../claude-
|
|
1
|
+
import { a as readClaudeInput, i as guard, n as denyResponse, o as toClaudeResponse, r as fileSizeGuard, t as contextResponse } from "../../claude-DH4B1kOe.mjs";
|
|
2
2
|
export { contextResponse, denyResponse, fileSizeGuard, guard, readClaudeInput, toClaudeResponse };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as readClaudeInput, i as guard, n as denyResponse, t as contextResponse } from "../../claude-
|
|
1
|
+
import { a as readClaudeInput, i as guard, n as denyResponse, t as contextResponse } from "../../claude-DH4B1kOe.mjs";
|
|
2
2
|
export { contextResponse, denyResponse, guard, readClaudeInput as readCodexInput };
|
package/dist/cli/bin.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { r as resolveTtlSec } from "../ttl-BG55s6HZ.mjs";
|
|
3
3
|
import { t as detectHarness } from "../harness-C8Nxxyn_.mjs";
|
|
4
|
-
import { n as stagedContent, r as stagedFiles, t as checkStaged } from "../run-
|
|
4
|
+
import { n as stagedContent, r as stagedFiles, t as checkStaged } from "../run-BCvtbPca.mjs";
|
|
5
5
|
import { n as writeInitFile, t as initFor } from "../run-D91N4ul1.mjs";
|
|
6
|
-
import { t as handleHook } from "../handle-
|
|
6
|
+
import { t as handleHook } from "../handle-BycRtJ0S.mjs";
|
|
7
7
|
//#region src/cli/bin.ts
|
|
8
8
|
/**
|
|
9
9
|
* harness — CLI for @fusengine/harness.
|
package/dist/cli/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as stagedContent, r as stagedFiles, t as checkStaged } from "../run-
|
|
1
|
+
import { n as stagedContent, r as stagedFiles, t as checkStaged } from "../run-BCvtbPca.mjs";
|
|
2
2
|
export { checkStaged, stagedContent, stagedFiles };
|
|
@@ -74,7 +74,10 @@ const GIT_ASK = [
|
|
|
74
74
|
/git mv/,
|
|
75
75
|
/git restore/,
|
|
76
76
|
/git revert/,
|
|
77
|
-
/git cherry-pick
|
|
77
|
+
/git cherry-pick/,
|
|
78
|
+
/git commit/,
|
|
79
|
+
/git add/,
|
|
80
|
+
/git branch -d/
|
|
78
81
|
];
|
|
79
82
|
/** System-level package installs (need confirmation). */
|
|
80
83
|
const SYSTEM_INSTALL = [
|
|
@@ -115,7 +118,12 @@ const CRITICAL_PATTERNS = [
|
|
|
115
118
|
/\b(?:curl|wget)\b[^|]*\|\s*(?:sudo\s+)?(?:ba|z|da|k)?sh\b/,
|
|
116
119
|
/\bchmod\s+(?:-[a-zA-Z]+\s+)*777\s+\//,
|
|
117
120
|
/\bmkfs(?:\.[a-z0-9]+)?\b/,
|
|
118
|
-
/\bdd\b[^\n]*\bif=\/dev\/zero\b[^\n]*\bof=\/dev
|
|
121
|
+
/\bdd\b[^\n]*\bif=\/dev\/zero\b[^\n]*\bof=\/dev\//,
|
|
122
|
+
/\bshred\b/,
|
|
123
|
+
/\bfdisk\b/,
|
|
124
|
+
/\bdiskutil\s+(?:erase|partitionDisk)/i,
|
|
125
|
+
/(?:>|>>)\s*\/dev\/(?:sda|hda|nvme)/,
|
|
126
|
+
/\brm\s+(?:-[a-z]*\s+)*-[a-z]*[rf][a-z]*\s+(?:-[a-z]+\s+)*\/(?:etc|usr|var|bin|sbin|boot|lib)\b/
|
|
119
127
|
];
|
|
120
128
|
/** Patterns that warrant explicit confirmation before running. */
|
|
121
129
|
const ASK_PATTERNS = [
|
|
@@ -123,7 +131,12 @@ const ASK_PATTERNS = [
|
|
|
123
131
|
/\bchmod\s+(?:-[a-zA-Z]+\s+)*777\b/,
|
|
124
132
|
/\bchown\s+-R\b/,
|
|
125
133
|
/\beval\s/,
|
|
126
|
-
/(?:>|>>|\btee\b)\s*\/etc
|
|
134
|
+
/(?:>|>>|\btee\b)\s*\/etc\//,
|
|
135
|
+
/\bsu\s/,
|
|
136
|
+
/\bdoas\s/,
|
|
137
|
+
/\bpasswd\b/,
|
|
138
|
+
/\brm\s/,
|
|
139
|
+
/\bunlink\s/
|
|
127
140
|
];
|
|
128
141
|
/** Guards against dangerous Bash commands (critical → block, sensitive → ask). */
|
|
129
142
|
function securityGuard(ctx) {
|
|
@@ -206,6 +219,10 @@ const PY_MODEL_RE = /^\s*class\s+\w+\((BaseModel|TypedDict|Protocol)\)/m;
|
|
|
206
219
|
const PHP_DECL_RE = /^\s*(interface|abstract class)\b/m;
|
|
207
220
|
/** Swift views: top-level `protocol Foo`. */
|
|
208
221
|
const SWIFT_PROTO_RE = /^\s*protocol\s+[A-Z]/m;
|
|
222
|
+
/** Go handlers/controllers: top-level `type Foo interface`. */
|
|
223
|
+
const GO_DECL_RE = /^\s*type\s+[A-Z]\w*\s+interface\b/m;
|
|
224
|
+
/** Java/Kotlin controllers/handlers: top-level `interface`/`record`. */
|
|
225
|
+
const JAVA_DECL_RE = /^\s*(?:public\s+|private\s+|protected\s+|internal\s+)?(?:interface|record)\s+[A-Z]/m;
|
|
209
226
|
/**
|
|
210
227
|
* Blocks top-level interface/type/protocol declarations in component, view or
|
|
211
228
|
* controller files (Interface Segregation). Fires only when BOTH the path
|
|
@@ -222,10 +239,13 @@ function interfaceSeparationGuard(ctx) {
|
|
|
222
239
|
reason: "Top-level interface/type/protocol declarations belong in their own file, not in a component/view/controller.",
|
|
223
240
|
actions: ["Move the interface/type to its own file (Interface Segregation)"]
|
|
224
241
|
};
|
|
242
|
+
const inAny = (...frags) => frags.some((f) => path.includes(f));
|
|
225
243
|
if (/\.(tsx|jsx|vue|svelte)$/.test(path) && TS_DECL_RE.test(content)) return block;
|
|
226
|
-
if (path
|
|
227
|
-
if (path
|
|
228
|
-
if (
|
|
244
|
+
if (/\.py$/.test(path) && inAny("views/", "controllers/", "routes/") && PY_MODEL_RE.test(content)) return block;
|
|
245
|
+
if (/\.go$/.test(path) && inAny("handlers/", "controllers/") && GO_DECL_RE.test(content)) return block;
|
|
246
|
+
if (/\.(java|kt)$/.test(path) && inAny("controllers/", "handlers/") && JAVA_DECL_RE.test(content)) return block;
|
|
247
|
+
if (/\.php$/.test(path) && inAny("Controllers/", "Handlers/") && PHP_DECL_RE.test(content)) return block;
|
|
248
|
+
if (/\.swift$/.test(path) && inAny("Views/", "Components/") && SWIFT_PROTO_RE.test(content)) return block;
|
|
229
249
|
return null;
|
|
230
250
|
}
|
|
231
251
|
//#endregion
|
|
@@ -320,4 +340,4 @@ function evaluate(ctx) {
|
|
|
320
340
|
};
|
|
321
341
|
}
|
|
322
342
|
//#endregion
|
|
323
|
-
export {
|
|
343
|
+
export { PROJECT_INSTALL as C, evaluateFileSize as D, countLines as E, detectFramework as O, GIT_BLOCKED as S, matchPatterns as T, protectedPathGuard as _, GO_DECL_RE as a, securityGuard as b, PY_MODEL_RE as c, interfaceSeparationGuard as d, ASK_WRITERS as f, PROTECTED_FRAGMENTS as g, bashWriteGuard as h, installGuard as i, SWIFT_PROTO_RE as l, CODE_REDIRECT as m, GUARDS as n, JAVA_DECL_RE as o, CODE_MUTATORS as p, runGuards as r, PHP_DECL_RE as s, evaluate as t, TS_DECL_RE as u, ASK_PATTERNS as v, SYSTEM_INSTALL as w, GIT_ASK as x, CRITICAL_PATTERNS as y };
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { r as projectLayout } from "./layout-C0jaaCQC.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { O as detectFramework, t as evaluate } from "./evaluate-BmPDUtND.mjs";
|
|
3
|
+
import { c as evaluateApex, i as detectCreationIntent, r as capVerbosity } from "./verbosity-D82yP4WD.mjs";
|
|
4
4
|
import { t as formatPrompt } from "./types-ernB1Dy3.mjs";
|
|
5
5
|
import { a as extractText, r as cacheStore, t as cacheLookup } from "./store-DeIsfMg5.mjs";
|
|
6
6
|
import { t as loadRefs } from "./loader-BephwI8n.mjs";
|
|
7
|
-
import { a as recordAgent, c as recordRefRead, l as recordTrivialEdit, n as saveTrack, r as agentsFresh, s as recordDoc, t as loadTrack, u as trivialCount } from "./store-BnHpq2ZB.mjs";
|
|
7
|
+
import { a as recordAgent, c as recordRefRead, l as recordTrivialEdit, n as saveTrack, o as recordBrainstormRequired, r as agentsFresh, s as recordDoc, t as loadTrack, u as trivialCount } from "./store-BnHpq2ZB.mjs";
|
|
8
8
|
import { join } from "node:path";
|
|
9
9
|
import { tmpdir } from "node:os";
|
|
10
10
|
//#region src/runtime/activity.ts
|
|
11
|
+
/** Min response length (chars) for a lead agent call to count as `sufficient`. */
|
|
12
|
+
const AGENT_QUALITY_MIN = 500;
|
|
11
13
|
/** Read tools across harnesses (Claude `Read`, Gemini/Cline `read_file`, …). */
|
|
12
14
|
const READ_TOOLS = /* @__PURE__ */ new Set([
|
|
13
15
|
"Read",
|
|
@@ -30,11 +32,18 @@ function activityFor(event) {
|
|
|
30
32
|
};
|
|
31
33
|
if (event.tool === "Task") {
|
|
32
34
|
const name = String(event.input?.subagent_type ?? "").split(":").pop() ?? "";
|
|
33
|
-
|
|
35
|
+
if (!name) return null;
|
|
36
|
+
const quality = event.responseLength === void 0 ? void 0 : event.responseLength > AGENT_QUALITY_MIN ? "sufficient" : "insufficient";
|
|
37
|
+
return quality ? {
|
|
38
|
+
kind: "agent",
|
|
39
|
+
name,
|
|
40
|
+
ts: event.now,
|
|
41
|
+
quality
|
|
42
|
+
} : {
|
|
34
43
|
kind: "agent",
|
|
35
44
|
name,
|
|
36
45
|
ts: event.now
|
|
37
|
-
}
|
|
46
|
+
};
|
|
38
47
|
}
|
|
39
48
|
if (READ_TOOLS.has(event.tool)) {
|
|
40
49
|
const path = String(event.input?.file_path ?? event.input?.path ?? "");
|
|
@@ -193,7 +202,7 @@ function trackFile(sessionId, baseDir = join(tmpdir(), "fuse-harness")) {
|
|
|
193
202
|
/** Apply an activity to a session's track and persist it (PostToolUse path). */
|
|
194
203
|
async function recordActivity(file, activity) {
|
|
195
204
|
const track = await loadTrack(file);
|
|
196
|
-
await saveTrack(file, activity.kind === "agent" ? recordAgent(track, activity.name, activity.ts) : activity.kind === "doc" ? recordDoc(track, activity.framework, activity.sessionId, activity.source) : recordRefRead(track, activity.path));
|
|
205
|
+
await saveTrack(file, activity.kind === "agent" ? recordAgent(track, activity.name, activity.ts, activity.quality) : activity.kind === "doc" ? recordDoc(track, activity.framework, activity.sessionId, activity.source) : recordRefRead(track, activity.path));
|
|
197
206
|
}
|
|
198
207
|
//#endregion
|
|
199
208
|
//#region src/runtime/respond.ts
|
|
@@ -243,14 +252,24 @@ async function handleHook(id, payload, opts) {
|
|
|
243
252
|
const file = trackFile(event.sessionId, layout.trackDir);
|
|
244
253
|
const mcpDir = layout.cacheDir;
|
|
245
254
|
const framework = detectFramework(event.filePath ?? "", event.content ?? "");
|
|
255
|
+
const userPrompt = typeof payload.prompt === "string" ? payload.prompt : void 0;
|
|
256
|
+
if (userPrompt !== void 0) {
|
|
257
|
+
await saveTrack(file, recordBrainstormRequired(await loadTrack(file), detectCreationIntent(userPrompt)));
|
|
258
|
+
return {
|
|
259
|
+
stdout: "",
|
|
260
|
+
exit: 0
|
|
261
|
+
};
|
|
262
|
+
}
|
|
246
263
|
if (event.phase === "post") {
|
|
247
|
-
|
|
264
|
+
const response = payload.tool_response ?? payload.tool_output;
|
|
265
|
+
mcpPostStore(event.tool, event.input, response, mcpDir);
|
|
248
266
|
const activity = activityFor({
|
|
249
267
|
tool: event.tool,
|
|
250
268
|
input: event.input,
|
|
251
269
|
sessionId: event.sessionId,
|
|
252
270
|
framework,
|
|
253
|
-
now: opts.now
|
|
271
|
+
now: opts.now,
|
|
272
|
+
responseLength: extractText(response).length
|
|
254
273
|
});
|
|
255
274
|
if (activity) await recordActivity(file, activity);
|
|
256
275
|
return {
|
|
@@ -169,6 +169,10 @@ declare const PY_MODEL_RE: RegExp;
|
|
|
169
169
|
declare const PHP_DECL_RE: RegExp;
|
|
170
170
|
/** Swift views: top-level `protocol Foo`. */
|
|
171
171
|
declare const SWIFT_PROTO_RE: RegExp;
|
|
172
|
+
/** Go handlers/controllers: top-level `type Foo interface`. */
|
|
173
|
+
declare const GO_DECL_RE: RegExp;
|
|
174
|
+
/** Java/Kotlin controllers/handlers: top-level `interface`/`record`. */
|
|
175
|
+
declare const JAVA_DECL_RE: RegExp;
|
|
172
176
|
/**
|
|
173
177
|
* Blocks top-level interface/type/protocol declarations in component, view or
|
|
174
178
|
* controller files (Interface Segregation). Fires only when BOTH the path
|
|
@@ -197,10 +201,13 @@ declare function detectCreationIntent(prompt: string): boolean;
|
|
|
197
201
|
//#region src/policy/verbosity.d.ts
|
|
198
202
|
/** Max results an exa MCP call may request. */
|
|
199
203
|
declare const MAX_EXA_RESULTS = 3;
|
|
204
|
+
/** Max token budget for exa `tokensNum` / context7 `tokens`. */
|
|
205
|
+
declare const MAX_TOKENS = 2e3;
|
|
200
206
|
/**
|
|
201
|
-
* Cap an
|
|
202
|
-
*
|
|
207
|
+
* Cap an MCP call's verbosity — exa `numResults` ≤ 3 (+ `tokensNum` ≤ 2000),
|
|
208
|
+
* Context7 `tokens` ≤ 2000. Returns the capped input (a mutation for the harness
|
|
209
|
+
* to apply) when a change is needed, else null.
|
|
203
210
|
*/
|
|
204
211
|
declare function capVerbosity(tool: string, input: Record<string, unknown>): Record<string, unknown> | null;
|
|
205
212
|
//#endregion
|
|
206
|
-
export {
|
|
213
|
+
export { docConsultedGate as A, SYSTEM_INSTALL as B, securityGuard as C, ApexContext as D, APEX_GATES as E, PolicyResult as F, detectFramework as G, FileSizeVerdict as H, evaluate as I, detectProjectType as J, DEV_KEYWORDS as K, GIT_ASK as L, freshnessGate as M, solidReadGate as N, ApexGate as O, PolicyContext as P, GIT_BLOCKED as R, CRITICAL_PATTERNS as S, GuardContext as T, countLines as U, matchPatterns as V, evaluateFileSize as W, isApexCommand as Y, CODE_REDIRECT as _, GUARDS as a, protectedPathGuard as b, GO_DECL_RE as c, PY_MODEL_RE as d, SWIFT_PROTO_RE as f, CODE_MUTATORS as g, ASK_WRITERS as h, detectCreationIntent as i, evaluateApex as j, brainstormGate as k, JAVA_DECL_RE as l, interfaceSeparationGuard as m, MAX_TOKENS as n, runGuards as o, TS_DECL_RE as p, ProjectType as q, capVerbosity as r, installGuard as s, MAX_EXA_RESULTS as t, PHP_DECL_RE as u, bashWriteGuard as v, Guard as w, ASK_PATTERNS as x, PROTECTED_FRAGMENTS as y, PROJECT_INSTALL as z };
|
package/dist/index.d.mts
CHANGED
|
@@ -5,10 +5,10 @@ import { a as detectHarness, i as HarnessVia, n as HarnessInfo, o as detectMode,
|
|
|
5
5
|
import { a as isDocConsulted, i as formatDocSatisfactionStatus, n as DocSatisfactionStatus, o as resolveSessions, r as formatDocDeny, t as AuthEntry } from "./doc-helpers-CG1nuf-c.mjs";
|
|
6
6
|
import { t as incrementTrivialEditCounter } from "./index-BOBXQ91y.mjs";
|
|
7
7
|
import { i as compactJson, n as projectRoot, r as projectRootOrNull, t as isCodeFile } from "./index-C1vLIMwN.mjs";
|
|
8
|
-
import { A as
|
|
8
|
+
import { A as docConsultedGate, B as SYSTEM_INSTALL, C as securityGuard, D as ApexContext, E as APEX_GATES, F as PolicyResult, G as detectFramework, H as FileSizeVerdict, I as evaluate, J as detectProjectType, K as DEV_KEYWORDS, L as GIT_ASK, M as freshnessGate, N as solidReadGate, O as ApexGate, P as PolicyContext, R as GIT_BLOCKED, S as CRITICAL_PATTERNS, T as GuardContext, U as countLines, V as matchPatterns, W as evaluateFileSize, Y as isApexCommand, _ as CODE_REDIRECT, a as GUARDS, b as protectedPathGuard, c as GO_DECL_RE, d as PY_MODEL_RE, f as SWIFT_PROTO_RE, g as CODE_MUTATORS, h as ASK_WRITERS, i as detectCreationIntent, j as evaluateApex, k as brainstormGate, l as JAVA_DECL_RE, m as interfaceSeparationGuard, n as MAX_TOKENS, o as runGuards, p as TS_DECL_RE, q as ProjectType, r as capVerbosity, s as installGuard, t as MAX_EXA_RESULTS, u as PHP_DECL_RE, v as bashWriteGuard, w as Guard, x as ASK_PATTERNS, y as PROTECTED_FRAGMENTS, z as PROJECT_INSTALL } from "./index-Dz55GnvV.mjs";
|
|
9
9
|
import { n as RouteResult, r as ScoredRef, t as RefMeta } from "./types-CY5qT2X1.mjs";
|
|
10
10
|
import { a as ReminderState, c as readState, d as throttleMs, i as registryFile, l as setStateField, n as addRoot, o as lessonsFileFor, r as readRoots, s as nowStamp, t as ensureMemoryGitignore, u as stateFileFor } from "./index-DLYhervv.mjs";
|
|
11
11
|
import { a as globToRe, i as scoreReferences, n as toRefMeta, o as parseFrontmatter, r as routeReferences, t as loadRefs } from "./index-hL_r6tlc.mjs";
|
|
12
12
|
import { a as taskStart, c as ensureStateDir, d as stateFilePath, f as acquireLock, i as taskCreate, l as loadState, n as ApexTaskFile, o as ApexState, r as taskComplete, s as apexStateDir, t as ApexTask, u as saveState } from "./index-CPoF_hLP.mjs";
|
|
13
13
|
import { _ as TIME_INTERVALS, a as formatCost, c as formatTokens, d as colors, f as progressiveColor, g as PROGRESS_CHARS, h as PROGRESS_BAR_DEFAULTS, i as formatBasename, l as ColorFn, m as GRADIENT_BLOCKS, n as generateGradientBar, o as formatPath, p as COLOR_THRESHOLDS, r as generateProgressBar, s as formatTimeLeft, t as ProgressBarOptions, u as Palette } from "./index-BWK8slRi.mjs";
|
|
14
|
-
export { APEX_GATES, ASK_PATTERNS, ASK_WRITERS, ApexContext, ApexGate, ApexState, ApexTask, ApexTaskFile, AuthEntry, CODE_MUTATORS, CODE_REDIRECT, COLOR_THRESHOLDS, CRITICAL_PATTERNS, ColorFn, DEFAULT_MAX_LINES, DEFAULT_TTL_SEC, DEV_KEYWORDS, DocSatisfactionStatus, FileSizeVerdict, GIT_ASK, GIT_BLOCKED, GRADIENT_BLOCKS, GUARDS, Guard, GuardContext, HarnessId, HarnessInfo, HarnessMode, HarnessVia, IndexSummary, MAX_EXA_RESULTS, MAX_LINES_ENV_KEY, PHP_DECL_RE, PROGRESS_BAR_DEFAULTS, PROGRESS_CHARS, PROJECT_INSTALL, PROTECTED_FRAGMENTS, PY_MODEL_RE, Palette, PolicyContext, PolicyResult, ProgressBarOptions, ProjectLayout, ProjectType, Prompt, PromptKind, RefMeta, ReminderState, RouteResult, STATE_GITIGNORE, STATE_ROOT, SWIFT_PROTO_RE, SYSTEM_INSTALL, ScoredRef, TIME_INTERVALS, TS_DECL_RE, TTL_ENV_KEY, acquireLock, addRoot, apexStateDir, bashWriteGuard, brainstormGate, cacheLookup, cachePath, cacheStore, capVerbosity, colors, compactJson, compactMarkdown, countLines, detectCreationIntent, detectFramework, detectHarness, detectMode, detectProjectType, docConsultedGate, ensureMemoryGitignore, ensureStateDir, evaluate, evaluateApex, evaluateFileSize, extractText, formatBasename, formatCost, formatDocDeny, formatDocSatisfactionStatus, formatPath, formatPrompt, formatTimeLeft, formatTokens, freshnessGate, generateGradientBar, generateProgressBar, globToRe, incrementTrivialEditCounter, installGuard, interfaceSeparationGuard, isApexCommand, isCodeFile, isDocConsulted, jaccardSimilar, lessonsFileFor, loadIndex, loadRefs, loadState, matchPatterns, mcpCacheKey, modeFor, nowStamp, parseEnvInt, parseFrontmatter, progressiveColor, projectLayout, projectRoot, projectRootOrNull, protectedPathGuard, queryHash, readRoots, readState, registryFile, resolveMaxLines, resolveSessions, resolveTtlSec, routeReferences, runGuards, saveState, scoreReferences, securityGuard, setStateField, solidReadGate, splitTarget, stateFileFor, stateFilePath, summarizeIndex, taskComplete, taskCreate, taskStart, throttleMs, toRefMeta, ttlLabel };
|
|
14
|
+
export { APEX_GATES, ASK_PATTERNS, ASK_WRITERS, ApexContext, ApexGate, ApexState, ApexTask, ApexTaskFile, AuthEntry, CODE_MUTATORS, CODE_REDIRECT, COLOR_THRESHOLDS, CRITICAL_PATTERNS, ColorFn, DEFAULT_MAX_LINES, DEFAULT_TTL_SEC, DEV_KEYWORDS, DocSatisfactionStatus, FileSizeVerdict, GIT_ASK, GIT_BLOCKED, GO_DECL_RE, GRADIENT_BLOCKS, GUARDS, Guard, GuardContext, HarnessId, HarnessInfo, HarnessMode, HarnessVia, IndexSummary, JAVA_DECL_RE, MAX_EXA_RESULTS, MAX_LINES_ENV_KEY, MAX_TOKENS, PHP_DECL_RE, PROGRESS_BAR_DEFAULTS, PROGRESS_CHARS, PROJECT_INSTALL, PROTECTED_FRAGMENTS, PY_MODEL_RE, Palette, PolicyContext, PolicyResult, ProgressBarOptions, ProjectLayout, ProjectType, Prompt, PromptKind, RefMeta, ReminderState, RouteResult, STATE_GITIGNORE, STATE_ROOT, SWIFT_PROTO_RE, SYSTEM_INSTALL, ScoredRef, TIME_INTERVALS, TS_DECL_RE, TTL_ENV_KEY, acquireLock, addRoot, apexStateDir, bashWriteGuard, brainstormGate, cacheLookup, cachePath, cacheStore, capVerbosity, colors, compactJson, compactMarkdown, countLines, detectCreationIntent, detectFramework, detectHarness, detectMode, detectProjectType, docConsultedGate, ensureMemoryGitignore, ensureStateDir, evaluate, evaluateApex, evaluateFileSize, extractText, formatBasename, formatCost, formatDocDeny, formatDocSatisfactionStatus, formatPath, formatPrompt, formatTimeLeft, formatTokens, freshnessGate, generateGradientBar, generateProgressBar, globToRe, incrementTrivialEditCounter, installGuard, interfaceSeparationGuard, isApexCommand, isCodeFile, isDocConsulted, jaccardSimilar, lessonsFileFor, loadIndex, loadRefs, loadState, matchPatterns, mcpCacheKey, modeFor, nowStamp, parseEnvInt, parseFrontmatter, progressiveColor, projectLayout, projectRoot, projectRootOrNull, protectedPathGuard, queryHash, readRoots, readState, registryFile, resolveMaxLines, resolveSessions, resolveTtlSec, routeReferences, runGuards, saveState, scoreReferences, securityGuard, setStateField, solidReadGate, splitTarget, stateFileFor, stateFilePath, summarizeIndex, taskComplete, taskCreate, taskStart, throttleMs, toRefMeta, ttlLabel };
|
package/dist/index.mjs
CHANGED
|
@@ -4,11 +4,11 @@ import { n as STATE_ROOT, r as projectLayout, t as STATE_GITIGNORE } from "./lay
|
|
|
4
4
|
import { t as compactJson } from "./compact-json-DK2nX-MK.mjs";
|
|
5
5
|
import { n as projectRoot, r as projectRootOrNull, t as isCodeFile } from "./project-root-ff0_poWU.mjs";
|
|
6
6
|
import { n as detectMode, r as modeFor, t as detectHarness } from "./harness-C8Nxxyn_.mjs";
|
|
7
|
-
import {
|
|
8
|
-
import { C as
|
|
7
|
+
import { n as detectProjectType, r as isApexCommand, t as DEV_KEYWORDS } from "./policy-EuVJ_5hS.mjs";
|
|
8
|
+
import { C as PROJECT_INSTALL, D as evaluateFileSize, E as countLines, O as detectFramework, S as GIT_BLOCKED, T as matchPatterns, _ as protectedPathGuard, a as GO_DECL_RE, b as securityGuard, c as PY_MODEL_RE, d as interfaceSeparationGuard, f as ASK_WRITERS, g as PROTECTED_FRAGMENTS, h as bashWriteGuard, i as installGuard, l as SWIFT_PROTO_RE, m as CODE_REDIRECT, n as GUARDS, o as JAVA_DECL_RE, p as CODE_MUTATORS, r as runGuards, s as PHP_DECL_RE, t as evaluate, u as TS_DECL_RE, v as ASK_PATTERNS, w as SYSTEM_INSTALL, x as GIT_ASK, y as CRITICAL_PATTERNS } from "./evaluate-BmPDUtND.mjs";
|
|
9
9
|
import { i as resolveSessions, n as formatDocSatisfactionStatus, r as isDocConsulted, t as formatDocDeny } from "./doc-helpers-Dd_x1-tZ.mjs";
|
|
10
10
|
import { i as parseFrontmatter, n as scoreReferences, r as globToRe, t as routeReferences } from "./router-Dj3AfgBE.mjs";
|
|
11
|
-
import { a as
|
|
11
|
+
import { a as APEX_GATES, c as evaluateApex, i as detectCreationIntent, l as freshnessGate, n as MAX_TOKENS, o as brainstormGate, r as capVerbosity, s as docConsultedGate, t as MAX_EXA_RESULTS, u as solidReadGate } from "./verbosity-D82yP4WD.mjs";
|
|
12
12
|
import { t as formatPrompt } from "./types-ernB1Dy3.mjs";
|
|
13
13
|
import { a as nowStamp, c as stateFileFor, i as lessonsFileFor, l as throttleMs, n as readRoots, o as readState, r as registryFile, s as setStateField, t as addRoot, u as ensureMemoryGitignore } from "./memory-BkoEbdec.mjs";
|
|
14
14
|
import { a as queryHash, i as jaccardSimilar, n as summarizeIndex, r as compactMarkdown, t as loadIndex } from "./cache-BzbX-ztL.mjs";
|
|
@@ -17,4 +17,4 @@ import { t as incrementTrivialEditCounter } from "./freshness-CezohJHo.mjs";
|
|
|
17
17
|
import { n as toRefMeta, t as loadRefs } from "./loader-BephwI8n.mjs";
|
|
18
18
|
import { a as ensureStateDir, c as stateFilePath, i as apexStateDir, l as acquireLock, n as taskCreate, o as loadState, r as taskStart, s as saveState, t as taskComplete } from "./state-Cs0Y0MG_.mjs";
|
|
19
19
|
import { a as formatPath, c as colors, d as GRADIENT_BLOCKS, f as PROGRESS_BAR_DEFAULTS, i as formatCost, l as progressiveColor, m as TIME_INTERVALS, n as generateProgressBar, o as formatTimeLeft, p as PROGRESS_CHARS, r as formatBasename, s as formatTokens, t as generateGradientBar, u as COLOR_THRESHOLDS } from "./statusline-D87eUNXl.mjs";
|
|
20
|
-
export { APEX_GATES, ASK_PATTERNS, ASK_WRITERS, CODE_MUTATORS, CODE_REDIRECT, COLOR_THRESHOLDS, CRITICAL_PATTERNS, DEFAULT_MAX_LINES, DEFAULT_TTL_SEC, DEV_KEYWORDS, GIT_ASK, GIT_BLOCKED, GRADIENT_BLOCKS, GUARDS, MAX_EXA_RESULTS, MAX_LINES_ENV_KEY, PHP_DECL_RE, PROGRESS_BAR_DEFAULTS, PROGRESS_CHARS, PROJECT_INSTALL, PROTECTED_FRAGMENTS, PY_MODEL_RE, STATE_GITIGNORE, STATE_ROOT, SWIFT_PROTO_RE, SYSTEM_INSTALL, TIME_INTERVALS, TS_DECL_RE, TTL_ENV_KEY, acquireLock, addRoot, apexStateDir, bashWriteGuard, brainstormGate, cacheLookup, cachePath, cacheStore, capVerbosity, colors, compactJson, compactMarkdown, countLines, detectCreationIntent, detectFramework, detectHarness, detectMode, detectProjectType, docConsultedGate, ensureMemoryGitignore, ensureStateDir, evaluate, evaluateApex, evaluateFileSize, extractText, formatBasename, formatCost, formatDocDeny, formatDocSatisfactionStatus, formatPath, formatPrompt, formatTimeLeft, formatTokens, freshnessGate, generateGradientBar, generateProgressBar, globToRe, incrementTrivialEditCounter, installGuard, interfaceSeparationGuard, isApexCommand, isCodeFile, isDocConsulted, jaccardSimilar, lessonsFileFor, loadIndex, loadRefs, loadState, matchPatterns, mcpCacheKey, modeFor, nowStamp, parseEnvInt, parseFrontmatter, progressiveColor, projectLayout, projectRoot, projectRootOrNull, protectedPathGuard, queryHash, readRoots, readState, registryFile, resolveMaxLines, resolveSessions, resolveTtlSec, routeReferences, runGuards, saveState, scoreReferences, securityGuard, setStateField, solidReadGate, splitTarget, stateFileFor, stateFilePath, summarizeIndex, taskComplete, taskCreate, taskStart, throttleMs, toRefMeta, ttlLabel };
|
|
20
|
+
export { APEX_GATES, ASK_PATTERNS, ASK_WRITERS, CODE_MUTATORS, CODE_REDIRECT, COLOR_THRESHOLDS, CRITICAL_PATTERNS, DEFAULT_MAX_LINES, DEFAULT_TTL_SEC, DEV_KEYWORDS, GIT_ASK, GIT_BLOCKED, GO_DECL_RE, GRADIENT_BLOCKS, GUARDS, JAVA_DECL_RE, MAX_EXA_RESULTS, MAX_LINES_ENV_KEY, MAX_TOKENS, PHP_DECL_RE, PROGRESS_BAR_DEFAULTS, PROGRESS_CHARS, PROJECT_INSTALL, PROTECTED_FRAGMENTS, PY_MODEL_RE, STATE_GITIGNORE, STATE_ROOT, SWIFT_PROTO_RE, SYSTEM_INSTALL, TIME_INTERVALS, TS_DECL_RE, TTL_ENV_KEY, acquireLock, addRoot, apexStateDir, bashWriteGuard, brainstormGate, cacheLookup, cachePath, cacheStore, capVerbosity, colors, compactJson, compactMarkdown, countLines, detectCreationIntent, detectFramework, detectHarness, detectMode, detectProjectType, docConsultedGate, ensureMemoryGitignore, ensureStateDir, evaluate, evaluateApex, evaluateFileSize, extractText, formatBasename, formatCost, formatDocDeny, formatDocSatisfactionStatus, formatPath, formatPrompt, formatTimeLeft, formatTokens, freshnessGate, generateGradientBar, generateProgressBar, globToRe, incrementTrivialEditCounter, installGuard, interfaceSeparationGuard, isApexCommand, isCodeFile, isDocConsulted, jaccardSimilar, lessonsFileFor, loadIndex, loadRefs, loadState, matchPatterns, mcpCacheKey, modeFor, nowStamp, parseEnvInt, parseFrontmatter, progressiveColor, projectLayout, projectRoot, projectRootOrNull, protectedPathGuard, queryHash, readRoots, readState, registryFile, resolveMaxLines, resolveSessions, resolveTtlSec, routeReferences, runGuards, saveState, scoreReferences, securityGuard, setStateField, solidReadGate, splitTarget, stateFileFor, stateFilePath, summarizeIndex, taskComplete, taskCreate, taskStart, throttleMs, toRefMeta, ttlLabel };
|
package/dist/policy/index.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as
|
|
2
|
-
export { APEX_GATES, ASK_PATTERNS, ASK_WRITERS, ApexContext, ApexGate, CODE_MUTATORS, CODE_REDIRECT, CRITICAL_PATTERNS, DEV_KEYWORDS, FileSizeVerdict, GIT_ASK, GIT_BLOCKED, GUARDS, Guard, GuardContext, MAX_EXA_RESULTS, PHP_DECL_RE, PROJECT_INSTALL, PROTECTED_FRAGMENTS, PY_MODEL_RE, PolicyContext, PolicyResult, ProjectType, SWIFT_PROTO_RE, SYSTEM_INSTALL, TS_DECL_RE, bashWriteGuard, brainstormGate, capVerbosity, countLines, detectCreationIntent, detectFramework, detectProjectType, docConsultedGate, evaluate, evaluateApex, evaluateFileSize, freshnessGate, installGuard, interfaceSeparationGuard, isApexCommand, matchPatterns, protectedPathGuard, runGuards, securityGuard, solidReadGate };
|
|
1
|
+
import { A as docConsultedGate, B as SYSTEM_INSTALL, C as securityGuard, D as ApexContext, E as APEX_GATES, F as PolicyResult, G as detectFramework, H as FileSizeVerdict, I as evaluate, J as detectProjectType, K as DEV_KEYWORDS, L as GIT_ASK, M as freshnessGate, N as solidReadGate, O as ApexGate, P as PolicyContext, R as GIT_BLOCKED, S as CRITICAL_PATTERNS, T as GuardContext, U as countLines, V as matchPatterns, W as evaluateFileSize, Y as isApexCommand, _ as CODE_REDIRECT, a as GUARDS, b as protectedPathGuard, c as GO_DECL_RE, d as PY_MODEL_RE, f as SWIFT_PROTO_RE, g as CODE_MUTATORS, h as ASK_WRITERS, i as detectCreationIntent, j as evaluateApex, k as brainstormGate, l as JAVA_DECL_RE, m as interfaceSeparationGuard, n as MAX_TOKENS, o as runGuards, p as TS_DECL_RE, q as ProjectType, r as capVerbosity, s as installGuard, t as MAX_EXA_RESULTS, u as PHP_DECL_RE, v as bashWriteGuard, w as Guard, x as ASK_PATTERNS, y as PROTECTED_FRAGMENTS, z as PROJECT_INSTALL } from "../index-Dz55GnvV.mjs";
|
|
2
|
+
export { APEX_GATES, ASK_PATTERNS, ASK_WRITERS, ApexContext, ApexGate, CODE_MUTATORS, CODE_REDIRECT, CRITICAL_PATTERNS, DEV_KEYWORDS, FileSizeVerdict, GIT_ASK, GIT_BLOCKED, GO_DECL_RE, GUARDS, Guard, GuardContext, JAVA_DECL_RE, MAX_EXA_RESULTS, MAX_TOKENS, PHP_DECL_RE, PROJECT_INSTALL, PROTECTED_FRAGMENTS, PY_MODEL_RE, PolicyContext, PolicyResult, ProjectType, SWIFT_PROTO_RE, SYSTEM_INSTALL, TS_DECL_RE, bashWriteGuard, brainstormGate, capVerbosity, countLines, detectCreationIntent, detectFramework, detectProjectType, docConsultedGate, evaluate, evaluateApex, evaluateFileSize, freshnessGate, installGuard, interfaceSeparationGuard, isApexCommand, matchPatterns, protectedPathGuard, runGuards, securityGuard, solidReadGate };
|
package/dist/policy/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { C as
|
|
3
|
-
import { a as
|
|
4
|
-
export { APEX_GATES, ASK_PATTERNS, ASK_WRITERS, CODE_MUTATORS, CODE_REDIRECT, CRITICAL_PATTERNS, DEV_KEYWORDS, GIT_ASK, GIT_BLOCKED, GUARDS, MAX_EXA_RESULTS, PHP_DECL_RE, PROJECT_INSTALL, PROTECTED_FRAGMENTS, PY_MODEL_RE, SWIFT_PROTO_RE, SYSTEM_INSTALL, TS_DECL_RE, bashWriteGuard, brainstormGate, capVerbosity, countLines, detectCreationIntent, detectFramework, detectProjectType, docConsultedGate, evaluate, evaluateApex, evaluateFileSize, freshnessGate, installGuard, interfaceSeparationGuard, isApexCommand, matchPatterns, protectedPathGuard, runGuards, securityGuard, solidReadGate };
|
|
1
|
+
import { n as detectProjectType, r as isApexCommand, t as DEV_KEYWORDS } from "../policy-EuVJ_5hS.mjs";
|
|
2
|
+
import { C as PROJECT_INSTALL, D as evaluateFileSize, E as countLines, O as detectFramework, S as GIT_BLOCKED, T as matchPatterns, _ as protectedPathGuard, a as GO_DECL_RE, b as securityGuard, c as PY_MODEL_RE, d as interfaceSeparationGuard, f as ASK_WRITERS, g as PROTECTED_FRAGMENTS, h as bashWriteGuard, i as installGuard, l as SWIFT_PROTO_RE, m as CODE_REDIRECT, n as GUARDS, o as JAVA_DECL_RE, p as CODE_MUTATORS, r as runGuards, s as PHP_DECL_RE, t as evaluate, u as TS_DECL_RE, v as ASK_PATTERNS, w as SYSTEM_INSTALL, x as GIT_ASK, y as CRITICAL_PATTERNS } from "../evaluate-BmPDUtND.mjs";
|
|
3
|
+
import { a as APEX_GATES, c as evaluateApex, i as detectCreationIntent, l as freshnessGate, n as MAX_TOKENS, o as brainstormGate, r as capVerbosity, s as docConsultedGate, t as MAX_EXA_RESULTS, u as solidReadGate } from "../verbosity-D82yP4WD.mjs";
|
|
4
|
+
export { APEX_GATES, ASK_PATTERNS, ASK_WRITERS, CODE_MUTATORS, CODE_REDIRECT, CRITICAL_PATTERNS, DEV_KEYWORDS, GIT_ASK, GIT_BLOCKED, GO_DECL_RE, GUARDS, JAVA_DECL_RE, MAX_EXA_RESULTS, MAX_TOKENS, PHP_DECL_RE, PROJECT_INSTALL, PROTECTED_FRAGMENTS, PY_MODEL_RE, SWIFT_PROTO_RE, SYSTEM_INSTALL, TS_DECL_RE, bashWriteGuard, brainstormGate, capVerbosity, countLines, detectCreationIntent, detectFramework, detectProjectType, docConsultedGate, evaluate, evaluateApex, evaluateFileSize, freshnessGate, installGuard, interfaceSeparationGuard, isApexCommand, matchPatterns, protectedPathGuard, runGuards, securityGuard, solidReadGate };
|
|
@@ -30,16 +30,4 @@ function detectProjectType(dir) {
|
|
|
30
30
|
return "generic";
|
|
31
31
|
}
|
|
32
32
|
//#endregion
|
|
33
|
-
|
|
34
|
-
const CREATE_RE = /\b(?:create|implement|add|build|new|feature|component|generate|make|develop|scaffold)\b/i;
|
|
35
|
-
const SKIP_RE = /\b(?:fix|bug|debug|update|refactor|rename|move|delete|remove|commit|push|edit|modify|change)\b/i;
|
|
36
|
-
/**
|
|
37
|
-
* True when a prompt expresses creation intent (a new feature/component) and is
|
|
38
|
-
* not a fix/refactor — the signal that brainstorming should precede creation.
|
|
39
|
-
* The harness calls this on UserPromptSubmit, then `recordBrainstormRequired`.
|
|
40
|
-
*/
|
|
41
|
-
function detectCreationIntent(prompt) {
|
|
42
|
-
return CREATE_RE.test(prompt) && !SKIP_RE.test(prompt);
|
|
43
|
-
}
|
|
44
|
-
//#endregion
|
|
45
|
-
export { isApexCommand as i, DEV_KEYWORDS as n, detectProjectType as r, detectCreationIntent as t };
|
|
33
|
+
export { detectProjectType as n, isApexCommand as r, DEV_KEYWORDS as t };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as isCodeFile } from "./project-root-ff0_poWU.mjs";
|
|
2
|
-
import { t as evaluate } from "./evaluate-
|
|
2
|
+
import { t as evaluate } from "./evaluate-BmPDUtND.mjs";
|
|
3
3
|
import { t as formatPrompt } from "./types-ernB1Dy3.mjs";
|
|
4
4
|
import { execSync } from "node:child_process";
|
|
5
5
|
//#region src/cli/run.ts
|
package/dist/runtime/index.d.mts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { t as Prompt } from "../types-D56jSgD9.mjs";
|
|
2
2
|
import { t as RefMeta } from "../types-CY5qT2X1.mjs";
|
|
3
|
+
import { t as AgentQuality } from "../session-state-DxNkIBZ2.mjs";
|
|
3
4
|
|
|
4
5
|
//#region src/runtime/paths.d.ts
|
|
5
6
|
/** Path to a session's track file (under a per-tool base dir). */
|
|
@@ -18,6 +19,7 @@ type Activity = {
|
|
|
18
19
|
kind: "agent";
|
|
19
20
|
name: string;
|
|
20
21
|
ts: number;
|
|
22
|
+
quality?: AgentQuality;
|
|
21
23
|
} | {
|
|
22
24
|
kind: "doc";
|
|
23
25
|
framework: string;
|
|
@@ -39,6 +41,8 @@ interface ToolEvent {
|
|
|
39
41
|
sessionId: string;
|
|
40
42
|
framework: string;
|
|
41
43
|
now: number;
|
|
44
|
+
/** Length of the tool response (POST events) — drives agent `quality`. */
|
|
45
|
+
responseLength?: number;
|
|
42
46
|
}
|
|
43
47
|
/**
|
|
44
48
|
* Map a live tool-use to the activity to record, or null when nothing is
|
package/dist/runtime/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as projectLayout } from "../layout-C0jaaCQC.mjs";
|
|
2
|
-
import { a as normalizeEvent, c as mcpPostStore, d as DEFAULT_WINDOW_MS, f as REQUIRED_AGENTS, h as activityFor, i as trackFile, l as mcpPreIntercept, m as gate, n as respond, o as MCP_TTL_MS, p as TRIVIAL_BUDGET, r as recordActivity, s as isMcpTool, t as handleHook, u as queryOf } from "../handle-
|
|
2
|
+
import { a as normalizeEvent, c as mcpPostStore, d as DEFAULT_WINDOW_MS, f as REQUIRED_AGENTS, h as activityFor, i as trackFile, l as mcpPreIntercept, m as gate, n as respond, o as MCP_TTL_MS, p as TRIVIAL_BUDGET, r as recordActivity, s as isMcpTool, t as handleHook, u as queryOf } from "../handle-BycRtJ0S.mjs";
|
|
3
3
|
//#region src/runtime/storage.ts
|
|
4
4
|
/**
|
|
5
5
|
* The project's single state dir (`<root>/.harness`) — neutral + harness-agnostic,
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { t as AuthEntry } from "./doc-helpers-CG1nuf-c.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/tracking/session-state.d.ts
|
|
4
|
+
/** Quality of a recorded agent call (the freshness gate ignores insufficient ones). */
|
|
5
|
+
type AgentQuality = "sufficient" | "insufficient";
|
|
6
|
+
/** Recorded session activity that feeds the APEX gates. */
|
|
7
|
+
interface SessionTrack {
|
|
8
|
+
authorizations: Record<string, AuthEntry>;
|
|
9
|
+
refsRead: string[];
|
|
10
|
+
agents: {
|
|
11
|
+
name: string;
|
|
12
|
+
ts: number;
|
|
13
|
+
quality?: AgentQuality;
|
|
14
|
+
}[];
|
|
15
|
+
trivialEdits: number[];
|
|
16
|
+
brainstormRequired?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** A fresh, empty track. */
|
|
19
|
+
declare function emptyTrack(): SessionTrack;
|
|
20
|
+
/** Record a doc consultation (Context7/Exa) for a framework in this session. Immutable. */
|
|
21
|
+
declare function recordDoc(track: SessionTrack, framework: string, sessionId: string, source: string): SessionTrack;
|
|
22
|
+
/** Record that a SOLID reference file was read (deduped). Immutable. */
|
|
23
|
+
declare function recordRefRead(track: SessionTrack, path: string): SessionTrack;
|
|
24
|
+
/** Record an agent/tool call with a timestamp + optional quality. Immutable. */
|
|
25
|
+
declare function recordAgent(track: SessionTrack, name: string, ts: number, quality?: AgentQuality): SessionTrack;
|
|
26
|
+
/** True when ALL of `names` ran within `windowMs` with non-insufficient quality. */
|
|
27
|
+
declare function agentsFresh(track: SessionTrack, names: string[], windowMs: number, now: number): boolean;
|
|
28
|
+
/** Record a trivial edit timestamp (sliding window; old evicted). Immutable. */
|
|
29
|
+
declare function recordTrivialEdit(track: SessionTrack, ts: number, windowMs: number, now: number): SessionTrack;
|
|
30
|
+
/** Count trivial edits within the sliding window. */
|
|
31
|
+
declare function trivialCount(track: SessionTrack, windowMs: number, now: number): number;
|
|
32
|
+
/** Set the brainstorm-required flag (from creation-intent detection). Immutable. */
|
|
33
|
+
declare function recordBrainstormRequired(track: SessionTrack, required: boolean): SessionTrack;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { recordAgent as a, recordRefRead as c, emptyTrack as i, recordTrivialEdit as l, SessionTrack as n, recordBrainstormRequired as o, agentsFresh as r, recordDoc as s, AgentQuality as t, trivialCount as u };
|
|
@@ -1,37 +1,5 @@
|
|
|
1
|
-
import { t as
|
|
1
|
+
import { a as recordAgent, c as recordRefRead, i as emptyTrack, l as recordTrivialEdit, n as SessionTrack, o as recordBrainstormRequired, r as agentsFresh, s as recordDoc, t as AgentQuality, u as trivialCount } from "../session-state-DxNkIBZ2.mjs";
|
|
2
2
|
|
|
3
|
-
//#region src/tracking/session-state.d.ts
|
|
4
|
-
/** Quality of a recorded agent call (the freshness gate ignores insufficient ones). */
|
|
5
|
-
type AgentQuality = "sufficient" | "insufficient";
|
|
6
|
-
/** Recorded session activity that feeds the APEX gates. */
|
|
7
|
-
interface SessionTrack {
|
|
8
|
-
authorizations: Record<string, AuthEntry>;
|
|
9
|
-
refsRead: string[];
|
|
10
|
-
agents: {
|
|
11
|
-
name: string;
|
|
12
|
-
ts: number;
|
|
13
|
-
quality?: AgentQuality;
|
|
14
|
-
}[];
|
|
15
|
-
trivialEdits: number[];
|
|
16
|
-
brainstormRequired?: boolean;
|
|
17
|
-
}
|
|
18
|
-
/** A fresh, empty track. */
|
|
19
|
-
declare function emptyTrack(): SessionTrack;
|
|
20
|
-
/** Record a doc consultation (Context7/Exa) for a framework in this session. Immutable. */
|
|
21
|
-
declare function recordDoc(track: SessionTrack, framework: string, sessionId: string, source: string): SessionTrack;
|
|
22
|
-
/** Record that a SOLID reference file was read (deduped). Immutable. */
|
|
23
|
-
declare function recordRefRead(track: SessionTrack, path: string): SessionTrack;
|
|
24
|
-
/** Record an agent/tool call with a timestamp + optional quality. Immutable. */
|
|
25
|
-
declare function recordAgent(track: SessionTrack, name: string, ts: number, quality?: AgentQuality): SessionTrack;
|
|
26
|
-
/** True when ALL of `names` ran within `windowMs` with non-insufficient quality. */
|
|
27
|
-
declare function agentsFresh(track: SessionTrack, names: string[], windowMs: number, now: number): boolean;
|
|
28
|
-
/** Record a trivial edit timestamp (sliding window; old evicted). Immutable. */
|
|
29
|
-
declare function recordTrivialEdit(track: SessionTrack, ts: number, windowMs: number, now: number): SessionTrack;
|
|
30
|
-
/** Count trivial edits within the sliding window. */
|
|
31
|
-
declare function trivialCount(track: SessionTrack, windowMs: number, now: number): number;
|
|
32
|
-
/** Set the brainstorm-required flag (from creation-intent detection). Immutable. */
|
|
33
|
-
declare function recordBrainstormRequired(track: SessionTrack, required: boolean): SessionTrack;
|
|
34
|
-
//#endregion
|
|
35
3
|
//#region src/tracking/store.d.ts
|
|
36
4
|
/** Load a session track from a file (an empty track if absent/corrupt). */
|
|
37
5
|
declare function loadTrack(file: string): Promise<SessionTrack>;
|
|
@@ -52,23 +52,47 @@ function evaluateApex(ctx, gates = APEX_GATES) {
|
|
|
52
52
|
return gates.reduce((hit, gate) => hit ?? gate(ctx), null);
|
|
53
53
|
}
|
|
54
54
|
//#endregion
|
|
55
|
+
//#region src/policy/creation-intent.ts
|
|
56
|
+
const CREATE_RE = /\b(?:create|implement|add|build|new|feature|component|generate|make|develop|scaffold)\b/i;
|
|
57
|
+
const SKIP_RE = /\b(?:fix|bug|debug|update|refactor|rename|move|delete|remove|commit|push|edit|modify|change)\b/i;
|
|
58
|
+
/**
|
|
59
|
+
* True when a prompt expresses creation intent (a new feature/component) and is
|
|
60
|
+
* not a fix/refactor — the signal that brainstorming should precede creation.
|
|
61
|
+
* The harness calls this on UserPromptSubmit, then `recordBrainstormRequired`.
|
|
62
|
+
*/
|
|
63
|
+
function detectCreationIntent(prompt) {
|
|
64
|
+
return CREATE_RE.test(prompt) && !SKIP_RE.test(prompt);
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
55
67
|
//#region src/policy/verbosity.ts
|
|
56
|
-
/** Exa MCP tools whose result count
|
|
68
|
+
/** Exa MCP tools whose result count + token budget are capped. */
|
|
57
69
|
const EXA_TOOLS = /exa__web_search|exa__get_code_context|exa_web_search|exa_get_code_context/i;
|
|
70
|
+
/** Context7 doc tool whose token budget is capped. */
|
|
71
|
+
const CONTEXT7_TOOLS = /context7__query-docs|context7_query-docs|query-docs/i;
|
|
58
72
|
/** Max results an exa MCP call may request. */
|
|
59
73
|
const MAX_EXA_RESULTS = 3;
|
|
74
|
+
/** Max token budget for exa `tokensNum` / context7 `tokens`. */
|
|
75
|
+
const MAX_TOKENS = 2e3;
|
|
60
76
|
/**
|
|
61
|
-
* Cap an
|
|
62
|
-
*
|
|
77
|
+
* Cap an MCP call's verbosity — exa `numResults` ≤ 3 (+ `tokensNum` ≤ 2000),
|
|
78
|
+
* Context7 `tokens` ≤ 2000. Returns the capped input (a mutation for the harness
|
|
79
|
+
* to apply) when a change is needed, else null.
|
|
63
80
|
*/
|
|
64
81
|
function capVerbosity(tool, input) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
82
|
+
const out = { ...input };
|
|
83
|
+
let changed = false;
|
|
84
|
+
const cap = (key, max, force) => {
|
|
85
|
+
const v = out[key];
|
|
86
|
+
if (typeof v === "number" && v > max || force && typeof v !== "number") {
|
|
87
|
+
out[key] = max;
|
|
88
|
+
changed = true;
|
|
89
|
+
}
|
|
71
90
|
};
|
|
91
|
+
if (EXA_TOOLS.test(tool)) {
|
|
92
|
+
cap("numResults", 3, true);
|
|
93
|
+
cap("tokensNum", MAX_TOKENS, false);
|
|
94
|
+
} else if (CONTEXT7_TOOLS.test(tool)) cap("tokens", MAX_TOKENS, false);
|
|
95
|
+
return changed ? out : null;
|
|
72
96
|
}
|
|
73
97
|
//#endregion
|
|
74
|
-
export {
|
|
98
|
+
export { APEX_GATES as a, evaluateApex as c, detectCreationIntent as i, freshnessGate as l, MAX_TOKENS as n, brainstormGate as o, capVerbosity as r, docConsultedGate as s, MAX_EXA_RESULTS as t, solidReadGate as u };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fusengine/harness",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.17",
|
|
4
4
|
"description": "Harness-agnostic toolkit for AI coding agents: runtime harness detection (Claude Code, Codex, Cursor, Cline, Gemini, Aider...), pure policy core (env config, project/framework detection, SOLID/file-size limits, APEX freshness, guard patterns, portable prompts), cache, project memory, ref routing, state/locks, statusline, per-harness adapters (Claude/Cursor/Cline/Gemini) and a cli-mode harness-check binary. Bun-native, with a built dist for Node + bundlers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "src/index.ts",
|