@dbx-tools/shared-mastra 0.3.44 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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==