@mastra/code-sdk 1.9.0-alpha.9 → 1.10.0-alpha.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.
Files changed (97) hide show
  1. package/README.md +23 -0
  2. package/dist/agent-connections/tools.d.ts.map +1 -1
  3. package/dist/agent-connections/tools.js +5 -5
  4. package/dist/agent-connections/tools.js.map +1 -1
  5. package/dist/agents/tools.d.ts +1 -1
  6. package/dist/agents/tools.d.ts.map +1 -1
  7. package/dist/agents/tools.js +2 -1
  8. package/dist/agents/tools.js.map +1 -1
  9. package/dist/analytics.d.ts.map +1 -1
  10. package/dist/analytics.js +2 -3
  11. package/dist/analytics.js.map +1 -1
  12. package/dist/auth/account-rotation-processor.d.ts.map +1 -1
  13. package/dist/auth/account-rotation-processor.js +17 -10
  14. package/dist/auth/account-rotation-processor.js.map +1 -1
  15. package/dist/auth/providers/kimi-coding.d.ts.map +1 -1
  16. package/dist/auth/providers/kimi-coding.js +1 -2
  17. package/dist/auth/providers/kimi-coding.js.map +1 -1
  18. package/dist/auth/providers/openai-codex.d.ts +1 -1
  19. package/dist/auth/providers/openai-codex.d.ts.map +1 -1
  20. package/dist/auth/providers/openai-codex.js +7 -19
  21. package/dist/auth/providers/openai-codex.js.map +1 -1
  22. package/dist/auth/storage.js +3 -3
  23. package/dist/auth/storage.js.map +1 -1
  24. package/dist/experimental-agent.d.ts +11 -0
  25. package/dist/experimental-agent.d.ts.map +1 -0
  26. package/dist/experimental-agent.js +36 -0
  27. package/dist/experimental-agent.js.map +1 -0
  28. package/dist/goal-manager.d.ts +39 -3
  29. package/dist/goal-manager.d.ts.map +1 -1
  30. package/dist/goal-manager.js +113 -31
  31. package/dist/goal-manager.js.map +1 -1
  32. package/dist/index.d.ts +12 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +95 -12
  35. package/dist/index.js.map +1 -1
  36. package/dist/knowledge-inspector.d.ts.map +1 -1
  37. package/dist/knowledge-inspector.js +1 -2
  38. package/dist/knowledge-inspector.js.map +1 -1
  39. package/dist/onboarding/settings.d.ts +11 -0
  40. package/dist/onboarding/settings.d.ts.map +1 -1
  41. package/dist/onboarding/settings.js +39 -5
  42. package/dist/onboarding/settings.js.map +1 -1
  43. package/dist/permissions.d.ts.map +1 -1
  44. package/dist/permissions.js +6 -1
  45. package/dist/permissions.js.map +1 -1
  46. package/dist/plugins/loader.d.ts.map +1 -1
  47. package/dist/plugins/loader.js +1 -2
  48. package/dist/plugins/loader.js.map +1 -1
  49. package/dist/process-memory-diagnostics.d.ts.map +1 -1
  50. package/dist/process-memory-diagnostics.js +2 -3
  51. package/dist/process-memory-diagnostics.js.map +1 -1
  52. package/dist/schedules/index.d.ts +10 -0
  53. package/dist/schedules/index.d.ts.map +1 -0
  54. package/dist/schedules/index.js +6 -0
  55. package/dist/schedules/interval.d.ts +49 -0
  56. package/dist/schedules/interval.d.ts.map +1 -0
  57. package/dist/schedules/interval.js +215 -0
  58. package/dist/schedules/interval.js.map +1 -0
  59. package/dist/schedules/prompt.d.ts +36 -0
  60. package/dist/schedules/prompt.d.ts.map +1 -0
  61. package/dist/schedules/prompt.js +39 -0
  62. package/dist/schedules/prompt.js.map +1 -0
  63. package/dist/schedules/run-script.d.ts +8 -0
  64. package/dist/schedules/run-script.d.ts.map +1 -0
  65. package/dist/schedules/run-script.js +83 -0
  66. package/dist/schedules/run-script.js.map +1 -0
  67. package/dist/schedules/scheduler.d.ts +101 -0
  68. package/dist/schedules/scheduler.d.ts.map +1 -0
  69. package/dist/schedules/scheduler.js +169 -0
  70. package/dist/schedules/scheduler.js.map +1 -0
  71. package/dist/schedules/tools.d.ts +57 -0
  72. package/dist/schedules/tools.d.ts.map +1 -0
  73. package/dist/schedules/tools.js +220 -0
  74. package/dist/schedules/tools.js.map +1 -0
  75. package/dist/tools/workflows/ephemeral-memory.d.ts +21 -0
  76. package/dist/tools/workflows/ephemeral-memory.d.ts.map +1 -1
  77. package/dist/tools/workflows/ephemeral-memory.js +1 -2
  78. package/dist/tools/workflows/ephemeral-memory.js.map +1 -1
  79. package/dist/utils/discarding-scores-storage.d.ts +33 -0
  80. package/dist/utils/discarding-scores-storage.d.ts.map +1 -0
  81. package/dist/utils/discarding-scores-storage.js +54 -0
  82. package/dist/utils/discarding-scores-storage.js.map +1 -0
  83. package/dist/utils/maintenance-lock.d.ts +42 -0
  84. package/dist/utils/maintenance-lock.d.ts.map +1 -0
  85. package/dist/utils/maintenance-lock.js +199 -0
  86. package/dist/utils/maintenance-lock.js.map +1 -0
  87. package/dist/utils/prune-cli.d.ts +24 -0
  88. package/dist/utils/prune-cli.d.ts.map +1 -0
  89. package/dist/utils/prune-cli.js +125 -0
  90. package/dist/utils/prune-cli.js.map +1 -0
  91. package/dist/utils/signals-pubsub.d.ts.map +1 -1
  92. package/dist/utils/signals-pubsub.js +1 -2
  93. package/dist/utils/signals-pubsub.js.map +1 -1
  94. package/dist/utils/storage-maintenance.d.ts.map +1 -1
  95. package/dist/utils/storage-maintenance.js +33 -3
  96. package/dist/utils/storage-maintenance.js.map +1 -1
  97. package/package.json +21 -15
package/dist/index.js CHANGED
@@ -5,6 +5,7 @@ import { AuthStorage } from "./auth/storage.js";
5
5
  import { setAuthStorage } from "./providers/openai-codex.js";
6
6
  import { getAvailableModePacks, getAvailableOmPacks, selectPreferredOMPack } from "./onboarding/packs.js";
7
7
  import { MASTRA_GATEWAY_PROVIDER, OBSERVABILITY_AUTH_PREFIX, THREAD_ACTIVE_MODEL_PACK_ID_KEY, loadSettings, resolveModelDefaults, resolveOmRoleModel, saveSettings } from "./onboarding/settings.js";
8
+ import { resolveExperimentalAgent, validateExperimentalAgent, wrapExperimentalAgent } from "./experimental-agent.js";
8
9
  import { createSessionThreadAdvertisement } from "./agent-connections/session-advertisement.js";
9
10
  import { AgentConnectionsSignalProvider } from "./agent-connections/signal-provider.js";
10
11
  import { createBackgroundCompletionEvents } from "./agents/background-completion-events.js";
@@ -43,9 +44,16 @@ import { getToolCategory } from "./permissions.js";
43
44
  import { PluginManager } from "./plugins/manager.js";
44
45
  import { PluginSignalLane } from "./plugins/signal-lane.js";
45
46
  import { PlanRejectionAbortProcessor } from "./processors/plan-rejection-abort.js";
47
+ import { assembleSchedulePrompt } from "./schedules/prompt.js";
48
+ import { ThreadScheduler, scheduleSignalAttributes, shortScheduleId } from "./schedules/scheduler.js";
49
+ import { runScript } from "./schedules/run-script.js";
50
+ import { createScheduleTools } from "./schedules/tools.js";
51
+ import "./schedules/index.js";
46
52
  import { stateSchema } from "./schema.js";
47
53
  import { mastraBrand } from "./theme-palette.js";
54
+ import { DiscardingScoresStorage } from "./utils/discarding-scores-storage.js";
48
55
  import { syncGateways } from "./utils/gateway-sync.js";
56
+ import { registerSessionAndWaitForMaintenance, unregisterSession } from "./utils/maintenance-lock.js";
49
57
  import { createSignalsPubSub } from "./utils/signals-pubsub.js";
50
58
  import { DEFAULT_RETENTION, createStorageMaintenance, resolveLocalDbFiles } from "./utils/storage-maintenance.js";
51
59
  import { createStorage, createVectorStore } from "./utils/storage-factory.js";
@@ -57,14 +65,16 @@ import { formatHuman, formatJsonl, renderJsonResult, renderTextResult } from "./
57
65
  import { hasHeadlessFlag, runMCCli } from "./headless/cli.js";
58
66
  import "./headless/index.js";
59
67
  import path from "path";
60
- import { hostname } from "os";
68
+ import { statSync } from "fs";
69
+ import { homedir, hostname } from "os";
61
70
  import { createHash } from "crypto";
71
+ import { readFile } from "fs/promises";
62
72
  import { AgentController } from "@mastra/core/agent-controller";
63
73
  import { createCodingAgent } from "@mastra/core/coding-agent";
64
- import { PROVIDER_REGISTRY } from "@mastra/core/llm";
74
+ import { PROVIDER_REGISTRY, findGatewayForModel, getGatewayId } from "@mastra/core/llm";
65
75
  import { Mastra } from "@mastra/core/mastra";
66
76
  import { defaultNotificationDeliveryDecision } from "@mastra/core/notifications";
67
- import { AgentsMDInjector, CyberRefusalHandler, PrefillErrorHandler, ProviderHistoryCompat, StreamErrorRetryProcessor, createBackgroundWorkSignalProcessor, isBadRequestError } from "@mastra/core/processors";
77
+ import { AgentsMDInjector, CyberRefusalHandler, ProviderHistoryCompat, StreamErrorRetryProcessor, createBackgroundWorkSignalProcessor, isBadRequestError } from "@mastra/core/processors";
68
78
  import { RequestContext } from "@mastra/core/request-context";
69
79
  import { TaskSignalProvider } from "@mastra/core/signals";
70
80
  import { InMemoryHarness, MastraCompositeStore } from "@mastra/core/storage";
@@ -217,6 +227,15 @@ function resolveInjectedStorageBackend(storage, configuredBackend) {
217
227
  if (storage instanceof PostgresStore || hasAncestorClassNamed(storage, "PostgresStore")) return "pg";
218
228
  throw new Error("storageBackend is required when injecting a custom storage instance.");
219
229
  }
230
+ /** Whether the model router would resolve `modelId` through a gateway outside `sdkGatewayIds`. */
231
+ function routesToOtherGateway(modelId, gateways, sdkGatewayIds) {
232
+ try {
233
+ return !sdkGatewayIds.has(getGatewayId(findGatewayForModel(modelId, gateways)));
234
+ } catch (error) {
235
+ if (error?.id === "MODEL_ROUTER_NO_GATEWAY_FOUND") return false;
236
+ throw error;
237
+ }
238
+ }
220
239
  async function createMastraCodeAgentController(config) {
221
240
  const cwd = config?.cwd ?? process.cwd();
222
241
  const homeDir = config?.homeDir ?? config?.initialState?.homeDir;
@@ -229,6 +248,7 @@ async function createMastraCodeAgentController(config) {
229
248
  } catch {}
230
249
  const authStorage = createAuthStorage();
231
250
  const globalSettings = loadSettings(config?.settingsPath);
251
+ const experimentalAgent = resolveExperimentalAgent(globalSettings);
232
252
  const backgroundToolsEnabled = globalSettings.backgroundTools?.enabled ?? false;
233
253
  const storedGatewayKey = authStorage.getStoredApiKey(MASTRA_GATEWAY_PROVIDER);
234
254
  const storedGatewayUrl = globalSettings.memoryGateway?.baseUrl;
@@ -276,12 +296,21 @@ async function createMastraCodeAgentController(config) {
276
296
  const crossProcessPubSub = config?.crossProcessPubSub ?? (!configuredPubSub && useUnixSocketPubSub);
277
297
  if (crossProcessPubSub && !signalsPubSub) throw new Error("crossProcessPubSub requires a pubsub instance");
278
298
  const useCrossAgentSignals = config?.crossAgentSignals ?? globalSettings.signals?.experimentalCrossAgentSignals ?? false;
299
+ const useScheduleTools = config?.scheduleTools ?? globalSettings.signals?.experimentalScheduleTools ?? false;
279
300
  const injectedStorage = isInjectedStorageInstance(config?.storage) ? config.storage : void 0;
280
301
  const storageConfig = injectedStorage ? void 0 : config?.storage ?? getStorageConfig(project.rootPath, globalSettings.storage, configDir);
281
- const storageResult = injectedStorage ? {
302
+ if (!injectedStorage) await registerSessionAndWaitForMaintenance({ onWait: (pid) => console.error(`Waiting for storage maintenance (mastracode prune${pid === -1 ? "" : `, PID ${pid}`}) to finish. Press Ctrl+C to give up.`) });
303
+ let storageResult;
304
+ if (injectedStorage) storageResult = {
282
305
  storage: injectedStorage,
283
306
  backend: resolveInjectedStorageBackend(injectedStorage, config?.storageBackend)
284
- } : await createStorage(storageConfig);
307
+ };
308
+ else try {
309
+ storageResult = await createStorage(storageConfig);
310
+ } catch (error) {
311
+ unregisterSession();
312
+ throw error;
313
+ }
285
314
  const storageWarning = storageResult.warning;
286
315
  let observabilityDomain;
287
316
  let observabilityWarning;
@@ -298,12 +327,14 @@ async function createMastraCodeAgentController(config) {
298
327
  else observabilityWarning = `Observability unavailable — DuckDB initialization failed: ${message}`;
299
328
  }
300
329
  const harnessStorage = new InMemoryHarness();
330
+ const scoresStorage = new DiscardingScoresStorage();
301
331
  const storage = new MastraCompositeStore({
302
332
  id: "mastra-code-storage",
303
333
  default: storageResult.storage,
304
334
  domains: {
305
335
  observability: observabilityDomain ?? false,
306
- harness: harnessStorage
336
+ harness: harnessStorage,
337
+ scores: scoresStorage
307
338
  }
308
339
  });
309
340
  const observability = new Observability({ configs: { default: {
@@ -471,6 +502,51 @@ async function createMastraCodeAgentController(config) {
471
502
  modelSettings: { temperature: 1 }
472
503
  };
473
504
  };
505
+ const threadScheduler = new ThreadScheduler({
506
+ assemblePrompt: (schedule) => assembleSchedulePrompt(schedule, {
507
+ cwd: project.rootPath,
508
+ runScript,
509
+ readFile: (absPath) => readFile(absPath, "utf8")
510
+ }),
511
+ deliver: async (schedule, assembled) => {
512
+ const target = {
513
+ resourceId: schedule.resourceId,
514
+ threadId: schedule.threadId
515
+ };
516
+ const streamOptions = await getWakeStreamOptions(target);
517
+ const accepted = await codeAgent.sendSignal({
518
+ type: "user",
519
+ tagName: "user",
520
+ contents: assembled.prompt,
521
+ attributes: scheduleSignalAttributes(schedule, assembled)
522
+ }, {
523
+ ...target,
524
+ ifActive: { behavior: "deliver" },
525
+ ifIdle: {
526
+ behavior: "wake",
527
+ ...streamOptions ? { streamOptions } : {}
528
+ }
529
+ }).accepted;
530
+ if (accepted.action === "blocked" || accepted.action === "discard") throw new Error(`the agent did not accept the prompt (${accepted.action})`);
531
+ },
532
+ onError: (error, schedule) => {
533
+ console.warn(`Schedule ${shortScheduleId(schedule.id)} failed to fire:`, error);
534
+ }
535
+ });
536
+ const scheduleTools = useScheduleTools ? createScheduleTools({
537
+ scheduler: threadScheduler,
538
+ fileOptions: () => ({
539
+ cwd: project.rootPath,
540
+ homeDir: homedir(),
541
+ fileExists: (absPath) => {
542
+ try {
543
+ return statSync(absPath).isFile();
544
+ } catch {
545
+ return false;
546
+ }
547
+ }
548
+ })
549
+ }) : void 0;
474
550
  const githubSignals = globalSettings.signals?.experimentalGithubSignals && !config?.disableGithubSignals ? new GithubSignals({
475
551
  cwd: project.rootPath,
476
552
  pollIntervalMs: globalSettings.signals.githubPollIntervalMs,
@@ -497,8 +573,7 @@ async function createMastraCodeAgentController(config) {
497
573
  const projectPath = state?.projectPath ?? project.rootPath;
498
574
  return getStaticallyLoadedInstructionPaths(projectPath, void 0, state?.untrustedCheckout === true && typeof state?.baseRef === "string" ? createGitRefInstructionReader(projectPath, state.baseRef) : void 0);
499
575
  }
500
- }),
501
- new ProviderHistoryCompat()
576
+ })
502
577
  ];
503
578
  const taskSignalProvider = new TaskSignalProvider();
504
579
  const agentConnectionsSignalProvider = useCrossAgentSignals ? new AgentConnectionsSignalProvider(config?.agentConnections) : void 0;
@@ -532,7 +607,7 @@ async function createMastraCodeAgentController(config) {
532
607
  return NO_PLUGIN_PROCESSORS;
533
608
  }
534
609
  };
535
- const codeAgent = createCodingAgent({
610
+ const codeAgent = wrapExperimentalAgent(createCodingAgent({
536
611
  id: CODE_AGENT_ID,
537
612
  name: "Code Agent",
538
613
  workspace: void 0,
@@ -559,7 +634,7 @@ async function createMastraCodeAgentController(config) {
559
634
  streamOptions
560
635
  } : decision;
561
636
  } } },
562
- tools: createDynamicTools(mcpManager, config?.extraTools, config?.disabledTools, storage, pluginTools, backgroundToolsEnabled),
637
+ tools: createDynamicTools(mcpManager, config?.extraTools, config?.disabledTools, storage, pluginTools, backgroundToolsEnabled, scheduleTools),
563
638
  hooks: createToolHooks(hookManager, config?.postToolObserver),
564
639
  scorers: {
565
640
  outcome: {
@@ -622,7 +697,6 @@ async function createMastraCodeAgentController(config) {
622
697
  onRetry: ({ error, retryCount, delayMs, requestContext }) => emitTransientRetry(error, retryCount, delayMs, requestContext)
623
698
  }
624
699
  ] }),
625
- new PrefillErrorHandler(),
626
700
  new AccountRotationProcessor({
627
701
  credentialStore: authStorage,
628
702
  maxProcessorRetries: MASTRACODE_MAX_PROCESSOR_RETRIES,
@@ -630,7 +704,7 @@ async function createMastraCodeAgentController(config) {
630
704
  })
631
705
  ],
632
706
  maxProcessorRetries: MASTRACODE_MAX_PROCESSOR_RETRIES
633
- });
707
+ }), experimentalAgent);
634
708
  const defaultModes = [
635
709
  {
636
710
  ...buildMode,
@@ -748,6 +822,11 @@ async function createMastraCodeAgentController(config) {
748
822
  stateSchema: typedStateSchema,
749
823
  agent: codeAgent,
750
824
  subagents,
825
+ resolveSubagentModel: (modelId, { requestContext }) => routesToOtherGateway(modelId, Object.values(controller.getMastra()?.listGateways() ?? {}), /* @__PURE__ */ new Set([
826
+ mastraCodeGateway.id,
827
+ amazonBedrockGateway.id,
828
+ "models.dev"
829
+ ])) ? modelId : resolveModel(modelId, { requestContext }),
751
830
  gateways: [amazonBedrockGateway, mastraCodeGateway],
752
831
  workspace: config?.workspace ?? ((args) => getDynamicWorkspace({
753
832
  ...args,
@@ -867,6 +946,8 @@ async function createMastraCodeAgentController(config) {
867
946
  unsubscribePluginReload = void 0;
868
947
  pluginSignalLane?.stopAll();
869
948
  },
949
+ /** Process-local `/schedules` scheduler. Call `stop()` on shutdown. */
950
+ threadScheduler,
870
951
  /**
871
952
  * Hands Mastra to the statically configured input processors.
872
953
  *
@@ -941,6 +1022,7 @@ async function bootLocalAgentController(config) {
941
1022
  const base = await createMastraCodeAgentController(config);
942
1023
  const { controller, sessionId, ownerId, projectPath, codeAgent, mcpManager } = base;
943
1024
  await controller.init();
1025
+ validateExperimentalAgent(codeAgent, controller.getMastra());
944
1026
  const mastra = controller.getMastra();
945
1027
  if (mastra) await registerWorkflowBuilderPrimitives(mastra, {
946
1028
  projectPath,
@@ -1036,6 +1118,7 @@ async function prepareAgentControllerMount(config) {
1036
1118
  };
1037
1119
  const finalize = async () => {
1038
1120
  await controller.init();
1121
+ validateExperimentalAgent(codeAgent, controller.getMastra());
1039
1122
  if (weOwnTheMastra) {
1040
1123
  const mastra = controller.getMastra();
1041
1124
  if (mastra) await registerWorkflowBuilderPrimitives(mastra, {