@mastra/server 1.58.0-alpha.1 → 1.58.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/dist/_types/@mastra_schema-compat/dist/provider-compats/anthropic.d.ts +1 -1
  3. package/dist/{a2a-CnU9zaGR.js → a2a-8C4O2dVJ.js} +41 -5
  4. package/dist/a2a-8C4O2dVJ.js.map +1 -0
  5. package/dist/{a2a-D3ZYeXIx.cjs → a2a-B6YkZ2i9.cjs} +277 -52
  6. package/dist/a2a-B6YkZ2i9.cjs.map +1 -0
  7. package/dist/{a2a-oM7aqLz4.cjs → a2a-MPoM5lzS.cjs} +41 -5
  8. package/dist/a2a-MPoM5lzS.cjs.map +1 -0
  9. package/dist/{a2a-CHi9AJ0n.js → a2a-_D2EA4oa.js} +266 -53
  10. package/dist/a2a-_D2EA4oa.js.map +1 -0
  11. package/dist/{agent-builder-BDYN3r89.cjs → agent-builder-DAiJH1u2.cjs} +2 -2
  12. package/dist/{agent-builder-BDYN3r89.cjs.map → agent-builder-DAiJH1u2.cjs.map} +1 -1
  13. package/dist/{agent-builder-Dqy_qumV.js → agent-builder-gGFywDVq.js} +2 -2
  14. package/dist/{agent-builder-Dqy_qumV.js.map → agent-builder-gGFywDVq.js.map} +1 -1
  15. package/dist/{api-schema-manifest-J5hfk5ZZ.cjs → api-schema-manifest-B3bC-D98.cjs} +2 -2
  16. package/dist/{api-schema-manifest-J5hfk5ZZ.cjs.map → api-schema-manifest-B3bC-D98.cjs.map} +1 -1
  17. package/dist/{api-schema-manifest-R8CsF6RX.js → api-schema-manifest-B4J_QYOr.js} +2 -2
  18. package/dist/{api-schema-manifest-R8CsF6RX.js.map → api-schema-manifest-B4J_QYOr.js.map} +1 -1
  19. package/dist/{dist-IUXZtNBY.js → dist-BKRMiJcn.js} +102 -49
  20. package/dist/dist-BKRMiJcn.js.map +1 -0
  21. package/dist/{dist-DgY0llRv.cjs → dist-C2-SedDQ.cjs} +102 -49
  22. package/dist/dist-C2-SedDQ.cjs.map +1 -0
  23. package/dist/docs/SKILL.md +1 -1
  24. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  25. package/dist/docs/references/docs-agents-a2a.md +39 -0
  26. package/dist/docs/references/reference-server-routes.md +25 -11
  27. package/dist/route-builder-CIk5k35M.js.map +1 -1
  28. package/dist/route-builder-CgLVYL1c.cjs.map +1 -1
  29. package/dist/{routes-BzR8iVj4.cjs → routes-CZwPlO3-.cjs} +3 -2
  30. package/dist/routes-CZwPlO3-.cjs.map +1 -0
  31. package/dist/{routes-C7iRCN_l.js → routes-HUaCyUb7.js} +4 -3
  32. package/dist/{routes-C7iRCN_l.js.map → routes-HUaCyUb7.js.map} +1 -1
  33. package/dist/server/a2a/store.cjs +4 -0
  34. package/dist/server/a2a/store.cjs.map +1 -1
  35. package/dist/server/a2a/store.d.ts +3 -0
  36. package/dist/server/a2a/store.d.ts.map +1 -1
  37. package/dist/server/a2a/store.js +4 -0
  38. package/dist/server/a2a/store.js.map +1 -1
  39. package/dist/server/handlers/a2a.cjs +3 -1
  40. package/dist/server/handlers/a2a.d.ts +152 -10
  41. package/dist/server/handlers/a2a.d.ts.map +1 -1
  42. package/dist/server/handlers/a2a.js +2 -2
  43. package/dist/server/handlers/agent-builder.cjs +3 -3
  44. package/dist/server/handlers/agent-builder.js +3 -3
  45. package/dist/server/handlers/agent-controller.cjs +25 -6
  46. package/dist/server/handlers/agent-controller.cjs.map +1 -1
  47. package/dist/server/handlers/agent-controller.d.ts +4 -3
  48. package/dist/server/handlers/agent-controller.d.ts.map +1 -1
  49. package/dist/server/handlers/agent-controller.js +25 -6
  50. package/dist/server/handlers/agent-controller.js.map +1 -1
  51. package/dist/server/handlers/mcp-client-versions.cjs +1 -1
  52. package/dist/server/handlers/mcp-client-versions.js +1 -1
  53. package/dist/server/handlers/prompt-block-versions.cjs +1 -1
  54. package/dist/server/handlers/prompt-block-versions.js +1 -1
  55. package/dist/server/handlers/scorer-versions.cjs +1 -1
  56. package/dist/server/handlers/scorer-versions.js +1 -1
  57. package/dist/server/handlers/stored-mcp-clients.cjs +1 -1
  58. package/dist/server/handlers/stored-mcp-clients.js +1 -1
  59. package/dist/server/handlers/stored-prompt-blocks.cjs +1 -1
  60. package/dist/server/handlers/stored-prompt-blocks.js +1 -1
  61. package/dist/server/handlers/stored-scorers.cjs +1 -1
  62. package/dist/server/handlers/stored-scorers.js +1 -1
  63. package/dist/server/handlers/stored-skill-favorites.cjs +1 -1
  64. package/dist/server/handlers/stored-skill-favorites.js +1 -1
  65. package/dist/server/handlers/stored-skills.cjs +1 -1
  66. package/dist/server/handlers/stored-skills.js +1 -1
  67. package/dist/server/handlers/system.cjs +1 -1
  68. package/dist/server/handlers/system.js +1 -1
  69. package/dist/server/handlers/workflows.cjs +93 -2
  70. package/dist/server/handlers/workflows.cjs.map +1 -1
  71. package/dist/server/handlers/workflows.d.ts +9 -0
  72. package/dist/server/handlers/workflows.d.ts.map +1 -1
  73. package/dist/server/handlers/workflows.js +92 -3
  74. package/dist/server/handlers/workflows.js.map +1 -1
  75. package/dist/server/handlers.cjs +1 -1
  76. package/dist/server/handlers.js +1 -1
  77. package/dist/server/schemas/a2a.d.ts +70 -6
  78. package/dist/server/schemas/a2a.d.ts.map +1 -1
  79. package/dist/server/schemas/index.cjs +4 -4
  80. package/dist/server/schemas/index.js +4 -4
  81. package/dist/server/schemas/workflows.d.ts +8 -0
  82. package/dist/server/schemas/workflows.d.ts.map +1 -1
  83. package/dist/server/server-adapter/index.cjs +42 -1
  84. package/dist/server/server-adapter/index.cjs.map +1 -1
  85. package/dist/server/server-adapter/index.d.ts +37 -0
  86. package/dist/server/server-adapter/index.d.ts.map +1 -1
  87. package/dist/server/server-adapter/index.js +43 -3
  88. package/dist/server/server-adapter/index.js.map +1 -1
  89. package/dist/server/server-adapter/routes/a2a.d.ts +116 -8
  90. package/dist/server/server-adapter/routes/a2a.d.ts.map +1 -1
  91. package/dist/server/server-adapter/routes/workflows.d.ts +7 -1
  92. package/dist/server/server-adapter/routes/workflows.d.ts.map +1 -1
  93. package/dist/{workflows-DPW6FrY0.js → workflows-CMU5dz_4.js} +7 -2
  94. package/dist/workflows-CMU5dz_4.js.map +1 -0
  95. package/dist/{workflows-XfiENvkF.cjs → workflows-Dzxr6cmf.cjs} +12 -1
  96. package/dist/workflows-Dzxr6cmf.cjs.map +1 -0
  97. package/package.json +6 -6
  98. package/dist/a2a-CHi9AJ0n.js.map +0 -1
  99. package/dist/a2a-CnU9zaGR.js.map +0 -1
  100. package/dist/a2a-D3ZYeXIx.cjs.map +0 -1
  101. package/dist/a2a-oM7aqLz4.cjs.map +0 -1
  102. package/dist/dist-DgY0llRv.cjs.map +0 -1
  103. package/dist/dist-IUXZtNBY.js.map +0 -1
  104. package/dist/routes-BzR8iVj4.cjs.map +0 -1
  105. package/dist/workflows-DPW6FrY0.js.map +0 -1
  106. package/dist/workflows-XfiENvkF.cjs.map +0 -1
@@ -3,10 +3,10 @@ const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
3
3
  const require_route_builder = require("../../route-builder-CgLVYL1c.cjs");
4
4
  const require_utils = require("../../utils-wESuBh27.cjs");
5
5
  const require_server_handlers_error = require("./error.cjs");
6
- const require_stored_skills = require("../../stored-skills-CgwoCNNV.cjs");
7
6
  const require_server_handlers_authorship = require("./authorship.cjs");
8
7
  const require_editor_builder = require("../../editor-builder-BW4nlDcX.cjs");
9
8
  const require_favorites = require("../../favorites-D1-AzGsK.cjs");
9
+ const require_stored_skills = require("../../stored-skills-CgwoCNNV.cjs");
10
10
  //#region src/server/handlers/stored-skill-favorites.ts
11
11
  /**
12
12
  * Resolves the storage and favorites domains, throwing 500 if unavailable.
@@ -2,10 +2,10 @@ import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
2
2
  import { n as createRoute } from "../../route-builder-CIk5k35M.js";
3
3
  import { i as getStoredResourceScope, n as assertStoredResourceScope } from "../../utils-BUK03Frl.js";
4
4
  import { handleError } from "./error.js";
5
- import { p as storedSkillIdPathParams } from "../../stored-skills-B_aAMn5W.js";
6
5
  import { assertReadAccess, getCallerAuthorId } from "./authorship.js";
7
6
  import { a as requireBuilderFeature } from "../../editor-builder-Ct2nIbum.js";
8
7
  import { t as favoriteToggleResponseSchema } from "../../favorites-DWDyKxts.js";
8
+ import { p as storedSkillIdPathParams } from "../../stored-skills-B_aAMn5W.js";
9
9
  //#region src/server/handlers/stored-skill-favorites.ts
10
10
  /**
11
11
  * Resolves the storage and favorites domains, throwing 500 if unavailable.
@@ -3,10 +3,10 @@ const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
3
3
  const require_route_builder = require("../../route-builder-CgLVYL1c.cjs");
4
4
  const require_utils = require("../../utils-wESuBh27.cjs");
5
5
  const require_server_handlers_error = require("./error.cjs");
6
- const require_stored_skills = require("../../stored-skills-CgwoCNNV.cjs");
7
6
  const require_server_handlers_authorship = require("./authorship.cjs");
8
7
  const require_editor_builder = require("../../editor-builder-BW4nlDcX.cjs");
9
8
  const require_server_handlers_favorites_enrichment = require("./favorites-enrichment.cjs");
9
+ const require_stored_skills = require("../../stored-skills-CgwoCNNV.cjs");
10
10
  let _mastra_core_workspace = require("@mastra/core/workspace");
11
11
  //#region src/server/handlers/stored-skills.ts
12
12
  /**
@@ -2,10 +2,10 @@ import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
2
2
  import { n as createRoute } from "../../route-builder-CIk5k35M.js";
3
3
  import { c as toSlug, i as getStoredResourceScope, n as assertStoredResourceScope, s as scopeStoredResourceMetadata } from "../../utils-BUK03Frl.js";
4
4
  import { handleError } from "./error.js";
5
- import { a as deleteStoredSkillResponseSchema, c as listStoredSkillsResponseSchema, g as updateStoredSkillResponseSchema, h as updateStoredSkillBodySchema, i as createStoredSkillResponseSchema, l as publishStoredSkillBodySchema, o as getStoredSkillResponseSchema, p as storedSkillIdPathParams, r as createStoredSkillBodySchema, s as listStoredSkillsQuerySchema, u as publishStoredSkillResponseSchema } from "../../stored-skills-B_aAMn5W.js";
6
5
  import { assertReadAccess, assertWriteAccess, getCallerAuthorId, matchesAuthorFilter, resolveAuthorFilter } from "./authorship.js";
7
6
  import { i as isBuilderFeatureEnabled } from "../../editor-builder-Ct2nIbum.js";
8
7
  import { enrichOrStripFavorites, prepareFavoritesEnrichment, stripFavoriteFields } from "./favorites-enrichment.js";
8
+ import { a as deleteStoredSkillResponseSchema, c as listStoredSkillsResponseSchema, g as updateStoredSkillResponseSchema, h as updateStoredSkillBodySchema, i as createStoredSkillResponseSchema, l as publishStoredSkillBodySchema, o as getStoredSkillResponseSchema, p as storedSkillIdPathParams, r as createStoredSkillBodySchema, s as listStoredSkillsQuerySchema, u as publishStoredSkillResponseSchema } from "../../stored-skills-B_aAMn5W.js";
9
9
  import { LocalSkillSource } from "@mastra/core/workspace";
10
10
  //#region src/server/handlers/stored-skills.ts
11
11
  /**
@@ -86,7 +86,7 @@ const GET_API_SCHEMA_ROUTE = require_route_builder.createRoute({
86
86
  tags: ["System"],
87
87
  requiresAuth: true,
88
88
  handler: async () => {
89
- const { buildApiSchemaManifest } = await Promise.resolve().then(() => require("../../api-schema-manifest-J5hfk5ZZ.cjs"));
89
+ const { buildApiSchemaManifest } = await Promise.resolve().then(() => require("../../api-schema-manifest-B3bC-D98.cjs"));
90
90
  return buildApiSchemaManifest();
91
91
  }
92
92
  });
@@ -85,7 +85,7 @@ const GET_API_SCHEMA_ROUTE = createRoute({
85
85
  tags: ["System"],
86
86
  requiresAuth: true,
87
87
  handler: async () => {
88
- const { buildApiSchemaManifest } = await import("../../api-schema-manifest-R8CsF6RX.js");
88
+ const { buildApiSchemaManifest } = await import("../../api-schema-manifest-B4J_QYOr.js");
89
89
  return buildApiSchemaManifest();
90
90
  }
91
91
  });
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_rolldown_runtime = require("../../rolldown-runtime-CVvi-lCc.cjs");
3
3
  const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
4
4
  const require_common = require("../../common-spbwhiWS.cjs");
5
- const require_workflows = require("../../workflows-XfiENvkF.cjs");
5
+ const require_workflows = require("../../workflows-Dzxr6cmf.cjs");
6
6
  const require_agents = require("../../agents-Dk2qoJi_.cjs");
7
7
  const require_route_builder = require("../../route-builder-CgLVYL1c.cjs");
8
8
  const require_utils = require("../../utils-wESuBh27.cjs");
@@ -20,6 +20,7 @@ var workflows_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
20
20
  GET_WORKFLOW_RUN_BY_ID_ROUTE: () => GET_WORKFLOW_RUN_BY_ID_ROUTE,
21
21
  LIST_WORKFLOWS_ROUTE: () => LIST_WORKFLOWS_ROUTE,
22
22
  LIST_WORKFLOW_RUNS_ROUTE: () => LIST_WORKFLOW_RUNS_ROUTE,
23
+ LIST_WORKFLOW_RUN_COUNTS_ROUTE: () => LIST_WORKFLOW_RUN_COUNTS_ROUTE,
23
24
  OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE: () => OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE,
24
25
  OBSERVE_STREAM_WORKFLOW_ROUTE: () => OBSERVE_STREAM_WORKFLOW_ROUTE,
25
26
  RECEIVE_WORKFLOW_EVENT_ROUTE: () => RECEIVE_WORKFLOW_EVENT_ROUTE,
@@ -37,7 +38,8 @@ var workflows_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
37
38
  STREAM_WORKFLOW_ROUTE: () => STREAM_WORKFLOW_ROUTE,
38
39
  TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE: () => TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE,
39
40
  TIME_TRAVEL_STREAM_WORKFLOW_ROUTE: () => TIME_TRAVEL_STREAM_WORKFLOW_ROUTE,
40
- TIME_TRAVEL_WORKFLOW_ROUTE: () => TIME_TRAVEL_WORKFLOW_ROUTE
41
+ TIME_TRAVEL_WORKFLOW_ROUTE: () => TIME_TRAVEL_WORKFLOW_ROUTE,
42
+ __setWorkflowRunCountsNow: () => __setWorkflowRunCountsNow
41
43
  });
42
44
  /**
43
45
  * Statuses a run cannot come back from. Streaming one of these runIds again would
@@ -113,6 +115,81 @@ const LIST_WORKFLOWS_ROUTE = require_route_builder.createRoute({
113
115
  }
114
116
  })
115
117
  });
118
+ const RUN_COUNTS_CACHE_TTL_MS = 5e3;
119
+ const runCountsCache = /* @__PURE__ */ new WeakMap();
120
+ let runCountsNow = () => Date.now();
121
+ /** Test seam — lets TTL expiry be tested without wall-clock waits. */
122
+ function __setWorkflowRunCountsNow(now) {
123
+ runCountsNow = now ?? (() => Date.now());
124
+ }
125
+ const LIST_WORKFLOW_RUN_COUNTS_ROUTE = require_route_builder.createRoute({
126
+ method: "GET",
127
+ path: "/workflows/run-counts",
128
+ responseType: "json",
129
+ responseSchema: require_workflows.workflowRunCountsResponseSchema,
130
+ summary: "List workflow run counts",
131
+ description: "Returns per-workflow counts of currently running and suspended (awaiting resume) runs, keyed by the workflow registry key used in the Mastra config",
132
+ tags: ["Workflows"],
133
+ requiresAuth: true,
134
+ handler: (async ({ mastra, requestContext }) => {
135
+ try {
136
+ const fgaProvider = mastra.getServer?.()?.fga;
137
+ const user = requestContext?.get("user");
138
+ if (fgaProvider && !user) return {};
139
+ const workflows = mastra.listWorkflows({ serialized: false });
140
+ const counts = {};
141
+ const workflowIdToRegistryKey = /* @__PURE__ */ new Map();
142
+ for (const [registryKey, workflow] of Object.entries(workflows)) {
143
+ counts[registryKey] = {
144
+ running: 0,
145
+ suspended: 0
146
+ };
147
+ workflowIdToRegistryKey.set(workflow.id, registryKey);
148
+ }
149
+ const effectiveResourceId = require_utils$1.getEffectiveResourceId(requestContext, void 0);
150
+ const cacheable = !fgaProvider && !effectiveResourceId;
151
+ if (cacheable) {
152
+ const cached = runCountsCache.get(mastra);
153
+ if (cached && runCountsNow() - cached.at < RUN_COUNTS_CACHE_TTL_MS) return cached.value;
154
+ }
155
+ const storage = mastra.getStorage();
156
+ const workflowsStore = storage ? await storage.getStore("workflows") : void 0;
157
+ if (workflowsStore) {
158
+ const [running, suspended] = await Promise.all([workflowsStore.listWorkflowRuns({
159
+ status: "running",
160
+ resourceId: effectiveResourceId
161
+ }), workflowsStore.listWorkflowRuns({
162
+ status: "suspended",
163
+ resourceId: effectiveResourceId
164
+ })]);
165
+ for (const run of running.runs) {
166
+ const registryKey = workflowIdToRegistryKey.get(run.workflowName);
167
+ const entry = registryKey ? counts[registryKey] : void 0;
168
+ if (entry) entry.running++;
169
+ }
170
+ for (const run of suspended.runs) {
171
+ const registryKey = workflowIdToRegistryKey.get(run.workflowName);
172
+ const entry = registryKey ? counts[registryKey] : void 0;
173
+ if (entry) entry.suspended++;
174
+ }
175
+ }
176
+ if (fgaProvider) {
177
+ const workflowList = Object.keys(counts).map((id) => ({ id }));
178
+ const accessible = await fgaProvider.filterAccessible(user, workflowList, "workflow", require_utils$1.MastraFGAPermissions.WORKFLOWS_READ);
179
+ const accessibleSet = new Set(accessible.map((w) => w.id));
180
+ for (const id of Object.keys(counts)) if (!accessibleSet.has(id)) delete counts[id];
181
+ return counts;
182
+ }
183
+ if (cacheable) runCountsCache.set(mastra, {
184
+ at: runCountsNow(),
185
+ value: counts
186
+ });
187
+ return counts;
188
+ } catch (error) {
189
+ return require_server_handlers_error.handleError(error, "Error getting workflow run counts");
190
+ }
191
+ })
192
+ });
116
193
  const GET_WORKFLOW_BY_ID_ROUTE = require_route_builder.createRoute({
117
194
  method: "GET",
118
195
  path: "/workflows/:workflowId",
@@ -597,6 +674,12 @@ const RESUME_WORKFLOW_ROUTE = require_route_builder.createRoute({
597
674
  })).resume({
598
675
  ...params,
599
676
  requestContext
677
+ }).catch((error) => {
678
+ mastra.getLogger().error("Failed to resume workflow run", {
679
+ error,
680
+ workflowId,
681
+ runId
682
+ });
600
683
  });
601
684
  return { message: "Workflow run resumed" };
602
685
  } catch (error) {
@@ -808,6 +891,12 @@ const TIME_TRAVEL_WORKFLOW_ROUTE = require_route_builder.createRoute({
808
891
  })).timeTravel({
809
892
  ...params,
810
893
  requestContext
894
+ }).catch((error) => {
895
+ mastra.getLogger().error("Failed to time travel workflow run", {
896
+ error,
897
+ workflowId,
898
+ runId
899
+ });
811
900
  });
812
901
  return { message: "Workflow run time travel started" };
813
902
  } catch (error) {
@@ -1099,6 +1188,7 @@ exports.GET_WORKFLOW_BY_ID_ROUTE = GET_WORKFLOW_BY_ID_ROUTE;
1099
1188
  exports.GET_WORKFLOW_RUN_BY_ID_ROUTE = GET_WORKFLOW_RUN_BY_ID_ROUTE;
1100
1189
  exports.LIST_WORKFLOWS_ROUTE = LIST_WORKFLOWS_ROUTE;
1101
1190
  exports.LIST_WORKFLOW_RUNS_ROUTE = LIST_WORKFLOW_RUNS_ROUTE;
1191
+ exports.LIST_WORKFLOW_RUN_COUNTS_ROUTE = LIST_WORKFLOW_RUN_COUNTS_ROUTE;
1102
1192
  exports.OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE = OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE;
1103
1193
  exports.OBSERVE_STREAM_WORKFLOW_ROUTE = OBSERVE_STREAM_WORKFLOW_ROUTE;
1104
1194
  exports.RECEIVE_WORKFLOW_EVENT_ROUTE = RECEIVE_WORKFLOW_EVENT_ROUTE;
@@ -1117,6 +1207,7 @@ exports.STREAM_WORKFLOW_ROUTE = STREAM_WORKFLOW_ROUTE;
1117
1207
  exports.TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE = TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE;
1118
1208
  exports.TIME_TRAVEL_STREAM_WORKFLOW_ROUTE = TIME_TRAVEL_STREAM_WORKFLOW_ROUTE;
1119
1209
  exports.TIME_TRAVEL_WORKFLOW_ROUTE = TIME_TRAVEL_WORKFLOW_ROUTE;
1210
+ exports.__setWorkflowRunCountsNow = __setWorkflowRunCountsNow;
1120
1211
  Object.defineProperty(exports, "workflows_exports", {
1121
1212
  enumerable: true,
1122
1213
  get: function() {