@cat-factory/kernel 0.159.1 → 0.161.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.
Files changed (39) hide show
  1. package/dist/domain/catalog.d.ts +10 -1
  2. package/dist/domain/catalog.d.ts.map +1 -1
  3. package/dist/domain/catalog.js +13 -2
  4. package/dist/domain/catalog.js.map +1 -1
  5. package/dist/domain/change-class.d.ts +60 -0
  6. package/dist/domain/change-class.d.ts.map +1 -0
  7. package/dist/domain/change-class.js +306 -0
  8. package/dist/domain/change-class.js.map +1 -0
  9. package/dist/domain/types.d.ts +1 -1
  10. package/dist/domain/types.d.ts.map +1 -1
  11. package/dist/domain/workspace-cascade.d.ts +1 -1
  12. package/dist/domain/workspace-cascade.d.ts.map +1 -1
  13. package/dist/domain/workspace-cascade.js +2 -0
  14. package/dist/domain/workspace-cascade.js.map +1 -1
  15. package/dist/index.d.ts +10 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +10 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/ports/index.d.ts +4 -1
  20. package/dist/ports/index.d.ts.map +1 -1
  21. package/dist/ports/index.js +1 -0
  22. package/dist/ports/index.js.map +1 -1
  23. package/dist/ports/issue-writeback.d.ts +55 -0
  24. package/dist/ports/issue-writeback.d.ts.map +1 -1
  25. package/dist/ports/merge-track-record-repositories.d.ts +45 -0
  26. package/dist/ports/merge-track-record-repositories.d.ts.map +1 -0
  27. package/dist/ports/merge-track-record-repositories.js +2 -0
  28. package/dist/ports/merge-track-record-repositories.js.map +1 -0
  29. package/dist/ports/repo-files.d.ts +10 -0
  30. package/dist/ports/repo-files.d.ts.map +1 -1
  31. package/dist/ports/review-question-post-repositories.d.ts +71 -0
  32. package/dist/ports/review-question-post-repositories.d.ts.map +1 -0
  33. package/dist/ports/review-question-post-repositories.js +33 -0
  34. package/dist/ports/review-question-post-repositories.js.map +1 -0
  35. package/dist/shared/host-markdown.logic.d.ts +51 -0
  36. package/dist/shared/host-markdown.logic.d.ts.map +1 -0
  37. package/dist/shared/host-markdown.logic.js +202 -0
  38. package/dist/shared/host-markdown.logic.js.map +1 -0
  39. package/package.json +2 -2
@@ -0,0 +1,202 @@
1
+ // ---------------------------------------------------------------------------
2
+ // The TEXT BOUNDARY for anything this platform writes onto a VCS/tracker host.
3
+ //
4
+ // A pull-request description — or an issue comment — is NOT an inert string sink. The host
5
+ // parses it: `#123` becomes an issue link, `@name` notifies a real person, a closing keyword
6
+ // in front of an issue reference CLOSES that issue when the PR merges, a newline ends a
7
+ // markdown table row, and an unbalanced code fence swallows everything after it — including
8
+ // the machine-readable JSON block external tooling ingests.
9
+ //
10
+ // Almost everything we splice into such a body is written by an agent or a human (a task
11
+ // title, a tester summary, a merge rationale, a provisioner's stderr, a requirements
12
+ // reviewer's question), so all of those are live hazards rather than theoretical ones: "This
13
+ // closes #42" is idiomatic prose for a merge rationale to emit, and it must not close issue
14
+ // 42; "@alice should decide the rounding rule" is idiomatic for a reviewer finding, and it
15
+ // must not page whoever owns that handle.
16
+ //
17
+ // This module is the single place that turns untrusted text into something safe to send to a
18
+ // host. It lives in kernel because it has TWO consumers on opposite sides of the architecture
19
+ // — the PR verification report (orchestration) and the tracker-issue writebacks
20
+ // (integrations) — and a second copy of these escapes is exactly how one of them would drift
21
+ // into notifying real accounts. It is deliberately separate from the composers (which decide
22
+ // WHAT to say) and from the marker splice in `domain/pr-report.ts` (which decides WHERE it
23
+ // goes).
24
+ //
25
+ // Adding a field to any host-bound body means picking one of {@link inline}, {@link cell} or
26
+ // {@link prose} for it — never a bare template hole.
27
+ // ---------------------------------------------------------------------------
28
+ /** Free-text prose (a tester summary, a merge rationale) is capped at this many characters. */
29
+ export const MAX_PROSE_CHARS = 4_000;
30
+ /** A single markdown table cell is capped at this many characters. */
31
+ export const MAX_CELL_CHARS = 300;
32
+ /** Any rendered list/table in the report is capped at this many rows. */
33
+ export const MAX_LIST_ITEMS = 50;
34
+ /**
35
+ * Hard ceiling for the whole rendered section. GitHub rejects a PR body over 65,536
36
+ * characters with a 422, and the body also has to hold the agent's own description, so the
37
+ * managed region keeps well clear of the limit. With the per-field caps above this is
38
+ * unreachable for realistic runs; it exists so that pathological data degrades visibly
39
+ * instead of making every publish fail silently forever.
40
+ */
41
+ export const MAX_SECTION_CHARS = 50_000;
42
+ /** Marks where a value was cut, so a reader never mistakes a truncation for the whole story. */
43
+ const TRUNCATION_NOTE = '… (truncated)';
44
+ /**
45
+ * The host's closing keywords. A PR body carrying one of these in front of an issue reference
46
+ * closes that issue on merge — a side effect the engine must never trigger on the agent's
47
+ * behalf. Same list on GitHub and GitLab.
48
+ */
49
+ const CLOSING_KEYWORDS = 'close[sd]?|closing|fix|fixe[sd]|fixing|resolve[sd]?|resolving|implement(?:s|ed)?|implementing';
50
+ /** An issue/MR URL on either host, in the form a closing keyword can reference. */
51
+ const ISSUE_URL = String.raw `https?://\S+?/(?:issues|-/issues|merge_requests|pull)/\d+`;
52
+ /**
53
+ * Every auto-linking trigger, in ONE alternation.
54
+ *
55
+ * Deliberately a single pass rather than chained `.replace()` calls: each escape EMITS a `#`,
56
+ * so a later rule would re-escape the output of an earlier one (`@` → `@` → `@`).
57
+ * One regex means the replacement text is never rescanned.
58
+ */
59
+ const AUTO_LINK_TRIGGERS = new RegExp([
60
+ // A closing keyword in front of an issue/MR URL. The URL form survives the character
61
+ // escapes below (nothing in it is a trigger), so the KEYWORD is what gets defused.
62
+ String.raw `(?<keyword>\b(?:${CLOSING_KEYWORDS}))(?=\s*:?\s+${ISSUE_URL})`,
63
+ // `@name` / `@org/team` — a mention notifies a real account.
64
+ String.raw `(?<at>@(?=[A-Za-z0-9]))`,
65
+ // `#123` and `owner/repo#123` — an issue/PR cross-reference.
66
+ String.raw `(?<hash>#(?=\d))`,
67
+ // `!123` — GitLab's merge-request reference.
68
+ String.raw `(?<bang>!(?=\d))`,
69
+ ].join('|'), 'gi');
70
+ /**
71
+ * Neutralise the host's auto-linking triggers in ONE line of untrusted text, leaving inline
72
+ * code spans alone (the host does not auto-link inside them, so escaping there would only
73
+ * show the reader a literal `&#35;`).
74
+ *
75
+ * The escapes are numeric HTML entities, which render as the original character but are
76
+ * invisible to the reference parser — so the reader sees exactly what the agent wrote while
77
+ * the mention/close side effects are defused.
78
+ */
79
+ function inertLine(line) {
80
+ return mapOutsideCodeSpans(line, (text) => text.replace(AUTO_LINK_TRIGGERS, (match, ...args) => {
81
+ const groups = args[args.length - 1];
82
+ // Entity-escaping the FIRST character is enough to break the parser's match while
83
+ // rendering identically — which matters most for the keyword, whose remaining letters
84
+ // are ordinary prose the reader should still see.
85
+ return `&#${match.charCodeAt(0)};${groups.keyword ? match.slice(1) : ''}`;
86
+ }));
87
+ }
88
+ /**
89
+ * Apply `fn` to the parts of `line` that are NOT inline code spans. Code spans are matched by
90
+ * a backtick run and its matching closer, which is CommonMark's rule and — more to the point
91
+ * — the rule the host renderer applies when deciding where to auto-link.
92
+ */
93
+ function mapOutsideCodeSpans(line, fn) {
94
+ const out = [];
95
+ let index = 0;
96
+ const span = /(`+)[\s\S]*?\1/g;
97
+ let match;
98
+ while ((match = span.exec(line)) !== null) {
99
+ out.push(fn(line.slice(index, match.index)), match[0]);
100
+ index = match.index + match[0].length;
101
+ }
102
+ return out.join('') + fn(line.slice(index));
103
+ }
104
+ /** A line that opens or closes a fenced code block, with the fence it uses. */
105
+ function fenceAt(line) {
106
+ const match = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);
107
+ if (!match)
108
+ return null;
109
+ const fence = match[1];
110
+ // A ``` fence's info string may not contain a backtick (CommonMark), which is what stops an
111
+ // inline span from being read as a fence.
112
+ if (fence.startsWith('`') && match[2].includes('`'))
113
+ return null;
114
+ return { char: fence[0], length: fence.length, info: match[2].trim().length > 0 };
115
+ }
116
+ /**
117
+ * Walk `lines`, tracking fenced-code state, and hand each line to `visit` together with
118
+ * whether it sits INSIDE a fenced block. Returns the fence still open at the end, if any.
119
+ *
120
+ * One shared walker so the two things that care about fences — leaving code untouched, and
121
+ * closing what the text left open — can never disagree about where a block starts and ends.
122
+ */
123
+ function walkFences(lines, visit) {
124
+ let open = null;
125
+ for (const line of lines) {
126
+ const fence = fenceAt(line);
127
+ // The fence line itself belongs to the code block, so it is never rewritten.
128
+ visit(line, open !== null || fence !== null);
129
+ if (!fence)
130
+ continue;
131
+ if (!open)
132
+ open = { char: fence.char, length: fence.length };
133
+ else if (fence.char === open.char && fence.length >= open.length && !fence.info)
134
+ open = null;
135
+ }
136
+ return open;
137
+ }
138
+ /**
139
+ * Close any code fence the text leaves open.
140
+ *
141
+ * An unbalanced fence in agent prose — an interrupted transcript, a truncated tool dump — would
142
+ * otherwise swallow every section rendered after it, including the fenced JSON block that is
143
+ * the report's machine-readable contract. Balancing preserves the agent's own formatting
144
+ * (unlike escaping the fences) while guaranteeing the enclosing document stays well-formed.
145
+ */
146
+ export function balanceFences(text) {
147
+ const open = walkFences(text.split('\n'), () => { });
148
+ return open ? `${text}\n${open.char.repeat(open.length)}` : text;
149
+ }
150
+ /** Cut `value` to `max` characters, marking the cut. Prefers a line boundary when one is near. */
151
+ function truncate(value, max) {
152
+ if (value.length <= max)
153
+ return value;
154
+ const head = value.slice(0, max);
155
+ const lastNewline = head.lastIndexOf('\n');
156
+ const body = lastNewline > max * 0.6 ? head.slice(0, lastNewline) : head;
157
+ return `${body.trimEnd()}\n\n${TRUNCATION_NOTE}`;
158
+ }
159
+ /**
160
+ * Render untrusted multi-line prose as a safe markdown block: auto-link triggers defused,
161
+ * length capped, and any code fence the value leaves open closed again.
162
+ *
163
+ * `max` lets a caller with a tighter budget than a PR body (a tracker comment renders many of
164
+ * these into one payload, and Jira rejects an oversized comment outright) cut to ITS limit —
165
+ * the cut happens BEFORE the escapes, so an entity can never be sliced in half.
166
+ */
167
+ export function prose(value, max = MAX_PROSE_CHARS) {
168
+ const capped = truncate(value.replace(/\r\n?/g, '\n'), max);
169
+ const rewritten = [];
170
+ const open = walkFences(capped.split('\n'), (line, insideFence) => {
171
+ rewritten.push(insideFence ? line : inertLine(line));
172
+ });
173
+ const text = rewritten.join('\n');
174
+ return open ? `${text}\n${open.char.repeat(open.length)}` : text;
175
+ }
176
+ /**
177
+ * Render untrusted text as ONE markdown table cell: newlines folded to `<br>` (a raw newline
178
+ * ends the row and spills the rest of the value into the document as loose prose), pipes
179
+ * escaped so a value cannot open a new column, auto-link triggers defused, and the whole thing
180
+ * capped so a stack trace cannot dominate the table.
181
+ */
182
+ export function cell(value) {
183
+ const flattened = truncate(value.replace(/\r\n?/g, '\n'), MAX_CELL_CHARS)
184
+ .replaceAll('|', '\\|')
185
+ .replace(/\n+/g, '<br>');
186
+ return inertLine(flattened);
187
+ }
188
+ /**
189
+ * Render untrusted text INLINE (a title, a label — not a table cell, so pipes are harmless).
190
+ * Newlines are folded to spaces because the surrounding line has its own meaning. `max` caps
191
+ * to a caller's own budget, before the escapes, exactly as in {@link prose}.
192
+ */
193
+ export function inline(value, max = MAX_CELL_CHARS) {
194
+ return inertLine(truncate(value.replace(/\s+/g, ' '), max));
195
+ }
196
+ /** Cap a list at {@link MAX_LIST_ITEMS}, returning the kept rows plus how many were dropped. */
197
+ export function capList(items) {
198
+ if (items.length <= MAX_LIST_ITEMS)
199
+ return { items: [...items], dropped: 0 };
200
+ return { items: items.slice(0, MAX_LIST_ITEMS), dropped: items.length - MAX_LIST_ITEMS };
201
+ }
202
+ //# sourceMappingURL=host-markdown.logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-markdown.logic.js","sourceRoot":"","sources":["../../src/shared/host-markdown.logic.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+EAA+E;AAC/E,EAAE;AACF,2FAA2F;AAC3F,6FAA6F;AAC7F,wFAAwF;AACxF,4FAA4F;AAC5F,4DAA4D;AAC5D,EAAE;AACF,yFAAyF;AACzF,qFAAqF;AACrF,6FAA6F;AAC7F,4FAA4F;AAC5F,2FAA2F;AAC3F,0CAA0C;AAC1C,EAAE;AACF,6FAA6F;AAC7F,8FAA8F;AAC9F,gFAAgF;AAChF,6FAA6F;AAC7F,6FAA6F;AAC7F,2FAA2F;AAC3F,SAAS;AACT,EAAE;AACF,6FAA6F;AAC7F,qDAAqD;AACrD,8EAA8E;AAE9E,+FAA+F;AAC/F,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAA;AACpC,sEAAsE;AACtE,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AACjC,yEAAyE;AACzE,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAA;AAChC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA;AAEvC,gGAAgG;AAChG,MAAM,eAAe,GAAG,eAAe,CAAA;AAEvC;;;;GAIG;AACH,MAAM,gBAAgB,GACpB,+FAA+F,CAAA;AAEjG,mFAAmF;AACnF,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAA,2DAA2D,CAAA;AAEvF;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,IAAI,MAAM,CACnC;IACE,qFAAqF;IACrF,mFAAmF;IACnF,MAAM,CAAC,GAAG,CAAA,mBAAmB,gBAAgB,gBAAgB,SAAS,GAAG;IACzE,6DAA6D;IAC7D,MAAM,CAAC,GAAG,CAAA,yBAAyB;IACnC,6DAA6D;IAC7D,MAAM,CAAC,GAAG,CAAA,kBAAkB;IAC5B,6CAA6C;IAC7C,MAAM,CAAC,GAAG,CAAA,kBAAkB;CAC7B,CAAC,IAAI,CAAC,GAAG,CAAC,EACX,IAAI,CACL,CAAA;AAED;;;;;;;;GAQG;AACH,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,mBAAmB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACxC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAuC,CAAA;QAC1E,kFAAkF;QAClF,sFAAsF;QACtF,kDAAkD;QAClD,OAAO,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IAC3E,CAAC,CAAC,CACH,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,IAAY,EAAE,EAA4B;IACrE,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,IAAI,GAAG,iBAAiB,CAAA;IAC9B,IAAI,KAA6B,CAAA;IACjC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QACtD,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACvC,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;AAC7C,CAAC;AAED,+EAA+E;AAC/E,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;IACvB,4FAA4F;IAC5F,0CAA0C;IAC1C,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACjE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAA;AACrF,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CACjB,KAAwB,EACxB,KAAmD;IAEnD,IAAI,IAAI,GAA4C,IAAI,CAAA;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3B,6EAA6E;QAC7E,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,CAAA;QAC5C,IAAI,CAAC,KAAK;YAAE,SAAQ;QACpB,IAAI,CAAC,IAAI;YAAE,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAA;aACvD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI;YAAE,IAAI,GAAG,IAAI,CAAA;IAC9F,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACnD,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAClE,CAAC;AAED,kGAAkG;AAClG,SAAS,QAAQ,CAAC,KAAa,EAAE,GAAW;IAC1C,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,KAAK,CAAA;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAChC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,IAAI,GAAG,WAAW,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACxE,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,eAAe,EAAE,CAAA;AAClD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,GAAG,GAAW,eAAe;IAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;IAC3D,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE;QAChE,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACjC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,IAAI,CAAC,KAAa;IAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,cAAc,CAAC;SACtE,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;SACtB,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1B,OAAO,SAAS,CAAC,SAAS,CAAC,CAAA;AAC7B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,GAAG,GAAW,cAAc;IAChE,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;AAC7D,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,OAAO,CAAI,KAAmB;IAC5C,IAAI,KAAK,CAAC,MAAM,IAAI,cAAc;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAA;IAC5E,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,cAAc,EAAE,CAAA;AAC1F,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/kernel",
3
- "version": "0.159.1",
3
+ "version": "0.161.0",
4
4
  "description": "Shared vocabulary, pure logic, and port interfaces for the Agent Architecture Board.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,7 +26,7 @@
26
26
  "dependencies": {
27
27
  "ai": "^7.0.35",
28
28
  "yaml": "^2.9.0",
29
- "@cat-factory/contracts": "0.165.0"
29
+ "@cat-factory/contracts": "0.167.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@vitest/coverage-v8": "^4.1.10",