@isaacriehm/cairn-core 0.7.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/doctor/index.js +57 -0
- package/dist/doctor/index.js.map +1 -1
- package/dist/gc/citation-integrity.js +3 -1
- package/dist/gc/citation-integrity.js.map +1 -1
- package/dist/gc/doc-claims.d.ts +31 -0
- package/dist/gc/doc-claims.js +213 -0
- package/dist/gc/doc-claims.js.map +1 -0
- package/dist/gc/doc-source-drift.d.ts +31 -0
- package/dist/gc/doc-source-drift.js +190 -0
- package/dist/gc/doc-source-drift.js.map +1 -0
- package/dist/gc/index.d.ts +4 -0
- package/dist/gc/index.js +2 -0
- package/dist/gc/index.js.map +1 -1
- package/dist/gc/sweep.js +18 -0
- package/dist/gc/sweep.js.map +1 -1
- package/dist/gc/types.d.ts +2 -2
- package/dist/hooks/runners/context-threshold.d.ts +63 -0
- package/dist/hooks/runners/context-threshold.js +179 -0
- package/dist/hooks/runners/context-threshold.js.map +1 -0
- package/dist/hooks/runners/gc-autotrigger.d.ts +49 -0
- package/dist/hooks/runners/gc-autotrigger.js +87 -0
- package/dist/hooks/runners/gc-autotrigger.js.map +1 -0
- package/dist/hooks/runners/index.d.ts +2 -0
- package/dist/hooks/runners/index.js +1 -0
- package/dist/hooks/runners/index.js.map +1 -1
- package/dist/hooks/runners/session-start.js +110 -6
- package/dist/hooks/runners/session-start.js.map +1 -1
- package/dist/hooks/runners/stop.js +119 -0
- package/dist/hooks/runners/stop.js.map +1 -1
- package/dist/init/index.d.ts +5 -1
- package/dist/init/index.js +2 -0
- package/dist/init/index.js.map +1 -1
- package/dist/init/ingest-docs.d.ts +6 -1
- package/dist/init/ingest-docs.js.map +1 -1
- package/dist/init/init.js +11 -6
- package/dist/init/init.js.map +1 -1
- package/dist/init/mapper-parallel.js +13 -6
- package/dist/init/mapper-parallel.js.map +1 -1
- package/dist/init/phases/1-detect.d.ts +17 -4
- package/dist/init/phases/1-detect.js +48 -4
- package/dist/init/phases/1-detect.js.map +1 -1
- package/dist/init/phases/10-rules-merge.js +13 -1
- package/dist/init/phases/10-rules-merge.js.map +1 -1
- package/dist/init/phases/11-baseline.js.map +1 -1
- package/dist/init/phases/12-strip.js +14 -1
- package/dist/init/phases/12-strip.js.map +1 -1
- package/dist/init/phases/3-mapper.js.map +1 -1
- package/dist/init/phases/4-seed.js +1 -1
- package/dist/init/phases/4-seed.js.map +1 -1
- package/dist/init/phases/5-pilot.js.map +1 -1
- package/dist/init/phases/6-brand.js +2 -4
- package/dist/init/phases/6-brand.js.map +1 -1
- package/dist/init/phases/8-docs-ingest.js +13 -1
- package/dist/init/phases/8-docs-ingest.js.map +1 -1
- package/dist/init/phases/9-source-comments.js +13 -1
- package/dist/init/phases/9-source-comments.js.map +1 -1
- package/dist/init/phases/orchestrator.d.ts +10 -0
- package/dist/init/phases/orchestrator.js +12 -0
- package/dist/init/phases/orchestrator.js.map +1 -1
- package/dist/init/phases/parallel-8910.js +29 -4
- package/dist/init/phases/parallel-8910.js.map +1 -1
- package/dist/init/phases/source-comments-output-io.d.ts +7 -2
- package/dist/init/phases/source-comments-output-io.js.map +1 -1
- package/dist/init/phases/types.d.ts +49 -9
- package/dist/init/phases/types.js.map +1 -1
- package/dist/init/post-git-init.d.ts +53 -0
- package/dist/init/post-git-init.js +74 -0
- package/dist/init/post-git-init.js.map +1 -0
- package/dist/init/preflight-guards.d.ts +11 -2
- package/dist/init/preflight-guards.js +27 -5
- package/dist/init/preflight-guards.js.map +1 -1
- package/dist/init/rules-merge/index.d.ts +1 -1
- package/dist/init/rules-merge/ingest.d.ts +6 -1
- package/dist/init/rules-merge/ingest.js.map +1 -1
- package/dist/init/skill-budget.d.ts +39 -0
- package/dist/init/skill-budget.js +99 -0
- package/dist/init/skill-budget.js.map +1 -0
- package/dist/init/types.d.ts +9 -0
- package/dist/join/index.js +3 -3
- package/dist/join/index.js.map +1 -1
- package/dist/mcp/bootstrap-guard.js +2 -2
- package/dist/mcp/bootstrap-guard.js.map +1 -1
- package/dist/mcp/schemas.d.ts +34 -0
- package/dist/mcp/schemas.js +50 -0
- package/dist/mcp/schemas.js.map +1 -1
- package/dist/mcp/telemetry.d.ts +1 -1
- package/dist/mcp/tools/bootstrap-retry.d.ts +23 -0
- package/dist/mcp/tools/bootstrap-retry.js +53 -0
- package/dist/mcp/tools/bootstrap-retry.js.map +1 -0
- package/dist/mcp/tools/index.js +10 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/init-phases.js +4 -8
- package/dist/mcp/tools/init-phases.js.map +1 -1
- package/dist/mcp/tools/resume.d.ts +21 -0
- package/dist/mcp/tools/resume.js +88 -0
- package/dist/mcp/tools/resume.js.map +1 -0
- package/dist/mcp/tools/task-complete.d.ts +23 -0
- package/dist/mcp/tools/task-complete.js +51 -0
- package/dist/mcp/tools/task-complete.js.map +1 -0
- package/dist/mcp/tools/task-create.js +17 -11
- package/dist/mcp/tools/task-create.js.map +1 -1
- package/dist/mcp/tools/task-journal-append.d.ts +22 -0
- package/dist/mcp/tools/task-journal-append.js +44 -0
- package/dist/mcp/tools/task-journal-append.js.map +1 -0
- package/dist/paths/index.js +1 -1
- package/dist/paths/index.js.map +1 -1
- package/dist/status-line/format.js +20 -0
- package/dist/status-line/format.js.map +1 -1
- package/dist/tasks/index.d.ts +2 -0
- package/dist/tasks/index.js +2 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/lifecycle.d.ts +107 -0
- package/dist/tasks/lifecycle.js +302 -0
- package/dist/tasks/lifecycle.js.map +1 -0
- package/dist/trace/index.d.ts +1 -1
- package/dist/trace/index.js +2 -2
- package/dist/trace/index.js.map +1 -1
- package/package.json +2 -2
package/dist/gc/index.d.ts
CHANGED
|
@@ -24,8 +24,12 @@ export { classifyAutoMerge } from "./classify.js";
|
|
|
24
24
|
export type { ClassifyArgs } from "./classify.js";
|
|
25
25
|
export { runCompletionIntegrity } from "./completion-integrity.js";
|
|
26
26
|
export type { CompletionIntegrityOptions, CompletionIntegrityResult, } from "./completion-integrity.js";
|
|
27
|
+
export { runDocClaimsVsRuntime } from "./doc-claims.js";
|
|
28
|
+
export type { DocClaimKind, DocClaimsOptions, DocClaimsResult, RuntimeTruth as DocClaimsRuntimeTruth, } from "./doc-claims.js";
|
|
27
29
|
export { runDocGardening } from "./doc-gardening.js";
|
|
28
30
|
export type { DocGardeningOptions, DocGardeningResult, } from "./doc-gardening.js";
|
|
31
|
+
export { extractSectionByAnchor, runDocSourceDrift, slugifyHeading, } from "./doc-source-drift.js";
|
|
32
|
+
export type { DocSourceDriftOptions, DocSourceDriftResult, } from "./doc-source-drift.js";
|
|
29
33
|
export { runFrontmatterFreshness, } from "./frontmatter.js";
|
|
30
34
|
export type { FrontmatterFreshnessOptions, FrontmatterFreshnessResult, } from "./frontmatter.js";
|
|
31
35
|
export { runGeneratorDrift } from "./generator-drift.js";
|
package/dist/gc/index.js
CHANGED
|
@@ -19,7 +19,9 @@ export { runGcCanary as verifyBatchCanary } from "./canary.js";
|
|
|
19
19
|
export { runCitationIntegrity } from "./citation-integrity.js";
|
|
20
20
|
export { classifyAutoMerge } from "./classify.js";
|
|
21
21
|
export { runCompletionIntegrity } from "./completion-integrity.js";
|
|
22
|
+
export { runDocClaimsVsRuntime } from "./doc-claims.js";
|
|
22
23
|
export { runDocGardening } from "./doc-gardening.js";
|
|
24
|
+
export { extractSectionByAnchor, runDocSourceDrift, slugifyHeading, } from "./doc-source-drift.js";
|
|
23
25
|
export { runFrontmatterFreshness, } from "./frontmatter.js";
|
|
24
26
|
export { runGeneratorDrift } from "./generator-drift.js";
|
|
25
27
|
export { runQualityUpdate as runQualityGradesUpdate } from "./quality-update.js";
|
package/dist/gc/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAK/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKnE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKrD,OAAO,EACL,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,EAAE,gBAAgB,IAAI,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAIjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAKvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKpD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAK/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAOxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKrD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EACL,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,EAAE,gBAAgB,IAAI,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAIjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAKvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKpD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/gc/sweep.js
CHANGED
|
@@ -20,7 +20,9 @@ import { runGcCanary } from "./canary.js";
|
|
|
20
20
|
import { runCitationIntegrity } from "./citation-integrity.js";
|
|
21
21
|
import { classifyAutoMerge } from "./classify.js";
|
|
22
22
|
import { runCompletionIntegrity } from "./completion-integrity.js";
|
|
23
|
+
import { runDocClaimsVsRuntime } from "./doc-claims.js";
|
|
23
24
|
import { runDocGardening } from "./doc-gardening.js";
|
|
25
|
+
import { runDocSourceDrift } from "./doc-source-drift.js";
|
|
24
26
|
import { runFrontmatterFreshness } from "./frontmatter.js";
|
|
25
27
|
import { runGeneratorDrift } from "./generator-drift.js";
|
|
26
28
|
import { runQualityUpdate } from "./quality-update.js";
|
|
@@ -43,6 +45,8 @@ export async function runGcSweep(opts) {
|
|
|
43
45
|
"completion-integrity": 0,
|
|
44
46
|
"citation-integrity": 0,
|
|
45
47
|
"attested-commits-pruning": 0,
|
|
48
|
+
"doc-claims-vs-runtime": 0,
|
|
49
|
+
"doc-source-drift": 0,
|
|
46
50
|
};
|
|
47
51
|
// 1. Frontmatter freshness.
|
|
48
52
|
{
|
|
@@ -125,6 +129,20 @@ export async function runGcSweep(opts) {
|
|
|
125
129
|
findings.push(...r.findings);
|
|
126
130
|
passDurations["attested-commits-pruning"] = Date.now() - t0;
|
|
127
131
|
}
|
|
132
|
+
// 10. Doc-claims vs runtime drift.
|
|
133
|
+
{
|
|
134
|
+
const t0 = Date.now();
|
|
135
|
+
const r = runDocClaimsVsRuntime({ repoRoot: opts.repoRoot });
|
|
136
|
+
findings.push(...r.findings);
|
|
137
|
+
passDurations["doc-claims-vs-runtime"] = Date.now() - t0;
|
|
138
|
+
}
|
|
139
|
+
// 11. Doc-source drift — body of sot_kind=path DECs/INVs vs ground hash.
|
|
140
|
+
{
|
|
141
|
+
const t0 = Date.now();
|
|
142
|
+
const r = runDocSourceDrift({ repoRoot: opts.repoRoot });
|
|
143
|
+
findings.push(...r.findings);
|
|
144
|
+
passDurations["doc-source-drift"] = Date.now() - t0;
|
|
145
|
+
}
|
|
128
146
|
// Re-classify proposals against project globs (passes set defaults; this
|
|
129
147
|
// ensures high-stakes hits dominate when a stale-frontmatter doc happens to
|
|
130
148
|
// live under a high-stakes glob).
|
package/dist/gc/sweep.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/gc/sweep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAuB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAU7D,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AA6B/B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAuB;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,MAAM,aAAa,GAA6B;QAC9C,uBAAuB,EAAE,CAAC;QAC1B,iBAAiB,EAAE,CAAC;QACpB,mBAAmB,EAAE,CAAC;QACtB,eAAe,EAAE,CAAC;QAClB,gBAAgB,EAAE,CAAC;QACnB,gBAAgB,EAAE,CAAC;QACnB,sBAAsB,EAAE,CAAC;QACzB,oBAAoB,EAAE,CAAC;QACvB,0BAA0B,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/gc/sweep.ts"],"names":[],"mappings":"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"}
|
package/dist/gc/types.d.ts
CHANGED
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
* reviewer + UAT 🟢 → push.
|
|
23
23
|
* high-stakes — touches projectGlobs.high_stakes_globs. Above + E2E + Layer E.
|
|
24
24
|
*/
|
|
25
|
-
export type GcPassId = "frontmatter-freshness" | "generator-drift" | "stub-catalog-hits" | "doc-gardening" | "quality-grades" | "scope-coverage" | "completion-integrity" | "citation-integrity" | "attested-commits-pruning";
|
|
26
|
-
export type GcFindingKind = "frontmatter_stale" | "generator_drift" | "stub_hit" | "broken_link" | "orphan_path" | "quality_update" | "scope_uncovered" | "scope_drift_orphan" | "scope_index_missing" | "task_integrity_error" | "orphaned_citation" | "stale_citation" | "quality_grades_rebuilt" | "superseded_citation";
|
|
25
|
+
export type GcPassId = "frontmatter-freshness" | "generator-drift" | "stub-catalog-hits" | "doc-gardening" | "quality-grades" | "scope-coverage" | "completion-integrity" | "citation-integrity" | "attested-commits-pruning" | "doc-claims-vs-runtime" | "doc-source-drift";
|
|
26
|
+
export type GcFindingKind = "frontmatter_stale" | "generator_drift" | "stub_hit" | "broken_link" | "orphan_path" | "quality_update" | "scope_uncovered" | "scope_drift_orphan" | "scope_index_missing" | "task_integrity_error" | "orphaned_citation" | "stale_citation" | "quality_grades_rebuilt" | "superseded_citation" | "doc_claim_drift" | "doc_source_drift" | "sot_missing" | "sot_anchor_missing";
|
|
27
27
|
export type GcAutoMergeClass = "safe" | "code" | "high-stakes";
|
|
28
28
|
export interface GcFinding {
|
|
29
29
|
pass: GcPassId;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context-threshold detection for the Stop hook.
|
|
3
|
+
*
|
|
4
|
+
* When mid-task context approaches the active model's window, surface
|
|
5
|
+
* an inline `[a] keep going [b] /clear and resume now [c] mark task
|
|
6
|
+
* done` choice via Claude Code's AskUserQuestion. The Stop hook can't
|
|
7
|
+
* call AskUserQuestion directly (only the model can), so it injects
|
|
8
|
+
* `decision: block` with an instructional reason that prompts main
|
|
9
|
+
* Claude to render the question.
|
|
10
|
+
*
|
|
11
|
+
* Threshold defaults to 50 % of the active model's window:
|
|
12
|
+
* - claude-opus-* → 1_000_000 tokens, fire at 500_000
|
|
13
|
+
* - claude-sonnet-* → 200_000 tokens, fire at 100_000
|
|
14
|
+
* - claude-haiku-* → 200_000 tokens, fire at 100_000
|
|
15
|
+
* - unknown model → assume Opus shape (1M / 500k threshold)
|
|
16
|
+
*
|
|
17
|
+
* Token count is estimated from the transcript file size (`bytes / 4`)
|
|
18
|
+
* — overcounts a little on JSON whitespace, undercounts on unicode-
|
|
19
|
+
* heavy turns. Good enough to fire near the threshold; not a budget
|
|
20
|
+
* check.
|
|
21
|
+
*
|
|
22
|
+
* Suppress re-fire within the same session by stamping
|
|
23
|
+
* `.cairn/sessions/<id>/ctx-threshold-warned.json`. Once stamped, the
|
|
24
|
+
* threshold prompt re-fires only when usage climbs another +10 %
|
|
25
|
+
* past the last warning.
|
|
26
|
+
*/
|
|
27
|
+
export interface ContextThresholdInput {
|
|
28
|
+
transcriptPath: string | null;
|
|
29
|
+
repoRoot: string;
|
|
30
|
+
sessionId: string;
|
|
31
|
+
/** Override the model lookup (rarely needed). */
|
|
32
|
+
modelOverride?: string | null;
|
|
33
|
+
/** Override the threshold fraction (default 0.5). */
|
|
34
|
+
thresholdFraction?: number;
|
|
35
|
+
/** Override the window size in tokens (default keyed on model). */
|
|
36
|
+
windowOverride?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface ContextThresholdHit {
|
|
39
|
+
hit: true;
|
|
40
|
+
estimatedTokens: number;
|
|
41
|
+
windowTokens: number;
|
|
42
|
+
pct: number;
|
|
43
|
+
model: string;
|
|
44
|
+
taskId: string | null;
|
|
45
|
+
}
|
|
46
|
+
export interface ContextThresholdMiss {
|
|
47
|
+
hit: false;
|
|
48
|
+
}
|
|
49
|
+
export type ContextThresholdResult = ContextThresholdHit | ContextThresholdMiss;
|
|
50
|
+
/**
|
|
51
|
+
* Returns the current threshold result. Stamps the warned-state file
|
|
52
|
+
* on a hit so re-fires within the same session are suppressed until
|
|
53
|
+
* usage climbs another +10 % of the window.
|
|
54
|
+
*/
|
|
55
|
+
export declare function checkContextThreshold(input: ContextThresholdInput): ContextThresholdResult;
|
|
56
|
+
/**
|
|
57
|
+
* Render the inline prompt that the Stop hook injects via
|
|
58
|
+
* `decision: block`. The text instructs main Claude to render the
|
|
59
|
+
* three-option AskUserQuestion. Format-locked so the `[b]` branch
|
|
60
|
+
* always emits the literal `/cairn-resume <task_id>` token the
|
|
61
|
+
* operator pastes after `/clear`.
|
|
62
|
+
*/
|
|
63
|
+
export declare function renderContextThresholdHint(hit: ContextThresholdHit, taskId: string | null): string;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context-threshold detection for the Stop hook.
|
|
3
|
+
*
|
|
4
|
+
* When mid-task context approaches the active model's window, surface
|
|
5
|
+
* an inline `[a] keep going [b] /clear and resume now [c] mark task
|
|
6
|
+
* done` choice via Claude Code's AskUserQuestion. The Stop hook can't
|
|
7
|
+
* call AskUserQuestion directly (only the model can), so it injects
|
|
8
|
+
* `decision: block` with an instructional reason that prompts main
|
|
9
|
+
* Claude to render the question.
|
|
10
|
+
*
|
|
11
|
+
* Threshold defaults to 50 % of the active model's window:
|
|
12
|
+
* - claude-opus-* → 1_000_000 tokens, fire at 500_000
|
|
13
|
+
* - claude-sonnet-* → 200_000 tokens, fire at 100_000
|
|
14
|
+
* - claude-haiku-* → 200_000 tokens, fire at 100_000
|
|
15
|
+
* - unknown model → assume Opus shape (1M / 500k threshold)
|
|
16
|
+
*
|
|
17
|
+
* Token count is estimated from the transcript file size (`bytes / 4`)
|
|
18
|
+
* — overcounts a little on JSON whitespace, undercounts on unicode-
|
|
19
|
+
* heavy turns. Good enough to fire near the threshold; not a budget
|
|
20
|
+
* check.
|
|
21
|
+
*
|
|
22
|
+
* Suppress re-fire within the same session by stamping
|
|
23
|
+
* `.cairn/sessions/<id>/ctx-threshold-warned.json`. Once stamped, the
|
|
24
|
+
* threshold prompt re-fires only when usage climbs another +10 %
|
|
25
|
+
* past the last warning.
|
|
26
|
+
*/
|
|
27
|
+
import { existsSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
28
|
+
import { join } from "node:path";
|
|
29
|
+
const MODEL_WINDOW_FALLBACK = 1_000_000;
|
|
30
|
+
function modelWindow(model) {
|
|
31
|
+
if (/opus/i.test(model))
|
|
32
|
+
return 1_000_000;
|
|
33
|
+
if (/sonnet/i.test(model))
|
|
34
|
+
return 200_000;
|
|
35
|
+
if (/haiku/i.test(model))
|
|
36
|
+
return 200_000;
|
|
37
|
+
return MODEL_WINDOW_FALLBACK;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Walk the last ~64 KB of the transcript looking for the most recent
|
|
41
|
+
* `model` field. Claude Code transcript lines are JSON; each assistant
|
|
42
|
+
* turn carries a `message.model` string. Skipping the full file keeps
|
|
43
|
+
* the hook fast on long sessions.
|
|
44
|
+
*/
|
|
45
|
+
function readModelFromTranscript(path) {
|
|
46
|
+
try {
|
|
47
|
+
const stat = statSync(path);
|
|
48
|
+
const tail = Math.min(stat.size, 65_536);
|
|
49
|
+
const fd = readFileSync(path, "utf8");
|
|
50
|
+
const slice = fd.slice(Math.max(0, fd.length - tail));
|
|
51
|
+
const lines = slice.split(/\r?\n/);
|
|
52
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
53
|
+
const line = lines[i];
|
|
54
|
+
if (line === undefined || line.length === 0)
|
|
55
|
+
continue;
|
|
56
|
+
try {
|
|
57
|
+
const obj = JSON.parse(line);
|
|
58
|
+
const m = obj.message?.model;
|
|
59
|
+
if (typeof m === "string" && m.length > 0)
|
|
60
|
+
return m;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// skip malformed lines
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
function estimateTokens(transcriptPath) {
|
|
73
|
+
try {
|
|
74
|
+
return Math.floor(statSync(transcriptPath).size / 4);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function warnedStatePath(repoRoot, sessionId) {
|
|
81
|
+
return join(repoRoot, ".cairn", "sessions", sessionId, "ctx-threshold-warned.json");
|
|
82
|
+
}
|
|
83
|
+
function readWarned(repoRoot, sessionId) {
|
|
84
|
+
const path = warnedStatePath(repoRoot, sessionId);
|
|
85
|
+
if (!existsSync(path))
|
|
86
|
+
return null;
|
|
87
|
+
try {
|
|
88
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
89
|
+
if (typeof parsed === "object" &&
|
|
90
|
+
parsed !== null &&
|
|
91
|
+
typeof parsed.ts === "number" &&
|
|
92
|
+
typeof parsed.warned_at_tokens === "number") {
|
|
93
|
+
return parsed;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// fall through
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
function writeWarned(repoRoot, sessionId, state) {
|
|
102
|
+
try {
|
|
103
|
+
writeFileSync(warnedStatePath(repoRoot, sessionId), `${JSON.stringify(state, null, 2)}\n`, "utf8");
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// best-effort
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Returns the current threshold result. Stamps the warned-state file
|
|
111
|
+
* on a hit so re-fires within the same session are suppressed until
|
|
112
|
+
* usage climbs another +10 % of the window.
|
|
113
|
+
*/
|
|
114
|
+
export function checkContextThreshold(input) {
|
|
115
|
+
if (input.transcriptPath === null || input.transcriptPath.length === 0) {
|
|
116
|
+
return { hit: false };
|
|
117
|
+
}
|
|
118
|
+
if (!existsSync(input.transcriptPath))
|
|
119
|
+
return { hit: false };
|
|
120
|
+
const model = input.modelOverride ?? readModelFromTranscript(input.transcriptPath) ?? "unknown";
|
|
121
|
+
const windowTokens = input.windowOverride ?? modelWindow(model);
|
|
122
|
+
const fraction = input.thresholdFraction ?? 0.5;
|
|
123
|
+
const thresholdTokens = Math.floor(windowTokens * fraction);
|
|
124
|
+
const estimated = estimateTokens(input.transcriptPath);
|
|
125
|
+
if (estimated < thresholdTokens)
|
|
126
|
+
return { hit: false };
|
|
127
|
+
const warned = readWarned(input.repoRoot, input.sessionId);
|
|
128
|
+
const reFireSlackTokens = Math.floor(windowTokens * 0.1);
|
|
129
|
+
if (warned !== null && estimated < warned.warned_at_tokens + reFireSlackTokens) {
|
|
130
|
+
return { hit: false };
|
|
131
|
+
}
|
|
132
|
+
writeWarned(input.repoRoot, input.sessionId, {
|
|
133
|
+
ts: Date.now(),
|
|
134
|
+
warned_at_tokens: estimated,
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
hit: true,
|
|
138
|
+
estimatedTokens: estimated,
|
|
139
|
+
windowTokens,
|
|
140
|
+
pct: Math.round((estimated / windowTokens) * 100),
|
|
141
|
+
model,
|
|
142
|
+
taskId: null,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Render the inline prompt that the Stop hook injects via
|
|
147
|
+
* `decision: block`. The text instructs main Claude to render the
|
|
148
|
+
* three-option AskUserQuestion. Format-locked so the `[b]` branch
|
|
149
|
+
* always emits the literal `/cairn-resume <task_id>` token the
|
|
150
|
+
* operator pastes after `/clear`.
|
|
151
|
+
*/
|
|
152
|
+
export function renderContextThresholdHint(hit, taskId) {
|
|
153
|
+
const taskLine = taskId !== null
|
|
154
|
+
? `Active task: \`${taskId}\`.`
|
|
155
|
+
: "No active task — context still climbing through general work.";
|
|
156
|
+
const resumeLine = taskId !== null
|
|
157
|
+
? `If the operator picks **\`b\`**, emit a code block containing exactly:\n\n\`\`\`\n/cairn-resume ${taskId}\n\`\`\`\n\nThe operator copies that, runs \`/clear\`, then pastes it into the fresh chat — Cairn rebuilds context from \`.cairn/tasks/active/${taskId}/journal.jsonl\`.`
|
|
158
|
+
: "If the operator picks **`b`**, instruct them to `/clear` and re-ask. There's no task journal to resume from yet.";
|
|
159
|
+
return [
|
|
160
|
+
`## Cairn — context threshold reached`,
|
|
161
|
+
"",
|
|
162
|
+
`Estimated **${hit.estimatedTokens.toLocaleString()} / ${hit.windowTokens.toLocaleString()} tokens (${hit.pct}%)** for \`${hit.model}\`. Trust degrades as context climbs — best to compact now.`,
|
|
163
|
+
"",
|
|
164
|
+
taskLine,
|
|
165
|
+
"",
|
|
166
|
+
"Render this question via the `AskUserQuestion` tool — do not skip:",
|
|
167
|
+
"",
|
|
168
|
+
"> Context at " + hit.pct + "% of " + hit.model + " window. Pick:",
|
|
169
|
+
"> ",
|
|
170
|
+
"> - `[a]` keep going (warn re-fires every +10 %)",
|
|
171
|
+
"> - `[b]` `/clear` and resume now (Cairn writes the resume prompt)",
|
|
172
|
+
"> - `[c]` mark task done (graduate the active TSK and start fresh)",
|
|
173
|
+
"",
|
|
174
|
+
resumeLine,
|
|
175
|
+
"",
|
|
176
|
+
"On `[c]`, call `cairn_task_complete({task_id, outcome: \"succeeded\"})` for the active task before ending the turn. On `[a]`, just continue.",
|
|
177
|
+
].join("\n");
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=context-threshold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-threshold.js","sourceRoot":"","sources":["../../../src/hooks/runners/context-threshold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stop-hook GC autotrigger.
|
|
3
|
+
*
|
|
4
|
+
* Runs at the tail of every Stop tick when no init is in flight. If the
|
|
5
|
+
* last GC run is older than the threshold (default 24 h), spawns
|
|
6
|
+
* `cairn gc sweep` detached so the next attention surface (or
|
|
7
|
+
* operator-visible run) reflects current drift. The Stop hook does NOT
|
|
8
|
+
* wait for the spawned process — it stamps the marker, fires the spawn,
|
|
9
|
+
* unrefs, and returns.
|
|
10
|
+
*
|
|
11
|
+
* `cairn gc sweep` is sweep-only (no commit). The findings flow through
|
|
12
|
+
* `cairn-attention` for operator triage. `cairn gc run --apply-classes`
|
|
13
|
+
* stays operator-driven until the autotrigger is proven safe in the
|
|
14
|
+
* field.
|
|
15
|
+
*/
|
|
16
|
+
export interface GcAutotriggerOptions {
|
|
17
|
+
repoRoot: string;
|
|
18
|
+
/** Override threshold in hours. Default 24. */
|
|
19
|
+
thresholdHours?: number;
|
|
20
|
+
/** Override "now"; injected by tests. */
|
|
21
|
+
now?: Date;
|
|
22
|
+
/**
|
|
23
|
+
* Replace the actual `child_process.spawn` call. Smokes pass a
|
|
24
|
+
* recorder so they can assert arguments without forking a real
|
|
25
|
+
* subprocess.
|
|
26
|
+
*/
|
|
27
|
+
spawner?: (argv: GcAutotriggerArgv) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Override CLAUDE_PLUGIN_ROOT; defaults to process.env. Required for
|
|
30
|
+
* tests that don't set the real env var.
|
|
31
|
+
*/
|
|
32
|
+
pluginRoot?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface GcAutotriggerArgv {
|
|
35
|
+
cmd: string;
|
|
36
|
+
args: string[];
|
|
37
|
+
cwd: string;
|
|
38
|
+
}
|
|
39
|
+
export type GcAutotriggerReason = "first_run" | "threshold_passed" | "fresh" | "no_plugin_root" | "no_cli_bundle";
|
|
40
|
+
export interface GcAutotriggerResult {
|
|
41
|
+
triggered: boolean;
|
|
42
|
+
reason: GcAutotriggerReason;
|
|
43
|
+
thresholdHours: number;
|
|
44
|
+
/** ISO timestamp of the marker as it stood before this call. "" when none. */
|
|
45
|
+
lastRunIso: string;
|
|
46
|
+
/** Argv that was (or would have been) spawned. Set when triggered=true. */
|
|
47
|
+
spawned?: GcAutotriggerArgv;
|
|
48
|
+
}
|
|
49
|
+
export declare function runGcAutotriggerCheck(opts: GcAutotriggerOptions): GcAutotriggerResult;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stop-hook GC autotrigger.
|
|
3
|
+
*
|
|
4
|
+
* Runs at the tail of every Stop tick when no init is in flight. If the
|
|
5
|
+
* last GC run is older than the threshold (default 24 h), spawns
|
|
6
|
+
* `cairn gc sweep` detached so the next attention surface (or
|
|
7
|
+
* operator-visible run) reflects current drift. The Stop hook does NOT
|
|
8
|
+
* wait for the spawned process — it stamps the marker, fires the spawn,
|
|
9
|
+
* unrefs, and returns.
|
|
10
|
+
*
|
|
11
|
+
* `cairn gc sweep` is sweep-only (no commit). The findings flow through
|
|
12
|
+
* `cairn-attention` for operator triage. `cairn gc run --apply-classes`
|
|
13
|
+
* stays operator-driven until the autotrigger is proven safe in the
|
|
14
|
+
* field.
|
|
15
|
+
*/
|
|
16
|
+
import { spawn } from "node:child_process";
|
|
17
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
import { writeFileSafe } from "@isaacriehm/cairn-state";
|
|
20
|
+
const MARKER_REL = ".cairn/.gc-last-run";
|
|
21
|
+
const DEFAULT_THRESHOLD_HOURS = 24;
|
|
22
|
+
export function runGcAutotriggerCheck(opts) {
|
|
23
|
+
const thresholdHours = opts.thresholdHours ?? DEFAULT_THRESHOLD_HOURS;
|
|
24
|
+
const now = opts.now ?? new Date();
|
|
25
|
+
const markerAbs = join(opts.repoRoot, MARKER_REL);
|
|
26
|
+
const prior = readMarkerMtime(markerAbs);
|
|
27
|
+
let triggered = false;
|
|
28
|
+
let reason;
|
|
29
|
+
if (prior === null) {
|
|
30
|
+
triggered = true;
|
|
31
|
+
reason = "first_run";
|
|
32
|
+
}
|
|
33
|
+
else if (now.getTime() - prior.getTime() >= thresholdHours * 3_600_000) {
|
|
34
|
+
triggered = true;
|
|
35
|
+
reason = "threshold_passed";
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
triggered = false;
|
|
39
|
+
reason = "fresh";
|
|
40
|
+
}
|
|
41
|
+
const lastRunIso = prior ? prior.toISOString() : "";
|
|
42
|
+
if (!triggered)
|
|
43
|
+
return { triggered, reason, thresholdHours, lastRunIso };
|
|
44
|
+
const pluginRoot = opts.pluginRoot ?? process.env["CLAUDE_PLUGIN_ROOT"];
|
|
45
|
+
if (typeof pluginRoot !== "string" || pluginRoot.length === 0) {
|
|
46
|
+
return { triggered: false, reason: "no_plugin_root", thresholdHours, lastRunIso };
|
|
47
|
+
}
|
|
48
|
+
const cliPath = join(pluginRoot, "dist", "cli.mjs");
|
|
49
|
+
if (!existsSync(cliPath)) {
|
|
50
|
+
return { triggered: false, reason: "no_cli_bundle", thresholdHours, lastRunIso };
|
|
51
|
+
}
|
|
52
|
+
writeFileSafe(markerAbs, now.toISOString());
|
|
53
|
+
const argv = {
|
|
54
|
+
cmd: process.execPath,
|
|
55
|
+
args: [cliPath, "gc", "sweep", "--repo-root", opts.repoRoot],
|
|
56
|
+
cwd: opts.repoRoot,
|
|
57
|
+
};
|
|
58
|
+
if (opts.spawner) {
|
|
59
|
+
opts.spawner(argv);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const child = spawn(argv.cmd, argv.args, {
|
|
63
|
+
cwd: argv.cwd,
|
|
64
|
+
detached: true,
|
|
65
|
+
stdio: "ignore",
|
|
66
|
+
env: { ...process.env, CAIRN_GC_AUTOTRIGGERED: "1" },
|
|
67
|
+
});
|
|
68
|
+
child.unref();
|
|
69
|
+
}
|
|
70
|
+
return { triggered, reason, thresholdHours, lastRunIso, spawned: argv };
|
|
71
|
+
}
|
|
72
|
+
function readMarkerMtime(absPath) {
|
|
73
|
+
if (!existsSync(absPath))
|
|
74
|
+
return null;
|
|
75
|
+
let raw;
|
|
76
|
+
try {
|
|
77
|
+
raw = readFileSync(absPath, "utf8").trim();
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const parsed = Date.parse(raw);
|
|
83
|
+
if (!Number.isFinite(parsed))
|
|
84
|
+
return null;
|
|
85
|
+
return new Date(parsed);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=gc-autotrigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gc-autotrigger.js","sourceRoot":"","sources":["../../../src/hooks/runners/gc-autotrigger.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,8 @@ export { runSessionStartHook } from "./session-start.js";
|
|
|
7
7
|
export { runSessionEndHook } from "./session-end.js";
|
|
8
8
|
export { runStopHook } from "./stop.js";
|
|
9
9
|
export { runUserPromptSubmitHook } from "./user-prompt-submit.js";
|
|
10
|
+
export { runGcAutotriggerCheck } from "./gc-autotrigger.js";
|
|
11
|
+
export type { GcAutotriggerArgv, GcAutotriggerOptions, GcAutotriggerReason, GcAutotriggerResult, } from "./gc-autotrigger.js";
|
|
10
12
|
export { renderBypassHint, scanBypassedCommits, } from "../bypass-detection.js";
|
|
11
13
|
export type { BypassedCommit, ScanBypassResult, } from "../bypass-detection.js";
|
|
12
14
|
export { seedAttestedCommits } from "../seed-attested.js";
|
|
@@ -7,6 +7,7 @@ export { runSessionStartHook } from "./session-start.js";
|
|
|
7
7
|
export { runSessionEndHook } from "./session-end.js";
|
|
8
8
|
export { runStopHook } from "./stop.js";
|
|
9
9
|
export { runUserPromptSubmitHook } from "./user-prompt-submit.js";
|
|
10
|
+
export { runGcAutotriggerCheck } from "./gc-autotrigger.js";
|
|
10
11
|
export { renderBypassHint, scanBypassedCommits, } from "../bypass-detection.js";
|
|
11
12
|
export { seedAttestedCommits } from "../seed-attested.js";
|
|
12
13
|
export { CAIRN_HOOK_VERSION, emitShapeB, parseHookPayload, readHookStdin, appendTelemetry, } from "./payload.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/runners/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/runners/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAO5D,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,cAAc,CAAC"}
|