instar 1.3.4 → 1.3.5

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.
@@ -0,0 +1,139 @@
1
+ export declare const ISSUE_BUCKETS: readonly ["framework-limitation", "instar-integration-gap", "generic-agent-mistake"];
2
+ export type IssueBucket = (typeof ISSUE_BUCKETS)[number];
3
+ export declare const ISSUE_SEVERITIES: readonly ["low", "medium", "high"];
4
+ export type IssueSeverity = (typeof ISSUE_SEVERITIES)[number];
5
+ export declare const ISSUE_STATUSES: readonly ["open", "spec'd", "fixed", "wont-fix"];
6
+ export type IssueStatus = (typeof ISSUE_STATUSES)[number];
7
+ export declare const PLAYBOOK_STATUSES: readonly ["none", "candidate", "extracted", "superseded"];
8
+ export type PlaybookStatus = (typeof PLAYBOOK_STATUSES)[number];
9
+ export interface FrameworkIssueLedgerOptions {
10
+ dbPath: string;
11
+ /** Override clock for deterministic tests. */
12
+ now?: () => number;
13
+ }
14
+ /** What Stage B emits per observation (spec §5). */
15
+ export interface RecordObservationInput {
16
+ framework: string;
17
+ bucket: IssueBucket;
18
+ title: string;
19
+ severity?: IssueSeverity;
20
+ /** Conservative auto-merge key (spec §13.3). Required — identifies the canonical issue. */
21
+ dedupKey: string;
22
+ /** Richer fingerprint for probable-dup review (spec §13.3). */
23
+ signature?: string;
24
+ /** OPAQUE reference only — path+line, log ref, PR#, sentinel-event id (spec §13.2/§17). */
25
+ evidence?: string;
26
+ observedVersion?: string;
27
+ tickId?: string;
28
+ /**
29
+ * Collapses repeated observations of the same open issue within a fix-window
30
+ * to one episode (spec §13.4). Defaults to the observed version so an unfixed
31
+ * issue accrues at most one episode per version span.
32
+ */
33
+ episodeKey?: string;
34
+ /** Forced primary when dual-tagged (spec §6). */
35
+ bucketPrimary?: IssueBucket;
36
+ relatedSpec?: string;
37
+ }
38
+ export interface RecordObservationResult {
39
+ issueId: string;
40
+ created: boolean;
41
+ episodeRecorded: boolean;
42
+ recurrenceCount: number;
43
+ probableLoop: boolean;
44
+ }
45
+ export interface IssueRow {
46
+ id: string;
47
+ framework: string;
48
+ bucket: IssueBucket;
49
+ bucketPrimary: IssueBucket | null;
50
+ title: string;
51
+ severity: IssueSeverity;
52
+ status: IssueStatus;
53
+ dedupKey: string;
54
+ signature: string | null;
55
+ recurrenceCount: number;
56
+ firstSeenVersion: string | null;
57
+ lastSeenVersion: string | null;
58
+ fixedInVersion: string | null;
59
+ regressedFromIssueId: string | null;
60
+ playbookStatus: PlaybookStatus;
61
+ wontFixReason: string | null;
62
+ relatedSpec: string | null;
63
+ probableLoop: boolean;
64
+ createdAt: number;
65
+ updatedAt: number;
66
+ /** Derived at read (spec §13.4) — never stored, so a re-classification can't stale it. */
67
+ generalizable: boolean;
68
+ /** Derived at read: severityWeight × recurrenceCount × recency decay (spec §13.4). */
69
+ impactScore: number;
70
+ }
71
+ export interface ListIssuesQuery {
72
+ framework?: string;
73
+ bucket?: IssueBucket;
74
+ status?: IssueStatus;
75
+ limit?: number;
76
+ }
77
+ export interface PlaybookQuery {
78
+ targetFramework: string;
79
+ limit?: number;
80
+ }
81
+ export declare function scanForSecret(s: string): boolean;
82
+ export declare class FrameworkIssueLedger {
83
+ private db;
84
+ private now;
85
+ constructor(opts: FrameworkIssueLedgerOptions);
86
+ /** Stable list of frameworks the ledger has seen — for the route allowlist (spec §5/§17). */
87
+ knownFrameworks(): string[];
88
+ /**
89
+ * Record one Stage-B observation. Finds-or-creates the canonical issue via
90
+ * (framework, dedupKey); collapses the observation into a distinct episode via
91
+ * episodeKey; increments the materialized recurrence_count only on a new
92
+ * episode (spec §13.4). All writes run in a single transaction (CAS-safe: the
93
+ * UNIQUE(issue_id, episode_key) index is the concurrency guard — a racing
94
+ * duplicate episode insert fails and is counted as already-recorded).
95
+ */
96
+ recordObservation(input: RecordObservationInput): RecordObservationResult;
97
+ /** Retention pruning — keep first N + last M observations per issue (spec §13.2). */
98
+ private pruneObservations;
99
+ /**
100
+ * Single-writer CAS mutate of an issue's mutable fields (status, bucket,
101
+ * playbookStatus, regression link, etc.). Follows CommitmentTracker's
102
+ * read-modify-write-with-version-check pattern; enum fields are validated.
103
+ * `wont-fix` requires a reason (spec §13.7).
104
+ */
105
+ updateIssue(issueId: string, patch: Partial<{
106
+ status: IssueStatus;
107
+ bucket: IssueBucket;
108
+ bucketPrimary: IssueBucket | null;
109
+ playbookStatus: PlaybookStatus;
110
+ fixedInVersion: string | null;
111
+ regressedFromIssueId: string | null;
112
+ wontFixReason: string | null;
113
+ relatedSpec: string | null;
114
+ }>): IssueRow | null;
115
+ /**
116
+ * Suggest a regression link: a new issue whose signature/dedupKey matches a
117
+ * previously-`fixed` issue is a candidate regression (spec §13.5). Returns the
118
+ * matching fixed issues (does NOT auto-link — review decides).
119
+ */
120
+ suggestRegressions(input: {
121
+ framework: string;
122
+ dedupKey: string;
123
+ signature?: string | null;
124
+ }): IssueRow[];
125
+ getIssue(id: string): IssueRow | null;
126
+ listIssues(q?: ListIssuesQuery): IssueRow[];
127
+ /**
128
+ * The onboarding playbook for `targetFramework`: generalizable lessons from
129
+ * PRIOR (other) frameworks, ranked by impactScore (spec §13.6). The playbook
130
+ * for X is sourced from frameworks != X — never X's own issues.
131
+ */
132
+ playbook(q: PlaybookQuery): IssueRow[];
133
+ observationCount(issueId: string): number;
134
+ private rowToIssue;
135
+ close(): void;
136
+ }
137
+ /** Clamp a list limit to 1..500 (spec §5/§17). */
138
+ export declare function clampLimit(raw: unknown): number;
139
+ //# sourceMappingURL=FrameworkIssueLedger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FrameworkIssueLedger.d.ts","sourceRoot":"","sources":["../../src/monitoring/FrameworkIssueLedger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,441 @@
1
+ /**
2
+ * FrameworkIssueLedger — durable record of behavioral issues observed while
3
+ * onboarding an agent framework onto Instar (the Framework-Onboarding Mentor
4
+ * System, docs/specs/FRAMEWORK-ONBOARDING-MENTOR-SPEC.md).
5
+ *
6
+ * Two tables, by design (spec §13):
7
+ * - `framework_issues` — canonical root-cause records (one per distinct problem)
8
+ * - `framework_observations` — per-occurrence evidence (one per time it happened)
9
+ *
10
+ * The split exists because "false merges are worse than false splits" — a
11
+ * single-row model would bury distinct root causes. Recurrence is counted in
12
+ * distinct *episodes* (not raw ticks) via `episode_key`, materialized into
13
+ * `recurrence_count` on the canonical row so the playbook ranking never pays a
14
+ * read-time COUNT (spec §13.4).
15
+ *
16
+ * Signal-only: this ledger never gates a job, blocks a message, or constrains a
17
+ * session. Stage B of the mentor loop writes observations; the read-only HTTP
18
+ * routes (`/framework-issues`, `/framework-issues/playbook`) serve them. All
19
+ * authority to act on an entry rests with the human (spec §6).
20
+ *
21
+ * Security (spec §17): `evidence` is an OPAQUE reference only — never inlined
22
+ * log text or diff hunks — and is secret-scanned at capture. All captured
23
+ * free-text is length-capped + sanitized on write. Every query uses a prepared
24
+ * statement with bound parameters; enum columns are validated against fixed
25
+ * allowlists on write.
26
+ */
27
+ import Database from 'better-sqlite3';
28
+ import fs from 'node:fs';
29
+ import path from 'node:path';
30
+ import crypto from 'node:crypto';
31
+ import { NativeModuleHealer } from '../memory/NativeModuleHealer.js';
32
+ // ── Enums / allowlists (validated on write — spec §13.8, §17) ───────────────
33
+ export const ISSUE_BUCKETS = [
34
+ 'framework-limitation',
35
+ 'instar-integration-gap',
36
+ 'generic-agent-mistake',
37
+ ];
38
+ export const ISSUE_SEVERITIES = ['low', 'medium', 'high'];
39
+ export const ISSUE_STATUSES = ['open', "spec'd", 'fixed', 'wont-fix'];
40
+ export const PLAYBOOK_STATUSES = ['none', 'candidate', 'extracted', 'superseded'];
41
+ /** Buckets that generalize to the next framework feed the playbook (spec §13.4). */
42
+ const GENERALIZABLE_BUCKETS = new Set([
43
+ 'framework-limitation',
44
+ 'instar-integration-gap',
45
+ ]);
46
+ const SEVERITY_WEIGHT = { low: 1, medium: 3, high: 9 };
47
+ // ── Tunables (spec §13.2 retention, §13.4 caps) ─────────────────────────────
48
+ const MAX_FREE_TEXT = 500; // length-cap for title / signature / rationale (§17)
49
+ const MAX_EVIDENCE = 1024; // evidence pointer cap (§13.2 — pointer, not content)
50
+ const RETENTION_KEEP_FIRST = 5; // keep first N observations per issue (§13.2)
51
+ const RETENTION_KEEP_LAST = 20; // + last M
52
+ const PROBABLE_LOOP_PER_HOUR = 12; // obs/hr above which an issue is flagged probable-loop (§13.4)
53
+ const RECENCY_HALF_LIFE_MS = 30 * 24 * 60 * 60 * 1000; // 30d decay on impactScore (§13.4)
54
+ // ── Schema (spec §13.1 / §13.2) ─────────────────────────────────────────────
55
+ const SCHEMA = [
56
+ `CREATE TABLE IF NOT EXISTS framework_issues (
57
+ id TEXT PRIMARY KEY,
58
+ framework TEXT NOT NULL,
59
+ bucket TEXT NOT NULL,
60
+ bucket_primary TEXT,
61
+ title TEXT NOT NULL,
62
+ severity TEXT NOT NULL DEFAULT 'medium',
63
+ status TEXT NOT NULL DEFAULT 'open',
64
+ dedup_key TEXT NOT NULL,
65
+ signature TEXT,
66
+ recurrence_count INTEGER NOT NULL DEFAULT 0,
67
+ first_seen_version TEXT,
68
+ last_seen_version TEXT,
69
+ fixed_in_version TEXT,
70
+ regressed_from_issue_id TEXT,
71
+ playbook_status TEXT NOT NULL DEFAULT 'none',
72
+ wont_fix_reason TEXT,
73
+ related_spec TEXT,
74
+ probable_loop INTEGER NOT NULL DEFAULT 0,
75
+ created_at INTEGER NOT NULL,
76
+ updated_at INTEGER NOT NULL
77
+ )`,
78
+ `CREATE UNIQUE INDEX IF NOT EXISTS idx_fwissues_dedup ON framework_issues(framework, dedup_key)`,
79
+ `CREATE INDEX IF NOT EXISTS idx_fwissues_framework_pb ON framework_issues(framework, playbook_status)`,
80
+ `CREATE INDEX IF NOT EXISTS idx_fwissues_bucket ON framework_issues(bucket)`,
81
+ `CREATE INDEX IF NOT EXISTS idx_fwissues_status ON framework_issues(status)`,
82
+ `CREATE TABLE IF NOT EXISTS framework_observations (
83
+ id TEXT PRIMARY KEY,
84
+ issue_id TEXT NOT NULL,
85
+ framework TEXT NOT NULL,
86
+ evidence TEXT,
87
+ observed_version TEXT,
88
+ observed_at INTEGER NOT NULL,
89
+ tick_id TEXT,
90
+ episode_key TEXT NOT NULL
91
+ )`,
92
+ `CREATE INDEX IF NOT EXISTS idx_fwobs_issue ON framework_observations(issue_id)`,
93
+ `CREATE UNIQUE INDEX IF NOT EXISTS idx_fwobs_episode ON framework_observations(issue_id, episode_key)`,
94
+ `CREATE INDEX IF NOT EXISTS idx_fwobs_observed_at ON framework_observations(observed_at)`,
95
+ ];
96
+ // ── Helpers ─────────────────────────────────────────────────────────────────
97
+ /**
98
+ * Reject anything that looks like an inlined secret/log-body rather than an
99
+ * opaque pointer (spec §17). Returns a sanitized, length-capped string. We do
100
+ * NOT silently store a suspected secret — we redact it and tag the evidence so
101
+ * the capture is visibly degraded rather than leaking.
102
+ */
103
+ const SECRET_PATTERNS = [
104
+ /\b(sk|pk|rk)-[A-Za-z0-9]{16,}\b/, // api-key-shaped
105
+ /\bBearer\s+[A-Za-z0-9._-]{12,}\b/i,
106
+ /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/, // slack
107
+ /\bgh[pousr]_[A-Za-z0-9]{20,}\b/, // github
108
+ /-----BEGIN [A-Z ]*PRIVATE KEY-----/,
109
+ /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/, // jwt
110
+ ];
111
+ export function scanForSecret(s) {
112
+ return SECRET_PATTERNS.some((re) => re.test(s));
113
+ }
114
+ function sanitizeFreeText(s, cap) {
115
+ if (!s)
116
+ return '';
117
+ // Strip control chars; collapse whitespace; cap length.
118
+ // eslint-disable-next-line no-control-regex
119
+ const cleaned = s.replace(/[\x00-\x1f\x7f]/g, " ").replace(/\s+/g, " ").trim();
120
+ return cleaned.length > cap ? cleaned.slice(0, cap) : cleaned;
121
+ }
122
+ function sanitizeEvidence(s) {
123
+ if (!s)
124
+ return null;
125
+ const capped = sanitizeFreeText(s, MAX_EVIDENCE);
126
+ if (scanForSecret(capped)) {
127
+ // Redact the body; keep a marker so the capture is visibly degraded (§17).
128
+ return '[redacted: evidence matched a secret pattern — store an opaque reference, not log content]';
129
+ }
130
+ return capped;
131
+ }
132
+ function assertEnum(value, allowed, field) {
133
+ if (!allowed.includes(value)) {
134
+ throw new Error(`FrameworkIssueLedger: invalid ${field} '${value}' (allowed: ${allowed.join(', ')})`);
135
+ }
136
+ return value;
137
+ }
138
+ // ── Ledger ──────────────────────────────────────────────────────────────────
139
+ export class FrameworkIssueLedger {
140
+ db;
141
+ now;
142
+ constructor(opts) {
143
+ this.now = opts.now ?? (() => Date.now());
144
+ if (opts.dbPath !== ':memory:') {
145
+ fs.mkdirSync(path.dirname(opts.dbPath), { recursive: true });
146
+ }
147
+ this.db = NativeModuleHealer.openWithHealSync('FrameworkIssueLedger', () => new Database(opts.dbPath));
148
+ this.db.pragma('journal_mode = WAL');
149
+ this.db.pragma('synchronous = NORMAL');
150
+ this.db.pragma('busy_timeout = 5000');
151
+ for (const ddl of SCHEMA)
152
+ this.db.exec(ddl);
153
+ }
154
+ /** Stable list of frameworks the ledger has seen — for the route allowlist (spec §5/§17). */
155
+ knownFrameworks() {
156
+ const rows = this.db
157
+ .prepare(`SELECT DISTINCT framework FROM framework_issues ORDER BY framework`)
158
+ .all();
159
+ return rows.map((r) => r.framework);
160
+ }
161
+ /**
162
+ * Record one Stage-B observation. Finds-or-creates the canonical issue via
163
+ * (framework, dedupKey); collapses the observation into a distinct episode via
164
+ * episodeKey; increments the materialized recurrence_count only on a new
165
+ * episode (spec §13.4). All writes run in a single transaction (CAS-safe: the
166
+ * UNIQUE(issue_id, episode_key) index is the concurrency guard — a racing
167
+ * duplicate episode insert fails and is counted as already-recorded).
168
+ */
169
+ recordObservation(input) {
170
+ const framework = sanitizeFreeText(input.framework, 120);
171
+ if (!framework)
172
+ throw new Error('FrameworkIssueLedger: framework is required');
173
+ const bucket = assertEnum(input.bucket, ISSUE_BUCKETS, 'bucket');
174
+ const severity = assertEnum(input.severity ?? 'medium', ISSUE_SEVERITIES, 'severity');
175
+ const dedupKey = sanitizeFreeText(input.dedupKey, 200);
176
+ if (!dedupKey)
177
+ throw new Error('FrameworkIssueLedger: dedupKey is required');
178
+ const title = sanitizeFreeText(input.title, MAX_FREE_TEXT) || '(untitled)';
179
+ const signature = input.signature ? sanitizeFreeText(input.signature, MAX_FREE_TEXT) : null;
180
+ const evidence = sanitizeEvidence(input.evidence);
181
+ const observedVersion = input.observedVersion ? sanitizeFreeText(input.observedVersion, 60) : null;
182
+ const tickId = input.tickId ? sanitizeFreeText(input.tickId, 120) : null;
183
+ const episodeKey = sanitizeFreeText(input.episodeKey ?? observedVersion ?? 'default', 200);
184
+ const bucketPrimary = input.bucketPrimary
185
+ ? assertEnum(input.bucketPrimary, ISSUE_BUCKETS, 'bucketPrimary')
186
+ : null;
187
+ const relatedSpec = input.relatedSpec ? sanitizeFreeText(input.relatedSpec, 200) : null;
188
+ const ts = this.now();
189
+ const txn = this.db.transaction(() => {
190
+ // Find-or-create canonical issue.
191
+ let issue = this.db
192
+ .prepare(`SELECT * FROM framework_issues WHERE framework = ? AND dedup_key = ?`)
193
+ .get(framework, dedupKey);
194
+ let created = false;
195
+ let issueId;
196
+ if (!issue) {
197
+ issueId = crypto.randomUUID();
198
+ this.db
199
+ .prepare(`INSERT INTO framework_issues
200
+ (id, framework, bucket, bucket_primary, title, severity, status, dedup_key,
201
+ signature, recurrence_count, first_seen_version, last_seen_version,
202
+ playbook_status, probable_loop, created_at, updated_at)
203
+ VALUES (@id, @framework, @bucket, @bucketPrimary, @title, @severity, 'open', @dedupKey,
204
+ @signature, 0, @observedVersion, @observedVersion, 'none', 0, @ts, @ts)`)
205
+ .run({ id: issueId, framework, bucket, bucketPrimary, title, severity, dedupKey, signature, observedVersion, ts });
206
+ created = true;
207
+ issue = { id: issueId };
208
+ }
209
+ else {
210
+ issueId = issue.id;
211
+ // Refresh last-seen + (non-destructively) escalate severity if higher.
212
+ this.db
213
+ .prepare(`UPDATE framework_issues
214
+ SET last_seen_version = COALESCE(@observedVersion, last_seen_version),
215
+ severity = CASE WHEN @newWeight > @oldWeight THEN @severity ELSE severity END,
216
+ updated_at = @ts
217
+ WHERE id = @id`)
218
+ .run({
219
+ id: issueId,
220
+ observedVersion,
221
+ severity,
222
+ newWeight: SEVERITY_WEIGHT[severity],
223
+ oldWeight: SEVERITY_WEIGHT[issue.severity ?? 'medium'],
224
+ ts,
225
+ });
226
+ }
227
+ // Insert the observation as a distinct episode. UNIQUE(issue_id, episode_key)
228
+ // collapses repeats within a fix-window to one episode (spec §13.4).
229
+ let episodeRecorded = false;
230
+ const obsId = crypto.randomUUID();
231
+ const insert = this.db
232
+ .prepare(`INSERT OR IGNORE INTO framework_observations
233
+ (id, issue_id, framework, evidence, observed_version, observed_at, tick_id, episode_key)
234
+ VALUES (@obsId, @issueId, @framework, @evidence, @observedVersion, @ts, @tickId, @episodeKey)`)
235
+ .run({ obsId, issueId, framework, evidence, observedVersion, ts, tickId, episodeKey });
236
+ episodeRecorded = insert.changes > 0;
237
+ if (episodeRecorded) {
238
+ this.db
239
+ .prepare(`UPDATE framework_issues SET recurrence_count = recurrence_count + 1, updated_at = ? WHERE id = ?`)
240
+ .run(ts, issueId);
241
+ }
242
+ // Apply retention: keep first N + last M observations for this issue (§13.2).
243
+ this.pruneObservations(issueId);
244
+ // Probable-loop flag: too many observations in the trailing hour (§13.4).
245
+ const recentCount = this.db
246
+ .prepare(`SELECT COUNT(*) AS c FROM framework_observations WHERE issue_id = ? AND observed_at >= ?`)
247
+ .get(issueId, ts - 60 * 60 * 1000);
248
+ const probableLoop = recentCount.c >= PROBABLE_LOOP_PER_HOUR;
249
+ this.db
250
+ .prepare(`UPDATE framework_issues SET probable_loop = ? WHERE id = ?`)
251
+ .run(probableLoop ? 1 : 0, issueId);
252
+ const after = this.db
253
+ .prepare(`SELECT recurrence_count FROM framework_issues WHERE id = ?`)
254
+ .get(issueId);
255
+ return { issueId, created, episodeRecorded, recurrenceCount: after.recurrence_count, probableLoop };
256
+ });
257
+ return txn();
258
+ }
259
+ /** Retention pruning — keep first N + last M observations per issue (spec §13.2). */
260
+ pruneObservations(issueId) {
261
+ const total = this.db
262
+ .prepare(`SELECT COUNT(*) AS c FROM framework_observations WHERE issue_id = ?`)
263
+ .get(issueId);
264
+ if (total.c <= RETENTION_KEEP_FIRST + RETENTION_KEEP_LAST)
265
+ return;
266
+ // Delete the middle band: everything not in the first-N or last-M by observed_at.
267
+ this.db
268
+ .prepare(`DELETE FROM framework_observations
269
+ WHERE issue_id = @issueId
270
+ AND id NOT IN (
271
+ SELECT id FROM framework_observations WHERE issue_id = @issueId ORDER BY observed_at ASC LIMIT @first
272
+ )
273
+ AND id NOT IN (
274
+ SELECT id FROM framework_observations WHERE issue_id = @issueId ORDER BY observed_at DESC LIMIT @last
275
+ )`)
276
+ .run({ issueId, first: RETENTION_KEEP_FIRST, last: RETENTION_KEEP_LAST });
277
+ }
278
+ /**
279
+ * Single-writer CAS mutate of an issue's mutable fields (status, bucket,
280
+ * playbookStatus, regression link, etc.). Follows CommitmentTracker's
281
+ * read-modify-write-with-version-check pattern; enum fields are validated.
282
+ * `wont-fix` requires a reason (spec §13.7).
283
+ */
284
+ updateIssue(issueId, patch) {
285
+ const txn = this.db.transaction(() => {
286
+ const cur = this.db.prepare(`SELECT * FROM framework_issues WHERE id = ?`).get(issueId);
287
+ if (!cur)
288
+ return null;
289
+ const status = patch.status ? assertEnum(patch.status, ISSUE_STATUSES, 'status') : cur.status;
290
+ const bucket = patch.bucket ? assertEnum(patch.bucket, ISSUE_BUCKETS, 'bucket') : cur.bucket;
291
+ const playbookStatus = patch.playbookStatus
292
+ ? assertEnum(patch.playbookStatus, PLAYBOOK_STATUSES, 'playbookStatus')
293
+ : cur.playbook_status;
294
+ const bucketPrimary = patch.bucketPrimary !== undefined
295
+ ? patch.bucketPrimary
296
+ ? assertEnum(patch.bucketPrimary, ISSUE_BUCKETS, 'bucketPrimary')
297
+ : null
298
+ : cur.bucket_primary;
299
+ const wontFixReason = patch.wontFixReason !== undefined ? sanitizeFreeText(patch.wontFixReason ?? '', MAX_FREE_TEXT) || null : cur.wont_fix_reason;
300
+ if (status === 'wont-fix' && !wontFixReason) {
301
+ throw new Error('FrameworkIssueLedger: wont-fix requires a wontFixReason (spec §13.7)');
302
+ }
303
+ this.db
304
+ .prepare(`UPDATE framework_issues SET
305
+ status = @status, bucket = @bucket, bucket_primary = @bucketPrimary,
306
+ playbook_status = @playbookStatus,
307
+ fixed_in_version = @fixedInVersion, regressed_from_issue_id = @regressedFromIssueId,
308
+ wont_fix_reason = @wontFixReason, related_spec = @relatedSpec, updated_at = @ts
309
+ WHERE id = @id`)
310
+ .run({
311
+ id: issueId,
312
+ status,
313
+ bucket,
314
+ bucketPrimary,
315
+ playbookStatus,
316
+ fixedInVersion: patch.fixedInVersion !== undefined ? patch.fixedInVersion : cur.fixed_in_version,
317
+ regressedFromIssueId: patch.regressedFromIssueId !== undefined
318
+ ? patch.regressedFromIssueId
319
+ : cur.regressed_from_issue_id,
320
+ wontFixReason,
321
+ relatedSpec: patch.relatedSpec !== undefined ? patch.relatedSpec : cur.related_spec,
322
+ ts: this.now(),
323
+ });
324
+ return this.getIssue(issueId);
325
+ });
326
+ return txn();
327
+ }
328
+ /**
329
+ * Suggest a regression link: a new issue whose signature/dedupKey matches a
330
+ * previously-`fixed` issue is a candidate regression (spec §13.5). Returns the
331
+ * matching fixed issues (does NOT auto-link — review decides).
332
+ */
333
+ suggestRegressions(input) {
334
+ const rows = this.db
335
+ .prepare(`SELECT * FROM framework_issues
336
+ WHERE framework = ? AND status = 'fixed'
337
+ AND (dedup_key = ? OR (signature IS NOT NULL AND signature = ?))`)
338
+ .all(input.framework, input.dedupKey, input.signature ?? '__none__');
339
+ return rows.map((r) => this.rowToIssue(r));
340
+ }
341
+ getIssue(id) {
342
+ const r = this.db.prepare(`SELECT * FROM framework_issues WHERE id = ?`).get(id);
343
+ return r ? this.rowToIssue(r) : null;
344
+ }
345
+ listIssues(q = {}) {
346
+ const clauses = [];
347
+ const params = {};
348
+ if (q.framework) {
349
+ clauses.push(`framework = @framework`);
350
+ params.framework = q.framework;
351
+ }
352
+ if (q.bucket) {
353
+ clauses.push(`bucket = @bucket`);
354
+ params.bucket = assertEnum(q.bucket, ISSUE_BUCKETS, 'bucket');
355
+ }
356
+ if (q.status) {
357
+ clauses.push(`status = @status`);
358
+ params.status = assertEnum(q.status, ISSUE_STATUSES, 'status');
359
+ }
360
+ const where = clauses.length ? `WHERE ${clauses.join(' AND ')}` : '';
361
+ const limit = clampLimit(q.limit);
362
+ const rows = this.db
363
+ .prepare(`SELECT * FROM framework_issues ${where} ORDER BY updated_at DESC LIMIT @limit`)
364
+ .all({ ...params, limit });
365
+ return rows.map((r) => this.rowToIssue(r));
366
+ }
367
+ /**
368
+ * The onboarding playbook for `targetFramework`: generalizable lessons from
369
+ * PRIOR (other) frameworks, ranked by impactScore (spec §13.6). The playbook
370
+ * for X is sourced from frameworks != X — never X's own issues.
371
+ */
372
+ playbook(q) {
373
+ const limit = clampLimit(q.limit);
374
+ const rows = this.db
375
+ .prepare(`SELECT * FROM framework_issues
376
+ WHERE framework != @targetFramework
377
+ AND bucket IN ('framework-limitation', 'instar-integration-gap')
378
+ AND playbook_status IN ('candidate', 'extracted')`)
379
+ .all({ targetFramework: q.targetFramework });
380
+ return rows
381
+ .map((r) => this.rowToIssue(r))
382
+ .sort((a, b) => b.impactScore - a.impactScore)
383
+ .slice(0, limit);
384
+ }
385
+ observationCount(issueId) {
386
+ const r = this.db
387
+ .prepare(`SELECT COUNT(*) AS c FROM framework_observations WHERE issue_id = ?`)
388
+ .get(issueId);
389
+ return r.c;
390
+ }
391
+ rowToIssue(r) {
392
+ const bucket = r.bucket;
393
+ const severity = r.severity ?? 'medium';
394
+ const recurrenceCount = r.recurrence_count ?? 0;
395
+ const updatedAt = r.updated_at ?? 0;
396
+ // Recency decay (spec §13.4): a long-stale issue doesn't permanently dominate.
397
+ const ageMs = Math.max(0, this.now() - updatedAt);
398
+ const decay = Math.pow(0.5, ageMs / RECENCY_HALF_LIFE_MS);
399
+ const impactScore = SEVERITY_WEIGHT[severity] * recurrenceCount * decay;
400
+ return {
401
+ id: r.id,
402
+ framework: r.framework,
403
+ bucket,
404
+ bucketPrimary: r.bucket_primary ?? null,
405
+ title: r.title,
406
+ severity,
407
+ status: r.status,
408
+ dedupKey: r.dedup_key,
409
+ signature: r.signature ?? null,
410
+ recurrenceCount,
411
+ firstSeenVersion: r.first_seen_version ?? null,
412
+ lastSeenVersion: r.last_seen_version ?? null,
413
+ fixedInVersion: r.fixed_in_version ?? null,
414
+ regressedFromIssueId: r.regressed_from_issue_id ?? null,
415
+ playbookStatus: r.playbook_status,
416
+ wontFixReason: r.wont_fix_reason ?? null,
417
+ relatedSpec: r.related_spec ?? null,
418
+ probableLoop: !!r.probable_loop,
419
+ createdAt: r.created_at ?? 0,
420
+ updatedAt,
421
+ generalizable: GENERALIZABLE_BUCKETS.has(bucket),
422
+ impactScore: Math.round(impactScore * 1000) / 1000,
423
+ };
424
+ }
425
+ close() {
426
+ try {
427
+ this.db.close();
428
+ }
429
+ catch {
430
+ /* ignore */
431
+ }
432
+ }
433
+ }
434
+ /** Clamp a list limit to 1..500 (spec §5/§17). */
435
+ export function clampLimit(raw) {
436
+ const n = typeof raw === 'number' ? raw : typeof raw === 'string' ? parseInt(raw, 10) : NaN;
437
+ if (!Number.isFinite(n))
438
+ return 100;
439
+ return Math.max(1, Math.min(500, Math.floor(n)));
440
+ }
441
+ //# sourceMappingURL=FrameworkIssueLedger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FrameworkIssueLedger.js","sourceRoot":"","sources":["../../src/monitoring/FrameworkIssueLedger.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CA0nCR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,GAC3B,MAAM,CAuSR"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CA2nCR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,GAC3B,MAAM,CAuSR"}
@@ -662,6 +662,7 @@ I maintain registries that are the source of truth for specific categories. Thes
662
662
  | My backup history? | \`curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/backups\` |
663
663
  | My state change history? | \`curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/git/log\` |
664
664
  | Other agents on this machine? | \`curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/agents\` |
665
+ | Behavioral issues logged while onboarding a framework? / the onboarding playbook? | \`curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/framework-issues\` (read-only) + \`/framework-issues/playbook?targetFramework=X\` — the Framework-Onboarding Mentor System's issue ledger (observability only; never gates) |
665
666
  | Project architecture? | This file (CLAUDE.md), then project docs |
666
667
 
667
668
  **Why this matters:** Searching 1000 files to answer a question that a single state file could answer is slower AND less reliable. Broad searches find stale narratives. State files are current. This applies at EVERY level — including sub-agents I spawn. When spawning a research agent, include the relevant state file reference in its prompt so it searches WITH context, not blind.
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,OAAO,KAAK,QAAQ,CAAC,IAAI;;;;OAIpB,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;;;;EAIpC,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;6BAsBO,QAAQ,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+D7C,CAAC;AAEF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,WAAmB,EAAE,QAAgB;IACrF,OAAO;;;;;;;;;;;;;;;;;;EAkBP,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAkDH,QAAQ;;;;;CAKjB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,KAAK,QAAQ;;;;;;;;;;;;;;4CAcsB,QAAQ;CACnD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,KAAK,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;CAyBtB,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,EACnB,SAAiB,EACjB,IAAY,EACZ,WAAoB,EACpB,cAAuB,KAAK,EAC5B,cAAuB,KAAK;IAE5B,IAAI,OAAO,GAAG,iBAAiB,WAAW;;;;OAIrC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCT,SAAS;;gCAEgB,IAAI,kFAAkF,IAAI;;;;;;;;;;;;;8EAa5C,IAAI;;;yFAGO,IAAI;;;;;;;uGAOU,IAAI;;;;;;;;;;;;;;;;;;;;;;;0CAuBjE,IAAI;oCACV,IAAI;;;;;;;;;;;;;yDAaiB,IAAI;;;;;;;;;;;;gCAY7B,IAAI;;;;;;;;;sFASkD,IAAI;4FACE,IAAI;;;;;;;mEAO7B,IAAI;8EACO,IAAI;;;mEAGf,IAAI;4EACK,IAAI;;;;sHAIsC,IAAI;;;;;6EAK7C,IAAI;;2FAEU,IAAI;qFACV,IAAI;;;;mEAItB,IAAI;;;8EAGO,IAAI;6EACL,IAAI;0EACP,IAAI;;;;;6EAKD,IAAI;yCACxC,IAAI;mEACsB,IAAI;4EACK,IAAI;+EACD,IAAI;;;;;uFAKI,IAAI;;;;;2EAKhB,IAAI;+EACA,IAAI;;;;;;wFAMK,IAAI;6EACf,IAAI;+FACc,IAAI;;;;;qEAK9B,IAAI;;;;;;;;4EAQG,IAAI;yEACP,IAAI;+EACE,IAAI;;;;0EAIT,IAAI;6EACD,IAAI;oFACG,IAAI;;;;;;;;;8EASV,IAAI;sEACZ,IAAI;8EACI,IAAI;4EACN,IAAI;mFACG,IAAI;;;;oEAInB,IAAI;0EACE,IAAI;4EACF,IAAI;+EACD,IAAI;iFACF,IAAI;;;oEAGjB,IAAI;;;;+EAIO,IAAI;6EACN,IAAI;0EACP,IAAI;uFACS,IAAI;qFACN,IAAI;wEACjB,IAAI;;;;oEAIR,IAAI;;;qEAGH,IAAI;sEACH,IAAI;mKACyF,IAAI;;;sEAGjG,IAAI;;;qEAGL,IAAI;;;8BAG3C,IAAI;;;;4OAI0M,IAAI;;;;;;;;mFAQ7J,IAAI;;;;;uBAKhE,IAAI;;;wFAG6D,IAAI;;;;;;6EAMf,IAAI;sFACK,IAAI;8EACZ,IAAI;;;;;sEAKZ,IAAI;oEACN,IAAI;8EACM,IAAI;yFACO,IAAI;;;;;;;;;qEASxB,IAAI;6EACI,IAAI;2EACN,IAAI;2EACJ,IAAI;kEACb,IAAI;;;;;0EAKI,IAAI;4FACc,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yDA4EvC,IAAI;;;;;;;;;;;;;;;8EAeiB,IAAI;4HAC0C,IAAI;;;6GAGnB,IAAI;2FACtB,IAAI;;;2FAGJ,IAAI;;kFAEb,IAAI;wFACE,IAAI;6FACC,IAAI;;;;;;;;;;;;;;;;;;;uFAmBV,IAAI;wFACH,IAAI;;;wFAGJ,IAAI;;0FAEF,IAAI;+FACC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoGrF,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CA4HmB,IAAI;;;;;;;;;;;mCAWX,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCA8CJ,IAAI;;;;;;;;;;;;;;;;;;;;;;;;mEAwB4B,IAAI;;;;;mEAKJ,IAAI;;;;;mEAKJ,IAAI;;;;mEAIJ,IAAI;;;;;;yDAMd,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2EAiFc,IAAI;yEACN,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuE5E,CAAC;IAEA,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;CAsBd,CAAC;IACA,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEd,CAAC;IACA,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Bd,CAAC;IACA,CAAC;IAED,yEAAyE;IACzE,0EAA0E;IAC1E,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6FZ,CAAC;IAEA,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,SAAiB,EACjB,IAAY,EACZ,WAAoB,EACpB,cAAuB,KAAK;IAE5B,IAAI,OAAO,GAAG,iBAAiB,WAAW;;;;OAIrC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCT,SAAS;;gCAEgB,IAAI,qFAAqF,IAAI;;;;;;CAM5H,CAAC;IAEA,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;CAsBd,CAAC;IACA,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;CAId,CAAC;IACA,CAAC;IAED,OAAO,IAAI;;;;;;;8EAOiE,IAAI;;;yFAGO,IAAI;;;;;;;uGAOU,IAAI;yFAClB,IAAI;;;;;;0DAMnC,IAAI;;;;;;;;;;;;;;;;;;;;;;;2FAuB6B,IAAI;8FACD,IAAI;+MAC6G,IAAI;mGAChH,IAAI;;;;;;;;;;0CAU7D,IAAI;oCACV,IAAI;;;;;;;;;;;;;yDAaiB,IAAI;;;;;;;;0DAQH,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+GhD,SAAS;;;;;;;;;;;;sEAY+C,IAAI;;CAEzE,CAAC;IAEA,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,OAAO,KAAK,QAAQ,CAAC,IAAI;;;;OAIpB,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;;;;EAIpC,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;6BAsBO,QAAQ,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+D7C,CAAC;AAEF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,WAAmB,EAAE,QAAgB;IACrF,OAAO;;;;;;;;;;;;;;;;;;EAkBP,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAkDH,QAAQ;;;;;CAKjB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,KAAK,QAAQ;;;;;;;;;;;;;;4CAcsB,QAAQ;CACnD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,KAAK,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;CAyBtB,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,EACnB,SAAiB,EACjB,IAAY,EACZ,WAAoB,EACpB,cAAuB,KAAK,EAC5B,cAAuB,KAAK;IAE5B,IAAI,OAAO,GAAG,iBAAiB,WAAW;;;;OAIrC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCT,SAAS;;gCAEgB,IAAI,kFAAkF,IAAI;;;;;;;;;;;;;8EAa5C,IAAI;;;yFAGO,IAAI;;;;;;;uGAOU,IAAI;;;;;;;;;;;;;;;;;;;;;;;0CAuBjE,IAAI;oCACV,IAAI;;;;;;;;;;;;;yDAaiB,IAAI;;;;;;;;;;;;gCAY7B,IAAI;;;;;;;;;sFASkD,IAAI;4FACE,IAAI;;;;;;;mEAO7B,IAAI;8EACO,IAAI;;;mEAGf,IAAI;4EACK,IAAI;;;;sHAIsC,IAAI;;;;;6EAK7C,IAAI;;2FAEU,IAAI;qFACV,IAAI;;;;mEAItB,IAAI;;;8EAGO,IAAI;6EACL,IAAI;0EACP,IAAI;;;;;6EAKD,IAAI;yCACxC,IAAI;mEACsB,IAAI;4EACK,IAAI;+EACD,IAAI;;;;;uFAKI,IAAI;;;;;2EAKhB,IAAI;+EACA,IAAI;;;;;;wFAMK,IAAI;6EACf,IAAI;+FACc,IAAI;;;;;qEAK9B,IAAI;;;;;;;;4EAQG,IAAI;yEACP,IAAI;+EACE,IAAI;;;;0EAIT,IAAI;6EACD,IAAI;oFACG,IAAI;;;;;;;;;8EASV,IAAI;sEACZ,IAAI;8EACI,IAAI;4EACN,IAAI;mFACG,IAAI;;;;oEAInB,IAAI;0EACE,IAAI;4EACF,IAAI;+EACD,IAAI;iFACF,IAAI;;;oEAGjB,IAAI;;;;+EAIO,IAAI;6EACN,IAAI;0EACP,IAAI;uFACS,IAAI;qFACN,IAAI;wEACjB,IAAI;;;;oEAIR,IAAI;;;qEAGH,IAAI;sEACH,IAAI;mKACyF,IAAI;;;sEAGjG,IAAI;;;qEAGL,IAAI;;;8BAG3C,IAAI;;;;4OAI0M,IAAI;;;;;;;;mFAQ7J,IAAI;;;;;uBAKhE,IAAI;;;wFAG6D,IAAI;;;;;;6EAMf,IAAI;sFACK,IAAI;8EACZ,IAAI;;;;;sEAKZ,IAAI;oEACN,IAAI;8EACM,IAAI;yFACO,IAAI;;;;;;;;;qEASxB,IAAI;6EACI,IAAI;2EACN,IAAI;2EACJ,IAAI;kEACb,IAAI;;;;;0EAKI,IAAI;4FACc,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yDA4EvC,IAAI;;;;;;;;;;;;;;;8EAeiB,IAAI;4HAC0C,IAAI;;;6GAGnB,IAAI;2FACtB,IAAI;;;2FAGJ,IAAI;;kFAEb,IAAI;wFACE,IAAI;6FACC,IAAI;iJACgD,IAAI;;;;;;;;;;;;;;;;;;;uFAmB9D,IAAI;wFACH,IAAI;;;wFAGJ,IAAI;;0FAEF,IAAI;+FACC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoGrF,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CA4HmB,IAAI;;;;;;;;;;;mCAWX,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCA8CJ,IAAI;;;;;;;;;;;;;;;;;;;;;;;;mEAwB4B,IAAI;;;;;mEAKJ,IAAI;;;;;mEAKJ,IAAI;;;;mEAIJ,IAAI;;;;;;yDAMd,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2EAiFc,IAAI;yEACN,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuE5E,CAAC;IAEA,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;CAsBd,CAAC;IACA,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEd,CAAC;IACA,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Bd,CAAC;IACA,CAAC;IAED,yEAAyE;IACzE,0EAA0E;IAC1E,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6FZ,CAAC;IAEA,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,SAAiB,EACjB,IAAY,EACZ,WAAoB,EACpB,cAAuB,KAAK;IAE5B,IAAI,OAAO,GAAG,iBAAiB,WAAW;;;;OAIrC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCT,SAAS;;gCAEgB,IAAI,qFAAqF,IAAI;;;;;;CAM5H,CAAC;IAEA,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;CAsBd,CAAC;IACA,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;CAId,CAAC;IACA,CAAC;IAED,OAAO,IAAI;;;;;;;8EAOiE,IAAI;;;yFAGO,IAAI;;;;;;;uGAOU,IAAI;yFAClB,IAAI;;;;;;0DAMnC,IAAI;;;;;;;;;;;;;;;;;;;;;;;2FAuB6B,IAAI;8FACD,IAAI;+MAC6G,IAAI;mGAChH,IAAI;;;;;;;;;;0CAU7D,IAAI;oCACV,IAAI;;;;;;;;;;;;;yDAaiB,IAAI;;;;;;;;0DAQH,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+GhD,SAAS;;;;;;;;;;;;sEAY+C,IAAI;;CAEzE,CAAC;IAEA,OAAO,OAAO,CAAC;AACjB,CAAC"}