@collage-dam/mcp-server 0.1.6 → 0.1.8
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/CHANGELOG.md +96 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/tools/client-adapters.d.ts +31 -6
- package/dist/tools/client-adapters.d.ts.map +1 -1
- package/dist/tools/client-adapters.js +83 -5
- package/dist/tools/client-adapters.js.map +1 -1
- package/dist/tools/search/cursor.d.ts +38 -0
- package/dist/tools/search/cursor.d.ts.map +1 -0
- package/dist/tools/search/cursor.js +95 -0
- package/dist/tools/search/cursor.js.map +1 -0
- package/dist/tools/search/facets.d.ts +6 -0
- package/dist/tools/search/facets.d.ts.map +1 -1
- package/dist/tools/search/facets.js +5 -3
- package/dist/tools/search/facets.js.map +1 -1
- package/dist/tools/search/search-assets.d.ts +0 -1
- package/dist/tools/search/search-assets.d.ts.map +1 -1
- package/dist/tools/search/search-assets.js +71 -38
- package/dist/tools/search/search-assets.js.map +1 -1
- package/dist/tools/search/search-collections.d.ts.map +1 -1
- package/dist/tools/search/search-collections.js +48 -17
- package/dist/tools/search/search-collections.js.map +1 -1
- package/dist/tools/search/types.d.ts +58 -0
- package/dist/tools/search/types.d.ts.map +1 -1
- package/dist/tools/search/types.js +46 -0
- package/dist/tools/search/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// ── Search pagination cursor ─────────────────────────────────────────
|
|
2
|
+
// Encodes the position + page size needed to continue a search through
|
|
3
|
+
// `search_assets` or `search_collections`. Replaces the prior "page:N"
|
|
4
|
+
// string cursor (which encoded position but not page size) and the
|
|
5
|
+
// `String(offset)` shape `applyResponseBudget` was emitting on
|
|
6
|
+
// token-cap truncation (which encoded neither stably).
|
|
7
|
+
//
|
|
8
|
+
// Shape: base64url-encoded JSON `{ v, p, n }`:
|
|
9
|
+
// v — cursor schema version (currently 1; bump on shape changes)
|
|
10
|
+
// p — upstream page number to fetch next
|
|
11
|
+
// n — `per_page` to use on that fetch (the *effective* page size,
|
|
12
|
+
// which is what the budget actually allows for the projection,
|
|
13
|
+
// not the requested page size)
|
|
14
|
+
//
|
|
15
|
+
// Why both `p` and `n`: requesting `per_page: 250` on a verbose
|
|
16
|
+
// projection silently truncates to ~20–29 hits because of the response
|
|
17
|
+
// token budget — and the prior cursor didn't carry forward `n`, so a
|
|
18
|
+
// caller resuming from the cursor would request `per_page: 250` again
|
|
19
|
+
// and re-hit the same cap. By round-tripping the effective `n`, a
|
|
20
|
+
// well-behaved caller stays inside the budget on every page.
|
|
21
|
+
import { z } from 'zod';
|
|
22
|
+
/** Current cursor version. Bump on incompatible shape changes. */
|
|
23
|
+
export const CURSOR_VERSION = 1;
|
|
24
|
+
const CursorPayloadSchema = z.object({
|
|
25
|
+
v: z.literal(1),
|
|
26
|
+
p: z.number().int().min(1),
|
|
27
|
+
n: z.number().int().min(1),
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* Encode a `(page, per_page)` continuation handle as an opaque
|
|
31
|
+
* base64url string. The opacity is deliberate — callers MUST round-trip
|
|
32
|
+
* the cursor verbatim; the encoding may change without notice.
|
|
33
|
+
*/
|
|
34
|
+
export function encodeSearchCursor(payload) {
|
|
35
|
+
const json = JSON.stringify({
|
|
36
|
+
v: CURSOR_VERSION,
|
|
37
|
+
p: payload.page,
|
|
38
|
+
n: payload.per_page,
|
|
39
|
+
});
|
|
40
|
+
return Buffer.from(json, 'utf-8').toString('base64url');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Decode a previously-emitted cursor. Returns `null` if the cursor is
|
|
44
|
+
* malformed, version-mismatched, or otherwise unparseable. Callers
|
|
45
|
+
* should treat a null result as "fall back to page/per_page in the
|
|
46
|
+
* input" rather than as an error.
|
|
47
|
+
*/
|
|
48
|
+
export function decodeSearchCursor(cursor) {
|
|
49
|
+
try {
|
|
50
|
+
const decoded = Buffer.from(cursor, 'base64url').toString('utf-8');
|
|
51
|
+
const parsed = CursorPayloadSchema.safeParse(JSON.parse(decoded));
|
|
52
|
+
if (!parsed.success)
|
|
53
|
+
return null;
|
|
54
|
+
return { page: parsed.data.p, per_page: parsed.data.n };
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ── Effective per_page (projection-aware budget pre-cap) ─────────────
|
|
61
|
+
//
|
|
62
|
+
// Per-projection token estimates (chars/4 → token estimate, matching
|
|
63
|
+
// `estimateTokens()` in response-budget.ts). These are *generous* — we'd
|
|
64
|
+
// rather under-request from upstream and trust the safety-net budget
|
|
65
|
+
// check than over-request and hit the cap repeatedly.
|
|
66
|
+
//
|
|
67
|
+
// Compact hit: id, display_file_name, thumbnail_file (presigned S3 URLs
|
|
68
|
+
// run ~500 chars), modified_at, plus JSON structural overhead. ~800
|
|
69
|
+
// chars / ~200 tokens per hit budgeted; real hits vary.
|
|
70
|
+
//
|
|
71
|
+
// Verbose hit: full indexed-field set including tags arrays, breadcrumb
|
|
72
|
+
// arrays, multiple URLs. ~2400 chars / ~600 tokens per hit budgeted.
|
|
73
|
+
import { HARD_CAP_TOKENS } from '../../conventions/response-budget.js';
|
|
74
|
+
export const PER_HIT_TOKEN_ESTIMATE = {
|
|
75
|
+
compact: 200,
|
|
76
|
+
verbose: 600,
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Maximum `per_page` the response budget will tolerate for a given
|
|
80
|
+
* projection. Below this, the budget safety-net won't trigger; at or
|
|
81
|
+
* above, it might (and the cursor will reflect the budget-clamped
|
|
82
|
+
* size on continuation).
|
|
83
|
+
*/
|
|
84
|
+
export function budgetMaxPerPage(projection) {
|
|
85
|
+
return Math.max(1, Math.floor(HARD_CAP_TOKENS / PER_HIT_TOKEN_ESTIMATE[projection]));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Compute the page size that will actually be requested upstream and
|
|
89
|
+
* returned to the caller. Caps the caller's requested `per_page` at
|
|
90
|
+
* the projection-specific budget max.
|
|
91
|
+
*/
|
|
92
|
+
export function effectivePerPage(requested, projection) {
|
|
93
|
+
return Math.min(requested, budgetMaxPerPage(projection));
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/tools/search/cursor.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,uEAAuE;AACvE,uEAAuE;AACvE,mEAAmE;AACnE,+DAA+D;AAC/D,uDAAuD;AACvD,EAAE;AACF,+CAA+C;AAC/C,oEAAoE;AACpE,4CAA4C;AAC5C,qEAAqE;AACrE,sEAAsE;AACtE,sCAAsC;AACtC,EAAE;AACF,gEAAgE;AAChE,uEAAuE;AACvE,qEAAqE;AACrE,sEAAsE;AACtE,kEAAkE;AAClE,6DAA6D;AAE7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,kEAAkE;AAClE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACf,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC3B,CAAC,CAAC;AAOH;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAsB;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,CAAC,EAAE,cAAc;QACjB,CAAC,EAAE,OAAO,CAAC,IAAI;QACf,CAAC,EAAE,OAAO,CAAC,QAAQ;KACpB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,EAAE;AACF,qEAAqE;AACrE,yEAAyE;AACzE,qEAAqE;AACrE,sDAAsD;AACtD,EAAE;AACF,wEAAwE;AACxE,oEAAoE;AACpE,wDAAwD;AACxD,EAAE;AACF,wEAAwE;AACxE,qEAAqE;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;CACJ,CAAC;AAIX;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAsB;IACrD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,UAAsB;IAEtB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -13,6 +13,12 @@ interface HintGeneratorContext {
|
|
|
13
13
|
hasTags: boolean;
|
|
14
14
|
/** Number of hits where `tags` is empty/missing. */
|
|
15
15
|
untaggedCount: number;
|
|
16
|
+
/**
|
|
17
|
+
* True when the response includes a non-null `next_cursor` (i.e.
|
|
18
|
+
* more results exist beyond this page). Used to emit a continuation
|
|
19
|
+
* hint with concrete `suggested_args` the LLM can pass back verbatim.
|
|
20
|
+
*/
|
|
21
|
+
hasNextCursor: boolean;
|
|
16
22
|
}
|
|
17
23
|
/**
|
|
18
24
|
* Generate structured next-step hints for a `search_assets` response.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facets.d.ts","sourceRoot":"","sources":["../../../src/tools/search/facets.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EACV,eAAe,EAEf,YAAY,EACZ,kBAAkB,EAClB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,EACvC,IAAI,EAAE,aAAa,CAAC,eAAe,GAAG,eAAe,CAAC,EACtD,IAAI,SAAK,GACR,YAAY,CAkCd;AAqCD,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,mFAAmF;IACnF,OAAO,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"facets.d.ts","sourceRoot":"","sources":["../../../src/tools/search/facets.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EACV,eAAe,EAEf,YAAY,EACZ,kBAAkB,EAClB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,EACvC,IAAI,EAAE,aAAa,CAAC,eAAe,GAAG,eAAe,CAAC,EACtD,IAAI,SAAK,GACR,YAAY,CAkCd;AAqCD,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,mFAAmF;IACnF,OAAO,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,oBAAoB,GACxB,kBAAkB,EAAE,CA+BtB;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,MAAM,GACZ,kBAAkB,EAAE,CAWtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC9C,MAAM,CAWR"}
|
|
@@ -97,11 +97,13 @@ export function buildAssetSearchNextSteps(ctx) {
|
|
|
97
97
|
reason: `${ctx.untaggedCount} hit(s) have no tags — consider running the tagging-hygiene audit.`,
|
|
98
98
|
});
|
|
99
99
|
}
|
|
100
|
-
if (ctx.
|
|
100
|
+
if (ctx.hasNextCursor) {
|
|
101
101
|
hints.push({
|
|
102
102
|
tool: 'search_assets',
|
|
103
|
-
reason_code: 'response_truncated',
|
|
104
|
-
reason:
|
|
103
|
+
reason_code: ctx.truncated ? 'response_truncated' : 'more_results_available',
|
|
104
|
+
reason: ctx.truncated
|
|
105
|
+
? 'Result page was clamped or capped to fit the response budget. Use the returned next_cursor to continue.'
|
|
106
|
+
: 'More results exist beyond this page. Pass next_cursor back as `cursor` to fetch the next page.',
|
|
105
107
|
});
|
|
106
108
|
}
|
|
107
109
|
if (ctx.found > 1000) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facets.js","sourceRoot":"","sources":["../../../src/tools/search/facets.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"facets.js","sourceRoot":"","sources":["../../../src/tools/search/facets.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,7 +37,6 @@ export declare function runSearchAssets(client: CollageSearchClient, workspaceId
|
|
|
37
37
|
};
|
|
38
38
|
isError?: boolean;
|
|
39
39
|
}>;
|
|
40
|
-
export declare function decodePageCursor(cursor: string): number | null;
|
|
41
40
|
/**
|
|
42
41
|
* Parse a comma-separated `query_by` value and return any tokens that
|
|
43
42
|
* are not in the allowed field set. Empty result = all valid.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-assets.d.ts","sourceRoot":"","sources":["../../../src/tools/search/search-assets.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAa9D,OAAO,EASL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"search-assets.d.ts","sourceRoot":"","sources":["../../../src/tools/search/search-assets.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAa9D,OAAO,EASL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAGxB,MAAM,YAAY,CAAC;AAOpB,eAAO,MAAM,yBAAyB,QAiBxB,CAAC;AAEf,eAAO,MAAM,wBAAwB,mBAAmB,CAAC;AAEzD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,MAAM,IAEL,UAAU,OAAO;aAiBtB,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;uBAC3B,kBAAkB,GAAG;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,OAAO,CAAA;SAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;cAClH,OAAO;GAVlB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IACT,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,EAAE,kBAAkB,GAAG;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,OAAO,CAAA;SAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7H,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC,CA4JD;AAkCD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAC3B,MAAM,EAAE,CAOV"}
|
|
@@ -16,6 +16,7 @@ import { searchWorkspaceScoped } from '../../typesense.js';
|
|
|
16
16
|
import { buildAssetFilterClauses, joinFilterClauses, } from './filter-builder.js';
|
|
17
17
|
import { buildAssetSearchNextSteps, buildSearchFacets, countUntagged, } from './facets.js';
|
|
18
18
|
import { CompactAssetHitSchema, DEFAULT_FACET_BY_ASSETS, DEFAULT_MAX_FACET_VALUES, DEFAULT_QUERY_BY_ASSETS, SearchAssetsInputSchema, VALID_QUERY_BY_ASSETS, VerboseAssetHitSchema, } from './types.js';
|
|
19
|
+
import { decodeSearchCursor, effectivePerPage, encodeSearchCursor, } from './cursor.js';
|
|
19
20
|
export const SEARCH_ASSETS_DESCRIPTION = 'Full-text + faceted search over the workspace digital-asset library. ' +
|
|
20
21
|
'Backed by Typesense Cloud; returns hits, facets (tags, file_type, ' +
|
|
21
22
|
'date histogram), pagination cursor, and structured next_step_hints. ' +
|
|
@@ -25,7 +26,14 @@ export const SEARCH_ASSETS_DESCRIPTION = 'Full-text + faceted search over the wo
|
|
|
25
26
|
'created_after/before, modified_after/before. ' +
|
|
26
27
|
'Optional `query_by` (comma-separated, no spaces) overrides the searched ' +
|
|
27
28
|
`field set; valid values are ${VALID_QUERY_BY_ASSETS.join(', ')} — ` +
|
|
28
|
-
'unknown field names are rejected with a VALIDATION error.
|
|
29
|
+
'unknown field names are rejected with a VALIDATION error. ' +
|
|
30
|
+
'Pagination: pass `next_cursor` from the previous response back as ' +
|
|
31
|
+
'`cursor` to fetch the next page. The cursor encodes both page and ' +
|
|
32
|
+
'effective per_page (auto-clamped to fit the response-token budget for ' +
|
|
33
|
+
'the projection — compact ~60/page, verbose ~20/page). `effective_per_page` ' +
|
|
34
|
+
'in the response reflects what was actually used; `truncated` + ' +
|
|
35
|
+
'`truncation_reason` indicate when clamping or budget capping occurred. ' +
|
|
36
|
+
'Read-only.';
|
|
29
37
|
export const SEARCH_ASSETS_COLLECTION = 'digital_assets';
|
|
30
38
|
/**
|
|
31
39
|
* Build the handler for `search_assets`. Accepts a `CollageSearchClient`
|
|
@@ -58,13 +66,25 @@ export async function runSearchAssets(client, workspaceId, input, requestId) {
|
|
|
58
66
|
const includeFields = input.projection === 'compact'
|
|
59
67
|
? 'id,display_file_name,thumbnail_file,modified_at'
|
|
60
68
|
: undefined;
|
|
69
|
+
// Resolve pagination from cursor when present; otherwise from
|
|
70
|
+
// input.page / input.per_page. Cursor takes precedence so that
|
|
71
|
+
// continuing from a previous response is the path of least friction —
|
|
72
|
+
// callers don't have to remember which per_page they originally used.
|
|
73
|
+
const cursorDecoded = input.cursor !== undefined ? decodeSearchCursor(input.cursor) : null;
|
|
74
|
+
const requestedPage = cursorDecoded?.page ?? input.page;
|
|
75
|
+
const requestedPerPage = cursorDecoded?.per_page ?? input.per_page;
|
|
76
|
+
// Clamp per_page to what the projection's response-token budget can
|
|
77
|
+
// realistically carry. The HARD_CAP safety net in applyResponseBudget
|
|
78
|
+
// still runs below as belt-and-suspenders for unusually heavy hits.
|
|
79
|
+
const effPerPage = effectivePerPage(requestedPerPage, input.projection);
|
|
80
|
+
const perPageClamped = effPerPage < requestedPerPage;
|
|
61
81
|
const result = await searchWorkspaceScoped(client, SEARCH_ASSETS_COLLECTION, workspaceId, {
|
|
62
82
|
q: input.q,
|
|
63
83
|
query_by: queryBy,
|
|
64
84
|
...(filterBy.length > 0 ? { filter_by: filterBy } : {}),
|
|
65
85
|
sort_by: input.sort_by,
|
|
66
|
-
page:
|
|
67
|
-
per_page:
|
|
86
|
+
page: requestedPage,
|
|
87
|
+
per_page: effPerPage,
|
|
68
88
|
facet_by: DEFAULT_FACET_BY_ASSETS,
|
|
69
89
|
max_facet_values: DEFAULT_MAX_FACET_VALUES,
|
|
70
90
|
// `'fallback'` runs Typesense's full search pipeline (exact → typo →
|
|
@@ -89,24 +109,51 @@ export async function runSearchAssets(client, workspaceId, input, requestId) {
|
|
|
89
109
|
// skipping them so a single bad index entry doesn't fail the whole
|
|
90
110
|
// response.
|
|
91
111
|
const hits = projectHits(result.hits, input.projection);
|
|
92
|
-
//
|
|
93
|
-
// is
|
|
94
|
-
//
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
//
|
|
112
|
+
// Safety-net budget check. With per_page already clamped above, the
|
|
113
|
+
// typical case is no truncation here — but unusually heavy hits
|
|
114
|
+
// (multiple long presigned URLs in one row, very long descriptions)
|
|
115
|
+
// can still cross the line. When that happens, the cursor advances
|
|
116
|
+
// by the *delivered* count rather than a fixed page, so no asset is
|
|
117
|
+
// skipped.
|
|
98
118
|
const budget = applyResponseBudget(hits, {
|
|
99
119
|
serialize: (item) => JSON.stringify(item),
|
|
100
|
-
offset: (
|
|
101
|
-
pageSize:
|
|
120
|
+
offset: (requestedPage - 1) * effPerPage,
|
|
121
|
+
pageSize: effPerPage,
|
|
102
122
|
});
|
|
103
|
-
const
|
|
104
|
-
const
|
|
105
|
-
const
|
|
106
|
-
?
|
|
107
|
-
:
|
|
108
|
-
?
|
|
123
|
+
const tokenCapped = budget.truncated;
|
|
124
|
+
const truncated = perPageClamped || tokenCapped;
|
|
125
|
+
const truncation_reason = tokenCapped
|
|
126
|
+
? 'token_cap'
|
|
127
|
+
: perPageClamped
|
|
128
|
+
? 'per_page_clamped'
|
|
109
129
|
: null;
|
|
130
|
+
// Total assets we'll have surfaced after this response.
|
|
131
|
+
const seenSoFar = (requestedPage - 1) * effPerPage + budget.data.length;
|
|
132
|
+
const moreAvailable = seenSoFar < result.found;
|
|
133
|
+
// Encode the continuation. When the budget caps mid-page we cannot
|
|
134
|
+
// safely advance the page number because we've delivered only a
|
|
135
|
+
// prefix of the upstream page — so we re-fetch the same page with a
|
|
136
|
+
// smaller per_page so the next call covers the gap.
|
|
137
|
+
let next_cursor = null;
|
|
138
|
+
if (moreAvailable) {
|
|
139
|
+
if (tokenCapped) {
|
|
140
|
+
// Shrink per_page to what just fit, advance to the next page.
|
|
141
|
+
const shrunkPerPage = Math.max(1, budget.data.length);
|
|
142
|
+
const itemsBeforeThisPage = (requestedPage - 1) * effPerPage;
|
|
143
|
+
const nextPage = Math.floor((itemsBeforeThisPage + budget.data.length) / shrunkPerPage) +
|
|
144
|
+
1;
|
|
145
|
+
next_cursor = encodeSearchCursor({
|
|
146
|
+
page: nextPage,
|
|
147
|
+
per_page: shrunkPerPage,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
next_cursor = encodeSearchCursor({
|
|
152
|
+
page: requestedPage + 1,
|
|
153
|
+
per_page: effPerPage,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
110
157
|
const facets = buildSearchFacets(result.facet_counts, budget.data);
|
|
111
158
|
// Count untagged from raw upstream rows (clipped to what survived the
|
|
112
159
|
// budget) — the projected payload strips `tags` when projection=compact,
|
|
@@ -114,17 +161,20 @@ export async function runSearchAssets(client, workspaceId, input, requestId) {
|
|
|
114
161
|
const untagged = countUntagged(result.hits.slice(0, budget.data.length));
|
|
115
162
|
const next_step_hints = buildAssetSearchNextSteps({
|
|
116
163
|
found: result.found,
|
|
117
|
-
truncated
|
|
164
|
+
truncated,
|
|
118
165
|
hasTags: facets.tags.length > 0,
|
|
119
166
|
untaggedCount: untagged,
|
|
167
|
+
hasNextCursor: next_cursor !== null,
|
|
120
168
|
});
|
|
121
169
|
const output = {
|
|
122
170
|
hits: budget.data,
|
|
123
171
|
total: result.found,
|
|
124
|
-
page:
|
|
125
|
-
per_page:
|
|
172
|
+
page: requestedPage,
|
|
173
|
+
per_page: requestedPerPage,
|
|
174
|
+
effective_per_page: effPerPage,
|
|
126
175
|
next_cursor,
|
|
127
|
-
truncated
|
|
176
|
+
truncated,
|
|
177
|
+
truncation_reason,
|
|
128
178
|
facets,
|
|
129
179
|
next_step_hints,
|
|
130
180
|
request_id: requestId,
|
|
@@ -144,23 +194,6 @@ function projectHits(rawHits, projection) {
|
|
|
144
194
|
}
|
|
145
195
|
return out;
|
|
146
196
|
}
|
|
147
|
-
function encodePageCursor(page) {
|
|
148
|
-
return Buffer.from(`page:${page}`, 'utf-8').toString('base64');
|
|
149
|
-
}
|
|
150
|
-
export function decodePageCursor(cursor) {
|
|
151
|
-
try {
|
|
152
|
-
const decoded = Buffer.from(cursor, 'base64').toString('utf-8');
|
|
153
|
-
if (!decoded.startsWith('page:'))
|
|
154
|
-
return null;
|
|
155
|
-
const n = Number(decoded.slice('page:'.length));
|
|
156
|
-
if (!Number.isFinite(n) || n < 1 || !Number.isInteger(n))
|
|
157
|
-
return null;
|
|
158
|
-
return n;
|
|
159
|
-
}
|
|
160
|
-
catch {
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
197
|
function errorResult(requestId, code, message) {
|
|
165
198
|
const retriable = code === 'UPSTREAM' || code === 'RATE_LIMITED' || code === 'INTERNAL';
|
|
166
199
|
const error = { code, message, retriable };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-assets.js","sourceRoot":"","sources":["../../../src/tools/search/search-assets.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,wEAAwE;AACxE,+DAA+D;AAC/D,uEAAuE;AACvE,uBAAuB;AACvB,EAAE;AACF,gEAAgE;AAChE,mEAAmE;AACnE,uEAAuE;AACvE,qEAAqE;AACrE,8DAA8D;AAC9D,8DAA8D;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"search-assets.js","sourceRoot":"","sources":["../../../src/tools/search/search-assets.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-collections.d.ts","sourceRoot":"","sources":["../../../src/tools/search/search-collections.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAQ9D,OAAO,EAQL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,
|
|
1
|
+
{"version":3,"file":"search-collections.d.ts","sourceRoot":"","sources":["../../../src/tools/search/search-collections.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAQ9D,OAAO,EAQL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAE7B,MAAM,YAAY,CAAC;AAQpB,eAAO,MAAM,8BAA8B,QAWN,CAAC;AAEtC,eAAO,MAAM,wBAAwB,oBAAoB,CAAC;AAE1D,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,MAAM,IAEL,UAAU,OAAO;aAiBtB,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;uBAC3B,uBAAuB,GAAG;QAC3C,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,OAAO,CAAA;SAAE,CAAC;QAC7D,UAAU,EAAE,MAAM,CAAC;KACpB;cACS,OAAO;GAblB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,sBAAsB,EAC7B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IACT,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,EAAE,uBAAuB,GAAG;QAC3C,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,OAAO,CAAA;SAAE,CAAC;QAC7D,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC,CA6GD"}
|
|
@@ -11,13 +11,18 @@ import { searchWorkspaceScoped } from '../../typesense.js';
|
|
|
11
11
|
import { buildCollectionSearchNextSteps, buildSearchFacets, } from './facets.js';
|
|
12
12
|
import { CollectionHitSchema, DEFAULT_FACET_BY_COLLECTIONS, DEFAULT_MAX_FACET_VALUES, DEFAULT_QUERY_BY_COLLECTIONS, SearchCollectionsInputSchema, VALID_QUERY_BY_COLLECTIONS, } from './types.js';
|
|
13
13
|
import { invalidQueryByFields } from './search-assets.js';
|
|
14
|
+
import { decodeSearchCursor, effectivePerPage, encodeSearchCursor, } from './cursor.js';
|
|
14
15
|
export const SEARCH_COLLECTIONS_DESCRIPTION = 'Full-text search over the workspace dam_collections (Collages) Typesense ' +
|
|
15
16
|
'index. Returns collection hits, a date histogram facet, pagination ' +
|
|
16
17
|
'cursor, and next_step_hints. Useful for discovering existing collections ' +
|
|
17
18
|
'before creating a new one or for narrowing a downstream tag/asset workflow ' +
|
|
18
19
|
'to a specific collection. ' +
|
|
19
20
|
`Optional \`query_by\` (comma-separated, no spaces) — valid values are ${VALID_QUERY_BY_COLLECTIONS.join(', ')}; ` +
|
|
20
|
-
'unknown field names are rejected with a VALIDATION error.
|
|
21
|
+
'unknown field names are rejected with a VALIDATION error. ' +
|
|
22
|
+
'Pagination: pass `next_cursor` from the previous response back as ' +
|
|
23
|
+
'`cursor` to continue. `effective_per_page` reflects the page size ' +
|
|
24
|
+
'actually used; the upstream `per_page` is auto-clamped to fit the ' +
|
|
25
|
+
'response-token budget. Read-only.';
|
|
21
26
|
export const SEARCH_COLLECTIONS_INDEX = 'dam_collections';
|
|
22
27
|
export function buildSearchCollectionsHandler(client, workspaceId) {
|
|
23
28
|
return async (rawInput) => {
|
|
@@ -38,12 +43,18 @@ export async function runSearchCollections(client, workspaceId, input, requestId
|
|
|
38
43
|
}
|
|
39
44
|
}
|
|
40
45
|
const queryBy = input.query_by ?? DEFAULT_QUERY_BY_COLLECTIONS;
|
|
46
|
+
// Cursor takes precedence over page/per_page when present.
|
|
47
|
+
const cursorDecoded = input.cursor !== undefined ? decodeSearchCursor(input.cursor) : null;
|
|
48
|
+
const requestedPage = cursorDecoded?.page ?? input.page;
|
|
49
|
+
const requestedPerPage = cursorDecoded?.per_page ?? input.per_page;
|
|
50
|
+
const effPerPage = effectivePerPage(requestedPerPage, input.projection);
|
|
51
|
+
const perPageClamped = effPerPage < requestedPerPage;
|
|
41
52
|
const result = await searchWorkspaceScoped(client, SEARCH_COLLECTIONS_INDEX, workspaceId, {
|
|
42
53
|
q: input.q,
|
|
43
54
|
query_by: queryBy,
|
|
44
55
|
sort_by: input.sort_by,
|
|
45
|
-
page:
|
|
46
|
-
per_page:
|
|
56
|
+
page: requestedPage,
|
|
57
|
+
per_page: effPerPage,
|
|
47
58
|
facet_by: DEFAULT_FACET_BY_COLLECTIONS,
|
|
48
59
|
max_facet_values: DEFAULT_MAX_FACET_VALUES,
|
|
49
60
|
// See `search-assets.ts` for the rationale on `'fallback'`. Same
|
|
@@ -59,25 +70,48 @@ export async function runSearchCollections(client, workspaceId, input, requestId
|
|
|
59
70
|
const hits = projectCollectionHits(result.hits);
|
|
60
71
|
const budget = applyResponseBudget(hits, {
|
|
61
72
|
serialize: (item) => JSON.stringify(item),
|
|
62
|
-
offset: (
|
|
63
|
-
pageSize:
|
|
73
|
+
offset: (requestedPage - 1) * effPerPage,
|
|
74
|
+
pageSize: effPerPage,
|
|
64
75
|
});
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
const
|
|
68
|
-
?
|
|
69
|
-
:
|
|
70
|
-
?
|
|
76
|
+
const tokenCapped = budget.truncated;
|
|
77
|
+
const truncated = perPageClamped || tokenCapped;
|
|
78
|
+
const truncation_reason = tokenCapped
|
|
79
|
+
? 'token_cap'
|
|
80
|
+
: perPageClamped
|
|
81
|
+
? 'per_page_clamped'
|
|
71
82
|
: null;
|
|
83
|
+
const seenSoFar = (requestedPage - 1) * effPerPage + budget.data.length;
|
|
84
|
+
const moreAvailable = seenSoFar < result.found;
|
|
85
|
+
let next_cursor = null;
|
|
86
|
+
if (moreAvailable) {
|
|
87
|
+
if (tokenCapped) {
|
|
88
|
+
const shrunkPerPage = Math.max(1, budget.data.length);
|
|
89
|
+
const itemsBeforeThisPage = (requestedPage - 1) * effPerPage;
|
|
90
|
+
const nextPage = Math.floor((itemsBeforeThisPage + budget.data.length) / shrunkPerPage) +
|
|
91
|
+
1;
|
|
92
|
+
next_cursor = encodeSearchCursor({
|
|
93
|
+
page: nextPage,
|
|
94
|
+
per_page: shrunkPerPage,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
next_cursor = encodeSearchCursor({
|
|
99
|
+
page: requestedPage + 1,
|
|
100
|
+
per_page: effPerPage,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
72
104
|
const facets = buildSearchFacets(result.facet_counts, []);
|
|
73
105
|
const next_step_hints = buildCollectionSearchNextSteps(result.found);
|
|
74
106
|
const output = {
|
|
75
107
|
hits: budget.data,
|
|
76
108
|
total: result.found,
|
|
77
|
-
page:
|
|
78
|
-
per_page:
|
|
109
|
+
page: requestedPage,
|
|
110
|
+
per_page: requestedPerPage,
|
|
111
|
+
effective_per_page: effPerPage,
|
|
79
112
|
next_cursor,
|
|
80
|
-
truncated
|
|
113
|
+
truncated,
|
|
114
|
+
truncation_reason,
|
|
81
115
|
facets,
|
|
82
116
|
next_step_hints,
|
|
83
117
|
request_id: requestId,
|
|
@@ -96,9 +130,6 @@ function projectCollectionHits(rawHits) {
|
|
|
96
130
|
}
|
|
97
131
|
return out;
|
|
98
132
|
}
|
|
99
|
-
function encodePageCursor(page) {
|
|
100
|
-
return Buffer.from(`page:${page}`, 'utf-8').toString('base64');
|
|
101
|
-
}
|
|
102
133
|
function errorResult(requestId, code, message) {
|
|
103
134
|
const retriable = code === 'UPSTREAM' || code === 'RATE_LIMITED' || code === 'INTERNAL';
|
|
104
135
|
const error = { code, message, retriable };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-collections.js","sourceRoot":"","sources":["../../../src/tools/search/search-collections.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,iEAAiE;AACjE,uEAAuE;AACvE,wEAAwE;AACxE,oEAAoE;AACpE,qEAAqE;AACrE,QAAQ;AAGR,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EACL,8BAA8B,EAC9B,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,0BAA0B,
|
|
1
|
+
{"version":3,"file":"search-collections.js","sourceRoot":"","sources":["../../../src/tools/search/search-collections.ts"],"names":[],"mappings":"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"}
|