wicked-crew 0.7.22 → 0.7.23
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.
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +76 -1
- package/dist/api/routes.js.map +1 -1
- package/dist/studio/assets/index-CoitSgeY.css +32 -0
- package/dist/studio/assets/{index-CDWyxcSj.js → index-EwAn7t8P.js} +94 -94
- package/dist/studio/index.html +2 -2
- package/dist/studio/testid-inventory.json +157 -23
- package/endpoint-manifest.json +1 -1
- package/package.json +2 -2
- package/dist/studio/assets/index-Dz6mXrD5.css +0 -32
package/dist/api/routes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/api/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,OAAO,EAAmD,WAAW,EAA4E,MAAM,oBAAoB,CAAC;AAG5K,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAInD,OAAO,KAAK,EAEV,eAAe,EAYf,YAAY,EACb,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAWrD,OAAO,EAAyB,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAYtF,OAAO,EAAe,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGzE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,aAAa,EAOd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAGL,KAAK,WAAW,EAEhB,KAAK,qBAAqB,EAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/api/routes.ts"],"names":[],"mappings":"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"}
|
package/dist/api/routes.js
CHANGED
|
@@ -93,6 +93,39 @@ function invalidBody(err, what) {
|
|
|
93
93
|
function firstQueryValue(v) {
|
|
94
94
|
return Array.isArray(v) ? v[0] : v;
|
|
95
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Parse an optional `since`/`until` date-bound query param (unix SECONDS). Returns the parsed
|
|
98
|
+
* non-negative integer, `undefined` when the param is absent or blank, or the sentinel `'invalid'`
|
|
99
|
+
* when it is present but not a non-negative integer — the caller turns `'invalid'` into a 400 that
|
|
100
|
+
* names the offending param (a silently-dropped bad bound would answer a different date question
|
|
101
|
+
* than the one asked).
|
|
102
|
+
*/
|
|
103
|
+
function parseUnixSecondsParam(raw) {
|
|
104
|
+
if (raw === undefined || raw.trim() === '')
|
|
105
|
+
return undefined;
|
|
106
|
+
const n = Number(raw);
|
|
107
|
+
if (!Number.isFinite(n) || !Number.isInteger(n) || n < 0)
|
|
108
|
+
return 'invalid';
|
|
109
|
+
return n;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Inclusive `[since, until]` date-range predicate (unix seconds) shared by the memory + rules
|
|
113
|
+
* browse filters. An item with NO `created_at` is EXCLUDED whenever either bound is set — an
|
|
114
|
+
* unknown creation time is never asserted in range, and never fabricated (crew never invents a
|
|
115
|
+
* timestamp for a row the store did not stamp). With NEITHER bound set every item passes, so the
|
|
116
|
+
* un-filtered browse is unchanged.
|
|
117
|
+
*/
|
|
118
|
+
function withinDateRange(createdAt, since, until) {
|
|
119
|
+
if (since === undefined && until === undefined)
|
|
120
|
+
return true;
|
|
121
|
+
if (typeof createdAt !== 'number')
|
|
122
|
+
return false;
|
|
123
|
+
if (since !== undefined && createdAt < since)
|
|
124
|
+
return false;
|
|
125
|
+
if (until !== undefined && createdAt > until)
|
|
126
|
+
return false;
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
96
129
|
/** A JSON object whose every value is a string (a facet/intent tuple, axis→value). */
|
|
97
130
|
function isStringRecord(v) {
|
|
98
131
|
return (typeof v === 'object' &&
|
|
@@ -201,6 +234,10 @@ function shapeMemoryItem(raw) {
|
|
|
201
234
|
};
|
|
202
235
|
if (typeof r['score'] === 'number')
|
|
203
236
|
item.score = r['score'];
|
|
237
|
+
// `created_at` (unix seconds) rides through from estate `memory.list` verbatim — the "added" time
|
|
238
|
+
// the surface date-filters on. Absent on an item the store did not stamp; never fabricated.
|
|
239
|
+
if (typeof r['created_at'] === 'number')
|
|
240
|
+
item.created_at = r['created_at'];
|
|
204
241
|
return item;
|
|
205
242
|
}
|
|
206
243
|
/** Shape the estate `memory.coverage` result (`{ total, by_tier, by_kind }`) into the wire
|
|
@@ -2063,6 +2100,27 @@ runtime = {}) {
|
|
|
2063
2100
|
return invalid('status', status, 'active|retired|all');
|
|
2064
2101
|
}
|
|
2065
2102
|
const layer = facet('layer');
|
|
2103
|
+
// `since`/`until` (unix SECONDS, inclusive) date-bound the listed rows by each rule's
|
|
2104
|
+
// `created_at`. A present-but-non-integer bound is a 400. NOTE: `created_at` is wired-but-
|
|
2105
|
+
// pending a core-ts bump — it landed on the engine's `ConformanceRule` after the published
|
|
2106
|
+
// core-ts this daemon builds against, so on the current binding NO rule carries it and this
|
|
2107
|
+
// filter narrows to empty. The pass-through is verbatim (`listConformanceRules` returns the
|
|
2108
|
+
// parsed rows unchanged), so the bound starts working the moment crew re-pins to a core-ts
|
|
2109
|
+
// that surfaces it — a rule with no `created_at` is excluded, never dated with a fabricated now.
|
|
2110
|
+
const since = facet('since');
|
|
2111
|
+
const sinceSecs = parseUnixSecondsParam(since);
|
|
2112
|
+
if (sinceSecs === 'invalid') {
|
|
2113
|
+
return reply
|
|
2114
|
+
.code(400)
|
|
2115
|
+
.send({ error: `since must be a non-negative integer in unix seconds (got \`${since ?? ''}\`)` });
|
|
2116
|
+
}
|
|
2117
|
+
const until = facet('until');
|
|
2118
|
+
const untilSecs = parseUnixSecondsParam(until);
|
|
2119
|
+
if (untilSecs === 'invalid') {
|
|
2120
|
+
return reply
|
|
2121
|
+
.code(400)
|
|
2122
|
+
.send({ error: `until must be a non-negative integer in unix seconds (got \`${until ?? ''}\`)` });
|
|
2123
|
+
}
|
|
2066
2124
|
const rules = (await adapter.listConformanceRules()).filter((r) => (severity === undefined || r.severity === severity) &&
|
|
2067
2125
|
(ruleType === undefined || r.rule_type === ruleType) &&
|
|
2068
2126
|
(layer === undefined || r.targets.layer === layer) &&
|
|
@@ -2070,7 +2128,9 @@ runtime = {}) {
|
|
|
2070
2128
|
// steering engine always stamps it, but filter defensively over mixed-era rows.
|
|
2071
2129
|
(steeringType === undefined || (r.steering_type ?? DEFAULT_STEERING_TYPE) === steeringType) &&
|
|
2072
2130
|
// `retired` is absent on rows written before the field existed, which read as active.
|
|
2073
|
-
(status === 'all' || (status === 'retired') === (r.retired === true))
|
|
2131
|
+
(status === 'all' || (status === 'retired') === (r.retired === true)) &&
|
|
2132
|
+
// Undated rules (every rule on a pre-bump core-ts) are excluded once a bound is set.
|
|
2133
|
+
withinDateRange(r.created_at, sinceSecs, untilSecs));
|
|
2074
2134
|
return { rules };
|
|
2075
2135
|
});
|
|
2076
2136
|
app.get(`${V}/governance/claims`, async () => {
|
|
@@ -2991,6 +3051,18 @@ runtime = {}) {
|
|
|
2991
3051
|
}
|
|
2992
3052
|
limit = n;
|
|
2993
3053
|
}
|
|
3054
|
+
// `since`/`until` (unix SECONDS, inclusive) date-bound the complete set crew-side by each
|
|
3055
|
+
// memory's `created_at`. A present-but-non-integer bound is a 400 (fail-loud, never a silent
|
|
3056
|
+
// no-filter); a memory with no `created_at` is excluded once either bound is set (see
|
|
3057
|
+
// withinDateRange). Applied BEFORE the row cap, so `limit` cuts the dated set.
|
|
3058
|
+
const since = parseUnixSecondsParam(firstQueryValue(q.since));
|
|
3059
|
+
if (since === 'invalid') {
|
|
3060
|
+
return reply.code(400).send({ error: '`since` must be a non-negative integer (unix seconds)' });
|
|
3061
|
+
}
|
|
3062
|
+
const until = parseUnixSecondsParam(firstQueryValue(q.until));
|
|
3063
|
+
if (until === 'invalid') {
|
|
3064
|
+
return reply.code(400).send({ error: '`until` must be a non-negative integer (unix seconds)' });
|
|
3065
|
+
}
|
|
2994
3066
|
// `query`, when present, is a case-insensitive CONTENT substring filter over the complete set
|
|
2995
3067
|
// — a management search that finds faceted memories too (unlike relevance recall).
|
|
2996
3068
|
const query = (firstQueryValue(q.query) ?? '').trim().toLowerCase();
|
|
@@ -3007,6 +3079,9 @@ runtime = {}) {
|
|
|
3007
3079
|
const pairs = Object.entries(facetFilter);
|
|
3008
3080
|
memories = memories.filter((m) => pairs.every(([k, v]) => m.facets[k] === v));
|
|
3009
3081
|
}
|
|
3082
|
+
if (since !== undefined || until !== undefined) {
|
|
3083
|
+
memories = memories.filter((m) => withinDateRange(m.created_at, since, until));
|
|
3084
|
+
}
|
|
3010
3085
|
if (limit !== undefined)
|
|
3011
3086
|
memories = memories.slice(0, limit);
|
|
3012
3087
|
const body = { memories };
|