proposal-enrich-llm.test.mjs
sha256:65ccb454656ea5acdea0a10e559b78bcde1eb6ff753ecc2911bc99d1c3d7cadd
feat(calendar): enforce agent context tiers in retrieval AP…
Human
minor
⚠ breaking
1 day ago
| 1 | import { describe, it } from 'node:test'; |
| 2 | import assert from 'node:assert'; |
| 3 | import { |
| 4 | parseEnrichModelOutput, |
| 5 | validateAndNormalizeSuggestedFrontmatter, |
| 6 | validateAndNormalizeEnrichResult, |
| 7 | normalizeSuggestedLabels, |
| 8 | serializeSuggestedFrontmatterJson, |
| 9 | buildEnrichMessages, |
| 10 | } from '../lib/proposal-enrich-llm.mjs'; |
| 11 | |
| 12 | describe('proposal-enrich-llm', () => { |
| 13 | it('parseEnrichModelOutput parses envelope and strips fences', () => { |
| 14 | const raw = '```json\n{"enrich_version":2,"summary":"Hi","suggested_labels":["a","b"],"suggested_frontmatter":{"project":"Foo-Bar"}}\n```'; |
| 15 | const p = parseEnrichModelOutput(raw); |
| 16 | assert.strictEqual(p.enrich_version, 2); |
| 17 | assert.strictEqual(p.summary, 'Hi'); |
| 18 | assert.deepStrictEqual(p.suggested_labels, ['a', 'b']); |
| 19 | assert.strictEqual(p.suggested_frontmatter.project, 'Foo-Bar'); |
| 20 | assert.strictEqual(p.parseOk, true); |
| 21 | }); |
| 22 | |
| 23 | it('validateAndNormalizeSuggestedFrontmatter normalizes slugs and strips forbidden keys', () => { |
| 24 | const out = validateAndNormalizeSuggestedFrontmatter({ |
| 25 | project: 'My Project!', |
| 26 | causal_chain_id: 'Chain One', |
| 27 | entity: ['Alice B', 'bob'], |
| 28 | knowtation_editor: 'x', |
| 29 | network: 'eth', |
| 30 | tags: ['A', 'b'], |
| 31 | follows: 'inbox/../escape.md', |
| 32 | good: 'ignored-unknown-key', |
| 33 | }); |
| 34 | assert.strictEqual(out.project, 'my-project'); |
| 35 | assert.strictEqual(out.causal_chain_id, 'chain-one'); |
| 36 | assert.deepStrictEqual(out.entity, ['alice-b', 'bob']); |
| 37 | assert.deepStrictEqual(out.tags, ['a', 'b']); |
| 38 | assert.strictEqual(out.knowtation_editor, undefined); |
| 39 | assert.strictEqual(out.network, undefined); |
| 40 | assert.strictEqual(out.good, undefined); |
| 41 | assert.strictEqual(out.follows, undefined); |
| 42 | }); |
| 43 | |
| 44 | it('validateAndNormalizeSuggestedFrontmatter accepts safe follows path', () => { |
| 45 | const out = validateAndNormalizeSuggestedFrontmatter({ |
| 46 | follows: 'projects/foo/note.md', |
| 47 | }); |
| 48 | assert.strictEqual(out.follows, 'projects/foo/note.md'); |
| 49 | }); |
| 50 | |
| 51 | it('normalizeSuggestedLabels dedupes and caps', () => { |
| 52 | const out = normalizeSuggestedLabels(['a', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']); |
| 53 | assert.strictEqual(out.length, 8); |
| 54 | }); |
| 55 | |
| 56 | it('validateAndNormalizeEnrichResult end-to-end', () => { |
| 57 | const raw = |
| 58 | '{"enrich_version":2,"summary":"S","suggested_labels":["tag-one"],"suggested_frontmatter":{"title":"T","episode_id":"Ep_1","entity":["Alice B","Core API"],"causal_chain_id":"Launch Rollout","state_snapshot":"true"}}'; |
| 59 | const r = validateAndNormalizeEnrichResult(raw); |
| 60 | assert.strictEqual(r.summary, 'S'); |
| 61 | assert.deepStrictEqual(r.suggested_labels, ['tag-one']); |
| 62 | assert.strictEqual(r.suggested_frontmatter.title, 'T'); |
| 63 | assert.strictEqual(r.suggested_frontmatter.episode_id, 'ep-1'); |
| 64 | assert.deepStrictEqual(r.suggested_frontmatter.entity, ['alice-b', 'core-api']); |
| 65 | assert.strictEqual(r.suggested_frontmatter.causal_chain_id, 'launch-rollout'); |
| 66 | assert.strictEqual(r.suggested_frontmatter.state_snapshot, true); |
| 67 | }); |
| 68 | |
| 69 | it('serializeSuggestedFrontmatterJson returns bounded object', () => { |
| 70 | const s = serializeSuggestedFrontmatterJson({ project: 'x' }); |
| 71 | assert(s.includes('project')); |
| 72 | const empty = serializeSuggestedFrontmatterJson({}); |
| 73 | assert.strictEqual(empty, '{}'); |
| 74 | }); |
| 75 | |
| 76 | it('buildEnrichMessages includes allow-list and path', () => { |
| 77 | const { system, user } = buildEnrichMessages({ path: 'inbox/x.md', intent: 'fix', body: 'hello' }); |
| 78 | assert(system.includes('enrich_version')); |
| 79 | assert(system.includes('Prefer returning every field')); |
| 80 | assert(user.includes('inbox/x.md')); |
| 81 | assert(user.includes('fix')); |
| 82 | assert(user.includes('hello')); |
| 83 | assert(user.includes('Prioritize temporal, causal, entity, and relationship metadata')); |
| 84 | assert(user.includes('causal_chain_id')); |
| 85 | assert(user.includes('state_snapshot')); |
| 86 | }); |
| 87 | }); |
File History
2 commits
sha256:65ccb454656ea5acdea0a10e559b78bcde1eb6ff753ecc2911bc99d1c3d7cadd
feat(calendar): enforce agent context tiers in retrieval AP…
Human
minor
⚠
1 day ago
sha256:9103f98c89257ed2b01c237cea895dabb3e85ea337dccb1161c175e4422355b6
docs: accept Calendar Events v0 spec with Phase 0 security …
Human
1 day ago