@fusengine/harness 0.1.14 → 0.1.16

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.
@@ -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-BoZuNxXl.mjs";
1
+ import { a as readClaudeInput, i as guard, n as denyResponse, o as toClaudeResponse, r as fileSizeGuard, t as contextResponse } from "../../claude-0DB5pb4d.mjs";
2
2
  export { contextResponse, denyResponse, fileSizeGuard, guard, readClaudeInput, toClaudeResponse };
@@ -1,4 +1,4 @@
1
- import { t as evaluate } from "../../evaluate-qGG2Ul0W.mjs";
1
+ import { t as evaluate } from "../../evaluate-urGmc24B.mjs";
2
2
  import { t as formatPrompt } from "../../types-ernB1Dy3.mjs";
3
3
  //#region src/adapters/cline/index.ts
4
4
  /**
@@ -1,2 +1,2 @@
1
- import { a as readClaudeInput, i as guard, n as denyResponse, t as contextResponse } from "../../claude-BoZuNxXl.mjs";
1
+ import { a as readClaudeInput, i as guard, n as denyResponse, t as contextResponse } from "../../claude-0DB5pb4d.mjs";
2
2
  export { contextResponse, denyResponse, guard, readClaudeInput as readCodexInput };
@@ -1,4 +1,4 @@
1
- import { t as evaluate } from "../../evaluate-qGG2Ul0W.mjs";
1
+ import { t as evaluate } from "../../evaluate-urGmc24B.mjs";
2
2
  import { t as formatPrompt } from "../../types-ernB1Dy3.mjs";
3
3
  //#region src/adapters/cursor/index.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { t as evaluate } from "../../evaluate-qGG2Ul0W.mjs";
1
+ import { t as evaluate } from "../../evaluate-urGmc24B.mjs";
2
2
  import { t as formatPrompt } from "../../types-ernB1Dy3.mjs";
3
3
  //#region src/adapters/gemini/index.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { t as evaluate } from "./evaluate-qGG2Ul0W.mjs";
1
+ import { t as evaluate } from "./evaluate-urGmc24B.mjs";
2
2
  import { t as formatPrompt } from "./types-ernB1Dy3.mjs";
3
3
  //#region src/adapters/claude/index.ts
4
4
  /**
package/dist/cli/bin.mjs CHANGED
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
+ import { r as resolveTtlSec } from "../ttl-BG55s6HZ.mjs";
2
3
  import { t as detectHarness } from "../harness-C8Nxxyn_.mjs";
3
- import { n as stagedContent, r as stagedFiles, t as checkStaged } from "../run-B-_9dPR6.mjs";
4
+ import { n as stagedContent, r as stagedFiles, t as checkStaged } from "../run-CsWHdBJp.mjs";
4
5
  import { n as writeInitFile, t as initFor } from "../run-D91N4ul1.mjs";
5
- import { t as handleHook } from "../handle-D-DClzB2.mjs";
6
+ import { t as handleHook } from "../handle-Sq-byRft.mjs";
6
7
  //#region src/cli/bin.ts
7
8
  /**
8
9
  * harness — CLI for @fusengine/harness.
@@ -27,7 +28,8 @@ if (cmd === "hook") {
27
28
  const outcome = await handleHook(process.argv[3] ?? detectHarness().id, await readStdin(), {
28
29
  now: Date.now(),
29
30
  cwd: process.cwd(),
30
- refsDir: process.env.FUSE_HARNESS_REFS
31
+ refsDir: process.env.FUSE_HARNESS_REFS,
32
+ windowMs: resolveTtlSec(process.env) * 1e3
31
33
  });
32
34
  if (outcome.stdout) process.stdout.write(outcome.stdout);
33
35
  process.exit(outcome.exit);
@@ -1,2 +1,2 @@
1
- import { n as stagedContent, r as stagedFiles, t as checkStaged } from "../run-B-_9dPR6.mjs";
1
+ import { n as stagedContent, r as stagedFiles, t as checkStaged } from "../run-CsWHdBJp.mjs";
2
2
  export { checkStaged, stagedContent, stagedFiles };
@@ -1,4 +1,5 @@
1
1
  import { a as parseEnvInt, i as splitTarget, n as MAX_LINES_ENV_KEY, r as resolveMaxLines, t as DEFAULT_MAX_LINES } from "../limits-CHn8AIL1.mjs";
2
- import { i as ttlLabel, n as TTL_ENV_KEY, r as resolveTtlSec, t as DEFAULT_TTL_SEC } from "../config-BG55s6HZ.mjs";
2
+ import { i as ttlLabel, n as TTL_ENV_KEY, r as resolveTtlSec, t as DEFAULT_TTL_SEC } from "../ttl-BG55s6HZ.mjs";
3
3
  import { n as STATE_ROOT, r as projectLayout, t as STATE_GITIGNORE } from "../layout-C0jaaCQC.mjs";
4
+ import "../config-la_KkjCS.mjs";
4
5
  export { DEFAULT_MAX_LINES, DEFAULT_TTL_SEC, MAX_LINES_ENV_KEY, STATE_GITIGNORE, STATE_ROOT, TTL_ENV_KEY, parseEnvInt, projectLayout, resolveMaxLines, resolveTtlSec, splitTarget, ttlLabel };
@@ -0,0 +1 @@
1
+ export {};
@@ -82,7 +82,9 @@ const SYSTEM_INSTALL = [
82
82
  /brew upgrade/,
83
83
  /brew cask/,
84
84
  /apt install/,
85
- /apt-get install/
85
+ /apt-get install/,
86
+ /dnf install/,
87
+ /pacman -S/
86
88
  ];
87
89
  /** Project-level package installs. */
88
90
  const PROJECT_INSTALL = [
@@ -228,18 +230,13 @@ function interfaceSeparationGuard(ctx) {
228
230
  }
229
231
  //#endregion
230
232
  //#region src/policy/guards/install.ts
231
- /** Project-level dependency installs (npm/yarn/pnpm/bun/pip/cargo/go/gem/composer). */
232
- const PROJECT_INSTALL_RE = /\b(?:npm\s+(?:install|i)|(?:yarn|pnpm|bun)\s+add|pip3?\s+install|cargo\s+install|go\s+install|gem\s+install|composer\s+require)\b/;
233
- /** System-level package installs (brew/apt/apt-get/dnf/pacman). */
234
- const SYSTEM_INSTALL_RE = /\b(?:brew\s+install|apt(?:-get)?\s+install|dnf\s+install|pacman\s+-S)\b/;
235
233
  /** Asks for confirmation before a dependency or system package install. */
236
234
  function installGuard(ctx) {
237
235
  if (ctx.tool !== "Bash" || !ctx.command) return null;
238
- const cmd = ctx.command;
239
- if (PROJECT_INSTALL_RE.test(cmd) || SYSTEM_INSTALL_RE.test(cmd)) return {
236
+ if (matchPatterns(ctx.command, PROJECT_INSTALL) || matchPatterns(ctx.command, SYSTEM_INSTALL)) return {
240
237
  kind: "ask",
241
238
  title: "Dependency install",
242
- reason: `This command installs packages: ${cmd.trim()}`,
239
+ reason: `This command installs packages: ${ctx.command.trim()}`,
243
240
  actions: ["Confirm this install is intended"]
244
241
  };
245
242
  return null;
@@ -289,6 +286,16 @@ function evaluate(ctx) {
289
286
  }
290
287
  };
291
288
  }
289
+ if (ctx.command && matchPatterns(ctx.command, GIT_ASK)) return {
290
+ decision: "deny",
291
+ message: `Git operation requires confirmation: ${ctx.command}`,
292
+ prompt: {
293
+ kind: "ask",
294
+ title: "Confirm git operation",
295
+ reason: `Authorize: ${ctx.command.trim()}`,
296
+ actions: ["Approve if this git operation is intended"]
297
+ }
298
+ };
292
299
  if (ctx.filePath && isCodeFile(ctx.filePath) && ctx.content !== void 0) {
293
300
  const verdict = evaluateFileSize(countLines(ctx.content), ctx.maxLines);
294
301
  if (!verdict.ok) return {
@@ -313,4 +320,4 @@ function evaluate(ctx) {
313
320
  };
314
321
  }
315
322
  //#endregion
316
- export { PROJECT_INSTALL as C, evaluateFileSize as D, countLines as E, detectFramework as O, GIT_BLOCKED as S, matchPatterns as T, protectedPathGuard as _, SYSTEM_INSTALL_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, PROJECT_INSTALL_RE as i, SWIFT_PROTO_RE as l, CODE_REDIRECT as m, GUARDS as n, installGuard 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 };
323
+ export { matchPatterns as C, detectFramework as E, SYSTEM_INSTALL as S, evaluateFileSize as T, CRITICAL_PATTERNS as _, PHP_DECL_RE as a, GIT_BLOCKED as b, TS_DECL_RE as c, CODE_MUTATORS as d, CODE_REDIRECT as f, ASK_PATTERNS as g, protectedPathGuard as h, installGuard as i, interfaceSeparationGuard as l, PROTECTED_FRAGMENTS as m, GUARDS as n, PY_MODEL_RE as o, bashWriteGuard as p, runGuards as r, SWIFT_PROTO_RE as s, evaluate as t, ASK_WRITERS as u, securityGuard as v, countLines as w, PROJECT_INSTALL as x, GIT_ASK as y };
@@ -1,13 +1,15 @@
1
1
  import { r as projectLayout } from "./layout-C0jaaCQC.mjs";
2
- import { O as detectFramework, t as evaluate } from "./evaluate-qGG2Ul0W.mjs";
3
- import { n as capVerbosity, o as evaluateApex } from "./verbosity-ZYT7tLCw.mjs";
2
+ import { E as detectFramework, t as evaluate } from "./evaluate-urGmc24B.mjs";
3
+ import { n as capVerbosity, r as detectCreationIntent, s as evaluateApex } from "./verbosity-BqM4C7_V.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
- return name ? {
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
- } : null;
46
+ };
38
47
  }
39
48
  if (READ_TOOLS.has(event.tool)) {
40
49
  const path = String(event.input?.file_path ?? event.input?.path ?? "");
@@ -49,8 +58,8 @@ function activityFor(event) {
49
58
  //#region src/runtime/gate.ts
50
59
  /** Prior agents the freshness gate requires before a code edit. */
51
60
  const REQUIRED_AGENTS = ["explore-codebase", "research-expert"];
52
- /** Default freshness window for {@link REQUIRED_AGENTS} (4 min, the APEX TTL). */
53
- const DEFAULT_WINDOW_MS = 24e4;
61
+ /** Default freshness window for {@link REQUIRED_AGENTS} (2 min — matches the plugin's `FUSE_ENFORCE_TTL_SEC` default). */
62
+ const DEFAULT_WINDOW_MS = 12e4;
54
63
  /** Trivial edits allowed within the window before the full APEX gates apply. */
55
64
  const TRIVIAL_BUDGET = 4;
56
65
  /**
@@ -67,7 +76,7 @@ async function gate(input) {
67
76
  });
68
77
  if (quick.decision !== "allow" && quick.prompt) return quick.prompt;
69
78
  if (!input.filePath) return null;
70
- const window = input.windowMs ?? 24e4;
79
+ const window = input.windowMs ?? 12e4;
71
80
  const track = await loadTrack(input.trackFile);
72
81
  const lineCount = input.content === void 0 ? Number.POSITIVE_INFINITY : input.content.split("\n").length;
73
82
  if (!input.isReplaceAll && lineCount < 5 && trivialCount(track, window, input.now) < 4) {
@@ -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
- mcpPostStore(event.tool, event.input, payload.tool_response ?? payload.tool_output, mcpDir);
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 {
@@ -272,6 +291,7 @@ async function handleHook(id, payload, opts) {
272
291
  command: event.command,
273
292
  refs: opts.refsDir ? await loadRefs(opts.refsDir) : void 0,
274
293
  isReplaceAll: event.input.replace_all === true,
294
+ windowMs: opts.windowMs,
275
295
  now: opts.now,
276
296
  trackFile: file
277
297
  });
@@ -177,10 +177,6 @@ declare const SWIFT_PROTO_RE: RegExp;
177
177
  declare function interfaceSeparationGuard(ctx: GuardContext): Prompt | null;
178
178
  //#endregion
179
179
  //#region src/policy/guards/install.d.ts
180
- /** Project-level dependency installs (npm/yarn/pnpm/bun/pip/cargo/go/gem/composer). */
181
- declare const PROJECT_INSTALL_RE: RegExp;
182
- /** System-level package installs (brew/apt/apt-get/dnf/pacman). */
183
- declare const SYSTEM_INSTALL_RE: RegExp;
184
180
  /** Asks for confirmation before a dependency or system package install. */
185
181
  declare function installGuard(ctx: GuardContext): Prompt | null;
186
182
  //#endregion
@@ -207,4 +203,4 @@ declare const MAX_EXA_RESULTS = 3;
207
203
  */
208
204
  declare function capVerbosity(tool: string, input: Record<string, unknown>): Record<string, unknown> | null;
209
205
  //#endregion
210
- export { evaluateApex as A, matchPatterns as B, Guard as C, ApexGate as D, ApexContext as E, evaluate as F, DEV_KEYWORDS as G, countLines as H, GIT_ASK as I, isApexCommand as J, ProjectType as K, GIT_BLOCKED as L, solidReadGate as M, PolicyContext as N, brainstormGate as O, PolicyResult as P, PROJECT_INSTALL as R, securityGuard as S, APEX_GATES as T, evaluateFileSize as U, FileSizeVerdict as V, detectFramework as W, bashWriteGuard as _, runGuards as a, ASK_PATTERNS as b, installGuard as c, SWIFT_PROTO_RE as d, TS_DECL_RE as f, CODE_REDIRECT as g, CODE_MUTATORS as h, GUARDS as i, freshnessGate as j, docConsultedGate as k, PHP_DECL_RE as l, ASK_WRITERS as m, capVerbosity as n, PROJECT_INSTALL_RE as o, interfaceSeparationGuard as p, detectProjectType as q, detectCreationIntent as r, SYSTEM_INSTALL_RE as s, MAX_EXA_RESULTS as t, PY_MODEL_RE as u, PROTECTED_FRAGMENTS as v, GuardContext as w, CRITICAL_PATTERNS as x, protectedPathGuard as y, SYSTEM_INSTALL as z };
206
+ export { solidReadGate as A, countLines as B, APEX_GATES as C, docConsultedGate as D, brainstormGate as E, GIT_BLOCKED as F, detectProjectType as G, detectFramework as H, PROJECT_INSTALL as I, isApexCommand as K, SYSTEM_INSTALL as L, PolicyResult as M, evaluate as N, evaluateApex as O, GIT_ASK as P, matchPatterns as R, GuardContext as S, ApexGate as T, DEV_KEYWORDS as U, evaluateFileSize as V, ProjectType as W, protectedPathGuard as _, runGuards as a, securityGuard as b, PY_MODEL_RE as c, interfaceSeparationGuard as d, ASK_WRITERS as f, PROTECTED_FRAGMENTS as g, bashWriteGuard as h, GUARDS as i, PolicyContext as j, freshnessGate as k, SWIFT_PROTO_RE as l, CODE_REDIRECT as m, capVerbosity as n, installGuard as o, CODE_MUTATORS as p, detectCreationIntent as r, PHP_DECL_RE as s, MAX_EXA_RESULTS as t, TS_DECL_RE as u, ASK_PATTERNS as v, ApexContext as w, Guard as x, CRITICAL_PATTERNS as y, FileSizeVerdict 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 evaluateApex, B as matchPatterns, C as Guard, D as ApexGate, E as ApexContext, F as evaluate, G as DEV_KEYWORDS, H as countLines, I as GIT_ASK, J as isApexCommand, K as ProjectType, L as GIT_BLOCKED, M as solidReadGate, N as PolicyContext, O as brainstormGate, P as PolicyResult, R as PROJECT_INSTALL, S as securityGuard, T as APEX_GATES, U as evaluateFileSize, V as FileSizeVerdict, W as detectFramework, _ as bashWriteGuard, a as runGuards, b as ASK_PATTERNS, c as installGuard, d as SWIFT_PROTO_RE, f as TS_DECL_RE, g as CODE_REDIRECT, h as CODE_MUTATORS, i as GUARDS, j as freshnessGate, k as docConsultedGate, l as PHP_DECL_RE, m as ASK_WRITERS, n as capVerbosity, o as PROJECT_INSTALL_RE, p as interfaceSeparationGuard, q as detectProjectType, r as detectCreationIntent, s as SYSTEM_INSTALL_RE, t as MAX_EXA_RESULTS, u as PY_MODEL_RE, v as PROTECTED_FRAGMENTS, w as GuardContext, x as CRITICAL_PATTERNS, y as protectedPathGuard, z as SYSTEM_INSTALL } from "./index-CQOPshSM.mjs";
8
+ import { A as solidReadGate, B as countLines, C as APEX_GATES, D as docConsultedGate, E as brainstormGate, F as GIT_BLOCKED, G as detectProjectType, H as detectFramework, I as PROJECT_INSTALL, K as isApexCommand, L as SYSTEM_INSTALL, M as PolicyResult, N as evaluate, O as evaluateApex, P as GIT_ASK, R as matchPatterns, S as GuardContext, T as ApexGate, U as DEV_KEYWORDS, V as evaluateFileSize, W as ProjectType, _ as protectedPathGuard, a as runGuards, b as securityGuard, c as PY_MODEL_RE, d as interfaceSeparationGuard, f as ASK_WRITERS, g as PROTECTED_FRAGMENTS, h as bashWriteGuard, i as GUARDS, j as PolicyContext, k as freshnessGate, l as SWIFT_PROTO_RE, m as CODE_REDIRECT, n as capVerbosity, o as installGuard, p as CODE_MUTATORS, r as detectCreationIntent, s as PHP_DECL_RE, t as MAX_EXA_RESULTS, u as TS_DECL_RE, v as ASK_PATTERNS, w as ApexContext, x as Guard, y as CRITICAL_PATTERNS, z as FileSizeVerdict } from "./index-BKSKTgnV.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, PROJECT_INSTALL_RE, 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, SYSTEM_INSTALL_RE, 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, 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 };
package/dist/index.mjs CHANGED
@@ -1,14 +1,14 @@
1
1
  import { a as parseEnvInt, i as splitTarget, n as MAX_LINES_ENV_KEY, r as resolveMaxLines, t as DEFAULT_MAX_LINES } from "./limits-CHn8AIL1.mjs";
2
- import { i as ttlLabel, n as TTL_ENV_KEY, r as resolveTtlSec, t as DEFAULT_TTL_SEC } from "./config-BG55s6HZ.mjs";
2
+ import { i as ttlLabel, n as TTL_ENV_KEY, r as resolveTtlSec, t as DEFAULT_TTL_SEC } from "./ttl-BG55s6HZ.mjs";
3
3
  import { n as STATE_ROOT, r as projectLayout, t as STATE_GITIGNORE } from "./layout-C0jaaCQC.mjs";
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 { i as isApexCommand, n as DEV_KEYWORDS, r as detectProjectType, t as detectCreationIntent } from "./policy-Cpa5aWek.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 SYSTEM_INSTALL_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 PROJECT_INSTALL_RE, l as SWIFT_PROTO_RE, m as CODE_REDIRECT, n as GUARDS, o as installGuard, 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-qGG2Ul0W.mjs";
7
+ import { n as detectProjectType, r as isApexCommand, t as DEV_KEYWORDS } from "./policy-EuVJ_5hS.mjs";
8
+ import { C as matchPatterns, E as detectFramework, S as SYSTEM_INSTALL, T as evaluateFileSize, _ as CRITICAL_PATTERNS, a as PHP_DECL_RE, b as GIT_BLOCKED, c as TS_DECL_RE, d as CODE_MUTATORS, f as CODE_REDIRECT, g as ASK_PATTERNS, h as protectedPathGuard, i as installGuard, l as interfaceSeparationGuard, m as PROTECTED_FRAGMENTS, n as GUARDS, o as PY_MODEL_RE, p as bashWriteGuard, r as runGuards, s as SWIFT_PROTO_RE, t as evaluate, u as ASK_WRITERS, v as securityGuard, w as countLines, x as PROJECT_INSTALL, y as GIT_ASK } from "./evaluate-urGmc24B.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 docConsultedGate, c as solidReadGate, i as brainstormGate, n as capVerbosity, o as evaluateApex, r as APEX_GATES, s as freshnessGate, t as MAX_EXA_RESULTS } from "./verbosity-ZYT7tLCw.mjs";
11
+ import { a as brainstormGate, c as freshnessGate, i as APEX_GATES, l as solidReadGate, n as capVerbosity, o as docConsultedGate, r as detectCreationIntent, s as evaluateApex, t as MAX_EXA_RESULTS } from "./verbosity-BqM4C7_V.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, PROJECT_INSTALL_RE, PROTECTED_FRAGMENTS, PY_MODEL_RE, STATE_GITIGNORE, STATE_ROOT, SWIFT_PROTO_RE, SYSTEM_INSTALL, SYSTEM_INSTALL_RE, 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, 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 };
@@ -1,2 +1,2 @@
1
- import { A as evaluateApex, B as matchPatterns, C as Guard, D as ApexGate, E as ApexContext, F as evaluate, G as DEV_KEYWORDS, H as countLines, I as GIT_ASK, J as isApexCommand, K as ProjectType, L as GIT_BLOCKED, M as solidReadGate, N as PolicyContext, O as brainstormGate, P as PolicyResult, R as PROJECT_INSTALL, S as securityGuard, T as APEX_GATES, U as evaluateFileSize, V as FileSizeVerdict, W as detectFramework, _ as bashWriteGuard, a as runGuards, b as ASK_PATTERNS, c as installGuard, d as SWIFT_PROTO_RE, f as TS_DECL_RE, g as CODE_REDIRECT, h as CODE_MUTATORS, i as GUARDS, j as freshnessGate, k as docConsultedGate, l as PHP_DECL_RE, m as ASK_WRITERS, n as capVerbosity, o as PROJECT_INSTALL_RE, p as interfaceSeparationGuard, q as detectProjectType, r as detectCreationIntent, s as SYSTEM_INSTALL_RE, t as MAX_EXA_RESULTS, u as PY_MODEL_RE, v as PROTECTED_FRAGMENTS, w as GuardContext, x as CRITICAL_PATTERNS, y as protectedPathGuard, z as SYSTEM_INSTALL } from "../index-CQOPshSM.mjs";
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, PROJECT_INSTALL_RE, PROTECTED_FRAGMENTS, PY_MODEL_RE, PolicyContext, PolicyResult, ProjectType, SWIFT_PROTO_RE, SYSTEM_INSTALL, SYSTEM_INSTALL_RE, 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 solidReadGate, B as countLines, C as APEX_GATES, D as docConsultedGate, E as brainstormGate, F as GIT_BLOCKED, G as detectProjectType, H as detectFramework, I as PROJECT_INSTALL, K as isApexCommand, L as SYSTEM_INSTALL, M as PolicyResult, N as evaluate, O as evaluateApex, P as GIT_ASK, R as matchPatterns, S as GuardContext, T as ApexGate, U as DEV_KEYWORDS, V as evaluateFileSize, W as ProjectType, _ as protectedPathGuard, a as runGuards, b as securityGuard, c as PY_MODEL_RE, d as interfaceSeparationGuard, f as ASK_WRITERS, g as PROTECTED_FRAGMENTS, h as bashWriteGuard, i as GUARDS, j as PolicyContext, k as freshnessGate, l as SWIFT_PROTO_RE, m as CODE_REDIRECT, n as capVerbosity, o as installGuard, p as CODE_MUTATORS, r as detectCreationIntent, s as PHP_DECL_RE, t as MAX_EXA_RESULTS, u as TS_DECL_RE, v as ASK_PATTERNS, w as ApexContext, x as Guard, y as CRITICAL_PATTERNS, z as FileSizeVerdict } from "../index-BKSKTgnV.mjs";
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,4 +1,4 @@
1
- import { i as isApexCommand, n as DEV_KEYWORDS, r as detectProjectType, t as detectCreationIntent } from "../policy-Cpa5aWek.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 SYSTEM_INSTALL_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 PROJECT_INSTALL_RE, l as SWIFT_PROTO_RE, m as CODE_REDIRECT, n as GUARDS, o as installGuard, 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-qGG2Ul0W.mjs";
3
- import { a as docConsultedGate, c as solidReadGate, i as brainstormGate, n as capVerbosity, o as evaluateApex, r as APEX_GATES, s as freshnessGate, t as MAX_EXA_RESULTS } from "../verbosity-ZYT7tLCw.mjs";
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, PROJECT_INSTALL_RE, PROTECTED_FRAGMENTS, PY_MODEL_RE, SWIFT_PROTO_RE, SYSTEM_INSTALL, SYSTEM_INSTALL_RE, 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 matchPatterns, E as detectFramework, S as SYSTEM_INSTALL, T as evaluateFileSize, _ as CRITICAL_PATTERNS, a as PHP_DECL_RE, b as GIT_BLOCKED, c as TS_DECL_RE, d as CODE_MUTATORS, f as CODE_REDIRECT, g as ASK_PATTERNS, h as protectedPathGuard, i as installGuard, l as interfaceSeparationGuard, m as PROTECTED_FRAGMENTS, n as GUARDS, o as PY_MODEL_RE, p as bashWriteGuard, r as runGuards, s as SWIFT_PROTO_RE, t as evaluate, u as ASK_WRITERS, v as securityGuard, w as countLines, x as PROJECT_INSTALL, y as GIT_ASK } from "../evaluate-urGmc24B.mjs";
3
+ import { a as brainstormGate, c as freshnessGate, i as APEX_GATES, l as solidReadGate, n as capVerbosity, o as docConsultedGate, r as detectCreationIntent, s as evaluateApex, t as MAX_EXA_RESULTS } from "../verbosity-BqM4C7_V.mjs";
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 };
@@ -30,16 +30,4 @@ function detectProjectType(dir) {
30
30
  return "generic";
31
31
  }
32
32
  //#endregion
33
- //#region src/policy/creation-intent.ts
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-qGG2Ul0W.mjs";
2
+ import { t as evaluate } from "./evaluate-urGmc24B.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
@@ -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
@@ -52,8 +56,8 @@ declare function activityFor(event: ToolEvent): Activity | null;
52
56
  //#region src/runtime/gate.d.ts
53
57
  /** Prior agents the freshness gate requires before a code edit. */
54
58
  declare const REQUIRED_AGENTS: ReadonlyArray<string>;
55
- /** Default freshness window for {@link REQUIRED_AGENTS} (4 min, the APEX TTL). */
56
- declare const DEFAULT_WINDOW_MS = 24e4;
59
+ /** Default freshness window for {@link REQUIRED_AGENTS} (2 min — matches the plugin's `FUSE_ENFORCE_TTL_SEC` default). */
60
+ declare const DEFAULT_WINDOW_MS = 12e4;
57
61
  /** Trivial edits allowed within the window before the full APEX gates apply. */
58
62
  declare const TRIVIAL_BUDGET = 4;
59
63
  /** A tool-use to gate, plus the session pointers needed for the stateful gates. */
@@ -126,6 +130,8 @@ interface HandleOptions {
126
130
  cwd: string;
127
131
  /** Directory of SOLID reference `.md` files for `solidReadGate` (else inert). */
128
132
  refsDir?: string;
133
+ /** APEX freshness window in ms (from `FUSE_ENFORCE_TTL_SEC`). */
134
+ windowMs?: number;
129
135
  }
130
136
  /** What the hook bin should print + exit with. */
131
137
  interface HandleOutcome {
@@ -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-D-DClzB2.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-Sq-byRft.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 AuthEntry } from "../doc-helpers-CG1nuf-c.mjs";
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,6 +52,18 @@ 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
68
  /** Exa MCP tools whose result count is capped (Context7 has no verbosity knob). */
57
69
  const EXA_TOOLS = /exa__web_search|exa__get_code_context|exa_web_search|exa_get_code_context/i;
@@ -71,4 +83,4 @@ function capVerbosity(tool, input) {
71
83
  };
72
84
  }
73
85
  //#endregion
74
- export { docConsultedGate as a, solidReadGate as c, brainstormGate as i, capVerbosity as n, evaluateApex as o, APEX_GATES as r, freshnessGate as s, MAX_EXA_RESULTS as t };
86
+ export { brainstormGate as a, freshnessGate as c, APEX_GATES as i, solidReadGate as l, capVerbosity as n, docConsultedGate as o, detectCreationIntent as r, evaluateApex as s, MAX_EXA_RESULTS as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusengine/harness",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
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",
File without changes