agentfootprint 9.134.5 → 9.134.6

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 (54) hide show
  1. package/dist/core/agent/assessment/reasons.js +1 -1
  2. package/dist/core/agent/assessment/reasons.js.map +1 -1
  3. package/dist/core/agent/coverage/emptiness.js +103 -24
  4. package/dist/core/agent/coverage/emptiness.js.map +1 -1
  5. package/dist/esm/core/agent/assessment/reasons.js +1 -1
  6. package/dist/esm/core/agent/assessment/reasons.js.map +1 -1
  7. package/dist/esm/core/agent/coverage/emptiness.d.ts +50 -1
  8. package/dist/esm/core/agent/coverage/emptiness.js +103 -24
  9. package/dist/esm/core/agent/coverage/emptiness.js.map +1 -1
  10. package/dist/esm/lib/answer-account/account.js +2 -3
  11. package/dist/esm/lib/answer-account/account.js.map +1 -1
  12. package/dist/esm/lib/answer-account/facts/calls.js +2 -3
  13. package/dist/esm/lib/answer-account/facts/calls.js.map +1 -1
  14. package/dist/esm/lib/answer-account/facts/common.d.ts +11 -0
  15. package/dist/esm/lib/answer-account/facts/common.js +11 -0
  16. package/dist/esm/lib/answer-account/facts/common.js.map +1 -1
  17. package/dist/esm/lib/answer-account/facts/inView.js +2 -3
  18. package/dist/esm/lib/answer-account/facts/inView.js.map +1 -1
  19. package/dist/esm/lib/answer-account/shown.js +5 -1
  20. package/dist/esm/lib/answer-account/shown.js.map +1 -1
  21. package/dist/esm/lib/answer-account/signals.js +28 -15
  22. package/dist/esm/lib/answer-account/signals.js.map +1 -1
  23. package/dist/esm/lib/answer-account/templates.d.ts +3 -1
  24. package/dist/esm/lib/answer-account/templates.js +5 -1
  25. package/dist/esm/lib/answer-account/templates.js.map +1 -1
  26. package/dist/esm/lib/answer-account/types.d.ts +21 -0
  27. package/dist/lib/answer-account/account.js +1 -2
  28. package/dist/lib/answer-account/account.js.map +1 -1
  29. package/dist/lib/answer-account/facts/calls.js +1 -2
  30. package/dist/lib/answer-account/facts/calls.js.map +1 -1
  31. package/dist/lib/answer-account/facts/common.js +13 -1
  32. package/dist/lib/answer-account/facts/common.js.map +1 -1
  33. package/dist/lib/answer-account/facts/inView.js +1 -2
  34. package/dist/lib/answer-account/facts/inView.js.map +1 -1
  35. package/dist/lib/answer-account/shown.js +5 -1
  36. package/dist/lib/answer-account/shown.js.map +1 -1
  37. package/dist/lib/answer-account/signals.js +27 -14
  38. package/dist/lib/answer-account/signals.js.map +1 -1
  39. package/dist/lib/answer-account/templates.js +5 -1
  40. package/dist/lib/answer-account/templates.js.map +1 -1
  41. package/dist/types/core/agent/coverage/emptiness.d.ts +50 -1
  42. package/dist/types/core/agent/coverage/emptiness.d.ts.map +1 -1
  43. package/dist/types/lib/answer-account/account.d.ts.map +1 -1
  44. package/dist/types/lib/answer-account/facts/calls.d.ts.map +1 -1
  45. package/dist/types/lib/answer-account/facts/common.d.ts +11 -0
  46. package/dist/types/lib/answer-account/facts/common.d.ts.map +1 -1
  47. package/dist/types/lib/answer-account/facts/inView.d.ts.map +1 -1
  48. package/dist/types/lib/answer-account/shown.d.ts.map +1 -1
  49. package/dist/types/lib/answer-account/signals.d.ts.map +1 -1
  50. package/dist/types/lib/answer-account/templates.d.ts +3 -1
  51. package/dist/types/lib/answer-account/templates.d.ts.map +1 -1
  52. package/dist/types/lib/answer-account/types.d.ts +21 -0
  53. package/dist/types/lib/answer-account/types.d.ts.map +1 -1
  54. package/package.json +1 -1
@@ -83,7 +83,7 @@ exports.REASONS = Object.freeze([
83
83
  reason: 'empty-undeclared',
84
84
  layer: 3,
85
85
  class: 'not-sure',
86
- reads: 'history: an empty rowset (a top-level array, or the app’s rowsAt key) whose call has no coverage row',
86
+ reads: 'history: an empty rowset (a top-level array, the app’s rowsAt key, or the dataset ticket left where those rows were, counting 0) whose call has no coverage row',
87
87
  },
88
88
  {
89
89
  reason: 'period-not-held',
@@ -1 +1 @@
1
- {"version":3,"file":"reasons.js","sourceRoot":"","sources":["../../../../src/core/agent/assessment/reasons.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reasons.js","sourceRoot":"","sources":["../../../../src/core/agent/assessment/reasons.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,9 @@
5
5
  * Pattern: typed routes over two inputs — the value the MODEL read, and the
6
6
  * door the RECORD says the call returned — and never a guess.
7
7
  * Role: core/ layer, pure. It imports the recognizers only
8
- * (`coverage/recognize.ts`), never a mint, so a post-hoc reader
8
+ * (`coverage/recognize.ts`; the artifact ref grammar and the
9
+ * placement ticket's guard, `artifacts/naming.ts`,
10
+ * `artifacts/placement.ts`), never a mint, so a post-hoc reader
9
11
  * loads it without the tool-name checks and refusal sentences.
10
12
  * Callers: the `/observe` answer account (`lib/answer-account/facts/calls.ts`
11
13
  * for this run's calls, `lib/answer-account/facts/inView.ts` for an
@@ -25,9 +27,40 @@
25
27
  * | a `describedResult()` with only `clarify` | `clarify` — a question handed back, no data | — |
26
28
  * | a `coverage()` envelope | its wrapped `result`, read by these same routes, marked `bounded`; an empty wrapped rowset reads `declared-absent` | library or app |
27
29
  * | a bare top-level array | `undeclared-empty` or `non-empty` | library |
30
+ * | the library's placement ticket (`placedToolResult`) — the whole result is in the store | `unknown`, said: the ticket counts bytes, never rows | — |
28
31
  * | an object whose key the app declared in `rowsAt` | `undeclared-empty` or `non-empty` | app |
32
+ * | an object whose `rowsAt` rows went to the store — the dataset ticket left in their place | the ticket's whole-number `rows`: `undeclared-empty` (0) or `non-empty`; no count → `unknown`, said | app |
33
+ * | an object with no list and no ticket at the declared `rowsAt` | `unknown`, said: the declared key holds no list | — |
29
34
  * | anything else | `unknown` — the record cannot read it | — |
30
35
  *
36
+ * ## Rows that travel by reference
37
+ *
38
+ * A projection may move a rowset out of the value the model reads and leave a
39
+ * TICKET to the artifact store in its place — `withDatasetArtifacts` /
40
+ * `stageDatasetArtifacts` stage the rows, and a projection (or an after-tool
41
+ * `allow(replacement)`) keeps the ticket and drops the rows. The library's
42
+ * spelling of that ticket, the one this reader counts:
43
+ *
44
+ * ```ts
45
+ * { …, datasets: { rows: { ref: 'art_…', kind: 'dataset/rows', rows: 2, sourceField: 'rows' } },
46
+ * dataset: { ref: 'art_…', kind: 'dataset/rows', rows: 2, sourceField: 'rows' } } // the principal one
47
+ * ```
48
+ *
49
+ * `ref` is a store ref (`isArtifactRef`), `rows` the whole-number row count,
50
+ * `sourceField` the result key the rows came from. The ticket is read only for
51
+ * the key the APP declared (`rowsAt`), only when that key is gone from the
52
+ * value (moved, not merely beside it), and only when the ticket names it —
53
+ * keyed under `datasets[rowsAt]` (a `sourceField`, when present, agreeing) or
54
+ * the principal `dataset` with `sourceField: rowsAt`. Two declarations meet
55
+ * there: the app's key and the ticket's field. A ticket with no whole-number
56
+ * `rows` is never guessed: whether the result was empty cannot be told, and
57
+ * the reading says why (`rowsUnread`). The library's own placement ticket
58
+ * (`artifacts/placement.ts`) puts the WHOLE result in the store and counts
59
+ * bytes, so it reads the same way. Take 4 of the demo video: a ticketed
60
+ * `pscale_client_health` (2 rows, `sourceField: 'rows'`, the app's `rowsAt:
61
+ * 'rows'`) read as "its shape is not declared", and the account's tone stayed
62
+ * unknown.
63
+ *
31
64
  * ## The door decides, when the record holds one
32
65
  *
33
66
  * A marker in the bytes is not a declaration: an envelope a tool returned as
@@ -62,6 +95,8 @@
62
95
  */
63
96
  Object.defineProperty(exports, "__esModule", { value: true });
64
97
  exports.readEmptiness = exports.declaredByValue = exports.parseMaybeJson = exports.rowsAtProblem = void 0;
98
+ const naming_js_1 = require("../../../artifacts/naming.js");
99
+ const placement_js_1 = require("../../../artifacts/placement.js");
65
100
  const recognize_js_1 = require("./recognize.js");
66
101
  /** How deep `coverage(coverage(…))` is read before the reading gives up (`unknown`). */
67
102
  const MAX_BOUND_DEPTH = 8;
@@ -100,29 +135,71 @@ const DECLARED_ABSENT = Object.freeze({
100
135
  emptiness: 'declared-absent',
101
136
  undeclaredShape: false,
102
137
  });
103
- /** A bare rowset: a top-level array (library-counted) or the app's `rowsAt` key (app-counted). */
104
- function rowsetReading(data, rowsAt) {
105
- if (Array.isArray(data)) {
106
- return data.length === 0
107
- ? { emptiness: 'undeclared-empty', rows: 0, source: 'library', undeclaredShape: false }
108
- : { emptiness: 'non-empty', rows: data.length, source: 'library', undeclaredShape: false };
109
- }
110
- if (isRecord(data)) {
111
- const rows = rowsAt !== undefined ? data[rowsAt] : undefined;
112
- if (rowsAt !== undefined && Array.isArray(rows)) {
113
- return rows.length === 0
114
- ? { emptiness: 'undeclared-empty', rows: 0, source: 'app', rowsAt, undeclaredShape: false }
115
- : {
116
- emptiness: 'non-empty',
117
- rows: rows.length,
118
- source: 'app',
119
- rowsAt,
120
- undeclaredShape: false,
121
- };
138
+ /** A count of rows: `undeclared-empty` at zero, `non-empty` above it. */
139
+ function counted(rows, source, countedAt, rowsAt) {
140
+ return {
141
+ emptiness: rows === 0 ? 'undeclared-empty' : 'non-empty',
142
+ rows,
143
+ source,
144
+ ...(rowsAt !== undefined && { rowsAt }),
145
+ countedAt,
146
+ undeclaredShape: false,
147
+ };
148
+ }
149
+ const UNCOUNTED_TICKET = Object.freeze({
150
+ emptiness: 'unknown',
151
+ undeclaredShape: false,
152
+ rowsUnread: 'uncounted-ticket',
153
+ });
154
+ /** A ticket to the artifact store: an object whose `ref` is a store ref. */
155
+ const isTicket = (value) => isRecord(value) && (0, naming_js_1.isArtifactRef)(value.ref);
156
+ /**
157
+ * The dataset ticket standing for the declared rows key — `datasets[rowsAt]`
158
+ * (its `sourceField`, when present, naming that key) or the principal
159
+ * `dataset` with `sourceField: rowsAt` — with where it sits. See "Rows that
160
+ * travel by reference" in the header.
161
+ */
162
+ function ticketFor(data, rowsAt) {
163
+ const all = data.datasets;
164
+ if (isRecord(all) && Object.hasOwn(all, rowsAt)) {
165
+ const ticket = all[rowsAt];
166
+ if (isTicket(ticket) && (ticket.sourceField === undefined || ticket.sourceField === rowsAt)) {
167
+ return { ticket, at: ['datasets', rowsAt] };
122
168
  }
169
+ }
170
+ const principal = data.dataset;
171
+ return isTicket(principal) && principal.sourceField === rowsAt
172
+ ? { ticket: principal, at: ['dataset'] }
173
+ : undefined;
174
+ }
175
+ /**
176
+ * A bare rowset: a top-level array (library-counted), the app's `rowsAt` key
177
+ * or the dataset ticket left where those rows were (app-counted).
178
+ */
179
+ function rowsetReading(data, rowsAt) {
180
+ if (Array.isArray(data))
181
+ return counted(data.length, 'library', []);
182
+ if (!isRecord(data))
183
+ return { emptiness: 'unknown', undeclaredShape: false };
184
+ // The library's own placement: the whole result is in the store, and its ticket counts bytes.
185
+ if ((0, placement_js_1.isPlacedToolResult)(data))
186
+ return UNCOUNTED_TICKET;
187
+ if (rowsAt === undefined)
123
188
  return { emptiness: 'unknown', undeclaredShape: true };
189
+ // Own keys only. A key set to `undefined` is gone too — its JSON (the history, a saved
190
+ // recording) drops it, and the live value must read the same.
191
+ const rows = Object.hasOwn(data, rowsAt) ? data[rowsAt] : undefined;
192
+ if (Array.isArray(rows))
193
+ return counted(rows.length, 'app', [rowsAt], rowsAt);
194
+ // Moved, not merely beside: a key still in the value is read as the value holds it.
195
+ const found = rows === undefined ? ticketFor(data, rowsAt) : undefined;
196
+ if (found === undefined) {
197
+ return { emptiness: 'unknown', rowsAt, undeclaredShape: false, rowsUnread: 'no-list' };
124
198
  }
125
- return { emptiness: 'unknown', undeclaredShape: false };
199
+ const n = found.ticket.rows;
200
+ return typeof n === 'number' && Number.isSafeInteger(n) && n >= 0
201
+ ? counted(n, 'app', [...found.at, 'rows'], rowsAt)
202
+ : { ...UNCOUNTED_TICKET, rowsAt };
126
203
  }
127
204
  /** The data a recorded described envelope carries, per kind — or `undefined` when it cannot be read. */
128
205
  function describedReading(envelope) {
@@ -183,12 +260,14 @@ function boundedReading(data, door, rowsAt, depth) {
183
260
  return rowsetReading(data, rowsAt);
184
261
  if (depth >= MAX_BOUND_DEPTH)
185
262
  return { emptiness: 'unknown', undeclaredShape: false };
186
- const inner = boundedReading(covered.result, door, rowsAt, depth + 1);
263
+ const read = boundedReading(covered.result, door, rowsAt, depth + 1);
264
+ // The count sits under the boundary's `result`.
265
+ const inner = read.countedAt !== undefined ? { ...read, countedAt: ['result', ...read.countedAt] } : read;
187
266
  // An empty rowset inside a declared boundary is a declared absence — the same meaning, the same reading.
188
267
  if (inner.emptiness === 'undeclared-empty') {
189
- const { undeclaredShape: _shape, ...counted } = inner;
268
+ const { undeclaredShape: _shape, ...rest } = inner;
190
269
  void _shape;
191
- return { ...counted, emptiness: 'declared-absent', bounded: true, undeclaredShape: false };
270
+ return { ...rest, emptiness: 'declared-absent', bounded: true, undeclaredShape: false };
192
271
  }
193
272
  return { ...inner, bounded: true };
194
273
  }
@@ -1 +1 @@
1
- {"version":3,"file":"emptiness.js","sourceRoot":"","sources":["../../../../src/core/agent/coverage/emptiness.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;;;AAEH,iDAAiE;AAyEjE,wFAAwF;AACxF,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B;;;;;;;;GAQG;AACH,SAAgB,aAAa,CAAC,MAAe;IAC3C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACtE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAHD,sCAGC;AAED,oFAAoF;AACpF,SAAgB,cAAc,CAAC,KAAc;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACvE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AATD,wCASC;AAED,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,eAAe,GAAqB,MAAM,CAAC,MAAM,CAAC;IACtD,SAAS,EAAE,iBAAiB;IAC5B,eAAe,EAAE,KAAK;CACvB,CAAC,CAAC;AAEH,kGAAkG;AAClG,SAAS,aAAa,CAAC,IAAa,EAAE,MAA0B;IAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC;YACtB,CAAC,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE;YACvF,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAC/F,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC;gBACtB,CAAC,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE;gBAC3F,CAAC,CAAC;oBACE,SAAS,EAAE,WAAW;oBACtB,IAAI,EAAE,IAAI,CAAC,MAAM;oBACjB,MAAM,EAAE,KAAK;oBACb,MAAM;oBACN,eAAe,EAAE,KAAK;iBACvB,CAAC;QACR,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,wGAAwG;AACxG,SAAS,gBAAgB,CAAC,QAAiB;IACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,MAAM,GAAwD,EAAE,CAAC;IACvE,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAU,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACzE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAClG,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACnG,CAAC;AAgBD,MAAM,MAAM,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAErF;;;;;;;;;;;;;GAaG;AACH,SAAgB,eAAe,CAAC,KAAc;IAC5C,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAA,iCAAkB,EAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GACX,IAAA,0BAAW,EAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAA,0BAAW,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACvF,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACpE,OAAO;QACL,MAAM,EAAE,OAAO,KAAK,SAAS;QAC7B,OAAO,EAAE,MAAM,KAAK,SAAS;QAC7B,GAAG,EACD,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC;YAC5B,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;YAC7B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC;YACvC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC;KAC3C,CAAC;AACJ,CAAC;AAfD,0CAeC;AAED,mGAAmG;AACnG,SAAS,MAAM,CAAC,IAAa;IAC3B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED,gFAAgF;AAChF,SAAS,cAAc,CACrB,IAAa,EACb,IAAkB,EAClB,MAA0B,EAC1B,KAAa;IAEb,8FAA8F;IAC9F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAA,iCAAkB,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,KAAK,IAAI,eAAe;QAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IACtF,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACtE,yGAAyG;IACzG,IAAI,KAAK,CAAC,SAAS,KAAK,kBAAkB,EAAE,CAAC;QAC3C,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC;QACtD,KAAK,MAAM,CAAC;QACZ,OAAO,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAC7F,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,aAAa,CAAC,KAAc,EAAE,UAA4B,EAAE;IAC1E,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,sGAAsG;IACtG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,uFAAuF;QACvF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;IAChF,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;IAChD,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAbD,sCAaC"}
1
+ {"version":3,"file":"emptiness.js","sourceRoot":"","sources":["../../../../src/core/agent/coverage/emptiness.ts"],"names":[],"mappings":"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"}
@@ -80,7 +80,7 @@ export const REASONS = Object.freeze([
80
80
  reason: 'empty-undeclared',
81
81
  layer: 3,
82
82
  class: 'not-sure',
83
- reads: 'history: an empty rowset (a top-level array, or the app’s rowsAt key) whose call has no coverage row',
83
+ reads: 'history: an empty rowset (a top-level array, the app’s rowsAt key, or the dataset ticket left where those rows were, counting 0) whose call has no coverage row',
84
84
  },
85
85
  {
86
86
  reason: 'period-not-held',
@@ -1 +1 @@
1
- {"version":3,"file":"reasons.js","sourceRoot":"","sources":["../../../../../src/core/agent/assessment/reasons.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reasons.js","sourceRoot":"","sources":["../../../../../src/core/agent/assessment/reasons.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,9 @@
4
4
  * Pattern: typed routes over two inputs — the value the MODEL read, and the
5
5
  * door the RECORD says the call returned — and never a guess.
6
6
  * Role: core/ layer, pure. It imports the recognizers only
7
- * (`coverage/recognize.ts`), never a mint, so a post-hoc reader
7
+ * (`coverage/recognize.ts`; the artifact ref grammar and the
8
+ * placement ticket's guard, `artifacts/naming.ts`,
9
+ * `artifacts/placement.ts`), never a mint, so a post-hoc reader
8
10
  * loads it without the tool-name checks and refusal sentences.
9
11
  * Callers: the `/observe` answer account (`lib/answer-account/facts/calls.ts`
10
12
  * for this run's calls, `lib/answer-account/facts/inView.ts` for an
@@ -24,9 +26,40 @@
24
26
  * | a `describedResult()` with only `clarify` | `clarify` — a question handed back, no data | — |
25
27
  * | a `coverage()` envelope | its wrapped `result`, read by these same routes, marked `bounded`; an empty wrapped rowset reads `declared-absent` | library or app |
26
28
  * | a bare top-level array | `undeclared-empty` or `non-empty` | library |
29
+ * | the library's placement ticket (`placedToolResult`) — the whole result is in the store | `unknown`, said: the ticket counts bytes, never rows | — |
27
30
  * | an object whose key the app declared in `rowsAt` | `undeclared-empty` or `non-empty` | app |
31
+ * | an object whose `rowsAt` rows went to the store — the dataset ticket left in their place | the ticket's whole-number `rows`: `undeclared-empty` (0) or `non-empty`; no count → `unknown`, said | app |
32
+ * | an object with no list and no ticket at the declared `rowsAt` | `unknown`, said: the declared key holds no list | — |
28
33
  * | anything else | `unknown` — the record cannot read it | — |
29
34
  *
35
+ * ## Rows that travel by reference
36
+ *
37
+ * A projection may move a rowset out of the value the model reads and leave a
38
+ * TICKET to the artifact store in its place — `withDatasetArtifacts` /
39
+ * `stageDatasetArtifacts` stage the rows, and a projection (or an after-tool
40
+ * `allow(replacement)`) keeps the ticket and drops the rows. The library's
41
+ * spelling of that ticket, the one this reader counts:
42
+ *
43
+ * ```ts
44
+ * { …, datasets: { rows: { ref: 'art_…', kind: 'dataset/rows', rows: 2, sourceField: 'rows' } },
45
+ * dataset: { ref: 'art_…', kind: 'dataset/rows', rows: 2, sourceField: 'rows' } } // the principal one
46
+ * ```
47
+ *
48
+ * `ref` is a store ref (`isArtifactRef`), `rows` the whole-number row count,
49
+ * `sourceField` the result key the rows came from. The ticket is read only for
50
+ * the key the APP declared (`rowsAt`), only when that key is gone from the
51
+ * value (moved, not merely beside it), and only when the ticket names it —
52
+ * keyed under `datasets[rowsAt]` (a `sourceField`, when present, agreeing) or
53
+ * the principal `dataset` with `sourceField: rowsAt`. Two declarations meet
54
+ * there: the app's key and the ticket's field. A ticket with no whole-number
55
+ * `rows` is never guessed: whether the result was empty cannot be told, and
56
+ * the reading says why (`rowsUnread`). The library's own placement ticket
57
+ * (`artifacts/placement.ts`) puts the WHOLE result in the store and counts
58
+ * bytes, so it reads the same way. Take 4 of the demo video: a ticketed
59
+ * `pscale_client_health` (2 rows, `sourceField: 'rows'`, the app's `rowsAt:
60
+ * 'rows'`) read as "its shape is not declared", and the account's tone stayed
61
+ * unknown.
62
+ *
30
63
  * ## The door decides, when the record holds one
31
64
  *
32
65
  * A marker in the bytes is not a declaration: an envelope a tool returned as
@@ -113,12 +146,28 @@ export interface EmptinessReading {
113
146
  readonly source?: 'library' | 'app';
114
147
  /** The rows key the reading used (the app's `rowsAt`), when it used one. */
115
148
  readonly rowsAt?: string;
149
+ /**
150
+ * Where in the value read the count was taken (path segments; `[]` the value
151
+ * itself; `result` for each declared boundary read through): the rowset, or
152
+ * the `rows` of the dataset ticket standing for it.
153
+ */
154
+ readonly countedAt?: readonly string[];
116
155
  /** A described result's data, per kind. */
117
156
  readonly described?: DescribedCounts;
118
157
  /** Read through a declared `coverage()` boundary. */
119
158
  readonly bounded?: true;
120
159
  /** An object result with no declared shape — whether it was empty cannot be told. */
121
160
  readonly undeclaredShape: boolean;
161
+ /**
162
+ * Why the rows could not be counted when the shape IS known — so a reader
163
+ * never says "not declared" of a declared key:
164
+ * - `no-list` — the app declared `rowsAt`, and the value holds neither a list
165
+ * there nor a ticket standing for it;
166
+ * - `uncounted-ticket` — the rows went to the artifact store and the ticket
167
+ * left in their place carries no whole-number count (a dataset ticket
168
+ * without `rows`, or the library's placement ticket, which counts bytes).
169
+ */
170
+ readonly rowsUnread?: 'no-list' | 'uncounted-ticket';
122
171
  }
123
172
  /**
124
173
  * The ONE rule for an app's declared rows key: a non-empty TOP-LEVEL key of the
@@ -4,7 +4,9 @@
4
4
  * Pattern: typed routes over two inputs — the value the MODEL read, and the
5
5
  * door the RECORD says the call returned — and never a guess.
6
6
  * Role: core/ layer, pure. It imports the recognizers only
7
- * (`coverage/recognize.ts`), never a mint, so a post-hoc reader
7
+ * (`coverage/recognize.ts`; the artifact ref grammar and the
8
+ * placement ticket's guard, `artifacts/naming.ts`,
9
+ * `artifacts/placement.ts`), never a mint, so a post-hoc reader
8
10
  * loads it without the tool-name checks and refusal sentences.
9
11
  * Callers: the `/observe` answer account (`lib/answer-account/facts/calls.ts`
10
12
  * for this run's calls, `lib/answer-account/facts/inView.ts` for an
@@ -24,9 +26,40 @@
24
26
  * | a `describedResult()` with only `clarify` | `clarify` — a question handed back, no data | — |
25
27
  * | a `coverage()` envelope | its wrapped `result`, read by these same routes, marked `bounded`; an empty wrapped rowset reads `declared-absent` | library or app |
26
28
  * | a bare top-level array | `undeclared-empty` or `non-empty` | library |
29
+ * | the library's placement ticket (`placedToolResult`) — the whole result is in the store | `unknown`, said: the ticket counts bytes, never rows | — |
27
30
  * | an object whose key the app declared in `rowsAt` | `undeclared-empty` or `non-empty` | app |
31
+ * | an object whose `rowsAt` rows went to the store — the dataset ticket left in their place | the ticket's whole-number `rows`: `undeclared-empty` (0) or `non-empty`; no count → `unknown`, said | app |
32
+ * | an object with no list and no ticket at the declared `rowsAt` | `unknown`, said: the declared key holds no list | — |
28
33
  * | anything else | `unknown` — the record cannot read it | — |
29
34
  *
35
+ * ## Rows that travel by reference
36
+ *
37
+ * A projection may move a rowset out of the value the model reads and leave a
38
+ * TICKET to the artifact store in its place — `withDatasetArtifacts` /
39
+ * `stageDatasetArtifacts` stage the rows, and a projection (or an after-tool
40
+ * `allow(replacement)`) keeps the ticket and drops the rows. The library's
41
+ * spelling of that ticket, the one this reader counts:
42
+ *
43
+ * ```ts
44
+ * { …, datasets: { rows: { ref: 'art_…', kind: 'dataset/rows', rows: 2, sourceField: 'rows' } },
45
+ * dataset: { ref: 'art_…', kind: 'dataset/rows', rows: 2, sourceField: 'rows' } } // the principal one
46
+ * ```
47
+ *
48
+ * `ref` is a store ref (`isArtifactRef`), `rows` the whole-number row count,
49
+ * `sourceField` the result key the rows came from. The ticket is read only for
50
+ * the key the APP declared (`rowsAt`), only when that key is gone from the
51
+ * value (moved, not merely beside it), and only when the ticket names it —
52
+ * keyed under `datasets[rowsAt]` (a `sourceField`, when present, agreeing) or
53
+ * the principal `dataset` with `sourceField: rowsAt`. Two declarations meet
54
+ * there: the app's key and the ticket's field. A ticket with no whole-number
55
+ * `rows` is never guessed: whether the result was empty cannot be told, and
56
+ * the reading says why (`rowsUnread`). The library's own placement ticket
57
+ * (`artifacts/placement.ts`) puts the WHOLE result in the store and counts
58
+ * bytes, so it reads the same way. Take 4 of the demo video: a ticketed
59
+ * `pscale_client_health` (2 rows, `sourceField: 'rows'`, the app's `rowsAt:
60
+ * 'rows'`) read as "its shape is not declared", and the account's tone stayed
61
+ * unknown.
62
+ *
30
63
  * ## The door decides, when the record holds one
31
64
  *
32
65
  * A marker in the bytes is not a declaration: an envelope a tool returned as
@@ -59,6 +92,8 @@
59
92
  * Recognizing JSON-text envelopes at run time belongs at the execute boundary,
60
93
  * with one owner, not in a reader.
61
94
  */
95
+ import { isArtifactRef } from '../../../artifacts/naming.js';
96
+ import { isPlacedToolResult } from '../../../artifacts/placement.js';
62
97
  import { readAbsence, readCoverageLedger } from './recognize.js';
63
98
  /** How deep `coverage(coverage(…))` is read before the reading gives up (`unknown`). */
64
99
  const MAX_BOUND_DEPTH = 8;
@@ -95,29 +130,71 @@ const DECLARED_ABSENT = Object.freeze({
95
130
  emptiness: 'declared-absent',
96
131
  undeclaredShape: false,
97
132
  });
98
- /** A bare rowset: a top-level array (library-counted) or the app's `rowsAt` key (app-counted). */
99
- function rowsetReading(data, rowsAt) {
100
- if (Array.isArray(data)) {
101
- return data.length === 0
102
- ? { emptiness: 'undeclared-empty', rows: 0, source: 'library', undeclaredShape: false }
103
- : { emptiness: 'non-empty', rows: data.length, source: 'library', undeclaredShape: false };
104
- }
105
- if (isRecord(data)) {
106
- const rows = rowsAt !== undefined ? data[rowsAt] : undefined;
107
- if (rowsAt !== undefined && Array.isArray(rows)) {
108
- return rows.length === 0
109
- ? { emptiness: 'undeclared-empty', rows: 0, source: 'app', rowsAt, undeclaredShape: false }
110
- : {
111
- emptiness: 'non-empty',
112
- rows: rows.length,
113
- source: 'app',
114
- rowsAt,
115
- undeclaredShape: false,
116
- };
133
+ /** A count of rows: `undeclared-empty` at zero, `non-empty` above it. */
134
+ function counted(rows, source, countedAt, rowsAt) {
135
+ return {
136
+ emptiness: rows === 0 ? 'undeclared-empty' : 'non-empty',
137
+ rows,
138
+ source,
139
+ ...(rowsAt !== undefined && { rowsAt }),
140
+ countedAt,
141
+ undeclaredShape: false,
142
+ };
143
+ }
144
+ const UNCOUNTED_TICKET = Object.freeze({
145
+ emptiness: 'unknown',
146
+ undeclaredShape: false,
147
+ rowsUnread: 'uncounted-ticket',
148
+ });
149
+ /** A ticket to the artifact store: an object whose `ref` is a store ref. */
150
+ const isTicket = (value) => isRecord(value) && isArtifactRef(value.ref);
151
+ /**
152
+ * The dataset ticket standing for the declared rows key — `datasets[rowsAt]`
153
+ * (its `sourceField`, when present, naming that key) or the principal
154
+ * `dataset` with `sourceField: rowsAt` — with where it sits. See "Rows that
155
+ * travel by reference" in the header.
156
+ */
157
+ function ticketFor(data, rowsAt) {
158
+ const all = data.datasets;
159
+ if (isRecord(all) && Object.hasOwn(all, rowsAt)) {
160
+ const ticket = all[rowsAt];
161
+ if (isTicket(ticket) && (ticket.sourceField === undefined || ticket.sourceField === rowsAt)) {
162
+ return { ticket, at: ['datasets', rowsAt] };
117
163
  }
164
+ }
165
+ const principal = data.dataset;
166
+ return isTicket(principal) && principal.sourceField === rowsAt
167
+ ? { ticket: principal, at: ['dataset'] }
168
+ : undefined;
169
+ }
170
+ /**
171
+ * A bare rowset: a top-level array (library-counted), the app's `rowsAt` key
172
+ * or the dataset ticket left where those rows were (app-counted).
173
+ */
174
+ function rowsetReading(data, rowsAt) {
175
+ if (Array.isArray(data))
176
+ return counted(data.length, 'library', []);
177
+ if (!isRecord(data))
178
+ return { emptiness: 'unknown', undeclaredShape: false };
179
+ // The library's own placement: the whole result is in the store, and its ticket counts bytes.
180
+ if (isPlacedToolResult(data))
181
+ return UNCOUNTED_TICKET;
182
+ if (rowsAt === undefined)
118
183
  return { emptiness: 'unknown', undeclaredShape: true };
184
+ // Own keys only. A key set to `undefined` is gone too — its JSON (the history, a saved
185
+ // recording) drops it, and the live value must read the same.
186
+ const rows = Object.hasOwn(data, rowsAt) ? data[rowsAt] : undefined;
187
+ if (Array.isArray(rows))
188
+ return counted(rows.length, 'app', [rowsAt], rowsAt);
189
+ // Moved, not merely beside: a key still in the value is read as the value holds it.
190
+ const found = rows === undefined ? ticketFor(data, rowsAt) : undefined;
191
+ if (found === undefined) {
192
+ return { emptiness: 'unknown', rowsAt, undeclaredShape: false, rowsUnread: 'no-list' };
119
193
  }
120
- return { emptiness: 'unknown', undeclaredShape: false };
194
+ const n = found.ticket.rows;
195
+ return typeof n === 'number' && Number.isSafeInteger(n) && n >= 0
196
+ ? counted(n, 'app', [...found.at, 'rows'], rowsAt)
197
+ : { ...UNCOUNTED_TICKET, rowsAt };
121
198
  }
122
199
  /** The data a recorded described envelope carries, per kind — or `undefined` when it cannot be read. */
123
200
  function describedReading(envelope) {
@@ -177,12 +254,14 @@ function boundedReading(data, door, rowsAt, depth) {
177
254
  return rowsetReading(data, rowsAt);
178
255
  if (depth >= MAX_BOUND_DEPTH)
179
256
  return { emptiness: 'unknown', undeclaredShape: false };
180
- const inner = boundedReading(covered.result, door, rowsAt, depth + 1);
257
+ const read = boundedReading(covered.result, door, rowsAt, depth + 1);
258
+ // The count sits under the boundary's `result`.
259
+ const inner = read.countedAt !== undefined ? { ...read, countedAt: ['result', ...read.countedAt] } : read;
181
260
  // An empty rowset inside a declared boundary is a declared absence — the same meaning, the same reading.
182
261
  if (inner.emptiness === 'undeclared-empty') {
183
- const { undeclaredShape: _shape, ...counted } = inner;
262
+ const { undeclaredShape: _shape, ...rest } = inner;
184
263
  void _shape;
185
- return { ...counted, emptiness: 'declared-absent', bounded: true, undeclaredShape: false };
264
+ return { ...rest, emptiness: 'declared-absent', bounded: true, undeclaredShape: false };
186
265
  }
187
266
  return { ...inner, bounded: true };
188
267
  }
@@ -1 +1 @@
1
- {"version":3,"file":"emptiness.js","sourceRoot":"","sources":["../../../../../src/core/agent/coverage/emptiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AAEH,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAyEjE,wFAAwF;AACxF,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACtE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACvE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,eAAe,GAAqB,MAAM,CAAC,MAAM,CAAC;IACtD,SAAS,EAAE,iBAAiB;IAC5B,eAAe,EAAE,KAAK;CACvB,CAAC,CAAC;AAEH,kGAAkG;AAClG,SAAS,aAAa,CAAC,IAAa,EAAE,MAA0B;IAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC;YACtB,CAAC,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE;YACvF,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAC/F,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC;gBACtB,CAAC,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE;gBAC3F,CAAC,CAAC;oBACE,SAAS,EAAE,WAAW;oBACtB,IAAI,EAAE,IAAI,CAAC,MAAM;oBACjB,MAAM,EAAE,KAAK;oBACb,MAAM;oBACN,eAAe,EAAE,KAAK;iBACvB,CAAC;QACR,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,wGAAwG;AACxG,SAAS,gBAAgB,CAAC,QAAiB;IACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,MAAM,GAAwD,EAAE,CAAC;IACvE,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAU,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACzE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAClG,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACnG,CAAC;AAgBD,MAAM,MAAM,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAErF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GACX,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACvF,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACpE,OAAO;QACL,MAAM,EAAE,OAAO,KAAK,SAAS;QAC7B,OAAO,EAAE,MAAM,KAAK,SAAS;QAC7B,GAAG,EACD,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC;YAC5B,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;YAC7B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC;YACvC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,SAAS,MAAM,CAAC,IAAa;IAC3B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED,gFAAgF;AAChF,SAAS,cAAc,CACrB,IAAa,EACb,IAAkB,EAClB,MAA0B,EAC1B,KAAa;IAEb,8FAA8F;IAC9F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,KAAK,IAAI,eAAe;QAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IACtF,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACtE,yGAAyG;IACzG,IAAI,KAAK,CAAC,SAAS,KAAK,kBAAkB,EAAE,CAAC;QAC3C,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC;QACtD,KAAK,MAAM,CAAC;QACZ,OAAO,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAC7F,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,UAA4B,EAAE;IAC1E,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,sGAAsG;IACtG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,uFAAuF;QACvF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;IAChF,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;IAChD,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"emptiness.js","sourceRoot":"","sources":["../../../../../src/core/agent/coverage/emptiness.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ import { chip, clipFact, MAX_VAR_CHARS, saidBy, sentence } from './render.js';
16
16
  import { ANSWER_ACCOUNT_TEMPLATE_SET_VERSION } from './templates.js';
17
17
  import { validateDeclarations } from './declarations.js';
18
18
  import { isRecord, num, str, recordingView } from './view.js';
19
- import { at, derived, makeSay, stateAt, } from './facts/common.js';
19
+ import { at, countedFields, derived, makeSay, stateAt, } from './facts/common.js';
20
20
  import { readAsked } from './facts/asked.js';
21
21
  import { readUnderstood } from './facts/understood.js';
22
22
  import { FACT_TEXT_CHARS, MAX_CALLS, readCalls } from './facts/calls.js';
@@ -338,8 +338,7 @@ function beforePauseFact(c) {
338
338
  toolName: c.toolName.slice(0, FACT_TEXT_CHARS),
339
339
  toolCallId: c.toolCallId.slice(0, FACT_TEXT_CHARS),
340
340
  emptiness: reading.emptiness,
341
- ...(reading.rows !== undefined && { rows: reading.rows }),
342
- ...(reading.source !== undefined && { emptinessSource: reading.source }),
341
+ ...countedFields(reading),
343
342
  ...(coverage !== undefined && {
344
343
  coverage: {
345
344
  kind: coverage.kind,