@agentproto/corpus 0.1.0-alpha.4 → 0.1.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.
@@ -9,6 +9,7 @@ var CandidatesSidecar = class {
9
9
  constructor(opts) {
10
10
  this.opts = opts;
11
11
  }
12
+ opts;
12
13
  /**
13
14
  * Load every row from disk. Returns an empty list if the file
14
15
  * doesn't exist (a fresh corpus has no candidates yet).
@@ -89,6 +90,8 @@ var SidecarDuplicateError = class extends Error {
89
90
  this.id = id;
90
91
  this.name = "SidecarDuplicateError";
91
92
  }
93
+ path;
94
+ id;
92
95
  };
93
96
  var SidecarNotFoundError = class extends Error {
94
97
  constructor(path, id) {
@@ -97,8 +100,10 @@ var SidecarNotFoundError = class extends Error {
97
100
  this.id = id;
98
101
  this.name = "SidecarNotFoundError";
99
102
  }
103
+ path;
104
+ id;
100
105
  };
101
106
 
102
107
  export { CandidatesSidecar, SidecarDuplicateError, SidecarNotFoundError };
103
- //# sourceMappingURL=chunk-UPX26MYH.mjs.map
104
- //# sourceMappingURL=chunk-UPX26MYH.mjs.map
108
+ //# sourceMappingURL=chunk-WF5KGEL6.mjs.map
109
+ //# sourceMappingURL=chunk-WF5KGEL6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/workspace/sidecar.ts"],"names":["yamlParse","yamlStringify"],"mappings":"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","file":"chunk-WF5KGEL6.mjs","sourcesContent":["/**\n * CandidatesSidecar — accessor for `collections/<name>/_candidates.yaml`.\n *\n * The plan calls out lazy materialization (so-so #6): the\n * \"discovered\" state has high volume and short lifespan; AIP-18 ITEM\n * files only materialize when a candidate transitions to `analyzed`.\n * Until then, candidates live in a YAML sidecar keyed by id.\n *\n * Sidecar shape:\n * candidates:\n * - id: <slug>\n * status: discovered # may also be transitioning (rare)\n * sourceUrl: ... # collection-specific fields are free-form\n * contentHash: ...\n * discoveredAt: ISO\n * discoveredBy: ws://operators/<slug>\n *\n * The accessor enforces:\n * - id uniqueness within the file\n * - atomic full-file writes (no partial sidecar)\n * - status transition discipline (a row stays here only while\n * `status === \"discovered\"`; transitions out remove the row and\n * return the data so the caller can materialize ITEM.md)\n */\n\nimport { parse as yamlParse, stringify as yamlStringify } from \"yaml\"\nimport type { FsPort } from \"../ports/fs.port.js\"\n\nexport interface CandidateRow {\n readonly id: string\n readonly status: \"discovered\" | string\n /** Open-ended — collection schema's `fields` defines what's allowed. */\n readonly [key: string]: unknown\n}\n\ninterface SidecarShape {\n readonly candidates: readonly CandidateRow[]\n}\n\nexport interface CandidatesSidecarOptions {\n readonly fs: FsPort\n /** Workspace-relative path of the sidecar file. */\n readonly path: string\n}\n\nexport class CandidatesSidecar {\n constructor(private readonly opts: CandidatesSidecarOptions) {}\n\n /**\n * Load every row from disk. Returns an empty list if the file\n * doesn't exist (a fresh corpus has no candidates yet).\n */\n async load(): Promise<readonly CandidateRow[]> {\n if (!(await this.opts.fs.exists(this.opts.path))) return []\n const content = await this.opts.fs.readFile(this.opts.path)\n if (!content.trim()) return []\n const parsed = yamlParse(content) as Partial<SidecarShape> | null\n if (!parsed || !Array.isArray(parsed.candidates)) return []\n return parsed.candidates as readonly CandidateRow[]\n }\n\n /**\n * Append a new candidate. Refuses if `id` already exists — sidecar\n * keys are unique. Returns the full updated list.\n */\n async append(row: CandidateRow): Promise<readonly CandidateRow[]> {\n const existing = await this.load()\n if (existing.some((r) => r.id === row.id)) {\n throw new SidecarDuplicateError(this.opts.path, row.id)\n }\n const next = [...existing, row]\n await this.write(next)\n return next\n }\n\n /**\n * Mutate one row in-place. Throws if not found.\n */\n async update(\n id: string,\n patch: Readonly<Record<string, unknown>>\n ): Promise<CandidateRow> {\n const existing = await this.load()\n let updated: CandidateRow | null = null\n const next = existing.map((r) => {\n if (r.id !== id) return r\n updated = { ...r, ...patch, id: r.id } as CandidateRow\n return updated\n })\n if (!updated) throw new SidecarNotFoundError(this.opts.path, id)\n await this.write(next)\n return updated\n }\n\n /**\n * Remove a row by id. Returns the removed row so the caller can\n * materialize an ITEM.md from its fields. Throws if not found.\n *\n * Use this when a candidate transitions out of `discovered`: pull\n * it from the sidecar, write the ITEM.md, append an event.\n */\n async take(id: string): Promise<CandidateRow> {\n const existing = await this.load()\n const idx = existing.findIndex((r) => r.id === id)\n if (idx === -1) throw new SidecarNotFoundError(this.opts.path, id)\n const removed = existing[idx]!\n const next = [...existing.slice(0, idx), ...existing.slice(idx + 1)]\n await this.write(next)\n return removed\n }\n\n /**\n * Whole-file replace. Used in tests and by the indexer for\n * bulk migrations. Prefer append/update/take for normal flow.\n */\n async write(candidates: readonly CandidateRow[]): Promise<void> {\n const shape: SidecarShape = { candidates }\n const content = yamlStringify(shape, {\n // Stable output: sort keys alphabetically across rows for\n // greppable diffs. Each row's id key is preserved by the\n // stringifier; the rest is dictionary order.\n sortMapEntries: false,\n })\n await this.opts.fs.writeFile(this.opts.path, content)\n }\n}\n\nexport class SidecarDuplicateError extends Error {\n constructor(\n readonly path: string,\n readonly id: string\n ) {\n super(\n `SidecarDuplicateError: candidate id \"${id}\" already exists in ${path}`\n )\n this.name = \"SidecarDuplicateError\"\n }\n}\n\nexport class SidecarNotFoundError extends Error {\n constructor(\n readonly path: string,\n readonly id: string\n ) {\n super(`SidecarNotFoundError: candidate id \"${id}\" not in ${path}`)\n this.name = \"SidecarNotFoundError\"\n }\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  export { systemClock } from './chunk-KYX2DTEH.mjs';
2
2
  import { REFINED_KIND_SCHEMA, resolveKnowledge } from './chunk-JV6VRZ6U.mjs';
3
3
  export { REFINED_KIND_SCHEMA, isRefinedKind, resolveKnowledge } from './chunk-JV6VRZ6U.mjs';
4
- import { CandidatesSidecar } from './chunk-UPX26MYH.mjs';
5
- export { CandidatesSidecar, SidecarDuplicateError, SidecarNotFoundError } from './chunk-UPX26MYH.mjs';
4
+ import { CandidatesSidecar } from './chunk-WF5KGEL6.mjs';
5
+ export { CandidatesSidecar, SidecarDuplicateError, SidecarNotFoundError } from './chunk-WF5KGEL6.mjs';
6
6
  import matter6 from 'gray-matter';
7
7
  import { createHash } from 'crypto';
8
8
  import { z } from 'zod';
@@ -320,6 +320,7 @@ var CorpusEventEmitter = class {
320
320
  constructor(opts) {
321
321
  this.opts = opts;
322
322
  }
323
+ opts;
323
324
  /**
324
325
  * Emit one event. Returns the event as written (including the
325
326
  * ISO timestamp and actor resolved at emit time). The .md log file
@@ -357,6 +358,7 @@ var CorpusWorkspaceReader = class {
357
358
  constructor(opts) {
358
359
  this.opts = opts;
359
360
  }
361
+ opts;
360
362
  /**
361
363
  * Scan the workspace rooted at `root` and return a typed snapshot.
362
364
  * `root` is workspace-relative (the host resolves to a backing
@@ -466,11 +468,15 @@ var CorpusVersionConflictError = class extends Error {
466
468
  this.actual = actual;
467
469
  this.name = "CorpusVersionConflictError";
468
470
  }
471
+ path;
472
+ expected;
473
+ actual;
469
474
  };
470
475
  var CorpusWorkspaceWriter = class _CorpusWorkspaceWriter {
471
476
  constructor(opts) {
472
477
  this.opts = opts;
473
478
  }
479
+ opts;
474
480
  /**
475
481
  * Compute the versionToken for raw file content. Exposed so the
476
482
  * caller can stage a write and pass the same hash function used
@@ -544,6 +550,7 @@ var ImporterRunner = class {
544
550
  constructor(opts) {
545
551
  this.opts = opts;
546
552
  }
553
+ opts;
547
554
  /**
548
555
  * Run a single importer batch end-to-end.
549
556
  *
@@ -686,6 +693,7 @@ var LocalFilesImporter = class {
686
693
  constructor(opts) {
687
694
  this.opts = opts;
688
695
  }
696
+ opts;
689
697
  id = "local-files";
690
698
  label = "Local Files";
691
699
  async *enumerate(target) {
@@ -820,6 +828,7 @@ var WebImporter = class {
820
828
  constructor(opts) {
821
829
  this.opts = opts;
822
830
  }
831
+ opts;
823
832
  id = "web";
824
833
  label = "Web (URLs)";
825
834
  async *enumerate(target) {
@@ -886,6 +895,7 @@ var ConversationImporter = class {
886
895
  constructor(opts) {
887
896
  this.opts = opts;
888
897
  }
898
+ opts;
889
899
  id = "conversation";
890
900
  label = "Conversation";
891
901
  async *enumerate(target) {
@@ -991,6 +1001,7 @@ var DistillRunner = class {
991
1001
  constructor(opts) {
992
1002
  this.opts = opts;
993
1003
  }
1004
+ opts;
994
1005
  async run(source) {
995
1006
  const items = await this.opts.distiller.distill({
996
1007
  title: source.title,
@@ -1471,7 +1482,7 @@ function serializeSynthesis(body, lens, atoms, clock) {
1471
1482
  }
1472
1483
  };
1473
1484
  const trimmed = body.trim();
1474
- return matter6.stringify(trimmed.startsWith("\n") ? trimmed : "\n" + trimmed, fm);
1485
+ return matter6.stringify("\n" + trimmed, fm);
1475
1486
  }
1476
1487
  function buildSynthesisPrompt(input) {
1477
1488
  const atomBlock = input.atoms.map((a, i) => `### Atom ${i + 1}: ${a.title}
@@ -1707,6 +1718,7 @@ var ReadOnlyFs = class {
1707
1718
  constructor(inner) {
1708
1719
  this.inner = inner;
1709
1720
  }
1721
+ inner;
1710
1722
  exists(path) {
1711
1723
  return this.inner.exists(path);
1712
1724
  }
@@ -1791,6 +1803,7 @@ var StackResolver = class {
1791
1803
  constructor(registry) {
1792
1804
  this.registry = registry;
1793
1805
  }
1806
+ registry;
1794
1807
  async resolve(ctx) {
1795
1808
  const providers = [...this.registry.list()].sort((a, b) => a.band - b.band);
1796
1809
  const entries = [];
@@ -1881,6 +1894,7 @@ var SyncRunner = class {
1881
1894
  constructor(opts) {
1882
1895
  this.opts = opts;
1883
1896
  }
1897
+ opts;
1884
1898
  async run() {
1885
1899
  const scheme = this.opts.uriScheme ?? "corpus";
1886
1900
  const throttle = this.opts.throttleMs ?? 0;
@@ -1985,6 +1999,7 @@ var ReviewerTrackRecord = class {
1985
1999
  this.opts = opts;
1986
2000
  this.path = opts.path ?? DEFAULT_PATH;
1987
2001
  }
2002
+ opts;
1988
2003
  path;
1989
2004
  /** Load the full record. Empty when the file doesn't exist yet. */
1990
2005
  async load() {
@@ -2223,6 +2238,7 @@ var CorpusLinter = class {
2223
2238
  constructor(opts) {
2224
2239
  this.opts = opts;
2225
2240
  }
2241
+ opts;
2226
2242
  lint(snapshot) {
2227
2243
  const decls = extractLintDeclarations(snapshot);
2228
2244
  const issues = [];
@@ -2474,6 +2490,9 @@ var IllegalTransitionError = class extends Error {
2474
2490
  this.reason = reason;
2475
2491
  this.name = "IllegalTransitionError";
2476
2492
  }
2493
+ from;
2494
+ to;
2495
+ reason;
2477
2496
  };
2478
2497
  function assertTransition(from, to, graph) {
2479
2498
  const check = canTransition(from, to, graph);
@@ -2601,11 +2620,14 @@ var PromoteRejectedError = class extends Error {
2601
2620
  this.failures = failures;
2602
2621
  this.name = "PromoteRejectedError";
2603
2622
  }
2623
+ entrySlug;
2624
+ failures;
2604
2625
  };
2605
2626
  var CorpusPromoter = class {
2606
2627
  constructor(ctx) {
2607
2628
  this.ctx = ctx;
2608
2629
  }
2630
+ ctx;
2609
2631
  async promote(opts) {
2610
2632
  const reader = new CorpusWorkspaceReader({ fs: this.ctx.fs });
2611
2633
  const writer = new CorpusWorkspaceWriter({ fs: this.ctx.fs });
@@ -2674,7 +2696,7 @@ var CorpusPromoter = class {
2674
2696
  clock: this.ctx.clock
2675
2697
  });
2676
2698
  if (opts.candidateId && opts.candidateSidecarPath) {
2677
- const { CandidatesSidecar: CandidatesSidecar2 } = await import('./sidecar-TTWQD5R3.mjs');
2699
+ const { CandidatesSidecar: CandidatesSidecar2 } = await import('./sidecar-WZTZS2I6.mjs');
2678
2700
  const sidecar = new CandidatesSidecar2({
2679
2701
  fs: this.ctx.fs,
2680
2702
  path: joinPath3(opts.workspacePath, opts.candidateSidecarPath)
@@ -2791,6 +2813,7 @@ var CorpusIndexer = class {
2791
2813
  constructor(opts) {
2792
2814
  this.opts = opts;
2793
2815
  }
2816
+ opts;
2794
2817
  /**
2795
2818
  * Re-sync every active entry. Used at boot (cold-install) and by
2796
2819
  * the admin `corpus reindex` command for drift recovery.
@@ -3216,6 +3239,7 @@ var OperatorOverlayResolver = class {
3216
3239
  constructor(registry) {
3217
3240
  this.registry = registry;
3218
3241
  }
3242
+ registry;
3219
3243
  resolve(ctx) {
3220
3244
  const slugs = ctx.roleSlug ? [ctx.operatorSlug, ctx.roleSlug] : [ctx.operatorSlug];
3221
3245
  const candidates = this.registry.listBy({
@@ -3261,6 +3285,7 @@ var PlaybookNotFoundError = class extends Error {
3261
3285
  this.slug = slug;
3262
3286
  this.name = "PlaybookNotFoundError";
3263
3287
  }
3288
+ slug;
3264
3289
  };
3265
3290
  var IllegalPlaybookTransitionError = class extends Error {
3266
3291
  constructor(slug, from, to) {
@@ -3272,11 +3297,15 @@ var IllegalPlaybookTransitionError = class extends Error {
3272
3297
  this.to = to;
3273
3298
  this.name = "IllegalPlaybookTransitionError";
3274
3299
  }
3300
+ slug;
3301
+ from;
3302
+ to;
3275
3303
  };
3276
3304
  var PlaybookLifecycle = class {
3277
3305
  constructor(opts) {
3278
3306
  this.opts = opts;
3279
3307
  }
3308
+ opts;
3280
3309
  /**
3281
3310
  * Transition `slug` from shadow → active. Cascades through
3282
3311
  * `supersedes[]`: any currently-active playbook listed there is
@@ -3457,6 +3486,7 @@ var PlaybookEvaluator = class {
3457
3486
  constructor(opts) {
3458
3487
  this.opts = opts;
3459
3488
  }
3489
+ opts;
3460
3490
  /**
3461
3491
  * Run an eval batch against a single playbook. For each case:
3462
3492
  * 1. Score shadow.response against rubric → shadowScore