@isaacriehm/cairn-core 0.19.1 → 0.22.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/align-undo/log.js +3 -2
- package/dist/align-undo/log.js.map +1 -1
- package/dist/attention/index.d.ts +0 -2
- package/dist/attention/index.js +0 -2
- package/dist/attention/index.js.map +1 -1
- package/dist/attention/restore.d.ts +1 -1
- package/dist/attention/restore.js +1 -1
- package/dist/attention/source-strip.d.ts +2 -2
- package/dist/attention/source-strip.js +4 -3
- package/dist/attention/source-strip.js.map +1 -1
- package/dist/components/audit.d.ts +7 -1
- package/dist/components/audit.js +144 -72
- package/dist/components/audit.js.map +1 -1
- package/dist/components/emit.js +33 -6
- package/dist/components/emit.js.map +1 -1
- package/dist/components/freshness.d.ts +51 -0
- package/dist/components/freshness.js +121 -0
- package/dist/components/freshness.js.map +1 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/reconfirm.d.ts +64 -0
- package/dist/components/reconfirm.js +204 -0
- package/dist/components/reconfirm.js.map +1 -0
- package/dist/context/handoff-builder.js +3 -3
- package/dist/context/handoff-builder.js.map +1 -1
- package/dist/context/task-summary.js +2 -2
- package/dist/context/task-summary.js.map +1 -1
- package/dist/doctor/index.js +102 -9
- package/dist/doctor/index.js.map +1 -1
- package/dist/events/paths.js +2 -2
- package/dist/events/paths.js.map +1 -1
- package/dist/fix-align/sentinel.js +2 -3
- package/dist/fix-align/sentinel.js.map +1 -1
- package/dist/gc/attested-commits.js +2 -2
- package/dist/gc/attested-commits.js.map +1 -1
- package/dist/gc/canary.js +2 -3
- package/dist/gc/canary.js.map +1 -1
- package/dist/gc/citation-integrity.d.ts +4 -5
- package/dist/gc/citation-integrity.js +11 -33
- package/dist/gc/citation-integrity.js.map +1 -1
- package/dist/gc/classify.js +3 -16
- package/dist/gc/classify.js.map +1 -1
- package/dist/gc/completion-integrity.js +4 -3
- package/dist/gc/completion-integrity.js.map +1 -1
- package/dist/gc/entity-orphan.js +66 -12
- package/dist/gc/entity-orphan.js.map +1 -1
- package/dist/gc/ghost-anchor.d.ts +57 -0
- package/dist/gc/ghost-anchor.js +171 -0
- package/dist/gc/ghost-anchor.js.map +1 -0
- package/dist/gc/index.d.ts +2 -0
- package/dist/gc/index.js +1 -0
- package/dist/gc/index.js.map +1 -1
- package/dist/gc/sweep.d.ts +1 -1
- package/dist/gc/sweep.js +13 -1
- package/dist/gc/sweep.js.map +1 -1
- package/dist/gc/types.d.ts +1 -1
- package/dist/hooks/bypass-detection.js +3 -2
- package/dist/hooks/bypass-detection.js.map +1 -1
- package/dist/hooks/defer.js +3 -2
- package/dist/hooks/defer.js.map +1 -1
- package/dist/hooks/ghost-backup.d.ts +37 -0
- package/dist/hooks/ghost-backup.js +82 -0
- package/dist/hooks/ghost-backup.js.map +1 -0
- package/dist/hooks/post-tool-use/allowlist-reader.js +2 -2
- package/dist/hooks/post-tool-use/allowlist-reader.js.map +1 -1
- package/dist/hooks/post-tool-use/ask-user-blocked.d.ts +1 -2
- package/dist/hooks/post-tool-use/ask-user-blocked.js +3 -4
- package/dist/hooks/post-tool-use/ask-user-blocked.js.map +1 -1
- package/dist/hooks/post-tool-use/citation-scanner.d.ts +9 -7
- package/dist/hooks/post-tool-use/citation-scanner.js +9 -14
- package/dist/hooks/post-tool-use/citation-scanner.js.map +1 -1
- package/dist/hooks/post-tool-use/legend-builder.d.ts +2 -2
- package/dist/hooks/post-tool-use/legend-builder.js +1 -19
- package/dist/hooks/post-tool-use/legend-builder.js.map +1 -1
- package/dist/hooks/post-tool-use/post-write.js +18 -1
- package/dist/hooks/post-tool-use/post-write.js.map +1 -1
- package/dist/hooks/post-tool-use/read-enricher.d.ts +2 -2
- package/dist/hooks/post-tool-use/read-enricher.js +4 -6
- package/dist/hooks/post-tool-use/read-enricher.js.map +1 -1
- package/dist/hooks/post-tool-use/sot-align.js +29 -3
- package/dist/hooks/post-tool-use/sot-align.js.map +1 -1
- package/dist/hooks/post-tool-use/write-guardian.d.ts +1 -5
- package/dist/hooks/post-tool-use/write-guardian.js +25 -18
- package/dist/hooks/post-tool-use/write-guardian.js.map +1 -1
- package/dist/hooks/runners/context-threshold.js +3 -3
- package/dist/hooks/runners/context-threshold.js.map +1 -1
- package/dist/hooks/runners/payload.js +2 -1
- package/dist/hooks/runners/payload.js.map +1 -1
- package/dist/hooks/runners/phase-ready-surface.js +3 -2
- package/dist/hooks/runners/phase-ready-surface.js.map +1 -1
- package/dist/hooks/runners/session-start.js +103 -4
- package/dist/hooks/runners/session-start.js.map +1 -1
- package/dist/hooks/runners/stop.js +46 -42
- package/dist/hooks/runners/stop.js.map +1 -1
- package/dist/hooks/runners/user-prompt-submit.d.ts +2 -2
- package/dist/hooks/runners/user-prompt-submit.js +4 -9
- package/dist/hooks/runners/user-prompt-submit.js.map +1 -1
- package/dist/hooks/seed-attested.js +3 -2
- package/dist/hooks/seed-attested.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/init/baseline-audit.js +3 -3
- package/dist/init/baseline-audit.js.map +1 -1
- package/dist/init/claude-rule.js +13 -1
- package/dist/init/claude-rule.js.map +1 -1
- package/dist/init/curator/corpus.d.ts +1 -0
- package/dist/init/curator/corpus.js +6 -2
- package/dist/init/curator/corpus.js.map +1 -1
- package/dist/init/curator/emit.js +2 -3
- package/dist/init/curator/emit.js.map +1 -1
- package/dist/init/detect-components.d.ts +3 -2
- package/dist/init/detect-components.js +33 -15
- package/dist/init/detect-components.js.map +1 -1
- package/dist/init/detect.d.ts +1 -5
- package/dist/init/detect.js +157 -143
- package/dist/init/detect.js.map +1 -1
- package/dist/init/eta-calibration.js +2 -2
- package/dist/init/eta-calibration.js.map +1 -1
- package/dist/init/glob-inference.js +24 -0
- package/dist/init/glob-inference.js.map +1 -1
- package/dist/init/index.d.ts +4 -4
- package/dist/init/index.js +2 -2
- package/dist/init/index.js.map +1 -1
- package/dist/init/init.d.ts +8 -0
- package/dist/init/init.js +16 -20
- package/dist/init/init.js.map +1 -1
- package/dist/init/mapper-merge.d.ts +1 -4
- package/dist/init/mapper-merge.js +4 -17
- package/dist/init/mapper-merge.js.map +1 -1
- package/dist/init/mapper-parallel.js +1 -1
- package/dist/init/mapper-parallel.js.map +1 -1
- package/dist/init/mapper-prompts.d.ts +1 -23
- package/dist/init/mapper-prompts.js +1 -25
- package/dist/init/mapper-prompts.js.map +1 -1
- package/dist/init/mapper.d.ts +0 -6
- package/dist/init/mapper.js +2 -5
- package/dist/init/mapper.js.map +1 -1
- package/dist/init/module-slicer.js +3 -24
- package/dist/init/module-slicer.js.map +1 -1
- package/dist/init/multi-dev/install.js +24 -0
- package/dist/init/multi-dev/install.js.map +1 -1
- package/dist/init/overlay.js +5 -16
- package/dist/init/overlay.js.map +1 -1
- package/dist/init/phases/11-baseline.js +1 -1
- package/dist/init/phases/11-baseline.js.map +1 -1
- package/dist/init/phases/4-seed.js +7 -5
- package/dist/init/phases/4-seed.js.map +1 -1
- package/dist/init/phases/9a-walker.js +4 -0
- package/dist/init/phases/9a-walker.js.map +1 -1
- package/dist/init/phases/9b-curate.d.ts +1 -0
- package/dist/init/phases/9b-curate.js +6 -2
- package/dist/init/phases/9b-curate.js.map +1 -1
- package/dist/init/phases/9d-comp-walk.js +3 -3
- package/dist/init/phases/9d-comp-walk.js.map +1 -1
- package/dist/init/phases/9e-comp-annotate.js +63 -3
- package/dist/init/phases/9e-comp-annotate.js.map +1 -1
- package/dist/init/phases/index.d.ts +0 -1
- package/dist/init/phases/index.js +0 -1
- package/dist/init/phases/index.js.map +1 -1
- package/dist/init/phases/mapper-output-io.d.ts +1 -1
- package/dist/init/phases/mapper-output-io.js +3 -2
- package/dist/init/phases/mapper-output-io.js.map +1 -1
- package/dist/init/phases/state-io.d.ts +1 -1
- package/dist/init/phases/state-io.js +3 -2
- package/dist/init/phases/state-io.js.map +1 -1
- package/dist/init/phases/types.d.ts +20 -8
- package/dist/init/phases/types.js +0 -1
- package/dist/init/phases/types.js.map +1 -1
- package/dist/init/progress.d.ts +1 -0
- package/dist/init/progress.js +3 -1
- package/dist/init/progress.js.map +1 -1
- package/dist/init/rules-merge/ingest.js +3 -3
- package/dist/init/rules-merge/ingest.js.map +1 -1
- package/dist/init/seed.js +54 -5
- package/dist/init/seed.js.map +1 -1
- package/dist/init/source-comments/strip-replace.d.ts +1 -2
- package/dist/init/source-comments/strip-replace.js +19 -3
- package/dist/init/source-comments/strip-replace.js.map +1 -1
- package/dist/init/source-comments/walker.js +8 -79
- package/dist/init/source-comments/walker.js.map +1 -1
- package/dist/init/types.d.ts +8 -16
- package/dist/init/walker.d.ts +1 -1
- package/dist/init/walker.js +1 -1
- package/dist/join/index.d.ts +9 -0
- package/dist/join/index.js +82 -25
- package/dist/join/index.js.map +1 -1
- package/dist/lock.js +4 -3
- package/dist/lock.js.map +1 -1
- package/dist/mcp/bootstrap-guard.js +10 -1
- package/dist/mcp/bootstrap-guard.js.map +1 -1
- package/dist/mcp/schemas.d.ts +26 -4
- package/dist/mcp/schemas.js +23 -1
- package/dist/mcp/schemas.js.map +1 -1
- package/dist/mcp/serve.js +9 -0
- package/dist/mcp/serve.js.map +1 -1
- package/dist/mcp/server.js +3 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/telemetry.js +4 -3
- package/dist/mcp/telemetry.js.map +1 -1
- package/dist/mcp/tools/component-reconfirm.d.ts +7 -0
- package/dist/mcp/tools/component-reconfirm.js +39 -0
- package/dist/mcp/tools/component-reconfirm.js.map +1 -0
- package/dist/mcp/tools/component-register.d.ts +15 -0
- package/dist/mcp/tools/component-register.js +65 -0
- package/dist/mcp/tools/component-register.js.map +1 -0
- package/dist/mcp/tools/decision-get.js +2 -2
- package/dist/mcp/tools/decision-get.js.map +1 -1
- package/dist/mcp/tools/index.js +5 -6
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/init-phases.d.ts +2 -0
- package/dist/mcp/tools/init-phases.js +21 -5
- package/dist/mcp/tools/init-phases.js.map +1 -1
- package/dist/mcp/tools/mission-advance.d.ts +3 -4
- package/dist/mcp/tools/mission-advance.js +15 -19
- package/dist/mcp/tools/mission-advance.js.map +1 -1
- package/dist/mcp/tools/mission-resume.js +3 -3
- package/dist/mcp/tools/mission-resume.js.map +1 -1
- package/dist/mcp/tools/record-decision.js +17 -9
- package/dist/mcp/tools/record-decision.js.map +1 -1
- package/dist/mcp/tools/resolve-attention.js +70 -34
- package/dist/mcp/tools/resolve-attention.js.map +1 -1
- package/dist/mcp/tools/resume.js +3 -2
- package/dist/mcp/tools/resume.js.map +1 -1
- package/dist/mcp/tools/search.js +2 -2
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/mcp/tools/task-complete.js +2 -3
- package/dist/mcp/tools/task-complete.js.map +1 -1
- package/dist/mcp/tools/task-create.js +2 -2
- package/dist/mcp/tools/task-create.js.map +1 -1
- package/dist/migrate/config-io.d.ts +24 -0
- package/dist/migrate/config-io.js +73 -0
- package/dist/migrate/config-io.js.map +1 -0
- package/dist/migrate/gitignore.d.ts +28 -0
- package/dist/migrate/gitignore.js +82 -0
- package/dist/migrate/gitignore.js.map +1 -0
- package/dist/migrate/index.d.ts +6 -0
- package/dist/migrate/index.js +6 -0
- package/dist/migrate/index.js.map +1 -0
- package/dist/migrate/migrations/0001-drop-dead-config-fields.d.ts +12 -0
- package/dist/migrate/migrations/0001-drop-dead-config-fields.js +39 -0
- package/dist/migrate/migrations/0001-drop-dead-config-fields.js.map +1 -0
- package/dist/migrate/migrations/0002-backfill-gitignore.d.ts +14 -0
- package/dist/migrate/migrations/0002-backfill-gitignore.js +40 -0
- package/dist/migrate/migrations/0002-backfill-gitignore.js.map +1 -0
- package/dist/migrate/registry.d.ts +9 -0
- package/dist/migrate/registry.js +11 -0
- package/dist/migrate/registry.js.map +1 -0
- package/dist/migrate/runner.d.ts +45 -0
- package/dist/migrate/runner.js +177 -0
- package/dist/migrate/runner.js.map +1 -0
- package/dist/migrate/semver.d.ts +11 -0
- package/dist/migrate/semver.js +35 -0
- package/dist/migrate/semver.js.map +1 -0
- package/dist/migrate/types.d.ts +47 -0
- package/dist/migrate/types.js +13 -0
- package/dist/migrate/types.js.map +1 -0
- package/dist/missions/task-link.js +7 -8
- package/dist/missions/task-link.js.map +1 -1
- package/dist/paths/index.d.ts +12 -1
- package/dist/paths/index.js +17 -3
- package/dist/paths/index.js.map +1 -1
- package/dist/sensors/catalog.js +6 -11
- package/dist/sensors/catalog.js.map +1 -1
- package/dist/sensors/decisions.js +55 -19
- package/dist/sensors/decisions.js.map +1 -1
- package/dist/sensors/diff.d.ts +12 -0
- package/dist/sensors/diff.js +103 -0
- package/dist/sensors/diff.js.map +1 -1
- package/dist/sensors/index.d.ts +4 -5
- package/dist/sensors/index.js +2 -3
- package/dist/sensors/index.js.map +1 -1
- package/dist/sensors/runner.d.ts +34 -37
- package/dist/sensors/runner.js +63 -53
- package/dist/sensors/runner.js.map +1 -1
- package/dist/sensors/stub-catalog.d.ts +6 -3
- package/dist/sensors/stub-catalog.js +7 -19
- package/dist/sensors/stub-catalog.js.map +1 -1
- package/dist/sensors/types.d.ts +11 -55
- package/dist/sensors/types.js +4 -8
- package/dist/sensors/types.js.map +1 -1
- package/dist/session-start/build.js +36 -21
- package/dist/session-start/build.js.map +1 -1
- package/dist/session-start/templates.d.ts +1 -1
- package/dist/session-start/templates.js +1 -1
- package/dist/status-line/event-queue.js +2 -1
- package/dist/status-line/event-queue.js.map +1 -1
- package/dist/status-line/reader.js +5 -5
- package/dist/status-line/reader.js.map +1 -1
- package/dist/status-line/writer.js +2 -1
- package/dist/status-line/writer.js.map +1 -1
- package/dist/tasks/lifecycle.d.ts +3 -4
- package/dist/tasks/lifecycle.js +19 -21
- package/dist/tasks/lifecycle.js.map +1 -1
- package/dist/trace/index.js +2 -2
- package/dist/trace/index.js.map +1 -1
- package/dist/update-check.d.ts +28 -0
- package/dist/update-check.js +137 -0
- package/dist/update-check.js.map +1 -0
- package/package.json +2 -2
- package/templates/.cairn/git-hooks/commit-msg +33 -5
- package/templates/.cairn/git-hooks/post-commit +13 -3
- package/templates/.cairn/git-hooks/pre-commit +48 -22
- package/templates/.github/workflows/cairn-check.yml +8 -0
- package/dist/attention/bulk-accept.d.ts +0 -78
- package/dist/attention/bulk-accept.js +0 -348
- package/dist/attention/bulk-accept.js.map +0 -1
- package/dist/attention/serve/api.d.ts +0 -24
- package/dist/attention/serve/api.js +0 -383
- package/dist/attention/serve/api.js.map +0 -1
- package/dist/attention/serve/index.d.ts +0 -63
- package/dist/attention/serve/index.js +0 -219
- package/dist/attention/serve/index.js.map +0 -1
- package/dist/hooks/read-enrich.d.ts +0 -6
- package/dist/hooks/read-enrich.js +0 -11
- package/dist/hooks/read-enrich.js.map +0 -1
- package/dist/hooks/write-guard.d.ts +0 -6
- package/dist/hooks/write-guard.js +0 -11
- package/dist/hooks/write-guard.js.map +0 -1
- package/dist/init/phases/12-strip.d.ts +0 -10
- package/dist/init/phases/12-strip.js +0 -88
- package/dist/init/phases/12-strip.js.map +0 -1
- package/dist/mcp/tools/attention-serve.d.ts +0 -23
- package/dist/mcp/tools/attention-serve.js +0 -84
- package/dist/mcp/tools/attention-serve.js.map +0 -1
- package/dist/mcp/tools/attention-wait.d.ts +0 -18
- package/dist/mcp/tools/attention-wait.js +0 -84
- package/dist/mcp/tools/attention-wait.js.map +0 -1
- package/dist/mcp/tools/bulk-accept-attention.d.ts +0 -22
- package/dist/mcp/tools/bulk-accept-attention.js +0 -84
- package/dist/mcp/tools/bulk-accept-attention.js.map +0 -1
- package/dist/sensors/attestation.d.ts +0 -44
- package/dist/sensors/attestation.js +0 -262
- package/dist/sensors/attestation.js.map +0 -1
|
@@ -1,348 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bulk-accept obvious DEC drafts + stamp confidence on invariants.
|
|
3
|
-
*
|
|
4
|
-
* Mirrors the per-draft accept flow in `mcp/tools/resolve-attention.ts`
|
|
5
|
-
* (`choice: "a"`) but applies it in one pass over `_inbox/` filtered
|
|
6
|
-
* by the `scoring.ts` heuristic. Operator runs this once per
|
|
7
|
-
* adoption to drain the obvious classifications, then triages the
|
|
8
|
-
* medium / low-confidence remainder interactively via the existing
|
|
9
|
-
* cairn-attention skill.
|
|
10
|
-
*
|
|
11
|
-
* Design:
|
|
12
|
-
* - Score each draft from frontmatter + body (prose, raw block) so
|
|
13
|
-
* it can run against drafts written before the scoring pipeline
|
|
14
|
-
* existed (back-compat for v0.3.6 adoptions).
|
|
15
|
-
* - High-confidence DEC drafts: move `_inbox/<id>.draft.md`
|
|
16
|
-
* → `<id>.md`, flip `status:` frontmatter to `accepted`, and
|
|
17
|
-
* stamp `capture_confidence: high`. Rebuild
|
|
18
|
-
* `decisions.ledger.yaml` once at the end.
|
|
19
|
-
* - Medium / low-confidence DEC drafts: stay in `_inbox/` but
|
|
20
|
-
* get `capture_confidence` stamped so the cairn-attention skill
|
|
21
|
-
* can prioritize what to surface first.
|
|
22
|
-
* - Invariants are already at `status: active` (phase 7b promotes
|
|
23
|
-
* them on write). Just stamp `capture_confidence` so future
|
|
24
|
-
* UX can hide low-confidence ones from the active set.
|
|
25
|
-
*
|
|
26
|
-
* Side-effect-only: emits decision_accepted events, runs the source
|
|
27
|
-
* strip-replace pass on accepted source-comment drafts so the §INV /
|
|
28
|
-
* §DEC citations land in the original source.
|
|
29
|
-
*/
|
|
30
|
-
import { existsSync, readFileSync, readdirSync, rmSync, writeFileSync, } from "node:fs";
|
|
31
|
-
import { join } from "node:path";
|
|
32
|
-
import { writeFileSafe } from "@isaacriehm/cairn-state";
|
|
33
|
-
import { stringify as stringifyYaml } from "yaml";
|
|
34
|
-
import { decisionsDir, invariantsDir } from "@isaacriehm/cairn-state";
|
|
35
|
-
import { writeDecisionsLedger } from "@isaacriehm/cairn-state";
|
|
36
|
-
import { parseFrontmatterRecord } from "@isaacriehm/cairn-state";
|
|
37
|
-
import { withWriteLock } from "../lock.js";
|
|
38
|
-
import { writeInvalidationEvent } from "../events/index.js";
|
|
39
|
-
import { scoreDecDraft, scoreInvariant, } from "./scoring.js";
|
|
40
|
-
import { runDecSourceStrip } from "./source-strip.js";
|
|
41
|
-
/**
|
|
42
|
-
* Score, stamp, and (for high-confidence DECs) accept inbox drafts in
|
|
43
|
-
* bulk. Returns the count summary the CLI / skill renders to the
|
|
44
|
-
* operator.
|
|
45
|
-
*/
|
|
46
|
-
export async function bulkAcceptObvious(args) {
|
|
47
|
-
const threshold = args.threshold ?? "high";
|
|
48
|
-
const dry = args.dryRun ?? false;
|
|
49
|
-
// ── DEC drafts ────────────────────────────────────────────────────
|
|
50
|
-
const inboxDir = join(decisionsDir(args.repoRoot), "_inbox");
|
|
51
|
-
const decsByConfidence = { high: 0, medium: 0, low: 0 };
|
|
52
|
-
const acceptedIds = [];
|
|
53
|
-
const sourceStripSkipped = [];
|
|
54
|
-
let decsScanned = 0;
|
|
55
|
-
let decsAccepted = 0;
|
|
56
|
-
let sourceStripFilesModified = 0;
|
|
57
|
-
let sourceStripItemsApplied = 0;
|
|
58
|
-
if (existsSync(inboxDir)) {
|
|
59
|
-
const entries = readdirSync(inboxDir, { withFileTypes: true });
|
|
60
|
-
const drafts = entries.filter((e) => e.isFile() && e.name.endsWith(".draft.md"));
|
|
61
|
-
decsScanned = drafts.length;
|
|
62
|
-
if (drafts.length > 0) {
|
|
63
|
-
await withWriteLock(args.repoRoot, async () => {
|
|
64
|
-
for (const e of drafts) {
|
|
65
|
-
const abs = join(inboxDir, e.name);
|
|
66
|
-
let raw;
|
|
67
|
-
try {
|
|
68
|
-
raw = readFileSync(abs, "utf8");
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
const fm = parseFrontmatterRecord(raw).fm;
|
|
74
|
-
const body = stripFrontmatter(raw);
|
|
75
|
-
const id = stringField(fm, "id") ?? e.name.replace(/\.draft\.md$/, "");
|
|
76
|
-
const sourceFile = stringField(fm, "sourceFile") ?? "";
|
|
77
|
-
const titleFm = stringField(fm, "proposedTitle") ?? stringField(fm, "title") ?? "";
|
|
78
|
-
const rationaleFm = stringField(fm, "proposedRationale") ?? extractSection(body, "Proposed rationale");
|
|
79
|
-
const proseFromBody = extractSection(body, "Source comment");
|
|
80
|
-
// Phase 7b drafts emit verbatim essay bodies without a `## Source
|
|
81
|
-
// comment` heading, so `extractSection` returns "". Fall back to
|
|
82
|
-
// the full body so the scorer sees the actual prose — without this
|
|
83
|
-
// every draft scored low because DECISION_VERBS / INVARIANT_MODALS
|
|
84
|
-
// / REASON_MARKERS regexes matched nothing.
|
|
85
|
-
const proseFallback = body.trim();
|
|
86
|
-
const prose = rationaleFm.length > 0
|
|
87
|
-
? rationaleFm
|
|
88
|
-
: proseFromBody.length > 0
|
|
89
|
-
? proseFromBody
|
|
90
|
-
: proseFallback;
|
|
91
|
-
const rawComment = proseFromBody.length > 0 ? proseFromBody : proseFallback;
|
|
92
|
-
const score = scoreDecDraft({
|
|
93
|
-
sourceFile,
|
|
94
|
-
prose,
|
|
95
|
-
title: titleFm,
|
|
96
|
-
rawComment,
|
|
97
|
-
globs: args.globs,
|
|
98
|
-
});
|
|
99
|
-
decsByConfidence[score] += 1;
|
|
100
|
-
// Stamp confidence on the in-memory frontmatter. The actual write
|
|
101
|
-
// back to disk is gated below — we don't re-stamp drafts the
|
|
102
|
-
// operator already saw with a confidence value.
|
|
103
|
-
const prevConf = stringField(fm, "capture_confidence");
|
|
104
|
-
// Tight check: only valid enum values count as already-stamped.
|
|
105
|
-
// An empty string or hand-edited garbage is treated as unstamped
|
|
106
|
-
// so the scorer can re-stamp on next run.
|
|
107
|
-
const previouslyStamped = prevConf === "high" || prevConf === "medium" || prevConf === "low";
|
|
108
|
-
const stampedFm = { ...fm, capture_confidence: score };
|
|
109
|
-
if (atOrAbove(score, threshold)) {
|
|
110
|
-
// Promote to accepted.
|
|
111
|
-
const acceptedFm = { ...stampedFm, status: "accepted" };
|
|
112
|
-
const acceptedBody = renderDoc(acceptedFm, body);
|
|
113
|
-
const acceptedPath = join(decisionsDir(args.repoRoot), `${id}.md`);
|
|
114
|
-
if (!dry) {
|
|
115
|
-
writeFileSafe(acceptedPath, acceptedBody);
|
|
116
|
-
try {
|
|
117
|
-
rmSync(abs, { force: true });
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
/* best-effort */
|
|
121
|
-
}
|
|
122
|
-
// Source-comment derived DECs: replace the original essay
|
|
123
|
-
// block with `// §DEC-NNNN` so the file ends up carrying
|
|
124
|
-
// the bare cite, mirroring the §INV strip pass that 7b
|
|
125
|
-
// runs at adoption time.
|
|
126
|
-
const captureSource = stringField(stampedFm, "capture_source");
|
|
127
|
-
const blockId = stringField(stampedFm, "blockId");
|
|
128
|
-
if (captureSource === "init-source-comments" &&
|
|
129
|
-
blockId !== null) {
|
|
130
|
-
// Source files that came from Phase 7b are already dirty
|
|
131
|
-
// (the INV strip pass mutated them); runDecSourceStrip
|
|
132
|
-
// forces overwrite for the target file so the dirty
|
|
133
|
-
// check doesn't bail. Operator consented to source
|
|
134
|
-
// mutation at adoption time.
|
|
135
|
-
const stripOutcome = runDecSourceStrip({
|
|
136
|
-
repoRoot: args.repoRoot,
|
|
137
|
-
decId: id,
|
|
138
|
-
meta: {
|
|
139
|
-
blockId,
|
|
140
|
-
sourceFile: stringField(stampedFm, "sourceFile") ?? "",
|
|
141
|
-
captureSource,
|
|
142
|
-
title: stringField(stampedFm, "title") ?? "",
|
|
143
|
-
},
|
|
144
|
-
});
|
|
145
|
-
sourceStripFilesModified +=
|
|
146
|
-
stripOutcome.files_modified;
|
|
147
|
-
sourceStripItemsApplied +=
|
|
148
|
-
stripOutcome.items_applied;
|
|
149
|
-
if (stripOutcome.attempted &&
|
|
150
|
-
stripOutcome.items_applied === 0 &&
|
|
151
|
-
stripOutcome.reason !== undefined) {
|
|
152
|
-
sourceStripSkipped.push({
|
|
153
|
-
id,
|
|
154
|
-
reason: stripOutcome.reason,
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
else if (!stripOutcome.attempted && stripOutcome.reason !== undefined) {
|
|
158
|
-
sourceStripSkipped.push({
|
|
159
|
-
id,
|
|
160
|
-
reason: stripOutcome.reason,
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
// Emit `decision_accepted` event per promoted draft so
|
|
166
|
-
// cross-session listeners (Stop hook, scope-index rebuild)
|
|
167
|
-
// see the new accepted DEC. Without this, bulk-accept's
|
|
168
|
-
// 21-DEC batches were invisible to the event ledger and
|
|
169
|
-
// downstream invalidation never fired.
|
|
170
|
-
if (!dry) {
|
|
171
|
-
try {
|
|
172
|
-
writeInvalidationEvent(args.repoRoot, {
|
|
173
|
-
kind: "decision_accepted",
|
|
174
|
-
refs: [{ kind: "decision", id }],
|
|
175
|
-
path: `.cairn/ground/decisions/${id}.md`,
|
|
176
|
-
source: { session_id: null, tool: "cairn_bulk_accept_attention" },
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
catch {
|
|
180
|
-
/* best-effort */
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
decsAccepted += 1;
|
|
184
|
-
acceptedIds.push(id);
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
// Stay in inbox. Only persist the stamp on first scoring —
|
|
188
|
-
// a re-run of bulk-accept (e.g. operator clicks "accept
|
|
189
|
-
// high-confidence" again with a different threshold) must
|
|
190
|
-
// not silently mutate drafts the operator already saw.
|
|
191
|
-
if (!dry && !previouslyStamped) {
|
|
192
|
-
const stampedDoc = renderDoc(stampedFm, body);
|
|
193
|
-
writeFileSync(abs, stampedDoc, "utf8");
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
// Rebuild the ledger once at the end so accepted DECs surface
|
|
198
|
-
// in `cairn_in_scope` immediately.
|
|
199
|
-
if (!dry && decsAccepted > 0) {
|
|
200
|
-
try {
|
|
201
|
-
writeDecisionsLedger({ repoRoot: args.repoRoot });
|
|
202
|
-
}
|
|
203
|
-
catch {
|
|
204
|
-
/* best-effort */
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
// ── Invariants ────────────────────────────────────────────────────
|
|
211
|
-
// Already at status: active on disk. Just stamp confidence so the
|
|
212
|
-
// attention skill can hide / down-weight low-confidence ones.
|
|
213
|
-
const invDir = invariantsDir(args.repoRoot);
|
|
214
|
-
const invariantsByConfidence = { high: 0, medium: 0, low: 0 };
|
|
215
|
-
let invariantsScanned = 0;
|
|
216
|
-
if (existsSync(invDir)) {
|
|
217
|
-
const invEntries = readdirSync(invDir, { withFileTypes: true });
|
|
218
|
-
const invFiles = invEntries.filter((e) => e.isFile() && /^INV-[0-9a-f]{7,}\.md$/.test(e.name));
|
|
219
|
-
invariantsScanned = invFiles.length;
|
|
220
|
-
if (invFiles.length > 0 && !dry) {
|
|
221
|
-
await withWriteLock(args.repoRoot, async () => {
|
|
222
|
-
for (const e of invFiles) {
|
|
223
|
-
const abs = join(invDir, e.name);
|
|
224
|
-
let raw;
|
|
225
|
-
try {
|
|
226
|
-
raw = readFileSync(abs, "utf8");
|
|
227
|
-
}
|
|
228
|
-
catch {
|
|
229
|
-
continue;
|
|
230
|
-
}
|
|
231
|
-
const fm = parseFrontmatterRecord(raw).fm;
|
|
232
|
-
const body = stripFrontmatter(raw);
|
|
233
|
-
const sourceFile = stringField(fm, "sourceFile") ?? "";
|
|
234
|
-
const titleFm = stringField(fm, "title") ?? "";
|
|
235
|
-
const rawCommentBody = extractSection(body, "Source comment");
|
|
236
|
-
const constraintBody = extractSection(body, "Constraint");
|
|
237
|
-
// Phase 7b invariants emit verbatim essay bodies — no `## Constraint`
|
|
238
|
-
// / `## Source comment` headings. Fall back to full body so the
|
|
239
|
-
// scorer's INVARIANT_MODALS / REASON_MARKERS regexes have signal.
|
|
240
|
-
const proseFallback = body.trim();
|
|
241
|
-
const prose = constraintBody.length > 0
|
|
242
|
-
? constraintBody
|
|
243
|
-
: rawCommentBody.length > 0
|
|
244
|
-
? rawCommentBody
|
|
245
|
-
: proseFallback;
|
|
246
|
-
const rawComment = rawCommentBody.length > 0 ? rawCommentBody : proseFallback;
|
|
247
|
-
const score = scoreInvariant({
|
|
248
|
-
sourceFile,
|
|
249
|
-
prose,
|
|
250
|
-
title: titleFm,
|
|
251
|
-
rawComment,
|
|
252
|
-
globs: args.globs,
|
|
253
|
-
});
|
|
254
|
-
invariantsByConfidence[score] += 1;
|
|
255
|
-
const prevConf = stringField(fm, "capture_confidence");
|
|
256
|
-
// Tight check: only valid enum values count as already-stamped.
|
|
257
|
-
// An empty string or hand-edited garbage is treated as unstamped
|
|
258
|
-
// so the scorer can re-stamp on next run.
|
|
259
|
-
const previouslyStamped = prevConf === "high" || prevConf === "medium" || prevConf === "low";
|
|
260
|
-
if (!previouslyStamped) {
|
|
261
|
-
const stamped = { ...fm, capture_confidence: score };
|
|
262
|
-
const stampedDoc = renderDoc(stamped, body);
|
|
263
|
-
writeFileSync(abs, stampedDoc, "utf8");
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
else if (invFiles.length > 0 && dry) {
|
|
269
|
-
// Dry run still scores so the operator can see the distribution.
|
|
270
|
-
for (const e of invFiles) {
|
|
271
|
-
const abs = join(invDir, e.name);
|
|
272
|
-
let raw;
|
|
273
|
-
try {
|
|
274
|
-
raw = readFileSync(abs, "utf8");
|
|
275
|
-
}
|
|
276
|
-
catch {
|
|
277
|
-
continue;
|
|
278
|
-
}
|
|
279
|
-
const fm = parseFrontmatterRecord(raw).fm;
|
|
280
|
-
const body = stripFrontmatter(raw);
|
|
281
|
-
const sourceFile = stringField(fm, "sourceFile") ?? "";
|
|
282
|
-
const titleFm = stringField(fm, "title") ?? "";
|
|
283
|
-
const rawCommentBody = extractSection(body, "Source comment");
|
|
284
|
-
const constraintBody = extractSection(body, "Constraint");
|
|
285
|
-
const proseFallback = body.trim();
|
|
286
|
-
const prose = constraintBody.length > 0
|
|
287
|
-
? constraintBody
|
|
288
|
-
: rawCommentBody.length > 0
|
|
289
|
-
? rawCommentBody
|
|
290
|
-
: proseFallback;
|
|
291
|
-
const rawComment = rawCommentBody.length > 0 ? rawCommentBody : proseFallback;
|
|
292
|
-
const score = scoreInvariant({
|
|
293
|
-
sourceFile,
|
|
294
|
-
prose,
|
|
295
|
-
title: titleFm,
|
|
296
|
-
rawComment,
|
|
297
|
-
globs: args.globs,
|
|
298
|
-
});
|
|
299
|
-
invariantsByConfidence[score] += 1;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
return {
|
|
304
|
-
decsScanned,
|
|
305
|
-
decsAccepted,
|
|
306
|
-
decsByConfidence,
|
|
307
|
-
acceptedIds,
|
|
308
|
-
sourceStripFilesModified,
|
|
309
|
-
sourceStripItemsApplied,
|
|
310
|
-
sourceStripSkipped,
|
|
311
|
-
invariantsScanned,
|
|
312
|
-
invariantsByConfidence,
|
|
313
|
-
dryRun: dry,
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
// ── Helpers ────────────────────────────────────────────────────────
|
|
317
|
-
function stripFrontmatter(doc) {
|
|
318
|
-
return doc.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, "");
|
|
319
|
-
}
|
|
320
|
-
function renderDoc(fm, body) {
|
|
321
|
-
return `---\n${stringifyYaml(fm).trimEnd()}\n---\n${body.startsWith("\n") ? body : `\n${body}`}`;
|
|
322
|
-
}
|
|
323
|
-
function stringField(fm, key) {
|
|
324
|
-
const v = fm[key];
|
|
325
|
-
return typeof v === "string" ? v : null;
|
|
326
|
-
}
|
|
327
|
-
function extractSection(body, header) {
|
|
328
|
-
const re = new RegExp(`##\\s+${escapeRegex(header)}\\s*\\n([\\s\\S]*?)(?=\\n##\\s|$)`, "i");
|
|
329
|
-
const m = body.match(re);
|
|
330
|
-
if (m === null)
|
|
331
|
-
return "";
|
|
332
|
-
const captured = m[1];
|
|
333
|
-
if (captured === undefined)
|
|
334
|
-
return "";
|
|
335
|
-
return captured.replace(/^\s*```[a-z0-9]*\n?/i, "").replace(/```\s*$/, "").trim();
|
|
336
|
-
}
|
|
337
|
-
function escapeRegex(s) {
|
|
338
|
-
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
339
|
-
}
|
|
340
|
-
function atOrAbove(score, threshold) {
|
|
341
|
-
const order = { low: 0, medium: 1, high: 2 };
|
|
342
|
-
const scoreVal = order[score];
|
|
343
|
-
const thresholdVal = order[threshold];
|
|
344
|
-
if (scoreVal === undefined || thresholdVal === undefined)
|
|
345
|
-
return false;
|
|
346
|
-
return scoreVal >= thresholdVal;
|
|
347
|
-
}
|
|
348
|
-
//# sourceMappingURL=bulk-accept.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bulk-accept.js","sourceRoot":"","sources":["../../src/attention/bulk-accept.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EACL,UAAU,EACV,YAAY,EACZ,WAAW,EACX,MAAM,EACN,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EACL,aAAa,EACb,cAAc,GAEf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA0CtD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAoB;IAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IAEjC,qEAAqE;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE7D,MAAM,gBAAgB,GAAoC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IACzF,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,kBAAkB,GAAqC,EAAE,CAAC;IAEhE,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,wBAAwB,GAAG,CAAC,CAAC;IACjC,IAAI,uBAAuB,GAAG,CAAC,CAAC;IAEhC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAClD,CAAC;QACF,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAE5B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;gBAC5C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBACnC,IAAI,GAAW,CAAC;oBAChB,IAAI,CAAC;wBACH,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;oBAClC,CAAC;oBAAC,MAAM,CAAC;wBACP,SAAS;oBACX,CAAC;oBACD,MAAM,EAAE,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBAC1C,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;oBACnC,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;oBACvE,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;oBACvD,MAAM,OAAO,GACX,WAAW,CAAC,EAAE,EAAE,eAAe,CAAC,IAAI,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;oBACrE,MAAM,WAAW,GACf,WAAW,CAAC,EAAE,EAAE,mBAAmB,CAAC,IAAI,cAAc,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;oBACrF,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;oBAC7D,kEAAkE;oBAClE,iEAAiE;oBACjE,mEAAmE;oBACnE,mEAAmE;oBACnE,4CAA4C;oBAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAClC,MAAM,KAAK,GACT,WAAW,CAAC,MAAM,GAAG,CAAC;wBACpB,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;4BACxB,CAAC,CAAC,aAAa;4BACf,CAAC,CAAC,aAAa,CAAC;oBACtB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;oBAC5E,MAAM,KAAK,GAAG,aAAa,CAAC;wBAC1B,UAAU;wBACV,KAAK;wBACL,KAAK,EAAE,OAAO;wBACd,UAAU;wBACV,KAAK,EAAE,IAAI,CAAC,KAAK;qBAClB,CAAC,CAAC;oBACH,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAE7B,kEAAkE;oBAClE,6DAA6D;oBAC7D,gDAAgD;oBAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;oBACvD,gEAAgE;oBAChE,iEAAiE;oBACjE,0CAA0C;oBAC1C,MAAM,iBAAiB,GACrB,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,KAAK,CAAC;oBACrE,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;oBACvD,IAAI,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;wBAChC,uBAAuB;wBACvB,MAAM,UAAU,GAAG,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;wBACxD,MAAM,YAAY,GAAG,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;wBACjD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;wBACnE,IAAI,CAAC,GAAG,EAAE,CAAC;4BACT,aAAa,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;4BAC1C,IAAI,CAAC;gCACH,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;4BAC/B,CAAC;4BAAC,MAAM,CAAC;gCACP,iBAAiB;4BACnB,CAAC;4BACD,0DAA0D;4BAC1D,yDAAyD;4BACzD,uDAAuD;4BACvD,yBAAyB;4BACzB,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;4BAC/D,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;4BAClD,IACE,aAAa,KAAK,sBAAsB;gCACxC,OAAO,KAAK,IAAI,EAChB,CAAC;gCACD,yDAAyD;gCACzD,uDAAuD;gCACvD,oDAAoD;gCACpD,mDAAmD;gCACnD,6BAA6B;gCAC7B,MAAM,YAAY,GAAG,iBAAiB,CAAC;oCACrC,QAAQ,EAAE,IAAI,CAAC,QAAQ;oCACvB,KAAK,EAAE,EAAE;oCACT,IAAI,EAAE;wCACJ,OAAO;wCACP,UAAU,EAAE,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,EAAE;wCACtD,aAAa;wCACb,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE;qCAC7C;iCACF,CAAC,CAAC;gCACH,wBAAwB;oCACtB,YAAY,CAAC,cAAc,CAAC;gCAC9B,uBAAuB;oCACrB,YAAY,CAAC,aAAa,CAAC;gCAC7B,IACE,YAAY,CAAC,SAAS;oCACtB,YAAY,CAAC,aAAa,KAAK,CAAC;oCAChC,YAAY,CAAC,MAAM,KAAK,SAAS,EACjC,CAAC;oCACD,kBAAkB,CAAC,IAAI,CAAC;wCACtB,EAAE;wCACF,MAAM,EAAE,YAAY,CAAC,MAAM;qCAC5B,CAAC,CAAC;gCACL,CAAC;qCAAM,IAAI,CAAC,YAAY,CAAC,SAAS,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oCACxE,kBAAkB,CAAC,IAAI,CAAC;wCACtB,EAAE;wCACF,MAAM,EAAE,YAAY,CAAC,MAAM;qCAC5B,CAAC,CAAC;gCACL,CAAC;4BACH,CAAC;wBACH,CAAC;wBACD,uDAAuD;wBACvD,2DAA2D;wBAC3D,wDAAwD;wBACxD,wDAAwD;wBACxD,uCAAuC;wBACvC,IAAI,CAAC,GAAG,EAAE,CAAC;4BACT,IAAI,CAAC;gCACH,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE;oCACpC,IAAI,EAAE,mBAAmB;oCACzB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;oCAChC,IAAI,EAAE,2BAA2B,EAAE,KAAK;oCACxC,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,6BAA6B,EAAE;iCAClE,CAAC,CAAC;4BACL,CAAC;4BAAC,MAAM,CAAC;gCACP,iBAAiB;4BACnB,CAAC;wBACH,CAAC;wBACD,YAAY,IAAI,CAAC,CAAC;wBAClB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACvB,CAAC;yBAAM,CAAC;wBACN,2DAA2D;wBAC3D,wDAAwD;wBACxD,0DAA0D;wBAC1D,uDAAuD;wBACvD,IAAI,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;4BAC/B,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;4BAC9C,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;wBACzC,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,8DAA8D;gBAC9D,mCAAmC;gBACnC,IAAI,CAAC,GAAG,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;oBAC7B,IAAI,CAAC;wBACH,oBAAoB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACpD,CAAC;oBAAC,MAAM,CAAC;wBACP,iBAAiB;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,kEAAkE;IAClE,8DAA8D;IAC9D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,sBAAsB,GAAoC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAC/F,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAC3D,CAAC;QACF,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC;QAEpC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;gBAC5C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBACjC,IAAI,GAAW,CAAC;oBAChB,IAAI,CAAC;wBACH,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;oBAClC,CAAC;oBAAC,MAAM,CAAC;wBACP,SAAS;oBACX,CAAC;oBACD,MAAM,EAAE,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBAC1C,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;oBACnC,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;oBACvD,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;oBAC/C,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;oBAC9D,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;oBAC1D,sEAAsE;oBACtE,gEAAgE;oBAChE,kEAAkE;oBAClE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAClC,MAAM,KAAK,GACT,cAAc,CAAC,MAAM,GAAG,CAAC;wBACvB,CAAC,CAAC,cAAc;wBAChB,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;4BACzB,CAAC,CAAC,cAAc;4BAChB,CAAC,CAAC,aAAa,CAAC;oBACtB,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;oBAC9E,MAAM,KAAK,GAAG,cAAc,CAAC;wBAC3B,UAAU;wBACV,KAAK;wBACL,KAAK,EAAE,OAAO;wBACd,UAAU;wBACV,KAAK,EAAE,IAAI,CAAC,KAAK;qBAClB,CAAC,CAAC;oBACH,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;oBACvD,gEAAgE;oBAChE,iEAAiE;oBACjE,0CAA0C;oBAC1C,MAAM,iBAAiB,GACrB,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,KAAK,CAAC;oBACrE,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBACvB,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;wBACrD,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;wBAC5C,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;YACtC,iEAAiE;YACjE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjC,IAAI,GAAW,CAAC;gBAChB,IAAI,CAAC;oBACH,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAClC,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,MAAM,EAAE,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBACnC,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;gBACvD,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC/C,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;gBAC9D,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClC,MAAM,KAAK,GACT,cAAc,CAAC,MAAM,GAAG,CAAC;oBACvB,CAAC,CAAC,cAAc;oBAChB,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;wBACzB,CAAC,CAAC,cAAc;wBAChB,CAAC,CAAC,aAAa,CAAC;gBACtB,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC9E,MAAM,KAAK,GAAG,cAAc,CAAC;oBAC3B,UAAU;oBACV,KAAK;oBACL,KAAK,EAAE,OAAO;oBACd,UAAU;oBACV,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC,CAAC;gBACH,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW;QACX,YAAY;QACZ,gBAAgB;QAChB,WAAW;QACX,wBAAwB;QACxB,uBAAuB;QACvB,kBAAkB;QAClB,iBAAiB;QACjB,sBAAsB;QACtB,MAAM,EAAE,GAAG;KACZ,CAAC;AACJ,CAAC;AAED,sEAAsE;AAEtE,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,SAAS,CAAC,EAA2B,EAAE,IAAY;IAC1D,OAAO,QAAQ,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;AACnG,CAAC;AAED,SAAS,WAAW,CAClB,EAA2B,EAC3B,GAAW;IAEX,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,MAAc;IAClD,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;IAC5F,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAAC,KAAsB,EAAE,SAA0B;IACnE,MAAM,KAAK,GAA2B,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACrE,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,QAAQ,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACvE,OAAO,QAAQ,IAAI,YAAY,CAAC;AAClC,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JSON API for the triage GUI. Routes mirror the existing attention
|
|
3
|
-
* MCP handlers (resolve / bulk-accept / dedup / restore) so all writes
|
|
4
|
-
* funnel through `withWriteLock`.
|
|
5
|
-
*/
|
|
6
|
-
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
7
|
-
interface Counters {
|
|
8
|
-
accepted: number;
|
|
9
|
-
rejected: number;
|
|
10
|
-
merged: number;
|
|
11
|
-
edited: number;
|
|
12
|
-
}
|
|
13
|
-
interface ApiCtx {
|
|
14
|
-
repoRoot: string;
|
|
15
|
-
counters: Counters;
|
|
16
|
-
touch: () => void;
|
|
17
|
-
token: string;
|
|
18
|
-
onDone: () => void;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Top-level dispatch. Always responds with JSON.
|
|
22
|
-
*/
|
|
23
|
-
export declare function handleApi(req: IncomingMessage, res: ServerResponse, ctx: ApiCtx): Promise<void>;
|
|
24
|
-
export {};
|