@dbx-tools/shared-mastra 0.3.44 → 0.4.1
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/lib/index.d.ts +15 -0
- package/lib/index.js +16 -0
- package/lib/src/feedback.d.ts +75 -0
- package/lib/src/feedback.js +77 -0
- package/lib/src/marker.d.ts +95 -0
- package/lib/src/marker.js +123 -0
- package/lib/src/override.d.ts +15 -0
- package/lib/src/override.js +16 -0
- package/lib/src/routes.d.ts +29 -0
- package/lib/src/routes.js +37 -0
- package/lib/src/thread.d.ts +19 -0
- package/lib/src/thread.js +20 -0
- package/lib/src/wire.d.ts +877 -0
- package/lib/src/wire.js +569 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +12 -8
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export * as feedback from "./src/feedback.js";
|
|
2
|
+
export * as marker from "./src/marker.js";
|
|
3
|
+
export * as override from "./src/override.js";
|
|
4
|
+
export * as routes from "./src/routes.js";
|
|
5
|
+
export * as thread from "./src/thread.js";
|
|
6
|
+
export * as wire from "./src/wire.js";
|
|
7
|
+
export { MLFLOW_TRACE_ID_HEADER, DEFAULT_FEEDBACK_NAME, DEFAULT_COMMENT_NAME, MastraFeedbackValueSchema, MastraFeedbackRequestSchema, MastraFeedbackResponseSchema } from "./src/feedback.js";
|
|
8
|
+
export type { MastraFeedbackValue, MastraFeedbackRequest, MastraFeedbackResponse } from "./src/feedback.js";
|
|
9
|
+
export { isUuid, parseMarkers, stripIncompleteMarkerTail } from "./src/marker.js";
|
|
10
|
+
export type { MarkerType, ParsedMarker } from "./src/marker.js";
|
|
11
|
+
export { MODEL_OVERRIDE_HEADER, MODEL_OVERRIDE_QUERY, MODEL_OVERRIDE_BODY_FIELDS } from "./src/override.js";
|
|
12
|
+
export { MASTRA_ROUTES } from "./src/routes.js";
|
|
13
|
+
export { THREAD_ID_HEADER, THREAD_ID_QUERY } from "./src/thread.js";
|
|
14
|
+
export { MastraClientConfigSchema, DefaultModelResponseSchema, ServingEndpointsResponseSchema, MastraHistoryUIMessageSchema, MastraHistoryResponseSchema, MastraClearHistoryResponseSchema, MastraThreadSchema, MastraThreadsResponseSchema, MastraDeleteThreadResponseSchema, MASTRA_THREAD_TITLE_MAX, MastraUpdateThreadRequestSchema, MastraUpdateThreadResponseSchema, MastraSuggestionsResponseSchema, ChartTypeSchema, ChartResultSchema, ChartSchema, StatementDataSchema, StartedEventSchema, AskGenieDoneEventSchema, MastraGenieErrorEventSchema, SummaryEventSchema, GenieAgentEventSchema, GenieWriterEventSchema, GenieDatasetDataSchema, GenieDatasetChartSchema, GenieDatasetSchema, GenieSummaryItemSchema, GenieAgentResultSchema } from "./src/wire.js";
|
|
15
|
+
export type { MastraClientConfig, DefaultModelResponse, ServingEndpointsResponse, MastraHistoryUIMessage, MastraHistoryResponse, MastraClearHistoryResponse, MastraThread, MastraThreadsResponse, MastraDeleteThreadResponse, MastraUpdateThreadRequest, MastraUpdateThreadResponse, MastraSuggestionsResponse, ChartType, ChartResult, Chart, StatementData, MastraWriter, StartedEvent, AskGenieDoneEvent, MastraGenieErrorEvent, SummaryEvent, GenieAgentEvent, GenieWriterEvent, GenieWriterEventType, GenieDatasetData, GenieDatasetChart, GenieDataset, GenieSummaryItem, GenieSummaryItemType, GenieAgentResult } from "./src/wire.js";
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// GENERATED by projen watch - DO NOT EDIT.
|
|
2
|
+
// Regenerated from the exporting modules in ./src.
|
|
3
|
+
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
|
+
export * as feedback from "./src/feedback.js";
|
|
5
|
+
export * as marker from "./src/marker.js";
|
|
6
|
+
export * as override from "./src/override.js";
|
|
7
|
+
export * as routes from "./src/routes.js";
|
|
8
|
+
export * as thread from "./src/thread.js";
|
|
9
|
+
export * as wire from "./src/wire.js";
|
|
10
|
+
export { MLFLOW_TRACE_ID_HEADER, DEFAULT_FEEDBACK_NAME, DEFAULT_COMMENT_NAME, MastraFeedbackValueSchema, MastraFeedbackRequestSchema, MastraFeedbackResponseSchema } from "./src/feedback.js";
|
|
11
|
+
export { isUuid, parseMarkers, stripIncompleteMarkerTail } from "./src/marker.js";
|
|
12
|
+
export { MODEL_OVERRIDE_HEADER, MODEL_OVERRIDE_QUERY, MODEL_OVERRIDE_BODY_FIELDS } from "./src/override.js";
|
|
13
|
+
export { MASTRA_ROUTES } from "./src/routes.js";
|
|
14
|
+
export { THREAD_ID_HEADER, THREAD_ID_QUERY } from "./src/thread.js";
|
|
15
|
+
export { MastraClientConfigSchema, DefaultModelResponseSchema, ServingEndpointsResponseSchema, MastraHistoryUIMessageSchema, MastraHistoryResponseSchema, MastraClearHistoryResponseSchema, MastraThreadSchema, MastraThreadsResponseSchema, MastraDeleteThreadResponseSchema, MASTRA_THREAD_TITLE_MAX, MastraUpdateThreadRequestSchema, MastraUpdateThreadResponseSchema, MastraSuggestionsResponseSchema, ChartTypeSchema, ChartResultSchema, ChartSchema, StatementDataSchema, StartedEventSchema, AskGenieDoneEventSchema, MastraGenieErrorEventSchema, SummaryEventSchema, GenieAgentEventSchema, GenieWriterEventSchema, GenieDatasetDataSchema, GenieDatasetChartSchema, GenieDatasetSchema, GenieSummaryItemSchema, GenieAgentResultSchema } from "./src/wire.js";
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxNQUFNLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxLQUFLLE1BQU0sTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxLQUFLLE1BQU0sTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLHlCQUF5QixFQUFFLDJCQUEyQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0wsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFL0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSw4QkFBOEIsRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSxnQ0FBZ0MsRUFBRSxrQkFBa0IsRUFBRSwyQkFBMkIsRUFBRSxnQ0FBZ0MsRUFBRSx1QkFBdUIsRUFBRSwrQkFBK0IsRUFBRSxnQ0FBZ0MsRUFBRSwrQkFBK0IsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0ICogYXMgZmVlZGJhY2sgZnJvbSBcIi4vc3JjL2ZlZWRiYWNrXCI7XG5leHBvcnQgKiBhcyBtYXJrZXIgZnJvbSBcIi4vc3JjL21hcmtlclwiO1xuZXhwb3J0ICogYXMgb3ZlcnJpZGUgZnJvbSBcIi4vc3JjL292ZXJyaWRlXCI7XG5leHBvcnQgKiBhcyByb3V0ZXMgZnJvbSBcIi4vc3JjL3JvdXRlc1wiO1xuZXhwb3J0ICogYXMgdGhyZWFkIGZyb20gXCIuL3NyYy90aHJlYWRcIjtcbmV4cG9ydCAqIGFzIHdpcmUgZnJvbSBcIi4vc3JjL3dpcmVcIjtcbmV4cG9ydCB7IE1MRkxPV19UUkFDRV9JRF9IRUFERVIsIERFRkFVTFRfRkVFREJBQ0tfTkFNRSwgREVGQVVMVF9DT01NRU5UX05BTUUsIE1hc3RyYUZlZWRiYWNrVmFsdWVTY2hlbWEsIE1hc3RyYUZlZWRiYWNrUmVxdWVzdFNjaGVtYSwgTWFzdHJhRmVlZGJhY2tSZXNwb25zZVNjaGVtYSB9IGZyb20gXCIuL3NyYy9mZWVkYmFja1wiO1xuZXhwb3J0IHR5cGUgeyBNYXN0cmFGZWVkYmFja1ZhbHVlLCBNYXN0cmFGZWVkYmFja1JlcXVlc3QsIE1hc3RyYUZlZWRiYWNrUmVzcG9uc2UgfSBmcm9tIFwiLi9zcmMvZmVlZGJhY2tcIjtcbmV4cG9ydCB7IGlzVXVpZCwgcGFyc2VNYXJrZXJzLCBzdHJpcEluY29tcGxldGVNYXJrZXJUYWlsIH0gZnJvbSBcIi4vc3JjL21hcmtlclwiO1xuZXhwb3J0IHR5cGUgeyBNYXJrZXJUeXBlLCBQYXJzZWRNYXJrZXIgfSBmcm9tIFwiLi9zcmMvbWFya2VyXCI7XG5leHBvcnQgeyBNT0RFTF9PVkVSUklERV9IRUFERVIsIE1PREVMX09WRVJSSURFX1FVRVJZLCBNT0RFTF9PVkVSUklERV9CT0RZX0ZJRUxEUyB9IGZyb20gXCIuL3NyYy9vdmVycmlkZVwiO1xuZXhwb3J0IHsgTUFTVFJBX1JPVVRFUyB9IGZyb20gXCIuL3NyYy9yb3V0ZXNcIjtcbmV4cG9ydCB7IFRIUkVBRF9JRF9IRUFERVIsIFRIUkVBRF9JRF9RVUVSWSB9IGZyb20gXCIuL3NyYy90aHJlYWRcIjtcbmV4cG9ydCB7IE1hc3RyYUNsaWVudENvbmZpZ1NjaGVtYSwgRGVmYXVsdE1vZGVsUmVzcG9uc2VTY2hlbWEsIFNlcnZpbmdFbmRwb2ludHNSZXNwb25zZVNjaGVtYSwgTWFzdHJhSGlzdG9yeVVJTWVzc2FnZVNjaGVtYSwgTWFzdHJhSGlzdG9yeVJlc3BvbnNlU2NoZW1hLCBNYXN0cmFDbGVhckhpc3RvcnlSZXNwb25zZVNjaGVtYSwgTWFzdHJhVGhyZWFkU2NoZW1hLCBNYXN0cmFUaHJlYWRzUmVzcG9uc2VTY2hlbWEsIE1hc3RyYURlbGV0ZVRocmVhZFJlc3BvbnNlU2NoZW1hLCBNQVNUUkFfVEhSRUFEX1RJVExFX01BWCwgTWFzdHJhVXBkYXRlVGhyZWFkUmVxdWVzdFNjaGVtYSwgTWFzdHJhVXBkYXRlVGhyZWFkUmVzcG9uc2VTY2hlbWEsIE1hc3RyYVN1Z2dlc3Rpb25zUmVzcG9uc2VTY2hlbWEsIENoYXJ0VHlwZVNjaGVtYSwgQ2hhcnRSZXN1bHRTY2hlbWEsIENoYXJ0U2NoZW1hLCBTdGF0ZW1lbnREYXRhU2NoZW1hLCBTdGFydGVkRXZlbnRTY2hlbWEsIEFza0dlbmllRG9uZUV2ZW50U2NoZW1hLCBNYXN0cmFHZW5pZUVycm9yRXZlbnRTY2hlbWEsIFN1bW1hcnlFdmVudFNjaGVtYSwgR2VuaWVBZ2VudEV2ZW50U2NoZW1hLCBHZW5pZVdyaXRlckV2ZW50U2NoZW1hLCBHZW5pZURhdGFzZXREYXRhU2NoZW1hLCBHZW5pZURhdGFzZXRDaGFydFNjaGVtYSwgR2VuaWVEYXRhc2V0U2NoZW1hLCBHZW5pZVN1bW1hcnlJdGVtU2NoZW1hLCBHZW5pZUFnZW50UmVzdWx0U2NoZW1hIH0gZnJvbSBcIi4vc3JjL3dpcmVcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhQ2xpZW50Q29uZmlnLCBEZWZhdWx0TW9kZWxSZXNwb25zZSwgU2VydmluZ0VuZHBvaW50c1Jlc3BvbnNlLCBNYXN0cmFIaXN0b3J5VUlNZXNzYWdlLCBNYXN0cmFIaXN0b3J5UmVzcG9uc2UsIE1hc3RyYUNsZWFySGlzdG9yeVJlc3BvbnNlLCBNYXN0cmFUaHJlYWQsIE1hc3RyYVRocmVhZHNSZXNwb25zZSwgTWFzdHJhRGVsZXRlVGhyZWFkUmVzcG9uc2UsIE1hc3RyYVVwZGF0ZVRocmVhZFJlcXVlc3QsIE1hc3RyYVVwZGF0ZVRocmVhZFJlc3BvbnNlLCBNYXN0cmFTdWdnZXN0aW9uc1Jlc3BvbnNlLCBDaGFydFR5cGUsIENoYXJ0UmVzdWx0LCBDaGFydCwgU3RhdGVtZW50RGF0YSwgTWFzdHJhV3JpdGVyLCBTdGFydGVkRXZlbnQsIEFza0dlbmllRG9uZUV2ZW50LCBNYXN0cmFHZW5pZUVycm9yRXZlbnQsIFN1bW1hcnlFdmVudCwgR2VuaWVBZ2VudEV2ZW50LCBHZW5pZVdyaXRlckV2ZW50LCBHZW5pZVdyaXRlckV2ZW50VHlwZSwgR2VuaWVEYXRhc2V0RGF0YSwgR2VuaWVEYXRhc2V0Q2hhcnQsIEdlbmllRGF0YXNldCwgR2VuaWVTdW1tYXJ5SXRlbSwgR2VuaWVTdW1tYXJ5SXRlbVR5cGUsIEdlbmllQWdlbnRSZXN1bHQgfSBmcm9tIFwiLi9zcmMvd2lyZVwiO1xuIl19
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire-format contract for the Mastra plugin's user-feedback surface:
|
|
3
|
+
* the response header that carries a turn's MLflow trace id back to the
|
|
4
|
+
* browser, plus the request / response schemas for the feedback route
|
|
5
|
+
* (`MASTRA_ROUTES.feedback`).
|
|
6
|
+
*
|
|
7
|
+
* Feedback is logged to MLflow as a trace *assessment* (thumbs up/down
|
|
8
|
+
* as a boolean, or a freeform comment as text), so it must be tied to a
|
|
9
|
+
* trace. The plugin stamps the active OTel trace id of each turn on the
|
|
10
|
+
* response as {@link MLFLOW_TRACE_ID_HEADER} (`tr-<hex>`); the client
|
|
11
|
+
* captures it per assistant message and sends it back here when the
|
|
12
|
+
* user reacts. Kept dependency-free so both the browser client and the
|
|
13
|
+
* server plugin share one definition.
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
/**
|
|
19
|
+
* Response header carrying the turn's MLflow trace id (`tr-<hex>`),
|
|
20
|
+
* derived from the active OpenTelemetry trace id. Present only when
|
|
21
|
+
* MLflow logging is enabled and a trace was active for the request.
|
|
22
|
+
* The chat client reads it off the stream response and pairs it with
|
|
23
|
+
* the assistant message so a later thumbs / comment attaches to the
|
|
24
|
+
* right trace.
|
|
25
|
+
*/
|
|
26
|
+
export declare const MLFLOW_TRACE_ID_HEADER = "x-mlflow-trace-id";
|
|
27
|
+
/** Assessment name used for thumbs feedback when the caller omits one. */
|
|
28
|
+
export declare const DEFAULT_FEEDBACK_NAME = "user_feedback";
|
|
29
|
+
/** Assessment name used for a freeform comment when no explicit value is sent. */
|
|
30
|
+
export declare const DEFAULT_COMMENT_NAME = "user_comment";
|
|
31
|
+
/**
|
|
32
|
+
* Feedback value the assessment records. Boolean for thumbs up/down,
|
|
33
|
+
* number for a rating scale, string for a short categorical label.
|
|
34
|
+
* A freeform comment travels in `comment` instead (or as the value
|
|
35
|
+
* when no thumbs value is present).
|
|
36
|
+
*/
|
|
37
|
+
export declare const MastraFeedbackValueSchema: z.ZodUnion<readonly [z.ZodBoolean, z.ZodNumber, z.ZodString]>;
|
|
38
|
+
export type MastraFeedbackValue = z.infer<typeof MastraFeedbackValueSchema>;
|
|
39
|
+
/**
|
|
40
|
+
* Request body for `POST ${basePath}/route/feedback`.
|
|
41
|
+
*
|
|
42
|
+
* Fields:
|
|
43
|
+
* - `traceId`: MLflow trace id the feedback attaches to (the
|
|
44
|
+
* `tr-<hex>` value the server sent via {@link MLFLOW_TRACE_ID_HEADER}).
|
|
45
|
+
* - `name`: assessment name. Defaults to {@link DEFAULT_FEEDBACK_NAME}
|
|
46
|
+
* for a value, {@link DEFAULT_COMMENT_NAME} for a comment-only submit.
|
|
47
|
+
* - `value`: the thumbs / rating value (omit for a comment-only submit).
|
|
48
|
+
* - `comment`: freeform rationale. Logged as the assessment value when
|
|
49
|
+
* `value` is absent, or as the rationale alongside a `value`.
|
|
50
|
+
*
|
|
51
|
+
* Refined so an empty submission (neither a value nor a non-empty
|
|
52
|
+
* comment) is rejected rather than logging a meaningless assessment.
|
|
53
|
+
*/
|
|
54
|
+
export declare const MastraFeedbackRequestSchema: z.ZodObject<{
|
|
55
|
+
traceId: z.ZodString;
|
|
56
|
+
name: z.ZodOptional<z.ZodString>;
|
|
57
|
+
value: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodNumber, z.ZodString]>>;
|
|
58
|
+
comment: z.ZodOptional<z.ZodString>;
|
|
59
|
+
}, z.core.$strip>;
|
|
60
|
+
export type MastraFeedbackRequest = z.infer<typeof MastraFeedbackRequestSchema>;
|
|
61
|
+
/**
|
|
62
|
+
* Response from `POST ${basePath}/route/feedback`.
|
|
63
|
+
*
|
|
64
|
+
* `ok` is `true` when the assessment was recorded. It can be `false`
|
|
65
|
+
* (with `ok: false`) without the call throwing - most commonly because
|
|
66
|
+
* the trace hasn't finished exporting to MLflow yet (trace export is
|
|
67
|
+
* asynchronous); the client surfaces a soft "try again" hint rather
|
|
68
|
+
* than an error. `assessmentId` is the created assessment's id on
|
|
69
|
+
* success.
|
|
70
|
+
*/
|
|
71
|
+
export declare const MastraFeedbackResponseSchema: z.ZodObject<{
|
|
72
|
+
ok: z.ZodBoolean;
|
|
73
|
+
assessmentId: z.ZodOptional<z.ZodString>;
|
|
74
|
+
}, z.core.$strip>;
|
|
75
|
+
export type MastraFeedbackResponse = z.infer<typeof MastraFeedbackResponseSchema>;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire-format contract for the Mastra plugin's user-feedback surface:
|
|
3
|
+
* the response header that carries a turn's MLflow trace id back to the
|
|
4
|
+
* browser, plus the request / response schemas for the feedback route
|
|
5
|
+
* (`MASTRA_ROUTES.feedback`).
|
|
6
|
+
*
|
|
7
|
+
* Feedback is logged to MLflow as a trace *assessment* (thumbs up/down
|
|
8
|
+
* as a boolean, or a freeform comment as text), so it must be tied to a
|
|
9
|
+
* trace. The plugin stamps the active OTel trace id of each turn on the
|
|
10
|
+
* response as {@link MLFLOW_TRACE_ID_HEADER} (`tr-<hex>`); the client
|
|
11
|
+
* captures it per assistant message and sends it back here when the
|
|
12
|
+
* user reacts. Kept dependency-free so both the browser client and the
|
|
13
|
+
* server plugin share one definition.
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
/**
|
|
19
|
+
* Response header carrying the turn's MLflow trace id (`tr-<hex>`),
|
|
20
|
+
* derived from the active OpenTelemetry trace id. Present only when
|
|
21
|
+
* MLflow logging is enabled and a trace was active for the request.
|
|
22
|
+
* The chat client reads it off the stream response and pairs it with
|
|
23
|
+
* the assistant message so a later thumbs / comment attaches to the
|
|
24
|
+
* right trace.
|
|
25
|
+
*/
|
|
26
|
+
export const MLFLOW_TRACE_ID_HEADER = "x-mlflow-trace-id";
|
|
27
|
+
/** Assessment name used for thumbs feedback when the caller omits one. */
|
|
28
|
+
export const DEFAULT_FEEDBACK_NAME = "user_feedback";
|
|
29
|
+
/** Assessment name used for a freeform comment when no explicit value is sent. */
|
|
30
|
+
export const DEFAULT_COMMENT_NAME = "user_comment";
|
|
31
|
+
/**
|
|
32
|
+
* Feedback value the assessment records. Boolean for thumbs up/down,
|
|
33
|
+
* number for a rating scale, string for a short categorical label.
|
|
34
|
+
* A freeform comment travels in `comment` instead (or as the value
|
|
35
|
+
* when no thumbs value is present).
|
|
36
|
+
*/
|
|
37
|
+
export const MastraFeedbackValueSchema = z.union([z.boolean(), z.number(), z.string()]);
|
|
38
|
+
/**
|
|
39
|
+
* Request body for `POST ${basePath}/route/feedback`.
|
|
40
|
+
*
|
|
41
|
+
* Fields:
|
|
42
|
+
* - `traceId`: MLflow trace id the feedback attaches to (the
|
|
43
|
+
* `tr-<hex>` value the server sent via {@link MLFLOW_TRACE_ID_HEADER}).
|
|
44
|
+
* - `name`: assessment name. Defaults to {@link DEFAULT_FEEDBACK_NAME}
|
|
45
|
+
* for a value, {@link DEFAULT_COMMENT_NAME} for a comment-only submit.
|
|
46
|
+
* - `value`: the thumbs / rating value (omit for a comment-only submit).
|
|
47
|
+
* - `comment`: freeform rationale. Logged as the assessment value when
|
|
48
|
+
* `value` is absent, or as the rationale alongside a `value`.
|
|
49
|
+
*
|
|
50
|
+
* Refined so an empty submission (neither a value nor a non-empty
|
|
51
|
+
* comment) is rejected rather than logging a meaningless assessment.
|
|
52
|
+
*/
|
|
53
|
+
export const MastraFeedbackRequestSchema = z
|
|
54
|
+
.object({
|
|
55
|
+
traceId: z.string().min(1),
|
|
56
|
+
name: z.string().optional(),
|
|
57
|
+
value: MastraFeedbackValueSchema.optional(),
|
|
58
|
+
comment: z.string().optional(),
|
|
59
|
+
})
|
|
60
|
+
.refine((v) => v.value !== undefined || (v.comment?.trim().length ?? 0) > 0, {
|
|
61
|
+
message: "feedback requires a value or a non-empty comment",
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* Response from `POST ${basePath}/route/feedback`.
|
|
65
|
+
*
|
|
66
|
+
* `ok` is `true` when the assessment was recorded. It can be `false`
|
|
67
|
+
* (with `ok: false`) without the call throwing - most commonly because
|
|
68
|
+
* the trace hasn't finished exporting to MLflow yet (trace export is
|
|
69
|
+
* asynchronous); the client surfaces a soft "try again" hint rather
|
|
70
|
+
* than an error. `assessmentId` is the created assessment's id on
|
|
71
|
+
* success.
|
|
72
|
+
*/
|
|
73
|
+
export const MastraFeedbackResponseSchema = z.object({
|
|
74
|
+
ok: z.boolean(),
|
|
75
|
+
assessmentId: z.string().optional(),
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlZGJhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmVlZGJhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4Qjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsbUJBQW1CLENBQUM7QUFFMUQsMEVBQTBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLGVBQWUsQ0FBQztBQUVyRCxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxDQUFDO0FBRW5EOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUd4Rjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQUM7S0FDekMsTUFBTSxDQUFDO0lBQ04sT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzNCLEtBQUssRUFBRSx5QkFBeUIsQ0FBQyxRQUFRLEVBQUU7SUFDM0MsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDL0IsQ0FBQztLQUNELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDM0UsT0FBTyxFQUFFLGtEQUFrRDtDQUM1RCxDQUFDLENBQUM7QUFHTDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ25ELEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFO0lBQ2YsWUFBWSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDcEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXaXJlLWZvcm1hdCBjb250cmFjdCBmb3IgdGhlIE1hc3RyYSBwbHVnaW4ncyB1c2VyLWZlZWRiYWNrIHN1cmZhY2U6XG4gKiB0aGUgcmVzcG9uc2UgaGVhZGVyIHRoYXQgY2FycmllcyBhIHR1cm4ncyBNTGZsb3cgdHJhY2UgaWQgYmFjayB0byB0aGVcbiAqIGJyb3dzZXIsIHBsdXMgdGhlIHJlcXVlc3QgLyByZXNwb25zZSBzY2hlbWFzIGZvciB0aGUgZmVlZGJhY2sgcm91dGVcbiAqIChgTUFTVFJBX1JPVVRFUy5mZWVkYmFja2ApLlxuICpcbiAqIEZlZWRiYWNrIGlzIGxvZ2dlZCB0byBNTGZsb3cgYXMgYSB0cmFjZSAqYXNzZXNzbWVudCogKHRodW1icyB1cC9kb3duXG4gKiBhcyBhIGJvb2xlYW4sIG9yIGEgZnJlZWZvcm0gY29tbWVudCBhcyB0ZXh0KSwgc28gaXQgbXVzdCBiZSB0aWVkIHRvIGFcbiAqIHRyYWNlLiBUaGUgcGx1Z2luIHN0YW1wcyB0aGUgYWN0aXZlIE9UZWwgdHJhY2UgaWQgb2YgZWFjaCB0dXJuIG9uIHRoZVxuICogcmVzcG9uc2UgYXMge0BsaW5rIE1MRkxPV19UUkFDRV9JRF9IRUFERVJ9IChgdHItPGhleD5gKTsgdGhlIGNsaWVudFxuICogY2FwdHVyZXMgaXQgcGVyIGFzc2lzdGFudCBtZXNzYWdlIGFuZCBzZW5kcyBpdCBiYWNrIGhlcmUgd2hlbiB0aGVcbiAqIHVzZXIgcmVhY3RzLiBLZXB0IGRlcGVuZGVuY3ktZnJlZSBzbyBib3RoIHRoZSBicm93c2VyIGNsaWVudCBhbmQgdGhlXG4gKiBzZXJ2ZXIgcGx1Z2luIHNoYXJlIG9uZSBkZWZpbml0aW9uLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG4vKipcbiAqIFJlc3BvbnNlIGhlYWRlciBjYXJyeWluZyB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCAoYHRyLTxoZXg+YCksXG4gKiBkZXJpdmVkIGZyb20gdGhlIGFjdGl2ZSBPcGVuVGVsZW1ldHJ5IHRyYWNlIGlkLiBQcmVzZW50IG9ubHkgd2hlblxuICogTUxmbG93IGxvZ2dpbmcgaXMgZW5hYmxlZCBhbmQgYSB0cmFjZSB3YXMgYWN0aXZlIGZvciB0aGUgcmVxdWVzdC5cbiAqIFRoZSBjaGF0IGNsaWVudCByZWFkcyBpdCBvZmYgdGhlIHN0cmVhbSByZXNwb25zZSBhbmQgcGFpcnMgaXQgd2l0aFxuICogdGhlIGFzc2lzdGFudCBtZXNzYWdlIHNvIGEgbGF0ZXIgdGh1bWJzIC8gY29tbWVudCBhdHRhY2hlcyB0byB0aGVcbiAqIHJpZ2h0IHRyYWNlLlxuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1RSQUNFX0lEX0hFQURFUiA9IFwieC1tbGZsb3ctdHJhY2UtaWRcIjtcblxuLyoqIEFzc2Vzc21lbnQgbmFtZSB1c2VkIGZvciB0aHVtYnMgZmVlZGJhY2sgd2hlbiB0aGUgY2FsbGVyIG9taXRzIG9uZS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZFRURCQUNLX05BTUUgPSBcInVzZXJfZmVlZGJhY2tcIjtcblxuLyoqIEFzc2Vzc21lbnQgbmFtZSB1c2VkIGZvciBhIGZyZWVmb3JtIGNvbW1lbnQgd2hlbiBubyBleHBsaWNpdCB2YWx1ZSBpcyBzZW50LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ09NTUVOVF9OQU1FID0gXCJ1c2VyX2NvbW1lbnRcIjtcblxuLyoqXG4gKiBGZWVkYmFjayB2YWx1ZSB0aGUgYXNzZXNzbWVudCByZWNvcmRzLiBCb29sZWFuIGZvciB0aHVtYnMgdXAvZG93bixcbiAqIG51bWJlciBmb3IgYSByYXRpbmcgc2NhbGUsIHN0cmluZyBmb3IgYSBzaG9ydCBjYXRlZ29yaWNhbCBsYWJlbC5cbiAqIEEgZnJlZWZvcm0gY29tbWVudCB0cmF2ZWxzIGluIGBjb21tZW50YCBpbnN0ZWFkIChvciBhcyB0aGUgdmFsdWVcbiAqIHdoZW4gbm8gdGh1bWJzIHZhbHVlIGlzIHByZXNlbnQpLlxuICovXG5leHBvcnQgY29uc3QgTWFzdHJhRmVlZGJhY2tWYWx1ZVNjaGVtYSA9IHoudW5pb24oW3ouYm9vbGVhbigpLCB6Lm51bWJlcigpLCB6LnN0cmluZygpXSk7XG5leHBvcnQgdHlwZSBNYXN0cmFGZWVkYmFja1ZhbHVlID0gei5pbmZlcjx0eXBlb2YgTWFzdHJhRmVlZGJhY2tWYWx1ZVNjaGVtYT47XG5cbi8qKlxuICogUmVxdWVzdCBib2R5IGZvciBgUE9TVCAke2Jhc2VQYXRofS9yb3V0ZS9mZWVkYmFja2AuXG4gKlxuICogRmllbGRzOlxuICogICAtIGB0cmFjZUlkYDogTUxmbG93IHRyYWNlIGlkIHRoZSBmZWVkYmFjayBhdHRhY2hlcyB0byAodGhlXG4gKiAgICAgYHRyLTxoZXg+YCB2YWx1ZSB0aGUgc2VydmVyIHNlbnQgdmlhIHtAbGluayBNTEZMT1dfVFJBQ0VfSURfSEVBREVSfSkuXG4gKiAgIC0gYG5hbWVgOiBhc3Nlc3NtZW50IG5hbWUuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0ZFRURCQUNLX05BTUV9XG4gKiAgICAgZm9yIGEgdmFsdWUsIHtAbGluayBERUZBVUxUX0NPTU1FTlRfTkFNRX0gZm9yIGEgY29tbWVudC1vbmx5IHN1Ym1pdC5cbiAqICAgLSBgdmFsdWVgOiB0aGUgdGh1bWJzIC8gcmF0aW5nIHZhbHVlIChvbWl0IGZvciBhIGNvbW1lbnQtb25seSBzdWJtaXQpLlxuICogICAtIGBjb21tZW50YDogZnJlZWZvcm0gcmF0aW9uYWxlLiBMb2dnZWQgYXMgdGhlIGFzc2Vzc21lbnQgdmFsdWUgd2hlblxuICogICAgIGB2YWx1ZWAgaXMgYWJzZW50LCBvciBhcyB0aGUgcmF0aW9uYWxlIGFsb25nc2lkZSBhIGB2YWx1ZWAuXG4gKlxuICogUmVmaW5lZCBzbyBhbiBlbXB0eSBzdWJtaXNzaW9uIChuZWl0aGVyIGEgdmFsdWUgbm9yIGEgbm9uLWVtcHR5XG4gKiBjb21tZW50KSBpcyByZWplY3RlZCByYXRoZXIgdGhhbiBsb2dnaW5nIGEgbWVhbmluZ2xlc3MgYXNzZXNzbWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1hc3RyYUZlZWRiYWNrUmVxdWVzdFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdHJhY2VJZDogei5zdHJpbmcoKS5taW4oMSksXG4gICAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHZhbHVlOiBNYXN0cmFGZWVkYmFja1ZhbHVlU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgY29tbWVudDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB9KVxuICAucmVmaW5lKCh2KSA9PiB2LnZhbHVlICE9PSB1bmRlZmluZWQgfHwgKHYuY29tbWVudD8udHJpbSgpLmxlbmd0aCA/PyAwKSA+IDAsIHtcbiAgICBtZXNzYWdlOiBcImZlZWRiYWNrIHJlcXVpcmVzIGEgdmFsdWUgb3IgYSBub24tZW1wdHkgY29tbWVudFwiLFxuICB9KTtcbmV4cG9ydCB0eXBlIE1hc3RyYUZlZWRiYWNrUmVxdWVzdCA9IHouaW5mZXI8dHlwZW9mIE1hc3RyYUZlZWRiYWNrUmVxdWVzdFNjaGVtYT47XG5cbi8qKlxuICogUmVzcG9uc2UgZnJvbSBgUE9TVCAke2Jhc2VQYXRofS9yb3V0ZS9mZWVkYmFja2AuXG4gKlxuICogYG9rYCBpcyBgdHJ1ZWAgd2hlbiB0aGUgYXNzZXNzbWVudCB3YXMgcmVjb3JkZWQuIEl0IGNhbiBiZSBgZmFsc2VgXG4gKiAod2l0aCBgb2s6IGZhbHNlYCkgd2l0aG91dCB0aGUgY2FsbCB0aHJvd2luZyAtIG1vc3QgY29tbW9ubHkgYmVjYXVzZVxuICogdGhlIHRyYWNlIGhhc24ndCBmaW5pc2hlZCBleHBvcnRpbmcgdG8gTUxmbG93IHlldCAodHJhY2UgZXhwb3J0IGlzXG4gKiBhc3luY2hyb25vdXMpOyB0aGUgY2xpZW50IHN1cmZhY2VzIGEgc29mdCBcInRyeSBhZ2FpblwiIGhpbnQgcmF0aGVyXG4gKiB0aGFuIGFuIGVycm9yLiBgYXNzZXNzbWVudElkYCBpcyB0aGUgY3JlYXRlZCBhc3Nlc3NtZW50J3MgaWQgb25cbiAqIHN1Y2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBNYXN0cmFGZWVkYmFja1Jlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBvazogei5ib29sZWFuKCksXG4gIGFzc2Vzc21lbnRJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBNYXN0cmFGZWVkYmFja1Jlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgTWFzdHJhRmVlZGJhY2tSZXNwb25zZVNjaGVtYT47XG4iXX0=
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-prose embed marker grammar.
|
|
3
|
+
*
|
|
4
|
+
* The Mastra agent is instructed to defer visualizations to the host
|
|
5
|
+
* UI by embedding markers in its markdown reply; the UI parses them
|
|
6
|
+
* out and swaps in the matching slot. This module is the single
|
|
7
|
+
* source of truth for that grammar so every consumer parses markers
|
|
8
|
+
* the same way and can't drift from the shapes documented on
|
|
9
|
+
* {@link ChartSchema} / {@link StatementDataSchema} in `protocol.ts`
|
|
10
|
+
* and the instructions the server hands the model.
|
|
11
|
+
*
|
|
12
|
+
* One grammar, open-ended type. A marker is `[<type>:<id>]`. The
|
|
13
|
+
* `<type>` is an opaque token that names the embed kind; the host
|
|
14
|
+
* resolves it against the generic `/embed/<type>/<id>` route, which
|
|
15
|
+
* 404s any type the server doesn't register. The grammar does NOT
|
|
16
|
+
* hard-code the known types - new embed kinds work end to end
|
|
17
|
+
* without touching this regex. Today the server registers:
|
|
18
|
+
*
|
|
19
|
+
* - `[chart:<chartId>]` - the `<chartId>` is a v4 UUID minted by
|
|
20
|
+
* the chart subsystem (`prepare_chart` / `render_data`) and
|
|
21
|
+
* resolves to a cached Echarts spec.
|
|
22
|
+
* - `[data:<statementId>]` - the `<statementId>` is a Databricks
|
|
23
|
+
* statement id (a time-ordered UUID) and resolves to the
|
|
24
|
+
* statement's rows.
|
|
25
|
+
*
|
|
26
|
+
* The `<id>` of a real embed is UUID-shaped (`8-4-4-4-12` hex): both
|
|
27
|
+
* id kinds above are UUIDs, just different versions (chart = v4,
|
|
28
|
+
* statement = v7-style). The grammar deliberately captures ANY
|
|
29
|
+
* non-bracket id token, not just UUID-shaped ones, so a fabricated
|
|
30
|
+
* marker the model glued together from a label
|
|
31
|
+
* (e.g. `[chart:placeholder]` or
|
|
32
|
+
* `[chart:01f163b6-1eac-region-fill-oos]`) still parses as a marker.
|
|
33
|
+
* Matching it - rather than letting the broad regex miss it - is what
|
|
34
|
+
* lets the host UI consume and obscure the bogus marker instead of
|
|
35
|
+
* leaking the literal `[chart:...]` text into the rendered prose.
|
|
36
|
+
* Whether an id is a genuine embed is a separate {@link isUuid}
|
|
37
|
+
* check the caller runs on {@link ParsedMarker.id}.
|
|
38
|
+
*
|
|
39
|
+
* Parse everything through {@link parseMarkers}, validate the id with
|
|
40
|
+
* {@link isUuid}, and branch on the returned {@link ParsedMarker.type}.
|
|
41
|
+
*
|
|
42
|
+
* @module
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* The embed kind named by a marker's `<type>` segment. Left as an
|
|
46
|
+
* open `string` (not a closed union) so the grammar stays generic:
|
|
47
|
+
* the authoritative set of supported types lives in the server's
|
|
48
|
+
* `/embed/:type/:id` resolver registry, and an unknown type simply
|
|
49
|
+
* 404s. The two types the server ships today are `"chart"` and
|
|
50
|
+
* `"data"`.
|
|
51
|
+
*/
|
|
52
|
+
export type MarkerType = string;
|
|
53
|
+
/**
|
|
54
|
+
* Whether `id` is a UUID-shaped embed id. The marker grammar
|
|
55
|
+
* ({@link MARKER_RE}) matches any non-bracket id token so fabricated
|
|
56
|
+
* markers don't leak as literal prose; this is the guard callers run
|
|
57
|
+
* to decide whether an id is a real embed (render the slot) or a
|
|
58
|
+
* bogus label to obscure (drop the marker entirely).
|
|
59
|
+
*/
|
|
60
|
+
export declare function isUuid(id: string): boolean;
|
|
61
|
+
/** One marker found in agent prose, with its source span. */
|
|
62
|
+
export interface ParsedMarker {
|
|
63
|
+
/** Marker kind token (e.g. `chart`, `data`); see {@link MarkerType}. */
|
|
64
|
+
type: MarkerType;
|
|
65
|
+
/** Raw id captured from the marker (chart id or statement id). */
|
|
66
|
+
id: string;
|
|
67
|
+
/** Index of the marker's first character in the source text. */
|
|
68
|
+
start: number;
|
|
69
|
+
/** Index one past the marker's last character. */
|
|
70
|
+
end: number;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Parse every embed marker out of `text`, in source order. A single
|
|
74
|
+
* regex pass means matches never overlap, so callers can splice the
|
|
75
|
+
* spans directly without a sort/dedupe step. This is the one entry
|
|
76
|
+
* point for marker parsing: type branching runs on the returned
|
|
77
|
+
* markers. The grammar ({@link MARKER_RE}) matches any non-bracket id
|
|
78
|
+
* token, so a returned {@link ParsedMarker.id} is NOT guaranteed to
|
|
79
|
+
* be a real embed id - run it through {@link isUuid} to tell a
|
|
80
|
+
* genuine embed apart from a fabricated label, which the caller then
|
|
81
|
+
* obscures rather than rendering.
|
|
82
|
+
*/
|
|
83
|
+
export declare function parseMarkers(text: string): ParsedMarker[];
|
|
84
|
+
/**
|
|
85
|
+
* Strip a trailing partial marker (`[chart`, `[data:01f1`, ...) that
|
|
86
|
+
* hasn't received its closing `]` yet. While the model streams
|
|
87
|
+
* text-deltas a marker arrives across several chunks, and rendering
|
|
88
|
+
* each interim state would briefly flash the literal `[chart:abc-`
|
|
89
|
+
* prefix before the closing bracket swaps it for a slot. Hiding any
|
|
90
|
+
* trailing `[<non-whitespace-non-bracket>...` suffix keeps the prose
|
|
91
|
+
* stable until either a `]` (full marker) or whitespace (definitely
|
|
92
|
+
* not a marker) lands. Persisted transcripts never end mid-marker,
|
|
93
|
+
* so this is a no-op on reload.
|
|
94
|
+
*/
|
|
95
|
+
export declare function stripIncompleteMarkerTail(text: string): string;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-prose embed marker grammar.
|
|
3
|
+
*
|
|
4
|
+
* The Mastra agent is instructed to defer visualizations to the host
|
|
5
|
+
* UI by embedding markers in its markdown reply; the UI parses them
|
|
6
|
+
* out and swaps in the matching slot. This module is the single
|
|
7
|
+
* source of truth for that grammar so every consumer parses markers
|
|
8
|
+
* the same way and can't drift from the shapes documented on
|
|
9
|
+
* {@link ChartSchema} / {@link StatementDataSchema} in `protocol.ts`
|
|
10
|
+
* and the instructions the server hands the model.
|
|
11
|
+
*
|
|
12
|
+
* One grammar, open-ended type. A marker is `[<type>:<id>]`. The
|
|
13
|
+
* `<type>` is an opaque token that names the embed kind; the host
|
|
14
|
+
* resolves it against the generic `/embed/<type>/<id>` route, which
|
|
15
|
+
* 404s any type the server doesn't register. The grammar does NOT
|
|
16
|
+
* hard-code the known types - new embed kinds work end to end
|
|
17
|
+
* without touching this regex. Today the server registers:
|
|
18
|
+
*
|
|
19
|
+
* - `[chart:<chartId>]` - the `<chartId>` is a v4 UUID minted by
|
|
20
|
+
* the chart subsystem (`prepare_chart` / `render_data`) and
|
|
21
|
+
* resolves to a cached Echarts spec.
|
|
22
|
+
* - `[data:<statementId>]` - the `<statementId>` is a Databricks
|
|
23
|
+
* statement id (a time-ordered UUID) and resolves to the
|
|
24
|
+
* statement's rows.
|
|
25
|
+
*
|
|
26
|
+
* The `<id>` of a real embed is UUID-shaped (`8-4-4-4-12` hex): both
|
|
27
|
+
* id kinds above are UUIDs, just different versions (chart = v4,
|
|
28
|
+
* statement = v7-style). The grammar deliberately captures ANY
|
|
29
|
+
* non-bracket id token, not just UUID-shaped ones, so a fabricated
|
|
30
|
+
* marker the model glued together from a label
|
|
31
|
+
* (e.g. `[chart:placeholder]` or
|
|
32
|
+
* `[chart:01f163b6-1eac-region-fill-oos]`) still parses as a marker.
|
|
33
|
+
* Matching it - rather than letting the broad regex miss it - is what
|
|
34
|
+
* lets the host UI consume and obscure the bogus marker instead of
|
|
35
|
+
* leaking the literal `[chart:...]` text into the rendered prose.
|
|
36
|
+
* Whether an id is a genuine embed is a separate {@link isUuid}
|
|
37
|
+
* check the caller runs on {@link ParsedMarker.id}.
|
|
38
|
+
*
|
|
39
|
+
* Parse everything through {@link parseMarkers}, validate the id with
|
|
40
|
+
* {@link isUuid}, and branch on the returned {@link ParsedMarker.type}.
|
|
41
|
+
*
|
|
42
|
+
* @module
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* Single matcher for ANY embed marker, regardless of type. Matches
|
|
46
|
+
* `[<type>:<id>]`. Capture group 1 is the marker type token (e.g.
|
|
47
|
+
* `chart`, `data`); group 2 is the id - any run of non-bracket,
|
|
48
|
+
* non-whitespace characters, NOT constrained to a UUID shape.
|
|
49
|
+
*
|
|
50
|
+
* Neither the type nor the id shape is enumerated here. The type is
|
|
51
|
+
* left open because the server's resolver registry decides which
|
|
52
|
+
* types are real and 404s the rest, so a new embed kind needs no
|
|
53
|
+
* grammar change. The id is left broad on purpose: a fabricated
|
|
54
|
+
* marker the model emits from a label (e.g. `[chart:placeholder]`)
|
|
55
|
+
* MUST still match so the host UI can consume and obscure it rather
|
|
56
|
+
* than leak the literal `[chart:...]` text into the prose. The id is
|
|
57
|
+
* then validated with {@link isUuid} downstream; non-UUID ids resolve
|
|
58
|
+
* to no embed.
|
|
59
|
+
*
|
|
60
|
+
* Safe to share as a `/g` constant: it's only ever consumed via
|
|
61
|
+
* {@link String.prototype.matchAll}, which clones the regex and
|
|
62
|
+
* never advances this object's `lastIndex`. (A `.exec()`/`.test()`
|
|
63
|
+
* loop would need a fresh regex each time, but we don't do that.)
|
|
64
|
+
*/
|
|
65
|
+
const MARKER_RE = /\[([A-Za-z][A-Za-z0-9_-]*):([^\]\s]+)\]/g;
|
|
66
|
+
/**
|
|
67
|
+
* UUID matcher (`8-4-4-4-12` hex, any version) anchored to the whole
|
|
68
|
+
* string. Covers v4 chart ids and time-ordered (v7-style) statement
|
|
69
|
+
* ids alike. Used by {@link isUuid} to tell a genuine embed id apart
|
|
70
|
+
* from a label the model fabricated into a marker.
|
|
71
|
+
*/
|
|
72
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
73
|
+
/**
|
|
74
|
+
* Whether `id` is a UUID-shaped embed id. The marker grammar
|
|
75
|
+
* ({@link MARKER_RE}) matches any non-bracket id token so fabricated
|
|
76
|
+
* markers don't leak as literal prose; this is the guard callers run
|
|
77
|
+
* to decide whether an id is a real embed (render the slot) or a
|
|
78
|
+
* bogus label to obscure (drop the marker entirely).
|
|
79
|
+
*/
|
|
80
|
+
export function isUuid(id) {
|
|
81
|
+
return UUID_RE.test(id);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Parse every embed marker out of `text`, in source order. A single
|
|
85
|
+
* regex pass means matches never overlap, so callers can splice the
|
|
86
|
+
* spans directly without a sort/dedupe step. This is the one entry
|
|
87
|
+
* point for marker parsing: type branching runs on the returned
|
|
88
|
+
* markers. The grammar ({@link MARKER_RE}) matches any non-bracket id
|
|
89
|
+
* token, so a returned {@link ParsedMarker.id} is NOT guaranteed to
|
|
90
|
+
* be a real embed id - run it through {@link isUuid} to tell a
|
|
91
|
+
* genuine embed apart from a fabricated label, which the caller then
|
|
92
|
+
* obscures rather than rendering.
|
|
93
|
+
*/
|
|
94
|
+
export function parseMarkers(text) {
|
|
95
|
+
const out = [];
|
|
96
|
+
for (const match of text.matchAll(MARKER_RE)) {
|
|
97
|
+
const start = match.index ?? 0;
|
|
98
|
+
out.push({
|
|
99
|
+
// Group 1 is the `<type>` token; the server's embed registry
|
|
100
|
+
// (not this parser) decides whether it's supported.
|
|
101
|
+
type: match[1] ?? "",
|
|
102
|
+
id: match[2] ?? "",
|
|
103
|
+
start,
|
|
104
|
+
end: start + match[0].length,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Strip a trailing partial marker (`[chart`, `[data:01f1`, ...) that
|
|
111
|
+
* hasn't received its closing `]` yet. While the model streams
|
|
112
|
+
* text-deltas a marker arrives across several chunks, and rendering
|
|
113
|
+
* each interim state would briefly flash the literal `[chart:abc-`
|
|
114
|
+
* prefix before the closing bracket swaps it for a slot. Hiding any
|
|
115
|
+
* trailing `[<non-whitespace-non-bracket>...` suffix keeps the prose
|
|
116
|
+
* stable until either a `]` (full marker) or whitespace (definitely
|
|
117
|
+
* not a marker) lands. Persisted transcripts never end mid-marker,
|
|
118
|
+
* so this is a no-op on reload.
|
|
119
|
+
*/
|
|
120
|
+
export function stripIncompleteMarkerTail(text) {
|
|
121
|
+
return text.replace(/\[[^\s[\]]*$/, "");
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENHO0FBWUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxTQUFTLEdBQUcsMENBQTBDLENBQUM7QUFFN0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sR0FBRyxpRUFBaUUsQ0FBQztBQUVsRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLEVBQVU7SUFDL0IsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFjRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFZO0lBQ3ZDLE1BQU0sR0FBRyxHQUFtQixFQUFFLENBQUM7SUFDL0IsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDL0IsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNQLDZEQUE2RDtZQUM3RCxvREFBb0Q7WUFDcEQsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQ3BCLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtZQUNsQixLQUFLO1lBQ0wsR0FBRyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxJQUFZO0lBQ3BELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWdlbnQtcHJvc2UgZW1iZWQgbWFya2VyIGdyYW1tYXIuXG4gKlxuICogVGhlIE1hc3RyYSBhZ2VudCBpcyBpbnN0cnVjdGVkIHRvIGRlZmVyIHZpc3VhbGl6YXRpb25zIHRvIHRoZSBob3N0XG4gKiBVSSBieSBlbWJlZGRpbmcgbWFya2VycyBpbiBpdHMgbWFya2Rvd24gcmVwbHk7IHRoZSBVSSBwYXJzZXMgdGhlbVxuICogb3V0IGFuZCBzd2FwcyBpbiB0aGUgbWF0Y2hpbmcgc2xvdC4gVGhpcyBtb2R1bGUgaXMgdGhlIHNpbmdsZVxuICogc291cmNlIG9mIHRydXRoIGZvciB0aGF0IGdyYW1tYXIgc28gZXZlcnkgY29uc3VtZXIgcGFyc2VzIG1hcmtlcnNcbiAqIHRoZSBzYW1lIHdheSBhbmQgY2FuJ3QgZHJpZnQgZnJvbSB0aGUgc2hhcGVzIGRvY3VtZW50ZWQgb25cbiAqIHtAbGluayBDaGFydFNjaGVtYX0gLyB7QGxpbmsgU3RhdGVtZW50RGF0YVNjaGVtYX0gaW4gYHByb3RvY29sLnRzYFxuICogYW5kIHRoZSBpbnN0cnVjdGlvbnMgdGhlIHNlcnZlciBoYW5kcyB0aGUgbW9kZWwuXG4gKlxuICogT25lIGdyYW1tYXIsIG9wZW4tZW5kZWQgdHlwZS4gQSBtYXJrZXIgaXMgYFs8dHlwZT46PGlkPl1gLiBUaGVcbiAqIGA8dHlwZT5gIGlzIGFuIG9wYXF1ZSB0b2tlbiB0aGF0IG5hbWVzIHRoZSBlbWJlZCBraW5kOyB0aGUgaG9zdFxuICogcmVzb2x2ZXMgaXQgYWdhaW5zdCB0aGUgZ2VuZXJpYyBgL2VtYmVkLzx0eXBlPi88aWQ+YCByb3V0ZSwgd2hpY2hcbiAqIDQwNHMgYW55IHR5cGUgdGhlIHNlcnZlciBkb2Vzbid0IHJlZ2lzdGVyLiBUaGUgZ3JhbW1hciBkb2VzIE5PVFxuICogaGFyZC1jb2RlIHRoZSBrbm93biB0eXBlcyAtIG5ldyBlbWJlZCBraW5kcyB3b3JrIGVuZCB0byBlbmRcbiAqIHdpdGhvdXQgdG91Y2hpbmcgdGhpcyByZWdleC4gVG9kYXkgdGhlIHNlcnZlciByZWdpc3RlcnM6XG4gKlxuICogICAtIGBbY2hhcnQ6PGNoYXJ0SWQ+XWAgLSB0aGUgYDxjaGFydElkPmAgaXMgYSB2NCBVVUlEIG1pbnRlZCBieVxuICogICAgIHRoZSBjaGFydCBzdWJzeXN0ZW0gKGBwcmVwYXJlX2NoYXJ0YCAvIGByZW5kZXJfZGF0YWApIGFuZFxuICogICAgIHJlc29sdmVzIHRvIGEgY2FjaGVkIEVjaGFydHMgc3BlYy5cbiAqICAgLSBgW2RhdGE6PHN0YXRlbWVudElkPl1gIC0gdGhlIGA8c3RhdGVtZW50SWQ+YCBpcyBhIERhdGFicmlja3NcbiAqICAgICBzdGF0ZW1lbnQgaWQgKGEgdGltZS1vcmRlcmVkIFVVSUQpIGFuZCByZXNvbHZlcyB0byB0aGVcbiAqICAgICBzdGF0ZW1lbnQncyByb3dzLlxuICpcbiAqIFRoZSBgPGlkPmAgb2YgYSByZWFsIGVtYmVkIGlzIFVVSUQtc2hhcGVkIChgOC00LTQtNC0xMmAgaGV4KTogYm90aFxuICogaWQga2luZHMgYWJvdmUgYXJlIFVVSURzLCBqdXN0IGRpZmZlcmVudCB2ZXJzaW9ucyAoY2hhcnQgPSB2NCxcbiAqIHN0YXRlbWVudCA9IHY3LXN0eWxlKS4gVGhlIGdyYW1tYXIgZGVsaWJlcmF0ZWx5IGNhcHR1cmVzIEFOWVxuICogbm9uLWJyYWNrZXQgaWQgdG9rZW4sIG5vdCBqdXN0IFVVSUQtc2hhcGVkIG9uZXMsIHNvIGEgZmFicmljYXRlZFxuICogbWFya2VyIHRoZSBtb2RlbCBnbHVlZCB0b2dldGhlciBmcm9tIGEgbGFiZWxcbiAqIChlLmcuIGBbY2hhcnQ6cGxhY2Vob2xkZXJdYCBvclxuICogYFtjaGFydDowMWYxNjNiNi0xZWFjLXJlZ2lvbi1maWxsLW9vc11gKSBzdGlsbCBwYXJzZXMgYXMgYSBtYXJrZXIuXG4gKiBNYXRjaGluZyBpdCAtIHJhdGhlciB0aGFuIGxldHRpbmcgdGhlIGJyb2FkIHJlZ2V4IG1pc3MgaXQgLSBpcyB3aGF0XG4gKiBsZXRzIHRoZSBob3N0IFVJIGNvbnN1bWUgYW5kIG9ic2N1cmUgdGhlIGJvZ3VzIG1hcmtlciBpbnN0ZWFkIG9mXG4gKiBsZWFraW5nIHRoZSBsaXRlcmFsIGBbY2hhcnQ6Li4uXWAgdGV4dCBpbnRvIHRoZSByZW5kZXJlZCBwcm9zZS5cbiAqIFdoZXRoZXIgYW4gaWQgaXMgYSBnZW51aW5lIGVtYmVkIGlzIGEgc2VwYXJhdGUge0BsaW5rIGlzVXVpZH1cbiAqIGNoZWNrIHRoZSBjYWxsZXIgcnVucyBvbiB7QGxpbmsgUGFyc2VkTWFya2VyLmlkfS5cbiAqXG4gKiBQYXJzZSBldmVyeXRoaW5nIHRocm91Z2gge0BsaW5rIHBhcnNlTWFya2Vyc30sIHZhbGlkYXRlIHRoZSBpZCB3aXRoXG4gKiB7QGxpbmsgaXNVdWlkfSwgYW5kIGJyYW5jaCBvbiB0aGUgcmV0dXJuZWQge0BsaW5rIFBhcnNlZE1hcmtlci50eXBlfS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLyoqXG4gKiBUaGUgZW1iZWQga2luZCBuYW1lZCBieSBhIG1hcmtlcidzIGA8dHlwZT5gIHNlZ21lbnQuIExlZnQgYXMgYW5cbiAqIG9wZW4gYHN0cmluZ2AgKG5vdCBhIGNsb3NlZCB1bmlvbikgc28gdGhlIGdyYW1tYXIgc3RheXMgZ2VuZXJpYzpcbiAqIHRoZSBhdXRob3JpdGF0aXZlIHNldCBvZiBzdXBwb3J0ZWQgdHlwZXMgbGl2ZXMgaW4gdGhlIHNlcnZlcidzXG4gKiBgL2VtYmVkLzp0eXBlLzppZGAgcmVzb2x2ZXIgcmVnaXN0cnksIGFuZCBhbiB1bmtub3duIHR5cGUgc2ltcGx5XG4gKiA0MDRzLiBUaGUgdHdvIHR5cGVzIHRoZSBzZXJ2ZXIgc2hpcHMgdG9kYXkgYXJlIGBcImNoYXJ0XCJgIGFuZFxuICogYFwiZGF0YVwiYC5cbiAqL1xuZXhwb3J0IHR5cGUgTWFya2VyVHlwZSA9IHN0cmluZztcblxuLyoqXG4gKiBTaW5nbGUgbWF0Y2hlciBmb3IgQU5ZIGVtYmVkIG1hcmtlciwgcmVnYXJkbGVzcyBvZiB0eXBlLiBNYXRjaGVzXG4gKiBgWzx0eXBlPjo8aWQ+XWAuIENhcHR1cmUgZ3JvdXAgMSBpcyB0aGUgbWFya2VyIHR5cGUgdG9rZW4gKGUuZy5cbiAqIGBjaGFydGAsIGBkYXRhYCk7IGdyb3VwIDIgaXMgdGhlIGlkIC0gYW55IHJ1biBvZiBub24tYnJhY2tldCxcbiAqIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMsIE5PVCBjb25zdHJhaW5lZCB0byBhIFVVSUQgc2hhcGUuXG4gKlxuICogTmVpdGhlciB0aGUgdHlwZSBub3IgdGhlIGlkIHNoYXBlIGlzIGVudW1lcmF0ZWQgaGVyZS4gVGhlIHR5cGUgaXNcbiAqIGxlZnQgb3BlbiBiZWNhdXNlIHRoZSBzZXJ2ZXIncyByZXNvbHZlciByZWdpc3RyeSBkZWNpZGVzIHdoaWNoXG4gKiB0eXBlcyBhcmUgcmVhbCBhbmQgNDA0cyB0aGUgcmVzdCwgc28gYSBuZXcgZW1iZWQga2luZCBuZWVkcyBub1xuICogZ3JhbW1hciBjaGFuZ2UuIFRoZSBpZCBpcyBsZWZ0IGJyb2FkIG9uIHB1cnBvc2U6IGEgZmFicmljYXRlZFxuICogbWFya2VyIHRoZSBtb2RlbCBlbWl0cyBmcm9tIGEgbGFiZWwgKGUuZy4gYFtjaGFydDpwbGFjZWhvbGRlcl1gKVxuICogTVVTVCBzdGlsbCBtYXRjaCBzbyB0aGUgaG9zdCBVSSBjYW4gY29uc3VtZSBhbmQgb2JzY3VyZSBpdCByYXRoZXJcbiAqIHRoYW4gbGVhayB0aGUgbGl0ZXJhbCBgW2NoYXJ0Oi4uLl1gIHRleHQgaW50byB0aGUgcHJvc2UuIFRoZSBpZCBpc1xuICogdGhlbiB2YWxpZGF0ZWQgd2l0aCB7QGxpbmsgaXNVdWlkfSBkb3duc3RyZWFtOyBub24tVVVJRCBpZHMgcmVzb2x2ZVxuICogdG8gbm8gZW1iZWQuXG4gKlxuICogU2FmZSB0byBzaGFyZSBhcyBhIGAvZ2AgY29uc3RhbnQ6IGl0J3Mgb25seSBldmVyIGNvbnN1bWVkIHZpYVxuICoge0BsaW5rIFN0cmluZy5wcm90b3R5cGUubWF0Y2hBbGx9LCB3aGljaCBjbG9uZXMgdGhlIHJlZ2V4IGFuZFxuICogbmV2ZXIgYWR2YW5jZXMgdGhpcyBvYmplY3QncyBgbGFzdEluZGV4YC4gKEEgYC5leGVjKClgL2AudGVzdCgpYFxuICogbG9vcCB3b3VsZCBuZWVkIGEgZnJlc2ggcmVnZXggZWFjaCB0aW1lLCBidXQgd2UgZG9uJ3QgZG8gdGhhdC4pXG4gKi9cbmNvbnN0IE1BUktFUl9SRSA9IC9cXFsoW0EtWmEtel1bQS1aYS16MC05Xy1dKik6KFteXFxdXFxzXSspXFxdL2c7XG5cbi8qKlxuICogVVVJRCBtYXRjaGVyIChgOC00LTQtNC0xMmAgaGV4LCBhbnkgdmVyc2lvbikgYW5jaG9yZWQgdG8gdGhlIHdob2xlXG4gKiBzdHJpbmcuIENvdmVycyB2NCBjaGFydCBpZHMgYW5kIHRpbWUtb3JkZXJlZCAodjctc3R5bGUpIHN0YXRlbWVudFxuICogaWRzIGFsaWtlLiBVc2VkIGJ5IHtAbGluayBpc1V1aWR9IHRvIHRlbGwgYSBnZW51aW5lIGVtYmVkIGlkIGFwYXJ0XG4gKiBmcm9tIGEgbGFiZWwgdGhlIG1vZGVsIGZhYnJpY2F0ZWQgaW50byBhIG1hcmtlci5cbiAqL1xuY29uc3QgVVVJRF9SRSA9IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JC9pO1xuXG4vKipcbiAqIFdoZXRoZXIgYGlkYCBpcyBhIFVVSUQtc2hhcGVkIGVtYmVkIGlkLiBUaGUgbWFya2VyIGdyYW1tYXJcbiAqICh7QGxpbmsgTUFSS0VSX1JFfSkgbWF0Y2hlcyBhbnkgbm9uLWJyYWNrZXQgaWQgdG9rZW4gc28gZmFicmljYXRlZFxuICogbWFya2VycyBkb24ndCBsZWFrIGFzIGxpdGVyYWwgcHJvc2U7IHRoaXMgaXMgdGhlIGd1YXJkIGNhbGxlcnMgcnVuXG4gKiB0byBkZWNpZGUgd2hldGhlciBhbiBpZCBpcyBhIHJlYWwgZW1iZWQgKHJlbmRlciB0aGUgc2xvdCkgb3IgYVxuICogYm9ndXMgbGFiZWwgdG8gb2JzY3VyZSAoZHJvcCB0aGUgbWFya2VyIGVudGlyZWx5KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVXVpZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBVVUlEX1JFLnRlc3QoaWQpO1xufVxuXG4vKiogT25lIG1hcmtlciBmb3VuZCBpbiBhZ2VudCBwcm9zZSwgd2l0aCBpdHMgc291cmNlIHNwYW4uICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZE1hcmtlciB7XG4gIC8qKiBNYXJrZXIga2luZCB0b2tlbiAoZS5nLiBgY2hhcnRgLCBgZGF0YWApOyBzZWUge0BsaW5rIE1hcmtlclR5cGV9LiAqL1xuICB0eXBlOiBNYXJrZXJUeXBlO1xuICAvKiogUmF3IGlkIGNhcHR1cmVkIGZyb20gdGhlIG1hcmtlciAoY2hhcnQgaWQgb3Igc3RhdGVtZW50IGlkKS4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIEluZGV4IG9mIHRoZSBtYXJrZXIncyBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHNvdXJjZSB0ZXh0LiAqL1xuICBzdGFydDogbnVtYmVyO1xuICAvKiogSW5kZXggb25lIHBhc3QgdGhlIG1hcmtlcidzIGxhc3QgY2hhcmFjdGVyLiAqL1xuICBlbmQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJzZSBldmVyeSBlbWJlZCBtYXJrZXIgb3V0IG9mIGB0ZXh0YCwgaW4gc291cmNlIG9yZGVyLiBBIHNpbmdsZVxuICogcmVnZXggcGFzcyBtZWFucyBtYXRjaGVzIG5ldmVyIG92ZXJsYXAsIHNvIGNhbGxlcnMgY2FuIHNwbGljZSB0aGVcbiAqIHNwYW5zIGRpcmVjdGx5IHdpdGhvdXQgYSBzb3J0L2RlZHVwZSBzdGVwLiBUaGlzIGlzIHRoZSBvbmUgZW50cnlcbiAqIHBvaW50IGZvciBtYXJrZXIgcGFyc2luZzogdHlwZSBicmFuY2hpbmcgcnVucyBvbiB0aGUgcmV0dXJuZWRcbiAqIG1hcmtlcnMuIFRoZSBncmFtbWFyICh7QGxpbmsgTUFSS0VSX1JFfSkgbWF0Y2hlcyBhbnkgbm9uLWJyYWNrZXQgaWRcbiAqIHRva2VuLCBzbyBhIHJldHVybmVkIHtAbGluayBQYXJzZWRNYXJrZXIuaWR9IGlzIE5PVCBndWFyYW50ZWVkIHRvXG4gKiBiZSBhIHJlYWwgZW1iZWQgaWQgLSBydW4gaXQgdGhyb3VnaCB7QGxpbmsgaXNVdWlkfSB0byB0ZWxsIGFcbiAqIGdlbnVpbmUgZW1iZWQgYXBhcnQgZnJvbSBhIGZhYnJpY2F0ZWQgbGFiZWwsIHdoaWNoIHRoZSBjYWxsZXIgdGhlblxuICogb2JzY3VyZXMgcmF0aGVyIHRoYW4gcmVuZGVyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNYXJrZXJzKHRleHQ6IHN0cmluZyk6IFBhcnNlZE1hcmtlcltdIHtcbiAgY29uc3Qgb3V0OiBQYXJzZWRNYXJrZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIHRleHQubWF0Y2hBbGwoTUFSS0VSX1JFKSkge1xuICAgIGNvbnN0IHN0YXJ0ID0gbWF0Y2guaW5kZXggPz8gMDtcbiAgICBvdXQucHVzaCh7XG4gICAgICAvLyBHcm91cCAxIGlzIHRoZSBgPHR5cGU+YCB0b2tlbjsgdGhlIHNlcnZlcidzIGVtYmVkIHJlZ2lzdHJ5XG4gICAgICAvLyAobm90IHRoaXMgcGFyc2VyKSBkZWNpZGVzIHdoZXRoZXIgaXQncyBzdXBwb3J0ZWQuXG4gICAgICB0eXBlOiBtYXRjaFsxXSA/PyBcIlwiLFxuICAgICAgaWQ6IG1hdGNoWzJdID8/IFwiXCIsXG4gICAgICBzdGFydCxcbiAgICAgIGVuZDogc3RhcnQgKyBtYXRjaFswXS5sZW5ndGgsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBTdHJpcCBhIHRyYWlsaW5nIHBhcnRpYWwgbWFya2VyIChgW2NoYXJ0YCwgYFtkYXRhOjAxZjFgLCAuLi4pIHRoYXRcbiAqIGhhc24ndCByZWNlaXZlZCBpdHMgY2xvc2luZyBgXWAgeWV0LiBXaGlsZSB0aGUgbW9kZWwgc3RyZWFtc1xuICogdGV4dC1kZWx0YXMgYSBtYXJrZXIgYXJyaXZlcyBhY3Jvc3Mgc2V2ZXJhbCBjaHVua3MsIGFuZCByZW5kZXJpbmdcbiAqIGVhY2ggaW50ZXJpbSBzdGF0ZSB3b3VsZCBicmllZmx5IGZsYXNoIHRoZSBsaXRlcmFsIGBbY2hhcnQ6YWJjLWBcbiAqIHByZWZpeCBiZWZvcmUgdGhlIGNsb3NpbmcgYnJhY2tldCBzd2FwcyBpdCBmb3IgYSBzbG90LiBIaWRpbmcgYW55XG4gKiB0cmFpbGluZyBgWzxub24td2hpdGVzcGFjZS1ub24tYnJhY2tldD4uLi5gIHN1ZmZpeCBrZWVwcyB0aGUgcHJvc2VcbiAqIHN0YWJsZSB1bnRpbCBlaXRoZXIgYSBgXWAgKGZ1bGwgbWFya2VyKSBvciB3aGl0ZXNwYWNlIChkZWZpbml0ZWx5XG4gKiBub3QgYSBtYXJrZXIpIGxhbmRzLiBQZXJzaXN0ZWQgdHJhbnNjcmlwdHMgbmV2ZXIgZW5kIG1pZC1tYXJrZXIsXG4gKiBzbyB0aGlzIGlzIGEgbm8tb3Agb24gcmVsb2FkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBJbmNvbXBsZXRlTWFya2VyVGFpbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXFtbXlxcc1tcXF1dKiQvLCBcIlwiKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-request model-override wire convention shared by the Mastra
|
|
3
|
+
* plugin server (`@dbx-tools/appkit-mastra`'s `extractModelOverride`)
|
|
4
|
+
* and the browser chat client (`@dbx-tools/appkit-mastra-ui`). Kept
|
|
5
|
+
* here so the header / query / body field names can never drift
|
|
6
|
+
* between the side that sets them and the side that reads them.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
/** HTTP header inspected for a per-request model override. */
|
|
11
|
+
export declare const MODEL_OVERRIDE_HEADER = "x-mastra-model";
|
|
12
|
+
/** Query string parameter inspected for a per-request model override. */
|
|
13
|
+
export declare const MODEL_OVERRIDE_QUERY = "model";
|
|
14
|
+
/** Body fields (in priority order) inspected for a per-request model override. */
|
|
15
|
+
export declare const MODEL_OVERRIDE_BODY_FIELDS: readonly ["model", "modelId"];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-request model-override wire convention shared by the Mastra
|
|
3
|
+
* plugin server (`@dbx-tools/appkit-mastra`'s `extractModelOverride`)
|
|
4
|
+
* and the browser chat client (`@dbx-tools/appkit-mastra-ui`). Kept
|
|
5
|
+
* here so the header / query / body field names can never drift
|
|
6
|
+
* between the side that sets them and the side that reads them.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
/** HTTP header inspected for a per-request model override. */
|
|
11
|
+
export const MODEL_OVERRIDE_HEADER = "x-mastra-model";
|
|
12
|
+
/** Query string parameter inspected for a per-request model override. */
|
|
13
|
+
export const MODEL_OVERRIDE_QUERY = "model";
|
|
14
|
+
/** Body fields (in priority order) inspected for a per-request model override. */
|
|
15
|
+
export const MODEL_OVERRIDE_BODY_FIELDS = ["model", "modelId"];
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcnJpZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3ZlcnJpZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsZ0JBQWdCLENBQUM7QUFFdEQseUVBQXlFO0FBQ3pFLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztBQUU1QyxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBlci1yZXF1ZXN0IG1vZGVsLW92ZXJyaWRlIHdpcmUgY29udmVudGlvbiBzaGFyZWQgYnkgdGhlIE1hc3RyYVxuICogcGx1Z2luIHNlcnZlciAoYEBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYWAncyBgZXh0cmFjdE1vZGVsT3ZlcnJpZGVgKVxuICogYW5kIHRoZSBicm93c2VyIGNoYXQgY2xpZW50IChgQGRieC10b29scy9hcHBraXQtbWFzdHJhLXVpYCkuIEtlcHRcbiAqIGhlcmUgc28gdGhlIGhlYWRlciAvIHF1ZXJ5IC8gYm9keSBmaWVsZCBuYW1lcyBjYW4gbmV2ZXIgZHJpZnRcbiAqIGJldHdlZW4gdGhlIHNpZGUgdGhhdCBzZXRzIHRoZW0gYW5kIHRoZSBzaWRlIHRoYXQgcmVhZHMgdGhlbS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLyoqIEhUVFAgaGVhZGVyIGluc3BlY3RlZCBmb3IgYSBwZXItcmVxdWVzdCBtb2RlbCBvdmVycmlkZS4gKi9cbmV4cG9ydCBjb25zdCBNT0RFTF9PVkVSUklERV9IRUFERVIgPSBcIngtbWFzdHJhLW1vZGVsXCI7XG5cbi8qKiBRdWVyeSBzdHJpbmcgcGFyYW1ldGVyIGluc3BlY3RlZCBmb3IgYSBwZXItcmVxdWVzdCBtb2RlbCBvdmVycmlkZS4gKi9cbmV4cG9ydCBjb25zdCBNT0RFTF9PVkVSUklERV9RVUVSWSA9IFwibW9kZWxcIjtcblxuLyoqIEJvZHkgZmllbGRzIChpbiBwcmlvcml0eSBvcmRlcikgaW5zcGVjdGVkIGZvciBhIHBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlLiAqL1xuZXhwb3J0IGNvbnN0IE1PREVMX09WRVJSSURFX0JPRFlfRklFTERTID0gW1wibW9kZWxcIiwgXCJtb2RlbElkXCJdIGFzIGNvbnN0O1xuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route segments the Mastra plugin mounts under its `basePath`
|
|
3
|
+
* (`/api/<plugin-name>`). Shared between the server's route
|
|
4
|
+
* registration and the browser client (`MastraPluginClient` in
|
|
5
|
+
* `@dbx-tools/appkit-mastra-ui`) so a relayout - or a rename of a
|
|
6
|
+
* sub-path - is a one-line change here and the two can never drift.
|
|
7
|
+
*
|
|
8
|
+
* The agent-scoped segments (`history`, `threads`, `suggestions`,
|
|
9
|
+
* `defaultModel`) take an optional `/:agentId` suffix; the default agent
|
|
10
|
+
* uses the bare segment. Conversation streaming itself rides the standard Mastra
|
|
11
|
+
* agent routes (`@mastra/client-js`'s `getAgent(id).stream()`), so
|
|
12
|
+
* there's no chat segment here.
|
|
13
|
+
*
|
|
14
|
+
* `feedback` is the plugin-owned POST endpoint the chat UI calls to
|
|
15
|
+
* log a thumbs / comment assessment against a turn's MLflow trace (see
|
|
16
|
+
* `feedback.ts`); it is not agent-scoped (a trace id identifies the
|
|
17
|
+
* turn on its own).
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
export declare const MASTRA_ROUTES: {
|
|
22
|
+
readonly history: "/route/history";
|
|
23
|
+
readonly threads: "/route/threads";
|
|
24
|
+
readonly feedback: "/route/feedback";
|
|
25
|
+
readonly suggestions: "/suggestions";
|
|
26
|
+
readonly models: "/models";
|
|
27
|
+
readonly defaultModel: "/default-model";
|
|
28
|
+
readonly embed: "/embed";
|
|
29
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route segments the Mastra plugin mounts under its `basePath`
|
|
3
|
+
* (`/api/<plugin-name>`). Shared between the server's route
|
|
4
|
+
* registration and the browser client (`MastraPluginClient` in
|
|
5
|
+
* `@dbx-tools/appkit-mastra-ui`) so a relayout - or a rename of a
|
|
6
|
+
* sub-path - is a one-line change here and the two can never drift.
|
|
7
|
+
*
|
|
8
|
+
* The agent-scoped segments (`history`, `threads`, `suggestions`,
|
|
9
|
+
* `defaultModel`) take an optional `/:agentId` suffix; the default agent
|
|
10
|
+
* uses the bare segment. Conversation streaming itself rides the standard Mastra
|
|
11
|
+
* agent routes (`@mastra/client-js`'s `getAgent(id).stream()`), so
|
|
12
|
+
* there's no chat segment here.
|
|
13
|
+
*
|
|
14
|
+
* `feedback` is the plugin-owned POST endpoint the chat UI calls to
|
|
15
|
+
* log a thumbs / comment assessment against a turn's MLflow trace (see
|
|
16
|
+
* `feedback.ts`); it is not agent-scoped (a trace id identifies the
|
|
17
|
+
* turn on its own).
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
export const MASTRA_ROUTES = {
|
|
22
|
+
history: "/route/history",
|
|
23
|
+
threads: "/route/threads",
|
|
24
|
+
feedback: "/route/feedback",
|
|
25
|
+
suggestions: "/suggestions",
|
|
26
|
+
models: "/models",
|
|
27
|
+
// The static serving-endpoint an agent falls back to when the client pins
|
|
28
|
+
// no model. Agent-scoped like `history`/`threads`/`suggestions` via an
|
|
29
|
+
// optional `/:agentId` suffix; the default agent uses the bare segment.
|
|
30
|
+
// Returns `{ agentId, model, displayName }` where `model` and `displayName`
|
|
31
|
+
// are null when the agent resolves its model dynamically at call time
|
|
32
|
+
// (nothing static to advertise). Lets the picker label its default option
|
|
33
|
+
// with the humanized model name.
|
|
34
|
+
defaultModel: "/default-model",
|
|
35
|
+
embed: "/embed",
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUMzQixPQUFPLEVBQUUsZ0JBQWdCO0lBQ3pCLE9BQU8sRUFBRSxnQkFBZ0I7SUFDekIsUUFBUSxFQUFFLGlCQUFpQjtJQUMzQixXQUFXLEVBQUUsY0FBYztJQUMzQixNQUFNLEVBQUUsU0FBUztJQUNqQiwwRUFBMEU7SUFDMUUsdUVBQXVFO0lBQ3ZFLHdFQUF3RTtJQUN4RSw0RUFBNEU7SUFDNUUsc0VBQXNFO0lBQ3RFLDBFQUEwRTtJQUMxRSxpQ0FBaUM7SUFDakMsWUFBWSxFQUFFLGdCQUFnQjtJQUM5QixLQUFLLEVBQUUsUUFBUTtDQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJvdXRlIHNlZ21lbnRzIHRoZSBNYXN0cmEgcGx1Z2luIG1vdW50cyB1bmRlciBpdHMgYGJhc2VQYXRoYFxuICogKGAvYXBpLzxwbHVnaW4tbmFtZT5gKS4gU2hhcmVkIGJldHdlZW4gdGhlIHNlcnZlcidzIHJvdXRlXG4gKiByZWdpc3RyYXRpb24gYW5kIHRoZSBicm93c2VyIGNsaWVudCAoYE1hc3RyYVBsdWdpbkNsaWVudGAgaW5cbiAqIGBAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEtdWlgKSBzbyBhIHJlbGF5b3V0IC0gb3IgYSByZW5hbWUgb2YgYVxuICogc3ViLXBhdGggLSBpcyBhIG9uZS1saW5lIGNoYW5nZSBoZXJlIGFuZCB0aGUgdHdvIGNhbiBuZXZlciBkcmlmdC5cbiAqXG4gKiBUaGUgYWdlbnQtc2NvcGVkIHNlZ21lbnRzIChgaGlzdG9yeWAsIGB0aHJlYWRzYCwgYHN1Z2dlc3Rpb25zYCxcbiAqIGBkZWZhdWx0TW9kZWxgKSB0YWtlIGFuIG9wdGlvbmFsIGAvOmFnZW50SWRgIHN1ZmZpeDsgdGhlIGRlZmF1bHQgYWdlbnRcbiAqIHVzZXMgdGhlIGJhcmUgc2VnbWVudC4gQ29udmVyc2F0aW9uIHN0cmVhbWluZyBpdHNlbGYgcmlkZXMgdGhlIHN0YW5kYXJkIE1hc3RyYVxuICogYWdlbnQgcm91dGVzIChgQG1hc3RyYS9jbGllbnQtanNgJ3MgYGdldEFnZW50KGlkKS5zdHJlYW0oKWApLCBzb1xuICogdGhlcmUncyBubyBjaGF0IHNlZ21lbnQgaGVyZS5cbiAqXG4gKiBgZmVlZGJhY2tgIGlzIHRoZSBwbHVnaW4tb3duZWQgUE9TVCBlbmRwb2ludCB0aGUgY2hhdCBVSSBjYWxscyB0b1xuICogbG9nIGEgdGh1bWJzIC8gY29tbWVudCBhc3Nlc3NtZW50IGFnYWluc3QgYSB0dXJuJ3MgTUxmbG93IHRyYWNlIChzZWVcbiAqIGBmZWVkYmFjay50c2ApOyBpdCBpcyBub3QgYWdlbnQtc2NvcGVkIChhIHRyYWNlIGlkIGlkZW50aWZpZXMgdGhlXG4gKiB0dXJuIG9uIGl0cyBvd24pLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9ST1VURVMgPSB7XG4gIGhpc3Rvcnk6IFwiL3JvdXRlL2hpc3RvcnlcIixcbiAgdGhyZWFkczogXCIvcm91dGUvdGhyZWFkc1wiLFxuICBmZWVkYmFjazogXCIvcm91dGUvZmVlZGJhY2tcIixcbiAgc3VnZ2VzdGlvbnM6IFwiL3N1Z2dlc3Rpb25zXCIsXG4gIG1vZGVsczogXCIvbW9kZWxzXCIsXG4gIC8vIFRoZSBzdGF0aWMgc2VydmluZy1lbmRwb2ludCBhbiBhZ2VudCBmYWxscyBiYWNrIHRvIHdoZW4gdGhlIGNsaWVudCBwaW5zXG4gIC8vIG5vIG1vZGVsLiBBZ2VudC1zY29wZWQgbGlrZSBgaGlzdG9yeWAvYHRocmVhZHNgL2BzdWdnZXN0aW9uc2AgdmlhIGFuXG4gIC8vIG9wdGlvbmFsIGAvOmFnZW50SWRgIHN1ZmZpeDsgdGhlIGRlZmF1bHQgYWdlbnQgdXNlcyB0aGUgYmFyZSBzZWdtZW50LlxuICAvLyBSZXR1cm5zIGB7IGFnZW50SWQsIG1vZGVsLCBkaXNwbGF5TmFtZSB9YCB3aGVyZSBgbW9kZWxgIGFuZCBgZGlzcGxheU5hbWVgXG4gIC8vIGFyZSBudWxsIHdoZW4gdGhlIGFnZW50IHJlc29sdmVzIGl0cyBtb2RlbCBkeW5hbWljYWxseSBhdCBjYWxsIHRpbWVcbiAgLy8gKG5vdGhpbmcgc3RhdGljIHRvIGFkdmVydGlzZSkuIExldHMgdGhlIHBpY2tlciBsYWJlbCBpdHMgZGVmYXVsdCBvcHRpb25cbiAgLy8gd2l0aCB0aGUgaHVtYW5pemVkIG1vZGVsIG5hbWUuXG4gIGRlZmF1bHRNb2RlbDogXCIvZGVmYXVsdC1tb2RlbFwiLFxuICBlbWJlZDogXCIvZW1iZWRcIixcbn0gYXMgY29uc3Q7XG4iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-request thread-selection wire convention shared by the Mastra
|
|
3
|
+
* plugin server (`@dbx-tools/appkit-mastra`'s thread-id resolver) and
|
|
4
|
+
* the browser chat client (`@dbx-tools/appkit-mastra-ui`).
|
|
5
|
+
*
|
|
6
|
+
* A chat client owns multiple conversations ("threads") for the same
|
|
7
|
+
* resource (the authenticated user). It names the thread a given
|
|
8
|
+
* request targets by stamping its id here; the server reads it back
|
|
9
|
+
* and pins `RequestContext`'s thread id to that value (falling back to
|
|
10
|
+
* the per-session cookie when absent). Keeping the header / query
|
|
11
|
+
* names in one place means the side that sets them and the side that
|
|
12
|
+
* reads them can never drift.
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
/** HTTP header inspected for the thread id a request targets. */
|
|
17
|
+
export declare const THREAD_ID_HEADER = "x-mastra-thread-id";
|
|
18
|
+
/** Query string parameter inspected for the thread id a request targets. */
|
|
19
|
+
export declare const THREAD_ID_QUERY = "threadId";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-request thread-selection wire convention shared by the Mastra
|
|
3
|
+
* plugin server (`@dbx-tools/appkit-mastra`'s thread-id resolver) and
|
|
4
|
+
* the browser chat client (`@dbx-tools/appkit-mastra-ui`).
|
|
5
|
+
*
|
|
6
|
+
* A chat client owns multiple conversations ("threads") for the same
|
|
7
|
+
* resource (the authenticated user). It names the thread a given
|
|
8
|
+
* request targets by stamping its id here; the server reads it back
|
|
9
|
+
* and pins `RequestContext`'s thread id to that value (falling back to
|
|
10
|
+
* the per-session cookie when absent). Keeping the header / query
|
|
11
|
+
* names in one place means the side that sets them and the side that
|
|
12
|
+
* reads them can never drift.
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
/** HTTP header inspected for the thread id a request targets. */
|
|
17
|
+
export const THREAD_ID_HEADER = "x-mastra-thread-id";
|
|
18
|
+
/** Query string parameter inspected for the thread id a request targets. */
|
|
19
|
+
export const THREAD_ID_QUERY = "threadId";
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RocmVhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxvQkFBb0IsQ0FBQztBQUVyRCw0RUFBNEU7QUFDNUUsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGVyLXJlcXVlc3QgdGhyZWFkLXNlbGVjdGlvbiB3aXJlIGNvbnZlbnRpb24gc2hhcmVkIGJ5IHRoZSBNYXN0cmFcbiAqIHBsdWdpbiBzZXJ2ZXIgKGBAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFgJ3MgdGhyZWFkLWlkIHJlc29sdmVyKSBhbmRcbiAqIHRoZSBicm93c2VyIGNoYXQgY2xpZW50IChgQGRieC10b29scy9hcHBraXQtbWFzdHJhLXVpYCkuXG4gKlxuICogQSBjaGF0IGNsaWVudCBvd25zIG11bHRpcGxlIGNvbnZlcnNhdGlvbnMgKFwidGhyZWFkc1wiKSBmb3IgdGhlIHNhbWVcbiAqIHJlc291cmNlICh0aGUgYXV0aGVudGljYXRlZCB1c2VyKS4gSXQgbmFtZXMgdGhlIHRocmVhZCBhIGdpdmVuXG4gKiByZXF1ZXN0IHRhcmdldHMgYnkgc3RhbXBpbmcgaXRzIGlkIGhlcmU7IHRoZSBzZXJ2ZXIgcmVhZHMgaXQgYmFja1xuICogYW5kIHBpbnMgYFJlcXVlc3RDb250ZXh0YCdzIHRocmVhZCBpZCB0byB0aGF0IHZhbHVlIChmYWxsaW5nIGJhY2sgdG9cbiAqIHRoZSBwZXItc2Vzc2lvbiBjb29raWUgd2hlbiBhYnNlbnQpLiBLZWVwaW5nIHRoZSBoZWFkZXIgLyBxdWVyeVxuICogbmFtZXMgaW4gb25lIHBsYWNlIG1lYW5zIHRoZSBzaWRlIHRoYXQgc2V0cyB0aGVtIGFuZCB0aGUgc2lkZSB0aGF0XG4gKiByZWFkcyB0aGVtIGNhbiBuZXZlciBkcmlmdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLyoqIEhUVFAgaGVhZGVyIGluc3BlY3RlZCBmb3IgdGhlIHRocmVhZCBpZCBhIHJlcXVlc3QgdGFyZ2V0cy4gKi9cbmV4cG9ydCBjb25zdCBUSFJFQURfSURfSEVBREVSID0gXCJ4LW1hc3RyYS10aHJlYWQtaWRcIjtcblxuLyoqIFF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXIgaW5zcGVjdGVkIGZvciB0aGUgdGhyZWFkIGlkIGEgcmVxdWVzdCB0YXJnZXRzLiAqL1xuZXhwb3J0IGNvbnN0IFRIUkVBRF9JRF9RVUVSWSA9IFwidGhyZWFkSWRcIjtcbiJdfQ==
|