@mastra/code-sdk 1.0.3-alpha.1 → 1.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/dist/acp/agent.js +155 -167
- package/dist/acp/agent.js.map +1 -1
- package/dist/acp/event-mapper.js +193 -168
- package/dist/acp/event-mapper.js.map +1 -1
- package/dist/acp/index.js +60 -49
- package/dist/acp/index.js.map +1 -1
- package/dist/acp/server.js +31 -30
- package/dist/acp/server.js.map +1 -1
- package/dist/acp.js +1 -4
- package/dist/agents/credential-resolver.js +40 -29
- package/dist/agents/credential-resolver.js.map +1 -1
- package/dist/agents/custom-provider-source.js +16 -9
- package/dist/agents/custom-provider-source.js.map +1 -1
- package/dist/agents/instructions.js +27 -36
- package/dist/agents/instructions.js.map +1 -1
- package/dist/agents/mastracode-gateway.js +355 -428
- package/dist/agents/mastracode-gateway.js.map +1 -1
- package/dist/agents/memory.js +87 -78
- package/dist/agents/memory.js.map +1 -1
- package/dist/agents/model.js +114 -119
- package/dist/agents/model.js.map +1 -1
- package/dist/agents/modes/build.js +12 -13
- package/dist/agents/modes/build.js.map +1 -1
- package/dist/agents/modes/explore.js +14 -13
- package/dist/agents/modes/explore.js.map +1 -1
- package/dist/agents/modes/plan.js +14 -15
- package/dist/agents/modes/plan.js.map +1 -1
- package/dist/agents/prompts/agent-instructions.js +78 -69
- package/dist/agents/prompts/agent-instructions.js.map +1 -1
- package/dist/agents/prompts/build.js +19 -16
- package/dist/agents/prompts/build.js.map +1 -1
- package/dist/agents/prompts/fast.js +8 -4
- package/dist/agents/prompts/fast.js.map +1 -1
- package/dist/agents/prompts/index.js +48 -47
- package/dist/agents/prompts/index.js.map +1 -1
- package/dist/agents/prompts/model.js +6 -5
- package/dist/agents/prompts/model.js.map +1 -1
- package/dist/agents/prompts/plan.js +20 -16
- package/dist/agents/prompts/plan.js.map +1 -1
- package/dist/agents/prompts/tool-guidance.js +77 -109
- package/dist/agents/prompts/tool-guidance.js.map +1 -1
- package/dist/agents/sandbox-filesystem.js +245 -259
- package/dist/agents/sandbox-filesystem.js.map +1 -1
- package/dist/agents/sandbox-reattach.js +9 -11
- package/dist/agents/sandbox-reattach.js.map +1 -1
- package/dist/agents/thread-caveman-state.js +92 -81
- package/dist/agents/thread-caveman-state.js.map +1 -1
- package/dist/agents/tool-availability.js +62 -80
- package/dist/agents/tool-availability.js.map +1 -1
- package/dist/agents/tools.js +99 -139
- package/dist/agents/tools.js.map +1 -1
- package/dist/agents/workspace.js +232 -225
- package/dist/agents/workspace.js.map +1 -1
- package/dist/analytics.js +139 -128
- package/dist/analytics.js.map +1 -1
- package/dist/auth/authorization-input.js +39 -25
- package/dist/auth/authorization-input.js.map +1 -1
- package/dist/auth/device-code.js +112 -80
- package/dist/auth/device-code.js.map +1 -1
- package/dist/auth/index.js +2 -9
- package/dist/auth/pkce.js +27 -16
- package/dist/auth/pkce.js.map +1 -1
- package/dist/auth/providers/anthropic.js +107 -93
- package/dist/auth/providers/anthropic.js.map +1 -1
- package/dist/auth/providers/github-copilot.js +304 -293
- package/dist/auth/providers/github-copilot.js.map +1 -1
- package/dist/auth/providers/openai-codex.js +442 -460
- package/dist/auth/providers/openai-codex.js.map +1 -1
- package/dist/auth/providers/xai.js +179 -145
- package/dist/auth/providers/xai.js.map +1 -1
- package/dist/auth/storage.js +182 -175
- package/dist/auth/storage.js.map +1 -1
- package/dist/auth/types.js +1 -1
- package/dist/clipboard/index.js +206 -172
- package/dist/clipboard/index.js.map +1 -1
- package/dist/constants.js +11 -16
- package/dist/constants.js.map +1 -1
- package/dist/error-classification.js +19 -11
- package/dist/error-classification.js.map +1 -1
- package/dist/evals/context-builder.js +145 -104
- package/dist/evals/context-builder.js.map +1 -1
- package/dist/evals/index.js +4 -7
- package/dist/evals/scorers/classify-command.js +62 -41
- package/dist/evals/scorers/classify-command.js.map +1 -1
- package/dist/evals/scorers/efficiency.js +239 -181
- package/dist/evals/scorers/efficiency.js.map +1 -1
- package/dist/evals/scorers/extract-tools.js +51 -47
- package/dist/evals/scorers/extract-tools.js.map +1 -1
- package/dist/evals/scorers/index.js +1 -5
- package/dist/evals/scorers/outcome.js +321 -212
- package/dist/evals/scorers/outcome.js.map +1 -1
- package/dist/goal-manager.js +266 -261
- package/dist/goal-manager.js.map +1 -1
- package/dist/goal-signal.js +14 -13
- package/dist/goal-signal.js.map +1 -1
- package/dist/headless/cli.js +153 -154
- package/dist/headless/cli.js.map +1 -1
- package/dist/headless/flags.js +180 -178
- package/dist/headless/flags.js.map +1 -1
- package/dist/headless/format.js +72 -71
- package/dist/headless/format.js.map +1 -1
- package/dist/headless/index.js +5 -31
- package/dist/headless/policy.js +35 -31
- package/dist/headless/policy.js.map +1 -1
- package/dist/headless/run-mc.js +332 -334
- package/dist/headless/run-mc.js.map +1 -1
- package/dist/headless/types.js +16 -7
- package/dist/headless/types.js.map +1 -1
- package/dist/hooks/config.js +56 -61
- package/dist/hooks/config.js.map +1 -1
- package/dist/hooks/executor.js +118 -116
- package/dist/hooks/executor.js.map +1 -1
- package/dist/hooks/index.js +4 -15
- package/dist/hooks/manager.js +221 -280
- package/dist/hooks/manager.js.map +1 -1
- package/dist/hooks/types.js +5 -4
- package/dist/hooks/types.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +632 -712
- package/dist/index.js.map +1 -1
- package/dist/ipc/ipc-reporter.js +19 -22
- package/dist/ipc/ipc-reporter.js.map +1 -1
- package/dist/lsp/client.js +248 -306
- package/dist/lsp/client.js.map +1 -1
- package/dist/lsp/index.js +1 -6
- package/dist/lsp/language.js +39 -43
- package/dist/lsp/language.js.map +1 -1
- package/dist/lsp/manager.js +78 -93
- package/dist/lsp/manager.js.map +1 -1
- package/dist/lsp/server.js +151 -120
- package/dist/lsp/server.js.map +1 -1
- package/dist/lsp/workspace.js +50 -47
- package/dist/lsp/workspace.js.map +1 -1
- package/dist/mcp/config.js +210 -199
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/index.js +2 -9
- package/dist/mcp/manager.js +482 -475
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/types.js +1 -1
- package/dist/onboarding/custom-packs.js +14 -17
- package/dist/onboarding/custom-packs.js.map +1 -1
- package/dist/onboarding/custom-providers.js +22 -20
- package/dist/onboarding/custom-providers.js.map +1 -1
- package/dist/onboarding/index.d.ts +1 -1
- package/dist/onboarding/index.d.ts.map +1 -1
- package/dist/onboarding/index.js +3 -21
- package/dist/onboarding/om-settings.d.ts +5 -0
- package/dist/onboarding/om-settings.d.ts.map +1 -1
- package/dist/onboarding/om-settings.js +41 -20
- package/dist/onboarding/om-settings.js.map +1 -1
- package/dist/onboarding/packs.d.ts +4 -6
- package/dist/onboarding/packs.d.ts.map +1 -1
- package/dist/onboarding/packs.js +154 -105
- package/dist/onboarding/packs.js.map +1 -1
- package/dist/onboarding/settings.js +575 -517
- package/dist/onboarding/settings.js.map +1 -1
- package/dist/permissions.js +112 -99
- package/dist/permissions.js.map +1 -1
- package/dist/plugin.js +21 -23
- package/dist/plugin.js.map +1 -1
- package/dist/plugins/dependencies.js +64 -87
- package/dist/plugins/dependencies.js.map +1 -1
- package/dist/plugins/install.js +159 -169
- package/dist/plugins/install.js.map +1 -1
- package/dist/plugins/loader.js +170 -185
- package/dist/plugins/loader.js.map +1 -1
- package/dist/plugins/manager.js +374 -380
- package/dist/plugins/manager.js.map +1 -1
- package/dist/plugins/manifest.js +38 -63
- package/dist/plugins/manifest.js.map +1 -1
- package/dist/plugins/package-link.js +48 -64
- package/dist/plugins/package-link.js.map +1 -1
- package/dist/plugins/paths.js +18 -19
- package/dist/plugins/paths.js.map +1 -1
- package/dist/plugins/registry.js +97 -81
- package/dist/plugins/registry.js.map +1 -1
- package/dist/plugins/scaffold.js +62 -98
- package/dist/plugins/scaffold.js.map +1 -1
- package/dist/plugins/types.js +1 -1
- package/dist/processors/plan-rejection-abort.js +45 -44
- package/dist/processors/plan-rejection-abort.js.map +1 -1
- package/dist/providers/amazon-bedrock-gateway.js +134 -125
- package/dist/providers/amazon-bedrock-gateway.js.map +1 -1
- package/dist/providers/amazon-bedrock.js +68 -47
- package/dist/providers/amazon-bedrock.js.map +1 -1
- package/dist/providers/claude-max.js +153 -133
- package/dist/providers/claude-max.js.map +1 -1
- package/dist/providers/github-copilot.js +232 -230
- package/dist/providers/github-copilot.js.map +1 -1
- package/dist/providers/openai-codex.js +271 -260
- package/dist/providers/openai-codex.js.map +1 -1
- package/dist/providers/xai.js +57 -50
- package/dist/providers/xai.js.map +1 -1
- package/dist/schema.js +91 -89
- package/dist/schema.js.map +1 -1
- package/dist/theme-palette.js +18 -14
- package/dist/theme-palette.js.map +1 -1
- package/dist/tool-names.js +46 -37
- package/dist/tool-names.js.map +1 -1
- package/dist/tools/index.js +2 -8
- package/dist/tools/request-sandbox-access.js +71 -80
- package/dist/tools/request-sandbox-access.js.map +1 -1
- package/dist/tools/utils.js +26 -16
- package/dist/tools/utils.js.map +1 -1
- package/dist/tools/web-search.js +51 -55
- package/dist/tools/web-search.js.map +1 -1
- package/dist/utils/binaries.js +65 -61
- package/dist/utils/binaries.js.map +1 -1
- package/dist/utils/debug-log.js +51 -47
- package/dist/utils/debug-log.js.map +1 -1
- package/dist/utils/errors.js +157 -192
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/gateway-sync.js +49 -37
- package/dist/utils/gateway-sync.js.map +1 -1
- package/dist/utils/path-security.js +7 -6
- package/dist/utils/path-security.js.map +1 -1
- package/dist/utils/plan-diff.js +58 -39
- package/dist/utils/plan-diff.js.map +1 -1
- package/dist/utils/plans.js +92 -74
- package/dist/utils/plans.js.map +1 -1
- package/dist/utils/project.js +318 -256
- package/dist/utils/project.js.map +1 -1
- package/dist/utils/signals-pubsub.js +117 -99
- package/dist/utils/signals-pubsub.js.map +1 -1
- package/dist/utils/slash-command-loader.js +118 -154
- package/dist/utils/slash-command-loader.js.map +1 -1
- package/dist/utils/slash-command-processor.js +92 -83
- package/dist/utils/slash-command-processor.js.map +1 -1
- package/dist/utils/stdin-pipe.js +87 -63
- package/dist/utils/stdin-pipe.js.map +1 -1
- package/dist/utils/storage-factory.js +104 -84
- package/dist/utils/storage-factory.js.map +1 -1
- package/dist/utils/storage-maintenance.js +249 -211
- package/dist/utils/storage-maintenance.js.map +1 -1
- package/dist/utils/thread-lock.js +96 -92
- package/dist/utils/thread-lock.js.map +1 -1
- package/dist/utils/token-estimator.js +12 -12
- package/dist/utils/token-estimator.js.map +1 -1
- package/dist/utils/update-check.d.ts +1 -1
- package/dist/utils/update-check.js +341 -259
- package/dist/utils/update-check.js.map +1 -1
- package/dist/voice/stt-registry.js +131 -113
- package/dist/voice/stt-registry.js.map +1 -1
- package/package.json +12 -12
- package/dist/acp.js.map +0 -1
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/types.js.map +0 -1
- package/dist/evals/index.js.map +0 -1
- package/dist/evals/scorers/index.js.map +0 -1
- package/dist/headless/index.js.map +0 -1
- package/dist/hooks/index.js.map +0 -1
- package/dist/lsp/index.js.map +0 -1
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/types.js.map +0 -1
- package/dist/onboarding/index.js.map +0 -1
- package/dist/plugins/types.js.map +0 -1
- package/dist/tools/index.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
# @mastra/code-sdk
|
|
2
2
|
|
|
3
|
+
## 1.1.0-alpha.2
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Added `resolveProviderOMDefault` to `@mastra/code-sdk/onboarding/packs`, which returns the small, cheap observational memory model for a provider, or the model you pass in when that provider has none. ([#20298](https://github.com/mastra-ai/mastra/pull/20298))
|
|
8
|
+
|
|
9
|
+
The built-in OM packs are now a single table, so the list offered during onboarding and the per-provider default can no longer drift apart.
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { resolveProviderOMDefault } from '@mastra/code-sdk/onboarding/packs';
|
|
13
|
+
|
|
14
|
+
resolveProviderOMDefault('anthropic').modelId; // 'anthropic/claude-haiku-4-5'
|
|
15
|
+
resolveProviderOMDefault('openai-codex').modelId; // 'openai/gpt-5.4-mini'
|
|
16
|
+
resolveProviderOMDefault('xai', 'xai/grok-4.5').modelId; // 'xai/grok-4.5'
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
- Added provider-aware observational memory defaults, so a controller started without a stored OM choice observes and reflects with the cheap model of a provider you can actually reach instead of the built-in Gemini default. ([#20291](https://github.com/mastra-ai/mastra/pull/20291))
|
|
20
|
+
|
|
21
|
+
The helpers behind it are exported if you build your own surface on the SDK:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { hasExplicitOMConfiguration } from '@mastra/code-sdk/onboarding/om-settings';
|
|
25
|
+
import { selectPreferredOMPack } from '@mastra/code-sdk/onboarding/packs';
|
|
26
|
+
|
|
27
|
+
// Best OM pack across everything the user can reach, preferring a given provider
|
|
28
|
+
selectPreferredOMPack({ anthropic: 'oauth', google: 'apikey' }, 'anthropic')?.modelId;
|
|
29
|
+
|
|
30
|
+
// True once the user picked an OM model or pack themselves — never seed over it
|
|
31
|
+
hasExplicitOMConfiguration(settings);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Patch Changes
|
|
35
|
+
|
|
36
|
+
- Updated dependencies [[`a211d09`](https://github.com/mastra-ai/mastra/commit/a211d09185dc65a746534914cf38b67f21ee9bac), [`05db566`](https://github.com/mastra-ai/mastra/commit/05db566fcbdcbf33d0bffca0c72ec30129e2e3ca), [`05db566`](https://github.com/mastra-ai/mastra/commit/05db566fcbdcbf33d0bffca0c72ec30129e2e3ca), [`e075db9`](https://github.com/mastra-ai/mastra/commit/e075db9715c836bae5dfc37c50248492af397c3b), [`8124754`](https://github.com/mastra-ai/mastra/commit/8124754ae89fbc69f8136d1df4a91904d0f84c4e)]:
|
|
37
|
+
- @mastra/core@1.54.0-alpha.2
|
|
38
|
+
- @mastra/pg@1.18.0-alpha.2
|
|
39
|
+
- @mastra/libsql@1.18.0-alpha.1
|
|
40
|
+
|
|
3
41
|
## 1.0.3-alpha.1
|
|
4
42
|
|
|
5
43
|
### Patch Changes
|
package/dist/acp/agent.js
CHANGED
|
@@ -1,173 +1,161 @@
|
|
|
1
|
-
import { PROTOCOL_VERSION } from "@agentclientprotocol/sdk";
|
|
2
1
|
import { handleAgentControllerEvent } from "./event-mapper.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
}
|
|
2
|
+
import { PROTOCOL_VERSION } from "@agentclientprotocol/sdk";
|
|
3
|
+
//#region src/acp/agent.ts
|
|
4
|
+
/**
|
|
5
|
+
* ACP Agent implementation that wraps a mastracode Controller.
|
|
6
|
+
* Each instance represents one ACP connection from a client.
|
|
7
|
+
*/
|
|
8
|
+
var MastraCodeAcpAgent = class {
|
|
9
|
+
connection;
|
|
10
|
+
controller;
|
|
11
|
+
session;
|
|
12
|
+
modes;
|
|
13
|
+
unsubscribeSessionEvents;
|
|
14
|
+
sessionMap = /* @__PURE__ */ new Map();
|
|
15
|
+
currentPromptState = null;
|
|
16
|
+
promptMutex = Promise.resolve();
|
|
17
|
+
getThreadIdOrThrow(sessionId) {
|
|
18
|
+
const threadId = this.sessionMap.get(sessionId);
|
|
19
|
+
if (!threadId) throw new Error(`Unknown ACP sessionId: ${sessionId}`);
|
|
20
|
+
return threadId;
|
|
21
|
+
}
|
|
22
|
+
constructor(connection, controller, session, modes) {
|
|
23
|
+
this.connection = connection;
|
|
24
|
+
this.controller = controller;
|
|
25
|
+
this.session = session;
|
|
26
|
+
this.modes = modes;
|
|
27
|
+
this.unsubscribeSessionEvents = this.session.subscribe((event) => {
|
|
28
|
+
handleAgentControllerEvent(event, this.currentPromptState, this.connection, this.session);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
dispose() {
|
|
32
|
+
this.unsubscribeSessionEvents();
|
|
33
|
+
}
|
|
34
|
+
async initialize(_request) {
|
|
35
|
+
return {
|
|
36
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
37
|
+
agentInfo: {
|
|
38
|
+
name: "mastracode",
|
|
39
|
+
title: "Mastra Code",
|
|
40
|
+
version: "0.1.0"
|
|
41
|
+
},
|
|
42
|
+
agentCapabilities: { loadSession: false }
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async authenticate() {}
|
|
46
|
+
async newSession(_request) {
|
|
47
|
+
const thread = await this.session.thread.create();
|
|
48
|
+
const sessionId = thread.id;
|
|
49
|
+
this.sessionMap.set(sessionId, thread.id);
|
|
50
|
+
await this.session.thread.switch({ threadId: thread.id });
|
|
51
|
+
const availableModes = this.modes.map((m) => ({
|
|
52
|
+
id: m.id,
|
|
53
|
+
name: m.name ?? m.id
|
|
54
|
+
}));
|
|
55
|
+
const currentModeId = this.session.mode.get();
|
|
56
|
+
let models;
|
|
57
|
+
try {
|
|
58
|
+
const availableModels = await this.controller.listAvailableModels();
|
|
59
|
+
models = {
|
|
60
|
+
currentModelId: this.session.model.get() ?? "",
|
|
61
|
+
availableModels: availableModels.map((m) => ({
|
|
62
|
+
modelId: m.id,
|
|
63
|
+
name: m.modelName
|
|
64
|
+
}))
|
|
65
|
+
};
|
|
66
|
+
} catch {}
|
|
67
|
+
return {
|
|
68
|
+
sessionId,
|
|
69
|
+
modes: {
|
|
70
|
+
currentModeId,
|
|
71
|
+
availableModes
|
|
72
|
+
},
|
|
73
|
+
models
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async prompt(request) {
|
|
77
|
+
const { sessionId, prompt: contentBlocks } = request;
|
|
78
|
+
const text = extractTextFromContentBlocks(contentBlocks);
|
|
79
|
+
const threadId = this.getThreadIdOrThrow(sessionId);
|
|
80
|
+
const prevMutex = this.promptMutex;
|
|
81
|
+
let resolveMutex;
|
|
82
|
+
this.promptMutex = new Promise((resolve) => {
|
|
83
|
+
resolveMutex = resolve;
|
|
84
|
+
});
|
|
85
|
+
await prevMutex;
|
|
86
|
+
try {
|
|
87
|
+
await this.session.thread.switch({ threadId });
|
|
88
|
+
const result = new Promise((resolve) => {
|
|
89
|
+
const usage = {
|
|
90
|
+
promptTokens: 0,
|
|
91
|
+
completionTokens: 0,
|
|
92
|
+
totalTokens: 0
|
|
93
|
+
};
|
|
94
|
+
this.currentPromptState = {
|
|
95
|
+
sessionId,
|
|
96
|
+
lastTextLength: 0,
|
|
97
|
+
usage,
|
|
98
|
+
resolve: (reason) => {
|
|
99
|
+
resolve({
|
|
100
|
+
reason,
|
|
101
|
+
usage
|
|
102
|
+
});
|
|
103
|
+
this.currentPromptState = null;
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
try {
|
|
108
|
+
await this.session.sendMessage({ content: text });
|
|
109
|
+
} catch (error) {
|
|
110
|
+
this.currentPromptState = null;
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
const { reason, usage } = await result;
|
|
114
|
+
return {
|
|
115
|
+
stopReason: mapStopReason(reason),
|
|
116
|
+
usage: {
|
|
117
|
+
inputTokens: usage.promptTokens,
|
|
118
|
+
outputTokens: usage.completionTokens,
|
|
119
|
+
totalTokens: usage.totalTokens,
|
|
120
|
+
thoughtTokens: usage.reasoningTokens,
|
|
121
|
+
cachedReadTokens: usage.cachedInputTokens,
|
|
122
|
+
cachedWriteTokens: usage.cacheCreationInputTokens
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
} finally {
|
|
126
|
+
resolveMutex();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async cancel(_notification) {
|
|
130
|
+
this.session.abort();
|
|
131
|
+
}
|
|
132
|
+
async setSessionMode(params) {
|
|
133
|
+
const threadId = this.getThreadIdOrThrow(params.sessionId);
|
|
134
|
+
await this.session.thread.switch({ threadId });
|
|
135
|
+
this.session.mode.set({ modeId: params.modeId });
|
|
136
|
+
}
|
|
137
|
+
async unstable_setSessionModel(params) {
|
|
138
|
+
const threadId = this.getThreadIdOrThrow(params.sessionId);
|
|
139
|
+
await this.session.thread.switch({ threadId });
|
|
140
|
+
this.session.model.set({ modelId: params.modelId });
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
143
|
function extractTextFromContentBlocks(blocks) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
parts.push(`[resource: ${block.uri}]`);
|
|
150
|
-
} else if (block.type === "resource") {
|
|
151
|
-
parts.push(`[resource: ${block.resource.uri}]`);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return parts.join("\n");
|
|
144
|
+
const parts = [];
|
|
145
|
+
for (const block of blocks) if (block.type === "text") parts.push(block.text);
|
|
146
|
+
else if (block.type === "resource_link") parts.push(`[resource: ${block.uri}]`);
|
|
147
|
+
else if (block.type === "resource") parts.push(`[resource: ${block.resource.uri}]`);
|
|
148
|
+
return parts.join("\n");
|
|
155
149
|
}
|
|
156
150
|
function mapStopReason(reason) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
return "end_turn";
|
|
164
|
-
case "suspended":
|
|
165
|
-
return "end_turn";
|
|
166
|
-
}
|
|
151
|
+
switch (reason) {
|
|
152
|
+
case "complete": return "end_turn";
|
|
153
|
+
case "aborted": return "cancelled";
|
|
154
|
+
case "error": return "end_turn";
|
|
155
|
+
case "suspended": return "end_turn";
|
|
156
|
+
}
|
|
167
157
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
mapStopReason
|
|
172
|
-
};
|
|
158
|
+
//#endregion
|
|
159
|
+
export { MastraCodeAcpAgent, extractTextFromContentBlocks, mapStopReason };
|
|
160
|
+
|
|
173
161
|
//# sourceMappingURL=agent.js.map
|
package/dist/acp/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/acp/agent.ts"],"sourcesContent":["import type {\n Agent,\n AgentSideConnection,\n InitializeRequest,\n InitializeResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n CancelNotification,\n ContentBlock,\n} from '@agentclientprotocol/sdk';\nimport { PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type { AgentController, AgentControllerMode, Session } from '@mastra/core/agent-controller';\nimport { handleAgentControllerEvent } from './event-mapper.js';\nimport type { PromptState } from './event-mapper.js';\n\n/**\n * ACP Agent implementation that wraps a mastracode Controller.\n * Each instance represents one ACP connection from a client.\n */\nexport class MastraCodeAcpAgent implements Agent {\n private readonly connection: AgentSideConnection;\n private readonly controller: AgentController;\n private readonly session: Session;\n private readonly modes: AgentControllerMode[];\n private readonly unsubscribeSessionEvents: () => void;\n private readonly sessionMap = new Map<string, string>(); // sessionId -> threadId\n private currentPromptState: PromptState | null = null;\n private promptMutex: Promise<void> = Promise.resolve();\n\n private getThreadIdOrThrow(sessionId: string): string {\n const threadId = this.sessionMap.get(sessionId);\n if (!threadId) {\n throw new Error(`Unknown ACP sessionId: ${sessionId}`);\n }\n return threadId;\n }\n\n constructor(\n connection: AgentSideConnection,\n controller: AgentController,\n session: Session,\n modes: AgentControllerMode[],\n ) {\n this.connection = connection;\n this.controller = controller;\n this.session = session;\n this.modes = modes;\n\n // Register persistent event listener\n this.unsubscribeSessionEvents = this.session.subscribe(event => {\n handleAgentControllerEvent(event, this.currentPromptState, this.connection, this.session);\n });\n }\n\n dispose(): void {\n this.unsubscribeSessionEvents();\n }\n\n async initialize(_request: InitializeRequest): Promise<InitializeResponse> {\n return {\n protocolVersion: PROTOCOL_VERSION,\n agentInfo: {\n name: 'mastracode',\n title: 'Mastra Code',\n version: '0.1.0',\n },\n agentCapabilities: {\n loadSession: false,\n },\n };\n }\n\n async authenticate(): Promise<void> {\n // No-op: mastracode handles its own auth\n }\n\n async newSession(_request: NewSessionRequest): Promise<NewSessionResponse> {\n const thread = await this.session.thread.create();\n const sessionId = thread.id;\n this.sessionMap.set(sessionId, thread.id);\n\n // Switch to the new thread\n await this.session.thread.switch({ threadId: thread.id });\n\n // Build modes list from constructor param\n const availableModes = this.modes.map((m: AgentControllerMode) => ({\n id: m.id,\n name: m.name ?? m.id,\n }));\n\n const currentModeId = this.session.mode.get();\n\n // Build models list (best-effort)\n let models: NewSessionResponse['models'];\n try {\n const availableModels = await this.controller.listAvailableModels();\n const currentModelId = this.session.model.get();\n models = {\n currentModelId: currentModelId ?? '',\n availableModels: availableModels.map(m => ({\n modelId: m.id,\n name: m.modelName,\n })),\n };\n } catch {\n // Model listing may fail if no providers are configured\n }\n\n return {\n sessionId,\n modes: {\n currentModeId,\n availableModes,\n },\n models,\n };\n }\n\n async prompt(request: PromptRequest): Promise<PromptResponse> {\n const { sessionId, prompt: contentBlocks } = request;\n\n // Extract text from content blocks\n const text = extractTextFromContentBlocks(contentBlocks);\n\n const threadId = this.getThreadIdOrThrow(sessionId);\n\n // Serialize prompts via mutex\n const prevMutex = this.promptMutex;\n let resolveMutex: () => void;\n this.promptMutex = new Promise<void>(resolve => {\n resolveMutex = resolve;\n });\n\n await prevMutex;\n\n try {\n // Ensure we're on the right thread while prompts are serialized\n await this.session.thread.switch({ threadId });\n\n // Create prompt state that will be resolved when agent_end fires\n const result = new Promise<{\n reason: 'complete' | 'aborted' | 'error' | 'suspended';\n usage: PromptState['usage'];\n }>(resolve => {\n const usage: PromptState['usage'] = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n\n this.currentPromptState = {\n sessionId,\n lastTextLength: 0,\n usage,\n resolve: reason => {\n resolve({ reason, usage });\n this.currentPromptState = null;\n },\n };\n });\n\n // Send the message to the session\n try {\n await this.session.sendMessage({ content: text });\n } catch (error) {\n this.currentPromptState = null;\n throw error;\n }\n\n // Wait for agent_end to resolve\n const { reason, usage } = await result;\n\n return {\n stopReason: mapStopReason(reason),\n usage: {\n inputTokens: usage.promptTokens,\n outputTokens: usage.completionTokens,\n totalTokens: usage.totalTokens,\n thoughtTokens: usage.reasoningTokens,\n cachedReadTokens: usage.cachedInputTokens,\n cachedWriteTokens: usage.cacheCreationInputTokens,\n },\n };\n } finally {\n resolveMutex!();\n }\n }\n\n async cancel(_notification: CancelNotification): Promise<void> {\n this.session.abort();\n }\n\n async setSessionMode(params: { sessionId: string; modeId: string }): Promise<void> {\n const threadId = this.getThreadIdOrThrow(params.sessionId);\n await this.session.thread.switch({ threadId });\n this.session.mode.set({ modeId: params.modeId });\n }\n\n async unstable_setSessionModel(params: { sessionId: string; modelId: string }): Promise<void> {\n const threadId = this.getThreadIdOrThrow(params.sessionId);\n await this.session.thread.switch({ threadId });\n this.session.model.set({ modelId: params.modelId });\n }\n}\n\nexport function extractTextFromContentBlocks(blocks: ContentBlock[]): string {\n const parts: string[] = [];\n for (const block of blocks) {\n if (block.type === 'text') {\n parts.push(block.text);\n } else if (block.type === 'resource_link') {\n parts.push(`[resource: ${block.uri}]`);\n } else if (block.type === 'resource') {\n parts.push(`[resource: ${block.resource.uri}]`);\n }\n }\n return parts.join('\\n');\n}\n\nexport function mapStopReason(\n reason: 'complete' | 'aborted' | 'error' | 'suspended',\n): 'end_turn' | 'cancelled' | 'max_tokens' | 'max_turn_requests' | 'refusal' {\n switch (reason) {\n case 'complete':\n return 'end_turn';\n case 'aborted':\n return 'cancelled';\n case 'error':\n return 'end_turn';\n case 'suspended':\n return 'end_turn';\n }\n}\n"],"mappings":"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","names":["usage","reason"]}
|
|
1
|
+
{"version":3,"file":"agent.js","names":[],"sources":["../../src/acp/agent.ts"],"sourcesContent":["import type {\n Agent,\n AgentSideConnection,\n InitializeRequest,\n InitializeResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n CancelNotification,\n ContentBlock,\n} from '@agentclientprotocol/sdk';\nimport { PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type { AgentController, AgentControllerMode, Session } from '@mastra/core/agent-controller';\nimport { handleAgentControllerEvent } from './event-mapper.js';\nimport type { PromptState } from './event-mapper.js';\n\n/**\n * ACP Agent implementation that wraps a mastracode Controller.\n * Each instance represents one ACP connection from a client.\n */\nexport class MastraCodeAcpAgent implements Agent {\n private readonly connection: AgentSideConnection;\n private readonly controller: AgentController;\n private readonly session: Session;\n private readonly modes: AgentControllerMode[];\n private readonly unsubscribeSessionEvents: () => void;\n private readonly sessionMap = new Map<string, string>(); // sessionId -> threadId\n private currentPromptState: PromptState | null = null;\n private promptMutex: Promise<void> = Promise.resolve();\n\n private getThreadIdOrThrow(sessionId: string): string {\n const threadId = this.sessionMap.get(sessionId);\n if (!threadId) {\n throw new Error(`Unknown ACP sessionId: ${sessionId}`);\n }\n return threadId;\n }\n\n constructor(\n connection: AgentSideConnection,\n controller: AgentController,\n session: Session,\n modes: AgentControllerMode[],\n ) {\n this.connection = connection;\n this.controller = controller;\n this.session = session;\n this.modes = modes;\n\n // Register persistent event listener\n this.unsubscribeSessionEvents = this.session.subscribe(event => {\n handleAgentControllerEvent(event, this.currentPromptState, this.connection, this.session);\n });\n }\n\n dispose(): void {\n this.unsubscribeSessionEvents();\n }\n\n async initialize(_request: InitializeRequest): Promise<InitializeResponse> {\n return {\n protocolVersion: PROTOCOL_VERSION,\n agentInfo: {\n name: 'mastracode',\n title: 'Mastra Code',\n version: '0.1.0',\n },\n agentCapabilities: {\n loadSession: false,\n },\n };\n }\n\n async authenticate(): Promise<void> {\n // No-op: mastracode handles its own auth\n }\n\n async newSession(_request: NewSessionRequest): Promise<NewSessionResponse> {\n const thread = await this.session.thread.create();\n const sessionId = thread.id;\n this.sessionMap.set(sessionId, thread.id);\n\n // Switch to the new thread\n await this.session.thread.switch({ threadId: thread.id });\n\n // Build modes list from constructor param\n const availableModes = this.modes.map((m: AgentControllerMode) => ({\n id: m.id,\n name: m.name ?? m.id,\n }));\n\n const currentModeId = this.session.mode.get();\n\n // Build models list (best-effort)\n let models: NewSessionResponse['models'];\n try {\n const availableModels = await this.controller.listAvailableModels();\n const currentModelId = this.session.model.get();\n models = {\n currentModelId: currentModelId ?? '',\n availableModels: availableModels.map(m => ({\n modelId: m.id,\n name: m.modelName,\n })),\n };\n } catch {\n // Model listing may fail if no providers are configured\n }\n\n return {\n sessionId,\n modes: {\n currentModeId,\n availableModes,\n },\n models,\n };\n }\n\n async prompt(request: PromptRequest): Promise<PromptResponse> {\n const { sessionId, prompt: contentBlocks } = request;\n\n // Extract text from content blocks\n const text = extractTextFromContentBlocks(contentBlocks);\n\n const threadId = this.getThreadIdOrThrow(sessionId);\n\n // Serialize prompts via mutex\n const prevMutex = this.promptMutex;\n let resolveMutex: () => void;\n this.promptMutex = new Promise<void>(resolve => {\n resolveMutex = resolve;\n });\n\n await prevMutex;\n\n try {\n // Ensure we're on the right thread while prompts are serialized\n await this.session.thread.switch({ threadId });\n\n // Create prompt state that will be resolved when agent_end fires\n const result = new Promise<{\n reason: 'complete' | 'aborted' | 'error' | 'suspended';\n usage: PromptState['usage'];\n }>(resolve => {\n const usage: PromptState['usage'] = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n\n this.currentPromptState = {\n sessionId,\n lastTextLength: 0,\n usage,\n resolve: reason => {\n resolve({ reason, usage });\n this.currentPromptState = null;\n },\n };\n });\n\n // Send the message to the session\n try {\n await this.session.sendMessage({ content: text });\n } catch (error) {\n this.currentPromptState = null;\n throw error;\n }\n\n // Wait for agent_end to resolve\n const { reason, usage } = await result;\n\n return {\n stopReason: mapStopReason(reason),\n usage: {\n inputTokens: usage.promptTokens,\n outputTokens: usage.completionTokens,\n totalTokens: usage.totalTokens,\n thoughtTokens: usage.reasoningTokens,\n cachedReadTokens: usage.cachedInputTokens,\n cachedWriteTokens: usage.cacheCreationInputTokens,\n },\n };\n } finally {\n resolveMutex!();\n }\n }\n\n async cancel(_notification: CancelNotification): Promise<void> {\n this.session.abort();\n }\n\n async setSessionMode(params: { sessionId: string; modeId: string }): Promise<void> {\n const threadId = this.getThreadIdOrThrow(params.sessionId);\n await this.session.thread.switch({ threadId });\n this.session.mode.set({ modeId: params.modeId });\n }\n\n async unstable_setSessionModel(params: { sessionId: string; modelId: string }): Promise<void> {\n const threadId = this.getThreadIdOrThrow(params.sessionId);\n await this.session.thread.switch({ threadId });\n this.session.model.set({ modelId: params.modelId });\n }\n}\n\nexport function extractTextFromContentBlocks(blocks: ContentBlock[]): string {\n const parts: string[] = [];\n for (const block of blocks) {\n if (block.type === 'text') {\n parts.push(block.text);\n } else if (block.type === 'resource_link') {\n parts.push(`[resource: ${block.uri}]`);\n } else if (block.type === 'resource') {\n parts.push(`[resource: ${block.resource.uri}]`);\n }\n }\n return parts.join('\\n');\n}\n\nexport function mapStopReason(\n reason: 'complete' | 'aborted' | 'error' | 'suspended',\n): 'end_turn' | 'cancelled' | 'max_tokens' | 'max_turn_requests' | 'refusal' {\n switch (reason) {\n case 'complete':\n return 'end_turn';\n case 'aborted':\n return 'cancelled';\n case 'error':\n return 'end_turn';\n case 'suspended':\n return 'end_turn';\n }\n}\n"],"mappings":"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"}
|